iostreams 0.16.0 → 0.16.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
  SHA256:
3
- metadata.gz: 9392af579f83fb26f1ea2cfeefae497362c1232ff1226adb4220cc54805b93c2
4
- data.tar.gz: 8db9dd03113c32ebe44b54610509dc86626f44deb6900fae65ac7cdd34a3abee
3
+ metadata.gz: 71dc5d69019340a1bcaf15bb7b79c46d136caee788c78ababcb1adbec55ccaae
4
+ data.tar.gz: 215a9d22d27fa102529a54b1886d54caad022289cb7bc62f0311e799fd2ead2a
5
5
  SHA512:
6
- metadata.gz: 2810231db04f7a98086bb47a7657adb7888dc3f16e03f48e9824170bf36a8df65ca006cfbcaca7360e42f609f5444be189fa24ba1ae4610c5c727f3c18c6bb85
7
- data.tar.gz: 2e247fb89ad090d96cd6e0b20aaf9afd0b71cbbef7dc6cb7e84bd60182c51c6ce9cb461dfcdb4d35d8e5b0cdfb8822667cb35f42a8e54ed6d67b4575d02bffdb
6
+ metadata.gz: 534218bfa084bcb43af55192210e08de829044ee316aa4043c9f06b0e97a6b484b4eb666821327f4fb79877383d10819f58570d7194420a00682a6e3e860d437
7
+ data.tar.gz: 0e8445aabb3cc8ae7a7f36859c12a724e8b4db966e97d45589ddd3ed1cc9fd30e9c2d2c29c321ee35ca2c4487f72004242ee2aa7d8425ac2061a792434e9fc66
@@ -316,8 +316,7 @@ module IOStreams
316
316
 
317
317
  # Iterate over a file / stream returning each record/line one at a time.
318
318
  def self.line_reader(file_name_or_io, streams: nil, file_name: nil, encoding: nil, encode_cleaner: nil, encode_replace: nil, **args, &block)
319
- return yield(file_name_or_io) if file_name_or_io.is_a?(IOStreams::Line::Reader) ||
320
- file_name_or_io.is_a?(Array)
319
+ return yield(file_name_or_io) if file_name_or_io.is_a?(IOStreams::Line::Reader) || file_name_or_io.is_a?(Array)
321
320
 
322
321
  reader(file_name_or_io, streams: streams, file_name: file_name, encoding: encoding, encode_cleaner: encode_cleaner, encode_replace: encode_replace) do |io|
323
322
  IOStreams::Line::Reader.open(io, **args, &block)
@@ -427,8 +426,14 @@ module IOStreams
427
426
 
428
427
  streams = streams_for_file_name(file_name) if streams.nil? && file_name
429
428
 
430
- # Shortcut for when it is already a stream and no further streams need to be applied.
431
- return block.call(file_name_or_io) if !file_name_or_io.is_a?(String) && (streams.nil? || streams.empty?)
429
+ # Shortcut for when it is already a stream
430
+ if !file_name_or_io.is_a?(String) && (streams.nil? || streams.empty?)
431
+ if encoding || encode_cleaner || encode_replace
432
+ return IOStreams::Encode::Reader.open(file_name_or_io, encoding: encoding, encode_cleaner: encode_cleaner, encode_replace: encode_replace, &block)
433
+ else
434
+ return block.call(file_name_or_io)
435
+ end
436
+ end
432
437
 
433
438
  if streams.nil?
434
439
  streams = file_name_or_io.is_a?(String) ? streams_for_file_name(file_name_or_io) : [nil]
@@ -61,7 +61,7 @@ module IOStreams
61
61
  # Auto-detect windows/linux line endings if not supplied. \n or \r\n
62
62
  @delimiter = delimiter || auto_detect_line_endings
63
63
 
64
- unless eof?
64
+ if @buffer
65
65
  # Change the delimiters encoding to match that of the input stream
66
66
  @delimiter = @delimiter.encode(@buffer.encoding)
67
67
  @delimiter_size = @delimiter.size
@@ -73,7 +73,10 @@ module IOStreams
73
73
  # Note:
74
74
  # * The line delimiter is _not_ returned.
75
75
  def each
