iostreams 0.15.0 → 0.16.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/io_streams/bzip2/reader.rb +1 -1
  3. data/lib/io_streams/bzip2/writer.rb +1 -1
  4. data/lib/io_streams/encode/reader.rb +102 -0
  5. data/lib/io_streams/encode/writer.rb +78 -0
  6. data/lib/io_streams/errors.rb +19 -0
  7. data/lib/io_streams/file/reader.rb +1 -1
  8. data/lib/io_streams/file/writer.rb +1 -3
  9. data/lib/io_streams/gzip/reader.rb +1 -1
  10. data/lib/io_streams/gzip/writer.rb +1 -1
  11. data/lib/io_streams/io_streams.rb +57 -38
  12. data/lib/io_streams/line/reader.rb +125 -69
  13. data/lib/io_streams/line/writer.rb +11 -35
  14. data/lib/io_streams/pgp.rb +1 -1
  15. data/lib/io_streams/record/reader.rb +12 -14
  16. data/lib/io_streams/record/writer.rb +12 -14
  17. data/lib/io_streams/row/reader.rb +15 -16
  18. data/lib/io_streams/row/writer.rb +14 -12
  19. data/lib/io_streams/tabular.rb +50 -30
  20. data/lib/io_streams/tabular/header.rb +6 -6
  21. data/lib/io_streams/tabular/parser/array.rb +2 -2
  22. data/lib/io_streams/tabular/parser/csv.rb +6 -2
  23. data/lib/io_streams/tabular/parser/fixed.rb +18 -37
  24. data/lib/io_streams/tabular/parser/hash.rb +1 -1
  25. data/lib/io_streams/tabular/parser/json.rb +3 -1
  26. data/lib/io_streams/tabular/parser/psv.rb +6 -2
  27. data/lib/io_streams/version.rb +1 -1
  28. data/lib/io_streams/xlsx/reader.rb +22 -32
  29. data/lib/iostreams.rb +6 -0
  30. data/test/encode_reader_test.rb +54 -0
  31. data/test/encode_writer_test.rb +82 -0
  32. data/test/io_streams_test.rb +0 -65
  33. data/test/line_reader_test.rb +180 -37
  34. data/test/tabular_test.rb +79 -3
  35. data/test/test_helper.rb +1 -1
  36. data/test/xlsx_reader_test.rb +7 -10
  37. metadata +10 -4
  38. data/lib/io_streams/tabular/errors.rb +0 -14
@@ -60,7 +60,7 @@ class TabularTest < Minitest::Test
60
60
 
61
61
  it 'raises exception for columns not in the whitelist' do
62
62
  tabular = IOStreams::Tabular.new(columns: [' first ', 'Unknown Column', 'thirD '], allowed_columns: @allowed_columns, skip_unknown: false)
63
- exc = assert_raises IOStreams::Tabular::Errors::InvalidHeader do
63
+ exc = assert_raises IOStreams::Errors::InvalidHeader do
64
64
  tabular.cleanse_header!
65
65
  end
66
66
  assert_equal 'Unknown columns after cleansing: Unknown Column', exc.message
@@ -69,7 +69,7 @@ class TabularTest < Minitest::Test
69
69
  it 'raises exception missing required columns' do
70
70
  required = ['first', 'second', 'fifth']
71
71
  tabular = IOStreams::Tabular.new(columns: [' first ', 'Second', 'thirD '], allowed_columns: @allowed_columns, required_columns: required)
72
- exc = assert_raises IOStreams::Tabular::Errors::InvalidHeader do
72
+ exc = assert_raises IOStreams::Errors::InvalidHeader do
73
73
  tabular.cleanse_header!
74
74
  end
75
75
  assert_equal 'Missing columns after cleansing: fifth', exc.message
@@ -77,7 +77,7 @@ class TabularTest < Minitest::Test
77
77
 
78
78
  it 'raises exception when no columns left' do
79
79
  tabular = IOStreams::Tabular.new(columns: ['one', 'two', 'three'], allowed_columns: @allowed_columns)
80
- exc = assert_raises IOStreams::Tabular::Errors::InvalidHeader do
80
+ exc = assert_raises IOStreams::Errors::InvalidHeader do
81
81
  tabular.cleanse_header!
