bps 0.0.2 → 0.0.3

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
2
  SHA256:
3
- metadata.gz: c304694760a3a2ec342890aa712e3a8b9ac3984dc3a04905f273c686c80532b1
4
- data.tar.gz: 68cf2791624965f9bf552d8cae2983aa1b2510cb3525a97c710a50ecf7306896
3
+ metadata.gz: b92c586f8714baa2d0eb59f900d653385e8234f11db651d86cfb0c60e6e562b6
4
+ data.tar.gz: 855927bb8ac566e779d98299045da1b81cac64de7a5ad69607ee7e6b4c52e2b1
5
5
  SHA512:
6
- metadata.gz: f8912ce5b3f169900b0310945c5f8b8e0e28d5b54476dfb0a3b08c10d379e1a4a55232fc78e07fa02f65de10d963c544ea007faaa1514cbc8d0c96b165df1806
7
- data.tar.gz: 930a1e2f1f0448e999099ceed035147512a1485ea79f79de22548bb254bfb55a12a0aafdbecc1985b2505031a03a1ad7b81104441f093fb8b0d215ea3f3aa37a
6
+ metadata.gz: cd832222ce04ba89d6bdf559f14f981176c602519192a7734e9accaaa44edeaefc4a247fd559276691218b38b5a74ccbb6f13cdb0b701a523c9f3cf14dca0c67
7
+ data.tar.gz: e5e2adb22cc63a7f6be8f8e6db745cff4d6b36898313e719efdc6846af50739633ea7be9872f6f6d58089bcb654d7fb4a6dc9bb7262f094bd912c4864df0a23e
data/lib/bps.rb CHANGED
@@ -6,6 +6,7 @@ module BPS
6
6
 
7
7
  module Publisher
8
8
  autoload :Abstract, 'bps/publisher/abstract'
9
+ autoload :InMem, 'bps/publisher/in_mem'
9
10
 
10
11
  def self.register(*schemes, &resolver)
11
12
  @registry ||= {}
@@ -11,6 +11,10 @@ module BPS
11
11
  def flush(**); end
12
12
  end
13
13
 
14
+ def initialize
15
+ ObjectSpace.define_finalizer(self, proc { close })
16
+ end
17
+
14
18
  # Retrieve a topic handle.
15
19
  # @params [String] name the topic name.
16
20
  def topic(_name)
@@ -0,0 +1,41 @@
1
+ module BPS
2
+ module Publisher
3
+ class InMem < Abstract
4
+ class Topic < Abstract::Topic
5
+ attr_reader :name, :messages
6
+
7
+ def initialize(name)
8
+ super()
9
+ @name = name.to_s
10
+ @messages = []
11
+ end
12
+
13
+ # Publish a message.
14
+ def publish(message, **)
15
+ @messages.push(message.to_s)
16
+ end
17
+ end
18
+
19
+ def initialize
20
+ super()
21
+ @topics = {}
22
+ end
23
+
24
+ # @return [Array<String>] the existing topic names.
25
+ def topic_names
26
+ @topic_names ||= @topics.keys.sort
27
+ end
28
+
29
+ # Retrieve a topic handle.
30
+ # @params [String] name the topic name.
31
+ def topic(name)
32
+ name = name.to_s
33
+
34
+ @topics[name] ||= begin
35
+ @topic_names = nil
36
+ self.class::Topic.new(name)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,6 +1,10 @@
1
1
  module BPS
2
2
  module Subscriber
3
3
  class Abstract
4
+ def initialize
5
+ ObjectSpace.define_finalizer(self, proc { close })
6
+ end
7
+
4
8
  # Subscribe to a topic
5
9
  # @params [String] topic the topic name.
6
10
  def subscribe(_topic, **)
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe BPS::Publisher::InMem do
4
+ it 'should maintain topics' do
5
+ expect(subject.topic('x')).to be_a(described_class::Topic)
6
+ expect(subject.topic_names).to eq(%w[x])
7
+ expect(subject.topic('z')).to be_a(described_class::Topic)
8
+ expect(subject.topic_names).to eq(%w[x z])
9
+ expect(subject.topic('y')).to be_a(described_class::Topic)
10
+ expect(subject.topic_names).to eq(%w[x y z])
11
+ end
12
+
13
+ it 'should publish' do
14
+ topic = subject.topic('x')
15
+ topic.publish('foo')
16
+ topic.publish('bar')
17
+ expect(topic.messages).to eq(%w[foo bar])
18
+
19
+ expect { topic.flush }.not_to raise_error
20
+ expect(subject.topic('x').messages).to eq(%w[foo bar])
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Black Square Media
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-01 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Minimalist abstraction for publish-subscribe
14
14
  email: info@blacksquaremedia.com
@@ -20,8 +20,10 @@ files:
20
20
  - lib/bps.rb
21
21
  - lib/bps/coercer.rb
22
22
  - lib/bps/publisher/abstract.rb
23
+ - lib/bps/publisher/in_mem.rb
23
24
  - lib/bps/subscriber/abstract.rb
24
25
  - spec/bps/coercer_spec.rb
26
+ - spec/bps/publisher/in_mem_spec.rb
25
27
  homepage: https://github.com/bsm/bps
26
28
  licenses:
27
29
  - Apache-2.0
@@ -41,9 +43,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
41
43
  - !ruby/object:Gem::Version
42
44
  version: '0'
43
45
  requirements: []
44
- rubygems_version: 3.1.4
46
+ rubygems_version: 3.1.2
45
47
  signing_key:
46
48
  specification_version: 4
47
49
  summary: Multi-platform pubsub adapter
48
50
  test_files:
49
51
  - spec/bps/coercer_spec.rb
52
+ - spec/bps/publisher/in_mem_spec.rb