circuitry 3.0.1 → 3.1.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
2
  SHA1:
3
- metadata.gz: 07ae4efdabd382cf4dcc8cda4c2102639e14515d
4
- data.tar.gz: c7b36755a9674de3660b169b08e0db6765e65819
3
+ metadata.gz: 95884450075da2bde6359a923037db59ddaee7f6
4
+ data.tar.gz: 7b56e6c314947463b2d95627ec622632a9fe60d0
5
5
  SHA512:
6
- metadata.gz: ece369e583e3f2febaaba9ef5bc16481d88b5756fff08d9926f2baea3185e849efb7d9468276d32bc7560cc7822e8546fee01d7d0fd11623052a756522754634
7
- data.tar.gz: 7314bcd628b794be00e20f2f160970ef02b8a2e443220bde6b11257527bf4a8da667acd4e571b039bdf6fc0b4f1a99bbaca2a2d0fa85784475aa3dd24a995e46
6
+ metadata.gz: 9d9000bb3af034d32c012a6610c1f2a791b7f1af3192e276d9901075828ee0a2a8221d5dc5f01b10c18cd8bf5c92348b1d4fea54a738e4136b1f9b17546e22b1
7
+ data.tar.gz: 3a810f4b53a4eb4c4e5227e6e877fe69bcc2cef12a22c2205854782f1cf174670d84159224eabf310e482a68bffa80dfce5e40377f287076d8e66847689d8864
data/CHANGELOG.md CHANGED
@@ -1,17 +1,27 @@
1
+ ## Circuitry 3.1.1 (Mar 3, 2016)
2
+
3
+ * Removed flush middleware. *Matt Huggins*
4
+
5
+ ## Circuitry 3.1.0 (Mar 2, 2016)
6
+
7
+ * Added test stubs. *Matt Huggins*
8
+ * Added flush middleware. *Matt Huggins*
9
+ * Updated provisioning to permit publisher-only configuration (no queue name). *Matt Huggins*
10
+
1
11
  ## Circuitry 3.0.1 (Feb 19, 2016)
2
12
 
3
- * Reworded provisioner subscription creator message *Brandon Croft*
13
+ * Reworded provisioner subscription creator message. *Brandon Croft*
4
14
 
5
15
  ## Circuitry 3.0.0 (Feb 19, 2016)
6
16
 
7
- * Added separate configuration for publisher/subscriber applications *Brandon Croft*
8
- * Added YML config option *Brandon Croft*
9
- * Added max_receive_count and visibility_timeout subscriber config options *Brandon Croft*
10
- * Replace on_thread_exit and on_fork_exit with on_async_exit config option *Brandon Croft*
17
+ * Added separate configuration for publisher/subscriber applications. *Brandon Croft*
18
+ * Added YML config option. *Brandon Croft*
19
+ * Added `max_receive_count` and `visibility_timeout` subscriber config options. *Brandon Croft*
20
+ * Replaced `on_thread_exit` and `on_fork_exit` with `on_async_exit` config option. *Brandon Croft*
11
21
 
12
22
  ## Circuitry 2.1.1 (Jan 30, 2016)
13
23
 
14
- * Fixed missing require in subscriber *Brandon Croft*
24
+ * Fixed missing require in subscriber. *Brandon Croft*
15
25
 
16
26
  ## Circuitry 2.1.0 (Jan 28, 2016)
17
27
 
@@ -19,8 +29,8 @@
19
29
 
20
30
  ## Circuitry 2.0.0 (Jan 28, 2016)
21
31
 
22
- * Added subscriber_queue_name config. *Brandon Croft*
23
- * Added publisher_topic_names config. *Brandon Croft*
32
+ * Added `subscriber_queue_name` config. *Brandon Croft*
33
+ * Added `publisher_topic_names` config. *Brandon Croft*
24
34
  * Added CLI and rake provisioning of queues and topics as defined by config. *Brandon Croft*
25
35
  * Removed the requirement to provide a SQS URL to the subscriber. *Brandon Croft*
26
36
 
data/README.md CHANGED
@@ -16,7 +16,7 @@ A Circuitry publisher application can broadcast events which can be fanned out t
16
16
  Add this line to your application's Gemfile:
17
17
 
18
18
  ```ruby
19
- gem 'circuitry', '~>2.0.0'
19
+ gem 'circuitry', '~> 3.1'
20
20
  ```
21
21
 
22
22
  And then execute:
@@ -86,8 +86,8 @@ development:
86
86
  production:
87
87
  publisher:
88
88
  topic_names:
89
- - brandonc-appname-user-create
90
- - brandonc-appname-user-destroy
89
+ - production-appname-user-create
90
+ - production-appname-user-destroy
91
91
  subscriber:
92
92
  queue_name: "production-appname"
93
93
  dead_letter_queue_name: "production-appname-failures"
@@ -555,6 +555,16 @@ your middleware:
555
555
  * `#clear`: Removes all middleware classes from the chain.
556
556
  * `middleware.clear`
557
557
 
558
+ ## Testing
559
+
560
+ Circuitry provides a simple option for testing publishing and subscribing without actually hitting
561
+ Amazon services. Inside your test suite (e.g.: `spec_helper.rb`), just make sure you include the
562
+ following line:
563
+
564
+ ```ruby
565
+ require 'circuitry/testing'
566
+ ```
567
+
558
568
  ## Development
559
569
 
560
570
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
@@ -17,7 +17,7 @@ module Circuitry
17
17
  end
18
18
 
19
19
  def middleware