76
- yield(readline) until eof?
76
+ until eof?
77
+ line = readline
78
+ yield(line) unless line.nil?
79
+ end
77
80
  line_count
78
81
  end
79
82
 
@@ -88,6 +91,7 @@ module IOStreams
88
91
  if index
89
92
  data = @buffer.slice(0, index)
90
93
  @buffer = @buffer.slice(index + @delimiter_size, @buffer.size)
94
+ @line_count += 1
91
95
  elsif @eof && @buffer.empty?
92
96
  data = nil
93
97
  @buffer = nil
@@ -95,9 +99,9 @@ module IOStreams
95
99
  # Last line without delimiter
96
100
  data = @buffer
97
101
  @buffer = nil
102
+ @line_count += 1
98
103
  end
99
104
 
100
- @line_count += 1
101
105
  data
102
106
  end
103
107
 
@@ -130,8 +134,6 @@ module IOStreams
130
134
  if block.nil?
131
135
  @eof = true
132
136
  return false
133
- elsif block.size < @buffer_size
134
- @eof = true
135
137
  end
136
138
 
137
139
  if @buffer
@@ -1,3 +1,3 @@
1
1
  module IOStreams
2
- VERSION = '0.16.0'
2
+ VERSION = '0.16.1'
3
3
  end
@@ -11,7 +11,7 @@ class EncodeReaderTest < Minitest::Test
11
11
  end
12
12
 
13
13
  let :cleansed_data do
14
- bad_data.gsub("\xE9".b, '?')
14
+ bad_data.gsub("\xE9".b, '')
15
15
  end
16
16
 
17
17
  let :stripped_data do
@@ -32,7 +32,7 @@ class EncodeReaderTest < Minitest::Test
32
32
  it 'strips invalid characters' do
33
33
  input = StringIO.new(bad_data)
34
34
  data =
35
- IOStreams::Encode::Reader.open(input, encoding: 'UTF-8', encode_replace: '?') do |io|
35
+ IOStreams::Encode::Reader.open(input, encoding: 'UTF-8', encode_replace: '') do |io|
36
36
  io.read
37
37
  end
38
38
  assert_equal cleansed_data, data
@@ -43,7 +43,7 @@ class EncodeReaderTest < Minitest::Test
43
43
  it 'strips non-printable characters' do
44
44
  input = StringIO.new(bad_data)
45
45
  data =
46
- IOStreams::Encode::Reader.open(input, encoding: 'UTF-8', encode_cleaner: :printable, encode_replace: '?') do |io|
46
+ IOStreams::Encode::Reader.open(input, encoding: 'UTF-8', encode_cleaner: :printable, encode_replace: '') do |io|
47
47
  io.read
48
48
  end
49
49
  assert_equal stripped_data, data
@@ -18,6 +18,18 @@ class IOStreamsTest < Minitest::Test
18
18
  temp_file.path
19
19
  end
20
20
 
21
+ let :bad_data do
22
+ [
23
+ "New M\xE9xico,NE".b,
24
+ 'good line',
25
+ "New M\xE9xico,\x07SF".b
26
+ ].join("\n").encode('BINARY')
27
+ end
28
+
29
+ let :stripped_data do
30
+ bad_data.gsub("\xE9".b, '').gsub("\x07", '')
31
+ end
32
+
21
33
  after do
22
34
  temp_file.delete
23
35
  end
@@ -86,8 +98,19 @@ class IOStreamsTest < Minitest::Test
86
98
  describe '.each_line' do
87
99
  it 'returns a line at a time' do
88
100
  lines = []
89
- IOStreams.each_line(source_file_name) { |line| lines << line }
101
+ count = IOStreams.each_line(source_file_name) { |line| lines << line }
90
102
  assert_equal data.lines.map(&:strip), lines
103
+ assert_equal data.lines.count, count
104
+ end
105
+
106
+ it 'strips non-printable characters' do
107
+ input = StringIO.new(bad_data)
108
+ lines = []
109
+ count = IOStreams.each_line(input, encoding: 'UTF-8', encode_cleaner: :printable, encode_replace: '') do |line|
110
+ lines << line
111
+ end
112
+ assert_equal stripped_data.lines.map(&:strip), lines
113
+ assert_equal stripped_data.lines.count, count
91
114
  end
