iostreams 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -91,7 +91,7 @@ module IOStreams
91
91
  case row
92
92
  when Array
93
93
  unless columns
94
- raise(IOStreams::Errors::InvalidHeader, 'Missing mandatory header when trying to convert a row into a hash')
94
+ raise(IOStreams::Errors::InvalidHeader, "Missing mandatory header when trying to convert a row into a hash")
95
95
  end
96
96
 
97
97
  array_to_hash(row)
@@ -142,9 +142,9 @@ module IOStreams
142
142
 
143
143
  def cleanse_column(name)
144
144
  cleansed = name.to_s.strip.downcase
145
- cleansed.gsub!(/\s+/, '_')
146
- cleansed.gsub!(/-+/, '_')
147
- cleansed.gsub!(/\W+/, '')
145
+ cleansed.gsub!(/\s+/, "_")
146
+ cleansed.gsub!(/-+/, "_")
147
+ cleansed.gsub!(/\W+/, "")
148
148
  cleansed
149
149
  end
150
150
  end
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require "json"
2
2
  module IOStreams
3
3
  class Tabular
4
4
  module Parser
@@ -15,9 +15,7 @@ module IOStreams
15
15
 
16
16
  # Returns Array
17
17
  def parse(row)
18
- unless row.is_a?(::Array)
19
- raise(IOStreams::Errors::TypeMismatch, "Format is :array. Invalid input: #{row.class.name}")
20
- end
18
+ raise(IOStreams::Errors::TypeMismatch, "Format is :array. Invalid input: #{row.class.name}") unless row.is_a?(::Array)
21
19
 
22
20
  row
23
21
  end
@@ -1,4 +1,4 @@
1
- require 'csv'
1
+ require "csv"
2
2
  module IOStreams
3
3
  class Tabular
4
4
  module Parser
@@ -25,9 +25,7 @@ module IOStreams
25
25
  def parse(row)
26
26
  return row if row.is_a?(::Array)
27
27
 
28
- unless row.is_a?(String)
29
- raise(IOStreams::Errors::TypeMismatch, "Format is :csv. Invalid input: #{row.class.name}")
30
- end
28
+ raise(IOStreams::Errors::TypeMismatch, "Format is :csv. Invalid input: #{row.class.name}") unless row.is_a?(String)
31
29
 
32
30
  parse_line(row)
33
31
  end
@@ -50,7 +48,7 @@ module IOStreams
50
48
  end
51
49
 
52
50
  def render_array(array)
53
- CSV.generate_line(array, encoding: 'UTF-8', row_sep: '')
51
+ CSV.generate_line(array, encoding: "UTF-8", row_sep: "")
54
52
  end
55
53
  else
56
54
  def parse_line(line)
@@ -23,7 +23,7 @@ module IOStreams
23
23
  def render(row, header)
24
24
  hash = header.to_hash(row)
25
25
 
26
- result = ''
26
+ result = ""
27
27
  fixed_layout.each do |map|
28
28
  # A nil value is considered an empty string
29
29
  value = hash[map.key].to_s
@@ -42,8 +42,8 @@ module IOStreams
42
42
  hash = {}
43
43
  index = 0
44
44
  fixed_layout.each do |map|
45
- value = line[index..(index + map.size - 1)]
46
- index += map.size
45
+ value = line[index..(index + map.size - 1)]
46
+ index += map.size
47
47
  hash[map.key] = value.to_s.strip
48
48
  end
49
49
  hash
@@ -60,6 +60,7 @@ module IOStreams
60
60
  size = map[:size]
61
61
  key = map[:key]
62
62
  raise(ArgumentError, "Missing required :key and :size in: #{map.inspect}") unless size && key
63
+
63
64
  FixedLayout.new(key, size)
64
65
  end
65
66
  end
@@ -1,12 +1,10 @@
1
- require 'json'
1
+ require "json"
2
2
  module IOStreams
3
3
  class Tabular
4
4
  module Parser
5
5
  class Hash < Base
6
6
  def parse(row)
7
- unless row.is_a?(::Hash)
8
- raise(IOStreams::Errors::TypeMismatch, "Format is :hash. Invalid input: #{row.class.name}")
9
- end
7
+ raise(IOStreams::Errors::TypeMismatch, "Format is :hash. Invalid input: #{row.class.name}") unless row.is_a?(::Hash)
10
8
 
11
9
  row
12
10
  end
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require "json"
2
2
  module IOStreams
3
3
  class Tabular
4
4
  module Parser
@@ -7,9 +7,7 @@ module IOStreams
7
7
  def parse(row)
8
8
  return row if row.is_a?(::Hash)
9
9
 
10
- unless row.is_a?(String)
11
- raise(IOStreams::Errors::TypeMismatch, "Format is :json. Invalid input: #{row.class.name}")
12
- end
10
+ raise(IOStreams::Errors::TypeMismatch, "Format is :json. Invalid input: #{row.class.name}") unless row.is_a?(String)
13
11
 
14
12
  JSON.parse(row)
15
13
  end
@@ -12,27 +12,25 @@ module IOStreams
12
12
  raise(IOStreams::Errors::InvalidHeader, "Format is :psv. Invalid input header: #{row.class.name}")
13
13
  end
14
14
 
15
- row.split('|')
15
+ row.split("|")
16
16
  end
17
17
 
18
18
  # Returns [Array] the parsed PSV line
19
19
  def parse(row)
20
20
  return row if row.is_a?(::Array)
21
21
 
22
- unless row.is_a?(String)
23
- raise(IOStreams::Errors::TypeMismatch, "Format is :psv. Invalid input: #{row.class.name}")
24
- end
22
+ raise(IOStreams::Errors::TypeMismatch, "Format is :psv. Invalid input: #{row.class.name}") unless row.is_a?(String)
25
23
 
26
- row.split('|')
24
+ row.split("|")
27
25
  end
28
26
 
29
27
  # Return the supplied array as a single line JSON string.
30
28
  def render(row, header)
31
29
  array = header.to_array(row)
32
30
  cleansed_array = array.collect do |i|
33
- i.is_a?(String) ? i.tr('|', ':') : i
31
+ i.is_a?(String) ? i.tr("|", ":") : i
34
32
  end
35
- cleansed_array.join('|')
33
+ cleansed_array.join("|")
36
34
  end
37
35
  end
38
36
  end
@@ -1,4 +1,4 @@
1
- require 'csv'
1
+ require "csv"
2
2
  module IOStreams
3
3
  class Tabular
4
4
  module Utility
@@ -11,11 +11,11 @@ module IOStreams
11
11
  # the file is broken apart based on line feeds during the upload process and
12
12
  # is then processed by each worker on a line by line basis.
13
13
  class CSVRow < ::CSV
14
- UTF8_ENCODING = Encoding.find('UTF-8').freeze
14
+ UTF8_ENCODING = Encoding.find("UTF-8").freeze
15
15
 
16
16
  def initialize(encoding = UTF8_ENCODING)
17
- @io = StringIO.new(''.force_encoding(encoding))
18
- super(@io, row_sep: '')
17
+ @io = StringIO.new("".force_encoding(encoding))
18
+ super(@io, row_sep: "")
19
19
  end
20
20
 
21
21
  # Parse a single line of CSV data
@@ -39,9 +39,7 @@ module IOStreams
39
39
  if part[-1] == @quote_char && part.count(@quote_char).odd?
40
40
  # extended column ends
41
41
  csv.last << part[0..-2]
42
- if csv.last =~ @parsers[:stray_quote]
43
- raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}"
44
- end
42
+ raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}" if csv.last =~ @parsers[:stray_quote]
45
43
 
46
44
  csv.last.gsub!(@quote_char * 2, @quote_char)
47
45
  in_extended_col = false
@@ -59,9 +57,7 @@ module IOStreams
59
57
  else
60
58
  # regular quoted column
61
59
  csv << part[1..-2]
62
- if csv.last =~ @parsers[:stray_quote]
63
- raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}"
64
- end
60
+ raise MalformedCSVError, "Missing or stray quote in line #{lineno + 1}" if csv.last =~ @parsers[:stray_quote]
65
61
 
66
62
  csv.last.gsub!(@quote_char * 2, @quote_char)
67
63
  end
@@ -82,11 +78,9 @@ module IOStreams
82
78
  # column.
83
79
  csv[-1][-1] = @row_sep if in_extended_col
84
80
 
85
- if in_extended_col
86
- raise MalformedCSVError, "Unclosed quoted field on line #{lineno + 1}."
87
- end
81
+ raise MalformedCSVError, "Unclosed quoted field on line #{lineno + 1}." if in_extended_col
88
82
 
89
- @lineno += 1
83
+ @lineno += 1
90
84
 
91
85
  # save fields unconverted fields, if needed...
92
86
  unconverted = csv.dup if @unconverted_fields
@@ -97,9 +91,7 @@ module IOStreams
97
91
  csv = parse_headers(csv) if @use_headers
98
92
 
99
93
  # inject unconverted fields and accessor, if requested...
