iostreams 0.14.0 → 0.15.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/LICENSE +202 -0
- data/README.md +155 -47
- data/lib/io_streams/file/reader.rb +7 -8
- data/lib/io_streams/file/writer.rb +7 -8
- data/lib/io_streams/io_streams.rb +313 -129
- data/lib/io_streams/{delimited → line}/reader.rb +20 -30
- data/lib/io_streams/line/writer.rb +81 -0
- data/lib/io_streams/pgp.rb +4 -14
- data/lib/io_streams/record/reader.rb +55 -0
- data/lib/io_streams/record/writer.rb +63 -0
- data/lib/io_streams/row/reader.rb +60 -0
- data/lib/io_streams/row/writer.rb +62 -0
- data/lib/io_streams/s3.rb +25 -0
- data/lib/io_streams/s3/reader.rb +64 -0
- data/lib/io_streams/s3/writer.rb +13 -0
- data/lib/io_streams/streams.rb +1 -1
- data/lib/io_streams/tabular.rb +163 -0
- data/lib/io_streams/tabular/errors.rb +14 -0
- data/lib/io_streams/tabular/header.rb +146 -0
- data/lib/io_streams/tabular/parser/array.rb +26 -0
- data/lib/io_streams/tabular/parser/base.rb +12 -0
- data/lib/io_streams/tabular/parser/csv.rb +35 -0
- data/lib/io_streams/tabular/parser/fixed.rb +88 -0
- data/lib/io_streams/tabular/parser/hash.rb +21 -0
- data/lib/io_streams/tabular/parser/json.rb +25 -0
- data/lib/io_streams/tabular/parser/psv.rb +34 -0
- data/lib/io_streams/tabular/utility/csv_row.rb +115 -0
- data/lib/io_streams/version.rb +2 -2
- data/lib/io_streams/xlsx/reader.rb +1 -1
- data/lib/io_streams/zip/reader.rb +1 -1
- data/lib/io_streams/zip/writer.rb +1 -1
- data/lib/iostreams.rb +21 -10
- data/test/bzip2_reader_test.rb +21 -22
- data/test/bzip2_writer_test.rb +38 -32
- data/test/file_reader_test.rb +19 -18
- data/test/file_writer_test.rb +23 -22
- data/test/files/test.json +3 -0
- data/test/gzip_reader_test.rb +21 -22
- data/test/gzip_writer_test.rb +35 -29
- data/test/io_streams_test.rb +137 -61
- data/test/line_reader_test.rb +105 -0
- data/test/line_writer_test.rb +50 -0
- data/test/pgp_reader_test.rb +29 -29
- data/test/pgp_test.rb +149 -195
- data/test/pgp_writer_test.rb +63 -62
- data/test/record_reader_test.rb +61 -0
- data/test/record_writer_test.rb +73 -0
- data/test/row_reader_test.rb +34 -0
- data/test/row_writer_test.rb +51 -0
- data/test/tabular_test.rb +184 -0
- data/test/xlsx_reader_test.rb +13 -17
- data/test/zip_reader_test.rb +21 -22
- data/test/zip_writer_test.rb +40 -36
- metadata +41 -17
- data/lib/io_streams/csv/reader.rb +0 -21
- data/lib/io_streams/csv/writer.rb +0 -20
- data/lib/io_streams/delimited/writer.rb +0 -67
- data/test/csv_reader_test.rb +0 -34
- data/test/csv_writer_test.rb +0 -35
- data/test/delimited_reader_test.rb +0 -115
- data/test/delimited_writer_test.rb +0 -44
@@ -0,0 +1,105 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class LineReaderTest < Minitest::Test
|
4
|
+
describe IOStreams::Line::Reader do
|
5
|
+
let :file_name do
|
6
|
+
File.join(File.dirname(__FILE__), 'files', 'text.txt')
|
7
|
+
end
|
8
|
+
|
9
|
+
let :data do
|
10
|
+
data = []
|
11
|
+
File.open(file_name, 'rt') do |file|
|
12
|
+
while !file.eof?
|
13
|
+
data << file.readline.strip
|
14
|
+
end
|
15
|
+
end
|
16
|
+
data
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#initialize' do
|
20
|
+
it 'does not strip invalid characters' do
|
21
|
+
bad_lines = [
|
22
|
+
"New M\xE9xico,NE",
|
23
|
+
'good line',
|
24
|
+
"New M\xE9xico,SF"
|
25
|
+
]
|
26
|
+
input = StringIO.new(bad_lines.join("\n"))
|
27
|
+
lines = []
|
28
|
+
IOStreams::Line::Reader.open(input) do |io|
|
29
|
+
assert_equal false, io.strip_non_printable
|
30
|
+
assert_raises ArgumentError do
|
31
|
+
io.each { |line| lines << line }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'strips invalid characters' do
|
37
|
+
bad_lines = [
|
38
|
+
"New M\xE9xico,NE",
|
39
|
+
'good line',
|
40
|
+
"New M\xE9xico,SF"
|
41
|
+
]
|
42
|
+
fixed_lines = bad_lines.collect { |line| line.force_encoding('BINARY').gsub(/[^[:print:]|\r|\n]/, '') }
|
43
|
+
input = StringIO.new(bad_lines.join("\n"))
|
44
|
+
lines = []
|
45
|
+
IOStreams::Line::Reader.open(input, strip_non_printable: true) do |io|
|
46
|
+
assert_equal true, io.strip_non_printable
|
47
|
+
io.each { |line| lines << line }
|
48
|
+
end
|
49
|
+
assert_equal fixed_lines, lines
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#each' do
|
54
|
+
it 'each_line file' do
|
55
|
+
lines = []
|
56
|
+
IOStreams::Line::Reader.open(file_name) do |io|
|
57
|
+
io.each { |line| lines << line }
|
58
|
+
end
|
59
|
+
assert_equal data, lines
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'each_line stream' do
|
63
|
+
lines = []
|
64
|
+
File.open(file_name) do |file|
|
65
|
+
IOStreams::Line::Reader.open(file) do |io|
|
66
|
+
io.each { |line| lines << line }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
assert_equal data, lines
|
70
|
+
end
|
71
|
+
|
72
|
+
["\r\n", "\n\r", "\n", "\r"].each do |delimiter|
|
73
|
+
it "autodetect delimiter: #{delimiter.inspect}" do
|
74
|
+
lines = []
|
75
|
+
stream = StringIO.new(data.join(delimiter))
|
76
|
+
IOStreams::Line::Reader.open(stream, buffer_size: 15) do |io|
|
77
|
+
io.each { |line| lines << line }
|
78
|
+
end
|
79
|
+
assert_equal data, lines
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
['@', 'BLAH'].each do |delimiter|
|
84
|
+
it "reads delimited #{delimiter.inspect}" do
|
85
|
+
lines = []
|
86
|
+
stream = StringIO.new(data.join(delimiter))
|
87
|
+
IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
|
88
|
+
io.each { |line| lines << line }
|
89
|
+
end
|
90
|
+
assert_equal data, lines
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'reads binary delimited' do
|
95
|
+
delimiter = "\x01"
|
96
|
+
lines = []
|
97
|
+
stream = StringIO.new(data.join(delimiter))
|
98
|
+
IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter, encoding: IOStreams::BINARY_ENCODING) do |io|
|
99
|
+
io.each { |line| lines << line }
|
100
|
+
end
|
101
|
+
assert_equal data, lines
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class DelimitedWriterTest < Minitest::Test
|
4
|
+
describe IOStreams::Line::Writer do
|
5
|
+
let :file_name do
|
6
|
+
File.join(File.dirname(__FILE__), 'files', 'text.txt')
|
7
|
+
end
|
8
|
+
|
9
|
+
let :raw do
|
10
|
+
File.read(file_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
let :lines do
|
14
|
+
raw.lines.map(&:strip)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#<<' do
|
18
|
+
it 'file' do
|
19
|
+
temp_file = Tempfile.new('rocket_job')
|
20
|
+
file_name = temp_file.to_path
|
21
|
+
IOStreams::Line::Writer.open(file_name) do |io|
|
22
|
+
lines.each { |line| io << line }
|
23
|
+
end
|
24
|
+
result = File.read(file_name)
|
25
|
+
assert_equal raw, result
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'stream' do
|
29
|
+
io_string = StringIO.new
|
30
|
+
IOStreams::Line::Writer.open(io_string) do |io|
|
31
|
+
lines.each { |line| io << line }
|
32
|
+
end
|
33
|
+
assert_equal raw, io_string.string
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.write' do
|
38
|
+
it 'returns byte count' do
|
39
|
+
io_string = StringIO.new
|
40
|
+
count = 0
|
41
|
+
IOStreams::Line::Writer.open(io_string) do |io|
|
42
|
+
lines.each { |line| count += io.write(line) }
|
43
|
+
end
|
44
|
+
assert_equal raw, io_string.string
|
45
|
+
assert_equal raw.size, count
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/test/pgp_reader_test.rb
CHANGED
@@ -1,44 +1,44 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@data = File.read(file_name)
|
9
|
-
@temp_file = Tempfile.new('iostreams')
|
10
|
-
@file_name = @temp_file.to_path
|
11
|
-
end
|
3
|
+
class PgpReaderTest < Minitest::Test
|
4
|
+
describe IOStreams::Pgp::Reader do
|
5
|
+
let :temp_file do
|
6
|
+
Tempfile.new('iostreams')
|
7
|
+
end
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
let :decrypted do
|
10
|
+
file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
|
11
|
+
File.read(file_name)
|
12
|
+
end
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
io.write(@data)
|
21
|
-
end
|
14
|
+
after do
|
15
|
+
temp_file.delete
|
16
|
+
end
|
22
17
|
|
23
|
-
|
24
|
-
|
18
|
+
describe '.open' do
|
19
|
+
it 'reads encrypted file' do
|
20
|
+
IOStreams::Pgp::Writer.open(temp_file.path, recipient: 'receiver@example.org') do |io|
|
21
|
+
io.write(decrypted)
|
25
22
|
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
24
|
+
result = IOStreams::Pgp::Reader.open(temp_file.path, passphrase: 'receiver_passphrase') { |file| file.read }
|
25
|
+
assert_equal decrypted, result
|
26
|
+
end
|
32
27
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
IOStreams::Pgp::Reader.open(io, passphrase: 'BAD') { |file| file.read }
|
37
|
-
end
|
28
|
+
it 'fails with bad passphrase' do
|
29
|
+
assert_raises IOStreams::Pgp::Failure do
|
30
|
+
IOStreams::Pgp::Reader.open(temp_file.path, passphrase: 'BAD') { |file| file.read }
|
38
31
|
end
|
32
|
+
end
|
39
33
|
|
34
|
+
it 'fails with stream input' do
|
35
|
+
io = StringIO.new
|
36
|
+
assert_raises NotImplementedError do
|
37
|
+
IOStreams::Pgp::Reader.open(io, passphrase: 'BAD') { |file| file.read }
|
38
|
+
end
|
40
39
|
end
|
41
40
|
|
42
41
|
end
|
42
|
+
|
43
43
|
end
|
44
44
|
end
|
data/test/pgp_test.rb
CHANGED
@@ -2,250 +2,204 @@ require_relative 'test_helper'
|
|
2
2
|
|
3
3
|
#IOStreams::Pgp.logger = Logger.new(STDOUT)
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
5
|
+
class PgpTest < Minitest::Test
|
6
|
+
describe IOStreams::Pgp do
|
7
|
+
let :user_name do
|
8
|
+
'Joe Bloggs'
|
9
|
+
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
let :email do
|
12
|
+
'pgp_test@iostreams.net'
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
let :passphrase do
|
16
|
+
'hello'
|
17
|
+
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
let :generated_key_id do
|
20
|
+
IOStreams::Pgp.generate_key(name: user_name, email: email, key_length: 1024, passphrase: passphrase)
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
let :public_key do
|
24
|
+
generated_key_id
|
25
|
+
IOStreams::Pgp.export(email: email)
|
26
|
+
end
|
27
|
+
|
28
|
+
before do
|
29
|
+
# There is a timing issue with creating and then deleting keys.
|
30
|
+
# Call list_keys again to give GnuPGP time.
|
31
|
+
IOStreams::Pgp.list_keys(email: email, private: true)
|
32
|
+
IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
|
33
|
+
#ap "KEYS DELETED"
|
34
|
+
#ap IOStreams::Pgp.list_keys(email: email, private: true)
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.pgp_version' do
|
38
|
+
it 'returns pgp version' do
|
39
|
+
assert IOStreams::Pgp.pgp_version
|
27
40
|
end
|
41
|
+
end
|
28
42
|
|
29
|
-
|
30
|
-
|
31
|
-
|
43
|
+
describe '.generate_key' do
|
44
|
+
it 'returns the key id' do
|
45
|
+
assert generated_key_id
|
32
46
|
end
|
47
|
+
end
|
33
48
|
|
49
|
+
describe '.has_key?' do
|
34
50
|
before do
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
|
51
|
+
generated_key_id
|
52
|
+
# There is a timing issue with creating and then immediately using keys.
|
53
|
+
# Call list_keys again to give GnuPGP time.
|
54
|
+
IOStreams::Pgp.list_keys(email: email)
|
39
55
|
end
|
40
56
|
|
41
|
-
|
42
|
-
|
43
|
-
assert IOStreams::Pgp.pgp_version
|
44
|
-
end
|
57
|
+
it 'confirms public key' do
|
58
|
+
assert IOStreams::Pgp.has_key?(key_id: generated_key_id)
|
45
59
|
end
|
46
60
|
|
47
|
-
|
48
|
-
|
49
|
-
assert generated_key_id
|
50
|
-
end
|
61
|
+
it 'confirms private key' do
|
62
|
+
assert IOStreams::Pgp.has_key?(key_id: generated_key_id, private: true)
|
51
63
|
end
|
64
|
+
end
|
52
65
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
66
|
+
describe '.delete_keys' do
|
67
|
+
it 'handles no keys' do
|
68
|
+
refute IOStreams::Pgp.delete_keys(email: 'random@iostreams.net', public: true, private: true)
|
69
|
+
end
|
57
70
|
|
58
|
-
|
59
|
-
|
60
|
-
|
71
|
+
it 'deletes existing keys' do
|
72
|
+
generated_key_id
|
73
|
+
# There is a timing issue with creating and then deleting keys.
|
74
|
+
# Call list_keys again to give GnuPGP time.
|
75
|
+
IOStreams::Pgp.list_keys(email: email, private: true)
|
76
|
+
assert IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
|
77
|
+
end
|
61
78
|
|
62
|
-
|
63
|
-
|
64
|
-
|
79
|
+
it 'deletes just the private key' do
|
80
|
+
generated_key_id
|
81
|
+
# There is a timing issue with creating and then deleting keys.
|
82
|
+
# Call list_keys again to give GnuPGP time.
|
83
|
+
IOStreams::Pgp.list_keys(email: email, private: true)
|
84
|
+
assert IOStreams::Pgp.delete_keys(email: email, public: false, private: true)
|
85
|
+
refute IOStreams::Pgp.has_key?(key_id: generated_key_id, private: true)
|
86
|
+
assert IOStreams::Pgp.has_key?(key_id: generated_key_id, private: false)
|
65
87
|
end
|
88
|
+
end
|
66
89
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
90
|
+
describe '.export' do
|
91
|
+
before do
|
92
|
+
generated_key_id
|
93
|
+
end
|
71
94
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
95
|
+
it 'exports public keys by email' do
|
96
|
+
assert ascii_keys = IOStreams::Pgp.export(email: email)
|
97
|
+
assert ascii_keys =~ /BEGIN PGP PUBLIC KEY BLOCK/, ascii_keys
|
98
|
+
end
|
76
99
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
refute IOStreams::Pgp.has_key?(key_id: generated_key_id, private: true)
|
81
|
-
assert IOStreams::Pgp.has_key?(key_id: generated_key_id, private: false)
|
82
|
-
end
|
100
|
+
it 'exports public keys as binary' do
|
101
|
+
assert keys = IOStreams::Pgp.export(email: email, ascii: false)
|
102
|
+
refute keys =~ /BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK/, keys
|
83
103
|
end
|
104
|
+
end
|
84
105
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
106
|
+
describe '.list_keys' do
|
107
|
+
before do
|
108
|
+
generated_key_id
|
109
|
+
# There is a timing issue with creating and then immediately using keys.
|
110
|
+
# Call list_keys again to give GnuPGP time.
|
111
|
+
IOStreams::Pgp.list_keys(email: email)
|
112
|
+
end
|
89
113
|
|
90
|
-
|
91
|
-
|
92
|
-
|
114
|
+
it 'lists public keys' do
|
115
|
+
assert keys = IOStreams::Pgp.list_keys(email: email)
|
116
|
+
assert_equal 1, keys.size
|
117
|
+
assert key = keys.first
|
118
|
+
|
119
|
+
assert_equal Date.today, key[:date]
|
120
|
+
assert_equal email, key[:email]
|
121
|
+
assert_includes key[:key_id], generated_key_id
|
122
|
+
assert_equal 1024, key[:key_length]
|
123
|
+
assert_includes ['R', 'rsa'], key[:key_type]
|
124
|
+
assert_equal user_name, key[:name]
|
125
|
+
refute key[:private], key
|
126
|
+
ver = IOStreams::Pgp.pgp_version
|
127
|
+
maint = ver.split('.').last.to_i
|
128
|
+
if (ver.to_f >= 2) && (maint >= 30)
|
129
|
+
assert_equal 'ultimate', key[:trust]
|
93
130
|
end
|
131
|
+
end
|
94
132
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
133
|
+
it 'lists private keys' do
|
134
|
+
assert keys = IOStreams::Pgp.list_keys(email: email, private: true)
|
135
|
+
assert_equal 1, keys.size
|
136
|
+
assert key = keys.first
|
137
|
+
|
138
|
+
assert_equal Date.today, key[:date]
|
139
|
+
assert_equal email, key[:email]
|
140
|
+
assert_includes key[:key_id], generated_key_id
|
141
|
+
assert_equal 1024, key[:key_length]
|
142
|
+
assert_includes ['R', 'rsa'], key[:key_type]
|
143
|
+
assert_equal user_name, key[:name]
|
144
|
+
assert key[:private], key
|
145
|
+
end
|
146
|
+
end
|
99
147
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
148
|
+
describe '.key_info' do
|
149
|
+
it 'extracts public key info' do
|
150
|
+
assert keys = IOStreams::Pgp.key_info(key: public_key)
|
151
|
+
assert_equal 1, keys.size
|
152
|
+
assert key = keys.first
|
153
|
+
|
154
|
+
assert_equal Date.today, key[:date]
|
155
|
+
assert_equal email, key[:email]
|
156
|
+
assert_includes key[:key_id], generated_key_id
|
157
|
+
assert_equal 1024, key[:key_length]
|
158
|
+
assert_includes ['R', 'rsa'], key[:key_type]
|
159
|
+
assert_equal user_name, key[:name]
|
160
|
+
refute key[:private], key
|
161
|
+
refute key.key?(:trust)
|
162
|
+
end
|
163
|
+
end
|
104
164
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
165
|
+
describe '.import' do
|
166
|
+
it 'handle duplicate public key' do
|
167
|
+
generated_key_id
|
168
|
+
assert_equal [], IOStreams::Pgp.import(key: public_key)
|
109
169
|
end
|
110
170
|
|
111
|
-
describe '
|
171
|
+
describe 'without keys' do
|
112
172
|
before do
|
113
|
-
|
173
|
+
@public_key = public_key
|
174
|
+
# There is a timing issue with creating and then deleting keys.
|
175
|
+
# Call list_keys again to give GnuPGP time.
|
176
|
+
IOStreams::Pgp.list_keys(email: email, private: true)
|
177
|
+
IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
|
114
178
|
end
|
115
179
|
|
116
|
-
it '
|
117
|
-
assert keys = IOStreams::Pgp.
|
180
|
+
it 'imports ascii public key' do
|
181
|
+
assert keys = IOStreams::Pgp.import(key: @public_key)
|
118
182
|
assert_equal 1, keys.size
|
119
183
|
assert key = keys.first
|
120
184
|
|
121
|
-
assert_equal Date.today, key[:date]
|
122
185
|
assert_equal email, key[:email]
|
123
|
-
|
124
|
-
assert_equal 1024, key[:key_length]
|
125
|
-
assert_includes ['R', 'rsa'], key[:key_type]
|
186
|
+
assert_equal generated_key_id, key[:key_id]
|
126
187
|
assert_equal user_name, key[:name]
|
127
188
|
refute key[:private], key
|
128
|
-
ver = IOStreams::Pgp.pgp_version
|
129
|
-
maint = ver.split('.').last.to_i
|
130
|
-
if (ver.to_f >= 2) && (maint >= 30)
|
131
|
-
assert_equal 'ultimate', key[:trust]
|
132
|
-
end
|
133
189
|
end
|
134
190
|
|
135
|
-
it '
|
136
|
-
assert keys = IOStreams::Pgp.
|
191
|
+
it 'imports binary public key' do
|
192
|
+
assert keys = IOStreams::Pgp.import(key: @public_key)
|
137
193
|
assert_equal 1, keys.size
|
138
194
|
assert key = keys.first
|
139
195
|
|
140
|
-
assert_equal Date.today, key[:date]
|
141
196
|
assert_equal email, key[:email]
|
142
|
-
|
143
|
-
assert_equal 1024, key[:key_length]
|
144
|
-
assert_includes ['R', 'rsa'], key[:key_type]
|
145
|
-
assert_equal user_name, key[:name]
|
146
|
-
assert key[:private], key
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe '.key_info' do
|
151
|
-
it 'extracts public key info' do
|
152
|
-
assert keys = IOStreams::Pgp.key_info(key: public_key)
|
153
|
-
assert_equal 1, keys.size
|
154
|
-
assert key = keys.first
|
155
|
-
|
156
|
-
assert_equal Date.today, key[:date]
|
157
|
-
assert_equal email, key[:email]
|
158
|
-
assert_includes key[:key_id], generated_key_id
|
159
|
-
assert_equal 1024, key[:key_length]
|
160
|
-
assert_includes ['R', 'rsa'], key[:key_type]
|
197
|
+
assert_equal generated_key_id, key[:key_id]
|
161
198
|
assert_equal user_name, key[:name]
|
162
199
|
refute key[:private], key
|
163
|
-
refute key.key?(:trust)
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'extracts private key info' do
|
167
|
-
skip 'GnuPG v2.1 and above does not allow batch inspection of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
|
168
|
-
assert keys = IOStreams::Pgp.key_info(key: private_key)
|
169
|
-
assert_equal 1, keys.size
|
170
|
-
assert key = keys.first
|
171
|
-
|
172
|
-
assert_equal Date.today, key[:date]
|
173
|
-
assert_equal email, key[:email]
|
174
|
-
assert_includes key[:key_id], generated_key_id
|
175
|
-
assert_equal 1024, key[:key_length]
|
176
|
-
assert_equal 'R', key[:key_type]
|
177
|
-
assert_equal user_name, key[:name]
|
178
|
-
assert key[:private], key
|
179
|
-
refute key.key?(:trust)
|
180
200
|
end
|
181
201
|
end
|
182
|
-
|
183
|
-
describe '.import' do
|
184
|
-
it 'handle duplicate public key' do
|
185
|
-
generated_key_id
|
186
|
-
assert_equal [], IOStreams::Pgp.import(key: public_key)
|
187
|
-
end
|
188
|
-
|
189
|
-
it 'handle duplicate private key' do
|
190
|
-
generated_key_id
|
191
|
-
assert_equal [], IOStreams::Pgp.import(key: private_key)
|
192
|
-
end
|
193
|
-
|
194
|
-
describe 'without keys' do
|
195
|
-
before do
|
196
|
-
@public_key = public_key
|
197
|
-
@private_key = private_key
|
198
|
-
IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
|
199
|
-
end
|
200
|
-
|
201
|
-
it 'imports ascii public key' do
|
202
|
-
assert keys = IOStreams::Pgp.import(key: @public_key)
|
203
|
-
assert_equal 1, keys.size
|
204
|
-
assert key = keys.first
|
205
|
-
|
206
|
-
assert_equal email, key[:email]
|
207
|
-
assert_equal generated_key_id, key[:key_id]
|
208
|
-
assert_equal user_name, key[:name]
|
209
|
-
refute key[:private], key
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'imports ascii private key' do
|
213
|
-
skip 'GnuPG v2.1 and above does not allow batch import of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
|
214
|
-
assert keys = IOStreams::Pgp.import(key: @private_key)
|
215
|
-
assert_equal 1, keys.size
|
216
|
-
assert key = keys.first
|
217
|
-
|
218
|
-
assert_equal email, key[:email]
|
219
|
-
assert_equal generated_key_id, key[:key_id]
|
220
|
-
assert_equal user_name, key[:name]
|
221
|
-
assert key[:private], key
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'imports binary public key' do
|
225
|
-
assert keys = IOStreams::Pgp.import(key: @public_key)
|
226
|
-
assert_equal 1, keys.size
|
227
|
-
assert key = keys.first
|
228
|
-
|
229
|
-
assert_equal email, key[:email]
|
230
|
-
assert_equal generated_key_id, key[:key_id]
|
231
|
-
assert_equal user_name, key[:name]
|
232
|
-
refute key[:private], key
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'imports binary private key' do
|
236
|
-
skip 'GnuPG v2.1 and above does not allow batch import of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
|
237
|
-
assert keys = IOStreams::Pgp.import(key: @private_key)
|
238
|
-
assert_equal 1, keys.size
|
239
|
-
assert key = keys.first
|
240
|
-
|
241
|
-
assert_equal email, key[:email]
|
242
|
-
assert_equal generated_key_id, key[:key_id]
|
243
|
-
assert_equal user_name, key[:name]
|
244
|
-
assert key[:private], key
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
202
|
end
|
203
|
+
|
250
204
|
end
|
251
205
|
end
|