pubsubstub 0.1.0 → 0.2.1

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: 90b72c7935cf8e1f3f6320f1b6a4ea00844a4144
4
- data.tar.gz: 81620ee43f4d51c1dc06822c66864430b0196263
2
+ SHA256:
3
+ metadata.gz: 115205de6d2987f1c983becef16c87452d844b33001a335105eb96f9a945ba74
4
+ data.tar.gz: d32a258717cb23cecc7d81e954938c499ffa6d8a9fdd68340a9e62cecbcffb17
5
5
  SHA512:
6
- metadata.gz: a9a40ad176ccb066f1d3fd2514e4d2b3e3402bf2e072a7540ae94a7283244c5ecbc4bbe9e8be63e9311db38668d275c466990b8c8de7655994cec9c5f95f03de
7
- data.tar.gz: 4420554341dd097571627040b898c40c8790722c0da008b7a9e6d9f370d2c02780ad186379d5fb36aba28625bc5350fdfe5103535341209807d749ce15392198
6
+ metadata.gz: f92c6a3acf01542564683a9adf952ac0660bbc82612f294d34ba15864aac95d22b0ac9d778a7474101612528c6948e528a3291286c65e410a42394cbc5d9d2a3
7
+ data.tar.gz: 3caa10c0cebbe247632faf75d1259e4cba5fdfa8504b594f10826d8e6840ca560bb3d037c11d0e51acc65186ae73e1597199180a2d0880aea11d587fabc8feeb
@@ -1,6 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
3
+ - 2.3
4
+ - 2.4
5
+ - 2.5
6
+ - 2.6.3
7
+ gemfile:
8
+ - gemfiles/Gemfile.rack-1.x
9
+ - gemfiles/Gemfile.rack-2.x
4
10
  services:
5
11
  - redis-server
6
12
 
data/Gemfile CHANGED
@@ -3,10 +3,11 @@ 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"
6
+ gem 'rspec', '~> 3.8'
7
7
  gem "pry-byebug"
8
+ gem "byebug", '~> 10.0'
8
9
  gem "puma", "~> 3.4"
9
10
  gem "thin", "~> 1.6"
10
11
  gem "rack-test"
11
12
  gem "timecop"
