xsv 1.0.4 → 1.0.5
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 +4 -4
- data/.standard.yml +1 -0
- data/CHANGELOG.md +4 -0
- data/Rakefile +1 -1
- data/lib/xsv/helpers.rb +35 -35
- data/lib/xsv/relationships_handler.rb +1 -1
- data/lib/xsv/sax_parser.rb +13 -13
- data/lib/xsv/shared_strings_parser.rb +8 -8
- data/lib/xsv/sheet.rb +2 -2
- data/lib/xsv/sheet_bounds_handler.rb +6 -6
- data/lib/xsv/sheet_rows_handler.rb +17 -17
- data/lib/xsv/sheets_ids_handler.rb +1 -1
- data/lib/xsv/styles_handler.rb +7 -7
- data/lib/xsv/version.rb +1 -1
- data/lib/xsv/workbook.rb +14 -13
- data/lib/xsv.rb +12 -12
- data/xsv.gemspec +2 -1
- metadata +21 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ade681d66101849ddf0ecd1cb0211d309153f604cbe0fc8ed3254c7930265e0a
|
|
4
|
+
data.tar.gz: e9c0d24538cfe42affb2690f2f00a5535277013898c781aa668eecbd3329df6b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fb21f559a6a3d8fd20192fab8c0543fbf430f49fc563e5c98e584258bb72cd0faa8b0cf8ce9792035d5db46f40a8db082eb2407c6a132e085d74cc69200c3e2a
|
|
7
|
+
data.tar.gz: 87c1ffca0e26ffdaf9a91bae58d188bffedae87508c3a91d33fb06c1fbb6c121f40dfce12af3dd5080254613ae47a5481cab996f9a6284517967fd71893ede94
|
data/.standard.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby_version: 2.5.0
|
data/CHANGELOG.md
CHANGED
data/Rakefile
CHANGED
data/lib/xsv/helpers.rb
CHANGED
|
@@ -5,42 +5,42 @@ module Xsv
|
|
|
5
5
|
# The default OOXML Spreadheet number formats according to the ECMA standard
|
|
6
6
|
# User formats are appended from index 174 onward
|
|
7
7
|
BUILT_IN_NUMBER_FORMATS = {
|
|
8
|
-
1 =>
|
|
9
|
-
2 =>
|
|
10
|
-
3 =>
|
|
11
|
-
4 =>
|
|
12
|
-
5 =>
|
|
13
|
-
6 =>
|
|
14
|
-
7 =>
|
|
15
|
-
8 =>
|
|
16
|
-
9 =>
|
|
17
|
-
10 =>
|
|
18
|
-
11 =>
|
|
19
|
-
12 =>
|
|
20
|
-
13 =>
|
|
21
|
-
14 =>
|
|
22
|
-
15 =>
|
|
23
|
-
16 =>
|
|
24
|
-
17 =>
|
|
25
|
-
18 =>
|
|
26
|
-
19 =>
|
|
27
|
-
20 =>
|
|
28
|
-
21 =>
|
|
29
|
-
22 =>
|
|
30
|
-
37 =>
|
|
31
|
-
38 =>
|
|
32
|
-
39 =>
|
|
33
|
-
40 =>
|
|
34
|
-
45 =>
|
|
35
|
-
46 =>
|
|
36
|
-
47 =>
|
|
37
|
-
48 =>
|
|
38
|
-
49 =>
|
|
8
|
+
1 => "0",
|
|
9
|
+
2 => "0.00",
|
|
10
|
+
3 => "#, ##0",
|
|
11
|
+
4 => "#, ##0.00",
|
|
12
|
+
5 => "$#, ##0_);($#, ##0)",
|
|
13
|
+
6 => "$#, ##0_);[Red]($#, ##0)",
|
|
14
|
+
7 => "$#, ##0.00_);($#, ##0.00)",
|
|
15
|
+
8 => "$#, ##0.00_);[Red]($#, ##0.00)",
|
|
16
|
+
9 => "0%",
|
|
17
|
+
10 => "0.00%",
|
|
18
|
+
11 => "0.00E+00",
|
|
19
|
+
12 => "# ?/?",
|
|
20
|
+
13 => "# ??/??",
|
|
21
|
+
14 => "m/d/yyyy",
|
|
22
|
+
15 => "d-mmm-yy",
|
|
23
|
+
16 => "d-mmm",
|
|
24
|
+
17 => "mmm-yy",
|
|
25
|
+
18 => "h:mm AM/PM",
|
|
26
|
+
19 => "h:mm:ss AM/PM",
|
|
27
|
+
20 => "h:mm",
|
|
28
|
+
21 => "h:mm:ss",
|
|
29
|
+
22 => "m/d/yyyy h:mm",
|
|
30
|
+
37 => "#, ##0_);(#, ##0)",
|
|
31
|
+
38 => "#, ##0_);[Red](#, ##0)",
|
|
32
|
+
39 => "#, ##0.00_);(#, ##0.00)",
|
|
33
|
+
40 => "#, ##0.00_);[Red](#, ##0.00)",
|
|
34
|
+
45 => "mm:ss",
|
|
35
|
+
46 => "[h]:mm:ss",
|
|
36
|
+
47 => "mm:ss.0",
|
|
37
|
+
48 => "##0.0E+0",
|
|
38
|
+
49 => "@"
|
|
39
39
|
}.freeze
|
|
40
40
|
|
|
41
41
|
MINUTE = 60
|
|
42
42
|
HOUR = 3600
|
|
43
|
-
A_CODEPOINT =
|
|
43
|
+
A_CODEPOINT = "A".ord.freeze
|
|
44
44
|
# The epoch for all dates in OOXML Spreadsheet documents
|
|
45
45
|
EPOCH = Date.new(1899, 12, 30).freeze
|
|
46
46
|
|
|
@@ -74,7 +74,7 @@ module Xsv
|
|
|
74
74
|
minutes = minutes % 60
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
format(
|
|
77
|
+
format("%02d:%02d", hours, minutes)
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
# Returns a time including a date as a {Time} object
|
|
@@ -92,9 +92,9 @@ module Xsv
|
|
|
92
92
|
|
|
93
93
|
# Returns a number as either Integer or Float
|
|
94
94
|
def parse_number(string)
|
|
95
|
-
if string.include?
|
|
95
|
+
if string.include? "."
|
|
96
96
|
string.to_f
|
|
97
|
-
elsif string.include?
|
|
97
|
+
elsif string.include? "E"
|
|
98
98
|
Complex(string).to_f
|
|
99
99
|
else
|
|
100
100
|
string.to_i
|
data/lib/xsv/sax_parser.rb
CHANGED
|
@@ -29,16 +29,16 @@ module Xsv
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
if state == :look_start
|
|
32
|
-
if (o = pbuf.index(
|
|
33
|
-
chars = pbuf.slice!(0, o + 1).chop!.force_encoding(
|
|
32
|
+
if (o = pbuf.index("<"))
|
|
33
|
+
chars = pbuf.slice!(0, o + 1).chop!.force_encoding("utf-8")
|
|
34
34
|
|
|
35
35
|
if respond_to?(:characters) && !chars.empty?
|
|
36
|
-
if chars.index(
|
|
37
|
-
chars.gsub!(
|
|
38
|
-
chars.gsub!(
|
|
39
|
-
chars.gsub!(
|
|
40
|
-
chars.gsub!(
|
|
41
|
-
chars.gsub!(
|
|
36
|
+
if chars.index("&")
|
|
37
|
+
chars.gsub!("&", "&")
|
|
38
|
+
chars.gsub!("'", "'")
|
|
39
|
+
chars.gsub!(">", ">")
|
|
40
|
+
chars.gsub!("<", "<")
|
|
41
|
+
chars.gsub!(""", '"')
|
|
42
42
|
end
|
|
43
43
|
characters(chars)
|
|
44
44
|
end
|
|
@@ -55,8 +55,8 @@ module Xsv
|
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
if state == :look_end
|
|
58
|
-
if (o = pbuf.index(
|
|
59
|
-
if (s = pbuf.index(
|
|
58
|
+
if (o = pbuf.index(">"))
|
|
59
|
+
if (s = pbuf.index(" ")) && s < o
|
|
60
60
|
tag_name = pbuf.slice!(0, s + 1).chop!
|
|
61
61
|
args = pbuf.slice!(0, o - s)
|
|
62
62
|
else
|
|
@@ -64,18 +64,18 @@ module Xsv
|
|
|
64
64
|
args = nil
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
if tag_name.start_with?(
|
|
67
|
+
if tag_name.start_with?("/")
|
|
68
68
|
end_element(tag_name[1..-1]) if respond_to?(:end_element)
|
|
69
69
|
elsif args.nil?
|
|
70
70
|
start_element(tag_name, nil)
|
|
71
71
|
else
|
|
72
72
|
start_element(tag_name, args.scan(ATTR_REGEX).each_with_object({}) { |m, h| h[m[1].to_sym] = m[2] })
|
|
73
|
-
end_element(tag_name) if args.end_with?(
|
|
73
|
+
end_element(tag_name) if args.end_with?("/") && respond_to?(:end_element)
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
state = :look_start
|
|
77
77
|
elsif eof_reached
|
|
78
|
-
raise
|
|
78
|
+
raise "Malformed XML document, looking for end of tag beyond EOF"
|
|
79
79
|
else
|
|
80
80
|
must_read = true
|
|
81
81
|
end
|
|
@@ -18,29 +18,29 @@ module Xsv
|
|
|
18
18
|
|
|
19
19
|
def start_element(name, _attrs)
|
|
20
20
|
case name
|
|
21
|
-
when
|
|
22
|
-
@current_string =
|
|
21
|
+
when "si"
|
|
22
|
+
@current_string = ""
|
|
23
23
|
@skip = false
|
|
24
|
-
when
|
|
24
|
+
when "rPh"
|
|
25
25
|
@skip = true
|
|
26
|
-
when
|
|
26
|
+
when "t"
|
|
27
27
|
@state = name
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def characters(value)
|
|
32
|
-
if @state ==
|
|
32
|
+
if @state == "t" && !@skip
|
|
33
33
|
@current_string += value
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def end_element(name)
|
|
38
38
|
case name
|
|
39
|
-
when
|
|
39
|
+
when "si"
|
|
40
40
|
@block.call(@current_string)
|
|
41
|
-
when
|
|
41
|
+
when "rPh"
|
|
42
42
|
@skip = false
|
|
43
|
-
when
|
|
43
|
+
when "t"
|
|
44
44
|
@state = nil
|
|
45
45
|
end
|
|
46
46
|
end
|
data/lib/xsv/sheet.rb
CHANGED
|
@@ -40,7 +40,7 @@ module Xsv
|
|
|
40
40
|
@headers = []
|
|
41
41
|
@mode = :array
|
|
42
42
|
@row_skip = 0
|
|
43
|
-
@hidden = ids[:state] ==
|
|
43
|
+
@hidden = ids[:state] == "hidden"
|
|
44
44
|
|
|
45
45
|
@last_row, @column_count = SheetBoundsHandler.get_bounds(@io, @workbook)
|
|
46
46
|
end
|
|
@@ -66,7 +66,7 @@ module Xsv
|
|
|
66
66
|
true
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
alias_method :each, :each_row
|
|
70
70
|
|
|
71
71
|
# Get row by number, starting at 0. Returns either a hash or an array based on the current row.
|
|
72
72
|
# If the specified index is out of bounds an empty row is returned.
|
|
@@ -37,20 +37,20 @@ module Xsv
|
|
|
37
37
|
|
|
38
38
|
def start_element(name, attrs)
|
|
39
39
|
case name
|
|
40
|
-
when
|
|
40
|
+
when "c"
|
|
41
41
|
@state = name
|
|
42
42
|
@cell = attrs[:r]
|
|
43
|
-
when
|
|
43
|
+
when "v"
|
|
44
44
|
col = column_index(@cell)
|
|
45
45
|
@maxColumn = col if col > @maxColumn
|
|
46
46
|
@maxRow = @row if @row > @maxRow
|
|
47
|
-
when
|
|
47
|
+
when "row"
|
|
48
48
|
@state = name
|
|
49
49
|
@row = attrs[:r].to_i
|
|
50
|
-
when
|
|
50
|
+
when "dimension"
|
|
51
51
|
@state = name
|
|
52
52
|
|
|
53
|
-
_firstCell, lastCell = attrs[:ref].split(
|
|
53
|
+
_firstCell, lastCell = attrs[:ref].split(":")
|
|
54
54
|
|
|
55
55
|
if lastCell
|
|
56
56
|
@maxColumn = column_index(lastCell)
|
|
@@ -63,7 +63,7 @@ module Xsv
|
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def end_element(name)
|
|
66
|
-
@block.call(@maxRow, @maxColumn) if name ==
|
|
66
|
+
@block.call(@maxRow, @maxColumn) if name == "sheetData"
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
end
|
|
@@ -20,39 +20,39 @@ module Xsv
|
|
|
20
20
|
@current_row = {}
|
|
21
21
|
@current_row_attrs = {}
|
|
22
22
|
@current_cell = {}
|
|
23
|
-
@current_value =
|
|
23
|
+
@current_value = +""
|
|
24
24
|
|
|
25
25
|
@headers = @empty_row.keys if @mode == :hash
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def start_element(name, attrs)
|
|
29
29
|
case name
|
|
30
|
-
when
|
|
30
|
+
when "c"
|
|
31
31
|
@state = name
|
|
32
32
|
@current_cell = attrs
|
|
33
33
|
@current_value.clear
|
|
34
|
-
when
|
|
34
|
+
when "v", "is"
|
|
35
35
|
@state = name
|
|
36
|
-
when
|
|
36
|
+
when "row"
|
|
37
37
|
@state = name
|
|
38
38
|
@current_row = @empty_row.dup
|
|
39
39
|
@current_row_attrs = attrs
|
|
40
|
-
when
|
|
41
|
-
@state = nil unless @state ==
|
|
40
|
+
when "t"
|
|
41
|
+
@state = nil unless @state == "is"
|
|
42
42
|
else
|
|
43
43
|
@state = nil
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def characters(value)
|
|
48
|
-
@current_value << value if @state ==
|
|
48
|
+
@current_value << value if @state == "v" || @state == "is"
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def end_element(name)
|
|
52
52
|
case name
|
|
53
|
-
when
|
|
53
|
+
when "v"
|
|
54
54
|
@state = nil
|
|
55
|
-
when
|
|
55
|
+
when "c"
|
|
56
56
|
col_index = column_index(@current_cell[:r])
|
|
57
57
|
|
|
58
58
|
case @mode
|
|
@@ -61,7 +61,7 @@ module Xsv
|
|
|
61
61
|
when :hash
|
|
62
62
|
@current_row[@headers[col_index]] = format_cell
|
|
63
63
|
end
|
|
64
|
-
when
|
|
64
|
+
when "row"
|
|
65
65
|
real_row_number = @current_row_attrs[:r].to_i
|
|
66
66
|
adjusted_row_number = real_row_number - @row_skip
|
|
67
67
|
|
|
@@ -90,13 +90,13 @@ module Xsv
|
|
|
90
90
|
return nil if @current_value.empty?
|
|
91
91
|
|
|
92
92
|
case @current_cell[:t]
|
|
93
|
-
when
|
|
93
|
+
when "s"
|
|
94
94
|
@workbook.shared_strings[@current_value.to_i]
|
|
95
|
-
when
|
|
95
|
+
when "str", "inlineStr"
|
|
96
96
|
@current_value.strip
|
|
97
|
-
when
|
|
97
|
+
when "e" # N/A
|
|
98
98
|
nil
|
|
99
|
-
when nil,
|
|
99
|
+
when nil, "n"
|
|
100
100
|
if @current_cell[:s]
|
|
101
101
|
style = @workbook.xfs[@current_cell[:s].to_i]
|
|
102
102
|
numFmt = @workbook.numFmts[style[:numFmtId].to_i]
|
|
@@ -105,9 +105,9 @@ module Xsv
|
|
|
105
105
|
else
|
|
106
106
|
parse_number(@current_value)
|
|
107
107
|
end
|
|
108
|
-
when
|
|
109
|
-
@current_value ==
|
|
110
|
-
when
|
|
108
|
+
when "b"
|
|
109
|
+
@current_value == "1"
|
|
110
|
+
when "d"
|
|
111
111
|
DateTime.parse(@current_value)
|
|
112
112
|
else
|
|
113
113
|
raise Xsv::Error, "Encountered unknown column type #{@current_cell[:t]}"
|
data/lib/xsv/styles_handler.rb
CHANGED
|
@@ -24,20 +24,20 @@ module Xsv
|
|
|
24
24
|
|
|
25
25
|
def start_element(name, attrs)
|
|
26
26
|
case name
|
|
27
|
-
when
|
|
28
|
-
@state =
|
|
29
|
-
when
|
|
30
|
-
@xfs << attrs if @state ==
|
|
31
|
-
when
|
|
27
|
+
when "cellXfs"
|
|
28
|
+
@state = "cellXfs"
|
|
29
|
+
when "xf"
|
|
30
|
+
@xfs << attrs if @state == "cellXfs"
|
|
31
|
+
when "numFmt"
|
|
32
32
|
@numFmts[attrs[:numFmtId].to_i] = attrs[:formatCode]
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def end_element(name)
|
|
37
37
|
case name
|
|
38
|
-
when
|
|
38
|
+
when "styleSheet"
|
|
39
39
|
@block.call(@xfs, @numFmts)
|
|
40
|
-
when
|
|
40
|
+
when "cellXfs"
|
|
41
41
|
@state = nil
|
|
42
42
|
end
|
|
43
43
|
end
|
data/lib/xsv/version.rb
CHANGED
data/lib/xsv/workbook.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "zip"
|
|
4
4
|
|
|
5
5
|
module Xsv
|
|
6
6
|
# An OOXML Spreadsheet document is called a Workbook. A Workbook consists of
|
|
@@ -16,12 +16,12 @@ module Xsv
|
|
|
16
16
|
# options see {.initialize}
|
|
17
17
|
def self.open(data, **kws)
|
|
18
18
|
@workbook = if data.is_a?(IO) || data.respond_to?(:read) # is it a buffer?
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
new(Zip::File.open_buffer(data), **kws)
|
|
20
|
+
elsif data.start_with?("PK\x03\x04") # is it a string containing a file?
|
|
21
|
+
new(Zip::File.open_buffer(data), **kws)
|
|
22
|
+
else # must be a filename
|
|
23
|
+
new(Zip::File.open(data), **kws)
|
|
24
|
+
end
|
|
25
25
|
|
|
26
26
|
if block_given?
|
|
27
27
|
begin
|
|
@@ -43,6 +43,7 @@ module Xsv
|
|
|
43
43
|
#
|
|
44
44
|
def initialize(zip, trim_empty_rows: false)
|
|
45
45
|
raise ArgumentError, "Passed argument is not an instance of Zip::File. Did you mean to use Workbook.open?" unless zip.is_a?(Zip::File)
|
|
46
|
+
raise Xsv::Error, "Zip::File is empty" if zip.size.zero?
|
|
46
47
|
|
|
47
48
|
@zip = zip
|
|
48
49
|
@trim_empty_rows = trim_empty_rows
|
|
@@ -85,7 +86,7 @@ module Xsv
|
|
|
85
86
|
private
|
|
86
87
|
|
|
87
88
|
def fetch_shared_strings
|
|
88
|
-
handle = @zip.glob(
|
|
89
|
+
handle = @zip.glob("xl/sharedStrings.xml").first
|
|
89
90
|
return if handle.nil?
|
|
90
91
|
|
|
91
92
|
stream = handle.get_input_stream
|
|
@@ -95,7 +96,7 @@ module Xsv
|
|
|
95
96
|
end
|
|
96
97
|
|
|
97
98
|
def fetch_styles
|
|
98
|
-
stream = @zip.glob(
|
|
99
|
+
stream = @zip.glob("xl/styles.xml").first.get_input_stream
|
|
99
100
|
|
|
100
101
|
StylesHandler.get_styles(stream)
|
|
101
102
|
ensure
|
|
@@ -103,24 +104,24 @@ module Xsv
|
|
|
103
104
|
end
|
|
104
105
|
|
|
105
106
|
def fetch_sheets
|
|
106
|
-
@zip.glob(
|
|
107
|
+
@zip.glob("xl/worksheets/sheet*.xml").sort do |a, b|
|
|
107
108
|
a.name[/\d+/].to_i <=> b.name[/\d+/].to_i
|
|
108
109
|
end.map do |entry|
|
|
109
|
-
rel = @relationships.detect { |r| entry.name.end_with?(r[:Target]) && r[:Type].end_with?(
|
|
110
|
+
rel = @relationships.detect { |r| entry.name.end_with?(r[:Target]) && r[:Type].end_with?("worksheet") }
|
|
110
111
|
sheet_ids = @sheet_ids.detect { |i| i[:"r:id"] == rel[:Id] }
|
|
111
112
|
Xsv::Sheet.new(self, entry.get_input_stream, entry.size, sheet_ids)
|
|
112
113
|
end
|
|
113
114
|
end
|
|
114
115
|
|
|
115
116
|
def fetch_sheet_ids
|
|
116
|
-
stream = @zip.glob(
|
|
117
|
+
stream = @zip.glob("xl/workbook.xml").first.get_input_stream
|
|
117
118
|
SheetsIdsHandler.get_sheets_ids(stream)
|
|
118
119
|
ensure
|
|
119
120
|
stream.close
|
|
120
121
|
end
|
|
121
122
|
|
|
122
123
|
def fetch_relationships
|
|
123
|
-
stream = @zip.glob(
|
|
124
|
+
stream = @zip.glob("xl/_rels/workbook.xml.rels").first.get_input_stream
|
|
124
125
|
RelationshipsHandler.get_relations(stream)
|
|
125
126
|
ensure
|
|
126
127
|
stream.close
|
data/lib/xsv.rb
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "date"
|
|
4
4
|
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
5
|
+
require "xsv/helpers"
|
|
6
|
+
require "xsv/sax_parser"
|
|
7
|
+
require "xsv/relationships_handler"
|
|
8
|
+
require "xsv/shared_strings_parser"
|
|
9
|
+
require "xsv/sheet"
|
|
10
|
+
require "xsv/sheet_bounds_handler"
|
|
11
|
+
require "xsv/sheet_rows_handler"
|
|
12
|
+
require "xsv/sheets_ids_handler"
|
|
13
|
+
require "xsv/styles_handler"
|
|
14
|
+
require "xsv/version"
|
|
15
|
+
require "xsv/workbook"
|
|
16
16
|
|
|
17
17
|
# XSV is a fast, lightweight parser for Office Open XML spreadsheet files
|
|
18
18
|
# (commonly known as Excel or .xlsx files). It strives to be minimal in the
|
data/xsv.gemspec
CHANGED
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
(commonly known as Excel or .xlsx files). It strives to be minimal in the
|
|
15
15
|
sense that it provides nothing a CSV reader wouldn't, meaning it only
|
|
16
16
|
deals with minimal formatting and cannot create or modify documents.
|
|
17
|
-
|
|
17
|
+
EOF
|
|
18
18
|
spec.homepage = "https://github.com/martijn/xsv"
|
|
19
19
|
spec.license = "MIT"
|
|
20
20
|
|
|
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
|
|
|
43
43
|
spec.add_development_dependency "bundler", "< 3"
|
|
44
44
|
spec.add_development_dependency "rake", "~> 13.0"
|
|
45
45
|
spec.add_development_dependency "minitest", "~> 5.14.2"
|
|
46
|
+
spec.add_development_dependency "standardrb", "~> 1.0"
|
|
46
47
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: xsv
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Martijn Storck
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rubyzip
|
|
@@ -72,6 +72,20 @@ dependencies:
|
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
74
|
version: 5.14.2
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: standardrb
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.0'
|
|
82
|
+
type: :development
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '1.0'
|
|
75
89
|
description: |2
|
|
76
90
|
Xsv is a fast, lightweight parser for Office Open XML spreadsheet files
|
|
77
91
|
(commonly known as Excel or .xlsx files). It strives to be minimal in the
|
|
@@ -85,6 +99,7 @@ extra_rdoc_files: []
|
|
|
85
99
|
files:
|
|
86
100
|
- ".github/workflows/ruby.yml"
|
|
87
101
|
- ".gitignore"
|
|
102
|
+
- ".standard.yml"
|
|
88
103
|
- CHANGELOG.md
|
|
89
104
|
- Gemfile
|
|
90
105
|
- LICENSE.txt
|
|
@@ -112,7 +127,7 @@ metadata:
|
|
|
112
127
|
homepage_uri: https://github.com/martijn/xsv
|
|
113
128
|
source_code_uri: https://github.com/martijn/xsv
|
|
114
129
|
changelog_uri: https://github.com/martijn/xsv/CHANGELOG.md
|
|
115
|
-
post_install_message:
|
|
130
|
+
post_install_message:
|
|
116
131
|
rdoc_options: []
|
|
117
132
|
require_paths:
|
|
118
133
|
- lib
|
|
@@ -127,8 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
127
142
|
- !ruby/object:Gem::Version
|
|
128
143
|
version: '0'
|
|
129
144
|
requirements: []
|
|
130
|
-
rubygems_version: 3.
|
|
131
|
-
signing_key:
|
|
145
|
+
rubygems_version: 3.3.3
|
|
146
|
+
signing_key:
|
|
132
147
|
specification_version: 4
|
|
133
148
|
summary: A fast and lightweight xlsx parser that provides nothing a CSV parser wouldn't
|
|
134
149
|
test_files: []
|