iostreams 1.1.0 → 1.1.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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +7 -7
  4. data/lib/io_streams/builder.rb +4 -3
  5. data/lib/io_streams/bzip2/reader.rb +1 -1
  6. data/lib/io_streams/bzip2/writer.rb +1 -1
  7. data/lib/io_streams/deprecated.rb +2 -3
  8. data/lib/io_streams/encode/reader.rb +5 -8
  9. data/lib/io_streams/encode/writer.rb +1 -1
  10. data/lib/io_streams/io_streams.rb +5 -2
  11. data/lib/io_streams/line/reader.rb +2 -1
  12. data/lib/io_streams/path.rb +4 -4
  13. data/lib/io_streams/paths/http.rb +8 -10
  14. data/lib/io_streams/paths/matcher.rb +10 -11
  15. data/lib/io_streams/paths/s3.rb +6 -6
  16. data/lib/io_streams/paths/sftp.rb +38 -23
  17. data/lib/io_streams/pgp.rb +45 -35
  18. data/lib/io_streams/pgp/reader.rb +4 -6
  19. data/lib/io_streams/pgp/writer.rb +1 -2
  20. data/lib/io_streams/reader.rb +2 -2
  21. data/lib/io_streams/record/writer.rb +2 -4
  22. data/lib/io_streams/row/writer.rb +3 -5
  23. data/lib/io_streams/stream.rb +6 -6
  24. data/lib/io_streams/symmetric_encryption/reader.rb +1 -3
  25. data/lib/io_streams/symmetric_encryption/writer.rb +2 -6
  26. data/lib/io_streams/tabular.rb +12 -10
  27. data/lib/io_streams/tabular/header.rb +4 -4
  28. data/lib/io_streams/tabular/parser/array.rb +2 -4
  29. data/lib/io_streams/tabular/parser/csv.rb +3 -5
  30. data/lib/io_streams/tabular/parser/fixed.rb +4 -3
  31. data/lib/io_streams/tabular/parser/hash.rb +2 -4
  32. data/lib/io_streams/tabular/parser/json.rb +2 -4
  33. data/lib/io_streams/tabular/parser/psv.rb +5 -7
  34. data/lib/io_streams/tabular/utility/csv_row.rb +9 -17
  35. data/lib/io_streams/utils.rb +3 -3
  36. data/lib/io_streams/utils/reliable_http.rb +98 -0
  37. data/lib/io_streams/version.rb +1 -1
  38. data/lib/io_streams/writer.rb +1 -1
  39. data/lib/io_streams/xlsx/reader.rb +5 -5
  40. data/lib/io_streams/zip/reader.rb +1 -1
  41. data/lib/io_streams/zip/writer.rb +2 -2
  42. data/lib/iostreams.rb +34 -34
  43. data/test/builder_test.rb +74 -74
  44. data/test/bzip2_reader_test.rb +8 -13
  45. data/test/bzip2_writer_test.rb +8 -9
  46. data/test/deprecated_test.rb +25 -29
  47. data/test/encode_reader_test.rb +14 -18
  48. data/test/encode_writer_test.rb +29 -30
  49. data/test/gzip_reader_test.rb +8 -13
  50. data/test/gzip_writer_test.rb +10 -11
  51. data/test/io_streams_test.rb +35 -35
  52. data/test/line_reader_test.rb +35 -39
  53. data/test/line_writer_test.rb +8 -9
  54. data/test/minimal_file_reader.rb +1 -1
  55. data/test/path_test.rb +24 -24
  56. data/test/paths/file_test.rb +42 -42
  57. data/test/paths/http_test.rb +5 -5
  58. data/test/paths/matcher_test.rb +11 -12
  59. data/test/paths/s3_test.rb +44 -46
  60. data/test/paths/sftp_test.rb +18 -18
  61. data/test/pgp_reader_test.rb +13 -15
  62. data/test/pgp_test.rb +43 -44
  63. data/test/pgp_writer_test.rb +27 -28
  64. data/test/record_reader_test.rb +9 -10
  65. data/test/record_writer_test.rb +10 -11
  66. data/test/row_reader_test.rb +5 -6
  67. data/test/row_writer_test.rb +7 -8
  68. data/test/stream_test.rb +60 -62
  69. data/test/tabular_test.rb +111 -111
  70. data/test/test_helper.rb +22 -22
  71. data/test/utils_test.rb +7 -7
  72. data/test/xlsx_reader_test.rb +12 -12
  73. data/test/zip_reader_test.rb +14 -21
  74. data/test/zip_writer_test.rb +10 -10
  75. metadata +4 -3
