iostreams 0.15.0 → 0.16.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.
- checksums.yaml +4 -4
- data/lib/io_streams/bzip2/reader.rb +1 -1
- data/lib/io_streams/bzip2/writer.rb +1 -1
- data/lib/io_streams/encode/reader.rb +102 -0
- data/lib/io_streams/encode/writer.rb +78 -0
- data/lib/io_streams/errors.rb +19 -0
- data/lib/io_streams/file/reader.rb +1 -1
- data/lib/io_streams/file/writer.rb +1 -3
- data/lib/io_streams/gzip/reader.rb +1 -1
- data/lib/io_streams/gzip/writer.rb +1 -1
- data/lib/io_streams/io_streams.rb +57 -38
- data/lib/io_streams/line/reader.rb +125 -69
- data/lib/io_streams/line/writer.rb +11 -35
- data/lib/io_streams/pgp.rb +1 -1
- data/lib/io_streams/record/reader.rb +12 -14
- data/lib/io_streams/record/writer.rb +12 -14
- data/lib/io_streams/row/reader.rb +15 -16
- data/lib/io_streams/row/writer.rb +14 -12
- data/lib/io_streams/tabular.rb +50 -30
- data/lib/io_streams/tabular/header.rb +6 -6
- data/lib/io_streams/tabular/parser/array.rb +2 -2
- data/lib/io_streams/tabular/parser/csv.rb +6 -2
- data/lib/io_streams/tabular/parser/fixed.rb +18 -37
- data/lib/io_streams/tabular/parser/hash.rb +1 -1
- data/lib/io_streams/tabular/parser/json.rb +3 -1
- data/lib/io_streams/tabular/parser/psv.rb +6 -2
- data/lib/io_streams/version.rb +1 -1
- data/lib/io_streams/xlsx/reader.rb +22 -32
- data/lib/iostreams.rb +6 -0
- data/test/encode_reader_test.rb +54 -0
- data/test/encode_writer_test.rb +82 -0
- data/test/io_streams_test.rb +0 -65
- data/test/line_reader_test.rb +180 -37
- data/test/tabular_test.rb +79 -3
- data/test/test_helper.rb +1 -1
- data/test/xlsx_reader_test.rb +7 -10
- metadata +10 -4
- data/lib/io_streams/tabular/errors.rb +0 -14
data/test/tabular_test.rb
CHANGED
@@ -60,7 +60,7 @@ class TabularTest < Minitest::Test
|
|
60
60
|
|
61
61
|
it 'raises exception for columns not in the whitelist' do
|
62
62
|
tabular = IOStreams::Tabular.new(columns: [' first ', 'Unknown Column', 'thirD '], allowed_columns: @allowed_columns, skip_unknown: false)
|
63
|
-
exc = assert_raises IOStreams::
|
63
|
+
exc = assert_raises IOStreams::Errors::InvalidHeader do
|
64
64
|
tabular.cleanse_header!
|
65
65
|
end
|
66
66
|
assert_equal 'Unknown columns after cleansing: Unknown Column', exc.message
|
@@ -69,7 +69,7 @@ class TabularTest < Minitest::Test
|
|
69
69
|
it 'raises exception missing required columns' do
|
70
70
|
required = ['first', 'second', 'fifth']
|
71
71
|
tabular = IOStreams::Tabular.new(columns: [' first ', 'Second', 'thirD '], allowed_columns: @allowed_columns, required_columns: required)
|
72
|
-
exc = assert_raises IOStreams::
|
72
|
+
exc = assert_raises IOStreams::Errors::InvalidHeader do
|
73
73
|
tabular.cleanse_header!
|
74
74
|
end
|
75
75
|
assert_equal 'Missing columns after cleansing: fifth', exc.message
|
@@ -77,7 +77,7 @@ class TabularTest < Minitest::Test
|
|
77
77
|
|
78
78
|
it 'raises exception when no columns left' do
|
79
79
|
tabular = IOStreams::Tabular.new(columns: ['one', 'two', 'three'], allowed_columns: @allowed_columns)
|
80
|
-
exc = assert_raises IOStreams::
|
80
|
+
exc = assert_raises IOStreams::Errors::InvalidHeader do
|
81
81
|
tabular.cleanse_header!
|
82
82
|
end
|
83
83
|
assert_equal 'All columns are unknown after cleansing: one,two,three', exc.message
|
@@ -135,6 +135,47 @@ class TabularTest < Minitest::Test
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
+
describe ':fixed format' do
|
139
|
+
let :tabular do
|
140
|
+
layout = [
|
141
|
+
{key: 'name', size: 23},
|
142
|
+
{key: 'address', size: 40},
|
143
|
+
{key: 'zip', size: 5}
|
144
|
+
]
|
145
|
+
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'parses to hash' do
|
149
|
+
assert hash = tabular.record_parse('Jack over there 34618')
|
150
|
+
assert_equal({'name' => 'Jack', 'address' => 'over there', 'zip' => '34618'}, hash)
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'parses short string' do
|
154
|
+
# TODO: Raise exception on lines that are too short?
|
155
|
+
assert hash = tabular.record_parse('Jack over th')
|
156
|
+
assert_equal({'name' => 'Jack', 'address' => 'over th', 'zip' => ''}, hash)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'parses longer string' do
|
160
|
+
# TODO: Raise exception on lines that are too long?
|
161
|
+
assert hash = tabular.record_parse('Jack over there 34618........................................')
|
162
|
+
assert_equal({'name' => 'Jack', 'address' => 'over there', 'zip' => '34618'}, hash)
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'parses empty strings' do
|
166
|
+
assert hash = tabular.record_parse(' 34618')
|
167
|
+
assert_equal({'name' => '', 'address' => '', 'zip' => '34618'}, hash)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'parses nil data as nil' do
|
171
|
+
refute tabular.record_parse(nil)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'parses empty string as nil' do
|
175
|
+
refute tabular.record_parse('')
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
138
179
|
it 'skips columns not in the whitelist' do
|
139
180
|
tabular.header.allowed_columns = ['first', 'second', 'third', 'fourth', 'fifth']
|
140
181
|
tabular.cleanse_header!
|
@@ -179,6 +220,41 @@ class TabularTest < Minitest::Test
|
|
179
220
|
assert_equal 'a:b:c|:|23', psv_string
|
180
221
|
end
|
181
222
|
end
|
223
|
+
|
224
|
+
describe ':fixed format' do
|
225
|
+
let :tabular do
|
226
|
+
layout = [
|
227
|
+
{key: 'name', size: 23},
|
228
|
+
{key: 'address', size: 40},
|
229
|
+
{key: 'zip', size: 5}
|
230
|
+
]
|
231
|
+
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'renders fixed data' do
|
235
|
+
assert string = tabular.render({'name' => 'Jack', 'address' => 'over there', 'zip' => 34618, 'phone' => '5551231234'})
|
236
|
+
assert_equal 'Jack over there 34618', string
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'truncates long data' do
|
240
|
+
assert string = tabular.render({'name' => 'Jack', 'address' => 'over there', 'zip' => 3461832653653265, 'phone' => '5551231234'})
|
241
|
+
assert_equal 'Jack over there 34618', string
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'renders nil as empty string' do
|
245
|
+
assert string = tabular.render('zip' => 3461832653653265)
|
246
|
+
assert_equal ' 34618', string
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'renders boolean' do
|
250
|
+
assert string = tabular.render({'name' => true, 'address' => false, 'zip' => nil, 'phone' => '5551231234'})
|
251
|
+
assert_equal 'true false ', string
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'renders no data as nil' do
|
255
|
+
refute tabular.render({})
|
256
|
+
end
|
257
|
+
end
|
182
258
|
end
|
183
259
|
end
|
184
260
|
end
|
data/test/test_helper.rb
CHANGED
data/test/xlsx_reader_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
|
+
require 'csv'
|
2
3
|
|
3
4
|
class XlsxReaderTest
|
4
5
|
describe IOStreams::Xlsx::Reader do
|
@@ -17,23 +18,19 @@ class XlsxReaderTest
|
|
17
18
|
describe 'with a file path' do
|
18
19
|
it 'returns the contents of the file' do
|
19
20
|
rows = []
|
20
|
-
IOStreams::Xlsx::Reader.open(file_name)
|
21
|
-
|
22
|
-
end
|
23
|
-
assert_equal xlsx_contents, rows
|
21
|
+
csv = IOStreams::Xlsx::Reader.open(file_name, &:read)
|
22
|
+
assert_equal xlsx_contents, CSV.parse(csv)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
26
|
describe 'with a file stream' do
|
28
27
|
it 'returns the contents of the file' do
|
29
|
-
|
30
|
-
File.open(file_name) do |file|
|
31
|
-
IOStreams::Xlsx::Reader.open(file)
|
32
|
-
stream.each { |row| rows << row }
|
33
|
-
end
|
28
|
+
csv = ''
|
29
|
+
File.open(file_name, 'rb') do |file|
|
30
|
+
csv = IOStreams::Xlsx::Reader.open(file, &:read)
|
34
31
|
end
|
35
32
|
|
36
|
-
assert_equal xlsx_contents,
|
33
|
+
assert_equal xlsx_contents, CSV.parse(csv)
|
37
34
|
end
|
38
35
|
end
|
39
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iostreams
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -36,6 +36,9 @@ files:
|
|
36
36
|
- Rakefile
|
37
37
|
- lib/io_streams/bzip2/reader.rb
|
38
38
|
- lib/io_streams/bzip2/writer.rb
|
39
|
+
- lib/io_streams/encode/reader.rb
|
40
|
+
- lib/io_streams/encode/writer.rb
|
41
|
+
- lib/io_streams/errors.rb
|
39
42
|
- lib/io_streams/file/reader.rb
|
40
43
|
- lib/io_streams/file/writer.rb
|
41
44
|
- lib/io_streams/gzip/reader.rb
|
@@ -57,7 +60,6 @@ files:
|
|
57
60
|
- lib/io_streams/sftp/writer.rb
|
58
61
|
- lib/io_streams/streams.rb
|
59
62
|
- lib/io_streams/tabular.rb
|
60
|
-
- lib/io_streams/tabular/errors.rb
|
61
63
|
- lib/io_streams/tabular/header.rb
|
62
64
|
- lib/io_streams/tabular/parser/array.rb
|
63
65
|
- lib/io_streams/tabular/parser/base.rb
|
@@ -74,6 +76,8 @@ files:
|
|
74
76
|
- lib/iostreams.rb
|
75
77
|
- test/bzip2_reader_test.rb
|
76
78
|
- test/bzip2_writer_test.rb
|
79
|
+
- test/encode_reader_test.rb
|
80
|
+
- test/encode_writer_test.rb
|
77
81
|
- test/file_reader_test.rb
|
78
82
|
- test/file_writer_test.rb
|
79
83
|
- test/files/spreadsheet.xlsx
|
@@ -113,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
117
|
requirements:
|
114
118
|
- - ">="
|
115
119
|
- !ruby/object:Gem::Version
|
116
|
-
version: '2.
|
120
|
+
version: '2.2'
|
117
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
122
|
requirements:
|
119
123
|
- - ">="
|
@@ -132,6 +136,7 @@ test_files:
|
|
132
136
|
- test/row_writer_test.rb
|
133
137
|
- test/zip_reader_test.rb
|
134
138
|
- test/bzip2_writer_test.rb
|
139
|
+
- test/encode_writer_test.rb
|
135
140
|
- test/gzip_writer_test.rb
|
136
141
|
- test/file_reader_test.rb
|
137
142
|
- test/record_reader_test.rb
|
@@ -149,6 +154,7 @@ test_files:
|
|
149
154
|
- test/files/text.txt.gz
|
150
155
|
- test/files/text.txt
|
151
156
|
- test/gzip_reader_test.rb
|
157
|
+
- test/encode_reader_test.rb
|
152
158
|
- test/test_helper.rb
|
153
159
|
- test/file_writer_test.rb
|
154
160
|
- test/tabular_test.rb
|