iostreams 0.10.0 → 0.10.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e653b5b68990dd8c8c6442c160a109a072e33a14
4
- data.tar.gz: f30e9b16508e24ed1040f36bf16192cc2c5e7e1a
3
+ metadata.gz: f8b6a2e131f668f33e07b92d4bb97a502034be3e
4
+ data.tar.gz: 75d6e4b9bd1fe755f390064418872b4038e3ea81
5
5
  SHA512:
6
- metadata.gz: 63d58edaa9e53bc878bfca723772f0373791cea7411fe5be74b37db6e56d5a79003f06ccd0a95962a2e6d754c55f0a8af6031a68c0a70aef71ed83328e50000b
7
- data.tar.gz: 28be995afd5b6627758599c6c50d2e21293bef90e1df9babb413a82152953237e5cf25191bb8d15a7aedf782c162e635a4d822878dde183a40c61a2f621ad37d
6
+ metadata.gz: dc645f505a045422d8273b58354816676b4883953b5d1600073f8c913275eb555ed1d22c11ed74ec88014c7a74d5c0f3b9b4daef5aa243a629aa74a84601ccce
7
+ data.tar.gz: 3a7afd7654017a715ca21f56567d40e924ff4c4e45fcd7e2ed72959b488d833e9cc74f8d08ce32cd7d66565ac86b9c8395c78b28862c23ac17f421eac8d33d19
@@ -1,7 +1,7 @@
1
1
  require 'concurrent'
2
2
  module IOStreams
3
3
  # A registry to hold formats for processing files during upload or download
4
- @@extensions = Concurrent::Hash.new
4
+ @@extensions = Concurrent::Map.new
5
5
 
6
6
  UTF8_ENCODING = Encoding.find('UTF-8').freeze
7
7
  BINARY_ENCODING = Encoding.find('BINARY').freeze
@@ -175,7 +175,7 @@ module IOStreams
175
175
  # IOStreams.copy(source_stream, target_stream)
176
176
  # end
177
177
  # end
178
- def self.copy(source_stream, target_stream, buffer_size=65536)
178
+ def self.copy(source_stream, target_stream, buffer_size = 65536)
179
179
  bytes = 0
180
180
  while data = source_stream.read(buffer_size)
181
181
  break if data.size == 0
@@ -185,6 +185,20 @@ module IOStreams
185
185
  bytes
186
186
  end
187
187
 
188
+ # Copies the source file name to the target file name.
189
+ #
190
+ # Returns [Integer] the number of bytes copied
191
+ #
192
+ # Example:
193
+ # IOStreams.copy_file('a.csv', 'b.csv.enc')
194
+ def self.copy_file(source_file_name, target_file_name, buffer_size = 65536)
195
+ reader(source_file_name) do |source_stream|
196
+ writer(target_file_name) do |target_stream|
197
+ copy(source_stream, target_stream, buffer_size)
198
+ end
199
+ end
200
+ end
201
+
188
202
  # Returns [true|false] whether the supplied file_name_or_io is a reader stream
189
203
  def self.reader_stream?(file_name_or_io)
190
204
  file_name_or_io.respond_to?(:read)
@@ -166,7 +166,7 @@ module IOStreams
166
166
  output = out.read.chomp
167
167
  if waith_thr.value.success?
168
168
  output.each_line do |line|
169
- return true if line.match(/\Auid.*::([^\:]*):\Z/)
169
+ return true if line.include?(email)
170
170
  end
171
171
  false
172
172
  else
@@ -176,6 +176,25 @@ module IOStreams
176
176
  end
177
177
  end
178
178
 
179
+ # Returns [String] the first fingerprint for the supplied email
180
+ # Returns nil if no fingerprint was found
181
+ def self.fingerprint(email:)
182
+ Open3.popen2e("gpg --list-keys --fingerprint --with-colons #{email}") do |stdin, out, waith_thr|
183
+ output = out.read.chomp
184
+ if waith_thr.value.success?
185
+ output.each_line do |line|
186
+ if match = line.match(/\Afpr.*::([^\:]*):\Z/)
187
+ return match[1]
188
+ end
189
+ end
190
+ nil
191
+ else
192
+ return if output =~ /(public key not found|No public key)/i
193
+ raise(Pgp::Failure, "GPG Failed calling gpg to list keys for #{email}: #{output}")
194
+ end
195
+ end
196
+ end
197
+
179
198
  # Returns [String] the key for the supplied email address
180
199
  #
181
200
  # email: [String] Email address for requested key
@@ -209,5 +228,25 @@ module IOStreams
209
228
  end
210
229
  end
211
230
 
231
+ # Set the trust level for an existing key.
232
+ #
233
+ # Returns [String] output if the trust was successfully updated
234
+ # Returns nil if the email was not found
235
+ #
236
+ # After importing keys, they are not trusted and the relevant trust level must be set.
237
+ # Default: 5 : Ultimate
238
+ def self.set_trust(email:, level: 5)
239
+ fingerprint = fingerprint(email: email)
240
+ return unless fingerprint
241
+
242
+ trust = "#{fingerprint}:#{level + 1}:\n"
243
+ out, err, status = Open3.capture3('gpg --import-ownertrust', stdin_data: trust)
244
+ if status.success?
245
+ err
246
+ else
247
+ raise(Pgp::Failure, "GPG Failed trusting key: #{err} #{out}")
248
+ end
249
+ end
250
+
212
251
  end
213
252
  end
@@ -39,7 +39,7 @@ module IOStreams
39
39
  # compression: [:none|:zip|:zlib|:bzip2]
