workbook 0.8.1 → 0.9.0

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +21 -0
  3. data/.gitignore +4 -1
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +4 -4
  6. data/CHANGELOG.md +8 -0
  7. data/Gemfile +2 -2
  8. data/README.md +9 -7
  9. data/Rakefile +6 -6
  10. data/json_test.json +1 -0
  11. data/lib/workbook/book.rb +73 -62
  12. data/lib/workbook/cell.rb +58 -13
  13. data/lib/workbook/column.rb +31 -28
  14. data/lib/workbook/format.rb +23 -24
  15. data/lib/workbook/generatetypes.rb +4 -4
  16. data/lib/workbook/modules/cache.rb +6 -7
  17. data/lib/workbook/modules/cell.rb +77 -100
  18. data/lib/workbook/modules/diff_sort.rb +92 -83
  19. data/lib/workbook/modules/raw_objects_storage.rb +6 -8
  20. data/lib/workbook/modules/type_parser.rb +30 -22
  21. data/lib/workbook/nil_value.rb +4 -9
  22. data/lib/workbook/readers/csv_reader.rb +7 -10
  23. data/lib/workbook/readers/ods_reader.rb +51 -50
  24. data/lib/workbook/readers/txt_reader.rb +6 -8
  25. data/lib/workbook/readers/xls_reader.rb +21 -33
  26. data/lib/workbook/readers/xls_shared.rb +106 -117
  27. data/lib/workbook/readers/xlsx_reader.rb +45 -46
  28. data/lib/workbook/row.rb +99 -84
  29. data/lib/workbook/sheet.rb +47 -38
  30. data/lib/workbook/table.rb +96 -72
  31. data/lib/workbook/template.rb +12 -15
  32. data/lib/workbook/types/false.rb +0 -1
  33. data/lib/workbook/types/nil.rb +0 -1
  34. data/lib/workbook/types/nil_class.rb +1 -1
  35. data/lib/workbook/types/numeric.rb +1 -1
  36. data/lib/workbook/types/string.rb +1 -1
  37. data/lib/workbook/types/time.rb +1 -1
  38. data/lib/workbook/types/true.rb +0 -1
  39. data/lib/workbook/types/true_class.rb +1 -1
  40. data/lib/workbook/version.rb +2 -3
  41. data/lib/workbook/writers/csv_table_writer.rb +10 -13
  42. data/lib/workbook/writers/html_writer.rb +34 -38
  43. data/lib/workbook/writers/json_table_writer.rb +8 -11
  44. data/lib/workbook/writers/xls_writer.rb +30 -36
  45. data/lib/workbook/writers/xlsx_writer.rb +45 -29
  46. data/lib/workbook.rb +16 -15
  47. data/test/artifacts/currency_test.ods +0 -0
  48. data/test/helper.rb +6 -5
  49. data/test/test_book.rb +41 -38
  50. data/test/test_column.rb +26 -24
  51. data/test/test_format.rb +51 -55
  52. data/test/test_functional.rb +7 -8
  53. data/test/test_modules_cache.rb +18 -17
  54. data/test/test_modules_cell.rb +55 -46
  55. data/test/test_modules_table_diff_sort.rb +55 -64
  56. data/test/test_modules_type_parser.rb +61 -31
  57. data/test/test_readers_csv_reader.rb +48 -42
  58. data/test/test_readers_ods_reader.rb +36 -31
  59. data/test/test_readers_txt_reader.rb +21 -23
  60. data/test/test_readers_xls_reader.rb +20 -23
  61. data/test/test_readers_xls_shared.rb +2 -3
  62. data/test/test_readers_xlsx_reader.rb +44 -37
  63. data/test/test_row.rb +105 -109
  64. data/test/test_sheet.rb +35 -41
  65. data/test/test_table.rb +82 -60
  66. data/test/test_template.rb +16 -15
  67. data/test/test_types_date.rb +4 -6
  68. data/test/test_writers_csv_writer.rb +24 -0
  69. data/test/test_writers_html_writer.rb +42 -41
  70. data/test/test_writers_json_writer.rb +16 -9
  71. data/test/test_writers_xls_writer.rb +50 -35
  72. data/test/test_writers_xlsx_writer.rb +62 -34
  73. data/workbook.gemspec +25 -27
  74. metadata +96 -42
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
3
+
5
4
  module Workbook
6
5
  module Modules
7
6
  # Adds essential diffing and comparing support, as well as diffing entire books
@@ -11,21 +10,22 @@ module Workbook
11
10
  #
