polyphony 0.95 → 0.96

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: 554854ea3a7b1bc8dd555b24283e42019bb7bfb91953cd0b3e6ac49c9c59198b
4
- data.tar.gz: 59a88ec85837e68ed50594ee892c814dee9e15ba19b4392d50436fb0b51b1d82
3
+ metadata.gz: 2db26acbbe9457dc3b3fcdd1e34d35e5347a2e67a5c126b9ddea672957ca3318
4
+ data.tar.gz: ac02e27bd659dafbfe0b68db9b22fc3ca8acb744ff82049dbb2bbea999f7e87e
5
5
  SHA512:
6
- metadata.gz: 3637e9af046327dd642bb555224e4dd36169824a698b1176f57ebeb309e61d1ac6c50d2423c8ab2ac72abf9d8e9184f37ebf9ca8343032d7e40b3244d99f8ca7
7
- data.tar.gz: 27fca71574396f73e783630691cbda094488ab19128c884ca2fdafd570b0df920f083e46750455a656c0f26c9acc6f11783634cb7d43b23f2689f000ee0c67ea
6
+ metadata.gz: e99fb459ea41504df54826634d219f8ef1feea3324fe6c56ab18fc46867728d57f36f4c15a35787e0ba42fe588b10d3e849badfcbee0a720c77bb1d8619e8fc3
7
+ data.tar.gz: d52ee81b1f1f5a5294cecf09837ccce8cc68f0233d73a0d868326f0a144897542f5ad3e05cc398eb4bf963742fe1fac01a096abf0d77e3201d8c50ca8880e65a
@@ -1,4 +1,4 @@
1
- name: Tests
1
+ name: Tests (libev)
2
2
 
3
3
  on: [push, pull_request]
4
4
 
@@ -1,4 +1,4 @@
1
- name: Tests with io_uring
1
+ name: Tests (io_uring)
2
2
 
3
3
  on: [push, pull_request]
4
4
 
@@ -8,7 +8,7 @@ jobs:
8
8
  fail-fast: false
9
9
  matrix:
10
10
  os: [ubuntu-latest]
11
- ruby: ['2.7', '3.0', '3.1', 'head']
11
+ ruby: ['3.0', '3.1', '3.2']
12
12
 
13
13
  name: >-
14
14
  ${{matrix.os}}, ${{matrix.ruby}}
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ${{matrix.os}}
17
17
  steps:
18
18
  - name: Checkout repository and submodules
19
- uses: actions/checkout@v2
19
+ uses: actions/checkout@v3
20
20
  with:
21
21
  submodules: recursive
22
22
  - name: Setup Ruby
@@ -33,4 +33,4 @@ jobs:
33
33
  - name: Compile C-extension
34
34
  run: bundle exec rake compile
35
35
  - name: Run tests