40
40
  # Note: Standard PGP only supports :zip.
41
41
  # :zlib is better than zip.
42
- # :bzip2 is best, but uses a lot of memory.
42
+ # :bzip2 is best, but uses a lot of memory and is much slower.
43
43
  # Default: :zip
44
44
  #
45
45
  # compress_level: [Integer]
@@ -64,7 +64,7 @@ module IOStreams
64
64
  stdin.close
65
65
  rescue Errno::EPIPE
66
66
  # Ignore broken pipe because gpg terminates early due to an error
67
- ::File.delete(file_name_or_io)
67
+ ::File.delete(file_name_or_io) if ::File.exist?(file_name_or_io)
68
68
  raise(Pgp::Failure, "GPG Failed writing to encrypted file: #{file_name_or_io}: #{out.read.chomp}")
69
69
  end
70
70
  unless waith_thr.value.success?
@@ -15,7 +15,7 @@ module IOStreams
15
15
  # Stream to a remote file over sftp.
16
16
  #
17
17
  # file_name: [String]
18
- # Name of file to write to.
18
+ # Name of file to read from.
19
19
  #
20
20
  # user: [String]
21
21
  # Name of user to login with.
@@ -58,8 +58,8 @@ module IOStreams
58
58
  mode = binary ? 'wb' : 'w'
59
59
 
60
60
  Net::SFTP.start(host, user, options) do |sftp|
61
- sftp.session.exec!("mkdir -p '#{File.dirname(file_name)}'") if mkdir
62
- sftp.file.open(file_name, mode, & block)
61
+ sftp.session.exec!("mkdir -p '#{::File.dirname(file_name)}'") if mkdir
62
+ sftp.file.open(file_name, mode, &block)
63
63
  end
64
64
  end
65
65
 
@@ -1,3 +1,3 @@
1
1
  module IOStreams #:nodoc
2
- VERSION = '0.10.0'
2
+ VERSION = '0.10.1'
3
3
  end
@@ -0,0 +1,57 @@
1
+ require_relative 'test_helper'
2
+
3
+ # Unit Test for IOStreams::File
4
+ module Streams
5
+ class IOStreamsTest < Minitest::Test
6
+ describe IOStreams do
7
+ before do
8
+ @source_file_name = File.join(File.dirname(__FILE__), 'files', 'text.txt')
9
+ @data = File.read(@source_file_name)
10
+
11
+ @temp_file = Tempfile.new('iostreams')
12
+ @target_file_name = @temp_file.to_path
13
+ end
14
+
15
+ after do
16
+ @temp_file.delete if @temp_file
17
+ end
18
+
19
+ describe '.copy' do
20
+ it 'file' do
21
+ size = IOStreams.reader(@source_file_name) do |source_stream|
22
+ IOStreams.writer(@target_file_name) do |target_stream|
23
+ IOStreams.copy(source_stream, target_stream)
24
+ end
25
+ end
26
+ actual = File.read(@target_file_name)
27
+
28
+ assert_equal actual, @data
29
+ assert_equal actual.size, size
30
+ end
31
+
32
+ it 'stream' do
33
+ size = File.open(@source_file_name) do |source_stream|
34
+ IOStreams.writer(@target_file_name) do |target_stream|
35
+ IOStreams.copy(source_stream, target_stream)
36
+ end
37
+ end
38
+ actual = File.read(@target_file_name)
39
+
40
+ assert_equal actual, @data
41
+ assert_equal actual.size, size
42
+ end
43
+ end
44
+
45
+ describe '.copy_file' do
46
+ it 'copies' do
47
+ size = IOStreams.copy_file(@source_file_name, @target_file_name)
48
+ actual = File.read(@target_file_name)
49
+
50
+ assert_equal actual, @data
51
+ assert_equal actual.size, size
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -76,9 +76,9 @@ module Streams
76
76
  end
77
77
 
78
78
  it 'fails with stream output' do
79
- io = StringIO.new
79
+ string_io = StringIO.new
80
80
  assert_raises NotImplementedError do
81
- IOStreams::Pgp::Writer.open(io, recipient: 'receiver@example.org') do |io|
81
+ IOStreams::Pgp::Writer.open(string_io, recipient: 'receiver@example.org') do |io|
82
82
  io.write(@data)
83
83
  end
84
84
  end
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: 0.10.0
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-27 00:00:00.000000000 Z
11
+ date: 2017-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -67,6 +67,7 @@ files:
67
67
  - test/files/text.zip
68
68
  - test/gzip_reader_test.rb
69
69
  - test/gzip_writer_test.rb
70
+ - test/io_streams_test.rb
70
71
  - test/pgp_reader_test.rb
71
72
  - test/pgp_writer_test.rb
72
73
  - test/test_helper.rb
@@ -93,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
94
  version: '0'
94
95
  requirements: []
95
96
  rubyforge_project:
96
- rubygems_version: 2.5.1
97
+ rubygems_version: 2.6.8
97
98
  signing_key:
98
99
  specification_version: 4
99
100
  summary: Ruby file streaming. Supports Text, Zip, Gzip, Xlsx, csv, PGP / GPG and Symmetric
@@ -113,6 +114,7 @@ test_files:
113
114
  - test/files/text.zip
114
115
  - test/gzip_reader_test.rb
115
116
  - test/gzip_writer_test.rb
117
+ - test/io_streams_test.rb
116
118
  - test/pgp_reader_test.rb
117
119
  - test/pgp_writer_test.rb
118
120
  - test/test_helper.rb