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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +202 -0
  3. data/README.md +155 -47
  4. data/lib/io_streams/file/reader.rb +7 -8
  5. data/lib/io_streams/file/writer.rb +7 -8
  6. data/lib/io_streams/io_streams.rb +313 -129
  7. data/lib/io_streams/{delimited → line}/reader.rb +20 -30
  8. data/lib/io_streams/line/writer.rb +81 -0
  9. data/lib/io_streams/pgp.rb +4 -14
  10. data/lib/io_streams/record/reader.rb +55 -0
  11. data/lib/io_streams/record/writer.rb +63 -0
  12. data/lib/io_streams/row/reader.rb +60 -0
  13. data/lib/io_streams/row/writer.rb +62 -0
  14. data/lib/io_streams/s3.rb +25 -0
  15. data/lib/io_streams/s3/reader.rb +64 -0
  16. data/lib/io_streams/s3/writer.rb +13 -0
  17. data/lib/io_streams/streams.rb +1 -1
  18. data/lib/io_streams/tabular.rb +163 -0
  19. data/lib/io_streams/tabular/errors.rb +14 -0
  20. data/lib/io_streams/tabular/header.rb +146 -0
  21. data/lib/io_streams/tabular/parser/array.rb +26 -0
  22. data/lib/io_streams/tabular/parser/base.rb +12 -0
  23. data/lib/io_streams/tabular/parser/csv.rb +35 -0
  24. data/lib/io_streams/tabular/parser/fixed.rb +88 -0
  25. data/lib/io_streams/tabular/parser/hash.rb +21 -0
  26. data/lib/io_streams/tabular/parser/json.rb +25 -0
  27. data/lib/io_streams/tabular/parser/psv.rb +34 -0
  28. data/lib/io_streams/tabular/utility/csv_row.rb +115 -0
  29. data/lib/io_streams/version.rb +2 -2
  30. data/lib/io_streams/xlsx/reader.rb +1 -1
  31. data/lib/io_streams/zip/reader.rb +1 -1
  32. data/lib/io_streams/zip/writer.rb +1 -1
  33. data/lib/iostreams.rb +21 -10
  34. data/test/bzip2_reader_test.rb +21 -22
  35. data/test/bzip2_writer_test.rb +38 -32
  36. data/test/file_reader_test.rb +19 -18
  37. data/test/file_writer_test.rb +23 -22
  38. data/test/files/test.json +3 -0
  39. data/test/gzip_reader_test.rb +21 -22
  40. data/test/gzip_writer_test.rb +35 -29
  41. data/test/io_streams_test.rb +137 -61
  42. data/test/line_reader_test.rb +105 -0
  43. data/test/line_writer_test.rb +50 -0
  44. data/test/pgp_reader_test.rb +29 -29
  45. data/test/pgp_test.rb +149 -195
  46. data/test/pgp_writer_test.rb +63 -62
  47. data/test/record_reader_test.rb +61 -0
  48. data/test/record_writer_test.rb +73 -0
  49. data/test/row_reader_test.rb +34 -0
  50. data/test/row_writer_test.rb +51 -0
  51. data/test/tabular_test.rb +184 -0
  52. data/test/xlsx_reader_test.rb +13 -17
  53. data/test/zip_reader_test.rb +21 -22
  54. data/test/zip_writer_test.rb +40 -36
  55. metadata +41 -17
  56. data/lib/io_streams/csv/reader.rb +0 -21
  57. data/lib/io_streams/csv/writer.rb +0 -20
  58. data/lib/io_streams/delimited/writer.rb +0 -67
  59. data/test/csv_reader_test.rb +0 -34
  60. data/test/csv_writer_test.rb +0 -35
  61. data/test/delimited_reader_test.rb +0 -115
  62. 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
@@ -1,44 +1,44 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- module Streams
4
- class PgpReaderTest < Minitest::Test
5
- describe IOStreams::Pgp::Reader do
6
- before do
7
- file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
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
- after do
14
- @temp_file.delete if @temp_file
15
- end
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
- describe '.open' do
18
- it 'reads encrypted file' do
19
- IOStreams::Pgp::Writer.open(@file_name, recipient: 'receiver@example.org') do |io|
20
- io.write(@data)
21
- end
14
+ after do
15
+ temp_file.delete
16
+ end
22
17
 
