atv 1.0.0 → 1.0.1
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/atv.gemspec +1 -1
- data/lib/atv.rb +7 -4
- data/lib/atv/version.rb +1 -1
- data/test/atv_test.rb +142 -29
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3ddffe7d3ab226d5c2b6e5a82e6b2a2f174c0313dba16e63c1df29548d3f5e4
|
4
|
+
data.tar.gz: e1026661b09ad6c27088cffbb0ed9ad6804498502b0e11f907df673c066df002
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abeca3e13187543d8b97a3c671673113968239b0b093a61eb4a2a4649d1d481ccd1bcdc3ee061e8f5b1faf5937147ab77bd9b1d100f1f69d9740fa9a373320a8
|
7
|
+
data.tar.gz: fd4d95942343225917209524263a7fc4385cc786e217037072b08077f6e13f8dd3974e3d73f688fedca2fb2015b5bba87da61b3a3bfd08efeabad53801a15873
|
data/atv.gemspec
CHANGED
data/lib/atv.rb
CHANGED
@@ -11,6 +11,9 @@ class ATV
|
|
11
11
|
'' => nil
|
12
12
|
}
|
13
13
|
|
14
|
+
SEPARATOR_LINE_RE = /^\s*\|\-/
|
15
|
+
COMMENT_LINE_RE = /^\s*#/
|
16
|
+
|
14
17
|
attr_reader :headers
|
15
18
|
|
16
19
|
def initialize(io)
|
@@ -25,9 +28,8 @@ class ATV
|
|
25
28
|
def each
|
26
29
|
line_data = []
|
27
30
|
@io.each_line do |line|
|
28
|
-
next if line =~
|
29
|
-
line
|
30
|
-
if (!@has_separators && !line_data.empty?) || line =~ /^\|\-/
|
31
|
+
next if line =~ COMMENT_LINE_RE
|
32
|
+
if (!@has_separators && !line_data.empty?) || line =~ SEPARATOR_LINE_RE
|
31
33
|
folded_items = line_data.transpose.map { |tokens| tokens.join(' ').rstrip }
|
32
34
|
converted_folded_items = folded_items.map { |token| SUBSTITUTIONS.has_key?(token) ? SUBSTITUTIONS[token] : token }
|
33
35
|
csv_row = CSV::Row.new(@headers, converted_folded_items)
|
@@ -46,6 +48,7 @@ class ATV
|
|
46
48
|
protected
|
47
49
|
|
48
50
|
def split_table_line(line)
|
51
|
+
line.strip!
|
49
52
|
return [] if line.empty?
|
50
53
|
line[1..-1].split('|').map(&:strip)
|
51
54
|
end
|
@@ -56,7 +59,7 @@ class ATV
|
|
56
59
|
@io.readline
|
57
60
|
separator_count = 0
|
58
61
|
@io.each_line do |line|
|
59
|
-
if line =~
|
62
|
+
if line =~ SEPARATOR_LINE_RE
|
60
63
|
separator_count += 1
|
61
64
|
return true if separator_count > 1
|
62
65
|
end
|
data/lib/atv/version.rb
CHANGED
data/test/atv_test.rb
CHANGED
@@ -3,8 +3,9 @@ require_relative '../lib/atv'
|
|
3
3
|
|
4
4
|
describe ATV do
|
5
5
|
describe 'with separators' do
|
6
|
-
|
7
|
-
|
6
|
+
describe '#each' do
|
7
|
+
it 'with a block it yields rows of data as CSV rows and ignores commented lines' do
|
8
|
+
data_as_table = <<-TEXT
|
8
9
|
|-----------+--------------------+--------------|
|
9
10
|
| name | dob | predictable? |
|
10
11
|
|-----------+--------------------+--------------|
|
@@ -22,59 +23,133 @@ describe ATV do
|
|
22
23
|
| Derrial | null | true |
|
23
24
|
| Book | | |
|
24
25
|
|-----------+--------------------+--------------|
|
25
|
-
|
26
|
-
|
26
|
+
TEXT
|
27
|
+
|
28
|
+
expected = [
|
27
29
|
['Malcolm Reynolds', 'September 20, 2468', false],
|
28
30
|
['Zoe Washburne', 'February 15, 2484', nil],
|
29
31
|
['Jane', nil, true],
|
30
32
|
['Derrial Book', nil, true]
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#each' do
|
35
|
-
before do
|
36
|
-
@atv = ATV.new(StringIO.new(@data_as_table))
|
37
|
-
end
|
33
|
+
]
|
38
34
|
|
39
|
-
it 'with a block it yields rows of data as CSV rows and ignores commented lines' do
|
40
35
|
i = 0
|
41
36
|
|
42
|
-
|
43
|
-
row.fields.must_equal(
|
44
|
-
row[0].must_equal(
|
45
|
-
row['name'].must_equal(
|
46
|
-
row[1].must_equal(
|
47
|
-
row['dob'].must_equal(
|
48
|
-
row[2].must_equal(
|
49
|
-
row['predictable?'].must_equal(
|
37
|
+
ATV.new(StringIO.new(data_as_table)).each do |row|
|
38
|
+
row.fields.must_equal(expected[i])
|
39
|
+
row[0].must_equal(expected[i][0])
|
40
|
+
row['name'].must_equal(expected[i][0])
|
41
|
+
row[1].must_equal(expected[i][1])
|
42
|
+
row['dob'].must_equal(expected[i][1])
|
43
|
+
row[2].must_equal(expected[i][2])
|
44
|
+
row['predictable?'].must_equal(expected[i][2])
|
50
45
|
i += 1
|
51
46
|
end
|
52
47
|
i.must_equal(4)
|
53
48
|
end
|
54
49
|
|
55
50
|
it 'without a block it returns an enumerator of data as CSV rows' do
|
56
|
-
|
57
|
-
|
51
|
+
data_as_table = <<-TEXT
|
52
|
+
|-----------+--------------------+--------------|
|
53
|
+
| name | dob | predictable? |
|
54
|
+
|-----------+--------------------+--------------|
|
55
|
+
| Malcolm | September 20, 2468 | false |
|
56
|
+
| Reynolds | | |
|
57
|
+
|-----------+--------------------+--------------|
|
58
|
+
| Zoe | February 15, 2484 | |
|
59
|
+
| Washburne | | |
|
60
|
+
|-----------+--------------------+--------------|
|
61
|
+
TEXT
|
62
|
+
|
63
|
+
expected = [
|
64
|
+
['Malcolm Reynolds', 'September 20, 2468', false],
|
65
|
+
['Zoe Washburne', 'February 15, 2484', nil],
|
66
|
+
]
|
67
|
+
|
68
|
+
atv = ATV.new(StringIO.new(data_as_table))
|
69
|
+
enum = atv.enum_for
|
70
|
+
enum.map(&:fields).must_equal(expected)
|
58
71
|
end
|
59
72
|
end
|
60
73
|
|
61
74
|
describe "#headers" do
|
62
75
|
it 'returns all the headers' do
|
63
|
-
|
76
|
+
data_as_table = <<-TEXT
|
77
|
+
|-----------+--------------------+--------------|
|
78
|
+
| name | dob | predictable? |
|
79
|
+
|-----------+--------------------+--------------|
|
80
|
+
| Malcolm | September 20, 2468 | false |
|
81
|
+
| Reynolds | | |
|
82
|
+
|-----------+--------------------+--------------|
|
83
|
+
| Zoe | February 15, 2484 | |
|
84
|
+
| Washburne | | |
|
85
|
+
|-----------+--------------------+--------------|
|
86
|
+
TEXT
|
87
|
+
ATV.new(StringIO.new(data_as_table)).headers.must_equal(%w|name dob predictable?|)
|
64
88
|
end
|
65
89
|
end
|
66
90
|
|
67
91
|
describe ".from_string(string)" do
|
68
92
|
it 'initializes ATV with an IO object' do
|
93
|
+
data_as_table = <<-TEXT
|
94
|
+
|-----------+--------------------+--------------|
|
95
|
+
| name | dob | predictable? |
|
96
|
+
|-----------+--------------------+--------------|
|
97
|
+
| Malcolm | September 20, 2468 | false |
|
98
|
+
| Reynolds | | |
|
99
|
+
|-----------+--------------------+--------------|
|
100
|
+
| Zoe | February 15, 2484 | |
|
101
|
+
| Washburne | | |
|
102
|
+
|-----------+--------------------+--------------|
|
103
|
+
TEXT
|
104
|
+
|
69
105
|
fussy = -> (io) { io.must_be_kind_of StringIO }
|
70
106
|
|
71
107
|
ATV.stub :new, fussy do
|
72
|
-
ATV.from_string(
|
108
|
+
ATV.from_string(data_as_table)
|
73
109
|
end
|
74
110
|
end
|
75
111
|
end
|
76
112
|
end
|
77
113
|
|
114
|
+
describe 'with separators, indented' do
|
115
|
+
describe '#each' do
|
116
|
+
it 'with a block it yields rows of data as CSV rows' do
|
117
|
+
data_as_table = <<TEXT
|
118
|
+
|-----------+--------------------+--------------|
|
119
|
+
| name | dob | predictable? |
|
120
|
+
|-----------+--------------------+--------------|
|
121
|
+
| Malcolm | September 20, 2468 | false |
|
122
|
+
| Reynolds | | |
|
123
|
+
|-----------+--------------------+--------------|
|
124
|
+
| Zoe | February 15, 2484 | |
|
125
|
+
| Washburne | | |
|
126
|
+
|-----------+--------------------+--------------|
|
127
|
+
TEXT
|
128
|
+
|
129
|
+
expected = [
|
130
|
+
['Malcolm Reynolds', 'September 20, 2468', false],
|
131
|
+
['Zoe Washburne', 'February 15, 2484', nil],
|
132
|
+
]
|
133
|
+
|
134
|
+
atv = ATV.new(StringIO.new(data_as_table))
|
135
|
+
|
136
|
+
i = 0
|
137
|
+
|
138
|
+
atv.each do |row|
|
139
|
+
row.fields.must_equal(expected[i])
|
140
|
+
row[0].must_equal(expected[i][0])
|
141
|
+
row['name'].must_equal(expected[i][0])
|
142
|
+
row[1].must_equal(expected[i][1])
|
143
|
+
row['dob'].must_equal(expected[i][1])
|
144
|
+
row[2].must_equal(expected[i][2])
|
145
|
+
row['predictable?'].must_equal(expected[i][2])
|
146
|
+
i += 1
|
147
|
+
end
|
148
|
+
i.must_equal(2)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
78
153
|
describe 'without separators' do
|
79
154
|
describe '#each' do
|
80
155
|
it 'with a block it yields rows of data as CSV rows' do
|
@@ -89,15 +164,53 @@ describe ATV do
|
|
89
164
|
TEXT
|
90
165
|
|
91
166
|
expected = [
|
92
|
-
|
93
|
-
|
94
|
-
|
167
|
+
['Malcolm', 'September 20, 2468', false],
|
168
|
+
['Zoe', 'February 15, 2484', nil],
|
169
|
+
['Derrial', nil, true]
|
170
|
+
]
|
171
|
+
|
172
|
+
atv = ATV.new(StringIO.new(data_as_table))
|
173
|
+
|
174
|
+
i = 0
|
175
|
+
|
176
|
+
atv.each do |row|
|
177
|
+
row.fields.must_equal(expected[i])
|
178
|
+
row[0].must_equal(expected[i][0])
|
179
|
+
row['name'].must_equal(expected[i][0])
|
180
|
+
row[1].must_equal(expected[i][1])
|
181
|
+
row['dob'].must_equal(expected[i][1])
|
182
|
+
row[2].must_equal(expected[i][2])
|
183
|
+
row['predictable?'].must_equal(expected[i][2])
|
184
|
+
i += 1
|
185
|
+
end
|
186
|
+
i.must_equal(3)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe 'without separators, indented' do
|
192
|
+
describe '#each' do
|
193
|
+
it 'with a block it yields rows of data as CSV rows' do
|
194
|
+
data_as_table = <<TEXT
|
195
|
+
|-----------+--------------------+--------------|
|
196
|
+
| name | dob | predictable? |
|
197
|
+
|-----------+--------------------+--------------|
|
198
|
+
| Malcolm | September 20, 2468 | false |
|
199
|
+
| Zoe | February 15, 2484 | |
|
200
|
+
| Derrial | null | true |
|
201
|
+
|-----------+--------------------+--------------|
|
202
|
+
TEXT
|
203
|
+
|
204
|
+
expected = [
|
205
|
+
['Malcolm', 'September 20, 2468', false],
|
206
|
+
['Zoe', 'February 15, 2484', nil],
|
207
|
+
['Derrial', nil, true]
|
95
208
|
]
|
96
|
-
|
209
|
+
atv = ATV.new(StringIO.new(data_as_table))
|
97
210
|
|
98
211
|
i = 0
|
99
212
|
|
100
|
-
|
213
|
+
atv.each do |row|
|
101
214
|
row.fields.must_equal(expected[i])
|
102
215
|
row[0].must_equal(expected[i][0])
|
103
216
|
row['name'].must_equal(expected[i][0])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Felkins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '5
|
47
|
+
version: '5'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '5
|
54
|
+
version: '5'
|
55
55
|
description: Read data from an ascii table.
|
56
56
|
email:
|
57
57
|
- kelly@restlater.com
|