Skip to content

Commit

Permalink
Inherit Roo::Excelx::Coordinate from Array
Browse files Browse the repository at this point in the history
Profiling Script
```
MemoryProfiler.report{ Roo::Excelx.new(file_name).tap{|x|(2..x.last_row).each{|i| x.row(i)}} }.pretty_print
```

Master:
```
Total allocated: 34559100 bytes (504994 objects)
Total retained:  5563403 bytes (103022 objects)

allocated memory by gem
-----------------------------------
  19254338  roo/lib
   8509100  nokogiri-1.8.4
   6793822  rubyzip-1.2.2
      1304  tmpdir
       320  weakref
       216  other

allocated objects by gem
-----------------------------------
    358381  roo/lib
    145846  nokogiri-1.8.4
       735  rubyzip-1.2.2
        22  tmpdir
         8  weakref
         2  other

retained memory by gem
-----------------------------------
   5561094  roo/lib
       792  rubyzip-1.2.2
       725  nokogiri-1.8.4
       320  weakref
       296  tmpdir
       176  other

retained objects by gem
-----------------------------------
    102989  roo/lib
        14  nokogiri-1.8.4
         8  weakref
         7  rubyzip-1.2.2
         3  tmpdir
         1  other
```

After Patch:
```
Total allocated: 33439850 bytes (477013 objects)
Total retained:  4444153 bytes (75041 objects)

allocated memory by gem
-----------------------------------
  18135098  roo/lib
   8509100  nokogiri-1.8.4
   6793812  rubyzip-1.2.2
      1304  tmpdir
       320  weakref
       216  other

allocated objects by gem
-----------------------------------
    330400  roo/lib
    145846  nokogiri-1.8.4
       735  rubyzip-1.2.2
        22  tmpdir
         8  weakref
         2  other

retained memory by gem
-----------------------------------
   4441854  roo/lib
       782  rubyzip-1.2.2
       725  nokogiri-1.8.4
       320  weakref
       296  tmpdir
       176  other

retained objects by gem
-----------------------------------
     75008  roo/lib
        14  nokogiri-1.8.4
         8  weakref
         7  rubyzip-1.2.2
         3  tmpdir
         1  other
```
  • Loading branch information
chopraanmol1 committed Sep 21, 2018
1 parent bd0b0f8 commit 00356c2
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 21 deletions.
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

0 comments on commit 00356c2

Please sign in to comment.