92
115
  end
93
116
 
@@ -19,39 +19,43 @@ class LineReaderTest < Minitest::Test
19
19
  describe '#each' do
20
20
  it 'each_line file' do
21
21
  lines = []
22
- IOStreams::Line::Reader.open(file_name) do |io|
22
+ count = IOStreams::Line::Reader.open(file_name) do |io|
23
23
  io.each { |line| lines << line }
24
24
  end
25
25
  assert_equal data, lines
26
+ assert_equal data.size, count
26
27
  end
27
28
 
28
29
  it 'each_line stream' do
29
30
  lines = []
30
- File.open(file_name) do |file|
31
+ count = File.open(file_name) do |file|
31
32
  IOStreams::Line::Reader.open(file) do |io|
32
33
  io.each { |line| lines << line }
33
34
  end
34
35
  end
35
36
  assert_equal data, lines
37
+ assert_equal data.size, count
36
38
  end
37
39
 
38
40
  ["\r\n", "\n", "\r"].each do |delimiter|
39
41
  it "autodetect delimiter: #{delimiter.inspect}" do
40
42
  lines = []
41
43
  stream = StringIO.new(data.join(delimiter))
42
- IOStreams::Line::Reader.open(stream, buffer_size: 15) do |io|
44
+ count = IOStreams::Line::Reader.open(stream, buffer_size: 15) do |io|
43
45
  io.each { |line| lines << line }
44
46
  end
45
47
  assert_equal data, lines
48
+ assert_equal data.size, count
46
49
  end
47
50
 
48
51
  it "single read autodetect delimiter: #{delimiter.inspect}" do
49
52
  lines = []
50
53
  stream = StringIO.new(data.join(delimiter))
51
- IOStreams::Line::Reader.open(stream) do |io|
54
+ count = IOStreams::Line::Reader.open(stream) do |io|
52
55
  io.each { |line| lines << line }
53
56
  end
54
57
  assert_equal data, lines
58
+ assert_equal data.size, count
55
59
  end
56
60
  end
57
61
 
@@ -59,10 +63,11 @@ class LineReaderTest < Minitest::Test
59
63
  it "reads delimited #{delimiter.inspect}" do
60
64
  lines = []
61
65
  stream = StringIO.new(data.join(delimiter))
62
- IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
66
+ count = IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
63
67
  io.each { |line| lines << line }
64
68
  end
65
69
  assert_equal data, lines
70
+ assert_equal data.size, count
66
71
  end
67
72
  end
68
73
 
@@ -70,10 +75,11 @@ class LineReaderTest < Minitest::Test
70
75
  delimiter = "\x01"
71
76
  lines = []
72
77
  stream = StringIO.new(data.join(delimiter).encode('ASCII-8BIT'))
73
- IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
78
+ count = IOStreams::Line::Reader.open(stream, buffer_size: 15, delimiter: delimiter) do |io|
74
79
  io.each { |line| lines << line }
75
80
  end
76
81
  assert_equal data, lines
82
+ assert_equal data.size, count
77
83
  end
78
84
 
79
85
  describe '#readline' do
@@ -13,20 +13,22 @@ class RowReaderTest < Minitest::Test
13
13
  describe '.open' do
14
14
  it 'file' do
15
15
  rows = []
16
- IOStreams::Row::Reader.open(file_name) do |io|
16
+ count = IOStreams::Row::Reader.open(file_name) do |io|
17
17
  io.each { |row| rows << row }
18
18
  end
19
19
  assert_equal expected, rows
20
+ assert_equal expected.size, count
20
21
  end
21
22
 
22
23
  it 'stream' do
23
24
  rows = []
24
- IOStreams.line_reader(file_name) do |file|
25
+ count = IOStreams.line_reader(file_name) do |file|
25
26
  IOStreams::Row::Reader.open(file) do |io|
26
27
  io.each { |row| rows << row }
27
28
  end
28
29
  end
29
30
  assert_equal expected, rows
31
+ assert_equal expected.size, count
30
32
  end
31
33
  end
32
34
 
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.16.0
4
+ version: 0.16.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: 2018-11-14 00:00:00.000000000 Z
11
+ date: 2018-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby