iostreams 1.10.3 → 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 (93) 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 +10 -10
  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 +47 -21
  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 +25 -11
  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 +22 -3
  18. data/lib/io_streams/paths/sftp.rb +9 -10
  19. data/lib/io_streams/pgp/reader.rb +25 -7
  20. data/lib/io_streams/pgp/writer.rb +95 -29
  21. data/lib/io_streams/pgp.rb +289 -87
  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 +6 -8
  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 -113
  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/files/utf16_test.csv +0 -0
  68. data/test/gzip_reader_test.rb +0 -27
  69. data/test/gzip_writer_test.rb +0 -52
  70. data/test/io_streams_test.rb +0 -132
  71. data/test/line_reader_test.rb +0 -325
  72. data/test/line_writer_test.rb +0 -59
  73. data/test/minimal_file_reader.rb +0 -25
  74. data/test/path_test.rb +0 -55
  75. data/test/paths/file_test.rb +0 -202
  76. data/test/paths/http_test.rb +0 -34
  77. data/test/paths/matcher_test.rb +0 -120
  78. data/test/paths/s3_test.rb +0 -220
  79. data/test/paths/sftp_test.rb +0 -106
  80. data/test/pgp_reader_test.rb +0 -46
  81. data/test/pgp_test.rb +0 -254
  82. data/test/pgp_writer_test.rb +0 -130
  83. data/test/record_reader_test.rb +0 -60
  84. data/test/record_writer_test.rb +0 -82
  85. data/test/row_reader_test.rb +0 -35
  86. data/test/row_writer_test.rb +0 -56
  87. data/test/stream_test.rb +0 -574
  88. data/test/tabular_test.rb +0 -338
  89. data/test/test_helper.rb +0 -40
  90. data/test/utils_test.rb +0 -20
  91. data/test/xlsx_reader_test.rb +0 -37
  92. data/test/zip_reader_test.rb +0 -53
  93. data/test/zip_writer_test.rb +0 -48