@@ -1,4 +1,4 @@
1
- require 'open3'
1
+ require "open3"
2
2
  module IOStreams
3
3
  # Read/Write PGP/GPG file or stream.
4
4
  #
@@ -82,8 +82,8 @@ module IOStreams
82
82
  # - Tested against gnupg v1.4.21 and v2.0.30
83
83
  # - Does not work yet with gnupg v2.1. Pull Requests welcome.
84
84
  module Pgp
85
- autoload :Reader, 'io_streams/pgp/reader'
86
- autoload :Writer, 'io_streams/pgp/writer'
85
+ autoload :Reader, "io_streams/pgp/reader"
86
+ autoload :Writer, "io_streams/pgp/writer"
87
87
 
88
88
  class Failure < StandardError
89
89
  end
@@ -99,7 +99,7 @@ module IOStreams
99
99
  @executable = executable
100
100
  end
101
101
 
102
- @executable = 'gpg'
102
+ @executable = "gpg"
103
103
 
104
104
  # Generate a new ultimate trusted local public and private key.
105
105
  #
@@ -122,9 +122,9 @@ module IOStreams
122
122
  # `SecureRandom.urlsafe_base64(128)`
123
123
  #
124
124
  # See `man gpg` for the remaining options
125
- def self.generate_key(name:, email:, comment: nil, passphrase:, key_type: 'RSA', key_length: 4096, subkey_type: 'RSA', subkey_length: key_length, expire_date: nil)
125
+ def self.generate_key(name:, email:, comment: nil, passphrase:, key_type: "RSA", key_length: 4096, subkey_type: "RSA", subkey_length: key_length, expire_date: nil)
126
126
  version_check
127
- params = ''
127
+ params = ""
128
128
  params << "Key-Type: #{key_type}\n" if key_type
129
129
  params << "Key-Length: #{key_length}\n" if key_length
130
130
  params << "Subkey-Type: #{subkey_type}\n" if subkey_type
@@ -134,14 +134,14 @@ module IOStreams
134
134
  params << "Name-Email: #{email}\n" if email
135
135
  params << "Expire-Date: #{expire_date}\n" if expire_date
136
136
  params << "Passphrase: #{passphrase}\n" if passphrase
137
- params << '%commit'
138
- command = "#{executable} --batch --gen-key --no-tty --quiet"
137
+ params << "%commit"
138
+ command = "#{executable} --batch --gen-key --no-tty"
139
139
 
140
140
  out, err, status = Open3.capture3(command, binmode: true, stdin_data: params)
141
- logger.debug { "IOStreams::Pgp.generate_key: #{command}\n#{err}#{out}" } if logger
141
+ logger&.debug { "IOStreams::Pgp.generate_key: #{command}\n#{params}\n#{err}#{out}" }
142
142
  if status.success?
143
143
  if match = err.match(/gpg: key ([0-9A-F]+)\s+/)
144
- return match[1]
144
+ match[1]
145
145
  end
146
146
  else
147
147
  raise(Pgp::Failure, "GPG Failed to generate key: #{err}#{out}")
@@ -172,12 +172,17 @@ module IOStreams
172
172
  end
173
173
 
174
174
  # Returns [true|false] whether their is a key for the supplied email or key_id
175
- def self.has_key?(email: nil, key_id: nil, private: false)
176
- raise(ArgumentError, 'Either :email, or :key_id must be supplied') if email.nil? && key_id.nil?
175
+ def self.key?(email: nil, key_id: nil, private: false)
176
+ raise(ArgumentError, "Either :email, or :key_id must be supplied") if email.nil? && key_id.nil?
177
177
 
178
178
  !list_keys(email: email, key_id: key_id, private: private).empty?
179
179
  end