12
11
  # @return [Workbook::Table] the empty table, linked to a book
13
12
  def new_diff_template
14
- diffbook = Workbook::Book.new
15
- template = diffbook.template
16
- f = template.create_or_find_format_by 'destroyed'
17
- f[:background_color]=:red
18
- f = template.create_or_find_format_by 'updated'
19
- f[:background_color]=:yellow
20
- f = template.create_or_find_format_by 'created'
21
- f[:background_color]=:lime
22
- f = template.create_or_find_format_by 'header'
23
- f[:rotation] = 72
24
- f[:font_weight] = :bold
25
- f[:height] = 80
26
- diffbook
13
+ diffbook = Workbook::Book.new
14
+ template = diffbook.template
15
+ f = template.create_or_find_format_by "destroyed"
16
+ f[:background_color] = :red
17
+ f = template.create_or_find_format_by "updated"
18
+ f[:background_color] = :yellow
19
+ f = template.create_or_find_format_by "created"
20
+ f[:background_color] = :lime
21
+ f = template.create_or_find_format_by "header"
22
+ f[:rotation] = 72
23
+ f[:font_weight] = :bold
24
+ f[:height] = 80
25
+ diffbook
27
26
  end
28
27
  end
28
+
29
29
  def self.included(base)
30
30
  base.extend(ClassMethods)
31
31
  end
@@ -34,9 +34,9 @@ module Workbook
34
34
  #
35
35
  # @param [Workbook::Book] to_workbook to compare against
36
36
  # @return [Workbook::Book] workbook with compared result
37
- def diff to_workbook, options={:sort=>true,:ignore_headers=>false}
37
+ def diff to_workbook, options = {sort: true, ignore_headers: false}
38
38
  diff_template = Workbook::Book.new_diff_template
39
- self.each_with_index do |from_sheet, sheet_index|
39
+ each_with_index do |from_sheet, sheet_index|
40
40
  to_sheet = to_workbook[sheet_index]
41
41
  if to_sheet
42
42
  from_table = from_sheet.table
@@ -46,7 +46,7 @@ module Workbook
46
46
  from_table.diff(to_table, options)
47
47
  end
48
48
  end
49
- return diff_template #the template has been filled in the meanwhile, not to use as a template anymore... :)
49
+ diff_template # the template has been filled in the meanwhile, not to use as a template anymore... :)
50
50
  end
51
51
  end
52
52
 
@@ -55,27 +55,27 @@ module Workbook
55
55
  # create an overview of the differences between itself with another 'previous' table, returns a book with a single sheet and table (containing the diffs)
56
56
  #
57
57
  # @return [Workbook::Table] the return result
58
- def diff other, options={}
59
- options = {:sort=>true,:ignore_headers=>false}.merge(options)
58
+ def diff other, options = {}
59
+ options = {sort: true, ignore_headers: false}.merge(options)
60
60
 
61
61
  aligned = align(other, options)
62
62
  aself = aligned[:self]
63
63
  aother = aligned[:other]
64
64
 
65
65
  iteration_cols = []
66
- if options[:ignore_headers]
67
- iteration_cols = [aother.first.count,aself.first.count].max.times.collect
66
+ iteration_cols = if options[:ignore_headers]
67
+ [aother.first.count, aself.first.count].max.times.collect
68
68
  else
69
- iteration_cols = (aother.header.to_symbols+aother.header.to_symbols).uniq
69
+ (aother.header.to_symbols + aother.header.to_symbols).uniq
70
70
  end
71
71
 
72
72
  diff_table = diff_template
73
- maxri = (aself.count-1)
73
+ maxri = (aself.count - 1)
74
74
 
75
- for ri in 0..maxri do
76
- row = diff_table[ri] = Workbook::Row.new(nil, diff_table)
77
- srow = aself[ri]
78
- orow = aother[ri]
75
+ (0..maxri).each do |ri|
76
+ row = diff_table.rows[ri] = Workbook::Row.new(nil, diff_table)
77
+ srow = aself.rows[ri]
78
+ orow = aother.rows[ri]
79
79
 
80
80
  iteration_cols.each_with_index do |ch, ci|
81
81
  scell = srow[ch]
@@ -83,38 +83,13 @@ module Workbook
83
83
  row[ci] = create_diff_cell(scell, ocell)
84
84
  end
85
85
  end