12
- gem "rake", "~> 10.0"
13
+ gem "rake"
data/Rakefile CHANGED
@@ -4,3 +4,23 @@ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task default: :spec
7
+
8
+ namespace :spec do
9
+ task :all do
10
+ Dir['gemfiles/*'].reject { |p| p.end_with?('.lock') }.each do |gemfile|
11
+ command = %(BUNDLE_GEMFILE=#{gemfile} bundle exec rspec)
12
+ puts command
13
+ system(command)
14
+ end
15
+ end
16
+ end
17
+
18
+ namespace :gemfiles do
19
+ task :update do
20
+ Dir['gemfiles/*'].reject { |p| p.end_with?('.lock') }.each do |gemfile|
21
+ command = %(BUNDLE_GEMFILE=#{gemfile} bundle update)
22
+ puts command
23
+ system(command)
24
+ end
25
+ end
26
+ end
@@ -1,4 +1,3 @@
1
- p File.expand_path('../lib', __dir__)
2
1
  $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
3
2
  require 'pubsubstub'
4
3
 
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rack', '< 2'
4
+ gem 'redis', '~> 4.0'
5
+ gem 'rspec', '~> 3.8'
6
+ gem "pry-byebug"
7
+ gem "byebug", '~> 10.0'
8
+ gem "puma", "~> 3.4"
9
+ gem "thin", "~> 1.6"
10
+ gem "rack-test"
11
+ gem "timecop"
12
+ gem "rake"
@@ -0,0 +1,57 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ byebug (10.0.2)
5
+ coderay (1.1.2)
6
+ daemons (1.3.1)
7
+ diff-lcs (1.3)
8
+ eventmachine (1.2.7)
9
+ method_source (0.9.2)
10
+ pry (0.12.2)
11
+ coderay (~> 1.1.0)
12
+ method_source (~> 0.9.0)
13
+ pry-byebug (3.6.0)
14
+ byebug (~> 10.0)
15
+ pry (~> 0.10)
16
+ puma (3.12.1)
17
+ rack (1.6.11)
18
+ rack-test (1.1.0)
19
+ rack (>= 1.0, < 3)
20
+ rake (12.3.3)
21
+ redis (4.1.2)
22
+ rspec (3.8.0)
23
+ rspec-core (~> 3.8.0)
24
+ rspec-expectations (~> 3.8.0)
25
+ rspec-mocks (~> 3.8.0)
26
+ rspec-core (3.8.2)
27
+ rspec-support (~> 3.8.0)
28
+ rspec-expectations (3.8.4)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.8.0)
31
+ rspec-mocks (3.8.1)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.8.0)
34
+ rspec-support (3.8.2)
35
+ thin (1.7.2)
36
+ daemons (~> 1.0, >= 1.0.9)
37
+ eventmachine (~> 1.0, >= 1.0.4)
38
+ rack (>= 1, < 3)
39
+ timecop (0.9.1)
40
+
41
+ PLATFORMS
42
+ ruby
43
+
44
+ DEPENDENCIES
45
+ byebug (~> 10.0)
46
+ pry-byebug
47
+ puma (~> 3.4)
48
+ rack (< 2)
49
+ rack-test
50
+ rake
51
+ redis (~> 4.0)
52
+ rspec (~> 3.8)
53
+ thin (~> 1.6)
54
+ timecop
55
+
56
+ BUNDLED WITH
57
+ 1.17.3
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rack', '~> 2.0'
4
+ gem 'redis', '~> 4.0'
5
+ gem 'rspec', '~> 3.8'
6
+ gem "pry-byebug"
7
+ gem "byebug", '~> 10.0'
8
+ gem "puma", "~> 3.4"
9
+ gem "thin", "~> 1.6"
10
+ gem "rack-test"
11
+ gem "timecop"
12
+ gem "rake"
@@ -0,0 +1,57 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ byebug (10.0.2)
5
+ coderay (1.1.2)
6
+ daemons (1.3.1)
7
+ diff-lcs (1.3)
8
+ eventmachine (1.2.7)
9
+ method_source (0.9.2)
10
+ pry (0.12.2)
11
+ coderay (~> 1.1.0)
12
+ method_source (~> 0.9.0)
13
+ pry-byebug (3.6.0)
14
+ byebug (~> 10.0)
15
+ pry (~> 0.10)
16
+ puma (3.12.1)
17
+ rack (2.0.7)
18
+ rack-test (1.1.0)
19
+ rack (>= 1.0, < 3)
20
+ rake (12.3.3)
21
+ redis (4.1.2)
22
+ rspec (3.8.0)
23
+ rspec-core (~> 3.8.0)
24
+ rspec-expectations (~> 3.8.0)
25
+ rspec-mocks (~> 3.8.0)
26
+ rspec-core (3.8.2)
27
+ rspec-support (~> 3.8.0)
28
+ rspec-expectations (3.8.4)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.8.0)
31
+ rspec-mocks (3.8.1)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.8.0)
34
+ rspec-support (3.8.2)
35
+ thin (1.7.2)
36
+ daemons (~> 1.0, >= 1.0.9)
37
+ eventmachine (~> 1.0, >= 1.0.4)
38
+ rack (>= 1, < 3)
39
+ timecop (0.9.1)
40
+
41
+ PLATFORMS
42
+ ruby
43
+
44
+ DEPENDENCIES
45
+ byebug (~> 10.0)
46
+ pry-byebug
47
+ puma (~> 3.4)
48
+ rack (~> 2.0)
49
+ rack-test
50
+ rake
51
+ redis (~> 4.0)
52
+ rspec (~> 3.8)
53
+ thin (~> 1.6)
54
+ timecop
55
+
56
+ BUNDLED WITH
57
+ 1.17.3
@@ -3,7 +3,7 @@ require "mutex_m"
3
3
  require "json"
4
4
  require "set"
5
5
 
6
- require "sinatra"
6
+ require "rack/request"
7
7
  require "redis"
8
8
  require "pubsubstub/version"
9
9
  require "pubsubstub/logging"
@@ -11,7 +11,7 @@ require "pubsubstub/channel"
11
11
  require "pubsubstub/subscriber"
12
12
  require "pubsubstub/subscription"
13
13
  require "pubsubstub/event"
14
- require "pubsubstub/action"
14
+ require "pubsubstub/stream"
15
15
  require "pubsubstub/stream_action"
16
16
  require "pubsubstub/publish_action"