100
- if @unconverted_fields && (!csv.respond_to? :unconverted_fields)
101
- add_unconverted_fields(csv, unconverted)
102
- end
94
+ add_unconverted_fields(csv, unconverted) if @unconverted_fields && (!csv.respond_to? :unconverted_fields)
103
95
 
104
96
  csv
105
97
  end
@@ -1,4 +1,4 @@
1
- require 'uri'
1
+ require "uri"
2
2
  module IOStreams
3
3
  module Utils
4
4
  MAX_TEMP_FILE_NAME_ATTEMPTS = 5
@@ -24,7 +24,7 @@ module IOStreams
24
24
  # Yields the path to a temporary file_name.
25
25
  #
26
26
  # File is deleted upon completion if present.
27
- def self.temp_file_name(basename, extension = '')
27
+ def self.temp_file_name(basename, extension = "")
28
28
  result = nil
29
29
  ::Dir::Tmpname.create([basename, extension], IOStreams.temp_dir, max_try: MAX_TEMP_FILE_NAME_ATTEMPTS) do |tmpname|
30
30
  begin
@@ -40,7 +40,7 @@ module IOStreams
40
40
  attr_reader :scheme, :hostname, :path, :user, :password, :port, :query
41
41
 
42
42
  def initialize(url)
43
- url = url.gsub(' ', '%20')
43
+ url = url.gsub(" ", "%20")
44
44
  uri = ::URI.parse(url)
45
45
  @scheme = uri.scheme
46
46
  @hostname = uri.hostname
@@ -0,0 +1,98 @@
1
+ require "net/http"
2
+ require "uri"
3
+ module IOStreams
4
+ module Utils
5
+ class ReliableHTTP
6
+ attr_reader :username, :password, :max_redirects, :url
7
+
8
+ # Reliable HTTP implementation with support for:
9
+ # * HTTP Redirects
10
+ # * Basic authentication
11
+ # * Raises an exception anytime the HTTP call is not successful.
12
+ # * TODO: Automatic retries with a logarithmic backoff strategy.
13
+ #
14
+ # Parameters:
15
+ # url: [String]
16
+ # URI of the file to download.
17
+ # Example:
18
+ # https://www5.fdic.gov/idasp/Offices2.zip
19
+ # http://hostname/path/file_name
20
+ #
21
+ # Full url showing all the optional elements that can be set via the url:
22
+ # https://username:password@hostname/path/file_name
23
+ #
24
+ # username: [String]
25
+ # When supplied, basic authentication is used with the username and password.
26
+ #
27
+ # password: [String]
28
+ # Password to use use with basic authentication when the username is supplied.
29
+ #
30
+ # max_redirects: [Integer]
31
+ # Maximum number of http redirects to follow.
32
+ def initialize(url, username: nil, password: nil, max_redirects: 10)
33
+ uri = URI.parse(url)
34
+ unless %w[http https].include?(uri.scheme)
35
+ raise(ArgumentError, "Invalid URL. Required Format: 'http://<host_name>/<file_name>', or 'https://<host_name>/<file_name>'")
36
+ end
37
+
38
+ @username = username || uri.user
39
+ @password = password || uri.password
40
+ @max_redirects = max_redirects
41
+ @url = url
42
+ end
43
+
44
+ # Read a file using an http get.
45
+ #
46
+ # For example:
47
+ # IOStreams.path('https://www5.fdic.gov/idasp/Offices2.zip').reader {|file| puts file.read}
48
+ #
49
+ # Read the file without unzipping and streaming the first file in the zip:
50
+ # IOStreams.path('https://www5.fdic.gov/idasp/Offices2.zip').stream(:none).reader {|file| puts file.read}
51
+ #
52
+ # Notes:
53
+ # * Since Net::HTTP download only supports a push stream, the data is streamed into a tempfile first.
54
+ def post(&block)
55
+ handle_redirects(Net::HTTP::Post, url, max_redirects, &block)
56
+ end
57
+
58
+ def get(&block)
59
+ handle_redirects(Net::HTTP::Get, url, max_redirects, &block)
60
+ end
61
+
62
+ private
63
+
64
+ def handle_redirects(request_class, uri, max_redirects, &block)
65
+ uri = URI.parse(uri) unless uri.is_a?(URI)
66
+ result = nil
67
+ raise(IOStreams::Errors::CommunicationsFailure, "Too many redirects") if max_redirects < 1
68
+
69
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
70
+ request = request_class.new(uri)
71
+ request.basic_auth(username, password) if username
72
+
73
+ http.request(request) do |response|
74
+ raise(IOStreams::Errors::CommunicationsFailure, "Invalid URL: #{uri}") if response.is_a?(Net::HTTPNotFound)
75
+
76
+ if response.is_a?(Net::HTTPUnauthorized)
77
+ raise(IOStreams::Errors::CommunicationsFailure, "Authorization Required: Invalid :username or :password.")
78
+ end
79
+
80
+ if response.is_a?(Net::HTTPRedirection)
81
+ new_uri = response["location"]
82
+ return handle_redirects(request_class, new_uri, max_redirects: max_redirects - 1, &block)
83
+ end
84
+
85
+ unless response.is_a?(Net::HTTPSuccess)
86
+ raise(IOStreams::Errors::CommunicationsFailure, "Invalid response code: #{response.code}")
87
+ end
88
+
89
+ yield(response) if block_given?
90
+
91
+ result = response
92
+ end
93
+ end
94
+ result
95
+ end
96
+ end
97
+ end
98
+ end
@@ -1,3 +1,3 @@
1
1
  module IOStreams
