iostreams 1.0.0.beta7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +138 -78
- data/lib/io_streams/{streams.rb → builder.rb} +4 -3
- data/lib/io_streams/deprecated.rb +9 -9
- data/lib/io_streams/io_streams.rb +11 -11
- data/lib/io_streams/line/writer.rb +2 -2
- data/lib/io_streams/path.rb +7 -7
- data/lib/io_streams/paths/file.rb +13 -4
- data/lib/io_streams/paths/http.rb +4 -2
- data/lib/io_streams/paths/s3.rb +4 -4
- data/lib/io_streams/paths/sftp.rb +37 -36
- data/lib/io_streams/pgp/reader.rb +3 -1
- data/lib/io_streams/record/writer.rb +1 -1
- data/lib/io_streams/row/writer.rb +1 -1
- data/lib/io_streams/stream.rb +134 -109
- data/lib/io_streams/version.rb +1 -1
- data/lib/iostreams.rb +1 -1
- data/test/{streams_test.rb → builder_test.rb} +23 -11
- data/test/encode_reader_test.rb +1 -0
- data/test/paths/s3_test.rb +1 -1
- data/test/stream_test.rb +26 -26
- metadata +8 -8
data/lib/io_streams/version.rb
CHANGED
data/lib/iostreams.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'io_streams/version'
|
2
2
|
# @formatter:off
|
3
3
|
module IOStreams
|
4
|
+
autoload :Builder, 'io_streams/builder'
|
4
5
|
autoload :Errors, 'io_streams/errors'
|
5
6
|
autoload :Path, 'io_streams/path'
|
6
7
|
autoload :Pgp, 'io_streams/pgp'
|
7
8
|
autoload :Reader, 'io_streams/reader'
|
8
9
|
autoload :Stream, 'io_streams/stream'
|
9
|
-
autoload :Streams, 'io_streams/streams'
|
10
10
|
autoload :Tabular, 'io_streams/tabular'
|
11
11
|
autoload :Utils, 'io_streams/utils'
|
12
12
|
autoload :Writer, 'io_streams/writer'
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
describe IOStreams::
|
3
|
+
class BuilderTest < Minitest::Test
|
4
|
+
describe IOStreams::Builder do
|
5
5
|
let(:file_name) { 'my/path/abc.bcd.xlsx.zip.gz.pgp' }
|
6
|
-
let(:streams) { IOStreams::
|
6
|
+
let(:streams) { IOStreams::Builder.new(file_name) }
|
7
7
|
|
8
8
|
describe '#option' do
|
9
9
|
it 'adds one option' do
|
@@ -68,6 +68,14 @@ class StreamsTest < Minitest::Test
|
|
68
68
|
end
|
69
69
|
|
70
70
|
describe '#reader' do
|
71
|
+
let :gzip_string do
|
72
|
+
io_string = StringIO.new(''.b)
|
73
|
+
IOStreams::Gzip::Writer.stream(io_string) do |io|
|
74
|
+
io.write("Hello World")
|
75
|
+
end
|
76
|
+
io_string.string
|
77
|
+
end
|
78
|
+
|
71
79
|
it 'directly calls block for an empty stream' do
|
72
80
|
string_io = StringIO.new
|
73
81
|
value = nil
|
@@ -80,17 +88,17 @@ class StreamsTest < Minitest::Test
|
|
80
88
|
end
|
81
89
|
|
82
90
|
it 'returns the reader' do
|
83
|
-
string_io = StringIO.new
|
84
|
-
streams.stream(:
|
91
|
+
string_io = StringIO.new(gzip_string)
|
92
|
+
streams.stream(:gz)
|
85
93
|
streams.reader(string_io) do |io|
|
86
|
-
assert io.is_a?(
|
94
|
+
assert io.is_a?(::Zlib::GzipReader), io
|
87
95
|
end
|
88
96
|
end
|
89
97
|
|
90
98
|
it 'returns the last reader' do
|
91
|
-
string_io = StringIO.new
|
99
|
+
string_io = StringIO.new(gzip_string)
|
92
100
|
streams.stream(:encode)
|
93
|
-
streams.stream(:
|
101
|
+
streams.stream(:gz)
|
94
102
|
streams.reader(string_io) do |io|
|
95
103
|
assert io.is_a?(IOStreams::Encode::Reader), io
|
96
104
|
end
|
@@ -147,12 +155,12 @@ class StreamsTest < Minitest::Test
|
|
147
155
|
|
148
156
|
describe '#parse_extensions' do
|
149
157
|
it 'single stream' do
|
150
|
-
streams = IOStreams::
|
158
|
+
streams = IOStreams::Builder.new('my/path/abc.xlsx')
|
151
159
|
assert_equal %i[xlsx], streams.send(:parse_extensions)
|
152
160
|
end
|
153
161
|
|
154
162
|
it 'empty' do
|
155
|
-
streams = IOStreams::
|
163
|
+
streams = IOStreams::Builder.new('my/path/abc.csv')
|
156
164
|
assert_equal [], streams.send(:parse_extensions)
|
157
165
|
end
|
158
166
|
|
@@ -178,7 +186,7 @@ class StreamsTest < Minitest::Test
|
|
178
186
|
|
179
187
|
it 'no file name, streams, or options' do
|
180
188
|
expected = {}
|
181
|
-
streams = IOStreams::
|
189
|
+
streams = IOStreams::Builder.new
|
182
190
|
assert_equal expected, streams.pipeline
|
183
191
|
end
|
184
192
|
|
@@ -238,6 +246,10 @@ class StreamsTest < Minitest::Test
|
|
238
246
|
yield new(io, **args)
|
239
247
|
end
|
240
248
|
|
249
|
+
def self.open(file_name_or_io, **args, &block)
|
250
|
+
file_name_or_io.is_a?(String) ? file(file_name_or_io, **args, &block) : stream(file_name_or_io, **args, &block)
|
251
|
+
end
|
252
|
+
|
241
253
|
def initialize(io, arg:)
|
242
254
|
@io = io
|
243
255
|
@arg = arg
|
data/test/encode_reader_test.rb
CHANGED
@@ -21,6 +21,7 @@ class EncodeReaderTest < Minitest::Test
|
|
21
21
|
describe '#read' do
|
22
22
|
describe 'replacement' do
|
23
23
|
it 'does not strip invalid characters' do
|
24
|
+
skip "Does not raise on JRuby" if defined?(JRuby)
|
24
25
|
input = StringIO.new(bad_data)
|
25
26
|
IOStreams::Encode::Reader.stream(input, encoding: 'UTF-8') do |io|
|
26
27
|
assert_raises ::Encoding::UndefinedConversionError do
|
data/test/paths/s3_test.rb
CHANGED
@@ -100,7 +100,7 @@ module Paths
|
|
100
100
|
describe '#each_line' do
|
101
101
|
it 'reads line by line' do
|
102
102
|
lines = []
|
103
|
-
existing_path.
|
103
|
+
existing_path.each(:line) {|line| lines << line}
|
104
104
|
assert_equal raw.lines.collect(&:chomp), lines
|
105
105
|
end
|
106
106
|
end
|
data/test/stream_test.rb
CHANGED
@@ -75,7 +75,7 @@ class StreamTest < Minitest::Test
|
|
75
75
|
it 'returns a line at a time' do
|
76
76
|
lines = []
|
77
77
|
stream.stream(:none)
|
78
|
-
count = stream.
|
78
|
+
count = stream.each(:line) { |line| lines << line }
|
79
79
|
assert_equal data.lines.map(&:strip), lines
|
80
80
|
assert_equal data.lines.count, count
|
81
81
|
end
|
@@ -85,16 +85,16 @@ class StreamTest < Minitest::Test
|
|
85
85
|
lines = []
|
86
86
|
stream = IOStreams::Stream.new(input)
|
87
87
|
stream.stream(:encode, encoding: 'UTF-8', cleaner: :printable, replace: '')
|
88
|
-
count = stream.
|
88
|
+
count = stream.each(:line) { |line| lines << line }
|
89
89
|
assert_equal stripped_data.lines.map(&:strip), lines
|
90
90
|
assert_equal stripped_data.lines.count, count
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
describe '.
|
94
|
+
describe '.each row' do
|
95
95
|
end
|
96
96
|
|
97
|
-
describe '.
|
97
|
+
describe '.each record' do
|
98
98
|
end
|
99
99
|
|
100
100
|
describe '#writer' do
|
@@ -191,11 +191,11 @@ class StreamTest < Minitest::Test
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
-
describe '#
|
194
|
+
describe '#writer(:line)' do
|
195
195
|
describe "#write" do
|
196
196
|
it 'one block' do
|
197
197
|
io = StringIO.new
|
198
|
-
IOStreams::Stream.new(io).
|
198
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
199
199
|
stream.write("Hello World")
|
200
200
|
end
|
201
201
|
assert_equal "Hello World\n", io.string
|
@@ -203,7 +203,7 @@ class StreamTest < Minitest::Test
|
|
203
203
|
|
204
204
|
it 'multiple blocks' do
|
205
205
|
io = StringIO.new
|
206
|
-
IOStreams::Stream.new(io).
|
206
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
207
207
|
stream.write("He")
|
208
208
|
stream.write("l")
|
209
209
|
stream.write("lo ")
|
@@ -214,7 +214,7 @@ class StreamTest < Minitest::Test
|
|
214
214
|
|
215
215
|
it 'empty blocks' do
|
216
216
|
io = StringIO.new
|
217
|
-
IOStreams::Stream.new(io).
|
217
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
218
218
|
stream.write("")
|
219
219
|
stream.write("He")
|
220
220
|
stream.write("")
|
@@ -229,7 +229,7 @@ class StreamTest < Minitest::Test
|
|
229
229
|
|
230
230
|
it 'nil blocks' do
|
231
231
|
io = StringIO.new
|
232
|
-
IOStreams::Stream.new(io).
|
232
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
233
233
|
stream.write(nil)
|
234
234
|
stream.write("He")
|
235
235
|
stream.write(nil)
|
@@ -246,7 +246,7 @@ class StreamTest < Minitest::Test
|
|
246
246
|
describe "#<<" do
|
247
247
|
it 'one block' do
|
248
248
|
io = StringIO.new
|
249
|
-
IOStreams::Stream.new(io).
|
249
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
250
250
|
stream << "Hello World"
|
251
251
|
end
|
252
252
|
assert_equal "Hello World\n", io.string
|
@@ -254,7 +254,7 @@ class StreamTest < Minitest::Test
|
|
254
254
|
|
255
255
|
it 'multiple blocks' do
|
256
256
|
io = StringIO.new
|
257
|
-
IOStreams::Stream.new(io).
|
257
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
258
258
|
stream << "He"
|
259
259
|
stream << "l" << "lo " << "World"
|
260
260
|
end
|
@@ -263,7 +263,7 @@ class StreamTest < Minitest::Test
|
|
263
263
|
|
264
264
|
it 'empty blocks' do
|
265
265
|
io = StringIO.new
|
266
|
-
IOStreams::Stream.new(io).
|
266
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
267
267
|
stream << ""
|
268
268
|
stream << "He" << "" << "l" << ""
|
269
269
|
stream << "lo " << "World"
|
@@ -274,7 +274,7 @@ class StreamTest < Minitest::Test
|
|
274
274
|
|
275
275
|
it 'nil blocks' do
|
276
276
|
io = StringIO.new
|
277
|
-
IOStreams::Stream.new(io).
|
277
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
278
278
|
stream << nil
|
279
279
|
stream << "He" << nil << "l" << nil
|
280
280
|
stream << "lo " << "World"
|
@@ -287,9 +287,9 @@ class StreamTest < Minitest::Test
|
|
287
287
|
describe "line writers within line writers" do
|
288
288
|
it 'uses existing line writer' do
|
289
289
|
io = StringIO.new
|
290
|
-
IOStreams::Stream.new(io).
|
290
|
+
IOStreams::Stream.new(io).writer(:line) do |stream|
|
291
291
|
stream.write("Before")
|
292
|
-
IOStreams::Stream.new(stream).
|
292
|
+
IOStreams::Stream.new(stream).writer(:line) do |inner|
|
293
293
|
stream.write("Inner")
|
294
294
|
assert_equal inner.object_id, stream.object_id
|
295
295
|
end
|
@@ -300,11 +300,11 @@ class StreamTest < Minitest::Test
|
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
303
|
-
describe '#
|
303
|
+
describe '#writer(:array)' do
|
304
304
|
describe "#write" do
|
305
305
|
it 'one block' do
|
306
306
|
io = StringIO.new
|
307
|
-
IOStreams::Stream.new(io).
|
307
|
+
IOStreams::Stream.new(io).writer(:array) do |stream|
|
308
308
|
stream << %w[Hello World]
|
309
309
|
end
|
310
310
|
assert_equal "Hello,World\n", io.string
|
@@ -312,7 +312,7 @@ class StreamTest < Minitest::Test
|
|
312
312
|
|
313
313
|
it 'multiple blocks' do
|
314
314
|
io = StringIO.new
|
315
|
-
IOStreams::Stream.new(io).
|
315
|
+
IOStreams::Stream.new(io).writer(:array) do |stream|
|
316
316
|
stream << %w[He]
|
317
317
|
stream << %w[l lo\ World]
|
318
318
|
stream << ["He", "", "l", ""]
|
@@ -324,7 +324,7 @@ class StreamTest < Minitest::Test
|
|
324
324
|
it 'empty blocks' do
|
325
325
|
# skip "TODO"
|
326
326
|
io = StringIO.new
|
327
|
-
IOStreams::Stream.new(io).
|
327
|
+
IOStreams::Stream.new(io).writer(:array) do |stream|
|
328
328
|
stream << %w[He]
|
329
329
|
stream << []
|
330
330
|
stream << %w[l lo\ World]
|
@@ -337,7 +337,7 @@ class StreamTest < Minitest::Test
|
|
337
337
|
|
338
338
|
it 'nil values' do
|
339
339
|
io = StringIO.new
|
340
|
-
IOStreams::Stream.new(io).
|
340
|
+
IOStreams::Stream.new(io).writer(:array) do |stream|
|
341
341
|
stream << %w[He]
|
342
342
|
stream << %w[l lo\ World]
|
343
343
|
stream << ["He", nil, "l", nil]
|
@@ -349,7 +349,7 @@ class StreamTest < Minitest::Test
|
|
349
349
|
it 'empty leading array' do
|
350
350
|
skip "TODO"
|
351
351
|
io = StringIO.new
|
352
|
-
IOStreams::Stream.new(io).
|
352
|
+
IOStreams::Stream.new(io).writer(:array) do |stream|
|
353
353
|
stream << []
|
354
354
|
stream << %w[He]
|
355
355
|
stream << %w[l lo\ World]
|
@@ -362,11 +362,11 @@ class StreamTest < Minitest::Test
|
|
362
362
|
end
|
363
363
|
end
|
364
364
|
|
365
|
-
describe '#
|
365
|
+
describe '#writer(:hash)' do
|
366
366
|
describe "#write" do
|
367
367
|
it 'one block' do
|
368
368
|
io = StringIO.new
|
369
|
-
IOStreams::Stream.new(io).
|
369
|
+
IOStreams::Stream.new(io).writer(:hash) do |stream|
|
370
370
|
stream << {first_name: "Jack", last_name: "Johnson"}
|
371
371
|
end
|
372
372
|
assert_equal "first_name,last_name\nJack,Johnson\n", io.string, io.string.inspect
|
@@ -374,7 +374,7 @@ class StreamTest < Minitest::Test
|
|
374
374
|
|
375
375
|
it 'multiple blocks' do
|
376
376
|
io = StringIO.new
|
377
|
-
IOStreams::Stream.new(io).
|
377
|
+
IOStreams::Stream.new(io).writer(:hash) do |stream|
|
378
378
|
stream << {first_name: "Jack", last_name: "Johnson"}
|
379
379
|
stream << {first_name: "Able", last_name: "Smith"}
|
380
380
|
end
|
@@ -383,7 +383,7 @@ class StreamTest < Minitest::Test
|
|
383
383
|
|
384
384
|
it 'empty hashes' do
|
385
385
|
io = StringIO.new
|
386
|
-
IOStreams::Stream.new(io).
|
386
|
+
IOStreams::Stream.new(io).writer(:hash) do |stream|
|
387
387
|
stream << {first_name: "Jack", last_name: "Johnson"}
|
388
388
|
stream << {} << {first_name: "Able", last_name: "Smith"}
|
389
389
|
stream << {}
|
@@ -394,7 +394,7 @@ class StreamTest < Minitest::Test
|
|
394
394
|
it 'nil values' do
|
395
395
|
skip "TODO"
|
396
396
|
io = StringIO.new
|
397
|
-
IOStreams::Stream.new(io).
|
397
|
+
IOStreams::Stream.new(io).writer(:hash) do |stream|
|
398
398
|
stream << {first_name: "Jack", last_name: "Johnson"}
|
399
399
|
stream << {} << {first_name: "Able", last_name: "Smith"}
|
400
400
|
stream << {first_name: "Able", last_name: nil}
|
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: 1.0.0
|
4
|
+
version: 1.0.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:
|
11
|
+
date: 2020-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -20,6 +20,7 @@ files:
|
|
20
20
|
- LICENSE
|
21
21
|
- README.md
|
22
22
|
- Rakefile
|
23
|
+
- lib/io_streams/builder.rb
|
23
24
|
- lib/io_streams/bzip2/reader.rb
|
24
25
|
- lib/io_streams/bzip2/writer.rb
|
25
26
|
- lib/io_streams/deprecated.rb
|
@@ -46,7 +47,6 @@ files:
|
|
46
47
|
- lib/io_streams/row/reader.rb
|
47
48
|
- lib/io_streams/row/writer.rb
|
48
49
|
- lib/io_streams/stream.rb
|
49
|
-
- lib/io_streams/streams.rb
|
50
50
|
- lib/io_streams/symmetric_encryption/reader.rb
|
51
51
|
- lib/io_streams/symmetric_encryption/writer.rb
|
52
52
|
- lib/io_streams/tabular.rb
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/io_streams/zip/reader.rb
|
67
67
|
- lib/io_streams/zip/writer.rb
|
68
68
|
- lib/iostreams.rb
|
69
|
+
- test/builder_test.rb
|
69
70
|
- test/bzip2_reader_test.rb
|
70
71
|
- test/bzip2_writer_test.rb
|
71
72
|
- test/deprecated_test.rb
|
@@ -104,7 +105,6 @@ files:
|
|
104
105
|
- test/row_reader_test.rb
|
105
106
|
- test/row_writer_test.rb
|
106
107
|
- test/stream_test.rb
|
107
|
-
- test/streams_test.rb
|
108
108
|
- test/tabular_test.rb
|
109
109
|
- test/test_helper.rb
|
110
110
|
- test/utils_test.rb
|
@@ -126,17 +126,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '2.3'
|
127
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - "
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
131
|
+
version: '0'
|
132
132
|
requirements: []
|
133
|
-
rubygems_version: 3.
|
133
|
+
rubygems_version: 3.1.2
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: Input and Output streaming for Ruby.
|
137
137
|
test_files:
|
138
138
|
- test/pgp_reader_test.rb
|
139
139
|
- test/deprecated_test.rb
|
140
|
+
- test/builder_test.rb
|
140
141
|
- test/line_reader_test.rb
|
141
142
|
- test/xlsx_reader_test.rb
|
142
143
|
- test/minimal_file_reader.rb
|
@@ -145,7 +146,6 @@ test_files:
|
|
145
146
|
- test/bzip2_writer_test.rb
|
146
147
|
- test/encode_writer_test.rb
|
147
148
|
- test/gzip_writer_test.rb
|
148
|
-
- test/streams_test.rb
|
149
149
|
- test/stream_test.rb
|
150
150
|
- test/paths/matcher_test.rb
|
151
151
|
- test/paths/s3_test.rb
|