ruh-roo 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +677 -0
- data/Gemfile +24 -0
- data/LICENSE +24 -0
- data/README.md +315 -0
- data/lib/roo/base.rb +607 -0
- data/lib/roo/constants.rb +7 -0
- data/lib/roo/csv.rb +141 -0
- data/lib/roo/errors.rb +11 -0
- data/lib/roo/excelx/cell/base.rb +108 -0
- data/lib/roo/excelx/cell/boolean.rb +30 -0
- data/lib/roo/excelx/cell/date.rb +28 -0
- data/lib/roo/excelx/cell/datetime.rb +107 -0
- data/lib/roo/excelx/cell/empty.rb +20 -0
- data/lib/roo/excelx/cell/number.rb +89 -0
- data/lib/roo/excelx/cell/string.rb +19 -0
- data/lib/roo/excelx/cell/time.rb +44 -0
- data/lib/roo/excelx/cell.rb +110 -0
- data/lib/roo/excelx/comments.rb +55 -0
- data/lib/roo/excelx/coordinate.rb +19 -0
- data/lib/roo/excelx/extractor.rb +39 -0
- data/lib/roo/excelx/format.rb +71 -0
- data/lib/roo/excelx/images.rb +26 -0
- data/lib/roo/excelx/relationships.rb +33 -0
- data/lib/roo/excelx/shared.rb +39 -0
- data/lib/roo/excelx/shared_strings.rb +151 -0
- data/lib/roo/excelx/sheet.rb +151 -0
- data/lib/roo/excelx/sheet_doc.rb +248 -0
- data/lib/roo/excelx/styles.rb +64 -0
- data/lib/roo/excelx/workbook.rb +63 -0
- data/lib/roo/excelx.rb +480 -0
- data/lib/roo/font.rb +17 -0
- data/lib/roo/formatters/base.rb +15 -0
- data/lib/roo/formatters/csv.rb +84 -0
- data/lib/roo/formatters/matrix.rb +23 -0
- data/lib/roo/formatters/xml.rb +31 -0
- data/lib/roo/formatters/yaml.rb +40 -0
- data/lib/roo/helpers/default_attr_reader.rb +20 -0
- data/lib/roo/helpers/weak_instance_cache.rb +41 -0
- data/lib/roo/libre_office.rb +4 -0
- data/lib/roo/link.rb +34 -0
- data/lib/roo/open_office.rb +628 -0
- data/lib/roo/spreadsheet.rb +39 -0
- data/lib/roo/tempdir.rb +21 -0
- data/lib/roo/utils.rb +128 -0
- data/lib/roo/version.rb +3 -0
- data/lib/roo.rb +36 -0
- data/roo.gemspec +28 -0
- metadata +189 -0
data/lib/roo/utils.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Roo
|
4
|
+
module Utils
|
5
|
+
extend self
|
6
|
+
|
7
|
+
LETTERS = ('A'..'Z').to_a
|
8
|
+
|
9
|
+
def extract_coordinate(s)
|
10
|
+
num = letter_num = 0
|
11
|
+
num_only = false
|
12
|
+
|
13
|
+
s.each_byte do |b|
|
14
|
+
if !num_only && (index = char_index(b))
|
15
|
+
letter_num *= 26
|
16
|
+
letter_num += index
|
17
|
+
elsif index = num_index(b)
|
18
|
+
num_only = true
|
19
|
+
num *= 10
|
20
|
+
num += index
|
21
|
+
else
|
22
|
+
fail ArgumentError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
fail ArgumentError if letter_num == 0 || !num_only
|
26
|
+
|
27
|
+
Excelx::Coordinate.new(num, letter_num)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :ref_to_key, :extract_coordinate
|
31
|
+
|
32
|
+
def split_coordinate(str)
|
33
|
+
warn "[DEPRECATION] `Roo::Utils.split_coordinate` is deprecated. Please use `Roo::Utils.extract_coordinate` instead."
|
34
|
+
extract_coordinate(str)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
def split_coord(str)
|
40
|
+
coord = extract_coordinate(str)
|
41
|
+
[number_to_letter(coord.column), coord.row]
|
42
|
+
end
|
43
|
+
|
44
|
+
# convert a number to something like 'AB' (1 => 'A', 2 => 'B', ...)
|
45
|
+
def number_to_letter(num)
|
46
|
+
result = +""
|
47
|
+
|
48
|
+
until num.zero?
|
49
|
+
num, index = (num - 1).divmod(26)
|
50
|
+
result.prepend(LETTERS[index])
|
51
|
+
end
|
52
|
+
|
53
|
+
result
|
54
|
+
end
|
55
|
+
|
56
|
+
def letter_to_number(letters)
|
57
|
+
@letter_to_number ||= {}
|
58
|
+
@letter_to_number[letters] ||= begin
|
59
|
+
result = 0
|
60
|
+
|
61
|
+
# :bytes method returns an enumerator in 1.9.3 and an array in 2.0+
|
62
|
+
letters.bytes.to_a.map{|b| b > 96 ? b - 96 : b - 64 }.reverse.each_with_index{ |num, i| result += num * 26 ** i }
|
63
|
+
|
64
|
+
result
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Compute upper bound for cells in a given cell range.
|
69
|
+
def num_cells_in_range(str)
|
70
|
+
cells = str.split(':')
|
71
|
+
return 1 if cells.count == 1
|
72
|
+
raise ArgumentError.new("invalid range string: #{str}. Supported range format 'A1:B2'") if cells.count != 2
|
73
|
+
x1, y1 = extract_coordinate(cells[0])
|
74
|
+
x2, y2 = extract_coordinate(cells[1])
|
75
|
+
(x2 - (x1 - 1)) * (y2 - (y1 - 1))
|
76
|
+
end
|
77
|
+
|
78
|
+
def coordinates_in_range(str)
|
79
|
+
return to_enum(:coordinates_in_range, str) unless block_given?
|
80
|
+
coordinates = str.split(":", 2).map! { |s| extract_coordinate s }
|
81
|
+
|
82
|
+
case coordinates.size
|
83
|
+
when 1
|
84
|
+
yield coordinates[0]
|
85
|
+
when 2
|
86
|
+
tl, br = coordinates
|
87
|
+
rows = tl.row..br.row
|
88
|
+
cols = tl.column..br.column
|
89
|
+
rows.each do |row|
|
90
|
+
cols.each do |column|
|
91
|
+
yield Excelx::Coordinate.new(row, column)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def load_xml(path)
|
98
|
+
::File.open(path, 'rb') do |file|
|
99
|
+
::Nokogiri::XML(file)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Yield each element of a given type ('row', 'c', etc.) to caller
|
104
|
+
def each_element(path, elements)
|
105
|
+
elements = Array(elements)
|
106
|
+
Nokogiri::XML::Reader(::File.open(path, 'rb'), nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS).each do |node|
|
107
|
+
next unless node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT && elements.include?(node.name)
|
108
|
+
yield Nokogiri::XML(node.outer_xml).root if block_given?
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def char_index(byte)
|
115
|
+
if byte >= 65 && byte <= 90
|
116
|
+
byte - 64
|
117
|
+
elsif byte >= 97 && byte <= 122
|
118
|
+
byte - 96
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def num_index(byte)
|
123
|
+
if byte >= 48 && byte <= 57
|
124
|
+
byte - 48
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/roo/version.rb
ADDED
data/lib/roo.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'roo/version'
|
4
|
+
require 'roo/constants'
|
5
|
+
require 'roo/errors'
|
6
|
+
require 'roo/spreadsheet'
|
7
|
+
require 'roo/base'
|
8
|
+
|
9
|
+
module Roo
|
10
|
+
autoload :OpenOffice, 'roo/open_office'
|
11
|
+
autoload :LibreOffice, 'roo/libre_office'
|
12
|
+
autoload :Excelx, 'roo/excelx'
|
13
|
+
autoload :CSV, 'roo/csv'
|
14
|
+
|
15
|
+
TEMP_PREFIX = 'roo_'
|
16
|
+
|
17
|
+
CLASS_FOR_EXTENSION = {
|
18
|
+
ods: Roo::OpenOffice,
|
19
|
+
xlsx: Roo::Excelx,
|
20
|
+
xlsm: Roo::Excelx,
|
21
|
+
csv: Roo::CSV
|
22
|
+
}
|
23
|
+
|
24
|
+
def self.const_missing(const_name)
|
25
|
+
case const_name
|
26
|
+
when :Excel
|
27
|
+
raise ROO_EXCEL_NOTICE
|
28
|
+
when :Excel2003XML
|
29
|
+
raise ROO_EXCELML_NOTICE
|
30
|
+
when :Google
|
31
|
+
raise ROO_GOOGLE_NOTICE
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/roo.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'roo/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'ruh-roo'
|
8
|
+
spec.version = Roo::VERSION
|
9
|
+
spec.authors = ['Thomas Preymesser', 'Hugh McGowan', 'Ben Woosley', 'Oleksandr Simonov', 'Steven Daniels', 'Anmol Chopra']
|
10
|
+
spec.email = ['ruby.ruby.ruby.roo@gmail.com', 'oleksandr@simonov.me']
|
11
|
+
spec.summary = 'Roo can access the contents of various spreadsheet files.'
|
12
|
+
spec.description = "Roo can access the contents of various spreadsheet files. It can handle\n* OpenOffice\n* Excelx\n* LibreOffice\n* CSV"
|
13
|
+
spec.homepage = 'https://github.com/rbclark/roo'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = Dir.glob('lib/**/*').reject { |f| File.directory?(f) } + %w{CHANGELOG.md LICENSE README.md Gemfile roo.gemspec}
|
17
|
+
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.required_ruby_version = ">= 2.5.0"
|
21
|
+
|
22
|
+
spec.add_dependency 'nokogiri', '~> 1'
|
23
|
+
spec.add_dependency 'rubyzip', '>= 1.3.0', '< 3.0.0'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'rake'
|
26
|
+
spec.add_development_dependency 'minitest', '~> 5.4', '>= 5.4.3'
|
27
|
+
spec.add_development_dependency 'rack', '~> 1.6', '< 2.0.0'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruh-roo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Thomas Preymesser
|
8
|
+
- Hugh McGowan
|
9
|
+
- Ben Woosley
|
10
|
+
- Oleksandr Simonov
|
11
|
+
- Steven Daniels
|
12
|
+
- Anmol Chopra
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
date: 2021-10-07 00:00:00.000000000 Z
|
17
|
+
dependencies:
|
18
|
+
- !ruby/object:Gem::Dependency
|
19
|
+
name: nokogiri
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - "~>"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '1'
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - "~>"
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '1'
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: rubyzip
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 1.3.0
|
39
|
+
- - "<"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 3.0.0
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.3.0
|
49
|
+
- - "<"
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 3.0.0
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: rake
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
type: :development
|
60
|
+
prerelease: false
|
61
|
+
version_requirements: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: minitest
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - "~>"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '5.4'
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 5.4.3
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.4'
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 5.4.3
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rack
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - "~>"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '1.6'
|
93
|
+
- - "<"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 2.0.0
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.6'
|
103
|
+
- - "<"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 2.0.0
|
106
|
+
description: |-
|
107
|
+
Roo can access the contents of various spreadsheet files. It can handle
|
108
|
+
* OpenOffice
|
109
|
+
* Excelx
|
110
|
+
* LibreOffice
|
111
|
+
* CSV
|
112
|
+
email:
|
113
|
+
- ruby.ruby.ruby.roo@gmail.com
|
114
|
+
- oleksandr@simonov.me
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- CHANGELOG.md
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE
|
122
|
+
- README.md
|
123
|
+
- lib/roo.rb
|
124
|
+
- lib/roo/base.rb
|
125
|
+
- lib/roo/constants.rb
|
126
|
+
- lib/roo/csv.rb
|
127
|
+
- lib/roo/errors.rb
|
128
|
+
- lib/roo/excelx.rb
|
129
|
+
- lib/roo/excelx/cell.rb
|
130
|
+
- lib/roo/excelx/cell/base.rb
|
131
|
+
- lib/roo/excelx/cell/boolean.rb
|
132
|
+
- lib/roo/excelx/cell/date.rb
|
133
|
+
- lib/roo/excelx/cell/datetime.rb
|
134
|
+
- lib/roo/excelx/cell/empty.rb
|
135
|
+
- lib/roo/excelx/cell/number.rb
|
136
|
+
- lib/roo/excelx/cell/string.rb
|
137
|
+
- lib/roo/excelx/cell/time.rb
|
138
|
+
- lib/roo/excelx/comments.rb
|
139
|
+
- lib/roo/excelx/coordinate.rb
|
140
|
+
- lib/roo/excelx/extractor.rb
|
141
|
+
- lib/roo/excelx/format.rb
|
142
|
+
- lib/roo/excelx/images.rb
|
143
|
+
- lib/roo/excelx/relationships.rb
|
144
|
+
- lib/roo/excelx/shared.rb
|
145
|
+
- lib/roo/excelx/shared_strings.rb
|
146
|
+
- lib/roo/excelx/sheet.rb
|
147
|
+
- lib/roo/excelx/sheet_doc.rb
|
148
|
+
- lib/roo/excelx/styles.rb
|
149
|
+
- lib/roo/excelx/workbook.rb
|
150
|
+
- lib/roo/font.rb
|
151
|
+
- lib/roo/formatters/base.rb
|
152
|
+
- lib/roo/formatters/csv.rb
|
153
|
+
- lib/roo/formatters/matrix.rb
|
154
|
+
- lib/roo/formatters/xml.rb
|
155
|
+
- lib/roo/formatters/yaml.rb
|
156
|
+
- lib/roo/helpers/default_attr_reader.rb
|
157
|
+
- lib/roo/helpers/weak_instance_cache.rb
|
158
|
+
- lib/roo/libre_office.rb
|
159
|
+
- lib/roo/link.rb
|
160
|
+
- lib/roo/open_office.rb
|
161
|
+
- lib/roo/spreadsheet.rb
|
162
|
+
- lib/roo/tempdir.rb
|
163
|
+
- lib/roo/utils.rb
|
164
|
+
- lib/roo/version.rb
|
165
|
+
- roo.gemspec
|
166
|
+
homepage: https://github.com/rbclark/roo
|
167
|
+
licenses:
|
168
|
+
- MIT
|
169
|
+
metadata: {}
|
170
|
+
post_install_message:
|
171
|
+
rdoc_options: []
|
172
|
+
require_paths:
|
173
|
+
- lib
|
174
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: 2.5.0
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
requirements: []
|
185
|
+
rubygems_version: 3.1.6
|
186
|
+
signing_key:
|
187
|
+
specification_version: 4
|
188
|
+
summary: Roo can access the contents of various spreadsheet files.
|
189
|
+
test_files: []
|