86
- if !options[:ignore_headers]
87
- diff_table[0].format = diff_template.template.create_or_find_format_by 'header'
86
+ unless options[:ignore_headers]
87
+ diff_table[0].format = diff_template.template.create_or_find_format_by "header"
88
88
  end
89
89
 
90
90
  diff_table
91
91
  end
92
92
 
93
- # creates a new cell describing the difference between two cells
94
- #
95
- # @return [Workbook::Cell] the diff cell
96
- def create_diff_cell(scell, ocell)
97
- dcell = scell.nil? ? Workbook::Cell.new(nil) : scell
98
- if (scell == ocell)
99
- dcell.format = scell.format if scell
100
- elsif scell.nil?
101
- dcell = Workbook::Cell.new "(was: #{ocell.to_s})"
102
- dcell.format = diff_template.template.create_or_find_format_by 'destroyed'
103
- elsif ocell.nil?
104
- dcell = scell.clone
105
- fmt = scell.nil? ? :default : scell.format[:number_format]
106
- f = diff_template.template.create_or_find_format_by 'created', fmt
107
- f[:number_format] = scell.format[:number_format]
108
- dcell.format = f
109
- elsif scell != ocell
110
- dcell = Workbook::Cell.new "#{scell.to_s} (was: #{ocell.to_s})"
111
- f = diff_template.template.create_or_find_format_by 'updated'
112
- dcell.format = f
113
- end
114
-
115
- dcell
116
- end
117
-
118
93
  # Return template table to write the diff result in; in case non exists a default is generated.
119
94
  #
120
95
  # @return [Workbook::Table] the empty table, linked to a book
@@ -131,71 +106,105 @@ module Workbook
131
106
  # @param [Workbook::Table] table to diff inside
132
107
  # @return [Workbook::Table] the passed table
133
108
  def diff_template= table
134
- @diff_template= table
109
+ @diff_template = table
135
110
  end
136
111
 
137
112
  # aligns itself with another table, used by diff
138
113
  #
139
114
  # @param [Workbook::Table] other table to align with
140
115
  # @param [Hash] options default to: `{:sort=>true,:ignore_headers=>false}`
141
- def align other, options={:sort=>true,:ignore_headers=>false}
142
-
143
- options = {:sort=>true,:ignore_headers=>false}.merge(options)
116
+ def align other, options = {}
117
+ options = {sort: true, ignore_headers: false}.merge(options)
144
118
 
145
119
  sother = other.clone.remove_empty_lines!
146
- sself = self.clone.remove_empty_lines!
120
+ sself = clone.remove_empty_lines!
147
121
 
148
122
  if options[:ignore_headers]
149
123
  sother.header = false
150
124
  sself.header = false
151
125
  end
152
126
 
153
- sother = options[:sort] ? Workbook::Table.new(sother.sort) : sother
154
- sself = options[:sort] ? Workbook::Table.new(sself.sort) : sself
127
+ sother = options[:sort] ? sother.sort : sother
128
+ sself = options[:sort] ? sself.sort : sself
155
129
 
156
130
  row_index = 0
157
- while row_index < [sother.count,sself.count].max and row_index < other.count+self.count do
131
+ while (row_index < [sother.count, sself.count].max) && (row_index < other.count + count)
158
132
  row_index = align_row(sself, sother, row_index)
159
133
  end
160
134
 
161
- {:self=>sself, :other=>sother}
135
+ {self: sself, other: sother}
162
136
  end
163
137
 
138
+ def sort
139
+ clone.sort!
140
+ end
141
+
142
+ def sort!
143
+ header_row = @rows.delete_at(header_row_index) if header
144
+ @rows = [header_row] + @rows.sort
145
+ self
146
+ end
147
+
148
+ private
149
+
164
150
  # for use in the align 'while' loop
165
151
  def align_row sself, sother, row_index
166
152
  asd = 0
167
- if sself[row_index] and sother[row_index]
168
- asd = sself[row_index].key <=> sother[row_index].key
169
- elsif sself[row_index]
153
+ if sself.rows[row_index] && sother.rows[row_index]
154
+ asd = sself.rows[row_index].key <=> sother.rows[row_index].key
155
+ elsif sself.rows[row_index]
170
156
  asd = -1
171
- elsif sother[row_index]
157
+ elsif sother.rows[row_index]
172
158
  asd = 1
173
159
  end
174
- if asd == -1 and insert_placeholder?(sother, sself, row_index)
175
- sother.insert row_index, placeholder_row
176
- row_index -=1
177
- elsif asd == 1 and insert_placeholder?(sother, sself, row_index)
178
- sself.insert row_index, placeholder_row
179
- row_index -=1
160
+ if (asd == -1) && insert_placeholder?(sother, sself, row_index)
161
+ sother.rows.insert row_index, placeholder_row
162
+ row_index -= 2
163
+ elsif (asd == 1) && insert_placeholder?(sother, sself, row_index)
164
+ sself.rows.insert row_index, placeholder_row
165
+ row_index -= 2
180
166
  end
181
167
 
182
- row_index += 1
168
+ row_index + 1
183
169
  end
184
170
 
185
171
  def insert_placeholder? sother, sself, row_index
186
- (sother[row_index].nil? or !sother[row_index].placeholder?) and
187
- (sself[row_index].nil? or !sself[row_index].placeholder?)
172
+ (sother.rows[row_index].nil? || !sother.rows[row_index].placeholder?) &&
173
+ (sself.rows[row_index].nil? || !sself.rows[row_index].placeholder?)
188
174
  end
189
175
 
190
176
  # returns a placeholder row, for internal use only
191
177
  def placeholder_row
192
- if defined?(@placeholder_row) and !@placeholder_row.nil?
193
- return @placeholder_row
194
- else
195
- @placeholder_row = Workbook::Row.new [nil]
196
- placeholder_row.placeholder = true
197
- return @placeholder_row
178
+ return @placeholder_row if defined?(@placeholder_row) && !@placeholder_row.nil?
179
+
180
+ @placeholder_row = Workbook::Row.new [nil]
181
+ @placeholder_row.placeholder = true
182
+ @placeholder_row
183
+ end
184
+
185
+ # creates a new cell describing the difference between two cells
186
+ #
187
+ # @return [Workbook::Cell] the diff cell
188
+ def create_diff_cell(scell, ocell)
189
+ dcell = scell.nil? ? Workbook::Cell.new(nil) : scell
190
+ if scell == ocell
191
+ dcell.format = scell.format if scell
192
+ elsif scell.nil?
193
+ dcell = Workbook::Cell.new "(was: #{ocell})"
194
+ dcell.format = diff_template.template.create_or_find_format_by "destroyed"
195
+ elsif ocell.nil?
196
+ dcell = scell.clone
197
+ fmt = scell.nil? ? :default : scell.format[:number_format]
198
+ f = diff_template.template.create_or_find_format_by "created", fmt
199
+ f[:number_format] = scell.format[:number_format]
200
+ dcell.format = f
201
+ elsif scell != ocell
202
+ dcell = Workbook::Cell.new "#{scell} (was: #{ocell})"
203
+ f = diff_template.template.create_or_find_format_by "updated"
204
+ dcell.format = f
198
205
  end
206
+
207
+ dcell
199
208
  end
200
209
  end
201
210
  end
@@ -1,16 +1,14 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
3
+
5
4
  module Workbook
6
5
  module Modules
7
6
  # Adds support for storing raw objects, used in e.g. Format and Template
8
7
  module RawObjectsStorage
9
-
10
8
  # A raw is a 'raw' object, representing a workbook, or cell, or whatever... in a particular format (defined by its class)
11
- def add_raw raw_object, options={}
12
- class_of_obj = options[:raw_object_class] ? options[:raw_object_class] : raw_object.class
13
- raws[class_of_obj]=raw_object
9
+ def add_raw raw_object, options = {}
10
+ class_of_obj = options[:raw_object_class] || raw_object.class
11
+ raws[class_of_obj] = raw_object
14
12
  end
15
13
 
16
14
  # Returns true if there is a template for a certain class, otherwise false
@@ -21,8 +19,8 @@ module Workbook
21
19
  # Returns raw data stored for a type of raw object (if available)
22
20
  # @param [Class] raw_object_class (e.g. Spreadsheet::Format for the Spreadsheet-gem)
23
21
  def return_raw_for raw_object_class
24
- raws.each { |tc,t| return t if tc == raw_object_class}
25
- return nil
22
+ raws.each { |tc, t| return t if tc == raw_object_class }
23
+ nil
26
24
  end
27
25
 
28
26
  # Remove all raw data references
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
3
+
5
4
  module Workbook
6
5
  module Modules
7
6
  # Adds type parsing capabilities to e.g. a Cell.
7
+ #
8
+ # Cell#string_parsers can be appended with symbols referencing the
8
9
  module TypeParser
9
-
10
10
  # Cleans a text file from all kinds of different ways of representing new lines
11
11
  # @param [String] csv_raw a raw csv string
