aws-broker 0.0.3 → 0.0.4

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: 47445eb1fe64609e924b638fba632b0d59808374
4
- data.tar.gz: ffaa55778697fe1c9fa6dd4e59d79e07dbd23f6a
3
+ metadata.gz: 15d27e2ba58c931cc347494c6420b762666dcc60
4
+ data.tar.gz: 873896f0dd399e8e41f232cbcf23c3d757223ddb
5
5
  SHA512:
6
- metadata.gz: 00cbd98f3230911e14f541a5f917e6009ed6c83673f8298d73cebe9f0a1a522c9eb903d38cbcafae28e933b5c702639cbdf7ab9b7c4b6c130261ca5c43b01787
7
- data.tar.gz: b627d025fe2558cfdd629ff289bc5a18602a25f2e70e6a164aeedb081954b6db930e02f462001b70fd58cf3d52208fe1972c00c3e826511b0fd9c2467753b349
6
+ metadata.gz: df5fb8fcf7e36951e8d3b8737c66f2fa1672f292c699eda096e88edc7aff1e57acae9fa7c89ab9057f9e129737e81b28e2924025bde0b6e55b3c0b046235b915
7
+ data.tar.gz: 7513b2f5159cf72adff7a05de25a502f7f0255ee1c17c35e143ea17b4ba45cf31061e7bb8d73cf0e25f5d8ef8cd513684b3d0c2921fc94fd50b8005f4de1dae6
data/README.md CHANGED
@@ -16,7 +16,7 @@ Message processing is not part of this gem - we recommend using
16
16
 
17
17
  gem 'aws-broker'
18
18
 
19
- ### Usage
19
+ ### Basic Usage
20
20
 
21
21
  Broker = Aws::Broker
22
22
  topic = 'topic'
@@ -33,37 +33,52 @@ Message processing is not part of this gem - we recommend using
33
33
  # publish message to topic
34
34
  Broker.publish(topic, message)
35
35
 
36
- ### Configuration
36
+ ### Rails Usage
37
37
 
38
- #### Broker Options
38
+ Though AWS Broker does not require Rails, an ActiveRecord extension and
39
+ accompanying RSpec matcher is provided if the project is Rails. This simplifies
40
+ the process of publishing events for ActiveRecord create, update, and destroy
41
+ callbacks.
39
42
 
40
- Aws::Broker can be configured via the following:
43
+ ## Publishing
41
44
 
42
- Aws::Broker.configure do |config|
43
- config.enabled = false
44
- config.queue_prefix = 'prefix'
45
+ # app/models/user.rb
46
+ class User < ActiveRecord::Base
47
+ publish_event :create, :update, :destroy
45
48
  end
46
49
 
47
- The following options are available:
50
+ ## Subscribing
48
51
 
49
- | Option | Default | Description |
50
- |----------------|---------|--------------------------------------------------|
51
- | `enabled` | true | if false, don't trigger API calls to AWS |
52
- | `queue_prefix` | nil | prefix for default queue name (prefix-topic) |
52
+ # app/subscribers/user_subscriber.rb
53
+ class UserSubscriber < Shoryuken::Subscriber
54
+ self.resource_class = 'User'
53
55
 
54
- #### AWS Client
56
+ def create; ... end
55
57
 
56
- AWS Broker wraps the AWS SQS and SNS clients. All configuration is the same as
57
- the AWS SDK. See
58
- [Configuring the AWS SDK for Ruby](http://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html)
59
- for details.
58
+ def update; ... end
60
59
 
61
- Some supported options:
60
+ def destroy; ... end
61
+ end
62
+
63
+ ## Testing
64
+
65
+ # spec/rails_helper.rb
66
+ require 'aws/broker/matchers'
67
+
68
+ # spec/models/user_spec.rb
69
+ describe User do
70
+ context 'publish' do
71
+ subject { User }
72
+ it { should publish_event(:create) }
73
+ it { should publish_event(:update) }
74
+ it { should publish_event(:destroy) }
75
+ end
76
+ end
77
+
78
+ ### Usage Details
62
79
 
63
- * `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` env variables
64
- * shared `~/.aws/credentials` file
65
- * IAM
66
- * `Aws.config[:credentials]`
80
+ See the [wiki](https://github.com/Thanx/aws-broker/wiki) for an in-depth
81
+ overview of usage and configuration options.
67
82
 
68
83
  ### Inspiration
69
84
 
@@ -1,7 +1,10 @@
1
1
  require 'aws-sdk-sqs'
2
2
  require 'aws-sdk-sns'
3
3
  require 'aws/broker'
4
+ require 'aws/broker/railtie' if defined?(Rails)
4
5
 
5
- module Aws
6
-
6
+ begin
7
+ require 'shoryuken'
8
+ require 'shoryuken/subscriber'
9
+ rescue LoadError
7
10
  end
@@ -0,0 +1,27 @@
1
+ RSpec::Matchers.define :publish_event do |event|
2
+ match do |klass|
3
+ filter = :"publish_event_#{event}"
4
+ # find callback
5
+ callback = klass._commit_callbacks.detect { |c| c.filter == filter }
6
+ # assert existence
7
+ expect(callback).to be
8
+ # assert after_commit
9
+ expect(callback.kind).to eq(:after)
10
+ # assert after commit event type
11
+ expect(callback.instance_variable_get(:@if)[0]).to include("[:#{event}]")
12
+ # assert broker call is triggered
13
+ object = klass.new
14
+ allow(object).to receive(:id) { 0 }
15
+ expect(Broker).to receive(:publish).with(
16
+ klass.to_s.underscore.tr('/','_'),
17
+ event: event,
18
+ id: 0
19
+ )
20
+ object.send(filter)
21
+ true
22
+ end
23
+
24
+ failure_message do |klass|
25
+ "expected #{klass.to_s} to publish_event #{event}"
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module Aws
2
+ class Broker
3
+ module Publishing
4
+
5
+ # only :create, :update, :destroy
6
+ def publish_event(*events)
7
+ events.each do |event|
8
+ event = event.to_sym
9
+ unless [:create, :update, :destroy].include?(event)
10
+ raise "Invalid publish event #{event}"
11
+ end
12
+ method_name = :"publish_event_#{event}"
13
+ define_method method_name do
14
+ Broker.publish(
15
+ self.class.to_s.underscore.tr('/', '_'),
16
+ event: event,
17
+ id: id
18
+ )
19
+ end
20
+ after_commit method_name, on: event
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require 'aws/broker/publishing'
2
+
3
+ module Aws
4
+ class Broker
5
+ class Railtie < Rails::Railtie
6
+
7
+ initializer 'aws-broker.extend_active_record' do
8
+ ActiveSupport.on_load(:active_record) do
9
+ ActiveRecord::Base.send(:extend, Aws::Broker::Publishing)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ module Shoryuken
2
+ class Subscriber
3
+ include Shoryuken::Worker
4
+
5
+ class << self
6
+ attr_reader :resource_class
7
+
8
+ def queue=(queue)
9
+ shoryuken_options(
10
+ queue: queue,
11
+ auto_delete: true,
12
+ body_parser: :json
13
+ )
14
+ end
15
+
16
+ def resource_class=(klass)
17
+ @resource_class = klass
18
+ end
19
+ end
20
+
21
+ def perform(_, body)
22
+ @body = body
23
+ send(event)
24
+ end
25
+
26
+ private
27
+
28
+ def resource
29
+ @resource ||= self.class.resource_class.constantize.find(message[:id])
30
+ end
31
+
32
+ def event
33
+ message[:event]
34
+ end
35
+
36
+ def message
37
+ @message ||= JSON.parse(@body['Message']).symbolize_keys
38
+ rescue JSON::ParserError
39
+ {}
40
+ end
41
+
42
+ end
43
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eng @ Thanx
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-17 00:00:00.000000000 Z
11
+ date: 2017-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-sns
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: Lightweight Ruby pub-sub abstraction on AWS
41
+ description: Ruby pub-sub on AWS
42
42
  email: eng@thanx.com
43
43
  executables: []
44
44
  extensions: []
@@ -49,9 +49,12 @@ files:
49
49
  - lib/aws/broker.rb
50
50
  - lib/aws/broker/base.rb
51
51
  - lib/aws/broker/config.rb
52
- - lib/aws/broker/constants.rb
52
+ - lib/aws/broker/matchers.rb
53
53
  - lib/aws/broker/publisher.rb
54
+ - lib/aws/broker/publishing.rb
55
+ - lib/aws/broker/railtie.rb
54
56
  - lib/aws/broker/subscriber.rb
57
+ - lib/shoryuken/subscriber.rb
55
58
  homepage: https://github.com/thanx/aws-broker
56
59
  licenses:
57
60
  - MIT
@@ -72,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
75
  version: '0'
73
76
  requirements: []
74
77
  rubyforge_project:
75
- rubygems_version: 2.6.11
78
+ rubygems_version: 2.5.1
76
79
  signing_key:
77
80
  specification_version: 4
78
81
  summary: AWS Broker
@@ -1,7 +0,0 @@
1
- module Aws
2
- class Broker
3
-
4
- VERSION = '0.0.3'.freeze
5
-
6
- end
7
- end