aws-liam 0.0.8 → 0.0.9

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
  SHA256:
3
- metadata.gz: cb56b9b9adaa264e64fd5a8e60171e279c52761f5a00cea30977a96396a47b74
4
- data.tar.gz: 86166f8802d24fd4aa93cda51d7606619658470fe3e66580b382acf89beb80f4
3
+ metadata.gz: 58f7f42c10ec20d554b11e94099448bc7396e9fbeeeabc0908d4b27f3698dd0b
4
+ data.tar.gz: 615bd7386620f20e4368f2c1d2a98adaf1f3df64cf86debfa9802ef72df29371
5
5
  SHA512:
6
- metadata.gz: 93f2c7b2277433830e3f37b3630f97040d5b7916efa5954386b3b664dc3b6f6a75124aefc043caa686aa07c733669fae6b912a81fdd9c111441b33f35caf6289
7
- data.tar.gz: 4823392801ca44d27bc379286a3e41d7a5b6777b740fb61ef91da7c7bbc07a87513ba1991ef899050f7abdbd0b31c8304eb74fd557983ac9ef2576cc662a962d
6
+ metadata.gz: f8f61e0cd90d856adff8a55725d6837d768cab00ea7d6df49589b5264ef4a7a3546098fa1f72d1bea72689d4053367f6bab646364ef30d844aa7e70c883b6bb6
7
+ data.tar.gz: e969558c3ad2edcfd4d606787aafa1145071fb6a29e6db34627ef7862f73978b69052cca2a79ff7ee82b1f5e5c57fda9c0bc8fe063a6ce15af1da5a47a7f8dd4
@@ -1,6 +1,13 @@
1
1
  name: Main
2
2
 
3
- on: [pull_request]
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ body:
7
+ default: ""
8
+ test:
9
+ default: false
10
+ pull_request_target:
4
11
 
5
12
  jobs:
6
13
  vm-job:
@@ -10,36 +17,33 @@ jobs:
10
17
  max-parallel: 4
11
18
 
12
19
  steps:
13
- - uses: actions/checkout@v1
20
+ - uses: actions/checkout@v2
14
21
 
15
- - name: Set up Python 3.7
16
- uses: actions/setup-python@v1
22
+ - name: Set up Ruby 2.7.2
23
+ uses: ruby/setup-ruby@v1
17
24
  with:
18
- python_version: 3.7
25
+ ruby-version: 2.7.2
19
26
 
20
- - name: Set up Ruby 2.6
21
- uses: actions/setup-ruby@v1
27
+ - name: Set up aws-cli
28
+ uses: unfor19/install-aws-cli-action@v1
29
+ id: install-aws-cli
22
30
  with:
23
- ruby_version: 2.6.3
24
-
25
- - name: Set up pip
26
- run: python -m pip install --upgrade pip
31
+ version: 2
32
+ run: aws --version
33
+ shell: bash
27
34
 
28
35
  - name: Set up LocalStack
29
36
  run: |
30
- docker-compose -f docker-compose.localstack.yml up -d
31
- curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
32
- unzip -q awscliv2.zip
33
- sudo ./aws/install
34
37
  cp -avr .aws/ ~/
35
- while ! curl -s http://localhost:4575 > /dev/null; do echo waiting for localstack; sleep 3; done;
36
- aws --endpoint-url=http://localhost:4575 sns create-topic --name liam_TestProducer
38
+ docker-compose -f docker-compose.localstack.yml up -d
39
+ while ! curl -s http://localhost:4566 > /dev/null; do echo waiting for localstack; sleep 3; done;
40
+ aws --endpoint-url=http://localhost:4566 sns create-topic --name liam_TestProducer
37
41
 
38
42
  - name: Build
39
43
  env:
40
44
  RAILS_ENV: test
41
45
  run: |
42
- gem install bundler -v 2.1.4
46
+ gem install bundler -v 2.1.4 -N
43
47
  bundle _2.1.4_ install --jobs 4 --retry 3
44
48
 