12
12
  def strip_win_chars csv_raw
13
- csv_raw.gsub(/(\n\r|\r\n|\r)/,"\n")
13
+ csv_raw.gsub(/(\n\r|\r\n|\r)/, "\n")
14
14
  end
15
15
 
16
16
  # Return the different active string parsers
17
- # @return [Array<Symbol>] A list of parsers
17
+ # @return [Array<Symbol>] A list of parsers, defaults to [:string_cleaner, :string_integer_converter, :string_boolean_converter]
18
18
  def string_parsers
19
- @string_parsers ||= [:string_cleaner,:string_integer_converter,:string_boolean_converter]
19
+ @string_parsers ||= [:string_cleaner, :string_integer_converter, :string_boolean_converter]
20
20
  end
21
21
 
22
22
  # Set the list of string parsers
@@ -29,15 +29,17 @@ module Workbook
29
29
  # Return the different active string parsers
30
30
  # @return [Array<Proc>] A list of parsers as Procs
31
31
  def string_parsers_as_procs
32
- string_parsers.collect{|c| c.is_a?(Proc) ? c : self.send(c)}
32
+ string_parsers.collect { |c| c.is_a?(Proc) ? c : send(c) }
33
33
  end
34
34
 
35
35
  # Returns the parsed value (retrieved by calling #value)
36
36
  # @return [Object] The parsed object, ideally a date or integer when found to be a such...
37
- def parse options={}
38
- options = {:detect_date=>false, :convert_empty_to_nil=>true}.merge(options)
37
+ def parse options = {}
38
+ options = {detect_date: false, convert_empty_to_nil: true}.merge(options)
39
+
39
40
  string_parsers.push :string_optimistic_date_converter if options[:detect_date]
40
41
  string_parsers.push :string_nil_converter if options[:convert_empty_to_nil]
42
+
41
43
  v = value
42
44
  string_parsers_as_procs.each do |p|
43
45
  if v.is_a? String
@@ -47,27 +49,30 @@ module Workbook
47
49
  v
48
50
  end
49
51
 
50
- def parse! options={}
52
+ def parse! options = {}
51
53
  self.value = parse(options)
52
54
  end
53
55
 
54
- def clean! options={}
56
+ def clean! options = {}
55
57
  parse! options
56
58
  end
57
59
 
60
+ # @return [Proc] that does some cleaning in strings
58
61
  def string_cleaner
59
62
  proc do |v|
60
63
  v = v.strip
61
- v.gsub('mailto:','')
64
+ v.gsub("mailto:", "")
62
65
  end
63
66
  end
64
67
 
68
+ # @return [Proc] that returns nil for an empty string
65
69
  def string_nil_converter
66
70
  proc do |v|
67
71
  (v == "" ? nil : v)
68
72
  end
69
73
  end
70
74
 
75
+ # @return [Proc] that tries to distill an integer
71
76
  def string_integer_converter
72
77
  proc do |v|
73
78
  if v.to_i.to_s == v
@@ -78,19 +83,20 @@ module Workbook
78
83
  end
79
84
  end
80
85
 
86
+ # @return [Proc] that tries to distill a date from a string
81
87
  def string_optimistic_date_converter
82
88
  proc do |v|
83
89
  if v
84
90
  rv = v
85
- starts_with_nr = v.chars.first.to_i.to_s == v.chars.first #it should at least start with a number...
86
- no_spaced_dash = v.to_s.match(" - ") ? false : true
87
- min_two_dashes = v.to_s.scan("-").count > 1 ? true : false
88
- min_two_dashes = v.to_s.scan("/").count > 1 ? true : false if min_two_dashes == false
91
+ starts_with_nr = v[0].to_i.to_s == v[0] # it should at least start with a number...
92
+ no_spaced_dash = !v.to_s.match?(" - ")
93
+ min_two_dashes = v.to_s.scan("-").count > 1
94
+ min_two_dashes = v.to_s.scan("/").count > 1 if min_two_dashes == false
89
95
 
90
96
  normal_date_length = v.to_s.length <= 25
91
- if no_spaced_dash and starts_with_nr and normal_date_length and min_two_dashes
97
+ if no_spaced_dash && starts_with_nr && normal_date_length && min_two_dashes
92
98
  begin
93
- rv = (v.length > 10) ? DateTime.parse(v) : Date.parse(v)
99
+ rv = v.length > 10 ? DateTime.parse(v) : Date.parse(v)
94
100
  rescue ArgumentError
95
101
  rv = v
