iostreams 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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