45
49
  - name: Run tests
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  *.gem
2
+ .idea
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- aws-liam (0.0.7)
4
+ aws-liam (0.0.9)
5
5
  aws-sdk-sns (~> 1.21)
6
6
  aws-sdk-sqs (~> 1.23, >= 1.23.1)
7
7
 
@@ -10,21 +10,21 @@ GEM
10
10
  specs:
11
11
  addressable (2.7.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
- aws-eventstream (1.0.3)
14
- aws-partitions (1.295.0)
15
- aws-sdk-core (3.93.0)
16
- aws-eventstream (~> 1.0, >= 1.0.2)
13
+ aws-eventstream (1.1.1)
14
+ aws-partitions (1.445.0)
15
+ aws-sdk-core (3.114.0)
16
+ aws-eventstream (~> 1, >= 1.0.2)
17
17
  aws-partitions (~> 1, >= 1.239.0)
18
18
  aws-sigv4 (~> 1.1)
19
19
  jmespath (~> 1.0)
20
- aws-sdk-sns (1.22.0)
21
- aws-sdk-core (~> 3, >= 3.71.0)
20
+ aws-sdk-sns (1.39.0)
21
+ aws-sdk-core (~> 3, >= 3.112.0)
22
22
  aws-sigv4 (~> 1.1)
23
- aws-sdk-sqs (1.24.0)
24
- aws-sdk-core (~> 3, >= 3.71.0)
23
+ aws-sdk-sqs (1.38.0)
24
+ aws-sdk-core (~> 3, >= 3.112.0)
25
25
  aws-sigv4 (~> 1.1)
26
- aws-sigv4 (1.1.1)
27
- aws-eventstream (~> 1.0, >= 1.0.2)
26
+ aws-sigv4 (1.2.3)
27
+ aws-eventstream (~> 1, >= 1.0.2)
28
28
  crack (0.4.3)
29
29
  safe_yaml (~> 1.0.0)
30
30
  diff-lcs (1.3)
data/README.md CHANGED
@@ -4,8 +4,6 @@ Liam is how we decided to call the implementation we did for our events based co
4
4
 
5
5
  We called it Liam in honor to Liam Neeson for so many reasons, being the most important this iconic scene when Bryan (Liam) called Marko and said:
6
6
 
7
- ![Liam](https://pmctvline2.files.wordpress.com/2015/09/taken-prequel.jpg)
8
-
9
7
  > *I DONT KNOW WHO YOU ARE, I DON’T KNOW WHAT YOU WANT, BUT I WILL FIND YOU AND I WILL KILL YOU*...
10
8
 
11
9
  We wrote an [article at Medium](https://medium.com/archdaily-on-technology/microservices-events-aws-our-path-to-improve-communication-between-our-ruby-on-rails-apps-501b65e35fa3) where we explained the whole problem we had when we tried to use plain POST http requests between applications.
@@ -44,7 +42,21 @@ Then execute this little rake tast that will generate some configuration files n
44
42
  1. config/liam.yaml
45
43
  2. lib/task/liam.rake
46
44
 
47
- Go to the first one an setup your credentials and topics endpoints at AWS. The second rake task should need to be called in Service B (and whenever you want to keep listening from new messages)
45
+ Go to the first one an setup your credentials and topic endpoints at AWS. You'll need to add here all the `events` you want to use later.
46
+
47
+ The second file corresponds to a rake task that will be needed only in the Services that want to be listening for new messages. If your Service will only publish messages (aka will be just a producer, not a consumer) then you can forget (or even delete) this rake task.
48
+
49
+ ### Configuration
50
+ Liam will fail early if the key for your environment is missing on `config/liam.yaml`.
51
+ If you'd like to skip sending messages while you finish your setup, you can add the `skip: true` option.
52
+
53
+ For example:
54
+
55
+ ```
56
+ staging:
57
+ <<: *default
58
+ skip: true
59
+ ```
48
60
 
49
61
  ## Usage
50
62
 
@@ -58,6 +70,16 @@ topic_name = 'liam_ArticleCreated'
58
70
  Liam::Producer.message(topic: topic_name, message: message)
59
71
  ```
60
72
 
73
+ Now we have to define what `liam_ArticleCreated` means in terms of SNS. For this, we need to go to the `config/liam.yaml` file that was automatically generated by this gem and add this new event:
74
+
75
+ ```yaml
76
+ ...
77
+ events:
78
+ liam_ArticleCreated: "arn:aws:sns:us-east-1:xxxxxxxx:liam_ArticleCreated"
79
+ ```
80
+
81
+ Of course, you need to create the topic called `liam_ArticleCreated` (and make sure that you have access to publish messages there from your Service A).
82
+
61
83
  ### The Consumer (Service B)
62
84
  In the oher hand you will have to create a method in Service B that will consume the message received from Service A. At this point Class names is very important.
63
85
 
@@ -90,10 +112,16 @@ And that's it!
90
112
 
91
113
  ## Testing
92
114
 
115
+ You can use the docker-compose.localstack.yml file to leave localstack running if you don't have it installed:
116
+
117
+ ```bash
118
+ $ docker-compose -f docker-compose.localstack.yml up -d
119
+ ```
120
+
93
121
  Before running the test suite you must create the topic we use to test the gem functionality:
94
122
 
95
123
  ```bash
96
- $ aws --endpoint-url=http://localhost:4575 sns create-topic --name liam_TestProducer
124
+ $ aws --endpoint-url=http://localhost:4566 sns create-topic --name liam_TestProducer
97
125
  ```
98
126
 
99
127
  This is mandatory, otherwise you're going to receive an `Aws::SNS::Errors::NotFound: Topic does not exist` exception.
@@ -4,7 +4,7 @@ services:
4
4
  localstack:
5
5
  image: localstack/localstack
6
6
  ports:
7
- - "4567-4597:4567-4597"
7
+ - "4566:4566"
8
8
  environment:
9
9
  - SERVICES=sqs,sns
10
10
  - DOCKER_HOST=unix:///var/run/docker.sock
@@ -1,4 +1,5 @@
1
1
  default: &default
2
+ skip: false
2
3
  aws:
3
4
  region:
4
5
  access_key_id:
@@ -13,3 +14,6 @@ default: &default
13
14
  development: *default
14
15
  test: *default
15
16
  production: *default
17
+ staging:
18
+ <<: *default
19
+ skip: true
data/lib/liam.rb CHANGED
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
-
3
- require 'liam/version'
4
- require 'liam/consumer'
5
- require 'liam/processor'
6
- require 'liam/producer'
7
- require 'liam/exceptions/uninitialized_message_processor_error'
8
- require 'liam/exceptions/no_topics_in_config_file_error'
9
- require 'liam/exceptions/unexpected_message_error'
2
+ Dir["lib/liam/exceptions/*.rb"].each {|file| load file }
10
3
 
11
4
  module Liam
5
+ autoload :Consumer, 'liam/consumer'
6
+ autoload :Processor, 'liam/processor'
7
+ autoload :Producer, 'liam/producer'
8
+ autoload :VERSION, 'liam/version'
9
+
12
10
  class << self
13
11
  attr_writer :logger
14
12
 
data/lib/liam/common.rb CHANGED
@@ -16,9 +16,7 @@ module Liam
16
16
  end
17
17
 
18
18
  def env_credentials
19
- return @env_credentials if defined?(@env_credentials)
20
-
21
- @env_credentials = credentials[ENV['RAILS_ENV']]
19
+ @env_credentials ||= credentials[ENV['RAILS_ENV']]
22
20
  end
23
21
 
24
22
  def credentials
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Liam
4
+ class NoConfigForEnvError < StandardError
5
+ def initialize
6
+ super('No configuration was found for the environment in the Liam configuration file.')
7
+ end
8
+ end
9
+ end
data/lib/liam/producer.rb CHANGED
@@ -2,26 +2,29 @@
2
2
 
3
3
  require 'aws-sdk-sns'
4
4
  require 'forwardable'
5
+ require 'liam/common'
5
6
 
6
7
  module Liam
7
8
  class Producer
8
9
  DEFAULT_SUBJECT = 'liam message'
9
10
  UNSUPPORTED_MESSAGE_ERROR = 'Unsupported message argument'
10
11
  UNSUPPORTED_TOPIC_ERROR = 'Unsupported topic argument'
12
+ SKIPPED_MESSAGE = 'The message was skipped by the configuration of the environment'
13
+
11
14
  private_constant :DEFAULT_SUBJECT
12
15
 
13
16
  include Common
14
17
 
15
18
  extend Forwardable
16
19
 
17
- def initialize(message:, options: {}, topic:)
20
+ def initialize(message:, topic:, options: {})
18
21
  @message = message
19
- @options = options
20
22
  @topic = topic
23
+ @options = options
21
24
  end
22
25
 
23
- def self.message(*args)
24
- new(*args).send(:execute)
26
+ def self.message(**args)
27
+ new(**args).send(:execute)
25
28
  end
26
29
 
27
30
  private
@@ -31,6 +34,8 @@ module Liam
31
34
  attr_reader :topic, :message, :options
32
35
 
33
36
  def execute
37
+ raise NoConfigForEnvError unless valid_config?
38
+ return SKIPPED_MESSAGE if skipped?
34
39
  return UNSUPPORTED_TOPIC_ERROR unless supported_topic?
35
40
  return UNSUPPORTED_MESSAGE_ERROR unless message.is_a?(Hash)
36
41
 
@@ -57,10 +62,16 @@ module Liam
57
62
  topics[topic]
58
63
  end
59
64
 
60
- def topics
61
- return @topics if defined?(@topics)
65
+ def valid_config?
66
+ env_credentials && !env_credentials.empty?
67
+ end
68
+
69
+ def skipped?
70
+ !!env_credentials['skip']
71
+ end
62
72
 
63
- @topics = env_credentials['events']
73
+ def topics
74
+ @topics ||= env_credentials['events']
64
75
  end
65
76
  end
66
77
  end
data/lib/liam/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Liam
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-liam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - alexismansilla
8
8
  - sebastian-palma
9
9
  - luctus
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-05-06 00:00:00.000000000 Z
13
+ date: 2021-04-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws-sdk-sns
@@ -127,14 +127,13 @@ files:
127
127
  - bin/setup
128
128
  - docker-compose.localstack.yml
129
129
  - liam.gemspec
130
- - lib/.DS_Store
131
130
  - lib/generators/liam/install_generator.rb
132
131
  - lib/generators/liam/templates/liam.rake
133
132
  - lib/generators/liam/templates/liam.yml
134
133
  - lib/liam.rb
135
- - lib/liam/.DS_Store
136
134
  - lib/liam/common.rb
137
135
  - lib/liam/consumer.rb
136
+ - lib/liam/exceptions/no_config_for_env_error.rb
138
137
  - lib/liam/exceptions/no_topics_in_config_file_error.rb
139
138
  - lib/liam/exceptions/unexpected_message_error.rb
140
139
  - lib/liam/exceptions/uninitialized_message_processor_error.rb
@@ -146,7 +145,7 @@ homepage: http://github.com/archdaily/aws-liam
146
145
  licenses:
147
146
  - MIT
148
147
  metadata: {}
149
- post_install_message:
148
+ post_install_message:
150
149
  rdoc_options: []
151
150
  require_paths:
152
151
  - lib
@@ -161,8 +160,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
160
  - !ruby/object:Gem::Version
162
161
  version: '0'
163
162
  requirements: []
164
- rubygems_version: 3.1.2
165
- signing_key:
163
+ rubygems_version: 3.2.15
164
+ signing_key:
166
165
  specification_version: 4
167
166
  summary: AWS SQS+SNS middleware integration between Ruby microservices
168
167
  test_files: []
data/lib/.DS_Store DELETED
Binary file
data/lib/liam/.DS_Store DELETED
Binary file