circuitry 3.2.0 → 3.3.0

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
- SHA1:
3
- metadata.gz: cf97d3815318439ecc8eff261947cb4360bc0d48
4
- data.tar.gz: d4e82e38d4bf9cfddc0dbd410eb1414dd7cf8af5
2
+ SHA256:
3
+ metadata.gz: d200bb856db00d87237c6425d03a31ab5953ac4962f7af81e9797b85f94ee921
4
+ data.tar.gz: 1bc9b5eac4c058f5f30ad035ae8f10dabf4921d0f3b35781a528856ba75459c0
5
5
  SHA512:
6
- metadata.gz: a42bd8ed1ce577f498aad1b674304042248a9e9892a3dbb0b955c5452288e852ca6510c460ac3994cf8f17bb1bee10dcb83e59a3845b00238c2c344614b9f704
7
- data.tar.gz: aa1e4eff88e74a1cee7d1e27e1f404dc3efdf565337191faf4b605ad1bcf574fd25044d2781c4e95c6e9b19aa85341b98006849e97e013691a18b1eb6616c826
6
+ metadata.gz: be4a3411b0e5a4535049dda1343e901a4abcb2ec81d2b76762dfe75460b1b5941031c0e50d5d3c1bca0b23700350497dfd40e5243b90e449b93ef36b76ab14d2
7
+ data.tar.gz: 245564d9b1d16e53b9086acc44446967705dcef54062f0747ae6b8cb50a601fb8822c3ef7444c09bb2e7355519667bb8c1cbfd45e16da29ea018f11d04cc7602
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ working_directory: ~/circuitry
5
+ docker:
6
+ - image: kapost/ruby:2.4.3-node-6.11.5
7
+ steps:
8
+ - checkout
9
+ - run: bundle install
10
+ - run:
11
+ name: Rspec
12
+ command: bundle exec rspec --format documentation --color spec
@@ -1,3 +1,11 @@
1
+ ## Circuitry 3.3.0 (June 23, 2020)
2
+
3
+ * Update AWS SDK to version 3 and use module sdk gems. *thogg4*
4
+ See https://github.com/aws/aws-sdk-ruby
5
+ Version 3 is backwards compatible with version 2.
6
+ * Catch `Aws::SNS::Errors::InvalidParameter` and rethrow with the topic
7
+ and message that caused the problem for improved debugging.
8
+
1
9
  ## Circuitry 3.2.0 (May 6, 2017)
2
10
 
3
11
  * Fixed processing for `batch_size` of 1. *Xi Zhang*
data/README.md CHANGED
@@ -116,9 +116,15 @@ production:
116
116
  Available configuration options for *both* subscriber and publisher applications include:
117
117
 
118
118
  * `access_key`: The AWS access key ID that has access to SNS publishing and/or
119
- SQS subscribing. *(required)*
119
+ SQS subscribing. *(required unless using iam profile)*
120
120
  * `secret_key`: The AWS secret access key that has access to SNS publishing