23
- result = IOStreams::Pgp::Reader.open(@file_name, passphrase: 'receiver_passphrase') { |file| file.read }
24
- assert_equal @data, result
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
- it 'fails with bad passphrase' do
28
- assert_raises IOStreams::Pgp::Failure do
29
- IOStreams::Pgp::Reader.open(@file_name, passphrase: 'BAD') { |file| file.read }
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
- it 'fails with stream input' do
34
- io = StringIO.new
35
- assert_raises NotImplementedError do
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
- module Streams
6
- class PgpTest < Minitest::Test
7
- describe IOStreams::Pgp do
8
- let :user_name do
9
- 'Joe Bloggs'
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
- let :email do
13
- 'pgp_test@iostreams.net'
14
- end
11
+ let :email do
12
+ 'pgp_test@iostreams.net'
13
+ end
15
14
 
16
- let :passphrase do
17
- 'hello'
18
- end
15
+ let :passphrase do
16
+ 'hello'
17
+ end
19
18
 
20
- let :generated_key_id do
21
- IOStreams::Pgp.generate_key(name: user_name, email: email, key_length: 1024, passphrase: passphrase)
22
- end
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
- let :public_key do
25
- generated_key_id
26
- IOStreams::Pgp.export(email: email)
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
- let :private_key do
30
- generated_key_id
31
- IOStreams::Pgp.export(email: email, private: true, passphrase: passphrase)
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
- #ap IOStreams::Pgp.list_keys(email: email, private: true)
36
- IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
37
- #ap "KEYS DELETED"
38
- #ap IOStreams::Pgp.list_keys(email: email, private: true)
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
- describe '.pgp_version' do
42
- it 'returns pgp version' do
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
- describe '.generate_key' do
48
- it 'returns the key id' do
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
- describe '.has_key?' do
54
- before do
55
- generated_key_id
56
- end
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
- it 'confirms public key' do
59
- assert IOStreams::Pgp.has_key?(key_id: generated_key_id)
60
- end
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
- it 'confirms private key' do
63
- assert IOStreams::Pgp.has_key?(key_id: generated_key_id, private: true)
64
- end
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
- describe '.delete_keys' do
68
- it 'handles no keys' do
69
- refute IOStreams::Pgp.delete_keys(email: 'random@iostreams.net', public: true, private: true)
70
- end
90
+ describe '.export' do
91
+ before do
92
+ generated_key_id
93
+ end
71
94
 
72
- it 'deletes existing keys' do
73
- generated_key_id
74
- assert IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
75
- end
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
- it 'deletes just the private key' do
78
- generated_key_id
79
- assert IOStreams::Pgp.delete_keys(email: email, public: false, private: true)
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
- describe '.export' do
86
- before do
87
- generated_key_id
88
- end
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
- it 'exports public keys by email' do
91
- assert ascii_keys = IOStreams::Pgp.export(email: email)
92
- assert ascii_keys =~ /BEGIN PGP PUBLIC KEY BLOCK/, ascii_keys
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
- it 'exports private keys by email' do
96
- assert ascii_keys = IOStreams::Pgp.export(email: email, private: true, passphrase: passphrase)
97
- assert ascii_keys =~ /BEGIN PGP PRIVATE KEY BLOCK/, ascii_keys
98
- end
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
- 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
103
- end
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
- it 'exports private keys as binary' do
106
- assert keys = IOStreams::Pgp.export(email: email, ascii: false, private: true, passphrase: passphrase)
107
- refute keys =~ /BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK/, keys
108
- end
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 '.list_keys' do
171
+ describe 'without keys' do
112
172
  before do
113
- generated_key_id
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 'lists public keys' do
117
- assert keys = IOStreams::Pgp.list_keys(email: email)
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
- assert_includes key[:key_id], generated_key_id
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 'lists private keys' do
136
- assert keys = IOStreams::Pgp.list_keys(email: email, private: true)
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
- assert_includes key[:key_id], generated_key_id
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