piperator 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af5e198f4b96db3cee04f76d28630879c8a6d7f69a83b7aef26d895ccff7051a
4
- data.tar.gz: 236c0753cdde6275d2e9bf350b2afa839312bbe72a636eff5a190a1a6bcd8b3b
3
+ metadata.gz: 13c2413016f50d1f376666a3997bb0419fd3bbe0311913c9b2d694ab80b47083
4
+ data.tar.gz: 5b452fb6d8bc029accb4c32cd5b692d377ead539cc164dd65f6aba4715d51c75
5
5
  SHA512:
6
- metadata.gz: 17220ec804befc2717354c004a9c0b038d00618a3296ac773e77a99d14333d3dafc87d73b112dc1921eeaf6c67e4b7e8e8070ba42cd983b692d9a7c73999e44c
7
- data.tar.gz: b74fe2c27cc940c5be501ecfb429dad7a89fde7283f30f67c64840013361a32101e7d9b5fa72b590d13750b8f75bc94683139cc38bdc8d0309516d04ffc931f5
6
+ metadata.gz: '07794c6e1760367b51fab0667afac9275fa61c81d34e1de3b1d68be245246a04d0040869e6e27f49e7d2de90057e0edddd3ab9bcba0cb0620fd4d61ac3112d7e'
7
+ data.tar.gz: 372fc0fb1fc79832d312bf661019ff6f4203c702a139a3c3fe03ab8f8b2636826ade5a20fa60e288580177ae58f812320e6419ab341d9ac2bb80c51e9fa599d9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 1.1.0 (6 December 2019)
2
+
3
+ - add `#pos` to Piperator::IO to get current position
4
+
1
5
  ## 1.0.0. (13 October 2019)
2
6
 
3
7
  - add `Piperator.build` to build pipelines with DSL
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
- @io = StringIO.new
14
- @buffer_start_pos = 0
15
- @io_read_pos = 0
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
- @io.write(@enumerator.next)
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
- @io.write(@enumerator.next)
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 { @io.gets(separator) }
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 @io.pos == @io_read_pos
54
+ if @buffer.pos == @buffer_read_pos
53
55
  initialize_buffer
54
56
  else
55
- @io.pos = @io_read_pos
56
- initialize_buffer(@io.read)
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
- @io.write(@enumerator.next) while !@eof && readable_bytes < (length || 1)
67
- read_with { @io.read(length) }
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 { @io.read(length) } if readable_bytes > 0
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
- @io.size
79
+ @buffer.size
78
80
  end
79
81
 
80
82
  private
81
83
 
82
84
  def readable_bytes
83
- @io.pos - @io_read_pos
85
+ @buffer.pos - @buffer_read_pos
84
86
  end
85
87
 
86
88
  def read_with
87
- pos = @io.pos
88
- @io.pos = @io_read_pos
89
+ pos = @buffer.pos
90
+ @buffer.pos = @buffer_read_pos
89
91
 
90
92
  yield.tap do |data|
91
- @io_read_pos += data.bytesize if data
92
- @io.pos = pos
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
- @io.string.byteslice(@io_read_pos...@io_read_pos + bytes)
100
+ @buffer.string.byteslice(@buffer_read_pos...@buffer_read_pos + bytes)
99
101
  end
100
102
 
101
103
  def flush?
102
- @io.pos == @io_read_pos || @io.pos > @flush_threshold
104
+ @buffer.pos == @buffer_read_pos || @buffer.pos > @flush_threshold
103
105
  end
104
106
 
105
107
  def initialize_buffer(data = nil)
106
- @io_read_pos = 0
107
- @buffer_start_pos += @io.pos if @io
108
- @io = StringIO.new
109
- @io.write(data) if data
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
- @io.string.byteslice(@io_read_pos..-1).include?(separator)
116
+ @buffer.string.byteslice(@buffer_read_pos..-1).include?(separator)
115
117
  rescue ArgumentError # Invalid UTF-8
116
118
  false
117
119
  end
@@ -1,4 +1,4 @@
1
1
  module Piperator
2
2
  # Piperator version
3
- VERSION = '1.0.0'.freeze
3
+ VERSION = '1.1.0'.freeze
4
4
  end
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.0.0
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-10-13 00:00:00.000000000 Z
11
+ date: 2019-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler