iostreams 1.2.1 → 1.4.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.
- checksums.yaml +4 -4
- data/README.md +6 -3
- data/lib/io_streams/builder.rb +9 -6
- data/lib/io_streams/bzip2/reader.rb +5 -3
- data/lib/io_streams/bzip2/writer.rb +5 -3
- data/lib/io_streams/deprecated.rb +1 -1
- data/lib/io_streams/encode/reader.rb +1 -1
- data/lib/io_streams/encode/writer.rb +1 -1
- data/lib/io_streams/errors.rb +10 -0
- data/lib/io_streams/io_streams.rb +1 -1
- data/lib/io_streams/paths/file.rb +4 -4
- data/lib/io_streams/paths/http.rb +6 -3
- data/lib/io_streams/paths/s3.rb +27 -8
- data/lib/io_streams/paths/sftp.rb +16 -4
- data/lib/io_streams/pgp.rb +80 -61
- data/lib/io_streams/stream.rb +20 -9
- data/lib/io_streams/tabular.rb +5 -2
- data/lib/io_streams/tabular/header.rb +14 -12
- data/lib/io_streams/tabular/parser/fixed.rb +135 -25
- data/lib/io_streams/utils.rb +4 -4
- data/lib/io_streams/version.rb +1 -1
- data/lib/io_streams/zip/reader.rb +1 -1
- data/test/bzip2_writer_test.rb +6 -4
- data/test/io_streams_test.rb +2 -2
- data/test/paths/file_test.rb +1 -1
- data/test/paths/s3_test.rb +3 -3
- data/test/paths/sftp_test.rb +4 -4
- data/test/pgp_test.rb +54 -4
- data/test/pgp_writer_test.rb +3 -3
- data/test/tabular_test.rb +55 -26
- data/test/test_helper.rb +1 -1
- metadata +3 -3
data/test/paths/sftp_test.rb
CHANGED
@@ -42,7 +42,7 @@ module Paths
|
|
42
42
|
|
43
43
|
describe "#reader" do
|
44
44
|
it "reads" do
|
45
|
-
assert_equal raw, existing_path.
|
45
|
+
assert_equal raw, existing_path.read
|
46
46
|
end
|
47
47
|
|
48
48
|
it "fails when the file does not exist" do
|
@@ -60,7 +60,7 @@ module Paths
|
|
60
60
|
|
61
61
|
describe "#writer" do
|
62
62
|
it "writes" do
|
63
|
-
assert_equal
|
63
|
+
assert_equal(raw.size, write_path.writer { |io| io.write(raw) })
|
64
64
|
assert_equal raw, write_path.read
|
65
65
|
end
|
66
66
|
|
@@ -77,7 +77,7 @@ module Paths
|
|
77
77
|
|
78
78
|
it "writes" do
|
79
79
|
skip "No identity file env var set: SFTP_IDENTITY_FILE" unless ENV["SFTP_IDENTITY_FILE"]
|
80
|
-
assert_equal
|
80
|
+
assert_equal(raw.size, write_path.writer { |io| io.write(raw) })
|
81
81
|
assert_equal raw, write_path.read
|
82
82
|
end
|
83
83
|
end
|
@@ -90,7 +90,7 @@ module Paths
|
|
90
90
|
|
91
91
|
it "writes" do
|
92
92
|
skip "No identity file env var set: SFTP_IDENTITY_FILE" unless ENV["SFTP_IDENTITY_FILE"]
|
93
|
-
assert_equal
|
93
|
+
assert_equal(raw.size, write_path.writer { |io| io.write(raw) })
|
94
94
|
assert_equal raw, write_path.read
|
95
95
|
end
|
96
96
|
end
|
data/test/pgp_test.rb
CHANGED
@@ -70,7 +70,7 @@ class PgpTest < Minitest::Test
|
|
70
70
|
refute IOStreams::Pgp.delete_keys(email: "random@iostreams.net", public: true, private: true)
|
71
71
|
end
|
72
72
|
|
73
|
-
it "deletes existing keys" do
|
73
|
+
it "deletes existing keys with specified email" do
|
74
74
|
generated_key_id
|
75
75
|
# There is a timing issue with creating and then deleting keys.
|
76
76
|
# Call list_keys again to give GnuPGP time.
|
@@ -78,7 +78,16 @@ class PgpTest < Minitest::Test
|
|
78
78
|
assert IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
|
79
79
|
end
|
80
80
|
|
81
|
-
it "deletes
|
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
|
82
91
|
generated_key_id
|
83
92
|
# There is a timing issue with creating and then deleting keys.
|
84
93
|
# Call list_keys again to give GnuPGP time.
|
@@ -87,6 +96,16 @@ class PgpTest < Minitest::Test
|
|
87
96
|
refute IOStreams::Pgp.key?(key_id: generated_key_id, private: true)
|
88
97
|
assert IOStreams::Pgp.key?(key_id: generated_key_id, private: false)
|
89
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
|
90
109
|
end
|
91
110
|
|
92
111
|
describe ".export" do
|
@@ -113,7 +132,7 @@ class PgpTest < Minitest::Test
|
|
113
132
|
IOStreams::Pgp.list_keys(email: email)
|
114
133
|
end
|
115
134
|
|
116
|
-
it "lists public keys" do
|
135
|
+
it "lists public keys for email" do
|
117
136
|
assert keys = IOStreams::Pgp.list_keys(email: email)
|
118
137
|
assert_equal 1, keys.size
|
119
138
|
assert key = keys.first
|
@@ -130,7 +149,24 @@ class PgpTest < Minitest::Test
|
|
130
149
|
assert_equal "ultimate", key[:trust] if (ver.to_f >= 2) && (maint >= 30)
|
131
150
|
end
|
132
151
|
|
133
|
-
it "lists
|
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
|
134
170
|
assert keys = IOStreams::Pgp.list_keys(email: email, private: true)
|
135
171
|
assert_equal 1, keys.size
|
136
172
|
assert key = keys.first
|
@@ -143,6 +179,20 @@ class PgpTest < Minitest::Test
|
|
143
179
|
assert_equal user_name, key[:name]
|
144
180
|
assert key[:private], key
|
145
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
|
146
196
|
end
|
147
197
|
|
148
198
|
describe ".key_info" do
|
data/test/pgp_writer_test.rb
CHANGED
@@ -53,9 +53,9 @@ class PgpWriterTest < Minitest::Test
|
|
53
53
|
end
|
54
54
|
|
55
55
|
it "supports multiple recipients" do
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
IOStreams::Pgp::Writer.file(file_name, recipient: %w[receiver@example.org receiver2@example.org], signer: "sender@example.org", signer_passphrase: "sender_passphrase") do |io|
|
57
|
+
io.write(decrypted)
|
58
|
+
end
|
59
59
|
|
60
60
|
result = IOStreams::Pgp::Reader.file(file_name, passphrase: "receiver_passphrase", &:read)
|
61
61
|
assert_equal decrypted, result
|
data/test/tabular_test.rb
CHANGED
@@ -138,33 +138,47 @@ class TabularTest < Minitest::Test
|
|
138
138
|
describe ":fixed format" do
|
139
139
|
let :tabular do
|
140
140
|
layout = [
|
141
|
-
{
|
142
|
-
{
|
143
|
-
{
|
141
|
+
{size: 23, key: :name},
|
142
|
+
{size: 40, key: :address},
|
143
|
+
{size: 2},
|
144
|
+
{size: 5, key: :zip, type: :integer},
|
145
|
+
{size: 8, key: :age, type: :integer},
|
146
|
+
{size: 10, key: :weight, type: :float, decimals: 2}
|
144
147
|
]
|
145
148
|
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
146
149
|
end
|
147
150
|
|
148
151
|
it "parses to hash" do
|
149
|
-
assert hash = tabular.record_parse("Jack over there
|
150
|
-
assert_equal({
|
152
|
+
assert hash = tabular.record_parse("Jack over there XX34618012345670012345.01")
|
153
|
+
assert_equal({name: "Jack", address: "over there", zip: 34_618, age: 1_234_567, weight: 12_345.01}, hash)
|
151
154
|
end
|
152
155
|
|
153
156
|
it "parses short string" do
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
+
assert_raises IOStreams::Errors::InvalidLineLength do
|
158
|
+
tabular.record_parse("Jack over th")
|
159
|
+
end
|
157
160
|
end
|
158
161
|
|
159
162
|
it "parses longer string" do
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
+
assert_raises IOStreams::Errors::InvalidLineLength do
|
164
|
+
tabular.record_parse("Jack over there XX34618012345670012345.01............")
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it "parses zero values" do
|
169
|
+
assert hash = tabular.record_parse(" 00000000000000000000000")
|
170
|
+
assert_equal({name: "", address: "", zip: 0, age: 0, weight: 0.0}, hash)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "parses empty values" do
|
174
|
+
assert hash = tabular.record_parse(" XX ")
|
175
|
+
assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
|
163
176
|
end
|
164
177
|
|
165
|
-
it "parses
|
166
|
-
|
167
|
-
|
178
|
+
it "parses blank strings" do
|
179
|
+
skip "TODO: Part of tabular refactor to get this working"
|
180
|
+
assert hash = tabular.record_parse(" ")
|
181
|
+
assert_equal({name: "", address: "", zip: nil, age: nil, weight: nil}, hash)
|
168
182
|
end
|
169
183
|
|
170
184
|
it "parses nil data as nil" do
|
@@ -224,31 +238,46 @@ class TabularTest < Minitest::Test
|
|
224
238
|
describe ":fixed format" do
|
225
239
|
let :tabular do
|
226
240
|
layout = [
|
227
|
-
{
|
228
|
-
{
|
229
|
-
{
|
241
|
+
{size: 23, key: :name},
|
242
|
+
{size: 40, key: :address},
|
243
|
+
{size: 2},
|
244
|
+
{size: 5, key: :zip, type: :integer},
|
245
|
+
{size: 8, key: :age, type: :integer},
|
246
|
+
{size: 10, key: :weight, type: :float, decimals: 2}
|
230
247
|
]
|
231
248
|
IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
|
232
249
|
end
|
233
250
|
|
234
251
|
it "renders fixed data" do
|
235
|
-
assert string = tabular.render(
|
236
|
-
assert_equal "Jack over there
|
252
|
+
assert string = tabular.render(name: "Jack", address: "over there", zip: 34_618, weight: 123_456.789123, age: 21)
|
253
|
+
assert_equal "Jack over there 34618000000210123456.79", string
|
237
254
|
end
|
238
255
|
|
239
|
-
it "truncates long
|
240
|
-
assert string = tabular.render(
|
241
|
-
assert_equal "Jack
|
256
|
+
it "truncates long strings" do
|
257
|
+
assert string = tabular.render(name: "Jack ran up the beanstalk and when jack reached the top it was truncated", address: "over there", zip: 34_618)
|
258
|
+
assert_equal "Jack ran up the beanstaover there 34618000000000000000.00", string
|
259
|
+
end
|
260
|
+
|
261
|
+
it "when integer is too large" do
|
262
|
+
assert_raises IOStreams::Errors::ValueTooLong do
|
263
|
+
tabular.render(zip: 3_461_832_653_653_265)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
it "when float is too large" do
|
268
|
+
assert_raises IOStreams::Errors::ValueTooLong do
|
269
|
+
tabular.render(weight: 3_461_832_653_653_265.234)
|
270
|
+
end
|
242
271
|
end
|
243
272
|
|
244
273
|
it "renders nil as empty string" do
|
245
|
-
assert string = tabular.render(
|
246
|
-
assert_equal "
|
274
|
+
assert string = tabular.render(zip: 34_618)
|
275
|
+
assert_equal " 34618000000000000000.00", string
|
247
276
|
end
|
248
277
|
|
249
278
|
it "renders boolean" do
|
250
|
-
assert string = tabular.render(
|
251
|
-
assert_equal "true false
|
279
|
+
assert string = tabular.render(name: true, address: false)
|
280
|
+
assert_equal "true false 00000000000000000000.00", string
|
252
281
|
end
|
253
282
|
|
254
283
|
it "renders no data as nil" do
|
data/test/test_helper.rb
CHANGED
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.
|
4
|
+
version: 1.4.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: 2020-
|
11
|
+
date: 2020-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
130
|
- !ruby/object:Gem::Version
|
131
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.
|