pubsubstub 0.1.3 → 0.2.2

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
- SHA1:
3
- metadata.gz: 6549edd3271aea9f63868a73df5e2d7abbac4cc3
4
- data.tar.gz: 771ff6a8653ff3f956ba5396b1bbcef79f6f6eb4
2
+ SHA256:
3
+ metadata.gz: 6c8dd8515862da676e40ce08fc68bbacc2c3fc1a5d5774fe0120c45606a0f40e
4
+ data.tar.gz: b09ba3fcf02b39d4f119daecb8ea8e6099ae06d60466d88c04602a51f654be90
5
5
  SHA512:
6
- metadata.gz: fc27ef10f261293dc52adf96789fb5c7de4ac1065cc4a2b8257f3c36d9afe63c9a4c734c90c923d43bc2960404e733bdbe6c525a91197e15b6a166361bde8a4f
7
- data.tar.gz: 3ccd4fb1ef9886ba092d1d33d16c9d8e013a165f31eeb6f229354fea5fa6bc89bb3f115fd465f15f2cfac8a3817aa82589aa1f50aa53bfb9bb5f074e2da9d26c
6
+ metadata.gz: 76cb8590bb052cfd85426def3697bbf17a870119c6720469a42a2bb3ae5a33e960ccfb4d983855d30525134870a3b71443b19a59279d62180b45b80562938867
7
+ data.tar.gz: 6f8ff354315f011a332f0a838c499adfcd8cb8c5ad8fa0905376abf9fa8541dc232a56400dfe591eae3f5f82a7ca4f44347b3cdfa1b9dee517d88f83bcc5d8e9
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ name: Tests with Ruby ${{ matrix.ruby_version }}
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby_version:
13
+ - '2.7'
14
+ - '3.0'
15
+ - '3.1'
16
+
17
+ services:
18
+ redis:
19
+ image: redis
20
+ ports:
21
+ - 6379:6379
22
+ options: --entrypoint redis-server
23
+
24
+ steps:
25
+ - uses: actions/checkout@v1
26
+ - name: Set up Ruby ${{ matrix.ruby_version }}
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby_version }}
30
+ bundler-cache: true
31
+ - name: Run tests
32
+ env:
33
+ RAILS_ENV: test
34
+ run: |
35
+ bundle exec rake
data/Gemfile CHANGED
@@ -3,10 +3,9 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in pubsubstub.gemspec
4
4
  gemspec
5
5
 
6
- gem "rspec", "3.1.0"
7
- gem "pry-byebug"
8
- gem "puma", "~> 3.4"
9
- gem "thin", "~> 1.6"
6
+ gem "rspec"
7
+ gem "puma"
8
+ gem "thin"
10
9
  gem "rack-test"
11
10
  gem "timecop"
12
- gem "rake", "~> 10.0"
11
+ gem "rake"
@@ -13,11 +13,11 @@ module Pubsubstub
13
13
  end
14
14
 
15
15
  def publish(event)
16
- redis.pipelined do
17
- redis.zadd(scrollback_key, event.id, event.to_json)
18
- redis.zremrangebyrank(scrollback_key, 0, -Pubsubstub.channels_scrollback_size)
19
- redis.expire(scrollback_key, Pubsubstub.channels_scrollback_ttl)
20
- redis.publish(pubsub_key, event.to_json)
16
+ redis.pipelined do |pipeline|
17
+ pipeline.zadd(scrollback_key, event.id, event.to_json)
18
+ pipeline.zremrangebyrank(scrollback_key, 0, -Pubsubstub.channels_scrollback_size)
19
+ pipeline.expire(scrollback_key, Pubsubstub.channels_scrollback_ttl)
20
+ pipeline.publish(pubsub_key, event.to_json)
21
21
  end
22
22
  end
23
23
 
@@ -24,7 +24,7 @@ module Pubsubstub
24
24
  else
25
25
  send_scrollback(channels, last_event_id)
26
26
  end
27
- [200, HEADERS, stream]
27
+ [200, HEADERS.dup, stream]
28
28
  end
29
29
 
30
30
  private
@@ -41,11 +41,7 @@ module Pubsubstub
41
41
  end
42
42
 
43
43
  def use_persistent_connections?
44
- Pubsubstub.use_persistent_connections && !event_machine?
45
- end
46
-
47
- def event_machine?
48
- defined?(EventMachine) && EventMachine.reactor_running?
44
+ Pubsubstub.use_persistent_connections
49
45
  end
50
46
 
51
47
  def subscribe_connection(channels, last_event_id)
@@ -74,12 +70,8 @@ module Pubsubstub
74
70
  @mutex.synchronize do
75
71
  return if defined? @helper_threads_initialized
76
72
  @helper_threads_initialized = true