96
102
  end
@@ -104,14 +110,15 @@ module Workbook
104
110
  end
105
111
  end
106
112
 
113
+ # @return [Proc] that tries to distill a date from a string
107
114
  def string_american_date_converter
108
115
  proc do |v|
109
116
  if v
110
117
  rv = v
111
118
  # try strptime with format 'mm/dd/yyyy'
112
- if rv.is_a?(String) && /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}/ =~ v
119
+ if rv.is_a?(String) && /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/ =~ v
113
120
  begin
114
- rv = Date.strptime(v, "%m/%d/%Y")
121
+ rv = Date.strptime(v.tr("-", "/"), "%m/%d/%Y")
115
122
  rescue ArgumentError
116
123
  end
117
124
  end
@@ -120,13 +127,14 @@ module Workbook
120
127
  end
121
128
  end
122
129
 
130
+ # @return [Proc] that tries to distill a date from a string
123
131
  def string_non_american_date_converter
124
132
  proc do |v|
125
133
  rv = v
126
134
  # try strptime with format 'mm/dd/yyyy'
127
- if rv.is_a?(String) && /^\d{1,2}[\/\-\.]\d{1,2}[\/\-\.]\d{4}/ =~ v
135
+ if rv.is_a?(String) && /^\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{4}$/ =~ v
128
136
  begin
129
- rv = Date.strptime(v, "%m/%d/%Y")
137
+ rv = Date.strptime(v.gsub(/[-.]/, "/"), "%d/%m/%Y")
130
138
  rescue ArgumentError
131
139
  end
132
140
  end
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Workbook
4
-
5
4
  # Used in cases col or rowspans are used
6
5
  class NilValue
7
-
8
6
  # initialize this special nilvalue with a reason
9
7
  # @param [String] reason (currently only :covered, in case this cell is coverd because an adjecant cell spans over it)
10
8
  def initialize reason
11
- self.reason= reason
9
+ self.reason = reason
12
10
  end
13
11
 
14
12
  # returns the value of itself (nil)
@@ -17,13 +15,11 @@ module Workbook
17
15
  nil
18
16
  end
19
17
 
20
- def <=> v
21
- value <=> v
18
+ def <=> other
19
+ value <=> other
22
20
  end
23
21
 
24
- def reason
25
- @reason
26
- end
22
+ attr_reader :reason
27
23
 
28
24
  # set the reason why this value is nil
29
25
  def reason= reason
@@ -33,6 +29,5 @@ module Workbook
33
29
  raise "invalid reason given"
34
30
  end
35
31
  end
36
-
37
32
  end
38
33
  end
@@ -1,20 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # -*- encoding : utf-8 -*-
4
-
5
3
  module Workbook
6
4
  module Readers
7
5
  module CsvReader
8
- def load_csv text, options={}
6
+ def load_csv text, options = {}
9
7
  csv = text
10
8
  parse_csv csv, options
11
9
  end
12
10
 
13
11
  def csv_lib
14
- return CSV
12
+ CSV
15
13
  end
16
14
 
17
- def parse_csv csv_raw, options={}
15
+ def parse_csv csv_raw, options = {}
18
16
  optimistic_date_converter = Workbook::Cell.new.string_optimistic_date_converter
19
17
  options = {
20
18
  converters: [optimistic_date_converter, :all]
@@ -23,20 +21,19 @@ module Workbook
23
21
  csv = nil
24
22
 
25
23
  begin
26
- csv = CSV.parse(csv_raw, options)
24
+ csv = CSV.parse(csv_raw, **options)
27
25
  rescue CSV::MalformedCSVError
28
- csv_excel = CSV.parse(csv_raw,options.merge({:col_sep=>';'}))
26
+ csv_excel = CSV.parse(csv_raw, **options.merge({col_sep: ";"}))
29
27
  csv = csv_excel if csv_excel[0].count > 1
30
28
  end
31
29
 
32
- if csv==nil or csv[0].count == 1
33
- csv_excel = CSV.parse(csv_raw,options.merge({:col_sep=>';'}))
30
+ if csv.nil? || (csv[0].count == 1)
31
+ csv_excel = CSV.parse(csv_raw, **options.merge({col_sep: ";"}))
34
32
  csv = csv_excel if csv_excel[0].count > 1
35
33
  end
36
34
 
37
35
  self[0] = Workbook::Sheet.new(csv, self) unless sheet.has_contents?
38
36
  end
39
-
40
37
  end
41
38
  end
42
39
  end