piperator 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/piperator/io.rb +28 -26
- data/lib/piperator/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13c2413016f50d1f376666a3997bb0419fd3bbe0311913c9b2d694ab80b47083
|
4
|
+
data.tar.gz: 5b452fb6d8bc029accb4c32cd5b692d377ead539cc164dd65f6aba4715d51c75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '07794c6e1760367b51fab0667afac9275fa61c81d34e1de3b1d68be245246a04d0040869e6e27f49e7d2de90057e0edddd3ab9bcba0cb0620fd4d61ac3112d7e'
|
7
|
+
data.tar.gz: 372fc0fb1fc79832d312bf661019ff6f4203c702a139a3c3fe03ab8f8b2636826ade5a20fa60e288580177ae58f812320e6419ab341d9ac2bb80c51e9fa599d9
|
data/CHANGELOG.md
CHANGED
data/lib/piperator/io.rb
CHANGED
@@ -6,22 +6,24 @@ module Piperator
|
|
6
6
|
FLUSH_THRESHOLD = 128 * 1028 # 128KiB
|
7
7
|
|
8
8
|
attr_reader :eof
|
9
|
+
attr_reader :pos
|
9
10
|
|
10
11
|
def initialize(enumerator, flush_threshold: FLUSH_THRESHOLD)
|
11
12
|
@enumerator = enumerator
|
12
13
|
@flush_threshold = flush_threshold
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@
|
14
|
+
@buffer = StringIO.new
|
15
|
+
@pos = 0
|
16
|
+
@buffer_read_pos = 0
|
16
17
|
@eof = false
|
17
18
|
end
|
18
19
|
|
19
20
|
alias eof? eof
|
21
|
+
alias tell pos
|
20
22
|
|
21
23
|
# Return the first bytes of the buffer without marking the buffer as read.
|
22
24
|
def peek(bytes)
|
23
25
|
while @eof == false && readable_bytes < (bytes || 1)
|
24
|
-
@
|
26
|
+
@buffer.write(@enumerator.next)
|
25
27
|
end
|
26
28
|
peek_buffer(bytes)
|
27
29
|
rescue StopIteration
|
@@ -38,22 +40,22 @@ module Piperator
|
|
38
40
|
def gets(separator = $INPUT_RECORD_SEPARATOR, _limit = nil)
|
39
41
|
while !@eof && !contains_line?(separator)
|
40
42
|
begin
|
41
|
-
@
|
43
|
+
@buffer.write(@enumerator.next)
|
42
44
|
rescue StopIteration
|
43
45
|
@eof = true
|
44
46
|
nil
|
45
47
|
end
|
46
48
|
end
|
47
|
-
read_with { @
|
49
|
+
read_with { @buffer.gets(separator) }
|
48
50
|
end
|
49
51
|
|
50
52
|
# Flush internal buffer until the last unread byte
|
51
53
|
def flush
|
52
|
-
if @
|
54
|
+
if @buffer.pos == @buffer_read_pos
|
53
55
|
initialize_buffer
|
54
56
|
else
|
55
|
-
@
|
56
|
-
initialize_buffer(@
|
57
|
+
@buffer.pos = @buffer_read_pos
|
58
|
+
initialize_buffer(@buffer.read)
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
@@ -62,56 +64,56 @@ module Piperator
|
|
62
64
|
# @param length [Integer] number of bytes to read
|
63
65
|
# @return String
|
64
66
|
def read(length = nil)
|
65
|
-
return @enumerator.next if length.nil? && readable_bytes.zero?
|
66
|
-
@
|
67
|
-
read_with { @
|
67
|
+
return @enumerator.next.tap { |e| @pos += e.bytesize } if length.nil? && readable_bytes.zero?
|
68
|
+
@buffer.write(@enumerator.next) while !@eof && readable_bytes < (length || 1)
|
69
|
+
read_with { @buffer.read(length) }
|
68
70
|
rescue StopIteration
|
69
71
|
@eof = true
|
70
|
-
read_with { @
|
72
|
+
read_with { @buffer.read(length) } if readable_bytes > 0
|
71
73
|
end
|
72
74
|
|
73
75
|
# Current buffer size - including non-freed read content
|
74
76
|
#
|
75
77
|
# @return [Integer] number of bytes stored in buffer
|
76
78
|
def used
|
77
|
-
@
|
79
|
+
@buffer.size
|
78
80
|
end
|
79
81
|
|
80
82
|
private
|
81
83
|
|
82
84
|
def readable_bytes
|
83
|
-
@
|
85
|
+
@buffer.pos - @buffer_read_pos
|
84
86
|
end
|
85
87
|
|
86
88
|
def read_with
|
87
|
-
pos = @
|
88
|
-
@
|
89
|
+
pos = @buffer.pos
|
90
|
+
@buffer.pos = @buffer_read_pos
|
89
91
|
|
90
92
|
yield.tap do |data|
|
91
|
-
@
|
92
|
-
@
|
93
|
+
@buffer_read_pos += data.bytesize if data
|
94
|
+
@buffer.pos = pos
|
93
95
|
flush if flush?
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
99
|
def peek_buffer(bytes)
|
98
|
-
@
|
100
|
+
@buffer.string.byteslice(@buffer_read_pos...@buffer_read_pos + bytes)
|
99
101
|
end
|
100
102
|
|
101
103
|
def flush?
|
102
|
-
@
|
104
|
+
@buffer.pos == @buffer_read_pos || @buffer.pos > @flush_threshold
|
103
105
|
end
|
104
106
|
|
105
107
|
def initialize_buffer(data = nil)
|
106
|
-
@
|
107
|
-
@
|
108
|
-
@
|
109
|
-
@
|
108
|
+
@pos += @buffer_read_pos
|
109
|
+
@buffer_read_pos = 0
|
110
|
+
@buffer = StringIO.new
|
111
|
+
@buffer.write(data) if data
|
110
112
|
end
|
111
113
|
|
112
114
|
def contains_line?(separator = $INPUT_RECORD_SEPARATOR)
|
113
115
|
return true if @eof
|
114
|
-
@
|
116
|
+
@buffer.string.byteslice(@buffer_read_pos..-1).include?(separator)
|
115
117
|
rescue ArgumentError # Invalid UTF-8
|
116
118
|
false
|
117
119
|
end
|
data/lib/piperator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piperator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ville Lautanala
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|