iostreams 1.11.0 → 2.0.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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -2
  3. data/Rakefile +7 -0
  4. data/lib/io_streams/builder.rb +9 -9
  5. data/lib/io_streams/bzip2/writer.rb +1 -1
  6. data/lib/io_streams/encode/reader.rb +2 -2
  7. data/lib/io_streams/encode/writer.rb +5 -5
  8. data/lib/io_streams/gzip/reader.rb +1 -1
  9. data/lib/io_streams/gzip/writer.rb +1 -1
  10. data/lib/io_streams/io_streams.rb +45 -19
  11. data/lib/io_streams/line/reader.rb +2 -2
  12. data/lib/io_streams/line/writer.rb +1 -1
  13. data/lib/io_streams/path.rb +2 -2
  14. data/lib/io_streams/paths/file.rb +10 -10
  15. data/lib/io_streams/paths/http.rb +80 -7
  16. data/lib/io_streams/paths/matcher.rb +3 -3
  17. data/lib/io_streams/paths/s3.rb +3 -3
  18. data/lib/io_streams/paths/sftp.rb +7 -8
  19. data/lib/io_streams/pgp/reader.rb +23 -10
  20. data/lib/io_streams/pgp/writer.rb +93 -32
  21. data/lib/io_streams/pgp.rb +188 -60
  22. data/lib/io_streams/reader.rb +4 -4
  23. data/lib/io_streams/record/reader.rb +3 -4
  24. data/lib/io_streams/record/writer.rb +3 -4
  25. data/lib/io_streams/row/reader.rb +1 -1
  26. data/lib/io_streams/row/writer.rb +1 -1
  27. data/lib/io_streams/stream.rb +36 -30
  28. data/lib/io_streams/symmetric_encryption/reader.rb +2 -2
  29. data/lib/io_streams/symmetric_encryption/writer.rb +4 -4
  30. data/lib/io_streams/tabular/header.rb +18 -6
  31. data/lib/io_streams/tabular/parser/array.rb +0 -10
  32. data/lib/io_streams/tabular/parser/csv.rb +6 -38
  33. data/lib/io_streams/tabular/parser/fixed.rb +5 -5
  34. data/lib/io_streams/tabular/parser/psv.rb +0 -12
  35. data/lib/io_streams/tabular.rb +5 -10
  36. data/lib/io_streams/utils.rb +3 -2
  37. data/lib/io_streams/version.rb +1 -1
  38. data/lib/io_streams/writer.rb +6 -6
  39. data/lib/io_streams/xlsx/reader.rb +1 -1
  40. data/lib/io_streams/zip/writer.rb +22 -10
  41. data/lib/iostreams.rb +0 -1
  42. metadata +28 -111
  43. data/lib/io_streams/deprecated.rb +0 -216
  44. data/lib/io_streams/tabular/utility/csv_row.rb +0 -105
  45. data/test/builder_test.rb +0 -311
  46. data/test/bzip2_reader_test.rb +0 -27
  47. data/test/bzip2_writer_test.rb +0 -56
  48. data/test/deprecated_test.rb +0 -121
  49. data/test/encode_reader_test.rb +0 -51
  50. data/test/encode_writer_test.rb +0 -90
  51. data/test/files/embedded_lines_test.csv +0 -7
  52. data/test/files/multiple_files.zip +0 -0
  53. data/test/files/spreadsheet.xlsx +0 -0
  54. data/test/files/test.csv +0 -4
  55. data/test/files/test.json +0 -3
  56. data/test/files/test.psv +0 -4
  57. data/test/files/text file.txt +0 -3
  58. data/test/files/text.txt +0 -3
  59. data/test/files/text.txt.bz2 +0 -0
  60. data/test/files/text.txt.gz +0 -0
  61. data/test/files/text.txt.gz.zip +0 -0
  62. data/test/files/text.zip +0 -0
  63. data/test/files/text.zip.gz +0 -0
  64. data/test/files/unclosed_quote_large_test.csv +0 -1658
  65. data/test/files/unclosed_quote_test.csv +0 -4
  66. data/test/files/unclosed_quote_test2.csv +0 -3
  67. data/test/gzip_reader_test.rb +0 -27
  68. data/test/gzip_writer_test.rb +0 -52
  69. data/test/io_streams_test.rb +0 -132
  70. data/test/line_reader_test.rb +0 -325
  71. data/test/line_writer_test.rb +0 -59
  72. data/test/minimal_file_reader.rb +0 -25
  73. data/test/path_test.rb +0 -55
  74. data/test/paths/file_test.rb +0 -213
  75. data/test/paths/http_test.rb +0 -34
  76. data/test/paths/matcher_test.rb +0 -120
  77. data/test/paths/s3_test.rb +0 -220
  78. data/test/paths/sftp_test.rb +0 -106
  79. data/test/pgp_reader_test.rb +0 -46
  80. data/test/pgp_test.rb +0 -267
  81. data/test/pgp_writer_test.rb +0 -130
  82. data/test/record_reader_test.rb +0 -60
  83. data/test/record_writer_test.rb +0 -82
  84. data/test/row_reader_test.rb +0 -35
  85. data/test/row_writer_test.rb +0 -56
  86. data/test/stream_test.rb +0 -577
  87. data/test/tabular_test.rb +0 -338
  88. data/test/test_helper.rb +0 -40
  89. data/test/utils_test.rb +0 -20
  90. data/test/xlsx_reader_test.rb +0 -37
  91. data/test/zip_reader_test.rb +0 -53
  92. data/test/zip_writer_test.rb +0 -48