17
17
  require "pubsubstub/application"
@@ -21,7 +21,8 @@ module Pubsubstub
21
21
 
22
22
  class << self
23
23
  attr_accessor :heartbeat_frequency, :redis_url, :channels_scrollback_size,
24
- :channels_scrollback_ttl, :logger, :reconnect_timeout, :error_handler
24
+ :channels_scrollback_ttl, :logger, :reconnect_timeout, :error_handler,
25
+ :use_persistent_connections
25
26
 
26
27
  def publish(channel_name, *args)
27
28
  Channel.new(channel_name).publish(Event.new(*args))
@@ -69,6 +70,7 @@ module Pubsubstub
69
70
  self.channels_scrollback_size = 1000
70
71
  self.channels_scrollback_ttl = 24 * 60 * 60
71
72
  self.reconnect_timeout = 10_000
73
+ self.use_persistent_connections = true
72
74
 
73
75
  # Deprecated. Use Pubsubstub.publish instead
74
76
  module RedisPubSub
@@ -1,6 +1,22 @@
1
1
  module Pubsubstub
2
- class Application < Sinatra::Base
3
- use PublishAction
4
- use StreamAction
2
+ class Application
3
+ def initialize(*)
4
+ @publish = PublishAction.new
5
+ @stream = StreamAction.new
6
+ end
7
+
8
+ def self.call(env)
9
+ @instance ||= new
10
+ @instance.call(env)
11
+ end
12
+
13
+ def call(env)
14
+ request = Rack::Request.new(env)
15
+ if request.get?
16
+ @stream.call(env)
17
+ else
18
+ @publish.call(env)
19
+ end
20
+ end
5
21
  end
6
22
  end
@@ -1,10 +1,14 @@
1
1
  module Pubsubstub
2
- class PublishAction < Pubsubstub::Action
3
- post '/' do
4
- (params[:channels] || [:default]).each do |channel_name|
5
- Pubsubstub.publish(channel_name, params[:data], name: params[:event])
2
+ class PublishAction
3
+ def initialize(*)
4
+ end
5
+
6
+ def call(env)
7
+ request = Rack::Request.new(env)
8
+ channels = (request.params['channels'] || [:default]).each do |channel_name|
9
+ Pubsubstub.publish(channel_name, request.params['data'], name: request.params['event'])
6
10
  end
7
- ""
11
+ [200, {}, ['']]
8
12
  end
9
13
  end
10
14
  end
@@ -0,0 +1,25 @@
1
+ class Stream
2
+ def initialize(&callback)
3
+ @callback = callback
4
+ @closed = false
5
+ end
6
+
7
+ def close
8
+ @closed = true
9
+ end
10
+
11
+ def each(&front)
12
+ @front = front
13
+ @callback.call(self)
14
+ close
15
+ end
16
+
17
+ def <<(data)
18
+ @front.call(data.to_s)
19
+ self
20
+ end
21
+
22
+ def closed?
23
+ @closed
24
+ end
25
+ end
@@ -1,60 +1,55 @@
1
1
  module Pubsubstub
2
- class StreamAction < Pubsubstub::Action
2
+ class StreamAction
3
+ HEADERS = {
4
+ 'Content-Type' => 'text/event-stream',
5
+ 'Cache-Control' => 'no-cache',
6
+ 'X-Accel-Buffering' => 'no',
7
+ 'Connection' => 'keep-alive',
8
+ }.freeze
3
9
  include Logging
4
10
 
5
11
  def initialize(*)
6
- super
7
12
  @subscriptions = Set.new
8
13
  @mutex = Mutex.new
9
14
  end
10
15
 
11
- get '/', provides: 'text/event-stream' do
12
- status(200)
13
- headers({
14
- 'Cache-Control' => 'no-cache',
15
- 'X-Accel-Buffering' => 'no',
16
- 'Connection' => 'keep-alive',
17
- })
16
+ def call(env)
17
+ spawn_helper_threads
18
+ last_event_id = env['HTTP_LAST_EVENT_ID']
19
+ request = Rack::Request.new(env)
20
+ channels = (request.params['channels'] || [:default]).map(&Channel.method(:new))
18
21
 
19
- if event_machine?
20
- send_scrollback
22
+ stream = if use_persistent_connections?
23
+ subscribe_connection(channels, last_event_id)
21
24
  else