2
- VERSION = "1.1.0".freeze
2
+ VERSION = "1.1.1".freeze
3
3
  end
@@ -5,7 +5,7 @@ module IOStreams
5
5
  def self.stream(output_stream, original_file_name: nil, **args, &block)
6
6
  Utils.temp_file_name("iostreams_writer") do |file_name|
7
7
  file(file_name, original_file_name: original_file_name, **args, &block)
8
- ::File.open(file_name, 'rb') { |source| ::IO.copy_stream(source, output_stream) }
8
+ ::File.open(file_name, "rb") { |source| ::IO.copy_stream(source, output_stream) }
9
9
  end
10
10
  end
11
11
 
@@ -1,4 +1,4 @@
1
- require 'csv'
1
+ require "csv"
2
2
 
3
3
  module IOStreams
4
4
  module Xlsx
@@ -6,15 +6,15 @@ module IOStreams
6
6
  # Convert a xlsx, or xlsm file into CSV format.
7
7
  def self.file(file_name, original_file_name: file_name, &block)
8
8
  # Stream into a temp file as csv
9
- Utils.temp_file_name('iostreams_csv') do |temp_file_name|
10
- ::File.open(temp_file_name, 'wb') { |io| new(file_name).each { |lines| io << lines.to_csv } }
11
- ::File.open(temp_file_name, 'rb', &block)
9
+ Utils.temp_file_name("iostreams_csv") do |temp_file_name|
10
+ ::File.open(temp_file_name, "wb") { |io| new(file_name).each { |lines| io << lines.to_csv } }
11
+ ::File.open(temp_file_name, "rb", &block)
12
12
  end
13
13
  end
14
14
 
15
15
  def initialize(file_name)
16
16
  begin
17
- require 'creek' unless defined?(Creek::Book)
17
+ require "creek" unless defined?(Creek::Book)
18
18
  rescue LoadError => e
19
19
  raise(LoadError, "Please install the 'creek' gem for xlsx streaming support. #{e.message}")
20
20
  end
@@ -48,7 +48,7 @@ module IOStreams
48
48
  # The input stream from the first file found in the zip file is passed
49
49
  # to the supplied block
50
50
  def self.file(file_name, entry_file_name: nil, &block)
51
- Utils.load_soft_dependency('rubyzip v1.x', 'Read Zip', 'zip') unless defined?(::Zip)
51
+ Utils.load_soft_dependency("rubyzip v1.x", "Read Zip", "zip") unless defined?(::Zip)
52
52
 
53
53
  ::Zip::File.open(file_name) do |zip_file|
54
54
  if entry_file_name
@@ -19,9 +19,9 @@ module IOStreams
19
19
  if entry_file_name.nil? && original_file_name && (original_file_name =~ /\.(zip)\z/i)
20
20
  entry_file_name = original_file_name.to_s[0..-5]
21
21
  end
22
- entry_file_name ||= 'file'
22
+ entry_file_name ||= "file"
23
23
 
24
- Utils.load_soft_dependency('zip_tricks', 'Zip') unless defined?(ZipTricks::Streamer)
24
+ Utils.load_soft_dependency("zip_tricks", "Zip") unless defined?(ZipTricks::Streamer)
25
25
 
26
26
  ZipTricks::Streamer.open(output_stream) { |zip| zip.write_deflated_file(entry_file_name, &block) }
27
27
  end
@@ -1,59 +1,59 @@
1
- require 'io_streams/version'
1
+ require "io_streams/version"
2
2
  # @formatter:off