180
180
 
181
+ # Deprecated
182
+ def self.has_key?(**args)
183
+ key(**args)
184
+ end
185
+
181
186
  # Returns [Array<Hash>] the list of keys.
182
187
  # Each Hash consists of:
183
188
  # key_length: [Integer]
@@ -189,15 +194,16 @@ module IOStreams
189
194
  # Returns [] if no keys were found.
190
195
  def self.list_keys(email: nil, key_id: nil, private: false)
191
196
  version_check
192
- cmd = private ? '--list-secret-keys' : '--list-keys'
197
+ cmd = private ? "--list-secret-keys" : "--list-keys"
193
198
  command = "#{executable} #{cmd} #{email || key_id}"
194
199
 
195
200
  out, err, status = Open3.capture3(command, binmode: true)
196
- logger.debug { "IOStreams::Pgp.list_keys: #{command}\n#{err}#{out}" } if logger
197
- if status.success? && out.length > 0
201
+ logger&.debug { "IOStreams::Pgp.list_keys: #{command}\n#{err}#{out}" }
202
+ if status.success? && out.length.positive?
198
203
  parse_list_output(out)
199
204
  else
200
205
  return [] if err =~ /(not found|No (public|secret) key|key not available)/i
206
+
201
207
  raise(Pgp::Failure, "GPG Failed calling '#{executable}' to list keys for #{email || key_id}: #{err}#{out}")
202
208
  end
203
209
  end
@@ -219,8 +225,8 @@ module IOStreams
219
225
  command = executable.to_s
220
226
 
221
227
  out, err, status = Open3.capture3(command, binmode: true, stdin_data: key)
222
- logger.debug { "IOStreams::Pgp.key_info: #{command}\n#{err}#{out}" } if logger
223
- if status.success? && out.length > 0
228
+ logger&.debug { "IOStreams::Pgp.key_info: #{command}\n#{err}#{out}" }
229
+ if status.success? && out.length.positive?
224
230
  # Sample Output:
225
231
  #
226
232
  # pub 4096R/3A5456F5 2017-06-07
@@ -243,15 +249,15 @@ module IOStreams
243
249
  version_check
244
250
 
245
251
  command = "#{executable} "
246
- command << '--pinentry-mode loopback ' if pgp_version.to_f >= 2.1
247
- command << '--armor ' if ascii
252
+ command << "--pinentry-mode loopback " if pgp_version.to_f >= 2.1
253
+ command << "--armor " if ascii
248
254
  command << "--no-tty --batch --passphrase"
249
255
  command << (passphrase ? " #{passphrase} " : "-fd 0 ")
250
256
  command << (private ? "--export-secret-keys #{email}" : "--export #{email}")
251
257
 
252
258
  out, err, status = Open3.capture3(command, binmode: true)
253
- logger.debug { "IOStreams::Pgp.export: #{command}\n#{err}" } if logger
254
- if status.success? && out.length > 0
259
+ logger&.debug { "IOStreams::Pgp.export: #{command}\n#{err}" }
260
+ if status.success? && out.length.positive?
255
261
  out
256
262
  else
257
263
  raise(Pgp::Failure, "GPG Failed reading key: #{email}: #{err}")
@@ -319,7 +325,7 @@ module IOStreams
319
325
  # Notes:
320
326
  # - If the same email address has multiple keys then only the first is currently trusted.
321
327
  def self.import_and_trust(key:)
322
- raise(ArgumentError, "Key cannot be empty") if key.nil? || (key == '')
328
+ raise(ArgumentError, "Key cannot be empty") if key.nil? || (key == "")
323
329
 
324
330
  email = key_info(key: key).first.fetch(:email)
325
331
  raise(ArgumentError, "Recipient email cannot be extracted from supplied key") unless email
@@ -443,20 +449,28 @@ module IOStreams
443
449
  if match = line.match(/(pub|sec)\s+(\D+)(\d+)\s+(\d+-\d+-\d+)\s+(.*)/)
444
450
  # v2.2: pub rsa1024 2017-10-24 [SCEA]
