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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -4
  3. data/lib/io_streams/builder.rb +27 -10
  4. data/lib/io_streams/bzip2/reader.rb +3 -3
  5. data/lib/io_streams/bzip2/writer.rb +3 -3
  6. data/lib/io_streams/deprecated.rb +1 -1
  7. data/lib/io_streams/encode/reader.rb +1 -3
  8. data/lib/io_streams/encode/writer.rb +1 -1
  9. data/lib/io_streams/errors.rb +22 -0
  10. data/lib/io_streams/io_streams.rb +1 -5
  11. data/lib/io_streams/line/reader.rb +28 -16
  12. data/lib/io_streams/path.rb +3 -1
  13. data/lib/io_streams/paths/file.rb +4 -4
  14. data/lib/io_streams/paths/http.rb +6 -3
  15. data/lib/io_streams/paths/s3.rb +30 -8
  16. data/lib/io_streams/paths/sftp.rb +34 -13
  17. data/lib/io_streams/pgp.rb +84 -71
  18. data/lib/io_streams/stream.rb +78 -12
  19. data/lib/io_streams/tabular.rb +28 -27
  20. data/lib/io_streams/tabular/header.rb +14 -12
  21. data/lib/io_streams/tabular/parser/csv.rb +4 -2
  22. data/lib/io_streams/tabular/parser/fixed.rb +166 -26
  23. data/lib/io_streams/tabular/utility/csv_row.rb +1 -4
  24. data/lib/io_streams/utils.rb +4 -4
  25. data/lib/io_streams/version.rb +1 -1
  26. data/lib/io_streams/zip/reader.rb +1 -1
  27. data/test/builder_test.rb +29 -0
  28. data/test/bzip2_writer_test.rb +6 -4
  29. data/test/deprecated_test.rb +2 -0
  30. data/test/files/test.psv +4 -0
  31. data/test/files/unclosed_quote_large_test.csv +1658 -0
  32. data/test/files/unclosed_quote_test2.csv +3 -0
  33. data/test/io_streams_test.rb +2 -2
  34. data/test/line_reader_test.rb +30 -4
  35. data/test/paths/file_test.rb +1 -1
  36. data/test/paths/s3_test.rb +3 -3
  37. data/test/paths/sftp_test.rb +4 -4
  38. data/test/pgp_test.rb +54 -4
  39. data/test/pgp_writer_test.rb +3 -3
  40. data/test/stream_test.rb +174 -8
  41. data/test/tabular_test.rb +100 -40
  42. data/test/test_helper.rb +1 -1
  43. 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 = tabular.record_parse("Jack over there 34618")
150
- assert_equal({"name" => "Jack", "address" => "over there", "zip" => "34618"}, hash)
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
- # 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)
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
- # 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)
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 strings" do
166
- assert hash = tabular.record_parse(" 34618")
167
- assert_equal({"name" => "", "address" => "", "zip" => "34618"}, hash)
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 tabular.record_parse(nil)
203
+ refute fixed.record_parse(nil)
172
204
  end
173
205
 
174
206
  it "parses empty string as nil" do
175
- refute tabular.record_parse("")
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
- 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})
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 "renders fixed data" do
235
- assert string = tabular.render({"name" => "Jack", "address" => "over there", "zip" => 34_618, "phone" => "5551231234"})
236
- assert_equal "Jack over there 34618", string
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 "truncates long data" do
240
- assert string = tabular.render({"name" => "Jack", "address" => "over there", "zip" => 3_461_832_653_653_265, "phone" => "5551231234"})
241
- assert_equal "Jack over there 34618", string
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 = tabular.render("zip" => 3_461_832_653_653_265)
246
- assert_equal " 34618", string
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 = tabular.render({"name" => true, "address" => false, "zip" => nil, "phone" => "5551231234"})
251
- assert_equal "true false ", string
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 tabular.render({})
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
@@ -4,7 +4,7 @@ require "yaml"
4
4
  require "minitest/autorun"
5
5
  require "minitest/reporters"
6
6
  require "iostreams"
7
- require "awesome_print"
7
+ require "amazing_print"
8
8
  require "symmetric-encryption"
9
9
 
10
10
  # Since PGP libraries use UTC for Dates
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.1
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: 2020-05-19 00:00:00.000000000 Z
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://github.com/rocketjob/iostreams
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.0.6
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/line_reader_test.rb
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/text.zip.gz
167
- - test/files/unclosed_quote_test.csv
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/multiple_files.zip
173
- - test/files/text file.txt
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/encode_reader_test.rb
176
- - test/test_helper.rb
177
- - test/utils_test.rb
178
- - test/tabular_test.rb
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/io_streams_test.rb
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