36
- run: bundle exec ruby test/run.rb --verbose --name test_sleep
36
+ run: bundle exec ruby test/run.rb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.96 2023-02-11
2
+ - Rework Redis client adapter
3
+ - Fix working with Pry (#95, thanks @floriandejonckheere)
4
+ - Improve compatibility with Enumerator and other APIs.
5
+
1
6
  ## 0.95 2023-01-16
2
7
 
3
8
  - Remove support for Ruby 2.7
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/setup'
4
- require 'polyphony/adapters/redis'
5
- # require 'redis'
3
+ require 'redis'
4
+ require_relative '../../lib/polyphony/adapters/redis'
5
+ require_relative '../../lib/polyphony'
6
+
6
7
 
7
8
  redis = Redis.new(host: ENV['REDISHOST'] || 'localhost')
8
9
 
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/setup'
4
- require 'polyphony/adapters/redis'
3
+ require 'redis'
4
+ require_relative '../../lib/polyphony/adapters/redis'
5
+ require_relative '../../lib/polyphony'
6
+ require_relative '../../lib/polyphony/core/channel'
5
7
 
6
8
  class RedisChannel < Polyphony::Channel
7
9
  def self.publish_connection
@@ -17,20 +19,24 @@ class RedisChannel < Polyphony::Channel
17
19
  def self.start_monitor
18
20
  @channels = {}
19
21
  @monitor = spin do
22
+ p start_monitor: 1
20
23
  subscribe_connection.subscribe(CHANNEL_MASTER_TOPIC) do |on|
24
+ p start_monitor: 2
21
25
  on.message do |topic, message|
26
+ p start_monitor: 3, topic: topic, message: message
22
27
  message = Marshal.load(message)
23
- topic == if CHANNEL_MASTER_TOPIC
24
- handle_master_message(message)
25
- else
26
- handle_channel_message(topic, message)
27
- end
28
+ if CHANNEL_MASTER_TOPIC
29
+ handle_master_message(message)
30
+ else
31
+ handle_channel_message(topic, message)
32
+ end
28
33
  end
29
34
  end
30
35
  end
31
36
  end
32
37
 
33
38
  def self.stop_monitor
39
+ p stop_monitor: 1
34
40
  @monitor&.interrupt
35
41
  end
36
42
 
@@ -111,10 +117,13 @@ end
111
117
 
112
118
  spin do
113
119
  move_on_after(3) do
120
+ p :move_on_after
114
121
  throttled_loop(1) do
122
+ # p :throttled_loop
115
123
  channel << Time.now
116
124
  end
117
125
  end
126
+ p :done
118
127
  channel.close
119
128
  RedisChannel.stop_monitor
120
129
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'bundler/setup'
4
4
  require 'polyphony'
5
- require 'polyphony/extensions/debug'
5
+ require 'polyphony/core/debug'
6
6
 
7
7
  Exception.__disable_sanitized_backtrace__ = true
8
8
 
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony'
5
+ require 'polyphony/adapters/readline'
6
+
7
+ $counter = 0
8
+ timer = spin do
9
+ throttled_loop(5) do
10
+ $counter += 1
11
+ end
12
+ end
13
+
14
+ at_exit { timer.stop }
15
+
16
+ puts 'try typing $counter to see the counter incremented in the background'
17
+ loop do
18
+ puts eval Readline::readline('> ', true)
19
+ end
@@ -60,6 +60,23 @@ inline void conditional_nonblocking_poll(VALUE backend, struct Backend_base *bas
60
60
  Backend_poll(backend, Qnil);
61
61
  }
62
62
 
63
+ // Verifies that the given fiber has the @thread ivar set. If not, sets it to
64
+ // the current thread. This is essential for the correct functioning of fibers
65
+ // not created by Polyphony, such as those used by the Enumerator class, and
66
+ // probably others as well. With a nil thread ivar, a fiber can not be
67
+ // scheduled. This macro is called in backend_base_switch_fiber() and in
68
+ // backend_snooze().
69
+ //
70
+ // In order to refrain from calling rb_thread_current() multiple times, we
71
+ // allow it to be passed to this macro, and if not we call it on the spot.
72
+ #define CHECK_FIBER_THREAD_REF(fiber, current_thread) { \
73
+ VALUE thread = rb_ivar_get(fiber, ID_ivar_thread); \
74
+ if (thread == Qnil) { \
75
+ thread = (current_thread != Qnil) ? current_thread : rb_thread_current(); \
76
+ rb_ivar_set(fiber, ID_ivar_thread, thread); \
77
+ } \
78
+ }
79
+
63
80
  VALUE backend_base_switch_fiber(VALUE backend, struct Backend_base *base) {
64
81
  VALUE current_fiber = rb_fiber_current();
65
82
  runqueue_entry next;
@@ -71,6 +88,8 @@ VALUE backend_base_switch_fiber(VALUE backend, struct Backend_base *base) {
71
88
  if (SHOULD_TRACE(base))
72
89
  TRACE(base, 3, SYM_block, current_fiber, CALLER());
73
90
 
91
+ CHECK_FIBER_THREAD_REF(current_fiber, Qnil);
92
+
74
93
  while (1) {
75
94
  next = runqueue_shift(&base->runqueue);
76
95
  if (next.fiber != Qnil) {
@@ -261,6 +280,9 @@ inline VALUE backend_snooze(struct Backend_base *backend) {
261
280
  VALUE ret;
262
281
  VALUE fiber = rb_fiber_current();
263
282
  VALUE thread = rb_thread_current();
283
+
284
+ CHECK_FIBER_THREAD_REF(fiber, thread);
285
+
264
286
  Fiber_make_runnable(fiber, Qnil);
265
287
  ret = Thread_switch_fiber(thread);
266
288
 
@@ -107,7 +107,7 @@ void break_async_callback(struct ev_loop *ev_loop, struct ev_async *ev_async, in
107
107
  // of a *blocking* event loop (waking it up) in a thread-safe, signal-safe manner
108
108
  }
109
109
 
110
- inline struct ev_loop *libev_new_loop() {
110
+ inline struct ev_loop *libev_new_loop(void) {
111
111
  #ifdef POLYPHONY_USE_PIDFD_OPEN
112
112
  return ev_loop_new(EVFLAG_NOSIGMASK);
113
113
  #else
@@ -1474,7 +1474,7 @@ void Backend_unpark_fiber(VALUE self, VALUE fiber) {
1474
1474
  backend_base_unpark_fiber(&backend->base, fiber);
1475
1475
  }
1476
1476
 
1477
- void Init_Backend() {
1477
+ void Init_Backend(void) {
1478
1478
  ev_set_allocator(xrealloc);
1479
1479
 
1480
1480
  VALUE cBackend = rb_define_class_under(mPolyphony, "Backend", rb_cObject);
@@ -7,11 +7,13 @@ require 'readline'
7
7
  # thread pool. That way, the reactor loop can keep running while waiting for
8
8
  # readline to return
9
9
  module ::Readline
10
- alias_method :orig_readline, :readline
10
+ class << self
11
+ alias_method :orig_readline, :readline
11
12
 
12
- Worker = Polyphony::ThreadPool.new(1)
13
+ Worker = Polyphony::ThreadPool.new(1)
13
14
 
14
- def readline(*args)
15
- Worker.process { orig_readline(*args) }
15
+ def readline(*args)
16
+ Worker.process { orig_readline(*args) }
17
+ end
16
18
  end
17
19
  end
@@ -2,94 +2,35 @@
2
2
 
3
3
  require_relative '../../polyphony'
4
4
 
5
- require 'redis'
6
- require 'hiredis/reader'
7
-
8
- # Polyphony-based Redis driver
9
- class Polyphony::RedisDriver
10
-
11
- # Connects to a Redis server using the given config.
12
- #
13
- # @return [TCPSocket, UNIXSocket, SSLSocket] client connectio
14
- def self.connect(config)
15
- raise 'unix sockets not supported' if config[:scheme] == 'unix'
16
-
17
- # connection.connect_unix(config[:path], connect_timeout)
18
-
19
- raise 'ssl not supported' if config[:scheme] == 'rediss' || config[:ssl]
20
-
21
- # raise NotImplementedError, "SSL not supported by hiredis driver"
22
-
23
- new(config[:host], config[:port])
24
- # connection.connect(config[:host], config[:port], connect_timeout)
25
- end
26
-
27
- # Initializes a Redis client connection.
28
- #
29
- # @param host [String] hostname
30
- # @param port [Integer] port number
31
- def initialize(host, port)
32
- @connection = Polyphony::Net.tcp_connect(host, port)
33
- @reader = ::Hiredis::Reader.new
34
- end
35
-
36
- # Returns true if connected to server.
37
- #
38
- # @return [bool] is connected to server
39
- def connected?
40
- @connection && !@connection.closed?
41
- end
42
-
43
- # Sets a timeout for the connection.
44
- #
45
- # @return [void]
46
- def timeout=(timeout)
47
- # ignore timeout for now
48
- end
49
-
50
- # Disconnects from the server.
51
- #
52
- # @return [void]
53
- def disconnect
54
- @connection.close
55
- @connection = nil
56
- end
57
-
58
- # Sends a command to the server.
59
- #
60
- # @param command [Array] Redis command
61
- # @return [void]
62
- def write(command)
63
- @connection.write(format_command(command))
64
- end
65
-
66
- # Formats a command for sending to server.
67
- #
68
- # @param args [Array] command
69
- # @return [String] formatted command
70
- def format_command(args)
71
- args = args.flatten
72
- (+"*#{args.size}\r\n").tap do |s|
73
- args.each do |a|
74
- a = a.to_s
75
- s << "$#{a.bytesize}\r\n#{a}\r\n"
5
+ require 'redis-client'
6
+
7
+ class RedisClient
8
+ class RubyConnection
9
+ class BufferedIO
10
+ def fill_buffer(strict, size = @chunk_size)
11
+ remaining = size
12
+ empty_buffer = @offset >= @buffer.bytesize
13
+
14
+ loop do
15
+ max_read = [remaining, @chunk_size].max
16
+ bytes = if empty_buffer
17
+ @io.readpartial(max_read, @buffer)
18
+ else
19
+ @io.readpartial(max_read)
20
+ end
21
+
22
+ raise Errno::ECONNRESET if bytes.nil?
23
+
24
+ if empty_buffer
25
+ @offset = 0
26
+ empty_buffer = false
27
+ else
28
+ @buffer << bytes
29
+ end
30
+ remaining -= bytes.bytesize
31
+ return if !strict || remaining <= 0
32
+ end
76
33
  end
77
34
  end
78
35
  end
79
-
80
- # Reads from the connection, feeding incoming data to the parser.
81
- #
82
- # @return [void]
83
- def read
84
- reply = @reader.gets
85
- return reply if reply
86
-
87
- @connection.read_loop do |data|
88
- @reader.feed(data)
89
- reply = @reader.gets
90
- return reply unless reply == false
91
- end
92
- end
93
36
  end
94
-
95
- Redis::Connection.drivers << Polyphony::RedisDriver
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../polyphony'
4
+
5
+ module Polyphony
6
+ # Implements a unidirectional communication channel along the lines of Go
7
+ # (buffered) channels.
8
+ class Channel < Polyphony::Queue
9
+ alias_method :receive, :shift
10
+
11
+ def close
12
+ flush_waiters(Polyphony::MoveOn.new)
13
+ end
14
+ end
15
+ end
@@ -101,6 +101,8 @@ module Polyphony
101
101
  #
102
102
  # @return [void]
103
103
  def signal
104
+ return if @queue.empty?
105
+
104
106
  fiber = @queue.shift
105
107
  fiber.schedule
106
108
  end
@@ -109,6 +111,8 @@ module Polyphony
109
111
  #
110
112
  # @return [void]
111
113
  def broadcast
114
+ return if @queue.empty?
115
+
112
116
  while (fiber = @queue.shift)
113
117
  fiber.schedule
114
118
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'polyphony/extensions/debug'
3
+ require 'polyphony/core/debug'
4
4
 
5
5
  module Polyphony
6
6
  TP_EVENTS = [
@@ -188,7 +188,7 @@ module Polyphony
188
188
  def start_server_thread
189
189
  @thread = Thread.new do
190
190
  puts("Listening on #{@socket_path}")
191
- FileUtils.rm(@socket_path) if File.exists?(@socket_path)
191
+ FileUtils.rm(@socket_path) if File.exist?(@socket_path)
192
192
  socket = UNIXServer.new(@socket_path)
193
193
  loop do
194
194
  @client = socket.accept
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './extensions/enumerator'
4
3
  require_relative './extensions/exception'
5
4
  require_relative './extensions/fiber'
6
5
  require_relative './extensions/io'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.95'
4
+ VERSION = '0.96'
5
5
  end
data/lib/polyphony.rb CHANGED
@@ -117,6 +117,10 @@ module Polyphony
117
117
  $VERBOSE = nil
118
118
  Object.const_set(:Queue, Polyphony::Queue)
119
119
  Object.const_set(:Mutex, Polyphony::Mutex)
120
+
121
+ require 'monitor'
122
+ Object.const_set(:Monitor, Polyphony::Mutex)
123
+
120
124
  Object.const_set(:ConditionVariable, Polyphony::ConditionVariable)
121
125
  $VERBOSE = verbose
122
126
  end
data/polyphony.gemspec CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.homepage = 'https://digital-fabric.github.io/polyphony'
12
12
  s.metadata = {
13
13
  "source_code_uri" => "https://github.com/digital-fabric/polyphony",
14
+ # "documentation_uri" => "https://www.rubydoc.info/gems/polyphony",
14
15
  "documentation_uri" => "https://digital-fabric.github.io/polyphony/",
15
16
  "homepage_uri" => "https://digital-fabric.github.io/polyphony/",
16
17
  "changelog_uri" => "https://github.com/digital-fabric/polyphony/blob/master/CHANGELOG.md"
@@ -21,16 +22,15 @@ Gem::Specification.new do |s|
21
22
  s.require_paths = ["lib"]
22
23
  s.required_ruby_version = '>= 3.0'
23
24
 
24
- s.add_development_dependency 'rake-compiler', '1.1.1'
25
- s.add_development_dependency 'minitest', '5.14.4'
26
- s.add_development_dependency 'minitest-reporters', '1.4.2'
27
- s.add_development_dependency 'simplecov', '0.17.1'
28
- s.add_development_dependency 'rubocop', '0.85.1'
29
- s.add_development_dependency 'pry', '0.13.1'
25
+ s.add_development_dependency 'rake-compiler', '1.2.1'
26
+ s.add_development_dependency 'minitest', '5.17.0'
27
+ s.add_development_dependency 'simplecov', '0.22.0'
28
+ s.add_development_dependency 'rubocop', '1.45.1'
29
+ s.add_development_dependency 'pry', '0.14.2'
30
30
 
31
- s.add_development_dependency 'msgpack', '1.4.2'
31
+ s.add_development_dependency 'msgpack', '1.6.0'
32
32
  s.add_development_dependency 'httparty', '0.21.0'
33
- s.add_development_dependency 'localhost', '~>1.1.4'
33
+ s.add_development_dependency 'localhost', '1.1.10'
34
34
 
35
35
  # s.add_development_dependency 'jekyll', '~>3.8.6'
36
36
  # s.add_development_dependency 'jekyll-remote-theme', '~>0.4.1'
data/test/helper.rb CHANGED
@@ -11,16 +11,11 @@ require 'fileutils'
11
11
  require_relative './eg'
12
12
 
13
13
  require 'minitest/autorun'
14
- require 'minitest/reporters'
15
14
 
16
15
  ::Exception.__disable_sanitized_backtrace__ = true
17
16
 
18
17
  IS_LINUX = RUBY_PLATFORM =~ /linux/
19
18
 
20
- # Minitest::Reporters.use! [
21
- # Minitest::Reporters::SpecReporter.new
22
- # ]
23
-
24
19
  module ::Kernel
25
20
  def trace(*args)
26
21
  STDOUT.orig_write(format_trace(args))
data/test/test_ext.rb CHANGED
@@ -39,6 +39,69 @@ class ExceptionTest < MiniTest::Test
39
39
  Exception.__disable_sanitized_backtrace__ = prev_disable
40
40
  end
41
41
 
42
+ LOCATION_ONLY = ->(s) { s =~ /^(.+)\:in / && Regexp.last_match[1] }
43
+
44
+ def test_backtrace_on_main_fiber
45
+ base = caller.map(&LOCATION_ONLY)
46
+ begin
47
+ lineno = __LINE__ + 1
48
+ raise 'foo'
49
+ rescue => e
50
+ end
51
+
52
+ assert !!e
53
+
54
+ bt = e.backtrace.map(&LOCATION_ONLY)
55
+ assert_equal ["#{__FILE__}:#{lineno}"] + base, bt
56
+ end
57
+
58
+ def test_backtrace_on_child_fiber
59
+ Exception.__disable_sanitized_backtrace__ = false
60
+
61
+ lineno = __LINE__ + 1
62
+ fiber = spin do
63
+ raise receive
64
+ end
65
+
66
+ base = caller.map(&LOCATION_ONLY)
67
+
68
+ begin
69
+ fiber << 'foo'
70
+ fiber.await
71
+ rescue => e
72
+ end
73
+
74
+ assert !!e
75
+ bt = e.backtrace.map(&LOCATION_ONLY)
76
+ assert_equal ["#{__FILE__}:#{lineno + 1}", "#{__FILE__}:#{lineno}"] + base, bt
77
+ ensure
78
+ Exception.__disable_sanitized_backtrace__ = true
79
+ end
80
+
81
+ def test_backtrace_on_grand_child_fiber
82
+ Exception.__disable_sanitized_backtrace__ = false
83
+
84
+ lineno = __LINE__ + 1
85
+ f1 = spin do
86
+ f2 = spin do
87
+ raise 'foo'
88
+ end
89
+ f2.await
90
+ end
91
+
92
+ base = caller.map(&LOCATION_ONLY)
93
+
94
+ begin
95
+ f1.await
96
+ rescue => e
97
+ end
98
+
99
+ assert !!e
100
+ bt = e.backtrace.map(&LOCATION_ONLY)
101
+ assert_equal ["#{__FILE__}:#{lineno + 2}", "#{__FILE__}:#{lineno + 1}", "#{__FILE__}:#{lineno}"] + base, bt
102
+ ensure
103
+ Exception.__disable_sanitized_backtrace__ = true
104
+ end
42
105
  end
43
106
 
44
107
  class ProcessTest < MiniTest::Test
@@ -56,7 +56,7 @@ class ThreadPoolTest < MiniTest::Test
56
56
  t0 = Time.now
57
57
  threads = []
58
58
  buffer = []
59
- 10.times do |i|
59
+ 20.times do |i|
60
60
  @pool.cast do
61
61
  sleep 0.01
62
62
  threads << Thread.current
@@ -70,7 +70,7 @@ class ThreadPoolTest < MiniTest::Test
70
70
 
71
71
  sleep 0.20 # allow time for threads to spawn
72
72
  assert_equal @pool.size, threads.uniq.size
73
- assert_equal (0..9).to_a, buffer.sort if IS_LINUX
73
+ assert_equal (0..19).to_a, buffer.sort if IS_LINUX
74
74
  end
75
75
 
76
76
  def test_busy?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.95'
4
+ version: '0.96'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-16 00:00:00.000000000 Z
11
+ date: 2023-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -16,98 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.1
19
+ version: 1.2.1
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: 1.1.1
26
+ version: 1.2.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 5.14.4
33
+ version: 5.17.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 5.14.4
41
- - !ruby/object:Gem::Dependency
42
- name: minitest-reporters
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 1.4.2
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 1.4.2
40
+ version: 5.17.0
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: simplecov
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - '='
60
46
  - !ruby/object:Gem::Version
61
- version: 0.17.1
47
+ version: 0.22.0
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - '='
67
53
  - !ruby/object:Gem::Version
68
- version: 0.17.1
54
+ version: 0.22.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rubocop
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - '='
74
60
  - !ruby/object:Gem::Version
75
- version: 0.85.1
61
+ version: 1.45.1
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - '='
81
67
  - !ruby/object:Gem::Version
82
- version: 0.85.1
68
+ version: 1.45.1
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: pry
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - '='
88
74
  - !ruby/object:Gem::Version
89
- version: 0.13.1
75
+ version: 0.14.2
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - '='
95
81
  - !ruby/object:Gem::Version
96
- version: 0.13.1
82
+ version: 0.14.2
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: msgpack
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - '='
102
88
  - !ruby/object:Gem::Version
103
- version: 1.4.2
89
+ version: 1.6.0
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - '='
109
95
  - !ruby/object:Gem::Version
110
- version: 1.4.2
96
+ version: 1.6.0
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: httparty
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -126,16 +112,16 @@ dependencies:
126
112
  name: localhost
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - "~>"
115
+ - - '='
130
116
  - !ruby/object:Gem::Version
131
- version: 1.1.4
117
+ version: 1.1.10
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
- - - "~>"
122
+ - - '='
137
123
  - !ruby/object:Gem::Version
138
- version: 1.1.4
124
+ version: 1.1.10
139
125
  description:
140
126
  email: sharon@noteflakes.com
141
127
  executables: []
@@ -271,6 +257,7 @@ files:
271
257
  - examples/io/pry.rb
272
258
  - examples/io/rack_server.rb
273
259
  - examples/io/raw.rb
260
+ - examples/io/readline.rb
274
261
  - examples/io/reline.rb
275
262
  - examples/io/splice_chunks.rb
276
263
  - examples/io/splice_echo_server.rb
@@ -364,6 +351,7 @@ files:
364
351
  - lib/polyphony/adapters/readline.rb
365
352
  - lib/polyphony/adapters/redis.rb
366
353
  - lib/polyphony/adapters/sequel.rb
354
+ - lib/polyphony/core/channel.rb
367
355
  - lib/polyphony/core/debug.rb
368
356
  - lib/polyphony/core/exceptions.rb
369
357
  - lib/polyphony/core/global_api.rb
@@ -374,7 +362,6 @@ files:
374
362
  - lib/polyphony/core/timer.rb
375
363
  - lib/polyphony/debugger.rb
376
364
  - lib/polyphony/extensions.rb
377
- - lib/polyphony/extensions/enumerator.rb
378
365
  - lib/polyphony/extensions/exception.rb
379
366
  - lib/polyphony/extensions/fiber.rb
380
367
  - lib/polyphony/extensions/io.rb
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Extensions to the Enumerator class
4
- class ::Enumerator
5
- alias_method :orig_next, :next
6
- def next
7
- Fiber.current.thread ||= Thread.current
8
- orig_next
9
- end
10
-
11
- alias_method :orig_each, :each
12
- def each(*a, &b)
13
- Fiber.current.thread ||= Thread.current
14
- orig_each(*a, &b)
15
- end
16
- end