captainu-tincan 0.7.1 → 0.7.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
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.