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
@@ -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,267 +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
- let :gpg_v24_or_above do
31
- ver = IOStreams::Pgp.pgp_version.to_f
32
- ver >= 2.4
33
- end
34
-
35
- before do
36
- # There is a timing issue with creating and then deleting keys.
37
- # Call list_keys again to give GnuPGP time.
38
- IOStreams::Pgp.list_keys(email: email, private: true)
39
- IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
40
- # ap "KEYS DELETED"
41
- # ap IOStreams::Pgp.list_keys(email: email, private: true)
42
- end
43
-
44
- describe ".pgp_version" do
45
- it "returns pgp version" do
46
- assert IOStreams::Pgp.pgp_version
47
- end
48
- end
49
-
50
- describe ".generate_key" do
51
- it "returns the key id" do
52
- assert generated_key_id
53
- end
54
- end
55
-
56
- describe ".key?" do
57
- before do
58
- generated_key_id
59
- # There is a timing issue with creating and then immediately using keys.
60
- # Call list_keys again to give GnuPGP time.
61
- IOStreams::Pgp.list_keys(email: email)
62
- end
63
-
64
- it "confirms public key" do
65
- assert IOStreams::Pgp.key?(key_id: generated_key_id)
66
- end
67
-
68
- it "confirms private key" do
69
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
70
- end
71
- end
72
-
73
- describe ".delete_keys" do
74
- it "handles no keys" do
75
- refute IOStreams::Pgp.delete_keys(email: "random@iostreams.net", public: true, private: true)
76
- end
77
-
78
- it "deletes existing keys with specified email" do
79
- generated_key_id
80
- # There is a timing issue with creating and then deleting keys.
81
- # Call list_keys again to give GnuPGP time.
82
- IOStreams::Pgp.list_keys(email: email, private: true)
83
- assert IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
84
- end
85
-
86
- it "deletes existing keys with specified key_id" do
87
- generated_key_id
88
-
89
- # There is a timing issue with creating and then deleting keys.
90
- # Call list_keys again to give GnuPGP time.
91
- IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
92
- assert IOStreams::Pgp.delete_keys(key_id: generated_key_id, public: true, private: true)
93
- end
94
-
95
- it "deletes just the private key with specified email" do
96
- generated_key_id
97
- # There is a timing issue with creating and then deleting keys.
98
- # Call list_keys again to give GnuPGP time.
99
- IOStreams::Pgp.list_keys(email: email, private: true)
100
- assert IOStreams::Pgp.delete_keys(email: email, public: false, private: true)
101
- refute IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
102
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: false)
103
- end
104
-
105
- it "deletes just the private key with specified key_id" do
106
- generated_key_id
107
- # There is a timing issue with creating and then deleting keys.
108
- # Call list_keys again to give GnuPGP time.
109
- IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
110
- assert IOStreams::Pgp.delete_keys(key_id: generated_key_id, public: false, private: true)
111
- refute IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
112
- assert IOStreams::Pgp.key?(key_id: generated_key_id, private: false)
113
- end
114
- end
115
-
116
- describe ".export" do
117
- before do
118
- generated_key_id
119
- end
120
-
121
- it "exports public keys by email" do
122
- assert ascii_keys = IOStreams::Pgp.export(email: email)
123
- assert ascii_keys =~ /BEGIN PGP PUBLIC KEY BLOCK/, ascii_keys
124
- end
125
-
126
- it "exports public keys as binary" do
127
- assert keys = IOStreams::Pgp.export(email: email, ascii: false)
128
- refute keys =~ /BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK/, keys
129
- end
130
- end
131
-
132
- describe ".list_keys" do
133
- before do
134
- generated_key_id
135
- # There is a timing issue with creating and then immediately using keys.
136
- # Call list_keys again to give GnuPGP time.
137
- IOStreams::Pgp.list_keys(email: email)
138
- end
139
-
140
- it "lists public keys for email" do
141
- assert keys = IOStreams::Pgp.list_keys(email: email)
142
- assert_equal 1, keys.size
143
- assert key = keys.first
144
-
145
- assert_equal Date.today, key[:date]
146
- assert_equal email, key[:email]
147
- assert_includes key[:key_id], generated_key_id
148
- assert_equal 1024, key[:key_length]
149
- assert_includes %w[R rsa], key[:key_type]
150
- assert_equal user_name, key[:name]
151
- refute key[:private], key
152
- ver = IOStreams::Pgp.pgp_version
153
- maint = ver.split(".").last.to_i
154
- assert_equal "ultimate", key[:trust] if (ver.to_f >= 2) && (maint >= 30)
155
- end
156
-
157
- it "lists public keys for key_id" do
158
- assert keys = IOStreams::Pgp.list_keys(key_id: generated_key_id)
159
- assert_equal 1, keys.size
160
- assert key = keys.first
161
-
162
- assert_equal Date.today, key[:date]
163
- assert_equal email, key[:email]
164
- assert_includes key[:key_id], generated_key_id
165
- assert_equal 1024, key[:key_length]
166
- assert_includes %w[R rsa], key[:key_type]
167
- assert_equal user_name, key[:name]
168
- refute key[:private], key
169
- ver = IOStreams::Pgp.pgp_version
170
- maint = ver.split(".").last.to_i
171
- assert_equal "ultimate", key[:trust] if (ver.to_f >= 2) && (maint >= 30)
172
- end
173
-
174
- it "lists private keys for email" do
175
- assert keys = IOStreams::Pgp.list_keys(email: email, private: true)
176
- assert_equal 1, keys.size
177
- assert key = keys.first
178
-
179
- assert_equal Date.today, key[:date]
180
- assert_equal email, key[:email]
181
- assert_includes key[:key_id], generated_key_id
182
- assert_equal 1024, key[:key_length]
183
- assert_includes %w[R rsa], key[:key_type]
184
- assert_equal user_name, key[:name]
185
- assert key[:private], key
186
- end
187
-
188
- it "lists private keys for key_id" do
189
- assert keys = IOStreams::Pgp.list_keys(key_id: generated_key_id, private: true)
190
- assert_equal 1, keys.size
191
- assert key = keys.first
192
-
193
- assert_equal Date.today, key[:date]
194
- assert_equal email, key[:email]
195
- assert_includes key[:key_id], generated_key_id
196
- assert_equal 1024, key[:key_length]
197
- assert_includes %w[R rsa], key[:key_type]
198
- assert_equal user_name, key[:name]
199
- assert key[:private], key
200
- end
201
- end
202
-
203
- describe ".key_info" do
204
- it "extracts public key info" do
205
- assert keys = IOStreams::Pgp.key_info(key: public_key)
206
- assert_equal 1, keys.size
207
- assert key = keys.first
208
-
209
- assert_equal Date.today, key[:date]
210
- assert_equal email, key[:email]
211
- assert_includes key[:key_id], generated_key_id
212
- assert_equal 1024, key[:key_length]
213
- assert_includes %w[R rsa], key[:key_type]
214
- assert_equal user_name, key[:name]
215
- refute key[:private], key
216
- refute key.key?(:trust)
217
- end
218
- end
219
-
220
- describe ".import" do
221
- it "handle duplicate public key" do
222
- generated_key_id
223
- assert_equal [], IOStreams::Pgp.import(key: public_key)
224
- end
225
-
226
- describe "without keys" do
227
- before do
228
- @public_key = public_key
229
- # There is a timing issue with creating and then deleting keys.
230
- # Call list_keys again to give GnuPGP time.
231
- IOStreams::Pgp.list_keys(email: email, private: true)
232
- IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
233
- end
234
-
235
- it "imports ascii public key" do
236
- assert keys = IOStreams::Pgp.import(key: @public_key)
237
- assert_equal 1, keys.size
238
- assert key = keys.first
239
-
240
- assert_equal email, key[:email] if key.key?(:email)
241
- # Allow for different key_id formats between GnuPG versions
242
- # Older versions return the full key ID, while 2.4+ returns shorter key IDs
243
- assert generated_key_id.end_with?(key[:key_id]) || key[:key_id].end_with?(generated_key_id),
244
- "Key ID #{key[:key_id]} doesn't match expected pattern with #{generated_key_id}"
245
- # Skip name assertion for GnuPG 2.4+
246
- assert_equal user_name, key[:name] if key.key?(:name) && !gpg_v24_or_above
247
- refute key[:private], key if key.key?(:private)
248
- end
249
-
250
- it "imports binary public key" do
251
- assert keys = IOStreams::Pgp.import(key: @public_key)
252
- assert_equal 1, keys.size
253
- assert key = keys.first
254
-
255
- assert_equal email, key[:email] if key.key?(:email)
256
- # Allow for different key_id formats between GnuPG versions
257
- # Older versions return the full key ID, while 2.4+ returns shorter key IDs
258
- assert generated_key_id.end_with?(key[:key_id]) || key[:key_id].end_with?(generated_key_id),
259
- "Key ID #{key[:key_id]} doesn't match expected pattern with #{generated_key_id}"
260
- # Skip name assertion for GnuPG 2.4+
261
- assert_equal user_name, key[:name] if key.key?(:name) && !gpg_v24_or_above
262
- refute key[:private], key if key.key?(:private)
263
- end
264
- end
265
- end
266
- end
267
- 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