3
3
  module IOStreams
4
- autoload :Builder, 'io_streams/builder'
5
- autoload :Errors, 'io_streams/errors'
6
- autoload :Path, 'io_streams/path'
7
- autoload :Pgp, 'io_streams/pgp'
8
- autoload :Reader, 'io_streams/reader'
9
- autoload :Stream, 'io_streams/stream'
10
- autoload :Tabular, 'io_streams/tabular'
11
- autoload :Utils, 'io_streams/utils'
12
- autoload :Writer, 'io_streams/writer'
4
+ autoload :Builder, "io_streams/builder"
5
+ autoload :Errors, "io_streams/errors"
6
+ autoload :Path, "io_streams/path"
7
+ autoload :Pgp, "io_streams/pgp"
8
+ autoload :Reader, "io_streams/reader"
9
+ autoload :Stream, "io_streams/stream"
10
+ autoload :Tabular, "io_streams/tabular"
11
+ autoload :Utils, "io_streams/utils"
12
+ autoload :Writer, "io_streams/writer"
13
13
 
14
14
  module Paths
15
- autoload :File, 'io_streams/paths/file'
16
- autoload :HTTP, 'io_streams/paths/http'
17
- autoload :Matcher, 'io_streams/paths/matcher'
18
- autoload :S3, 'io_streams/paths/s3'
19
- autoload :SFTP, 'io_streams/paths/sftp'
15
+ autoload :File, "io_streams/paths/file"
16
+ autoload :HTTP, "io_streams/paths/http"
17
+ autoload :Matcher, "io_streams/paths/matcher"
18
+ autoload :S3, "io_streams/paths/s3"
19
+ autoload :SFTP, "io_streams/paths/sftp"
20
20
  end
21
21
 
22
22
  module Bzip2
23
- autoload :Reader, 'io_streams/bzip2/reader'
24
- autoload :Writer, 'io_streams/bzip2/writer'
23
+ autoload :Reader, "io_streams/bzip2/reader"
24
+ autoload :Writer, "io_streams/bzip2/writer"
25
25
  end
26
26
  module Encode
27
- autoload :Reader, 'io_streams/encode/reader'
28
- autoload :Writer, 'io_streams/encode/writer'
27
+ autoload :Reader, "io_streams/encode/reader"
28
+ autoload :Writer, "io_streams/encode/writer"
29
29
  end
30
30
  module Gzip
31
- autoload :Reader, 'io_streams/gzip/reader'
32
- autoload :Writer, 'io_streams/gzip/writer'
31
+ autoload :Reader, "io_streams/gzip/reader"
32
+ autoload :Writer, "io_streams/gzip/writer"
33
33
  end
34
34
  module Line
35
- autoload :Reader, 'io_streams/line/reader'
36
- autoload :Writer, 'io_streams/line/writer'
35
+ autoload :Reader, "io_streams/line/reader"
36
+ autoload :Writer, "io_streams/line/writer"
37
37
  end
38
38
  module Record
39
- autoload :Reader, 'io_streams/record/reader'
40
- autoload :Writer, 'io_streams/record/writer'
39
+ autoload :Reader, "io_streams/record/reader"
40
+ autoload :Writer, "io_streams/record/writer"
41
41
  end
42
42
  module Row
43
- autoload :Reader, 'io_streams/row/reader'
44
- autoload :Writer, 'io_streams/row/writer'
43
+ autoload :Reader, "io_streams/row/reader"
44
+ autoload :Writer, "io_streams/row/writer"
45
45
  end
46
46
  module SymmetricEncryption
47
- autoload :Reader, 'io_streams/symmetric_encryption/reader'
48
- autoload :Writer, 'io_streams/symmetric_encryption/writer'
47
+ autoload :Reader, "io_streams/symmetric_encryption/reader"
48
+ autoload :Writer, "io_streams/symmetric_encryption/writer"
49
49
  end
50
50
  module Xlsx
51
- autoload :Reader, 'io_streams/xlsx/reader'
51
+ autoload :Reader, "io_streams/xlsx/reader"
52
52
  end
53
53
  module Zip
54
- autoload :Reader, 'io_streams/zip/reader'
55
- autoload :Writer, 'io_streams/zip/writer'
54
+ autoload :Reader, "io_streams/zip/reader"
55
+ autoload :Writer, "io_streams/zip/writer"
56
56
  end
57
57
  end
58
- require 'io_streams/deprecated'
59
- require 'io_streams/io_streams'
58
+ require "io_streams/deprecated"
59
+ require "io_streams/io_streams"