captainu-tincan 0.7.1 → 0.7.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
2
  SHA1:
3
- metadata.gz: 069f61ac75dc1f4915231c6b9d7f5ac591f0b1ea
4
- data.tar.gz: 732881f5ff1c6a4cc1bde3219b020c4359b1699d
3
+ metadata.gz: d1131a74590ccc72507072e98e99b76dc664b3b9
4
+ data.tar.gz: b54e1fae869ce79d00b979bee13db4a3196c7056
5
5
  SHA512:
6
- metadata.gz: 1a25d23fc9bdd43b026c99e8bf9edb71432d8bae5b7fa35c16b6b323d4d0e71f32ad66e8f13602bae472eb35303fc2a7384ef805400face6454fd4a7608d8800
7
- data.tar.gz: 3a8639d81a241835ad46119fe7fc34bf6e34793f19105e38c179fc158aceedbf765edc422d185b1d80a7d6ce12d521f8b715a4754a135ac830bff86aa59b8bb1
6
+ metadata.gz: 828686330455c64a8272530833d7e571cedf158ef0bab6a77d30fe090ced1c9a34f4c3cf73092a8ef69d13a45d77187cfd868f223272ed04f7a8c04ce035261c
7
+ data.tar.gz: 7180089c5bbc803b8fe0ebadd9ee9f6d4ce4578ea80bf993864d813cc3c218c12d2c3e615eeb4c0aa912566160bbae467db70d3e316abbe1012c0366e44049f8
data/lib/tincan/sender.rb CHANGED
@@ -37,11 +37,15 @@ module Tincan
37
37
 
38
38
  # Asks Redis for the set of all active receivers and generates string
39
39
  # keys for all of them. Formatted like "namespace:object:client:messages".
40
+ # @param [String] object_name The name of the object, used in formulating
41
+ # which receiver list keys to return.
42
+ # @param [Array] exclude An optional array of client names to exclude
43
+ # from the returned list of receiver list keys.
40
44
  # @return [Array] An array of keys identifying all receiver pointer lists.
41
- def keys_for_receivers(object_name)
45
+ def keys_for_receivers(object_name, exclude: [])
42
46
  receiver_list_key = key_for_elements(object_name, 'receivers')
43
47
  receivers = redis_client.smembers(receiver_list_key)
44
- receivers.map do |receiver|
48
+ receivers.reject { |r| exclude.include?(r) }.map do |receiver|
45
49
  key_for_elements(object_name, receiver, 'messages')
46
50
  end
47
51
  end
@@ -61,14 +65,14 @@ module Tincan
61
65
  # Bundles up an object in a message object and publishes it to the Redis
62
66
  # host.
63
67
  # @param [Tincan::Message] message The message to publish.
64
- # @param [Symbol] change_type :create, :modify, or :delete.
68
+ # @param [Array] exclude An optional array of client names to exclude
69
+ # from getting the published message.
65
70
  # @return [Boolean] true if the operation was a success.
66
- def publish(message)
71
+ def publish(message, exclude: [])
67
72
  identifier = identifier_for_message(message)
68
73
  redis_client.set(primary_key_for_message(message), message.to_json)
69
- keys_for_receivers(message.object_name.downcase).each do |key|
70
- redis_client.rpush(key, identifier)
71
- end
74
+ keys = keys_for_receivers(message.object_name.downcase, exclude: exclude)
75
+ keys.each { |key| redis_client.rpush(key, identifier) }
72
76
  true
73
77
  end
74
78
 
@@ -1,3 +1,3 @@
1
1
  module Tincan
2
- VERSION = '0.7.1'
2
+ VERSION = '0.7.2'
3
3
  end
data/spec/sender_spec.rb CHANGED
@@ -51,6 +51,12 @@ describe Tincan::Sender do
51
51
  result = sender.keys_for_receivers('object')
52
52
  expect(result).to eq(%w(data:object:some_client:messages))
53
53
  end
54
+
55
+ it 'can handle an optional list of clients to exclude' do
56
+ redis.sadd('data:object:receivers', 'bork')
57
+ result = sender.keys_for_receivers('object', exclude: 'bork')
58
+ expect(result).to eq(%w(data:object:some_client:messages))
59
+ end
54
60
  end
55
61
 
56
62
  describe :flush_all_queues_for_object do
@@ -84,22 +90,47 @@ describe Tincan::Sender do
84
90
  end
85
91
 
86
92
  before do
87
- redis.sadd('data:dummy_class:receivers', 'some_client')
88
- sender.publish(message)
89
- @timestamp = Time.now.to_i
93
+ %w(some_client bork).each do |name|
94
+ redis.sadd('data:dummy_class:receivers', name)
95
+ end
90
96
  end
91
97
 
92
- it 'publishes a message to Redis at a specific key' do
93
- message = redis.get("data:dummy_class:messages:#{@timestamp}")
94
- expect(message).to be_a(String)
95
- expected = '{"object_name":"dummy_class","change_type":"create",'
96
- expected += '"object_data":{"name":"Some Idiot"},"published_at":'
97
- expect(message).to start_with(expected)
98
+ context 'posting to all clients' do
99
+ before do
100
+ sender.publish(message)
101
+ @timestamp = Time.now.to_i
102
+ end
103
+
104
+ it 'publishes a message to Redis at a specific key' do
105
+ message = redis.get("data:dummy_class:messages:#{@timestamp}")
106
+ expect(message).to be_a(String)
107
+ expected = '{"object_name":"dummy_class","change_type":"create",'
108
+ expected += '"object_data":{"name":"Some Idiot"},"published_at":'
109
+ expect(message).to start_with(expected)
110
+ end
111
+
112
+ it 'also publishes a message ID to client-specific receiver lists' do
113
+ identifier = redis.lpop('data:dummy_class:some_client:messages')
114
+ expect(identifier).to eq(@timestamp.to_s)
115
+
116
+ identifier = redis.lpop('data:dummy_class:bork:messages')
117
+ expect(identifier).to eq(@timestamp.to_s)
118
+ end
98
119
  end
99
120
 
100
- it 'also publishes a message ID to client-specific receiver lists' do
101
- identifier = redis.lpop('data:dummy_class:some_client:messages')
102
- expect(identifier).to eq(@timestamp.to_s)
121
+ context 'posting to non-excluded clients' do
122
+ before do
123
+ sender.publish(message, exclude: %w(bork))
124
+ @timestamp = Time.now.to_i
125
+ end
126
+
127
+ it 'publishes message IDs to client-specific receivers, non-excluded' do
128
+ identifier = redis.lpop('data:dummy_class:some_client:messages')
129
+ expect(identifier).to eq(@timestamp.to_s)
130
+
131
+ identifier = redis.lpop('data:dummy_class:bork:messages')
132
+ expect(identifier).to be_nil
133
+ end
103
134
  end
104
135
  end
105
136
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: captainu-tincan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Kreeger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-18 00:00:00.000000000 Z
11
+ date: 2014-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -196,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  version: '0'
197
197
  requirements: []
198
198
  rubyforge_project:
199
- rubygems_version: 2.3.0
199
+ rubygems_version: 2.4.1
200
200
  signing_key:
201
201
  specification_version: 4
202
202
  summary: A simple implementation of reliable Redis messaging.