121
- and/or SQS subscribing. *(required)*
121
+ and/or SQS subscribing. *(required unless using iam profile)*
122
+ * `use_iam_profile`: Whether or not to use an iam profile for authenticating to AWS.
123
+ This will only work when running your application inside of an AWS instance.
124
+ Accepts `true` or `false`
125
+ Please refer to the [AWS Docs](http://docs.aws.amazon.com/sdk-for-ruby/v2/developer-guide/setup-config.html#aws-ruby-sdk-credentials-iam)
126
+ for more details about using iam profiles for authentication.
127
+ *(required unless using access and secret keys, default: `false`)*
122
128
  * `region`: The AWS region that your SNS and/or SQS account lives in.
123
129
  *(optional, default: "us-east-1")*
124
130
  * `logger`: The logger to use for informational output, warnings, and error
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_dependency 'aws-sdk', '~> 2'
22
+ spec.add_dependency 'aws-sdk-sqs'
23
+ spec.add_dependency 'aws-sdk-sns'
24
+
23
25
  spec.add_dependency 'retries', '~> 0.0.5'
24
26
  spec.add_dependency 'virtus', '~> 1.0'
25
27
  spec.add_dependency 'thor'
@@ -9,6 +9,7 @@ module Circuitry
9
9
  base.attribute :access_key, String
10
10
  base.attribute :secret_key, String
11
11
  base.attribute :region, String, default: 'us-east-1'
12
+ base.attribute :use_iam_profile, Virtus::Attribute::Boolean, default: false
12
13
  base.attribute :logger, Logger, default: Logger.new(STDERR)
13
14
  base.attribute :error_handler
14
15
  base.attribute :topic_names, Array[String], default: []
@@ -26,6 +26,7 @@ module Circuitry
26
26
  unless value.is_a?(Circuitry::Locks::Base)
27
27
  raise ConfigError, "invalid lock strategy \"#{value.inspect}\""
28
28
  end
29
+ super
29
30
  end
30
31
  end
31
32
  end
@@ -6,6 +6,17 @@ require 'circuitry/services/sns'
6
6
  module Circuitry
7
7
  class PublishError < StandardError; end
8
8
 
9
+ class SnsPublishError < StandardError
10
+ def initialize(topic:, message:, exception:)
11
+ msg = {
12
+ error: "#{exception.class}: #{exception.message}",
13
+ topic_arn: topic.arn,
14
+ message: message
15
+ }
16
+ super msg.to_json
17
+ end
18
+ end
19
+
9
20
  class Publisher
10
21
  include Concerns::Async
11
22
  include Services::SNS
@@ -54,7 +65,7 @@ module Circuitry
54
65
  # TODO: Don't use ruby timeout.
55
66
  # http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
56
67
  Timeout.timeout(timeout) do
57
- logger.info("Publishing message to #{topic_name}")
68
+ logger.debug("Publishing message to #{topic_name}")
58
69
 
59
70
  handler = ->(error, attempt_number, _total_delay) do
60
71
  logger.warn("Error publishing attempt ##{attempt_number}: #{error.class} (#{error.message}); retrying...")
@@ -62,7 +73,7 @@ module Circuitry
62
73
 
63
74
  with_retries(max_tries: 3, handler: handler, rescue: CONNECTION_ERRORS, base_sleep_seconds: 0.05, max_sleep_seconds: 0.25) do
64
75
  topic = Topic.find(topic_name)
65
- sns.publish(topic_arn: topic.arn, message: message)
76
+ sns_publish(topic: topic, message: message)
66
77
  end
67
78
  end
68
79
  end
@@ -72,11 +83,20 @@ module Circuitry
72
83
 
73
84
  private
74
85
 
86
+ def sns_publish(topic:, message:)
87
+ sns.publish(topic_arn: topic.arn, message: message)
88
+
89
+ rescue Aws::SNS::Errors::InvalidParameter => ex
90
+ raise SnsPublishError.new(topic: topic, message: message, exception: ex)
91
+ end
92
+
75
93
  def logger
76
94
  Circuitry.publisher_config.logger
77
95
  end
78
96
 
79
97
  def can_publish?
98
+ return true if Circuitry.publisher_config.use_iam_profile
99
+
80
100
  Circuitry.publisher_config.aws_options.values.all? do |value|
81
101
  !value.nil? && !value.empty?
82
102
  end
@@ -1,4 +1,4 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-sns'
2
2
 
3
3
  module Circuitry
4
4
  module Services
@@ -1,4 +1,4 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-sqs'
2
2
 
3
3
  module Circuitry
4
4
  module Services
@@ -132,7 +132,7 @@ module Circuitry
132
132
  def process_message(message, &block)
133
133
  message = Message.new(message)
134
134
 
135
- logger.info("Processing message #{message.id}")
135
+ logger.debug("Processing message #{message.id}")
136
136
 
137
137
  handled = try_with_lock(message.id) do
138
138
  handle_message_with_middleware(message, &block)
@@ -179,7 +179,7 @@ module Circuitry
179
179
  end
180
180
 
181
181
  def delete_message(message)
182
- logger.info("Removing message #{message.id} from queue")
182
+ logger.debug("Removing message #{message.id} from queue")
183
183
  sqs.delete_message(queue_url: queue, receipt_handle: message.receipt_handle)
184
184
  end
185
185
 
@@ -192,6 +192,8 @@ module Circuitry
192
192
  end
193
193
 
194
194
  def can_subscribe?
195
+ return true if Circuitry.subscriber_config.use_iam_profile
196
+
195
197
  Circuitry.subscriber_config.aws_options.values.all? do |value|
196
198
  !value.nil? && !value.empty?
197
199
  end
@@ -1,3 +1,3 @@
1
1
  module Circuitry
2
- VERSION = '3.2.0'
2
+ VERSION = '3.3.0'
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.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Huggins
@@ -9,22 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-05-06 00:00:00.000000000 Z
12
+ date: 2020-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: aws-sdk
15
+ name: aws-sdk-sqs
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '2'
20
+ version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '2'
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: aws-sdk-sns
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: retries
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -231,6 +245,7 @@ executables:
231
245
  extensions: []
232
246
  extra_rdoc_files: []
233
247
  files:
248
+ - ".circleci/config.yml"
234
249
  - ".gitignore"
235
250
  - ".rspec"
236
251
  - ".rubocop.yml"
@@ -241,7 +256,6 @@ files:
241
256
  - Rakefile
242
257
  - bin/console
243
258
  - bin/setup
244
- - circle.yml
245
259
  - circuitry.gemspec
246
260
  - exe/circuitry
247
261
  - lib/circuitry.rb
@@ -297,8 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
297
311
  - !ruby/object:Gem::Version
298
312
  version: '0'
299
313
  requirements: []
300
- rubyforge_project:
301
- rubygems_version: 2.6.10
314
+ rubygems_version: 3.0.3
302
315
  signing_key:
303
316
  specification_version: 4
304
317
  summary: Decouple ruby applications using Amazon SNS fanout with SQS processing.
data/circle.yml DELETED
@@ -1,7 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.2.0
4
-
5
- dependencies:
6
- pre:
7
- - gem install bundler -v 1.8.9