data/test/tabular_test.rb DELETED
@@ -1,338 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class TabularTest < Minitest::Test
4
- describe IOStreams::Tabular do
5
- let :format do
6
- :csv
7
- end
8
-
9
- let :tabular do
10
- IOStreams::Tabular.new(columns: %w[first_field second third], format: format)
11
- end
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
-
43
- let :fixed_with_strings do
44
- layout = [
45
- {size: "23", key: "name"},
46
- {size: 40, key: "address"},
47
- {size: 2},
48
- {size: 5.0, key: "zip", type: "integer"},
49
- {size: "8", key: "age", type: "integer"},
50
- {size: 10, key: "weight", type: "float", decimals: 2},
51
- {size: "remainder", key: "remainder"}
52
- ]
53
- IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
54
- end
55
-
56
- describe "#parse_header" do
57
- it "parses and sets the csv header" do
58
- tabular = IOStreams::Tabular.new(format: :csv)
59
- header = tabular.parse_header("first field,Second,thirD")
60
- assert_equal ["first field", "Second", "thirD"], header
61
- assert_equal header, tabular.header.columns
62
- end
63
- end
64
-
65
- describe "#cleanse_header!" do
66
- describe "cleanses" do
67
- it "a csv header" do
68
- tabular = IOStreams::Tabular.new(columns: ["first field", "Second", "thirD"])
69
- header = tabular.cleanse_header!
70
- assert_equal %w[first_field second third], header
71
- assert_equal header, tabular.header.columns
72
- end
73
-
74
- it "allowed list snake cased alphanumeric columns" do
75
- tabular = IOStreams::Tabular.new(
76
- columns: ["Ard Vark", "Password", "robot version", "$$$"],
77
- allowed_columns: %w[ard_vark robot_version]
78
- )
79
- expected_header = ["ard_vark", "__rejected__Password", "robot_version", "__rejected__$$$"]
80
- cleansed_header = tabular.cleanse_header!
81
- assert_equal(expected_header, cleansed_header)
82
- end
83
- end
84
-
85
- describe "allowed_columns" do
86
- before do
87
- @allowed_columns = %w[first second third fourth fifth]
88
- end
89
-
90
- it "passes" do
91
- tabular = IOStreams::Tabular.new(columns: [" first ", "Second", "thirD "], allowed_columns: @allowed_columns)
92
- header = tabular.cleanse_header!
93
- assert_equal %w[first second third], header
94
- assert_equal header, tabular.header.columns
95
- assert_equal @allowed_columns, tabular.header.allowed_columns
96
- end
97
-
98
- it "nils columns not in the allowed list" do
99
- tabular = IOStreams::Tabular.new(columns: [" first ", "Unknown Column", "thirD "], allowed_columns: @allowed_columns)
100
- header = tabular.cleanse_header!
101
- assert_equal ["first", "__rejected__Unknown Column", "third"], header
102
- end
103
-
104
- it "raises exception for columns not in the allowed list" do
105
- tabular = IOStreams::Tabular.new(columns: [" first ", "Unknown Column", "thirD "], allowed_columns: @allowed_columns, skip_unknown: false)
106
- exc = assert_raises IOStreams::Errors::InvalidHeader do
107
- tabular.cleanse_header!
108
- end
109
- assert_equal "Unknown columns after cleansing: Unknown Column", exc.message
110
- end
111
-
112
- it "raises exception missing required columns" do
113
- required = %w[first second fifth]
114
- tabular = IOStreams::Tabular.new(columns: [" first ", "Second", "thirD "], allowed_columns: @allowed_columns, required_columns: required)
115
- exc = assert_raises IOStreams::Errors::InvalidHeader do
116
- tabular.cleanse_header!
117
- end
118
- assert_equal "Missing columns after cleansing: fifth", exc.message
119
- end
120
-
121
- it "raises exception when no columns left" do
122
- tabular = IOStreams::Tabular.new(columns: %w[one two three], allowed_columns: @allowed_columns)
123
- exc = assert_raises IOStreams::Errors::InvalidHeader do
124
- tabular.cleanse_header!
125
- end
126
- assert_equal "All columns are unknown after cleansing: one,two,three", exc.message
127
- end
128
- end
129
- end
130
-
131
- describe "#record_parse" do
132
- describe ":array format" do
133
- let :format do
134
- :array
135
- end
136
-
137
- it "renders" do
138
- assert hash = tabular.record_parse([1, 2, 3])
139
- assert_equal({"first_field" => 1, "second" => 2, "third" => 3}, hash)
140
- end
141
- end
142
-
143
- it "format :csv" do
144
- assert hash = tabular.record_parse("1,2,3")
145
- assert_equal({"first_field" => "1", "second" => "2", "third" => "3"}, hash)
146
- end
147
-
148
- describe ":hash format" do
149
- let :format do
150
- :hash
151
- end
152
-
153
- it "renders" do
154
- assert hash = tabular.record_parse("first_field" => 1, "second" => 2, "third" => 3)
155
- assert_equal({"first_field" => 1, "second" => 2, "third" => 3}, hash)
156
- end
157
- end
158
-
159
- describe ":json format" do
160
- let :format do
161
- :json
162
- end
163
-
164
- it "renders" do
165
- assert hash = tabular.record_parse('{"first_field":1,"second":2,"third":3}')
166
- assert_equal({"first_field" => 1, "second" => 2, "third" => 3}, hash)
167
- end
168
- end
169
-
170
- describe ":psv format" do
171
- let :format do
172
- :psv
173
- end
174
-
175
- it "renders" do
176
- assert hash = tabular.record_parse("1|2|3")
177
- assert_equal({"first_field" => "1", "second" => "2", "third" => "3"}, hash)
178
- end
179
- end
180
-
181
- describe ":fixed format" do
182
- it "parses to hash" do
183
- assert hash = fixed.record_parse("Jack over there XX34618012345670012345.01")
184
- assert_equal({name: "Jack", address: "over there", zip: 34_618, age: 1_234_567, weight: 12_345.01}, hash)
185
- end
186
-
187
- it "parses short string" do
188
- assert_raises IOStreams::Errors::InvalidLineLength do
189
- fixed.record_parse("Jack over th")
190
- end
191
- end
192
-
193
- it "parses longer string" do
194
- assert_raises IOStreams::Errors::InvalidLineLength do
195
- fixed.record_parse("Jack over there XX34618012345670012345.01............")
196
- end
197
- end
198
-
199
- it "parses zero values" do
200
- assert hash = fixed.record_parse(" 00000000000000000000000")
201
- assert_equal({name: "", address: "", zip: 0, age: 0, weight: 0.0}, hash)
202
- end
203
-
204
- it "parses empty values" do
205
- assert hash = fixed.record_parse(" XX ")
206
- assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
207
- end
208
-
209
- it "parses blank strings" do
210
- skip "TODO: Part of fixed refactor to get this working"
211
- assert hash = fixed.record_parse(" ")
212
- assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
213
- end
214
-
215
- it "parses nil data as nil" do
216
- refute fixed.record_parse(nil)
217
- end
218
-
219
- it "parses empty string as nil" do
220
- refute fixed.record_parse("")
221
- end
222
-
223
- it "parses remainder" do
224
- hash = fixed_with_remainder.record_parse("Jack over there XX34618012345670012345.01............")
225
- assert_equal({name: "Jack", address: "over there", remainder: "XX34618012345670012345.01............"}, hash)
226
- end
227
-
228
- it "discards remainder" do
229
- hash = fixed_discard_remainder.record_parse("Jack over there XX34618012345670012345.01............")
230
- assert_equal({name: "Jack", address: "over there"}, hash)
231
- end
232
- end
233
-
234
- it "skips columns not in the allowed list" do
235
- tabular.header.allowed_columns = %w[first second third fourth fifth]
236
- tabular.cleanse_header!
237
- assert hash = tabular.record_parse("1,2,3")
238
- assert_equal({"second" => "2", "third" => "3"}, hash)
239
- end
240
-
241
- it "handles missing values" do
242
- assert hash = tabular.record_parse("1,2")
243
- assert_equal({"first_field" => "1", "second" => "2", "third" => nil}, hash)
244
- end
245
- end
246
-
247
- describe "#render" do
248
- it "renders an array of values" do
249
- assert csv_string = tabular.render([5, 6, 9])
250
- assert_equal "5,6,9", csv_string
251
- end
252
-
253
- it "renders a hash" do
254
- assert csv_string = tabular.render({"third" => "3", "first_field" => "1"})
255
- assert_equal "1,,3", csv_string
256
- end
257
-
258
- it "renders a hash including nil and boolean" do
259
- assert csv_string = tabular.render({"third" => true, "first_field" => false, "second" => nil})
260
- assert_equal "false,,true", csv_string
261
- end
262
-
263
- describe ":psv format" do
264
- let :format do
265
- :psv
266
- end
267
-
268
- it "renders psv nil and boolean" do
269
- assert psv_string = tabular.render({"third" => true, "first_field" => false, "second" => nil})
270
- assert_equal "false||true", psv_string
271
- end
272
-
273
- it "renders psv numeric and pipe data" do
274
- assert psv_string = tabular.render({"third" => 23, "first_field" => "a|b|c", "second" => "|"})
275
- assert_equal "a:b:c|:|23", psv_string
276
- end
277
- end
278
-
279
- describe ":fixed format" do
280
- it "renders fixed data" do
281
- assert string = fixed.render(name: "Jack", address: "over there", zip: 34_618, weight: 123_456.789123, age: 21)
282
- assert_equal "Jack over there 34618000000210123456.79", string
283
- end
284
-
285
- it "renders fixed data with string keys" do
286
- assert string = fixed_with_strings.render("name" => "Jack", "address" => "over there", "zip" => 34_618, "weight" => 123_456.789123, "age" => 21)
287
- assert_equal "Jack over there 34618000000210123456.79", string
288
- end
289
-
290
- it "truncates long strings" do
291
- 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)
292
- assert_equal "Jack ran up the beanstaover there 34618000000000000000.00", string
293
- end
294
-
295
- it "when integer is too large" do
296
- assert_raises IOStreams::Errors::ValueTooLong do
297
- fixed.render(zip: 3_461_832_653_653_265)
298
- end
299
- end
300
-
301
- it "when float is too large" do
302
- assert_raises IOStreams::Errors::ValueTooLong do
303
- fixed.render(weight: 3_461_832_653_653_265.234)
304
- end
305
- end
306
-
307
- it "renders nil as empty string" do
308
- assert string = fixed.render(zip: 34_618)
309
- assert_equal " 34618000000000000000.00", string
310
- end
311
-
312
- it "renders boolean" do
313
- assert string = fixed.render(name: true, address: false)
314
- assert_equal "true false 00000000000000000000.00", string
315
- end
316
-
317
- it "renders no data as nil" do
318
- refute fixed.render({})
319
- end
320
-
321
- it "any size last string" do
322
- assert string = fixed_with_remainder.render(name: "Jack", address: "over there", remainder: "XX34618012345670012345.01............")
323
- assert_equal "Jack over there XX34618012345670012345.01............", string
324
- end
325
-
326
- it "nil last string" do
327
- assert string = fixed_with_remainder.render(name: "Jack", address: "over there", remainder: nil)
328
- assert_equal "Jack over there ", string
329
- end
330
-
331
- it "skips last filler" do
332
- assert string = fixed_discard_remainder.render(name: "Jack", address: "over there")
333
- assert_equal "Jack over there ", string
334
- end
335
- end
336
- end
337
- end
338
- end
data/test/test_helper.rb DELETED
@@ -1,40 +0,0 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
2
-
3
- require "yaml"
4
- require "minitest/autorun"
5
- require "iostreams"
6
- require "amazing_print"
7
- require "symmetric-encryption"
8
-
9
- # Since PGP libraries use UTC for Dates
10
- ENV["TZ"] = "UTC"
11
-
12
- # Test cipher
13
- SymmetricEncryption.cipher = SymmetricEncryption::Cipher.new(
14
- cipher_name: "aes-128-cbc",
15
- key: "1234567890ABCDEF1234567890ABCDEF",
16
- iv: "1234567890ABCDEF",
17
- encoding: :base64strict
18
- )
19
-
20
- # IOStreams::Pgp.logger = Logger.new($stdout)
21
- # IOStreams::Pgp.executable = 'gpg1'
22
-
23
- # Test PGP Keys
24
- unless IOStreams::Pgp.key?(email: "sender@example.org")
25
- puts "Generating test PGP key: sender@example.org"
26
- IOStreams::Pgp.generate_key(name: "Sender", email: "sender@example.org", passphrase: "sender_passphrase", key_length: 2048)
27
- end
28
- unless IOStreams::Pgp.key?(email: "receiver@example.org")
29
- puts "Generating test PGP key: receiver@example.org"
30
- IOStreams::Pgp.generate_key(name: "Receiver", email: "receiver@example.org", passphrase: "receiver_passphrase", key_length: 2048)
31
- end
32
- unless IOStreams::Pgp.key?(email: "receiver2@example.org")
33
- puts "Generating test PGP key: receiver2@example.org"
34
- IOStreams::Pgp.generate_key(name: "Receiver2", email: "receiver2@example.org", passphrase: "receiver2_passphrase", key_length: 2048)
35
- end
36
-
37
- # Test paths
38
- root = File.expand_path(File.join(__dir__, "../tmp"))
39
- IOStreams.add_root(:default, File.join(root, "default"))
40
- IOStreams.add_root(:downloads, File.join(root, "downloads"))
data/test/utils_test.rb DELETED
@@ -1,20 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class UtilsTest < Minitest::Test
4
- describe IOStreams::Utils do
5
- describe ".temp_file_name" do
6
- it "returns value from block" do
7
- result = IOStreams::Utils.temp_file_name("base", ".ext") { |_name| 257 }
8
- assert_equal 257, result
9
- end
10
-
11
- it "supplies new temp file_name" do
12
- file_name = nil
13
- file_name2 = nil
14
- IOStreams::Utils.temp_file_name("base", ".ext") { |name| file_name = name }
15
- IOStreams::Utils.temp_file_name("base", ".ext") { |name| file_name2 = name }
16
- refute_equal file_name, file_name2
17
- end
18
- end
19
- end
20
- end
@@ -1,37 +0,0 @@
1
- require_relative "test_helper"
2
- require "csv"
3
-
4
- class XlsxReaderTest
5
- describe IOStreams::Xlsx::Reader do
6
- let :file_name do
7
- File.join(File.dirname(__FILE__), "files", "spreadsheet.xlsx")
8
- end
9
-
10
- let :xlsx_contents do
11
- [
12
- ["first column", "second column", "third column"],
13
- ["data 1", "data 2", "more data"]
14
- ]
15
- end
16
-
17
- describe ".file" do
18
- describe "with a file path" do
19
- it "returns the contents of the file" do
20
- csv = IOStreams::Xlsx::Reader.file(file_name, &:read)
21
- assert_equal xlsx_contents, CSV.parse(csv)
22
- end
23
- end
24
-
25
- describe "with a file stream" do
26
- it "returns the contents of the file" do
27
- csv = ""
28
- File.open(file_name, "rb") do |file|
29
- csv = IOStreams::Xlsx::Reader.stream(file, &:read)
30
- end
31
-
32
- assert_equal xlsx_contents, CSV.parse(csv)
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,53 +0,0 @@
1
- require_relative "test_helper"
2
- require_relative "minimal_file_reader"
3
- require "zip"
4
-
5
- class ZipReaderTest < Minitest::Test
6
- describe IOStreams::Zip::Reader do
7
- let :file_name do
8
- File.join(File.dirname(__FILE__), "files", "text.zip")
9
- end
10
-
11
- let :multiple_zip_file_name do
12
- File.join(File.dirname(__FILE__), "files", "multiple_files.zip")
13
- end
14
-
15
- let :contents_test_txt do
16
- File.read(File.join(File.dirname(__FILE__), "files", "text.txt"))
17
- end
18
-
19
- let :contents_test_json do
20
- File.read(File.join(File.dirname(__FILE__), "files", "test.json"))
21
- end
22
-
23
- let :decompressed do
24
- Zip::File.open(file_name) { |zip_file| zip_file.first.get_input_stream.read }
25
- end
26
-
27
- describe ".file" do
28
- it "reads the first file" do
29
- result = IOStreams::Zip::Reader.file(file_name, &:read)
30
- assert_equal decompressed, result
31
- end
32
-
33
- it "reads entry within zip file" do
34
- result = IOStreams::Zip::Reader.file(multiple_zip_file_name, entry_file_name: "text.txt", &:read)
35
- assert_equal contents_test_txt, result
36
- end
37
-
38
- it "reads another entry within zip file" do
39
- result = IOStreams::Zip::Reader.file(multiple_zip_file_name, entry_file_name: "test.json", &:read)
40
- assert_equal contents_test_json, result
41
- end
42
-
43
- # it 'reads from a stream' do
44
- # result = MinimalFileReader.open(file_name) do |file|
45
- # IOStreams::Zip::Reader.stream(file) do |io|
46
- # io.read
47
- # end
48
- # end
49
- # assert_equal decompressed, result
50
- # end
51
- end
52
- end
53
- end
@@ -1,48 +0,0 @@
1
- require_relative "test_helper"
2
- require "zip"
3
-
4
- class ZipWriterTest < Minitest::Test
5
- describe IOStreams::Zip::Writer do
6
- let :temp_file do
7
- Tempfile.new("iostreams")
8
- end
9
-
10
- let :file_name do
11
- temp_file.path
12
- end
13
-
14
- let :decompressed do
15
- ::File.read(File.join(File.dirname(__FILE__), "files", "text.txt"))
16
- end
17
-
18
- after do
19
- temp_file.delete
20
- end
21
-
22
- describe ".file" do
23
- it "file" do
24
- result =
25
- IOStreams::Zip::Writer.file(file_name, entry_file_name: "text.txt") do |io|
26
- io.write(decompressed)
27
- 53534
28
- end
29
- assert_equal 53534, result
30
- result = IOStreams::Zip::Reader.file(file_name, &:read)
31
- assert_equal decompressed, result
32
- end
33
-
34
- it "stream" do
35
- io_string = StringIO.new("".b)
36
- result =
37
- IOStreams::Zip::Writer.stream(io_string) do |io|
38
- io.write(decompressed)
39
- 53534
40
- end
41
- assert_equal 53534, result
42
- io = StringIO.new(io_string.string)
43
- result = IOStreams::Zip::Reader.stream(io, &:read)
44
- assert_equal decompressed, result
45
- end
46
- end
47
- end
48
- end