net-protocol 0.1.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8e88ea7a722bbf9b9d0f2fa612bfde5c5208878e180f5a26516b1df9b034f17
4
- data.tar.gz: 9062b0fea9900d450c8b2384ba2bdc3a56296b3e77a8cf32a5eae11ce5af782f
3
+ metadata.gz: ca28f0356ecc7ee77cb5d0ead1ea91d9a70446e9de9a8e4927bdd4caf8d8e910
4
+ data.tar.gz: 394be407dd3ab468f376be2032a2c6c6d78d05863bd21a9353e206ea473bbc37
5
5
  SHA512:
6
- metadata.gz: 8206f5d99416bbd72b390819fe5193dddde16b6b0d4f5bfa7fa99fc6d99ed79f1c5e2dab0da13009d27087d483d13e92d48a92ca4db853f1f531a0f884afdad9
7
- data.tar.gz: b9881f6507c2f67f24bc60034397644745e090194a5443093a9f655008bd4db8281e6a49bf76aea135b12bb534bc230866aef80c784a67e72cd024567dcfdee3
6
+ metadata.gz: 52dcdc5b3c200e3f29dea711c392d6127e39cf5cdf12787bb585a41ca874ccb3b93c734145d688c4c83acf98f28f0c7e89ebc49aeeb64caa0cb172a452f9c73c
7
+ data.tar.gz: d57a73c0d8a1260012f26826ef257b4b6df616aa07e0fd46fc63710b2cd5cf3dafd322db057db1202ae1158c77d729c9e65ec3e12cc2d1705a4a2d2221cf0962
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -7,16 +7,15 @@ jobs:
7
7
  name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
8
  strategy:
9
9
  matrix:
10
- ruby: [ '3.0', 2.7, 2.6, 2.5, 2.4, head ]
10
+ ruby: [ head, '3.1', '3.0', '2.7', '2.6' ]
11
11
  os: [ ubuntu-latest, macos-latest ]
12
12
  runs-on: ${{ matrix.os }}
13
13
  steps:
14
- - uses: actions/checkout@v2
14
+ - uses: actions/checkout@v3
15
15
  - name: Set up Ruby
16
16
  uses: ruby/setup-ruby@v1
17
17
  with:
18
18
  ruby-version: ${{ matrix.ruby }}
19
- - name: Install dependencies
20
- run: bundle install
19
+ bundler-cache: true # 'bundle install' and cache gems
21
20
  - name: Run test
22
- run: rake test
21
+ run: bundle exec rake test
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Net::Protocol
2
2
 
3
- The abstruct interface for net-* client.
3
+ The abstract interface for net-* client.
4
4
 
5
5
  ## Installation
6
6
 
data/lib/net/protocol.rb CHANGED
@@ -26,7 +26,7 @@ require 'io/wait'
26
26
  module Net # :nodoc:
27
27
 
28
28
  class Protocol #:nodoc: internal use only
29
- VERSION = "0.1.2"
29
+ VERSION = "0.2.0"
30
30
 
31
31
  private
32
32
  def Protocol.protocol_param(name, val)
@@ -120,6 +120,7 @@ module Net # :nodoc:
120
120
  @continue_timeout = continue_timeout
121
121
  @debug_output = debug_output
122
122
  @rbuf = ''.b
123
+ @rbuf_offset = 0
123
124
  end
124
125
 
125
126
  attr_reader :io
@@ -154,14 +155,15 @@ module Net # :nodoc:
154
155
  LOG "reading #{len} bytes..."
155
156
  read_bytes = 0
156
157
  begin
157
- while read_bytes + @rbuf.size < len
158
- s = rbuf_consume(@rbuf.size)
159
- read_bytes += s.size
160
- dest << s
158
+ while read_bytes + rbuf_size < len
159
+ if s = rbuf_consume_all_shareable!
160
+ read_bytes += s.bytesize
161
+ dest << s
162
+ end
161
163
  rbuf_fill
162
164
  end
163
165
  s = rbuf_consume(len - read_bytes)
164
- read_bytes += s.size
166
+ read_bytes += s.bytesize
165
167
  dest << s
166
168
  rescue EOFError
167
169
  raise unless ignore_eof
@@ -175,9 +177,10 @@ module Net # :nodoc:
175
177
  read_bytes = 0
176
178
  begin
177
179
  while true
178
- s = rbuf_consume(@rbuf.size)
179
- read_bytes += s.size
180
- dest << s
180
+ if s = rbuf_consume_all_shareable!
181
+ read_bytes += s.bytesize
182
+ dest << s
183
+ end
181
184
  rbuf_fill
182
185
  end
183
186
  rescue EOFError
@@ -188,14 +191,16 @@ module Net # :nodoc:
188
191
  end
189
192
 
190
193
  def readuntil(terminator, ignore_eof = false)
194
+ offset = @rbuf_offset
191
195
  begin
192
- until idx = @rbuf.index(terminator)
196
+ until idx = @rbuf.index(terminator, offset)
197
+ offset = @rbuf.bytesize
193
198
  rbuf_fill
194
199
  end
195
- return rbuf_consume(idx + terminator.size)
200
+ return rbuf_consume(idx + terminator.bytesize - @rbuf_offset)
196
201
  rescue EOFError
197
202
  raise unless ignore_eof
198
- return rbuf_consume(@rbuf.size)
203
+ return rbuf_consume
199
204
  end
200
205
  end
201
206
 
@@ -208,12 +213,16 @@ module Net # :nodoc:
208
213
  BUFSIZE = 1024 * 16
209
214
 
