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 20, 2018
1 parent bd0b0f8 commit f44a9e2
Show file tree
Hide file tree
Showing 3 changed files with 18 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

0 comments on commit f44a9e2

Please sign in to comment.