445
451
  hash = {
446
- private: match[1] == 'sec',
452
+ private: match[1] == "sec",
447
453
  key_length: match[3].to_s.to_i,
448
454
  key_type: match[2],
449
- date: (Date.parse(match[4].to_s) rescue match[4])
455
+ date: (begin
456
+ Date.parse(match[4].to_s)
457
+ rescue StandardError
458
+ match[4]
459
+ end)
450
460
  }
451
461
  elsif match = line.match(%r{(pub|sec)\s+(\d+)(.*)/(\w+)\s+(\d+-\d+-\d+)(\s+(.+)<(.+)>)?})
452
462
  # Matches: pub 2048R/C7F9D9CB 2016-10-26
453
463
  # Or: pub 2048R/C7F9D9CB 2016-10-26 Receiver <receiver@example.org>
454
464
  hash = {
455
- private: match[1] == 'sec',
465
+ private: match[1] == "sec",
456
466
  key_length: match[2].to_s.to_i,
457
467
  key_type: match[3],
458
468
  key_id: match[4],
459
- date: (Date.parse(match[5].to_s) rescue match[5])
469
+ date: (begin
470
+ Date.parse(match[5].to_s)
471
+ rescue StandardError
472
+ match[5]
473
+ end)
460
474
  }
461
475
  # Prior to gpg v2.0.30
462
476
  if match[7]
@@ -483,7 +497,7 @@ module IOStreams
483
497
  end
484
498
 
485
499
  def self.delete_public_or_private_keys(email:, private: false)
486
- keys = private ? 'secret-keys' : 'keys'
500
+ keys = private ? "secret-keys" : "keys"
487
501
 
488
502
  list = list_keys(email: email, private: private)
489
503
  return false if list.empty?
@@ -499,19 +513,17 @@ module IOStreams
499
513
  unless status.success?
500
514
  raise(Pgp::Failure, "GPG Failed calling #{executable} to delete #{keys} for #{email}: #{err}: #{out}")
501
515
  end
502
- if out.include?('error')
503
- raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}:#{out}")
504
- end
516
+ raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}:#{out}") if out.include?("error")
505
517
  end
506
518
  true
507
519
  end
508
520
 
509
521
  def self.delete_public_or_private_keys_v1(email:, private: false)
510
- keys = private ? 'secret-keys' : 'keys'
522
+ keys = private ? "secret-keys" : "keys"
511
523
 
512
524
  command = "for i in `#{executable} --list-#{keys} --with-colons --fingerprint #{email} | grep \"^fpr\" | cut -d: -f10`; do\n"
513
525
  command << "#{executable} --batch --no-tty --yes --delete-#{keys} \"$i\" ;\n"
514
- command << 'done'
526
+ command << "done"
515
527
 
516
528
  out, err, status = Open3.capture3(command, binmode: true)
517
529
  logger&.debug { "IOStreams::Pgp.delete_keys: #{command}\n#{err}: #{out}" }
@@ -520,9 +532,7 @@ module IOStreams
520
532
  unless status.success?
521
533
  raise(Pgp::Failure, "GPG Failed calling #{executable} to delete #{keys} for #{email}: #{err}: #{out}")
522
534
  end
523
- if out.include?('error')
524
- raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}: #{out}")
525
- end
535
+ raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}: #{out}") if out.include?("error")
526
536
 
527
537
  true
528
538
  end
@@ -1,4 +1,4 @@
1
- require 'open3'
1
+ require "open3"
2
2
 
3
3
  module IOStreams
4
4
  module Pgp
@@ -24,9 +24,9 @@ module IOStreams
24
24
  def self.file(file_name, passphrase: nil)
25
25
  # Cannot use `passphrase: self.default_passphrase` since it is considered private
26
26
  passphrase ||= default_passphrase
27
- raise(ArgumentError, 'Missing both passphrase and IOStreams::Pgp::Reader.default_passphrase') unless passphrase
27
+ raise(ArgumentError, "Missing both passphrase and IOStreams::Pgp::Reader.default_passphrase") unless passphrase
28
28
 