82
82
  end
83
83
  assert_equal 'All columns are unknown after cleansing: one,two,three', exc.message
@@ -135,6 +135,47 @@ class TabularTest < Minitest::Test
135
135
  end
136
136
  end
137
137
 
138
+ describe ':fixed format' do
139
+ let :tabular do
140
+ layout = [
141
+ {key: 'name', size: 23},
142
+ {key: 'address', size: 40},
143
+ {key: 'zip', size: 5}
144
+ ]
145
+ IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
146
+ end
147
+
148
+ it 'parses to hash' do
149
+ assert hash = tabular.record_parse('Jack over there 34618')
150
+ assert_equal({'name' => 'Jack', 'address' => 'over there', 'zip' => '34618'}, hash)
151
+ end
152
+
153
+ it 'parses short string' do
154
+ # TODO: Raise exception on lines that are too short?
155
+ assert hash = tabular.record_parse('Jack over th')
156
+ assert_equal({'name' => 'Jack', 'address' => 'over th', 'zip' => ''}, hash)
157
+ end
158
+
159
+ it 'parses longer string' do
160
+ # TODO: Raise exception on lines that are too long?
161
+ assert hash = tabular.record_parse('Jack over there 34618........................................')
162
+ assert_equal({'name' => 'Jack', 'address' => 'over there', 'zip' => '34618'}, hash)
163
+ end
164
+
165
+ it 'parses empty strings' do
166
+ assert hash = tabular.record_parse(' 34618')
167
+ assert_equal({'name' => '', 'address' => '', 'zip' => '34618'}, hash)
168
+ end
169
+
170
+ it 'parses nil data as nil' do
171
+ refute tabular.record_parse(nil)
172
+ end
173
+
174
+ it 'parses empty string as nil' do
175
+ refute tabular.record_parse('')
176
+ end
177
+ end
178
+
138
179
  it 'skips columns not in the whitelist' do
139
180
  tabular.header.allowed_columns = ['first', 'second', 'third', 'fourth', 'fifth']
140
181
  tabular.cleanse_header!
@@ -179,6 +220,41 @@ class TabularTest < Minitest::Test
179
220
  assert_equal 'a:b:c|:|23', psv_string
180
221
  end
181
222
  end
223
+
224
+ describe ':fixed format' do
225
+ let :tabular do
226
+ layout = [
227
+ {key: 'name', size: 23},
228
+ {key: 'address', size: 40},
229
+ {key: 'zip', size: 5}
230
+ ]
231
+ IOStreams::Tabular.new(format: :fixed, format_options: {layout: layout})
232
+ end
233
+
234
+ it 'renders fixed data' do
235
+ assert string = tabular.render({'name' => 'Jack', 'address' => 'over there', 'zip' => 34618, 'phone' => '5551231234'})
236
+ assert_equal 'Jack over there 34618', string
237
+ end
238
+
239
+ it 'truncates long data' do
240
+ assert string = tabular.render({'name' => 'Jack', 'address' => 'over there', 'zip' => 3461832653653265, 'phone' => '5551231234'})
241
+ assert_equal 'Jack over there 34618', string
242
+ end
243
+
244
+ it 'renders nil as empty string' do
245
+ assert string = tabular.render('zip' => 3461832653653265)
246
+ assert_equal ' 34618', string
247
+ end
248
+
249
+ it 'renders boolean' do
250
+ assert string = tabular.render({'name' => true, 'address' => false, 'zip' => nil, 'phone' => '5551231234'})
251
+ assert_equal 'true false ', string
252
+ end
253
+
254
+ it 'renders no data as nil' do
255
+ refute tabular.render({})
256
+ end
257
+ end
182
258
  end
183
259
  end
184
260
  end
@@ -8,7 +8,7 @@ require 'awesome_print'
8
8
  require 'symmetric-encryption'
9
9
 
10
10
  # Since PGP libraries use UTC for Dates
11
- ENV['TZ']='UTC'
11
+ ENV['TZ'] = 'UTC'
12
12
 
13
13
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
14
14
 
@@ -1,4 +1,5 @@
1
1
  require_relative 'test_helper'
2
+ require 'csv'
2
3
 