22
- subscribe_connection
25
+ send_scrollback(channels, last_event_id)
23
26
  end
24
- end
25
-
26
- def call(*)
27
- spawn_helper_threads
28
- super
27
+ [200, HEADERS.dup, stream]
29
28
  end
30
29
 
31
30
  private
32
31
 
33
- def last_event_id
34
- request.env['HTTP_LAST_EVENT_ID']
35
- end
36
-
37
- def send_scrollback
32
+ def send_scrollback(channels, last_event_id)
38
33
  scrollback_events = []
39
34
  scrollback_events = channels.flat_map { |c| c.scrollback(since: last_event_id) } if last_event_id
40
35
  scrollback_events = [Pubsubstub.heartbeat_event] if scrollback_events.empty?
41
- stream do |connection|
36
+ Stream.new do |connection|
42
37
  scrollback_events.each do |event|
43
38
  connection << event.to_message
44
39
  end
45
40
  end
46
41
  end
47
42
 
48
- def event_machine?
49
- defined?(EventMachine) && EventMachine.reactor_running?
43
+ def use_persistent_connections?
44
+ Pubsubstub.use_persistent_connections && !event_machine?
50
45
  end
51
46
 
52
- def channels
53
- (params[:channels] || [:default]).map(&Channel.method(:new))
47
+ def event_machine?
48
+ defined?(EventMachine) && EventMachine.reactor_running?
54
49
  end
55
50
 
56
- def subscribe_connection
57
- stream do |connection|
51
+ def subscribe_connection(channels, last_event_id)
52
+ Stream.new do |connection|
58
53
  subscription = register(channels, connection)
59
54
  begin
60
55
  subscription.stream(last_event_id)
@@ -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.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency 'sinatra', "~> 1.4"
22
- spec.add_dependency 'redis', "~> 3.0"
21
+ spec.add_dependency 'rack'
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
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Pubsubstub::Channel do
3
+ RSpec.describe Pubsubstub::Channel do
4
4
  subject { described_class.new('foobar') }
5
5
 
6
6
  it "has a name" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Pubsubstub::Event do
3
+ RSpec.describe Pubsubstub::Event do
4
4
  subject {
5
5
  Pubsubstub::Event.new("refresh #1500\nnew #1400", id: 12345678, name: "toto", retry_after: 1_000)
6
6
  }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Pubsubstub::StreamAction do
3
+ RSpec.describe Pubsubstub::StreamAction do
4
4
  let(:app) { Pubsubstub::PublishAction.new }
5
5
  let(:channel) { Pubsubstub::Channel.new('foo') }
6
6
 
@@ -19,7 +19,7 @@ Pubsubstub.logger.level = Logger::DEBUG
19
19
  # Fake EM
20
20
  module EventMachine
21
21
  extend self
22
-
22
+
23
23
  def reactor_running?
24
24
  false
25
25
  end
@@ -36,4 +36,9 @@ RSpec.configure do |config|
36
36
  config.order = 'random'
37
37
 
38
38
  config.before(:each) { Redis.new(url: Pubsubstub.redis_url).flushdb }
39
+
40
+ # Clean threads after finish
41
+ config.after(:each) do
42
+ Thread.list.each { |thread| thread.join(0.5) if thread != Thread.current }
43
+ end
39
44
  end
@@ -1,5 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
+ RSpec.shared_examples "short lived connections" do
4
+ it "immediately returns the scrollback" do
5
+ Pubsubstub.publish('foo', 'bar', id: 1)
6
+ Pubsubstub.publish('foo', 'baz', id: 2)
7
+
8
+ get '/?channels[]=foo', {}, 'HTTP_LAST_EVENT_ID' => 1
9
+ expect(last_response.body).to eq("id: 2\ndata: baz\n\n")
10
+ end
11
+
12
+ it "returns and heartbeat if scrollback is empty" do
13
+ Timecop.freeze('2015-01-01T00:00:00+00:00') do
14
+ get '/'
15
+ message = "id: 1420070400000\nevent: heartbeat\nretry: #{Pubsubstub.reconnect_timeout}\ndata: ping\n\n"
16
+ expect(last_response.body).to eq(message)
17
+ end
18
+ end
19
+ end
20
+
3
21
  describe Pubsubstub::StreamAction do