77
- if event_machine?
78
- error { "EventMachine is loaded, running in degraded mode :/"}
79
- else
80
- start_subscriber
81
- start_heartbeat
82
- end
73
+ start_subscriber
74
+ start_heartbeat
83
75
  end
84
76
  end
85
77
 
@@ -31,7 +31,7 @@ module Pubsubstub
31
31
  # redis.client.call allow to bypass the client mutex
32
32
  # Since we now that the only other possible caller is blocking on reading the socket this is safe
33
33
  synchronize do
34
- redis.client.call(['punsubscribe', pubsub_pattern])
34
+ redis._client.call(['punsubscribe', pubsub_pattern])
35
35
  end
36
36
  end
37
37
 
@@ -1,3 +1,3 @@
1
1
  module Pubsubstub
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.2"
3
3
  end
data/pubsubstub.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["gmalette@gmail.com"]
11
11
  spec.summary = %q{Pubsubstub is a rack middleware to add Pub/Sub}
12
12
  spec.description = %q{Pubsubstub can be added to a rack Application or deployed standalone. It uses Redis to do the Pub/Sub}
13
- spec.homepage = "https://github.com/gmalette/pubsubstub"
13
+ spec.homepage = "https://github.com/byroot/pubsubstub"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'rack'
22
- spec.add_dependency 'redis', "~> 3.0"
22
+ spec.add_dependency 'redis', "~> 4.0"
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.5"
24
+ spec.add_development_dependency "bundler"
25
25
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  require 'open3'
2
2
  require 'rack/test'
3
- require 'pry'
4
- require 'pry-byebug'
5
3
  require 'timecop'
6
4
  require 'thread'
7
5
 
@@ -16,15 +14,6 @@ require_relative '../lib/pubsubstub'
16
14
  Pubsubstub.logger = Logger.new(nil)
17
15
  Pubsubstub.logger.level = Logger::DEBUG
18
16
 
19
- # Fake EM
20
- module EventMachine
21
- extend self
22
-
23
- def reactor_running?
24
- false
25
- end
26
- end
27
-
28
17
  RSpec.configure do |config|
29
18
  config.include Rack::Test::Methods
30
19
  config.include HTTPHelpers
@@ -36,4 +25,9 @@ RSpec.configure do |config|
36
25
  config.order = 'random'
37
26
 
38
27
  config.before(:each) { Redis.new(url: Pubsubstub.redis_url).flushdb }
28
+
29
+ # Clean threads after finish
30
+ config.after(:each) do
31
+ Thread.list.each { |thread| thread.join(0.5) if thread != Thread.current }
32
+ end
39
33
  end
@@ -21,14 +21,6 @@ end
21
21
  describe Pubsubstub::StreamAction do
22
22
  let(:app) { Pubsubstub::StreamAction.new }
23
23
 
24
- context "with EventMachine" do
25
- before do
26
- allow(EventMachine).to receive(:reactor_running?).and_return(true)
27
- end
28
-
29
- it_behaves_like "short lived connections"
30
- end
31
-
32
24
  context "with persistent connections disabled" do
33
25
  around :example do |example|
34
26
  previous = Pubsubstub.use_persistent_connections
@@ -44,7 +36,7 @@ describe Pubsubstub::StreamAction do
44
36
  with_background_server do
45
37
  expect(9292).to listen.in_under(5)
46
38
 
47
- chunks = async_get('http://localhost:9292/?channels[]=foo', 'Last-Event-Id' => '0')
39
+ chunks, thread = async_get('http://localhost:9292/?channels[]=foo', { 'Last-Event-Id' => '0' })
48
40
  expect(chunks.pop).to include("event: heartbeat\n")
49
41
 
50
42
  Pubsubstub.publish('foo', 'bar', id: 1)
@@ -52,6 +44,8 @@ describe Pubsubstub::StreamAction do
52
44
 
53
45
  Pubsubstub.publish('foo', 'baz', id: 2)
54
46
  expect(chunks.pop).to include("id: 2\n")
47
+ ensure
48
+ thread.kill
55
49
  end
56
50
  end
57
51
 
@@ -61,11 +55,13 @@ describe Pubsubstub::StreamAction do
61
55
  with_background_server do
62
56
  expect(9292).to listen.in_under(5)
63
57
 
64
- chunks = async_get('http://localhost:9292/?channels[]=foo', 'Last-Event-Id' => '0')
58
+ chunks, thread = async_get('http://localhost:9292/?channels[]=foo', { 'Last-Event-Id' => '0' })
65
59
  expect(chunks.pop).to include("id: 1\n")
66
60
 
67
61
  Pubsubstub.publish('foo', 'baz', id: 2)
68
62
  expect(chunks.pop).to include("id: 2\n")
