iostreams 0.20.3 → 1.0.0.beta
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 +9 -21
- data/lib/io_streams/bzip2/writer.rb +9 -21
- data/lib/io_streams/deprecated.rb +217 -0
- data/lib/io_streams/encode/reader.rb +12 -16
- data/lib/io_streams/encode/writer.rb +9 -13
- data/lib/io_streams/errors.rb +6 -6
- data/lib/io_streams/gzip/reader.rb +7 -14
- data/lib/io_streams/gzip/writer.rb +7 -15
- data/lib/io_streams/io_streams.rb +182 -524
- data/lib/io_streams/line/reader.rb +9 -9
- data/lib/io_streams/line/writer.rb +10 -11
- data/lib/io_streams/path.rb +190 -0
- data/lib/io_streams/paths/file.rb +176 -0
- data/lib/io_streams/paths/http.rb +92 -0
- data/lib/io_streams/paths/matcher.rb +61 -0
- data/lib/io_streams/paths/s3.rb +269 -0
- data/lib/io_streams/paths/sftp.rb +99 -0
- data/lib/io_streams/pgp.rb +47 -19
- data/lib/io_streams/pgp/reader.rb +20 -28
- data/lib/io_streams/pgp/writer.rb +24 -46
- data/lib/io_streams/reader.rb +28 -0
- data/lib/io_streams/record/reader.rb +20 -16
- data/lib/io_streams/record/writer.rb +28 -28
- data/lib/io_streams/row/reader.rb +22 -26
- data/lib/io_streams/row/writer.rb +29 -28
- data/lib/io_streams/stream.rb +400 -0
- data/lib/io_streams/streams.rb +125 -0
- data/lib/io_streams/symmetric_encryption/reader.rb +5 -13
- data/lib/io_streams/symmetric_encryption/writer.rb +16 -15
- data/lib/io_streams/tabular/header.rb +9 -3
- data/lib/io_streams/tabular/parser/array.rb +8 -3
- data/lib/io_streams/tabular/parser/csv.rb +6 -2
- data/lib/io_streams/tabular/parser/hash.rb +4 -1
- data/lib/io_streams/tabular/parser/json.rb +3 -1
- data/lib/io_streams/tabular/parser/psv.rb +3 -1
- data/lib/io_streams/tabular/utility/csv_row.rb +9 -8
- data/lib/io_streams/utils.rb +22 -0
- data/lib/io_streams/version.rb +1 -1
- data/lib/io_streams/writer.rb +28 -0
- data/lib/io_streams/xlsx/reader.rb +7 -19
- data/lib/io_streams/zip/reader.rb +7 -26
- data/lib/io_streams/zip/writer.rb +21 -38
- data/lib/iostreams.rb +15 -15
- data/test/bzip2_reader_test.rb +3 -3
- data/test/bzip2_writer_test.rb +3 -3
- data/test/deprecated_test.rb +123 -0
- data/test/encode_reader_test.rb +3 -3
- data/test/encode_writer_test.rb +6 -6
- data/test/gzip_reader_test.rb +2 -2
- data/test/gzip_writer_test.rb +3 -3
- data/test/io_streams_test.rb +43 -136
- data/test/line_reader_test.rb +20 -20
- data/test/line_writer_test.rb +3 -3
- data/test/path_test.rb +30 -28
- data/test/paths/file_test.rb +206 -0
- data/test/paths/http_test.rb +34 -0
- data/test/paths/matcher_test.rb +111 -0
- data/test/paths/s3_test.rb +207 -0
- data/test/pgp_reader_test.rb +8 -8
- data/test/pgp_writer_test.rb +13 -13
- data/test/record_reader_test.rb +5 -5
- data/test/record_writer_test.rb +4 -4
- data/test/row_reader_test.rb +5 -5
- data/test/row_writer_test.rb +6 -6
- data/test/stream_test.rb +116 -0
- data/test/streams_test.rb +255 -0
- data/test/utils_test.rb +20 -0
- data/test/xlsx_reader_test.rb +3 -3
- data/test/zip_reader_test.rb +12 -12
- data/test/zip_writer_test.rb +5 -5
- metadata +33 -45
- data/lib/io_streams/base_path.rb +0 -72
- data/lib/io_streams/file/path.rb +0 -58
- data/lib/io_streams/file/reader.rb +0 -12
- data/lib/io_streams/file/writer.rb +0 -22
- data/lib/io_streams/http/reader.rb +0 -71
- data/lib/io_streams/s3.rb +0 -26
- data/lib/io_streams/s3/path.rb +0 -40
- data/lib/io_streams/s3/reader.rb +0 -28
- data/lib/io_streams/s3/writer.rb +0 -85
- data/lib/io_streams/sftp/reader.rb +0 -67
- data/lib/io_streams/sftp/writer.rb +0 -68
- data/test/base_path_test.rb +0 -35
- data/test/file_path_test.rb +0 -97
- data/test/file_reader_test.rb +0 -33
- data/test/file_writer_test.rb +0 -50
- data/test/http_reader_test.rb +0 -38
- data/test/s3_reader_test.rb +0 -41
- data/test/s3_writer_test.rb +0 -41
data/test/record_reader_test.rb
CHANGED
@@ -23,7 +23,7 @@ class RecordReaderTest < Minitest::Test
|
|
23
23
|
describe '#each' do
|
24
24
|
it 'csv file' do
|
25
25
|
records = []
|
26
|
-
IOStreams::Record::Reader.
|
26
|
+
IOStreams::Record::Reader.file(file_name, cleanse_header: false) do |io|
|
27
27
|
io.each { |row| records << row }
|
28
28
|
end
|
29
29
|
assert_equal expected, records
|
@@ -31,7 +31,7 @@ class RecordReaderTest < Minitest::Test
|
|
31
31
|
|
32
32
|
it 'json file' do
|
33
33
|
records = []
|
34
|
-
IOStreams::Record::Reader.
|
34
|
+
IOStreams::Record::Reader.file(json_file_name, cleanse_header: false, format: :json) do |input|
|
35
35
|
input.each { |row| records << row }
|
36
36
|
end
|
37
37
|
assert_equal expected, records
|
@@ -39,8 +39,8 @@ class RecordReaderTest < Minitest::Test
|
|
39
39
|
|
40
40
|
it 'stream' do
|
41
41
|
rows = []
|
42
|
-
IOStreams.
|
43
|
-
IOStreams::Record::Reader.
|
42
|
+
IOStreams::Line::Reader.file(file_name) do |file|
|
43
|
+
IOStreams::Record::Reader.stream(file, cleanse_header: false) do |io|
|
44
44
|
io.each { |row| rows << row }
|
45
45
|
end
|
46
46
|
end
|
@@ -50,7 +50,7 @@ class RecordReaderTest < Minitest::Test
|
|
50
50
|
|
51
51
|
describe '#collect' do
|
52
52
|
it 'json file' do
|
53
|
-
records = IOStreams::Record::Reader.
|
53
|
+
records = IOStreams::Record::Reader.file(json_file_name, format: :json) do |input|
|
54
54
|
input.collect { |record| record["state"] }
|
55
55
|
end
|
56
56
|
assert_equal expected.collect { |record| record["state"] }, records
|
data/test/record_writer_test.rb
CHANGED
@@ -43,7 +43,7 @@ class RecordWriterTest < Minitest::Test
|
|
43
43
|
|
44
44
|
describe '#<<' do
|
45
45
|
it 'file' do
|
46
|
-
IOStreams::Record::Writer.
|
46
|
+
IOStreams::Record::Writer.file(file_name) do |io|
|
47
47
|
inputs.each { |hash| io << hash }
|
48
48
|
end
|
49
49
|
result = File.read(file_name)
|
@@ -51,7 +51,7 @@ class RecordWriterTest < Minitest::Test
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'json file' do
|
54
|
-
IOStreams::Record::Writer.
|
54
|
+
IOStreams::Record::Writer.file(file_name, file_name: 'abc.json') do |io|
|
55
55
|
inputs.each { |hash| io << hash }
|
56
56
|
end
|
57
57
|
result = File.read(file_name)
|
@@ -60,8 +60,8 @@ class RecordWriterTest < Minitest::Test
|
|
60
60
|
|
61
61
|
it 'stream' do
|
62
62
|
io_string = StringIO.new
|
63
|
-
IOStreams::Line::Writer.
|
64
|
-
IOStreams::Record::Writer.
|
63
|
+
IOStreams::Line::Writer.stream(io_string) do |io|
|
64
|
+
IOStreams::Record::Writer.stream(io) do |stream|
|
65
65
|
inputs.each { |row| stream << row }
|
66
66
|
end
|
67
67
|
end
|
data/test/row_reader_test.rb
CHANGED
@@ -12,8 +12,8 @@ class RowReaderTest < Minitest::Test
|
|
12
12
|
|
13
13
|
describe '.open' do
|
14
14
|
it 'file' do
|
15
|
-
rows
|
16
|
-
count = IOStreams::Row::Reader.
|
15
|
+
rows = []
|
16
|
+
count = IOStreams::Row::Reader.file(file_name) do |io|
|
17
17
|
io.each { |row| rows << row }
|
18
18
|
end
|
19
19
|
assert_equal expected, rows
|
@@ -21,9 +21,9 @@ class RowReaderTest < Minitest::Test
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'stream' do
|
24
|
-
rows
|
25
|
-
count = IOStreams.
|
26
|
-
IOStreams::Row::Reader.
|
24
|
+
rows = []
|
25
|
+
count = IOStreams::Line::Reader.file(file_name) do |file|
|
26
|
+
IOStreams::Row::Reader.stream(file) do |io|
|
27
27
|
io.each { |row| rows << row }
|
28
28
|
end
|
29
29
|
end
|
data/test/row_writer_test.rb
CHANGED
@@ -27,19 +27,19 @@ class RowWriterTest < Minitest::Test
|
|
27
27
|
temp_file.delete
|
28
28
|
end
|
29
29
|
|
30
|
-
describe '.
|
30
|
+
describe '.stream' do
|
31
31
|
it 'file' do
|
32
|
-
IOStreams::Row::Writer.
|
32
|
+
IOStreams::Row::Writer.file(file_name) do |io|
|
33
33
|
csv_rows.each { |array| io << array }
|
34
34
|
end
|
35
|
-
result = File.read(file_name)
|
35
|
+
result = ::File.read(file_name)
|
36
36
|
assert_equal raw_csv_data, result
|
37
37
|
end
|
38
38
|
|
39
|
-
it '
|
39
|
+
it 'streams' do
|
40
40
|
io_string = StringIO.new
|
41
|
-
IOStreams::Line::Writer.
|
42
|
-
IOStreams::Row::Writer.
|
41
|
+
IOStreams::Line::Writer.stream(io_string) do |io|
|
42
|
+
IOStreams::Row::Writer.stream(io) do |stream|
|
43
43
|
csv_rows.each { |array| stream << array }
|
44
44
|
end
|
45
45
|
end
|
data/test/stream_test.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class StreamTest < Minitest::Test
|
4
|
+
describe IOStreams::Stream do
|
5
|
+
let :source_file_name do
|
6
|
+
File.join(__dir__, 'files', 'text.txt')
|
7
|
+
end
|
8
|
+
|
9
|
+
let :data do
|
10
|
+
File.read(source_file_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
let :bad_data do
|
14
|
+
[
|
15
|
+
"New M\xE9xico,NE".b,
|
16
|
+
'good line',
|
17
|
+
"New M\xE9xico,\x07SF".b
|
18
|
+
].join("\n").encode('BINARY')
|
19
|
+
end
|
20
|
+
|
21
|
+
let :stripped_data do
|
22
|
+
bad_data.gsub("\xE9".b, '').gsub("\x07", '')
|
23
|
+
end
|
24
|
+
|
25
|
+
let :multiple_zip_file_name do
|
26
|
+
File.join(File.dirname(__FILE__), 'files', 'multiple_files.zip')
|
27
|
+
end
|
28
|
+
|
29
|
+
let :zip_gz_file_name do
|
30
|
+
File.join(File.dirname(__FILE__), 'files', 'text.zip.gz')
|
31
|
+
end
|
32
|
+
|
33
|
+
let :contents_test_txt do
|
34
|
+
File.read(File.join(File.dirname(__FILE__), 'files', 'text.txt'))
|
35
|
+
end
|
36
|
+
|
37
|
+
let :contents_test_json do
|
38
|
+
File.read(File.join(File.dirname(__FILE__), 'files', 'test.json'))
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:string_io) { StringIO.new(data) }
|
42
|
+
let(:stream) { IOStreams::Stream.new(string_io) }
|
43
|
+
|
44
|
+
describe '.reader' do
|
45
|
+
it 'reads a zip file' do
|
46
|
+
File.open(multiple_zip_file_name, 'rb') do |io|
|
47
|
+
result = IOStreams::Stream.new(io).
|
48
|
+
file_name(multiple_zip_file_name).
|
49
|
+
option(:zip, entry_file_name: 'test.json').
|
50
|
+
reader { |io| io.read }
|
51
|
+
assert_equal contents_test_json, result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'reads a zip file from within a gz file' do
|
56
|
+
File.open(zip_gz_file_name, 'rb') do |io|
|
57
|
+
result = IOStreams::Stream.new(io).
|
58
|
+
file_name(zip_gz_file_name).
|
59
|
+
reader { |io| io.read }
|
60
|
+
assert_equal contents_test_txt, result
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.line_reader' do
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '.row_reader' do
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '.record_reader' do
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '.each_line' do
|
75
|
+
it 'returns a line at a time' do
|
76
|
+
lines = []
|
77
|
+
stream.stream(:none)
|
78
|
+
count = stream.each_line { |line| lines << line }
|
79
|
+
assert_equal data.lines.map(&:strip), lines
|
80
|
+
assert_equal data.lines.count, count
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'strips non-printable characters' do
|
84
|
+
input = StringIO.new(bad_data)
|
85
|
+
lines = []
|
86
|
+
stream = IOStreams::Stream.new(input)
|
87
|
+
stream.stream(:encode, encoding: 'UTF-8', cleaner: :printable, replace: '')
|
88
|
+
count = stream.each_line { |line| lines << line }
|
89
|
+
assert_equal stripped_data.lines.map(&:strip), lines
|
90
|
+
assert_equal stripped_data.lines.count, count
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '.each_row' do
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '.each_record' do
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '.writer' do
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '.writer' do
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '.line_writer' do
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '.row_writer' do
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '.record_writer' do
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class StreamsTest < Minitest::Test
|
4
|
+
describe IOStreams::Streams do
|
5
|
+
let(:file_name) { 'my/path/abc.bcd.xlsx.zip.gz.pgp' }
|
6
|
+
let(:streams) { IOStreams::Streams.new(file_name) }
|
7
|
+
|
8
|
+
describe '#option' do
|
9
|
+
it 'adds one option' do
|
10
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
11
|
+
assert_equal({pgp: {passphrase: 'unlock-me'}}, streams.options)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'adds options in order' do
|
15
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
16
|
+
streams.option(:enc, compress: false)
|
17
|
+
assert_equal({pgp: {passphrase: 'unlock-me'}, enc: {compress: false}}, streams.options)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'will not add an option if a stream was already set' do
|
21
|
+
streams.stream(:pgp, passphrase: 'unlock-me')
|
22
|
+
assert_raises ArgumentError do
|
23
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'will not add an invalid option' do
|
28
|
+
assert_raises ArgumentError do
|
29
|
+
streams.option(:blah, value: 23)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'with no file_name' do
|
34
|
+
let(:file_name) { nil }
|
35
|
+
|
36
|
+
it 'prevents options being set' do
|
37
|
+
assert_raises ArgumentError do
|
38
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#stream' do
|
45
|
+
it 'adds one stream' do
|
46
|
+
streams.stream(:pgp, passphrase: 'unlock-me')
|
47
|
+
assert_equal({pgp: {passphrase: 'unlock-me'}}, streams.streams)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'adds streams in order' do
|
51
|
+
streams.stream(:pgp, passphrase: 'unlock-me')
|
52
|
+
streams.stream(:enc, compress: false)
|
53
|
+
assert_equal({pgp: {passphrase: 'unlock-me'}, enc: {compress: false}}, streams.streams)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'will not add a stream if an option was already set' do
|
57
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
58
|
+
assert_raises ArgumentError do
|
59
|
+
streams.stream(:pgp, passphrase: 'unlock-me')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'will not add an invalid stream' do
|
64
|
+
assert_raises ArgumentError do
|
65
|
+
streams.stream(:blah, value: 23)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#reader' do
|
71
|
+
it 'directly calls block for an empty stream' do
|
72
|
+
string_io = StringIO.new
|
73
|
+
value = nil
|
74
|
+
streams.stream(:none)
|
75
|
+
streams.reader(string_io) do |io|
|
76
|
+
assert_equal io, string_io
|
77
|
+
value = 32
|
78
|
+
end
|
79
|
+
assert_equal 32, value
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns the reader' do
|
83
|
+
string_io = StringIO.new
|
84
|
+
streams.stream(:zip)
|
85
|
+
streams.reader(string_io) do |io|
|
86
|
+
assert io.is_a?(::Zip::InputStream), io
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'returns the last reader' do
|
91
|
+
string_io = StringIO.new
|
92
|
+
streams.stream(:encode)
|
93
|
+
streams.stream(:zip)
|
94
|
+
streams.reader(string_io) do |io|
|
95
|
+
assert io.is_a?(IOStreams::Encode::Reader), io
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#writer' do
|
101
|
+
it 'directly calls block for an empty stream' do
|
102
|
+
string_io = StringIO.new
|
103
|
+
value = nil
|
104
|
+
streams.stream(:none)
|
105
|
+
streams.writer(string_io) do |io|
|
106
|
+
assert_equal io, string_io
|
107
|
+
value = 32
|
108
|
+
end
|
109
|
+
assert_equal 32, value
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'returns the reader' do
|
113
|
+
string_io = StringIO.new
|
114
|
+
streams.stream(:zip)
|
115
|
+
streams.writer(string_io) do |io|
|
116
|
+
assert io.is_a?(::Zip::OutputStream), io
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'returns the last reader' do
|
121
|
+
string_io = StringIO.new
|
122
|
+
streams.stream(:encode)
|
123
|
+
streams.stream(:zip)
|
124
|
+
streams.writer(string_io) do |io|
|
125
|
+
assert io.is_a?(IOStreams::Encode::Writer), io
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Internal methods
|
131
|
+
|
132
|
+
describe '#class_for_stream' do
|
133
|
+
it 'xlsx' do
|
134
|
+
assert_equal IOStreams::Xlsx::Reader, streams.send(:class_for_stream, :reader, :xlsx)
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'gzip' do
|
138
|
+
assert_equal IOStreams::Gzip::Writer, streams.send(:class_for_stream, :writer, :gzip)
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'unknown' do
|
142
|
+
assert_raises ArgumentError do
|
143
|
+
streams.send(:class_for_stream, :reader, :unknown)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#parse_extensions' do
|
149
|
+
it 'single stream' do
|
150
|
+
streams = IOStreams::Streams.new('my/path/abc.xlsx')
|
151
|
+
assert_equal %i[xlsx], streams.send(:parse_extensions)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'empty' do
|
155
|
+
streams = IOStreams::Streams.new('my/path/abc.csv')
|
156
|
+
assert_equal [], streams.send(:parse_extensions)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'handles multiple extensions' do
|
160
|
+
assert_equal %i[xlsx zip gz pgp], streams.send(:parse_extensions)
|
161
|
+
end
|
162
|
+
|
163
|
+
describe 'case-insensitive' do
|
164
|
+
let(:file_name) { 'a.XlsX.GzIp' }
|
165
|
+
|
166
|
+
it 'is case-insensitive' do
|
167
|
+
assert_equal %i[xlsx gzip], streams.send(:parse_extensions)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe '#pipeline' do
|
173
|
+
it 'with stream and file name' do
|
174
|
+
expected = {enc: {compress: false}}
|
175
|
+
streams.stream(:enc, compress: false)
|
176
|
+
assert_equal expected, streams.pipeline
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'no file name, streams, or options' do
|
180
|
+
expected = {}
|
181
|
+
streams = IOStreams::Streams.new
|
182
|
+
assert_equal expected, streams.pipeline
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'file name without options' do
|
186
|
+
expected = {:xlsx => {}, :zip => {}, :gz => {}, :pgp => {}}
|
187
|
+
assert_equal expected, streams.pipeline
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'file name with encode option' do
|
191
|
+
expected = {encode: {encoding: 'BINARY'}, :xlsx => {}, :zip => {}, :gz => {}, :pgp => {}}
|
192
|
+
streams.option(:encode, encoding: 'BINARY')
|
193
|
+
assert_equal expected, streams.pipeline
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'file name with option' do
|
197
|
+
expected = {:xlsx => {}, :zip => {}, :gz => {}, :pgp => {passphrase: 'unlock-me'}}
|
198
|
+
streams.option(:pgp, passphrase: 'unlock-me')
|
199
|
+
assert_equal expected, streams.pipeline
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe '#execute' do
|
204
|
+
it 'directly calls block for an empty stream' do
|
205
|
+
string_io = StringIO.new
|
206
|
+
value = nil
|
207
|
+
streams.send(:execute, :writer, {}, string_io) do |io|
|
208
|
+
assert_equal io, string_io
|
209
|
+
value = 32
|
210
|
+
end
|
211
|
+
assert_equal 32, value
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'calls last block in one element stream' do
|
215
|
+
pipeline = {simple: {arg: 'first'}}
|
216
|
+
string_io = StringIO.new
|
217
|
+
streams.send(:execute, :writer, pipeline, string_io) { |io| io.write('last') }
|
218
|
+
assert_equal 'first>last', string_io.string
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'chains blocks in 2 element stream' do
|
222
|
+
pipeline = {simple: {arg: 'first'}, simple2: {arg: 'second'}}
|
223
|
+
string_io = StringIO.new
|
224
|
+
streams.send(:execute, :writer, pipeline, string_io) { |io| io.write('last') }
|
225
|
+
assert_equal 'second>first>last', string_io.string
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'chains blocks in 3 element stream' do
|
229
|
+
pipeline = {simple: {arg: 'first'}, simple2: {arg: 'second'}, simple3: {arg: 'third'}}
|
230
|
+
string_io = StringIO.new
|
231
|
+
streams.send(:execute, :writer, pipeline, string_io) { |io| io.write('last') }
|
232
|
+
assert_equal 'third>second>first>last', string_io.string
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
class SimpleStream
|
237
|
+
def self.stream(io, **args)
|
238
|
+
yield new(io, **args)
|
239
|
+
end
|
240
|
+
|
241
|
+
def initialize(io, arg:)
|
242
|
+
@io = io
|
243
|
+
@arg = arg
|
244
|
+
end
|
245
|
+
|
246
|
+
def write(data)
|
247
|
+
@io.write("#{@arg}>#{data}")
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
IOStreams.register_extension(:simple, nil, SimpleStream)
|
252
|
+
IOStreams.register_extension(:simple2, nil, SimpleStream)
|
253
|
+
IOStreams.register_extension(:simple3, nil, SimpleStream)
|
254
|
+
end
|
255
|
+
end
|