filter_io 0.2.7 → 0.2.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.tool-versions +1 -0
- data/README.markdown +1 -1
- data/filter_io.gemspec +2 -2
- data/lib/filter_io/version.rb +1 -1
- data/lib/filter_io.rb +10 -10
- data/spec/filter_io_spec.rb +35 -15
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2aa379c9231e3f092273dbc5cf5306b9dcb58b749aa4c3c4ada4081995b1dbf4
|
4
|
+
data.tar.gz: 370b83c3187be5d2a863e7b94e75a717da16ee6c25360edd91eae61ba0e713b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7805dc1d20a7325bb87161836b67e8cf949ed021411678f5280d0ebd85ef6e535c27cf4b32cc935b35690c99b529d79ad0413397ca0f50129a6f0a6a653016c3
|
7
|
+
data.tar.gz: e8d5aac3c61ca1b819e6b6b029af39a432735ab1734ec8d0a2ef3c0ee777812d185284a5ea40bd8275ee7ec4b34e5c11ce8857e60842a633f8aeb7c2b1f8f7db
|
data/.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 2.7.5
|
data/README.markdown
CHANGED
@@ -93,7 +93,7 @@ When either `readline`, `gets` or `read(nil)` is called, `filter_io` will proces
|
|
93
93
|
|
94
94
|
Ruby 1.9 has character encoding support can convert between UTF-8, ISO-8859-1, ASCII-8BIT, etc. This is triggered in `IO` by using `:external_encoding` and `:internal_encoding` when opening the stream.
|
95
95
|
`filter_io` will use the underlying stream's encoding settings when reading and filtering data. The processing block will be passed data in the internal encoding.
|
96
|
-
As per the core `IO` object, if `read` is called with a length (in bytes), the data will be returned in
|
96
|
+
As per the core `IO` object, if `read` is called with a length (in bytes), the data will be returned in ASCII-8BIT.
|
97
97
|
In summary, everything should Just Work™
|
98
98
|
|
99
99
|
### Notes on Patches/Pull Requests
|
data/filter_io.gemspec
CHANGED
@@ -17,9 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_development_dependency 'bundler', '~>
|
20
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
21
21
|
spec.add_development_dependency 'rake'
|
22
22
|
spec.add_development_dependency 'simplecov'
|
23
|
-
spec.add_development_dependency 'rspec', '~>
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
24
|
spec.add_development_dependency 'pry'
|
25
25
|
end
|
data/lib/filter_io/version.rb
CHANGED
data/lib/filter_io.rb
CHANGED
@@ -54,12 +54,11 @@ class FilterIO
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def default_encoding
|
57
|
-
|
57
|
+
@default_encoding ||= begin
|
58
58
|
c = @io.getc
|
59
59
|
@io.ungetc c
|
60
|
-
|
60
|
+
c.encoding
|
61
61
|
end
|
62
|
-
@default_encoding
|
63
62
|
end
|
64
63
|
|
65
64
|
def internal_encoding
|
@@ -103,6 +102,7 @@ class FilterIO
|
|
103
102
|
return '' if length == 0
|
104
103
|
|
105
104
|
# fill the buffer up to the fill level (or whole input if length is nil)
|
105
|
+
@did_first_read ||= false
|
106
106
|
while (!source_eof? || !@did_first_read) && (length.nil? || length > @buffer.bytesize)
|
107
107
|
@did_first_read = true
|
108
108
|
buffer_data @options[:block_size] || length
|
@@ -188,12 +188,12 @@ class FilterIO
|
|
188
188
|
raise ArgumentError
|
189
189
|
end
|
190
190
|
|
191
|
+
return "" if limit == 0
|
191
192
|
return nil if eof?
|
192
|
-
return read if sep_string.nil?
|
193
193
|
|
194
194
|
paragraph_mode = sep_string == ''
|
195
195
|
sep_string = "\n\n" if paragraph_mode
|
196
|
-
sep_string = sep_string
|
196
|
+
sep_string = sep_string&.to_s unless sep_string.is_a? String
|
197
197
|
|
198
198
|
if paragraph_mode
|
199
199
|
# consume any leading newlines
|
@@ -278,7 +278,7 @@ class FilterIO
|
|
278
278
|
def with_byte_buffer
|
279
279
|
begin
|
280
280
|
org_encoding = @buffer.encoding
|
281
|
-
@buffer.force_encoding
|
281
|
+
@buffer.force_encoding Encoding::BINARY
|
282
282
|
yield
|
283
283
|
ensure
|
284
284
|
@buffer.force_encoding org_encoding
|
@@ -298,7 +298,7 @@ class FilterIO
|
|
298
298
|
|
299
299
|
def find_bytes(str)
|
300
300
|
with_byte_buffer do
|
301
|
-
@buffer.index(str)
|
301
|
+
str && @buffer.index(str)
|
302
302
|
end
|
303
303
|
end
|
304
304
|
|
@@ -325,7 +325,7 @@ class FilterIO
|
|
325
325
|
# and add some more data to the buffer
|
326
326
|
raise NeedMoreData
|
327
327
|
end
|
328
|
-
rescue NeedMoreData
|
328
|
+
rescue NeedMoreData
|
329
329
|
raise EOFError, 'end of file reached' if @io.eof?
|
330
330
|
new_data = @io.read(block_size).force_encoding(external_encoding)
|
331
331
|
data << new_data
|
@@ -336,7 +336,7 @@ class FilterIO
|
|
336
336
|
data = [data] unless data.is_a? Array
|
337
337
|
raise 'Block must have 1 or 2 values' unless data.size <= 2
|
338
338
|
if @buffer.encoding != data[0].encoding
|
339
|
-
if [@buffer, data[0]].any? { |x| x.encoding
|
339
|
+
if [@buffer, data[0]].any? { |x| x.encoding == Encoding::BINARY }
|
340
340
|
data[0] = data[0].dup.force_encoding @buffer.encoding
|
341
341
|
end
|
342
342
|
end
|
@@ -367,7 +367,7 @@ class FilterIO
|
|
367
367
|
rescue Errno::ESPIPE
|
368
368
|
@source_pos
|
369
369
|
end
|
370
|
-
args << BlockState.new(src_pos == data.
|
370
|
+
args << BlockState.new(src_pos == data.bytesize, source_eof?)
|
371
371
|
end
|
372
372
|
data = @block.call(*args)
|
373
373
|
raise IOError, 'Block returned nil' if data.nil?
|
data/spec/filter_io_spec.rb
CHANGED
@@ -28,6 +28,8 @@ describe FilterIO do
|
|
28
28
|
errors << [e.class, e.message]
|
29
29
|
end
|
30
30
|
positions << io.pos
|
31
|
+
|
32
|
+
break if results == [""] * 10 && errors == [nil] * 10 && positions == [0] * 10
|
31
33
|
raise 'Too many iterations' if results.size > 100
|
32
34
|
end
|
33
35
|
|
@@ -204,7 +206,7 @@ describe FilterIO do
|
|
204
206
|
|
205
207
|
it 'converts ISO-8859-1 to UTF-8 via a block' do
|
206
208
|
[1, 2, nil].each do |block_size|
|
207
|
-
expected
|
209
|
+
# expected: "über\nrésumé"
|
208
210
|
with_iso8859_1_test_file 'UTF-8' do |io_raw|
|
209
211
|
io = FilterIO.new(io_raw, :block_size => block_size) do |data, state|
|
210
212
|
if state.bof?
|
@@ -225,7 +227,7 @@ describe FilterIO do
|
|
225
227
|
|
226
228
|
it 'converts ISO-8859-1 to raw via a block' do
|
227
229
|
[1, 2, nil].each do |block_size|
|
228
|
-
expected
|
230
|
+
# expected: "über\nrésumé".encode('ISO-8859-1')
|
229
231
|
with_iso8859_1_test_file 'ISO-8859-1' do |io_raw|
|
230
232
|
io = FilterIO.new(io_raw, :block_size => block_size) do |data, state|
|
231
233
|
if state.bof?
|
@@ -348,6 +350,18 @@ describe FilterIO do
|
|
348
350
|
expect(io.read).to eq expected
|
349
351
|
end
|
350
352
|
|
353
|
+
it 'passes true for BOF to the block when stream starts with a UTF-8 BOM' do
|
354
|
+
input = "\xEF\xBB\xBFTest String"
|
355
|
+
expected = ">>>*\xEF\xBB\xBFT**est **Stri**ng*<<<"
|
356
|
+
io = FilterIO.new(StringIO.new(input), :block_size => 4) do |data, state|
|
357
|
+
data = "*#{data}*"
|
358
|
+
data = ">>>#{data}" if state.bof?
|
359
|
+
data = "#{data}<<<" if state.eof?
|
360
|
+
data
|
361
|
+
end
|
362
|
+
expect(io.read).to eq expected
|
363
|
+
end
|
364
|
+
|
351
365
|
it 'passes false for BOF to the block if stream previously read' do
|
352
366
|
input = StringIO.new 'Test String'
|
353
367
|
expect(input.read(4)).to eq 'Test'
|
@@ -451,7 +465,7 @@ describe FilterIO do
|
|
451
465
|
|
452
466
|
it 'can be rewound with block' do
|
453
467
|
input = 'abcdefghij'
|
454
|
-
expected
|
468
|
+
# expected: input[1..-1]
|
455
469
|
io = FilterIO.new(StringIO.new(input), :block_size => 4) do |data, state|
|
456
470
|
data = data[1..-1] if state.bof?
|
457
471
|
data
|
@@ -562,7 +576,7 @@ describe FilterIO do
|
|
562
576
|
end
|
563
577
|
end
|
564
578
|
|
565
|
-
it 'supports `
|
579
|
+
it 'supports `gets` with a limit' do
|
566
580
|
[
|
567
581
|
"",
|
568
582
|
"x",
|
@@ -570,11 +584,24 @@ describe FilterIO do
|
|
570
584
|
"abc\rdef\rghi\r",
|
571
585
|
"über",
|
572
586
|
].each do |input|
|
573
|
-
[1, 2, 3, 4, 10].each do |limit|
|
587
|
+
[0, 1, 2, 3, 4, 10].each do |limit|
|
574
588
|
matches_reference_io_behaviour(input) { |io| io.gets(limit) }
|
575
589
|
end
|
576
590
|
end
|
577
|
-
|
591
|
+
end
|
592
|
+
|
593
|
+
it 'supports `gets` with nil separator and a limit' do
|
594
|
+
[
|
595
|
+
"",
|
596
|
+
"x",
|
597
|
+
"foo\nbar\rbaz\n",
|
598
|
+
"abc\rdef\rghi\r",
|
599
|
+
"über",
|
600
|
+
].each do |input|
|
601
|
+
[0, 1, 2, 3, 4, 10].each do |limit|
|
602
|
+
matches_reference_io_behaviour(input) { |io| io.gets(nil, limit) }
|
603
|
+
end
|
604
|
+
end
|
578
605
|
end
|
579
606
|
|
580
607
|
it 'supports `gets` with a separator and a limit' do
|
@@ -586,15 +613,14 @@ describe FilterIO do
|
|
586
613
|
"über",
|
587
614
|
].each do |input|
|
588
615
|
["\r", "x"].each do |sep_string|
|
589
|
-
[1, 2, 3, 4, 10].each do |limit|
|
616
|
+
[0, 1, 2, 3, 4, 10].each do |limit|
|
590
617
|
matches_reference_io_behaviour(input) { |io| io.gets(sep_string, limit) }
|
591
618
|
end
|
592
619
|
end
|
593
620
|
end
|
594
|
-
# TODO: test zero limit
|
595
621
|
end
|
596
622
|
|
597
|
-
it 'errors when `
|
623
|
+
it 'errors when `gets` is passed more than two args' do
|
598
624
|
expect {
|
599
625
|
FilterIO.new(StringIO.new).gets(1,2,3)
|
600
626
|
}.to raise_error ArgumentError
|
@@ -821,11 +847,6 @@ describe FilterIO do
|
|
821
847
|
expect {
|
822
848
|
filtered_io.gets
|
823
849
|
}.to raise_error IOError
|
824
|
-
|
825
|
-
# closing again should raise an error
|
826
|
-
expect {
|
827
|
-
filtered_io.close
|
828
|
-
}.to raise_error IOError
|
829
850
|
end
|
830
851
|
end
|
831
852
|
|
@@ -955,5 +976,4 @@ describe FilterIO do
|
|
955
976
|
|
956
977
|
expect(dest.string).to eq 'FOO'
|
957
978
|
end
|
958
|
-
|
959
979
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filter_io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Weathered
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: pry
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
description:
|
83
|
+
description:
|
84
84
|
email:
|
85
85
|
- jason@jasoncodes.com
|
86
86
|
executables: []
|
@@ -88,6 +88,7 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
|
+
- ".tool-versions"
|
91
92
|
- Gemfile
|
92
93
|
- LICENSE
|
93
94
|
- README.markdown
|
@@ -101,7 +102,7 @@ homepage: http://github.com/jasoncodes/filter_io
|
|
101
102
|
licenses:
|
102
103
|
- MIT
|
103
104
|
metadata: {}
|
104
|
-
post_install_message:
|
105
|
+
post_install_message:
|
105
106
|
rdoc_options: []
|
106
107
|
require_paths:
|
107
108
|
- lib
|
@@ -116,9 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
117
|
- !ruby/object:Gem::Version
|
117
118
|
version: '0'
|
118
119
|
requirements: []
|
119
|
-
|
120
|
-
|
121
|
-
signing_key:
|
120
|
+
rubygems_version: 3.2.32
|
121
|
+
signing_key:
|
122
122
|
specification_version: 4
|
123
123
|
summary: Filter IO streams with a block. Ruby's FilterInputStream.
|
124
124
|
test_files:
|