Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inherit Roo::Excelx::Coordinate from Array #458

Merged
merged 1 commit into from
Sep 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions lib/roo/excelx/coordinate.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
module Roo
class Excelx
class Coordinate
attr_accessor :row, :column
class Coordinate < ::Array

def initialize(row, column)
@row = row
@column = column
super() << row << column
freeze
end

def to_a
@array ||= [row, column].freeze
def row
self[0]
end

def column
self[1]
end
end
end
Expand Down
6 changes: 2 additions & 4 deletions lib/roo/excelx/sheet_doc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ def each_cell(row_xml)
# If you're sure you're not going to need this hyperlinks you can discard it
coordinate = ::Roo::Utils.extract_coordinate(cell_element[COMMON_STRINGS[:r]])
hyperlinks = unless @options[:no_hyperlinks]
key = coordinate.to_a
hyperlinks(@relationships)[key]
hyperlinks(@relationships)[coordinate]
end

yield cell_from_xml(cell_element, hyperlinks, coordinate)
Expand Down Expand Up @@ -200,8 +199,7 @@ def extract_cells(relationships)
extracted_cells = {}
doc.xpath('/worksheet/sheetData/row/c').each do |cell_xml|
coordinate = ::Roo::Utils.extract_coordinate(cell_xml[COMMON_STRINGS[:r]])
key = coordinate.to_a
extracted_cells[key] = cell_from_xml(cell_xml, hyperlinks(relationships)[key], coordinate)
extracted_cells[coordinate] = cell_from_xml(cell_xml, hyperlinks(relationships)[coordinate], coordinate)
end

expand_merged_ranges(extracted_cells) if @options[:expand_merged_ranges]
Expand Down
18 changes: 7 additions & 11 deletions lib/roo/utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Utils

LETTERS = ('A'..'Z').to_a

def extract_coord(s, klass = Excelx::Coordinate)
def extract_coordinate(s)
num = letter_num = 0
num_only = false

Expand All @@ -22,20 +22,16 @@ def extract_coord(s, klass = Excelx::Coordinate)
end
fail ArgumentError if letter_num == 0 || !num_only

if klass == Array
[num, letter_num]
else
klass.new(num, letter_num)
end
Excelx::Coordinate.new(num, letter_num)
end

alias_method :extract_coordinate, :extract_coord
alias_method :ref_to_key, :extract_coordinate

def split_coordinate(str)
extract_coord(str, Array)
warn "[DEPRECATION] `Roo::Utils.split_coordinate` is deprecated. Please use `Roo::Utils.extract_coordinate` instead."
extract_coordinate(str)
end

alias_method :ref_to_key, :split_coordinate


def split_coord(str)
Expand Down Expand Up @@ -72,8 +68,8 @@ def num_cells_in_range(str)
cells = str.split(':')
return 1 if cells.count == 1
raise ArgumentError.new("invalid range string: #{str}. Supported range format 'A1:B2'") if cells.count != 2
x1, y1 = split_coordinate(cells[0])
x2, y2 = split_coordinate(cells[1])
x1, y1 = extract_coordinate(cells[0])
x2, y2 = extract_coordinate(cells[1])
(x2 - (x1 - 1)) * (y2 - (y1 - 1))
end

Expand Down
9 changes: 9 additions & 0 deletions spec/lib/roo/utils_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,15 @@
end
end

context '.extract_coordinate' do
it "returns the expected result" do
expect(described_class.extract_coordinate('A1')).to eq [1, 1]
expect(described_class.extract_coordinate('B2')).to eq [2, 2]
expect(described_class.extract_coordinate('R2')).to eq [2, 18]
expect(described_class.extract_coordinate('AR31')).to eq [31, 18 + 26]
end
end

context '.split_coord' do
it "returns the expected result" do
expect(described_class.split_coord('A1')).to eq ["A", 1]
Expand Down
51 changes: 51 additions & 0 deletions test/excelx/test_coordinate.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# frozen_string_literal: true

require "test_helper"

class TestRooExcelxCoordinate < Minitest::Test
def row
10
end

def column
20
end

def coordinate
Roo::Excelx::Coordinate.new(row, column)
end

def array
[row, column]
end

def test_row
assert_same row, coordinate.row
end

def test_column
assert_same column, coordinate.column
end

def test_frozen?
assert coordinate.frozen?
end

def test_equality
hash = {}
hash[coordinate] = true
assert hash.key?(coordinate)
assert hash.key?(array)
end

def test_expand
r, c = coordinate
assert_same row, r
assert_same column, c
end

def test_aref
assert_same row, coordinate[0]
assert_same column, coordinate[1]
end
end