dreader 1.1.0 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|