29
- loopback = IOStreams::Pgp.pgp_version.to_f >= 2.1 ? '--pinentry-mode loopback' : ''
29
+ loopback = IOStreams::Pgp.pgp_version.to_f >= 2.1 ? "--pinentry-mode loopback" : ""
30
30
  command = "#{IOStreams::Pgp.executable} #{loopback} --batch --no-tty --yes --decrypt --passphrase-fd 0 #{file_name}"
31
31
  IOStreams::Pgp.logger&.debug { "IOStreams::Pgp::Reader.open: #{command}" }
32
32
 
@@ -42,9 +42,7 @@ module IOStreams
42
42
  # Ignore broken pipe because gpg terminates early due to an error
43
43
  raise(Pgp::Failure, "GPG Failed reading from encrypted file: #{file_name}: #{stderr.read.chomp}")
44
44
  end
45
- unless waith_thr.value.success?
46
- raise(Pgp::Failure, "GPG Failed to decrypt file: #{file_name}: #{stderr.read.chomp}")
47
- end
45
+ raise(Pgp::Failure, "GPG Failed to decrypt file: #{file_name}: #{stderr.read.chomp}") unless waith_thr.value.success?
48
46
 
49
47
  result
50
48
  end
@@ -1,4 +1,4 @@
1
- require 'open3'
1
+ require "open3"
2
2
 
3
3
  module IOStreams
4
4
  module Pgp
@@ -81,7 +81,6 @@ module IOStreams
81
81
  end
82
82
  end
83
83
  end
84
-
85
84
  end
86
85
  end
87
86
  end
@@ -4,14 +4,14 @@ module IOStreams
4
4
  # and then pass that filename in for this reader.
5
5
  def self.stream(input_stream, **args, &block)
6
6
  Utils.temp_file_name("iostreams_reader") do |file_name|
7
- ::File.open(file_name, 'wb') { |target| ::IO.copy_stream(input_stream, target) }
7
+ ::File.open(file_name, "wb") { |target| ::IO.copy_stream(input_stream, target) }
8
8
  file(file_name, **args, &block)
9
9
  end
10
10
  end
11
11
 
12
12
  # When a Writer supports streams, also allow it to simply support a file
13
13
  def self.file(file_name, original_file_name: file_name, **args, &block)
14
- ::File.open(file_name, 'rb') { |file| stream(file, original_file_name: original_file_name, **args, &block) }
14
+ ::File.open(file_name, "rb") { |file| stream(file, original_file_name: original_file_name, **args, &block) }
15
15
  end
16
16
 
17
17
  # For processing by either a file name or an open IO stream.
@@ -35,9 +35,7 @@ module IOStreams
35
35
  #
36
36
  # For all other parameters, see Tabular::Header.new
37
37
  def initialize(line_writer, columns: nil, **args)
38
- unless line_writer.respond_to?(:<<)
39
- raise(ArgumentError, 'Stream must be a IOStreams::Line::Writer or implement #<<')
40
- end
38
+ raise(ArgumentError, "Stream must be a IOStreams::Line::Writer or implement #<<") unless line_writer.respond_to?(:<<)
41
39
 
42
40
  @tabular = IOStreams::Tabular.new(columns: columns, **args)
43
41
  @line_writer = line_writer
@@ -47,7 +45,7 @@ module IOStreams
47
45
  end
48
46
 
49
47
  def <<(hash)
50
- raise(ArgumentError, '#<< only accepts a Hash argument') unless hash.is_a?(Hash)
48
+ raise(ArgumentError, "#<< only accepts a Hash argument") unless hash.is_a?(Hash)
51
49
 
52
50
  if @tabular.header?
53
51
  # Extract header from the keys from the first row when not supplied above.
@@ -1,4 +1,4 @@
1
- require 'csv'
1
+ require "csv"
2
2
  module IOStreams
3
3
  module Row
4
4
  # Example:
@@ -37,9 +37,7 @@ module IOStreams
37
37
  #
38
38
  # For all other parameters, see Tabular::Header.new
39
39
  def initialize(line_writer, columns: nil, **args)
40
- unless line_writer.respond_to?(:<<)
41
- raise(ArgumentError, 'Stream must be a IOStreams::Line::Writer or implement #<<')
42
- end
40
+ raise(ArgumentError, "Stream must be a IOStreams::Line::Writer or implement #<<") unless line_writer.respond_to?(:<<)
43
41
 