210
215
  def rbuf_fill
211
- tmp = @rbuf.empty? ? @rbuf : nil
216
+ tmp = @rbuf_empty ? @rbuf : nil
212
217
  case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)
213
218
  when String
214
- return if rv.equal?(tmp)
215
- @rbuf << rv
216
- rv.clear
219
+ @rbuf_empty = false
220
+ if rv.equal?(tmp)
221
+ @rbuf_offset = 0
222
+ else
223
+ @rbuf << rv
224
+ rv.clear
225
+ end
217
226
  return
218
227
  when :wait_readable
219
228
  (io = @io.to_io).wait_readable(@read_timeout) or raise Net::ReadTimeout.new(io)
@@ -228,13 +237,50 @@ module Net # :nodoc:
228
237
  end while true
229
238
  end
230
239
 
231
- def rbuf_consume(len)
232
- if len == @rbuf.size
240
+ def rbuf_flush
241
+ if @rbuf_empty
242
+ @rbuf.clear
243
+ @rbuf_offset = 0
244
+ end
245
+ nil
246
+ end
247
+
248
+ def rbuf_size
249
+ @rbuf.bytesize - @rbuf_offset
250
+ end
251
+
252
+ # Warning: this method may share the buffer to avoid
253
+ # copying. The caller must no longer use the returned
254
+ # string once rbuf_fill has been called again
255
+ def rbuf_consume_all_shareable!
256
+ @rbuf_empty = true
257
+ buf = if @rbuf_offset == 0
258
+ @rbuf
259
+ else
260
+ @rbuf.byteslice(@rbuf_offset..-1)
261
+ end
262
+ @rbuf_offset = @rbuf.bytesize
263
+ buf
264
+ end
265
+
266
+ def rbuf_consume(len = nil)
267
+ if @rbuf_offset == 0 && (len.nil? || len == @rbuf.bytesize)
233
268
  s = @rbuf
234
269
  @rbuf = ''.b
270
+ @rbuf_offset = 0
271
+ @rbuf_empty = true
272
+ elsif len.nil?
273
+ s = @rbuf.byteslice(@rbuf_offset..-1)
274
+ @rbuf = ''.b
275
+ @rbuf_offset = 0
276
+ @rbuf_empty = true
235
277
  else
236
- s = @rbuf.slice!(0, len)
278
+ s = @rbuf.byteslice(@rbuf_offset, len)
279
+ @rbuf_offset += len
280
+ @rbuf_empty = @rbuf_offset == @rbuf.bytesize
281
+ rbuf_flush
237
282
  end
283
+
238
284
  @debug_output << %Q[-> #{s.dump}\n] if @debug_output
239
285
  s
240
286
  end
data/net-protocol.gemspec CHANGED
@@ -13,10 +13,10 @@ Gem::Specification.new do |spec|
13
13
  spec.authors = ["Yukihiro Matsumoto"]
14
14
  spec.email = ["matz@ruby-lang.org"]
15
15
 
16
- spec.summary = %q{The abstruct interface for net-* client.}
17
- spec.description = %q{The abstruct interface for net-* client.}
16
+ spec.summary = %q{The abstract interface for net-* client.}
17
+ spec.description = %q{The abstract interface for net-* client.}
18
18
  spec.homepage = "https://github.com/ruby/net-protocol"
19
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
19
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
20
20
  spec.licenses = ["Ruby", "BSD-2-Clause"]
21
21
 
22
22
  spec.metadata["homepage_uri"] = spec.homepage
@@ -27,10 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
28
  `git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
29
  end
30
- spec.bindir = "exe"
31
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
30
  spec.require_paths = ["lib"]
33
31
 
34
32
  spec.add_dependency "timeout"
35
- spec.add_dependency "io-wait"
36
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-protocol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yukihiro Matsumoto
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-21 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: timeout
@@ -24,31 +24,17 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: io-wait
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- description: The abstruct interface for net-* client.
27
+ description: The abstract interface for net-* client.
42
28
  email:
43
29
  - matz@ruby-lang.org
44
30
  executables: []
45
31
  extensions: []
46
32
  extra_rdoc_files: []
47
33
  files:
34
+ - ".github/dependabot.yml"
48
35
  - ".github/workflows/test.yml"
49
36
  - ".gitignore"
50
37
  - Gemfile
51
- - Gemfile.lock
52
38
  - LICENSE.txt
53
39
  - README.md
54
40
  - Rakefile
@@ -71,15 +57,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
57
  requirements:
72
58
  - - ">="
73
59
  - !ruby/object:Gem::Version
74
- version: 2.3.0
60
+ version: 2.6.0
75
61
  required_rubygems_version: !ruby/object:Gem::Requirement
76
62
  requirements:
77
63
  - - ">="
78
64
  - !ruby/object:Gem::Version
79
65
  version: '0'
80
66
  requirements: []
81
- rubygems_version: 3.3.0.dev
67
+ rubygems_version: 3.4.0.dev
82
68
  signing_key:
83
69
  specification_version: 4
84
- summary: The abstruct interface for net-* client.
70
+ summary: The abstract interface for net-* client.
85
71
  test_files: []
data/Gemfile.lock DELETED
@@ -1,23 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- net-protocol (0.1.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- power_assert (1.1.5)
10
- rake (12.3.3)
11
- test-unit (3.3.5)
12
- power_assert
13
-
14
- PLATFORMS
15
- ruby
16
-
17
- DEPENDENCIES
18
- net-protocol!
19
- rake
20
- test-unit
21
-
22
- BUNDLED WITH
23
- 2.1.4