pubsubstub 0.1.3 → 0.2.2

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
- 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