63
+ ensure
64
+ thread.kill
69
65
  end
70
66
  end
71
67
  end
@@ -10,12 +10,17 @@ RSpec.describe Pubsubstub::Subscriber do
10
10
  subject.add_event_listener('plop', -> (event) { published_events << event })
11
11
  subscribe_thread = Thread.new { subject.start }
12
12
 
13
- expect { subject.subscribed? }.to happen
13
+ expect { subject.subscribed? }.to happen.in_under(1)
14
14
 
15
15
  events.each(&channel.method(:publish))
16
16
 
17
+ expect { published_events.size == events.size }.to happen.in_under(2)
18
+
17
19
  subject.stop
18
- expect { !subject.subscribed? }.to happen
20
+
21
+ subscribe_thread.join(2)
22
+
23
+ expect { ! subject.subscribed? }.to happen.in_under(1)
19
24
 
20
25
  expect(subscribe_thread).to complete
21
26
 
@@ -4,9 +4,9 @@ module HTTPHelpers
4
4
  def async_get(uri, headers = {}, retries: 10, &block)
5
5
  uri = URI(uri.to_s)
6
6
  queue = Queue.new
7
- Thread.start do
7
+ thread = Thread.start do
8
8
  begin
9
- Net::HTTP.start(uri.host, uri.port) do |http|
9
+ Net::HTTP.start(uri.host, uri.port, open_timeout: 10) do |http|
10
10
  request = Net::HTTP::Get.new uri.request_uri
11
11
  headers.each do |name, value|
12
12
  request.add_field(name, value)
@@ -33,7 +33,7 @@ module HTTPHelpers
33
33
  end
34
34
  end
35
35
 
36
- queue
36
+ return queue, thread
37
37
  end
38
38
 
39
39
  ROOT_PATH = File.join(__dir__, '../..')
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubsubstub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guillaume Malette
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-11 00:00:00.000000000 Z
11
+ date: 2022-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: redis
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.0'
33
+ version: '4.0'
34
34
  type: :runtime
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: '3.0'
40
+ version: '4.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.5'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.5'
54
+ version: '0'
55
55
  description: Pubsubstub can be added to a rack Application or deployed standalone.
56
56
  It uses Redis to do the Pub/Sub
57
57
  email:
@@ -62,9 +62,9 @@ executables:
62
62
  extensions: []
63
63
  extra_rdoc_files: []
64
64
  files:
65
- - .gitignore
66
- - .rspec
67
- - .travis.yml
65
+ - ".github/workflows/ci.yml"
66
+ - ".gitignore"
67
+ - ".rspec"
68
68
  - Gemfile
69
69
  - LICENSE.txt
70
70
  - README.md
@@ -74,10 +74,6 @@ files:
74
74
  - example/Gemfile
75
75
  - example/config.ru
76
76
  - example/puma_config.rb
77
- - gemfiles/Gemfile.rack-1.x
78
- - gemfiles/Gemfile.rack-1.x.lock
79
- - gemfiles/Gemfile.rack-2.x
80
- - gemfiles/Gemfile.rack-2.x.lock
81
77
  - lib/pubsubstub.rb
82
78
  - lib/pubsubstub/application.rb
83
79
  - lib/pubsubstub/channel.rb
@@ -99,28 +95,27 @@ files:
99
95
  - spec/subscription_spec.rb
100
96
  - spec/support/http_helpers.rb
101
97
  - spec/support/threading_matchers.rb
102
- homepage: https://github.com/gmalette/pubsubstub
98
+ homepage: https://github.com/byroot/pubsubstub
103
99
  licenses:
104
100
  - MIT
105
101
  metadata: {}
106
- post_install_message:
102
+ post_install_message:
107
103
  rdoc_options: []
108
104
  require_paths:
109
105
  - lib
110
106
  required_ruby_version: !ruby/object:Gem::Requirement
111
107
  requirements:
112
- - - '>='
108
+ - - ">="
113
109
  - !ruby/object:Gem::Version
114
110
  version: '0'
115
111
  required_rubygems_version: !ruby/object:Gem::Requirement
116
112
  requirements:
117
- - - '>='
113
+ - - ">="
118
114
  - !ruby/object:Gem::Version
119
115
  version: '0'
120
116
  requirements: []
121
- rubyforge_project:
122
- rubygems_version: 2.0.14.1
123
- signing_key:
117
+ rubygems_version: 3.3.3
118
+ signing_key:
124
119
  specification_version: 4
125
120
  summary: Pubsubstub is a rack middleware to add Pub/Sub
126
121
  test_files:
data/.travis.yml DELETED
@@ -1,11 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.2
4
- gemfile:
5
- - gemfiles/Gemfile.rack-1.x
6
- - gemfiles/Gemfile.rack-2.x
7
- services:
8
- - redis-server
9
-
10
- after_failure:
11
- - cat tmp/puma.log
@@ -1,11 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rack', '< 2'
4
- gem 'redis', '~> 3.0'
5
- gem "rspec", "3.1.0"
6
- gem "pry-byebug"
7
- gem "puma", "~> 3.4"
8
- gem "thin", "~> 1.6"
9
- gem "rack-test"
10
- gem "timecop"
11
- gem "rake", "~> 10.0"
@@ -1,57 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- byebug (9.0.5)
5
- coderay (1.1.1)
6
- daemons (1.2.4)
7
- diff-lcs (1.2.5)
8
- eventmachine (1.2.0.1)
9
- method_source (0.8.2)
10
- pry (0.10.4)
11
- coderay (~> 1.1.0)
12
- method_source (~> 0.8.1)
13
- slop (~> 3.4)
14
- pry-byebug (3.4.0)
15
- byebug (~> 9.0)
16
- pry (~> 0.10)
17
- puma (3.6.0)
18
- rack (1.6.4)
19
- rack-test (0.6.3)
20
- rack (>= 1.0)
21
- rake (10.5.0)
22
- redis (3.3.1)
23
- rspec (3.1.0)
24
- rspec-core (~> 3.1.0)
25
- rspec-expectations (~> 3.1.0)
26
- rspec-mocks (~> 3.1.0)
27
- rspec-core (3.1.7)
28
- rspec-support (~> 3.1.0)
29
- rspec-expectations (3.1.2)
30
- diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.1.0)
32
- rspec-mocks (3.1.3)
33
- rspec-support (~> 3.1.0)
34
- rspec-support (3.1.2)
35
- slop (3.6.0)
36
- thin (1.7.0)
37
- daemons (~> 1.0, >= 1.0.9)
38
- eventmachine (~> 1.0, >= 1.0.4)
39
- rack (>= 1, < 3)
40
- timecop (0.8.1)
41
-
42
- PLATFORMS
43
- ruby
44
-
45
- DEPENDENCIES
46
- pry-byebug
47
- puma (~> 3.4)
48
- rack (< 2)
49
- rack-test
50
- rake (~> 10.0)
51
- redis (~> 3.0)
52
- rspec (= 3.1.0)
53
- thin (~> 1.6)
54
- timecop
55
-
56
- BUNDLED WITH
57
- 1.12.5
@@ -1,11 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rack', '~> 2.0'
4
- gem 'redis', '~> 3.0'
5
- gem "rspec", "3.1.0"
6
- gem "pry-byebug"
7
- gem "puma", "~> 3.4"
8
- gem "thin", "~> 1.6"
9
- gem "rack-test"
10
- gem "timecop"
11
- gem "rake", "~> 10.0"
@@ -1,57 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- byebug (9.0.5)
5
- coderay (1.1.1)
6
- daemons (1.2.4)
7
- diff-lcs (1.2.5)
8
- eventmachine (1.2.0.1)
9
- method_source (0.8.2)
10
- pry (0.10.4)
11
- coderay (~> 1.1.0)
12
- method_source (~> 0.8.1)
13
- slop (~> 3.4)
14
- pry-byebug (3.4.0)
15
- byebug (~> 9.0)
16
- pry (~> 0.10)
17
- puma (3.6.0)
18
- rack (2.0.1)
19
- rack-test (0.6.3)
20
- rack (>= 1.0)
21
- rake (10.5.0)
22
- redis (3.3.1)
23
- rspec (3.1.0)
24
- rspec-core (~> 3.1.0)
25
- rspec-expectations (~> 3.1.0)
26
- rspec-mocks (~> 3.1.0)
27
- rspec-core (3.1.7)
28
- rspec-support (~> 3.1.0)
29
- rspec-expectations (3.1.2)
30
- diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.1.0)
32
- rspec-mocks (3.1.3)
33
- rspec-support (~> 3.1.0)
34
- rspec-support (3.1.2)
35
- slop (3.6.0)
36
- thin (1.7.0)
37
- daemons (~> 1.0, >= 1.0.9)
38
- eventmachine (~> 1.0, >= 1.0.4)
39
- rack (>= 1, < 3)
40
- timecop (0.8.1)
41
-
42
- PLATFORMS
43
- ruby
44
-
45
- DEPENDENCIES
46
- pry-byebug
47
- puma (~> 3.4)
48
- rack (~> 2.0)
49
- rack-test
50
- rake (~> 10.0)
51
- redis (~> 3.0)
52
- rspec (= 3.1.0)
53
- thin (~> 1.6)
54
- timecop
55
-
56
- BUNDLED WITH
57
- 1.12.5