3
4
  class XlsxReaderTest
4
5
  describe IOStreams::Xlsx::Reader do
@@ -17,23 +18,19 @@ class XlsxReaderTest
17
18
  describe 'with a file path' do
18
19
  it 'returns the contents of the file' do
19
20
  rows = []
20
- IOStreams::Xlsx::Reader.open(file_name) do |stream|
21
- stream.each { |row| rows << row }
22
- end
23
- assert_equal xlsx_contents, rows
21
+ csv = IOStreams::Xlsx::Reader.open(file_name, &:read)
22
+ assert_equal xlsx_contents, CSV.parse(csv)
24
23
  end
25
24
  end
26
25
 
27
26
  describe 'with a file stream' do
28
27
  it 'returns the contents of the file' do
29
- rows = []
30
- File.open(file_name) do |file|
31
- IOStreams::Xlsx::Reader.open(file) do |stream|
32
- stream.each { |row| rows << row }
33
- end
28
+ csv = ''
29
+ File.open(file_name, 'rb') do |file|
30
+ csv = IOStreams::Xlsx::Reader.open(file, &:read)
34
31
  end
35
32
 
36
- assert_equal xlsx_contents, rows
33
+ assert_equal xlsx_contents, CSV.parse(csv)
37
34
  end
38
35
  end
39
36
  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.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-02 00:00:00.000000000 Z
11
+ date: 2018-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -36,6 +36,9 @@ files:
36
36
  - Rakefile
37
37
  - lib/io_streams/bzip2/reader.rb
38
38
  - lib/io_streams/bzip2/writer.rb
39
+ - lib/io_streams/encode/reader.rb
40
+ - lib/io_streams/encode/writer.rb
41
+ - lib/io_streams/errors.rb
39
42
  - lib/io_streams/file/reader.rb
40
43
  - lib/io_streams/file/writer.rb
41
44
  - lib/io_streams/gzip/reader.rb
@@ -57,7 +60,6 @@ files:
57
60
  - lib/io_streams/sftp/writer.rb
58
61
  - lib/io_streams/streams.rb
59
62
  - lib/io_streams/tabular.rb
60
- - lib/io_streams/tabular/errors.rb
61
63
  - lib/io_streams/tabular/header.rb
62
64
  - lib/io_streams/tabular/parser/array.rb
63
65
  - lib/io_streams/tabular/parser/base.rb
@@ -74,6 +76,8 @@ files:
74
76
  - lib/iostreams.rb
75
77
  - test/bzip2_reader_test.rb
76
78
  - test/bzip2_writer_test.rb
79
+ - test/encode_reader_test.rb
80
+ - test/encode_writer_test.rb
77
81
  - test/file_reader_test.rb
78
82
  - test/file_writer_test.rb
79
83
  - test/files/spreadsheet.xlsx
@@ -113,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
117
  requirements:
114
118
  - - ">="
115
119
  - !ruby/object:Gem::Version
116
- version: '2.1'
120
+ version: '2.2'
117
121
  required_rubygems_version: !ruby/object:Gem::Requirement
118
122
  requirements:
119
123
  - - ">="
@@ -132,6 +136,7 @@ test_files:
132
136
  - test/row_writer_test.rb
133
137
  - test/zip_reader_test.rb
134
138
  - test/bzip2_writer_test.rb
139
+ - test/encode_writer_test.rb
135
140
  - test/gzip_writer_test.rb
136
141
  - test/file_reader_test.rb
137
142
  - test/record_reader_test.rb
@@ -149,6 +154,7 @@ test_files:
149
154
  - test/files/text.txt.gz
150
155
  - test/files/text.txt
151
156
  - test/gzip_reader_test.rb
157
+ - test/encode_reader_test.rb
152
158
  - test/test_helper.rb
153
159
  - test/file_writer_test.rb
154
160
  - test/tabular_test.rb
@@ -1,14 +0,0 @@
1
- module IOStreams
2
- class Tabular
3
- module Errors
4
- class Error < StandardError;
5
- end
6
-
7
- class InvalidHeader < Error;
8
- end
9
-
10
- class TypeMismatch < Error;
11
- end
12
- end
13
- end
14
- end