textutils 0.8.2 → 0.8.3
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.
- data/lib/textutils/reader/values_reader.rb +29 -5
- data/lib/textutils/version.rb +1 -1
- data/test/test_values_reader.rb +62 -5
- metadata +8 -8
|
@@ -43,7 +43,7 @@ class ValuesReaderV2
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
## fix: move Prop table to props gem - why? why not??
|
|
46
|
-
WorldDb::
|
|
46
|
+
WorldDb::Model::Prop.create_from_fixture!( name, path )
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
end # class ValuesReaderV2
|
|
@@ -59,7 +59,7 @@ class ValuesReader
|
|
|
59
59
|
|
|
60
60
|
def initialize( path, more_attribs={} )
|
|
61
61
|
@more_attribs = more_attribs
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
### workaround/hack
|
|
64
64
|
# if path includes newline assume it's a string buffer not a file name
|
|
65
65
|
# fix: use from_file an from_string etc. for ctor
|
|
@@ -89,6 +89,16 @@ class ValuesReader
|
|
|
89
89
|
blank_counter = 0 # count of number of blank lines (note: 1+ blank lines clear multi-line record)
|
|
90
90
|
values = []
|
|
91
91
|
|
|
92
|
+
# keep track of last header
|
|
93
|
+
# e.g. lines like
|
|
94
|
+
# ___________________________________
|
|
95
|
+
# - Brauerei Schwechat (Brau Union)
|
|
96
|
+
#
|
|
97
|
+
# laster_header will be 'Brauerei Schwechat (Brau Union)'
|
|
98
|
+
# gets passed along as an attribue e.g. more_attribs[:header]='Brauerei Schwechat (Brau Union)'
|
|
99
|
+
last_header = nil
|
|
100
|
+
|
|
101
|
+
|
|
92
102
|
@data.each_line do |line|
|
|
93
103
|
|
|
94
104
|
## allow alternative comment lines
|
|
@@ -126,8 +136,20 @@ class ValuesReader
|
|
|
126
136
|
line = line.strip
|
|
127
137
|
|
|
128
138
|
|
|
129
|
-
if line =~ /^-\s
|
|
130
|
-
|
|
139
|
+
if line =~ /^-\s+/ # check for group headers e.g. - St. James Brewery
|
|
140
|
+
if values.length > 0 # check if we already processed a record? if yes; yield last record (before reset)
|
|
141
|
+
attribs, more_values = find_key_n_title( values )
|
|
142
|
+
attribs = attribs.merge( @more_attribs ) # e.g. merge country_id and other defaults if present
|
|
143
|
+
attribs[:header] = last_header unless last_header.nil? # add optional header attrib
|
|
144
|
+
yield( attribs, more_values )
|
|
145
|
+
values = []
|
|
146
|
+
end
|
|
147
|
+
inside_record = false
|
|
148
|
+
blank_counter = 0
|
|
149
|
+
|
|
150
|
+
# update last_header
|
|
151
|
+
last_header = line.gsub( /^-\s/, '' ) # cut-off leading marker and space
|
|
152
|
+
logger.info " update group header >#{last_header}<"
|
|
131
153
|
next
|
|
132
154
|
elsif line =~ /^\[([a-z][a-z]+)\]/
|
|
133
155
|
### check for multiline record
|
|
@@ -137,10 +159,10 @@ class ValuesReader
|
|
|
137
159
|
if values.length > 0 # check if we already processed a record? if yes; yield last record (before reset)
|
|
138
160
|
attribs, more_values = find_key_n_title( values )
|
|
139
161
|
attribs = attribs.merge( @more_attribs ) # e.g. merge country_id and other defaults if present
|
|
162
|
+
attribs[:header] = last_header unless last_header.nil? # add optional header attrib
|
|
140
163
|
yield( attribs, more_values )
|
|
141
164
|
values = []
|
|
142
165
|
end
|
|
143
|
-
|
|
144
166
|
inside_record = true
|
|
145
167
|
blank_counter = 0
|
|
146
168
|
|
|
@@ -160,6 +182,7 @@ class ValuesReader
|
|
|
160
182
|
if values.length > 0
|
|
161
183
|
attribs, more_values = find_key_n_title( values )
|
|
162
184
|
attribs = attribs.merge( @more_attribs ) # e.g. merge country_id and other defaults if present
|
|
185
|
+
attribs[:header] = last_header unless last_header.nil? # add optional header attrib
|
|
163
186
|
yield( attribs, more_values )
|
|
164
187
|
values = []
|
|
165
188
|
end
|
|
@@ -175,6 +198,7 @@ class ValuesReader
|
|
|
175
198
|
if values.length > 0
|
|
176
199
|
attribs, more_values = find_key_n_title( values )
|
|
177
200
|
attribs = attribs.merge( @more_attribs ) # e.g. merge country_id and other defaults if present
|
|
201
|
+
attribs[:header] = last_header unless last_header.nil? # add optional header attrib
|
|
178
202
|
yield( attribs, more_values )
|
|
179
203
|
end
|
|
180
204
|
|
data/lib/textutils/version.rb
CHANGED
data/test/test_values_reader.rb
CHANGED
|
@@ -10,6 +10,63 @@ require 'helper'
|
|
|
10
10
|
|
|
11
11
|
class TestValuesReader < MiniTest::Unit::TestCase
|
|
12
12
|
|
|
13
|
+
def test_header
|
|
14
|
+
txt =<<EOS
|
|
15
|
+
|
|
16
|
+
Wieselburger Gold, 5.0%, 11.8°
|
|
17
|
+
____________________________________________
|
|
18
|
+
- Zwettler Brauerei|Privatbrauerei Zwettl
|
|
19
|
+
|
|
20
|
+
Zwettler Original, 5.1 %, 11.9°
|
|
21
|
+
Zwettler Export Lager, 5.0 %, 11.8°
|
|
22
|
+
|
|
23
|
+
______________________________________
|
|
24
|
+
- Brauerei Schwechat (Brau Union)
|
|
25
|
+
|
|
26
|
+
Schwechater, 5.0%, 11.5°, 41.0 kcal/100ml
|
|
27
|
+
Schwechater Zwickl, 5.4%, 12.5°, 45.0 kcal/100ml
|
|
28
|
+
|
|
29
|
+
EOS
|
|
30
|
+
|
|
31
|
+
reader = ValuesReader.new( txt )
|
|
32
|
+
|
|
33
|
+
i = 0
|
|
34
|
+
reader.each_line do |attribs, values|
|
|
35
|
+
i += 1
|
|
36
|
+
|
|
37
|
+
puts "attribs:"
|
|
38
|
+
pp attribs
|
|
39
|
+
puts "values:"
|
|
40
|
+
pp values
|
|
41
|
+
|
|
42
|
+
if i == 1
|
|
43
|
+
assert_equal attribs[:header], nil
|
|
44
|
+
assert_equal attribs[:key], 'wieselburgergold'
|
|
45
|
+
assert_equal attribs[:title], 'Wieselburger Gold'
|
|
46
|
+
elsif i == 2
|
|
47
|
+
assert_equal attribs[:header], 'Zwettler Brauerei|Privatbrauerei Zwettl'
|
|
48
|
+
assert_equal attribs[:key], 'zwettleroriginal'
|
|
49
|
+
assert_equal attribs[:title], 'Zwettler Original'
|
|
50
|
+
elsif i == 3
|
|
51
|
+
assert_equal attribs[:header], 'Zwettler Brauerei|Privatbrauerei Zwettl'
|
|
52
|
+
assert_equal attribs[:key], 'zwettlerexportlager'
|
|
53
|
+
assert_equal attribs[:title], 'Zwettler Export Lager'
|
|
54
|
+
elsif i == 4
|
|
55
|
+
assert_equal attribs[:header], 'Brauerei Schwechat (Brau Union)'
|
|
56
|
+
assert_equal attribs[:key], 'schwechater'
|
|
57
|
+
assert_equal attribs[:title], 'Schwechater'
|
|
58
|
+
elsif i == 5
|
|
59
|
+
assert_equal attribs[:header], 'Brauerei Schwechat (Brau Union)'
|
|
60
|
+
assert_equal attribs[:key], 'schwechaterzwickl'
|
|
61
|
+
assert_equal attribs[:title], 'Schwechater Zwickl'
|
|
62
|
+
else
|
|
63
|
+
assert false # should not get here
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end # test_header
|
|
68
|
+
|
|
69
|
+
|
|
13
70
|
def test_escape_comma
|
|
14
71
|
# note: double espace comma e.g. \\, becomes literal \,
|
|
15
72
|
txt =<<EOS
|
|
@@ -52,7 +109,7 @@ EOS
|
|
|
52
109
|
assert_equal values[0], '1845'
|
|
53
110
|
assert_equal values[1], 'The Griffin Brewery // Chiswick Lane South // London, W4 2QB'
|
|
54
111
|
else
|
|
55
|
-
|
|
112
|
+
assert false # should not get here
|
|
56
113
|
end
|
|
57
114
|
end
|
|
58
115
|
end # test_escape_comma
|
|
@@ -150,7 +207,7 @@ EOS
|
|
|
150
207
|
assert_equal values[1], 'www.egger-bier.at'
|
|
151
208
|
assert_equal values[2], '3105 Unterradlberg // Tiroler Straße 18'
|
|
152
209
|
else
|
|
153
|
-
|
|
210
|
+
assert false # should not get here
|
|
154
211
|
end
|
|
155
212
|
end
|
|
156
213
|
end # test_mixed
|
|
@@ -212,7 +269,7 @@ EOS
|
|
|
212
269
|
assert_equal values[2], '3910 Zwettl // Syrnauer Straße 22-25'
|
|
213
270
|
assert_equal values[3], 'brands: Zwettler'
|
|
214
271
|
else
|
|
215
|
-
|
|
272
|
+
assert false # should not get here
|
|
216
273
|
end
|
|
217
274
|
end
|
|
218
275
|
end # test_multi_line_records
|
|
@@ -247,7 +304,7 @@ EOS
|
|
|
247
304
|
elsif i == 2
|
|
248
305
|
elsif i == 3
|
|
249
306
|
else
|
|
250
|
-
|
|
307
|
+
assert false # should not get here
|
|
251
308
|
end
|
|
252
309
|
end
|
|
253
310
|
end # test_classic_csv_records
|
|
@@ -302,7 +359,7 @@ EOS
|
|
|
302
359
|
assert_equal values[1], '11.8°'
|
|
303
360
|
assert_equal values[-1], 'bio'
|
|
304
361
|
else
|
|
305
|
-
|
|
362
|
+
assert false # should not get here
|
|
306
363
|
end
|
|
307
364
|
end
|
|
308
365
|
end # test_autogen_keys
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: textutils
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
4
|
+
version: 0.8.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-01-
|
|
12
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: logutils
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &21298812 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ~>
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: '0.5'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *21298812
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: rdoc
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &21298416 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ~>
|
|
@@ -32,10 +32,10 @@ dependencies:
|
|
|
32
32
|
version: '4.0'
|
|
33
33
|
type: :development
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *21298416
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: hoe
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &21297996 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ~>
|
|
@@ -43,7 +43,7 @@ dependencies:
|
|
|
43
43
|
version: '3.7'
|
|
44
44
|
type: :development
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *21297996
|
|
47
47
|
description: textutils - Text Filters, Helpers, Readers and More
|
|
48
48
|
email: ruby-talk@ruby-lang.org
|
|
49
49
|
executables: []
|