@@ -1,46 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class PgpReaderTest < Minitest::Test
4
- describe IOStreams::Pgp::Reader do
5
- let :temp_file do
6
- Tempfile.new("iostreams")
7
- end
8
-
9
- let :decrypted do
10
- file_name = File.join(File.dirname(__FILE__), "files", "text.txt")
11
- File.read(file_name)
12
- end
13
-
14
- after do
15
- temp_file.delete
16
- end
17
-
18
- describe ".file" do
19
- it "reads encrypted file" do
20
- IOStreams::Pgp::Writer.file(temp_file.path, recipient: "receiver@example.org") do |io|
21
- io.write(decrypted)
22
- end
23
-
24
- result = IOStreams::Pgp::Reader.file(temp_file.path, passphrase: "receiver_passphrase", &:read)
25
- assert_equal decrypted, result
26
- end
27
-
28
- it "fails with bad passphrase" do
29
- assert_raises IOStreams::Pgp::Failure do
30
- IOStreams::Pgp::Reader.file(temp_file.path, passphrase: "BAD", &:read)
31
- end
32
- end
33
-
34
- it "streams input" do
35
- io_string = StringIO.new("".b)
36
- IOStreams::Pgp::Writer.stream(io_string, recipient: "receiver@example.org", signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
37
- io.write(decrypted)
38
- end
39
-
40
- io = StringIO.new(io_string.string)
41
- result = IOStreams::Pgp::Reader.stream(io, passphrase: "receiver_passphrase", &:read)
42
- assert_equal decrypted, result
43
- end
44
- end
45
- end
46
- end
data/test/pgp_test.rb DELETED
@@ -1,254 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- # Turn on logging if experiencing issues with new versions of gpg
4
- # require "logger"
5
- # IOStreams::Pgp.logger = Logger.new(STDOUT)
6
-
7
- class PgpTest < Minitest::Test
8
- describe IOStreams::Pgp do
9
- let :user_name do
10
- "Joe Bloggs"
11
- end
12
-
13
- let :email do
14
- "pgp_test@iostreams.net"
15
- end
16
-
17
- let :passphrase do
18
- "hello"
19
- end
20
-
21
- let :generated_key_id do
22
- IOStreams::Pgp.generate_key(name: user_name, email: email, key_length: 1024, passphrase: passphrase)
23
- end
24
-
25
- let :public_key do
26
- generated_key_id
27
- IOStreams::Pgp.export(email: email)
28
- end
29
-
30
- before do
31
- # There is a timing issue with creating and then deleting keys.
32
- # Call list_keys again to give GnuPGP time.
33
- IOStreams::Pgp.list_keys(email: email, private: true)
34
- IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
35
- # ap "KEYS DELETED"
36
- # ap IOStreams::Pgp.list_keys(email: email, private: true)
37
- end
38
-
39
- describe ".pgp_version" do
40
- it "returns pgp version" do
41
- assert IOStreams::Pgp.pgp_version
42
- end
43
- end
44
-
45
- describe ".generate_key" do
46
- it "returns the key id" do
47
- assert generated_key_id
48
- end
49
- end
50
-
51
- describe ".key?" do
52
- before do
53
- generated_key_id
54
- # There is a timing issue with creating and then immediately using keys.
55
- # Call list_keys again to give GnuPGP time.
56
- IOStreams::Pgp.list_keys(email: email)
57
- end
58
-
59
- it "confirms public key" do
60
- assert IOStreams::Pgp.key?(key_id: generated_key_id)
61
- end
62
-
63
- it "confirms private key" do
64
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
65
- end
66
- end
67
-
68
- describe ".delete_keys" do
69
- it "handles no keys" do
70
- refute IOStreams::Pgp.delete_keys(email: "random@iostreams.net", public: true, private: true)
71
- end
72
-
73
- it "deletes existing keys with specified email" do
74
- generated_key_id
75
- # There is a timing issue with creating and then deleting keys.
76
- # Call list_keys again to give GnuPGP time.
77
- IOStreams::Pgp.list_keys(email: email, private: true)
78
- assert IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
79
- end
80
-
81
- it "deletes existing keys with specified key_id" do
82
- generated_key_id
83
-
84
- # There is a timing issue with creating and then deleting keys.
85
- # Call list_keys again to give GnuPGP time.
86
- IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
87
- assert IOStreams::Pgp.delete_keys(key_id: generated_key_id, public: true, private: true)
88
- end
89
-
90
- it "deletes just the private key with specified email" do
91
- generated_key_id
92
- # There is a timing issue with creating and then deleting keys.
93
- # Call list_keys again to give GnuPGP time.
94
- IOStreams::Pgp.list_keys(email: email, private: true)
95
- assert IOStreams::Pgp.delete_keys(email: email, public: false, private: true)
96
- refute IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
97
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: false)
98
- end
99
-
100
- it "deletes just the private key with specified key_id" do
101
- generated_key_id
102
- # There is a timing issue with creating and then deleting keys.
103
- # Call list_keys again to give GnuPGP time.
104
- IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
105
- assert IOStreams::Pgp.delete_keys(key_id: generated_key_id, public: false, private: true)
106
- refute IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
107
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: false)
108
- end
109
- end
110
-
111
- describe ".export" do
112
- before do
113
- generated_key_id
114
- end
115
-
116
- it "exports public keys by email" do
117
- assert ascii_keys = IOStreams::Pgp.export(email: email)
118
- assert ascii_keys =~ /BEGIN PGP PUBLIC KEY BLOCK/, ascii_keys
119
- end
120
-
121
- it "exports public keys as binary" do
122
- assert keys = IOStreams::Pgp.export(email: email, ascii: false)
123
- refute keys =~ /BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK/, keys
124
- end
125
- end
126
-
127
- describe ".list_keys" do
128
- before do
129
- generated_key_id
130
- # There is a timing issue with creating and then immediately using keys.
131
- # Call list_keys again to give GnuPGP time.
132
- IOStreams::Pgp.list_keys(email: email)
133
- end
134
-
135
- it "lists public keys for email" do
136
- assert keys = IOStreams::Pgp.list_keys(email: email)
137
- assert_equal 1, keys.size
138
- assert key = keys.first
139
-
140
- assert_equal Date.today, key[:date]
141
- assert_equal email, key[:email]
142
- assert_includes key[:key_id], generated_key_id
143
- assert_equal 1024, key[:key_length]
144
- assert_includes %w[R rsa], key[:key_type]
145
- assert_equal user_name, key[:name]
146
- refute key[:private], key
147
- ver = IOStreams::Pgp.pgp_version
148
- maint = ver.split(".").last.to_i
149
- assert_equal "ultimate", key[:trust] if (ver.to_f >= 2) && (maint >= 30)
150
- end
151
-
152
- it "lists public keys for key_id" do
153
- assert keys = IOStreams::Pgp.list_keys(key_id: generated_key_id)
154
- assert_equal 1, keys.size
155
- assert key = keys.first
156
-
157
- assert_equal Date.today, key[:date]
158
- assert_equal email, key[:email]
159
- assert_includes key[:key_id], generated_key_id
160
- assert_equal 1024, key[:key_length]
161
- assert_includes %w[R rsa], key[:key_type]
162
- assert_equal user_name, key[:name]
163
- refute key[:private], key
164
- ver = IOStreams::Pgp.pgp_version
165
- maint = ver.split(".").last.to_i
166
- assert_equal "ultimate", key[:trust] if (ver.to_f >= 2) && (maint >= 30)
167
- end
168
-
169
- it "lists private keys for email" do
170
- assert keys = IOStreams::Pgp.list_keys(email: email, private: true)
171
- assert_equal 1, keys.size
172
- assert key = keys.first
173
-
174
- assert_equal Date.today, key[:date]
175
- assert_equal email, key[:email]
176
- assert_includes key[:key_id], generated_key_id
177
- assert_equal 1024, key[:key_length]
178
- assert_includes %w[R rsa], key[:key_type]
179
- assert_equal user_name, key[:name]
180
- assert key[:private], key
181
- end
182
-
183
- it "lists private keys for key_id" do
184
- assert keys = IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
185
- assert_equal 1, keys.size
186
- assert key = keys.first
187
-
188
- assert_equal Date.today, key[:date]
189
- assert_equal email, key[:email]
190
- assert_includes key[:key_id], generated_key_id
191
- assert_equal 1024, key[:key_length]
192
- assert_includes %w[R rsa], key[:key_type]
193
- assert_equal user_name, key[:name]
194
- assert key[:private], key
195
- end
196
- end
197
-
198
- describe ".key_info" do
199
- it "extracts public key info" do
200
- assert keys = IOStreams::Pgp.key_info(key: public_key)
201
- assert_equal 1, keys.size
202
- assert key = keys.first
203
-
204
- assert_equal Date.today, key[:date]
205
- assert_equal email, key[:email]
206
- assert_includes key[:key_id], generated_key_id
207
- assert_equal 1024, key[:key_length]
208
- assert_includes %w[R rsa], key[:key_type]
209
- assert_equal user_name, key[:name]
210
- refute key[:private], key
211
- refute key.key?(:trust)
212
- end
213
- end
214
-
215
- describe ".import" do
216
- it "handle duplicate public key" do
217
- generated_key_id
218
- assert_equal [], IOStreams::Pgp.import(key: public_key)
219
- end
220
-
221
- describe "without keys" do
222
- before do
223
- @public_key = public_key
224
- # There is a timing issue with creating and then deleting keys.
225
- # Call list_keys again to give GnuPGP time.
226
- IOStreams::Pgp.list_keys(email: email, private: true)
227
- IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
228
- end
229
-
230
- it "imports ascii public key" do
231
- assert keys = IOStreams::Pgp.import(key: @public_key)
232
- assert_equal 1, keys.size
233
- assert key = keys.first
234
-
235
- assert_equal email, key[:email]
236
- assert_equal generated_key_id, key[:key_id]
237
- assert_equal user_name, key[:name]
238
- refute key[:private], key
239
- end
240
-
241
- it "imports binary public key" do
242
- assert keys = IOStreams::Pgp.import(key: @public_key)
243
- assert_equal 1, keys.size
244
- assert key = keys.first
245
-
246
- assert_equal email, key[:email]
247
- assert_equal generated_key_id, key[:key_id]
248
- assert_equal user_name, key[:name]
249
- refute key[:private], key
250
- end
251
- end
252
- end
253
- end
254
- end
@@ -1,130 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class PgpWriterTest < Minitest::Test
4
- describe IOStreams::Pgp::Writer do
5
- let :temp_file do
6
- Tempfile.new("iostreams")
7
- end
8
-
9
- let :file_name do
10
- temp_file.path
11
- end
12
-
13
- let :decrypted do
14
- file_name = File.join(File.dirname(__FILE__), "files", "text.txt")
15
- File.read(file_name)
16
- end
17
-
18
- after do
19
- temp_file.delete
20
- end
21
-
22
- describe ".file" do
23
- it "writes encrypted text file" do
24
- result =
25
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org") do |io|
26
- io.write(decrypted)
27
- 53534
28
- end
29
- assert_equal 53534, result
30
-
31
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
32
- assert_equal decrypted, result
33
- end
34
-
35
- it "writes encrypted binary file" do
36
- binary_file_name = File.join(File.dirname(__FILE__), "files", "spreadsheet.xlsx")
37
- binary_data = File.open(binary_file_name, "rb", &:read)
38
-
39
- File.open(binary_file_name, "rb") do |input|
40
- result =
41
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org") do |output|
42
- IO.copy_stream(input, output)
43
- 53534
44
- end
45
- assert_equal 53534, result
46
- end
47
-
48
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
49
- assert_equal binary_data, result
50
- end
51
-
52
- it "writes and signs encrypted file" do
53
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org", signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
54
- io.write(decrypted)
55
- end
56
-
57
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
58
- assert_equal decrypted, result
59
- end
60
-
61
- it "supports multiple recipients" do
62
- IOStreams::Pgp::Writer.file(file_name, recipient: %w[receiver@example.org receiver2@example.org], signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
63
- io.write(decrypted)
64
- end
65
-
66
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
67
- assert_equal decrypted, result
68
-
69
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver2_passphrase", &:read)
70
- assert_equal decrypted, result
71
- end
72
-
73
- it "encrypts for recipient and audit recipient" do
74
- IOStreams::Pgp::Writer.stub(:audit_recipient, "receiver2@example.org") do
75
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org", signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
76
- io.write(decrypted)
77
- end
78
- end
79
-
80
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
81
- assert_equal decrypted, result
82
-
83
- result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver2_passphrase", &:read)
84
- assert_equal decrypted, result
85
- end
86
-
87
- it "fails with bad signer passphrase" do
88
- skip "GnuPG v2.1 and above passes when it should not" if IOStreams::Pgp.pgp_version.to_f >= 2.1
89
- assert_raises IOStreams::Pgp::Failure do
90
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org", signer: "sender@example.org", signer_passphrase: "BAD") do |io|
91
- io.write(decrypted)
92
- end
93
- end
94
- end
95
-
96
- it "fails with bad recipient" do
97
- assert_raises IOStreams::Pgp::Failure do
98
- IOStreams::Pgp::Writer.file(file_name, recipient: "BAD@example.org", signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
99
- io.write(decrypted)
100
- # Allow process to terminate
101
- sleep 1
102
- io.write(decrypted)
103
- end
104
- end
105
- end
106
-
107
- it "fails with bad signer" do
108
- assert_raises IOStreams::Pgp::Failure do
109
- IOStreams::Pgp::Writer.file(file_name, recipient: "receiver@example.org", signer: "BAD@example.org", signer_passphrase: "sender_passphrase") do |io|
110
- io.write(decrypted)
111
- end
112
- end
113
- end
114
-
115
- it "writes to a stream" do
116
- io_string = StringIO.new("".b)
117
- result =
118
- IOStreams::Pgp::Writer.stream(io_string, recipient: "receiver@example.org", signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
119
- io.write(decrypted)
120
- 53534
121
- end
122
- assert_equal 53534, result
123
-
124
- io = StringIO.new(io_string.string)
125
- result = IOStreams::Pgp::Reader.stream(io, passphrase: "receiver_passphrase", &:read)
126
- assert_equal decrypted, result
127
- end
128
- end
129
- end
130
- end
@@ -1,60 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class RecordReaderTest < Minitest::Test
4
- describe IOStreams::Record::Reader do
5
- let :file_name do
6
- File.join(File.dirname(__FILE__), "files", "test.csv")
7
- end
8
-
9
- let :json_file_name do
10
- File.join(File.dirname(__FILE__), "files", "test.json")
11
- end
12
-
13
- let :csv_rows do
14
- CSV.read(file_name)
15
- end
16
-
17
- let :expected do
18
- rows = csv_rows.dup
19
- header = rows.shift
20
- rows.collect { |row| header.zip(row).to_h }
21
- end
22
-
23
- describe "#each" do
24
- it "csv file" do
25
- records = []
26
- IOStreams::Record::Reader.file(file_name, cleanse_header: false) do |io|
27
- io.each { |row| records << row }
28
- end
29
- assert_equal expected, records
30
- end
31
-
32
- it "json file" do
33
- records = []
34
- IOStreams::Record::Reader.file(json_file_name, cleanse_header: false, format: :json) do |input|
35
- input.each { |row| records << row }
36
- end
37
- assert_equal expected, records
38
- end
39
-
40
- it "stream" do
41
- rows = []
42
- IOStreams::Line::Reader.file(file_name) do |file|
43
- IOStreams::Record::Reader.stream(file, cleanse_header: false) do |io|
44
- io.each { |row| rows << row }
45
- end
46
- end
47
- assert_equal expected, rows
48
- end
49
- end
50
-
51
- describe "#collect" do
52
- it "json file" do
53
- records = IOStreams::Record::Reader.file(json_file_name, format: :json) do |input|
54
- input.collect { |record| record["state"] }
55
- end
56
- assert_equal expected.collect { |record| record["state"] }, records
57
- end
58
- end
59
- end
60
- end
@@ -1,82 +0,0 @@
1
- require_relative "test_helper"
2
- require "csv"
3
-
4
- class RecordWriterTest < Minitest::Test
5
- describe IOStreams::Record::Writer do
6
- let :csv_file_name do
7
- File.join(File.dirname(__FILE__), "files", "test.csv")
8
- end
9
-
10
- let :json_file_name do
11
- File.join(File.dirname(__FILE__), "files", "test.json")
12
- end
13
-
14
- let :raw_csv_data do
15
- File.read(csv_file_name)
16
- end
17
-
18
- let :raw_json_data do
19
- File.read(json_file_name)
20
- end
21
-
22
- let :csv_rows do
23
- CSV.read(csv_file_name)
24
- end
25
-
26
- let :inputs do
27
- rows = csv_rows.dup
28
- header = rows.shift
29
- rows.collect { |row| header.zip(row).to_h }
30
- end
31
-
32
- let :temp_file do
33
- Tempfile.new("iostreams")
34
- end
35
-
36
- let :file_name do
37
- temp_file.path
38
- end
39
-
40
- after do
41
- temp_file.delete
42
- end
43
-
44
- describe "#<<" do
45
- it "file" do
46
- result =
47
- IOStreams::Record::Writer.file(file_name) do |io|
48
- inputs.each { |hash| io << hash }
49
- 53534
50
- end
51
- assert_equal 53534, result
52
- result = File.read(file_name)
53
- assert_equal raw_csv_data, result
54
- end
55
-
56
- it "json file" do
57
- result =
58
- IOStreams::Record::Writer.file(file_name, file_name: "abc.json") do |io|
59
- inputs.each { |hash| io << hash }
60
- 53534
61
- end
62
- assert_equal 53534, result
63
-
64
- result = File.read(file_name)
65
- assert_equal raw_json_data, result
66
- end
67
-
68
- it "stream" do
69
- io_string = StringIO.new
70
- result =
71
- IOStreams::Line::Writer.stream(io_string) do |io|
72
- IOStreams::Record::Writer.stream(io) do |stream|
73
- inputs.each { |row| stream << row }
74
- 53534
75
- end
76
- end
77
- assert_equal 53534, result
78
- assert_equal raw_csv_data, io_string.string
79
- end
80
- end
81
- end
82
- end
@@ -1,35 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class RowReaderTest < Minitest::Test
4
- describe IOStreams::Row::Reader do
5
- let :file_name do
6
- File.join(File.dirname(__FILE__), "files", "test.csv")
7
- end
8
-
9
- let :expected do
10
- CSV.read(file_name)
11
- end
12
-
13
- describe "#each" do
14
- it "file" do
15
- rows = []
16
- count = IOStreams::Row::Reader.file(file_name) do |io|
17
- io.each { |row| rows << row }
18
- end
19
- assert_equal expected, rows
20
- assert_equal expected.size, count
21
- end
22
-
23
- it "stream" do
24
- rows = []
25
- count = IOStreams::Line::Reader.file(file_name) do |file|
26
- IOStreams::Row::Reader.stream(file) do |io|
27
- io.each { |row| rows << row }
28
- end
29
- end
30
- assert_equal expected, rows
31
- assert_equal expected.size, count
32
- end
33
- end
34
- end
35
- end
@@ -1,56 +0,0 @@
1
- require_relative "test_helper"
2
- require "csv"
3
-
4
- class RowWriterTest < Minitest::Test
5
- describe IOStreams::Row::Writer do
6
- let :csv_file_name do
7
- File.join(File.dirname(__FILE__), "files", "test.csv")
8
- end
9
-
10
- let :raw_csv_data do
11
- File.read(csv_file_name)
12
- end
13
-
14
- let :csv_rows do
15
- CSV.read(csv_file_name)
16
- end
17
-
18
- let :temp_file do
19
- Tempfile.new("iostreams")
20
- end
21
-
22
- let :file_name do
23
- temp_file.path
24
- end
25
-
26
- after do
27
- temp_file.delete
28
- end
29
-
30
- describe ".stream" do
31
- it "file" do
32
- result =
33
- IOStreams::Row::Writer.file(file_name) do |io|
34
- csv_rows.each { |array| io << array }
35
- 53534
36
- end
37
- assert_equal 53534, result
38
- result = ::File.read(file_name)
39
- assert_equal raw_csv_data, result
40
- end
41
-
42
- it "streams" do
43
- io_string = StringIO.new
44
- result =
45
- IOStreams::Line::Writer.stream(io_string) do |io|
46
- IOStreams::Row::Writer.stream(io) do |stream|
47
- csv_rows.each { |array| stream << array }
48
- 53534
49
- end
50
- end
51
- assert_equal 53534, result
52
- assert_equal raw_csv_data, io_string.string
53
- end
54
- end
55
- end
56
- end