4
22
  let(:app) { Pubsubstub::StreamAction.new }
5
23
 
@@ -8,21 +26,18 @@ describe Pubsubstub::StreamAction do
8
26
  allow(EventMachine).to receive(:reactor_running?).and_return(true)
9
27
  end
10
28
 
11
- it "immediately returns the scrollback" do
12
- Pubsubstub.publish('foo', 'bar', id: 1)
13
- Pubsubstub.publish('foo', 'baz', id: 2)
29
+ it_behaves_like "short lived connections"
30
+ end
14
31
 
15
- get '/?channels[]=foo', {}, 'HTTP_LAST_EVENT_ID' => 1
16
- expect(last_response.body).to eq("id: 2\ndata: baz\n\n")
32
+ context "with persistent connections disabled" do
33
+ around :example do |example|
34
+ previous = Pubsubstub.use_persistent_connections
35
+ Pubsubstub.use_persistent_connections = false
36
+ example.run
37
+ Pubsubstub.use_persistent_connections = previous
17
38
  end
18
39
 
19
- it "returns and heartbeat if scrollback is empty" do
20
- Timecop.freeze('2015-01-01T00:00:00+00:00') do
21
- get '/'
22
- message = "id: 1420070400000\nevent: heartbeat\nretry: #{Pubsubstub.reconnect_timeout}\ndata: ping\n\n"
23
- expect(last_response.body).to eq(message)
24
- end
25
- end
40
+ it_behaves_like "short lived connections"
26
41
  end
27
42
 
28
43
  it "immediately send a heartbeat event if there is no scrollback" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Pubsubstub::Subscriber do
3
+ RSpec.describe Pubsubstub::Subscriber do
4
4
  describe "#start" do
5
5
  let(:channel) { Pubsubstub::Channel.new('plop') }
6
6
  let(:events) { (1..10).map { |i| Pubsubstub::Event.new("refresh ##{i}", id: i) } }
@@ -10,12 +10,17 @@ 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
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Pubsubstub::Subscription do
3
+ RSpec.describe Pubsubstub::Subscription do
4
4
  let(:event) { Pubsubstub::Event.new('hello') }
5
5
  let(:connection) { [] }
6
6
  let(:channels) { %w(foo bar).map(&Pubsubstub::Channel.method(:new)) }
@@ -6,7 +6,7 @@ module HTTPHelpers
6
6
  queue = Queue.new
7
7
  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)
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.0
4
+ version: 0.2.1
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-07-07 00:00:00.000000000 Z
11
+ date: 2020-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sinatra
14
+ name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
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
- version: '1.4'
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:
@@ -74,13 +74,17 @@ 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
77
81
  - lib/pubsubstub.rb
78
- - lib/pubsubstub/action.rb
79
82
  - lib/pubsubstub/application.rb
80
83
  - lib/pubsubstub/channel.rb
81
84
  - lib/pubsubstub/event.rb
82
85
  - lib/pubsubstub/logging.rb
83
86
  - lib/pubsubstub/publish_action.rb
87
+ - lib/pubsubstub/stream.rb
84
88
  - lib/pubsubstub/stream_action.rb
85
89
  - lib/pubsubstub/subscriber.rb
86
90
  - lib/pubsubstub/subscription.rb
@@ -99,7 +103,7 @@ homepage: https://github.com/gmalette/pubsubstub
99
103
  licenses:
100
104
  - MIT
101
105
  metadata: {}
102
- post_install_message:
106
+ post_install_message:
103
107
  rdoc_options: []
104
108
  require_paths:
105
109
  - lib
@@ -114,9 +118,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
118
  - !ruby/object:Gem::Version
115
119
  version: '0'
116
120
  requirements: []
117
- rubyforge_project:
118
- rubygems_version: 2.5.1
119
- signing_key:
121
+ rubygems_version: 3.1.2
122
+ signing_key:
120
123
  specification_version: 4
121
124
  summary: Pubsubstub is a rack middleware to add Pub/Sub
122
125
  test_files:
@@ -1,13 +0,0 @@
1
- module Pubsubstub
2
- class Action < Sinatra::Base
3
- configure :production, :development do
4
- enable :logging
5
- end
6
-
7
- configure :test do
8
- set :dump_errors, false
9
- set :raise_errors, true
10
- set :show_exceptions, false
11
- end
12
- end
13
- end