44
42
  @tabular = IOStreams::Tabular.new(columns: columns, **args)
45
43
  @line_writer = line_writer
@@ -50,7 +48,7 @@ module IOStreams
50
48
 
51
49
  # Supply a hash or an array to render
52
50
  def <<(array)
53
- raise(ArgumentError, 'Must supply an Array') unless array.is_a?(Array)
51
+ raise(ArgumentError, "Must supply an Array") unless array.is_a?(Array)
54
52
 
55
53
  if @tabular.header?
56
54
  # If header (columns) was not supplied as an argument, assume first line is the header.
@@ -4,7 +4,7 @@ module IOStreams
4
4
  attr_writer :builder
5
5
 
6
6
  def initialize(io_stream)
7
- raise(ArgumentError, 'io_stream cannot be nil') if io_stream.nil?
7
+ raise(ArgumentError, "io_stream cannot be nil") if io_stream.nil?
8
8
  raise(ArgumentError, "io_stream must not be a string: #{io_stream.inspect}") if io_stream.is_a?(String)
9
9
 
10
10
  @io_stream = io_stream
@@ -266,7 +266,7 @@ module IOStreams
266
266
  # IOStreams.path(".profile").extension #=> ""
267
267
  # IOStreams.path(".profile.sh").extension #=> "sh"
268
268
  def extension
269
- extname&.sub(/^\./, '')
269
+ extname&.sub(/^\./, "")
270
270
  end
271
271
 
272
272
  private
@@ -280,7 +280,7 @@ module IOStreams
280
280
  end
281
281
 
282
282
  def line_reader(embedded_within: nil, **args)
283
- embedded_within = '"' if embedded_within.nil? && builder.file_name&.include?('.csv')
283
+ embedded_within = '"' if embedded_within.nil? && builder.file_name&.include?(".csv")
284
284
 
285
285
  stream_reader { |io| yield IOStreams::Line::Reader.new(io, embedded_within: embedded_within, **args) }
286
286
  end
@@ -304,19 +304,19 @@ module IOStreams
304
304
  end
305
305
 
306
306
  def line_writer(**args, &block)
307
- return block.call(io_stream) if io_stream && io_stream.is_a?(IOStreams::Line::Writer)
307
+ return block.call(io_stream) if io_stream&.is_a?(IOStreams::Line::Writer)
308
308
 
309
309
  writer { |io| IOStreams::Line::Writer.stream(io, **args, &block) }
310
310
  end
311
311
 
312
312
  def row_writer(delimiter: $/, **args, &block)
313
- return block.call(io_stream) if io_stream && io_stream.is_a?(IOStreams::Row::Writer)
313
+ return block.call(io_stream) if io_stream&.is_a?(IOStreams::Row::Writer)
314
314
 
315
315
  line_writer(delimiter: delimiter) { |io| IOStreams::Row::Writer.stream(io, **args, &block) }
316
316
  end
317
317
 
318
318
  def record_writer(delimiter: $/, **args, &block)
319
- return block.call(io_stream) if io_stream && io_stream.is_a?(IOStreams::Record::Writer)
319
+ return block.call(io_stream) if io_stream&.is_a?(IOStreams::Record::Writer)
320
320
 
321
321
  line_writer(delimiter: delimiter) { |io| IOStreams::Record::Writer.stream(io, **args, &block) }
322
322
  end
@@ -3,9 +3,7 @@ module IOStreams
3
3
  class Reader < IOStreams::Reader
4
4
  # read from a file/stream using Symmetric Encryption
5
5
  def self.stream(input_stream, **args, &block)
6
- unless defined?(SymmetricEncryption)
7
- Utils.load_soft_dependency('symmetric-encryption', '.enc streaming')
8
- end
6
+ Utils.load_soft_dependency("symmetric-encryption", ".enc streaming") unless defined?(SymmetricEncryption)
9
7
 
10
8
  ::SymmetricEncryption::Reader.open(input_stream, **args, &block)
11
9
  end
@@ -5,9 +5,7 @@ module IOStreams
5
5
  # By default the output stream is compressed.
