dreader 1.1.0 → 1.1.2
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/CHANGELOG.org +13 -0
- data/README.org +23 -6
- data/examples/age_csv/Birthdays-TabSeparated.csv +13 -0
- data/examples/age_csv/Birthdays.csv +13 -0
- data/examples/age_csv/age.rb +55 -0
- data/examples/age_noext/Birthdays +0 -0
- data/examples/age_noext/Birthdays-xlsx +0 -0
- data/examples/age_noext/Birthdays-xlsx-with-wrong-extension.xls +0 -0
- data/examples/age_noext/age.rb +73 -0
- data/lib/dreader/engine.rb +24 -15
- data/lib/dreader/version.rb +1 -1
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d59887423bcb1658823534ca3d8a5505899cd70a5f8d23eda235159c590cf364
|
4
|
+
data.tar.gz: b17d71ed8d7db969fcc872a3f01cb6fdfbfaff69e0030ffc304ebc481a15675d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1407751e4baa35d4c6644cc9c9ebea7a8185febd2211e6b76c86a3001e8972d58061b6946a178dd007043c897a9943d41971e0868dab2e9e332350a5436bfff1
|
7
|
+
data.tar.gz: da163158d92a1618de0218f5285fe189f3ec5fe78b0d815c6b873574175c817ef4134725ff70a174b0206fb0da1770f9888044b076dbfc8e62b79f22e10930a6
|
data/CHANGELOG.org
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
#+TITLE: Changelog
|
2
2
|
|
3
|
+
* Version 1.1.2 - <2023-10-31 Tue>
|
4
|
+
** Fixes an issue with the :extension option
|
5
|
+
|
6
|
+
- Fixes a bug related to =:extension= and adds a working example, to test
|
7
|
+
the feature
|
8
|
+
- Changes the extension from a string to a symbol. No initial dot required
|
9
|
+
any longer
|
10
|
+
|
11
|
+
* Version 1.1.1 - <2023-10-16 Mon>
|
12
|
+
** Adds option :extension
|
13
|
+
|
14
|
+
- Adds options =extension= to the class options and to the =open_spreadsheet=
|
15
|
+
function, to be able to determine the type of a file with no extension
|
3
16
|
|
4
17
|
* Version 1.1.0
|
5
18
|
** Fixes an issue with visibility of variables
|
data/README.org
CHANGED
@@ -165,11 +165,13 @@ Require =dreader= and declare a class which extends =Dreader::Engine=:
|
|
165
165
|
end
|
166
166
|
#+END_EXAMPLE
|
167
167
|
|
168
|
-
|
168
|
+
Specify parsing option in the class, using the following syntax:
|
169
169
|
|
170
170
|
#+BEGIN_EXAMPLE ruby
|
171
171
|
options do
|
172
172
|
filename 'example.ods'
|
173
|
+
# this optional. Use it when the file does not have an extension
|
174
|
+
extension :ods
|
173
175
|
|
174
176
|
sheet 'Sheet 1'
|
175
177
|
|
@@ -185,10 +187,17 @@ In the class specify parsing option, using the following syntax:
|
|
185
187
|
|
186
188
|
where:
|
187
189
|
|
188
|
-
- (optional) =filename= is the file to read. If not specified, you will
|
189
|
-
|
190
|
-
|
191
|
-
|
190
|
+
- (optional) =filename= is the file to read. If not specified, you will have
|
191
|
+
to supply a filename when loading the file (see =read=, below). *Use
|
192
|
+
=.tsv= for tab-separated files.*
|
193
|
+
- (optional) =extension= overrides or specify the extension of =filename=.
|
194
|
+
Takes as input a symbol (e.g., =:xlsx=).
|
195
|
+
Notice that **value of this option is not appended to filename** (see =read=
|
196
|
+
below). Filename must thus be a valid reference to a file in the file
|
197
|
+
system. This option is useful in one of these two circumstances:
|
198
|
+
1. When =filename= has no extension
|
199
|
+
2. When you want to override the extension of the filename, e.g., to force
|
200
|
+
reading a "file.csv" as a tab separated file
|
192
201
|
- (optional) =first_row= is the first line to read (use =2= if your file
|
193
202
|
has a header)
|
194
203
|
- (optional) =last_row= is the last line to read. If not specified, we
|
@@ -451,9 +460,17 @@ A typical scenario works as follows:
|
|
451
460
|
|
452
461
|
#+BEGIN_EXAMPLE ruby
|
453
462
|
i = Reader
|
463
|
+
|
464
|
+
# read uses the options if defined and takes the same arguments as options
|
465
|
+
# examples:
|
466
|
+
# i.read
|
467
|
+
# i.read filename: "example.ods"
|
468
|
+
# i.read filename: "example.ods", extension: :ods
|
469
|
+
# i.read filename: "example", extension: :ods
|
470
|
+
# (the line above opens the file "example" as an Open Document Spreasdheet)
|
454
471
|
i.read
|
455
472
|
|
456
|
-
#
|
473
|
+
# alternately
|
457
474
|
Reader.read
|
458
475
|
#+END_EXAMPLE
|
459
476
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Name Date of birth
|
2
|
+
Forest Whitaker July 15, 1961
|
3
|
+
Daniel Day-Lewis April 29, 1957
|
4
|
+
Sean Penn August 17, 1960
|
5
|
+
Jeff Bridges December 4, 1949
|
6
|
+
Colin Firth September 10, 1960
|
7
|
+
Jean Dujardin June 19, 1972
|
8
|
+
Daniel Day-Lewis April 29, 1957
|
9
|
+
Matthew McConaughey November 4, 1969
|
10
|
+
Eddie Redmayne January 6, 1982
|
11
|
+
Leonardo DiCaprio November 11, 1974
|
12
|
+
Casey Affleck August 12, 1975
|
13
|
+
Gary Oldman March 21, 1958
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Name,Date of birth
|
2
|
+
Forest Whitaker,"July 15, 1961"
|
3
|
+
Daniel Day-Lewis,"April 29, 1957"
|
4
|
+
Sean Penn,"August 17, 1960"
|
5
|
+
Jeff Bridges,"December 4, 1949"
|
6
|
+
Colin Firth,"September 10, 1960"
|
7
|
+
Jean Dujardin,"June 19, 1972"
|
8
|
+
Daniel Day-Lewis,"April 29, 1957"
|
9
|
+
Matthew McConaughey,"November 4, 1969"
|
10
|
+
Eddie Redmayne,"January 6, 1982"
|
11
|
+
Leonardo DiCaprio,"November 11, 1974"
|
12
|
+
Casey Affleck,"August 12, 1975"
|
13
|
+
Gary Oldman,"March 21, 1958"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "dreader"
|
2
|
+
|
3
|
+
class Reader
|
4
|
+
extend Dreader::Engine
|
5
|
+
|
6
|
+
options do
|
7
|
+
first_row 2
|
8
|
+
debug true
|
9
|
+
end
|
10
|
+
|
11
|
+
column :name do
|
12
|
+
doc "A is the name string"
|
13
|
+
colref 'A'
|
14
|
+
end
|
15
|
+
|
16
|
+
column :birthdate do
|
17
|
+
doc "Birthdate contains a full date (i.e., including the year)"
|
18
|
+
colref 'B'
|
19
|
+
|
20
|
+
process do |c|
|
21
|
+
Date.parse(c)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
virtual_column :age do
|
26
|
+
process do |row|
|
27
|
+
birthdate = row[:birthdate][:value]
|
28
|
+
birthday = Date.new(Date.today.year, birthdate.month, birthdate.day)
|
29
|
+
today = Date.today
|
30
|
+
|
31
|
+
[0, today.year - birthdate.year - (birthday < today ? 1 : 0)].max
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
mapping do |row|
|
36
|
+
r = Dreader::Util.simplify(row)
|
37
|
+
puts "#{r[:name]} is #{r[:age]} years old (born on #{r[:birthdate]})"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
i = Reader
|
42
|
+
i.read filename: "Birthdays.csv", mapping: true
|
43
|
+
|
44
|
+
i.read filename: "Birthdays-TabSeparated.csv", extension: :tsv, mapping: true
|
45
|
+
|
46
|
+
#
|
47
|
+
# Here we can do further processing on the data
|
48
|
+
#
|
49
|
+
File.open("ages.txt", "w") do |file|
|
50
|
+
i.table.each do |row|
|
51
|
+
unless row[:row_errors].any?
|
52
|
+
file.puts "#{row[:name][:value]} #{row[:age][:value]}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "dreader"
|
2
|
+
|
3
|
+
class Reader
|
4
|
+
extend Dreader::Engine
|
5
|
+
|
6
|
+
options do
|
7
|
+
first_row 2
|
8
|
+
debug true
|
9
|
+
extension :ods
|
10
|
+
end
|
11
|
+
|
12
|
+
column :name do
|
13
|
+
doc "A is the name string"
|
14
|
+
colref 'A'
|
15
|
+
end
|
16
|
+
|
17
|
+
column :birthdate do
|
18
|
+
doc "Birthdate contains a full date (i.e., including the year)"
|
19
|
+
colref 'B'
|
20
|
+
|
21
|
+
process do |c|
|
22
|
+
Date.parse(c)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
virtual_column :age do
|
27
|
+
process do |row|
|
28
|
+
birthdate = row[:birthdate][:value]
|
29
|
+
birthday = Date.new(Date.today.year, birthdate.month, birthdate.day)
|
30
|
+
today = Date.today
|
31
|
+
|
32
|
+
[0, today.year - birthdate.year - (birthday < today ? 1 : 0)].max
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
mapping do |row|
|
37
|
+
r = Dreader::Util.simplify(row)
|
38
|
+
puts "#{r[:name]} is #{r[:age]} years old (born on #{r[:birthdate]})"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts
|
43
|
+
puts "*****************************************************************"
|
44
|
+
puts "Reading ODS with no extension, using extension set in the options"
|
45
|
+
puts "*****************************************************************"
|
46
|
+
puts
|
47
|
+
|
48
|
+
i = Reader
|
49
|
+
i.read filename: "Birthdays"
|
50
|
+
i.virtual_columns
|
51
|
+
i.mappings
|
52
|
+
|
53
|
+
puts
|
54
|
+
puts "*****************************************************************"
|
55
|
+
puts "Reading XLSX with wrong extension, overriding existing extension"
|
56
|
+
puts "*****************************************************************"
|
57
|
+
puts
|
58
|
+
|
59
|
+
i = Reader
|
60
|
+
i.read filename: "Birthdays-xlsx-with-wrong-extension.xls", extension: :xlsx
|
61
|
+
i.virtual_columns
|
62
|
+
i.mappings
|
63
|
+
|
64
|
+
puts
|
65
|
+
puts "*****************************************************************"
|
66
|
+
puts "Reading XLSX with no extension"
|
67
|
+
puts "*****************************************************************"
|
68
|
+
puts
|
69
|
+
|
70
|
+
i = Reader
|
71
|
+
i.read filename: "Birthdays-xlsx", extension: :xlsx
|
72
|
+
i.virtual_columns
|
73
|
+
i.mappings
|
data/lib/dreader/engine.rb
CHANGED
@@ -150,7 +150,7 @@ module Dreader
|
|
150
150
|
raise Exception
|
151
151
|
end
|
152
152
|
|
153
|
-
spreadsheet = open_spreadsheet
|
153
|
+
spreadsheet = open_spreadsheet(options)
|
154
154
|
sheet = spreadsheet.sheet(options[:sheet] || 0)
|
155
155
|
first_row = options[:first_row] || 1
|
156
156
|
last_row = options[:last_row] || sheet.last_row
|
@@ -324,7 +324,7 @@ module Dreader
|
|
324
324
|
def compare_headers(hash = {})
|
325
325
|
options = @declared_options.merge(hash)
|
326
326
|
|
327
|
-
spreadsheet = open_spreadsheet(options
|
327
|
+
spreadsheet = open_spreadsheet(options)
|
328
328
|
sheet = spreadsheet.sheet(options[:sheet] || 0)
|
329
329
|
header_row_number = options[:first_row] - 1 || 1
|
330
330
|
|
@@ -398,27 +398,36 @@ module Dreader
|
|
398
398
|
# list of keys we support in options. We remove them when reading
|
399
399
|
# the CSV file
|
400
400
|
OPTION_KEYS = %i[
|
401
|
-
filename sheet first_row last_row
|
401
|
+
filename extension sheet first_row last_row
|
402
|
+
logger logger_level
|
403
|
+
debug
|
402
404
|
]
|
403
405
|
|
404
|
-
def open_spreadsheet(
|
405
|
-
|
406
|
+
def open_spreadsheet(options)
|
407
|
+
filename = options[:filename]
|
408
|
+
# use the extension option or make ".CSV" into :csv
|
409
|
+
extension = options[:extension] || File.extname(filename).downcase[1..-1]&.to_sym
|
406
410
|
|
407
|
-
|
408
|
-
|
411
|
+
|
412
|
+
# TODO: MAKE DEBUG AND LOGGER INTO REAL CLASS VARIABLES OR MAKE LOCAL AND/OR FUNCTIONS
|
413
|
+
@debug = @declared_options.merge(options)[:debug] == true
|
414
|
+
if @debug
|
415
|
+
@logger = options[:logger] || Logger.new($stdout)
|
416
|
+
@logger.debug "[dreader open_spreadsheet] filename: #{filename}"
|
417
|
+
@logger.debug "[dreader open_spreadsheet] extension: #{extension}"
|
418
|
+
end
|
419
|
+
|
420
|
+
case extension
|
421
|
+
when :csv
|
409
422
|
csv_options = @declared_options.except(*OPTION_KEYS)
|
410
423
|
Roo::CSV.new(filename, csv_options:)
|
411
|
-
when
|
424
|
+
when :tsv
|
412
425
|
csv_options = @declared_options.except(*OPTION_KEYS).merge({ col_sep: "\t" })
|
413
426
|
Roo::CSV.new(filename, csv_options:)
|
414
|
-
when
|
415
|
-
Roo::
|
416
|
-
when ".xls"
|
417
|
-
Roo::Excel.new(filename)
|
418
|
-
when ".xlsx"
|
419
|
-
Roo::Excelx.new(filename)
|
427
|
+
when :ods, :xls, :xlsx
|
428
|
+
Roo::Spreadsheet.open(filename, extension:)
|
420
429
|
else
|
421
|
-
raise "Unknown extension: #{ext}"
|
430
|
+
raise "Unknown extension: #{ext}. Use the :extension option."
|
422
431
|
end
|
423
432
|
end
|
424
433
|
|
data/lib/dreader/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dreader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adolfo Villafiorita
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roo
|
@@ -108,6 +108,13 @@ files:
|
|
108
108
|
- dreader.gemspec
|
109
109
|
- examples/age/Birthdays.ods
|
110
110
|
- examples/age/age.rb
|
111
|
+
- examples/age_csv/Birthdays-TabSeparated.csv
|
112
|
+
- examples/age_csv/Birthdays.csv
|
113
|
+
- examples/age_csv/age.rb
|
114
|
+
- examples/age_noext/Birthdays
|
115
|
+
- examples/age_noext/Birthdays-xlsx
|
116
|
+
- examples/age_noext/Birthdays-xlsx-with-wrong-extension.xls
|
117
|
+
- examples/age_noext/age.rb
|
111
118
|
- examples/age_with_multiple_checks/Birthdays.ods
|
112
119
|
- examples/age_with_multiple_checks/age_with_multiple_checks.rb
|
113
120
|
- examples/local_vars/local_vars.rb
|
@@ -142,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
149
|
- !ruby/object:Gem::Version
|
143
150
|
version: '0'
|
144
151
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
152
|
+
rubygems_version: 3.4.10
|
146
153
|
signing_key:
|
147
154
|
specification_version: 4
|
148
155
|
summary: Process and import data from cvs and spreadsheets
|