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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f3abfccfccc78bc42a10cd71a1c1579b4498acee6b3f6e96b19da0aa13f27c6
4
- data.tar.gz: fc317c12354721f08d6ad757f147c9ba6fcf2b8cc73cc0500ae5d17e1f5675a4
3
+ metadata.gz: ade681d66101849ddf0ecd1cb0211d309153f604cbe0fc8ed3254c7930265e0a
4
+ data.tar.gz: e9c0d24538cfe42affb2690f2f00a5535277013898c781aa668eecbd3329df6b
5
5
  SHA512:
6
- metadata.gz: 92e917efe5443041dc3ac24e38518541dfedc834eaa17b866800b85a356a2072f6bf0f52c4bc977b9c4ba115a2a4f5401d782408d4528bbe44781f0c92a44161
7
- data.tar.gz: edca02d81bafea0cdf80665448d69d39325de475144dcfac10f4e4cde77a413cd3a4aed0b269b0eae88bde9b0c4723c4e1ce3608969f36af41630a4a480bc5a8
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
@@ -1,5 +1,9 @@
1
1
  # Xsv Changelog
2
2
 
3
+ ## 1.0.5 2022-01-05
4
+
5
+ - Raise exception if given an empty buffer when opening workbook (thanks @kevin-j-m)
6
+
3
7
  ## 1.0.4 2021-07-05
4
8
 
5
9
  - Support for custom date/time columns
data/Rakefile CHANGED
@@ -13,4 +13,4 @@ Rake::TestTask.new(:bench) do |t|
13
13
  t.test_files = FileList["test/**/*_benchmark.rb"]
14
14
  end
15
15
 
16
- task :default => [:test, :bench]
16
+ task default: [:test, :bench]
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 => '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 => '@'
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 = 'A'.ord.freeze
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('%02d:%02d', hours, minutes)
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? 'E'
97
+ elsif string.include? "E"
98
98
  Complex(string).to_f
99
99
  else
100
100
  string.to_i
@@ -17,7 +17,7 @@ module Xsv
17
17
  end
18
18
 
19
19
  def start_element(name, attrs)
20
- @block.call(attrs.slice(:Id, :Type, :Target)) if name == 'Relationship'
20
+ @block.call(attrs.slice(:Id, :Type, :Target)) if name == "Relationship"
21
21
  end
22
22
  end
23
23
  end
@@ -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('utf-8')
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!('&amp;', '&')
38
- chars.gsub!('&apos;', "'")
39
- chars.gsub!('&gt;', '>')
40
- chars.gsub!('&lt;', '<')
41
- chars.gsub!('&quot;', '"')
36
+ if chars.index("&")
37
+ chars.gsub!("&amp;", "&")
38
+ chars.gsub!("&apos;", "'")
39
+ chars.gsub!("&gt;", ">")
40
+ chars.gsub!("&lt;", "<")
41
+ chars.gsub!("&quot;", '"')
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(' ')) && s < o
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?('/') && respond_to?(:end_element)
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 'Malformed XML document, looking for end of tag beyond EOF'
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 'si'
22
- @current_string = ''
21
+ when "si"
22
+ @current_string = ""
23
23
  @skip = false
24
- when 'rPh'
24
+ when "rPh"
25
25
  @skip = true
26
- when 't'
26
+ when "t"
27
27
  @state = name
28
28
  end
29
29
  end
30
30
 
31
31
  def characters(value)
32
- if @state == 't' && !@skip
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 'si'
39
+ when "si"
40
40
  @block.call(@current_string)
41
- when 'rPh'
41
+ when "rPh"
42
42
  @skip = false
43
- when 't'
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] == 'hidden'
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
- alias each each_row
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 'c'
40
+ when "c"
41
41
  @state = name
42
42
  @cell = attrs[:r]
43
- when 'v'
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 'row'
47
+ when "row"
48
48
  @state = name
49
49
  @row = attrs[:r].to_i
50
- when 'dimension'
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 == 'sheetData'
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 = String.new
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 'c'
30
+ when "c"
31
31
  @state = name
32
32
  @current_cell = attrs
33
33
  @current_value.clear
34
- when 'v', 'is'
34
+ when "v", "is"
35
35
  @state = name
36
- when 'row'
36
+ when "row"
37
37
  @state = name
38
38
  @current_row = @empty_row.dup
39
39
  @current_row_attrs = attrs
40
- when 't'
41
- @state = nil unless @state == 'is'
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 == 'v' || @state == 'is'
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 'v'
53
+ when "v"
54
54
  @state = nil
55
- when 'c'
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 'row'
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 's'
93
+ when "s"
94
94
  @workbook.shared_strings[@current_value.to_i]
95
- when 'str', 'inlineStr'
95
+ when "str", "inlineStr"
96
96
  @current_value.strip
97
- when 'e' # N/A
97
+ when "e" # N/A
98
98
  nil
99
- when nil, 'n'
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 'b'
109
- @current_value == '1'
110
- when 'd'
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]}"
@@ -17,7 +17,7 @@ module Xsv
17
17
  end
18
18
 
19
19
  def start_element(name, attrs)
20
- @block.call(attrs.slice(:name, :sheetId, :state, :'r:id')) if name == 'sheet'
20
+ @block.call(attrs.slice(:name, :sheetId, :state, :'r:id')) if name == "sheet"
21
21
  end
22
22
  end
23
23
  end
@@ -24,20 +24,20 @@ module Xsv
24
24
 
25
25
  def start_element(name, attrs)
26
26
  case name
27
- when 'cellXfs'
28
- @state = 'cellXfs'
29
- when 'xf'
30
- @xfs << attrs if @state == 'cellXfs'
31
- when 'numFmt'
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 'styleSheet'
38
+ when "styleSheet"
39
39
  @block.call(@xfs, @numFmts)
40
- when 'cellXfs'
40
+ when "cellXfs"
41
41
  @state = nil
42
42
  end
43
43
  end
data/lib/xsv/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Xsv
4
- VERSION = '1.0.4'
4
+ VERSION = "1.0.5"
5
5
  end
data/lib/xsv/workbook.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'zip'
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
- 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
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('xl/sharedStrings.xml').first
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('xl/styles.xml').first.get_input_stream
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('xl/worksheets/sheet*.xml').sort do |a, b|
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?('worksheet') }
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('xl/workbook.xml').first.get_input_stream
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('xl/_rels/workbook.xml.rels').first.get_input_stream
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 'date'
3
+ require "date"
4
4
 
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'
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
- EOF
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
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: 2021-07-05 00:00:00.000000000 Z
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.2.15
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: []