6
6
  # If the input_stream is already compressed consider setting compress: false.
7
7
  def self.stream(input_stream, compress: true, **args, &block)
8
- unless defined?(SymmetricEncryption)
9
- Utils.load_soft_dependency('symmetric-encryption', '.enc streaming')
10
- end
8
+ Utils.load_soft_dependency("symmetric-encryption", ".enc streaming") unless defined?(SymmetricEncryption)
11
9
 
12
10
  ::SymmetricEncryption::Writer.open(input_stream, compress: compress, **args, &block)
13
11
  end
@@ -15,9 +13,7 @@ module IOStreams
15
13
  # Write to stream using Symmetric Encryption
16
14
  # By default the output stream is compressed unless the file_name extension indicates the file is already compressed.
17
15
  def self.file(file_name, compress: nil, **args, &block)
18
- unless defined?(SymmetricEncryption)
19
- Utils.load_soft_dependency('symmetric-encryption', '.enc streaming')
20
- end
16
+ Utils.load_soft_dependency("symmetric-encryption", ".enc streaming") unless defined?(SymmetricEncryption)
21
17
 
22
18
  ::SymmetricEncryption::Writer.open(file_name, compress: compress, **args, &block)
23
19
  end
@@ -28,20 +28,20 @@ module IOStreams
28
28
  # tabular.render({"third"=>"3", "first_field"=>"1" })
29
29
  # # => "1,,3"
30
30
  class Tabular
31
- autoload :Header, 'io_streams/tabular/header'
31
+ autoload :Header, "io_streams/tabular/header"
32
32
 
33
33
  module Parser
34
- autoload :Array, 'io_streams/tabular/parser/array'
35
- autoload :Base, 'io_streams/tabular/parser/base'
36
- autoload :Csv, 'io_streams/tabular/parser/csv'
37
- autoload :Fixed, 'io_streams/tabular/parser/fixed'
38
- autoload :Hash, 'io_streams/tabular/parser/hash'
39
- autoload :Json, 'io_streams/tabular/parser/json'
40
- autoload :Psv, 'io_streams/tabular/parser/psv'
34
+ autoload :Array, "io_streams/tabular/parser/array"
35
+ autoload :Base, "io_streams/tabular/parser/base"
36
+ autoload :Csv, "io_streams/tabular/parser/csv"
37
+ autoload :Fixed, "io_streams/tabular/parser/fixed"
38
+ autoload :Hash, "io_streams/tabular/parser/hash"
39
+ autoload :Json, "io_streams/tabular/parser/json"
40
+ autoload :Psv, "io_streams/tabular/parser/psv"
41
41
  end
42
42
 
43
43
  module Utility
44
- autoload :CSVRow, 'io_streams/tabular/utility/csv_row'
44
+ autoload :CSVRow, "io_streams/tabular/utility/csv_row"
45
45
  end
46
46
 
47
47
  attr_reader :format, :header, :parser
@@ -132,6 +132,7 @@ module IOStreams
132
132
  # register_format(:csv, IOStreams::Tabular::Parser::Csv)
133
133
  def self.register_format(format, parser)
134
134
  raise(ArgumentError, "Invalid format #{format.inspect}") unless format.nil? || format.to_s =~ /\A\w+\Z/
135
+
135
136
  @formats[format.nil? ? nil : format.to_sym] = parser
136
137
  end
137
138
 
@@ -143,6 +144,7 @@ module IOStreams
143
144
  # register_extension(:xls)
144
145
  def self.deregister_format(format)
145
146
  raise(ArgumentError, "Invalid format #{format.inspect}") unless format.to_s =~ /\A\w+\Z/
147
+
146
148
  @formats.delete(format.to_sym)
147
149
  end
148
150
 
@@ -163,7 +165,7 @@ module IOStreams
163
165
  # Returns the parser to use with tabular for the supplied file_name
164
166
  def self.parser_class_for_file_name(file_name)
165
167
  format = nil
166
- file_name.to_s.split('.').reverse_each do |ext|
168
+ file_name.to_s.split(".").reverse_each do |ext|
167
169
  if @formats.include?(ext.to_sym)
168
170
  format = ext.to_sym
169
171
  break