iostreams 1.2.1 → 1.6.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/README.md +19 -4
- data/lib/io_streams/builder.rb +27 -10
- data/lib/io_streams/bzip2/reader.rb +3 -3
- data/lib/io_streams/bzip2/writer.rb +3 -3
- data/lib/io_streams/deprecated.rb +1 -1
- data/lib/io_streams/encode/reader.rb +1 -3
- data/lib/io_streams/encode/writer.rb +1 -1
- data/lib/io_streams/errors.rb +22 -0
- data/lib/io_streams/io_streams.rb +1 -5
- data/lib/io_streams/line/reader.rb +28 -16
- data/lib/io_streams/path.rb +3 -1
- data/lib/io_streams/paths/file.rb +4 -4
- data/lib/io_streams/paths/http.rb +6 -3
- data/lib/io_streams/paths/s3.rb +30 -8
- data/lib/io_streams/paths/sftp.rb +34 -13
- data/lib/io_streams/pgp.rb +84 -71
- data/lib/io_streams/stream.rb +78 -12
- data/lib/io_streams/tabular.rb +28 -27
- data/lib/io_streams/tabular/header.rb +14 -12
- data/lib/io_streams/tabular/parser/csv.rb +4 -2
- data/lib/io_streams/tabular/parser/fixed.rb +166 -26
- data/lib/io_streams/tabular/utility/csv_row.rb +1 -4
- data/lib/io_streams/utils.rb +4 -4
- data/lib/io_streams/version.rb +1 -1
- data/lib/io_streams/zip/reader.rb +1 -1
- data/test/builder_test.rb +29 -0
- data/test/bzip2_writer_test.rb +6 -4
- data/test/deprecated_test.rb +2 -0
- data/test/files/test.psv +4 -0
- data/test/files/unclosed_quote_large_test.csv +1658 -0
- data/test/files/unclosed_quote_test2.csv +3 -0
- data/test/io_streams_test.rb +2 -2
- data/test/line_reader_test.rb +30 -4
- data/test/paths/file_test.rb +1 -1
- data/test/paths/s3_test.rb +3 -3
- data/test/paths/sftp_test.rb +4 -4
- data/test/pgp_test.rb +54 -4
- data/test/pgp_writer_test.rb +3 -3
- data/test/stream_test.rb +174 -8
- data/test/tabular_test.rb +100 -40
- data/test/test_helper.rb +1 -1
- metadata +47 -42
data/test/tabular_test.rb
CHANGED
@@ -10,6 +10,36 @@ class TabularTest < Minitest::Test
|
|
10
10
|
IOStreams::Tabular.new(columns: %w[first_field second third], format: format)
|
11
11
|
end
|
12
12
|
|
13
|
+
let :fixed do
|
14
|
+
layout = [
|
15
|
+
{size: 23, key: :name},
|
16
|
+
{size: 40, key: :address},
|
17
|
+
{size: 2},
|
18
|
+
{size: 5, key: :zip, type: :integer},
|
19
|
+
{size: 8, key: :age, type: :integer},
|
20
|
+
{size: 10, key: :weight, type: :float, decimals: 2}
|
21
|
+
]
|
22
|
+
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
23
|
+
end
|
24
|
+
|
25
|
+
let :fixed_with_remainder do
|
26
|
+
layout = [
|
27
|
+
{size: 23, key: :name},
|
28
|
+
{size: 40, key: :address},
|
29
|
+
{size: :remainder, key: :remainder}
|
30
|
+
]
|
31
|
+
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
32
|
+
end
|
33
|
+
|
34
|
+
let :fixed_discard_remainder do
|
35
|
+
layout = [
|
36
|
+
{size: 23, key: :name},
|
37
|
+
{size: 40, key: :address},
|
38
|
+
{size: :remainder}
|
39
|
+
]
|
40
|
+
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
41
|
+
end
|
42
|
+
|
13
43
|
describe "#parse_header" do
|
14
44
|
it "parses and sets the csv header" do
|
15
45
|
tabular = IOStreams::Tabular.new(format: :csv)
|
@@ -136,43 +166,55 @@ class TabularTest < Minitest::Test
|
|
136
166
|
end
|
137
167
|
|
138
168
|
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
169
|
it "parses to hash" do
|
149
|
-
assert hash =
|
150
|
-
assert_equal({
|
170
|
+
assert hash = fixed.record_parse("Jack over there XX34618012345670012345.01")
|
171
|
+
assert_equal({name: "Jack", address: "over there", zip: 34_618, age: 1_234_567, weight: 12_345.01}, hash)
|
151
172
|
end
|
152
173
|
|
153
174
|
it "parses short string" do
|
154
|
-
|
155
|
-
|
156
|
-
|
175
|
+
assert_raises IOStreams::Errors::InvalidLineLength do
|
176
|
+
fixed.record_parse("Jack over th")
|
177
|
+
end
|
157
178
|
end
|
158
179
|
|
159
180
|
it "parses longer string" do
|
160
|
-
|
161
|
-
|
162
|
-
|
181
|
+
assert_raises IOStreams::Errors::InvalidLineLength do
|
182
|
+
fixed.record_parse("Jack over there XX34618012345670012345.01............")
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
it "parses zero values" do
|
187
|
+
assert hash = fixed.record_parse(" 00000000000000000000000")
|
188
|
+
assert_equal({name: "", address: "", zip: 0, age: 0, weight: 0.0}, hash)
|
163
189
|
end
|
164
190
|
|
165
|
-
it "parses empty
|
166
|
-
assert hash =
|
167
|
-
assert_equal({
|
191
|
+
it "parses empty values" do
|
192
|
+
assert hash = fixed.record_parse(" XX ")
|
193
|
+
assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "parses blank strings" do
|
197
|
+
skip "TODO: Part of fixed refactor to get this working"
|
198
|
+
assert hash = fixed.record_parse(" ")
|
199
|
+
assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
|
168
200
|
end
|
169
201
|
|
170
202
|
it "parses nil data as nil" do
|
171
|
-
refute
|
203
|
+
refute fixed.record_parse(nil)
|
172
204
|
end
|
173
205
|
|
174
206
|
it "parses empty string as nil" do
|
175
|
-
refute
|
207
|
+
refute fixed.record_parse("")
|
208
|
+
end
|
209
|
+
|
210
|
+
it "parses remainder" do
|
211
|
+
hash = fixed_with_remainder.record_parse("Jack over there XX34618012345670012345.01............")
|
212
|
+
assert_equal({name: "Jack", address: "over there", remainder: "XX34618012345670012345.01............"}, hash)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "discards remainder" do
|
216
|
+
hash = fixed_discard_remainder.record_parse("Jack over there XX34618012345670012345.01............")
|
217
|
+
assert_equal({name: "Jack", address: "over there"}, hash)
|
176
218
|
end
|
177
219
|
end
|
178
220
|
|
@@ -222,37 +264,55 @@ class TabularTest < Minitest::Test
|
|
222
264
|
end
|
223
265
|
|
224
266
|
describe ":fixed format" do
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
{key: "address", size: 40},
|
229
|
-
{key: "zip", size: 5}
|
230
|
-
]
|
231
|
-
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
267
|
+
it "renders fixed data" do
|
268
|
+
assert string = fixed.render(name: "Jack", address: "over there", zip: 34_618, weight: 123_456.789123, age: 21)
|
269
|
+
assert_equal "Jack over there 34618000000210123456.79", string
|
232
270
|
end
|
233
271
|
|
234
|
-
it "
|
235
|
-
assert string =
|
236
|
-
assert_equal "Jack
|
272
|
+
it "truncates long strings" do
|
273
|
+
assert string = fixed.render(name: "Jack ran up the beanstalk and when jack reached the top it was truncated", address: "over there", zip: 34_618)
|
274
|
+
assert_equal "Jack ran up the beanstaover there 34618000000000000000.00", string
|
237
275
|
end
|
238
276
|
|
239
|
-
it "
|
240
|
-
|
241
|
-
|
277
|
+
it "when integer is too large" do
|
278
|
+
assert_raises IOStreams::Errors::ValueTooLong do
|
279
|
+
fixed.render(zip: 3_461_832_653_653_265)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
it "when float is too large" do
|
284
|
+
assert_raises IOStreams::Errors::ValueTooLong do
|
285
|
+
fixed.render(weight: 3_461_832_653_653_265.234)
|
286
|
+
end
|
242
287
|
end
|
243
288
|
|
244
289
|
it "renders nil as empty string" do
|
245
|
-
assert string =
|
246
|
-
assert_equal "
|
290
|
+
assert string = fixed.render(zip: 34_618)
|
291
|
+
assert_equal " 34618000000000000000.00", string
|
247
292
|
end
|
248
293
|
|
249
294
|
it "renders boolean" do
|
250
|
-
assert string =
|
251
|
-
assert_equal "true false
|
295
|
+
assert string = fixed.render(name: true, address: false)
|
296
|
+
assert_equal "true false 00000000000000000000.00", string
|
252
297
|
end
|
253
298
|
|
254
299
|
it "renders no data as nil" do
|
255
|
-
refute
|
300
|
+
refute fixed.render({})
|
301
|
+
end
|
302
|
+
|
303
|
+
it "any size last string" do
|
304
|
+
assert string = fixed_with_remainder.render(name: "Jack", address: "over there", remainder: "XX34618012345670012345.01............")
|
305
|
+
assert_equal "Jack over there XX34618012345670012345.01............", string
|
306
|
+
end
|
307
|
+
|
308
|
+
it "nil last string" do
|
309
|
+
assert string = fixed_with_remainder.render(name: "Jack", address: "over there", remainder: nil)
|
310
|
+
assert_equal "Jack over there ", string
|
311
|
+
end
|
312
|
+
|
313
|
+
it "skips last filler" do
|
314
|
+
assert string = fixed_discard_remainder.render(name: "Jack", address: "over there")
|
315
|
+
assert_equal "Jack over there ", string
|
256
316
|
end
|
257
317
|
end
|
258
318
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iostreams
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
13
|
+
description:
|
14
14
|
email:
|
15
|
-
- reidmo@gmail.com
|
16
15
|
executables: []
|
17
16
|
extensions: []
|
18
17
|
extra_rdoc_files: []
|
@@ -77,6 +76,7 @@ files:
|
|
77
76
|
- test/files/spreadsheet.xlsx
|
78
77
|
- test/files/test.csv
|
79
78
|
- test/files/test.json
|
79
|
+
- test/files/test.psv
|
80
80
|
- test/files/text file.txt
|
81
81
|
- test/files/text.txt
|
82
82
|
- test/files/text.txt.bz2
|
@@ -84,7 +84,9 @@ files:
|
|
84
84
|
- test/files/text.txt.gz.zip
|
85
85
|
- test/files/text.zip
|
86
86
|
- test/files/text.zip.gz
|
87
|
+
- test/files/unclosed_quote_large_test.csv
|
87
88
|
- test/files/unclosed_quote_test.csv
|
89
|
+
- test/files/unclosed_quote_test2.csv
|
88
90
|
- test/gzip_reader_test.rb
|
89
91
|
- test/gzip_writer_test.rb
|
90
92
|
- test/io_streams_test.rb
|
@@ -111,11 +113,11 @@ files:
|
|
111
113
|
- test/xlsx_reader_test.rb
|
112
114
|
- test/zip_reader_test.rb
|
113
115
|
- test/zip_writer_test.rb
|
114
|
-
homepage: https://
|
116
|
+
homepage: https://iostreams.rocketjob.io
|
115
117
|
licenses:
|
116
118
|
- Apache-2.0
|
117
119
|
metadata: {}
|
118
|
-
post_install_message:
|
120
|
+
post_install_message:
|
119
121
|
rdoc_options: []
|
120
122
|
require_paths:
|
121
123
|
- lib
|
@@ -130,53 +132,56 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
132
|
- !ruby/object:Gem::Version
|
131
133
|
version: '0'
|
132
134
|
requirements: []
|
133
|
-
rubygems_version: 3.
|
134
|
-
signing_key:
|
135
|
+
rubygems_version: 3.2.15
|
136
|
+
signing_key:
|
135
137
|
specification_version: 4
|
136
138
|
summary: Input and Output streaming for Ruby.
|
137
139
|
test_files:
|
138
|
-
- test/pgp_reader_test.rb
|
139
|
-
- test/deprecated_test.rb
|
140
140
|
- test/builder_test.rb
|
141
|
-
- test/
|
142
|
-
- test/xlsx_reader_test.rb
|
143
|
-
- test/minimal_file_reader.rb
|
144
|
-
- test/row_writer_test.rb
|
145
|
-
- test/zip_reader_test.rb
|
141
|
+
- test/bzip2_reader_test.rb
|
146
142
|
- test/bzip2_writer_test.rb
|
143
|
+
- test/deprecated_test.rb
|
144
|
+
- test/encode_reader_test.rb
|
147
145
|
- test/encode_writer_test.rb
|
148
|
-
- test/gzip_writer_test.rb
|
149
|
-
- test/stream_test.rb
|
150
|
-
- test/paths/matcher_test.rb
|
151
|
-
- test/paths/s3_test.rb
|
152
|
-
- test/paths/sftp_test.rb
|
153
|
-
- test/paths/file_test.rb
|
154
|
-
- test/paths/http_test.rb
|
155
|
-
- test/record_reader_test.rb
|
156
|
-
- test/pgp_writer_test.rb
|
157
|
-
- test/line_writer_test.rb
|
158
|
-
- test/row_reader_test.rb
|
159
|
-
- test/bzip2_reader_test.rb
|
160
|
-
- test/zip_writer_test.rb
|
161
|
-
- test/files/text.zip
|
162
|
-
- test/files/spreadsheet.xlsx
|
163
146
|
- test/files/embedded_lines_test.csv
|
147
|
+
- test/files/multiple_files.zip
|
148
|
+
- test/files/spreadsheet.xlsx
|
164
149
|
- test/files/test.csv
|
165
150
|
- test/files/test.json
|
166
|
-
- test/files/
|
167
|
-
- test/files/
|
151
|
+
- test/files/test.psv
|
152
|
+
- test/files/text file.txt
|
153
|
+
- test/files/text.txt
|
168
154
|
- test/files/text.txt.bz2
|
169
|
-
- test/files/text.txt.gz.zip
|
170
155
|
- test/files/text.txt.gz
|
171
|
-
- test/files/text.txt
|
172
|
-
- test/files/
|
173
|
-
- test/files/text
|
156
|
+
- test/files/text.txt.gz.zip
|
157
|
+
- test/files/text.zip
|
158
|
+
- test/files/text.zip.gz
|
159
|
+
- test/files/unclosed_quote_large_test.csv
|
160
|
+
- test/files/unclosed_quote_test.csv
|
161
|
+
- test/files/unclosed_quote_test2.csv
|
174
162
|
- test/gzip_reader_test.rb
|
175
|
-
- test/
|
176
|
-
- test/
|
177
|
-
- test/
|
178
|
-
- test/
|
163
|
+
- test/gzip_writer_test.rb
|
164
|
+
- test/io_streams_test.rb
|
165
|
+
- test/line_reader_test.rb
|
166
|
+
- test/line_writer_test.rb
|
167
|
+
- test/minimal_file_reader.rb
|
179
168
|
- test/path_test.rb
|
169
|
+
- test/paths/file_test.rb
|
170
|
+
- test/paths/http_test.rb
|
171
|
+
- test/paths/matcher_test.rb
|
172
|
+
- test/paths/s3_test.rb
|
173
|
+
- test/paths/sftp_test.rb
|
174
|
+
- test/pgp_reader_test.rb
|
180
175
|
- test/pgp_test.rb
|
181
|
-
- test/
|
176
|
+
- test/pgp_writer_test.rb
|
177
|
+
- test/record_reader_test.rb
|
182
178
|
- test/record_writer_test.rb
|
179
|
+
- test/row_reader_test.rb
|
180
|
+
- test/row_writer_test.rb
|
181
|
+
- test/stream_test.rb
|
182
|
+
- test/tabular_test.rb
|
183
|
+
- test/test_helper.rb
|
184
|
+
- test/utils_test.rb
|
185
|
+
- test/xlsx_reader_test.rb
|
186
|
+
- test/zip_reader_test.rb
|
187
|
+
- test/zip_writer_test.rb
|