20
- @_middleware ||= Circuitry::Middleware::Chain.new
20
+ @_middleware ||= Middleware::Chain.new
21
21
  yield @_middleware if block_given?
22
22
  @_middleware
23
23
  end
@@ -5,6 +5,10 @@ module Circuitry
5
5
  class Chain
6
6
  include Enumerable
7
7
 
8
+ def initialize
9
+ yield self if block_given?
10
+ end
11
+
8
12
  def each(&block)
9
13
  entries.each(&block)
10
14
  end
@@ -12,9 +12,9 @@ module Circuitry
12
12
  end
13
13
 
14
14
  def flush
15
- pool.each { |block| safely_process(&block) }
16
- ensure
17
- pool.clear
15
+ while (block = pool.shift)
16
+ safely_process(&block)
17
+ end
18
18
  end
19
19
  end
20
20
  end
@@ -11,10 +11,8 @@ module Circuitry
11
11
 
12
12
  def run
13
13
  queue = create_queue
14
- return unless queue
15
-
14
+ subscribe_topics(queue, create_topics(:subscriber, subscriber_config.topic_names)) if queue
16
15
  create_topics(:publisher, publisher_config.topic_names)
17
- subscribe_topics(queue, create_topics(:subscriber, subscriber_config.topic_names))
18
16
  end
19
17
 
20
18
  private
@@ -30,6 +28,11 @@ module Circuitry
30
28
  end
31
29
 
32
30
  def create_queue
31
+ if subscriber_config.queue_name.nil?
32
+ logger.info 'Skipping queue creation: queue_name is not configured'
33
+ return nil
34
+ end
35
+
33
36
  safe_aws('Create queue') do
34
37
  queue = QueueCreator.find_or_create(
35
38
  subscriber_config.queue_name,
@@ -131,50 +131,51 @@ module Circuitry
131
131
  message = Message.new(message)
132
132
 
133
133
  logger.info("Processing message #{message.id}")
134
- handle_message(message, &block)
135
- delete_message(message)
136
- rescue => e
137
- logger.error("Error processing message #{message.id}: #{e}")
138
- error_handler.call(e) if error_handler
139
- end
140
134
 
141
- def handle_message(message, &block)
142
135
  handled = try_with_lock(message.id) do
143
- middleware.invoke(message.topic.name, message.body) do
144
- handle_message_with_timeout(message, &block)
145
- end
136
+ handle_message_with_middleware(message, &block)
146
137
  end
147
138
 
148
139
  logger.info("Ignoring duplicate message #{message.id}") unless handled
140
+ rescue => e
141
+ logger.error("Error processing message #{message.id}: #{e}")
142
+ error_handler.call(e) if error_handler
149
143
  end
150
144
 
151
- # TODO: Don't use ruby timeout.
152
- # http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
153
- def handle_message_with_timeout(message, &block)
154
- Timeout.timeout(timeout) do
155
- block.call(message.body, message.topic.name)
145
+ def handle_message_with_middleware(message, &block)
146
+ middleware.invoke(message.topic.name, message.body) do
147
+ handle_message(message, &block)
148
+ delete_message(message)
156
149
  end
157
- rescue => e
158
- logger.error("Error handling message #{message.id}: #{e}")
159
- raise e
160
150
  end
161
151
 
162
- def try_with_lock(handle)
163
- if lock.soft_lock(handle)
152
+ def try_with_lock(id)
153
+ if lock.soft_lock(id)
164
154
  begin
165
155
  yield
166
156
  rescue => e
167
- lock.unlock(handle)
157
+ lock.unlock(id)
168
158
  raise e
169
159
  end
170
160
 
171
- lock.hard_lock(handle)
161
+ lock.hard_lock(id)
172
162
  true
173
163
  else
174
164
  false
175
165
  end
176
166
  end
177
167
 
168
+ # TODO: Don't use ruby timeout.
169
+ # http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
170
+ def handle_message(message, &block)
171
+ Timeout.timeout(timeout) do
172
+ block.call(message.body, message.topic.name)
173
+ end
174
+ rescue => e
175
+ logger.error("Error handling message #{message.id}: #{e}")
176
+ raise e
177
+ end
178
+
178
179
  def delete_message(message)
179
180
  logger.info("Removing message #{message.id} from queue")
180
181
  sqs.delete_message(queue_url: queue, receipt_handle: message.receipt_handle)
@@ -0,0 +1,15 @@
1
+ require 'circuitry'
2
+
3
+ module Circuitry
4
+ class Publisher
5
+ def publish(_topic_name, _object)
6
+ # noop
7
+ end
8
+ end
9
+
10
+ class Subscriber
11
+ def subscribe(&_block)
12
+ # noop
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module Circuitry
2
- VERSION = '3.0.1'
2
+ VERSION = '3.1.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circuitry
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Huggins
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-02-19 00:00:00.000000000 Z
12
+ date: 2016-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -275,6 +275,7 @@ files:
275
275
  - lib/circuitry/services/sqs.rb
276
276
  - lib/circuitry/subscriber.rb
277
277
  - lib/circuitry/tasks.rb
278
+ - lib/circuitry/testing.rb
278
279
  - lib/circuitry/topic.rb
279
280
  - lib/circuitry/version.rb
280
281
  homepage: https://github.com/kapost/circuitry
@@ -297,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
297
298
  version: '0'
298
299
  requirements: []
299
300
  rubyforge_project:
300
- rubygems_version: 2.4.5.1
301
+ rubygems_version: 2.4.8
301
302
  signing_key:
302
303
  specification_version: 4
303
304
  summary: Decouple ruby applications using Amazon SNS fanout with SQS processing.