jets 1.7.1 → 1.7.2

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: 942f8fc372f792fb74d2f82f89e5744215231f22c9efece5fe10a39aac902ac6
4
- data.tar.gz: 949a6e399d24b1bf799338b79c7780b9f980eeef523a2d229fb18a5a955cc8f9
3
+ metadata.gz: 3d4b8b6547644c895f4b9f86ea9c58d1732f89bd68cc3f71a73cf4d2a6733eb0
4
+ data.tar.gz: e6447ef5b8099c9c405be40315cf9aa2dc711958158a79a86f578c1f0258117d
5
5
  SHA512:
6
- metadata.gz: 46dd773229c40a4721f6a39adcc0331781070ad0e1c99f73ce95f44d99f75e4890b5e895162e5b2161439e60704cde6ce01a8c06d636faf52c297ce968a0267e
7
- data.tar.gz: a3704b48c2d4b2377ff182626a326503313c2bca027dc61be2f4a92b565a2343f419c9838f85a8fea0f257900bc1fb7a5f5462cb80454a5705f793f20b3db2e8
6
+ metadata.gz: 5a90c4010311c435bc32714738dd83ece60822a8c34cb9d848c198bd0d8d9518129a764c5edf3ea873747f3ff38d3630ec991a907f5afd9acf6befabada4fd58
7
+ data.tar.gz: b2013f481f5be249ee7798bb746306d25e52ff9f1515020b28c3e7e7583511ea3796666734a202c3514235d0d6816ce28e677ef397238c88531a44116f0cbbb7
data/.circleci/config.yml CHANGED
@@ -28,7 +28,7 @@ jobs:
28
28
  # Download and cache dependencies
29
29
  - restore_cache:
30
30
  keys:
31
- - v2-dependencies-{{ checksum "Gemfile.lock" }}
31
+ - v2-dependencies-{{ checksum "jets.gemspec" }}
32
32
  # fallback to using the latest cache if no exact match is found
33
33
  - v2-dependencies-
34
34
 
@@ -40,7 +40,7 @@ jobs:
40
40
  - save_cache:
41
41
  paths:
42
42
  - ./vendor/bundle
43
- key: v2-dependencies-{{ checksum "Gemfile.lock" }}
43
+ key: v2-dependencies-{{ checksum "jets.gemspec" }}
44
44
 
45
45
  # Database setup
46
46
  # - run: bundle exec rake db:create
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ spec/fixtures/project/handlers
20
20
  demo*
21
21
  /html
22
22
  spec/fixtures/apps/franky/dynamodb/migrate
23
+ Gemfile.lock
data/CHANGELOG.md CHANGED
@@ -3,6 +3,11 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [1.7.2]
7
+ - #189: spec_helpers: `get` request now converts dangling params to query params. `query` keyword can be used to do the same thing explicitly.
8
+ - #190 SNS Event Lambda Trigger Support
9
+ - Start rack server on 127.0.0.1 for mega mode
10
+
6
11
  ## [1.7.1]
7
12
  - fix Turbines with no initializer blocks
8
13
 
data/lib/jets/job/dsl.rb CHANGED
@@ -8,11 +8,15 @@
8
8
  #
9
9
  module Jets::Job::Dsl
10
10
  extend ActiveSupport::Concern
11
- autoload :EventSourceMapping, "jets/job/dsl/event_source_mapping"
11
+ autoload :EventSourceMapping, "jets/job/dsl/event_source_mapping" # base for sqs_event, etc
12
+ autoload :SnsEvent, "jets/job/dsl/sns_event"
13
+ autoload :SqsEvent, "jets/job/dsl/sqs_event"
12
14
 
13
15
  included do
14
16
  class << self
15
17
  include EventSourceMapping
18
+ include SnsEvent
19
+ include SqsEvent
16
20
 
17
21
  # Public: Creates CloudWatch Event Rule
18
22
  #
@@ -41,30 +45,27 @@ module Jets::Job::Dsl
41
45
  end
42
46
 
43
47
  def schedule_job(expression, props={})
44
- @associated_properties = nil # dont use any current associated_properties
45
- props = props.merge(schedule_expression: expression)
46
- associated_properties(props)
47
- # Eager define resource
48
- resource(events_rule_definition) # add associated resources immediately
49
- @associated_properties = nil # reset for next definition, since we're defining eagerly
48
+ with_fresh_properties(multiple_resources: false) do
49
+ props = props.merge(schedule_expression: expression)
50
+ associated_properties(props)
51
+ resource(events_rule_definition) # add associated resource immediately
52
+ end
50
53
  end
51
54
 
52
55
  def event_pattern(details={}, props={})
53
- @associated_properties = nil # dont use any current associated_properties
54
- props = props.merge(event_pattern: details)
55
- associated_properties(props)
56
- # Eager define resource
57
- resource(events_rule_definition) # add associated resources immediately
58
- @associated_properties = nil # reset for next definition, since we're defining eagerly
56
+ with_fresh_properties(multiple_resources: false) do
57
+ props = props.merge(event_pattern: details)
58
+ associated_properties(props)
59
+ resource(events_rule_definition) # add associated resource immediately
60
+ end
59
61
  add_descriptions # useful: generic description in the Event Rule console
60
62
  end
61
63
 
62
64
  def events_rule(props={})
63
- @associated_properties = nil # dont use any current associated_properties
64
- associated_properties(props)
65
- # Eager define resource
66
- resource(events_rule_definition) # add associated resources immediately
67
- @associated_properties = nil # reset for next definition, since we're defining eagerly
65
+ with_fresh_properties(multiple_resources: false) do
66
+ associated_properties(props)
67
+ resource(events_rule_definition) # add associated resource immediately
68
+ end
68
69
  end
69
70
 
70
71
  # Works with eager definitions
@@ -1,66 +1,11 @@
1
+ # SqsEvent uses this module
1
2
  module Jets::Job::Dsl
2
3
  module EventSourceMapping
3
- def declare_queue(props)
4
- props ||= {} # since options.delete(:queue_properties) can be nil
5
- r = Jets::Resource::Sqs::Queue.new(props)
6
- with_resource_options(fresh_properties: true, multiple: true) do
7
- resource(r.definition) # add associated resources immediately
8
- end
9
- end
10
-
11
4
  def event_source_mapping(props={})
12
5
  r = Jets::Resource::Lambda::EventSourceMapping.new(props)
13
- with_resource_options(fresh_properties: true, multiple: true) do
14
- resource(r.definition) # add associated resources immediately
15
- end
16
- end
17
-
18
- def sqs_event(queue_name, options={})
19
- if queue_name == :generate_queue
20
- queue_arn = "!GetAtt {namespace}SqsQueue.Arn"
21
- default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
22
- declare_queue(options.delete(:queue_properties)) # delete to avoid using them for event_source_mapping
23
- elsif queue_name.include?('!Ref') # reference shared resource
24
- queue_arn = queue_name
25
- default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
26
- else # short-handle existing queue or full queue arn
27
- queue_arn = full_queue_arn(queue_name)
28
- default_iam_policy = default_sqs_iam_policy(queue_arn)
6
+ with_fresh_properties do
7
+ resource(r.definition) # add associated resource immediately
29
8
  end
30
-
31
- # Create iam policy allows access to queue
32
- # Allow disabling in case use wants to add permission application-wide and not have extra IAM policy
33
- iam_policy_props = options.delete(:iam_policy) || @iam_policy || default_iam_policy
34
- iam_policy(iam_policy_props) unless iam_policy_props == :disable
35
-
36
- props = options # by this time options only has EventSourceMapping properties
37
- default = {
38
- event_source_arn: queue_arn
39
- }
40
- props = default.merge(props)
41
-
42
- event_source_mapping(props)
43
- end
44
-
45
- # Expands simple queue name to full arn. Example:
46
- #
47
- # hello-queue
48
- # To:
49
- # arn:aws:sqs:us-west-2:112233445566:hello-queue
50
- def full_queue_arn(queue_name)
51
- return queue_name if queue_name.include?("arn:aws:sqs")
52
-
53
- "arn:aws:sqs:#{Jets.aws.region}:#{Jets.aws.account}:#{queue_name}"
54
- end
55
-
56
- def default_sqs_iam_policy(queue_name_arn='*')
57
- {
58
- action: ["sqs:ReceiveMessage",
59
- "sqs:DeleteMessage",
60
- "sqs:GetQueueAttributes"],
61
- effect: "Allow",
62
- resource: queue_name_arn,
63
- }
64
9
  end
65
10
  end
66
11
  end
@@ -0,0 +1,46 @@
1
+ module Jets::Job::Dsl
2
+ module SnsEvent
3
+ def sns_event(topic_name, props={})
4
+ if topic_name.to_s =~ /generate/
5
+ declare_sns_topic(props.delete(:topic_properties))
6
+ topic_arn = "!Ref {namespace}SnsTopic"
7
+ props.merge!(topic_arn: topic_arn)
8
+ declare_sns_subscription(props)
9
+ elsif topic_name.include?('!Ref') # reference shared resource
10
+ topic_arn = topic_name # contains !Ref
11
+ props.merge!(topic_arn: topic_arn)
12
+ declare_sns_subscription(props)
13
+ else # existing topic: short name or full arn
14
+ topic_arn = full_sns_topic_arn(topic_name)
15
+ props.merge!(topic_arn: topic_arn)
16
+ declare_sns_subscription(props)
17
+ end
18
+ end
19
+
20
+ def declare_sns_topic(props={})
21
+ props ||= {} # props.delete(:topic_properties) can be nil
22
+ r = Jets::Resource::Sns::Topic.new(props)
23
+ with_fresh_properties do
24
+ resource(r.definition) # add associated resource immediately
25
+ end
26
+ end
27
+
28
+ def declare_sns_subscription(props={})
29
+ r = Jets::Resource::Sns::Subscription.new(props)
30
+ with_fresh_properties do
31
+ resource(r.definition) # add associated resource immediately
32
+ end
33
+ end
34
+
35
+ # Expands simple topic name to full arn. Example:
36
+ #
37
+ # hello-topic
38
+ # To:
39
+ # arn:aws:sns:us-west-2:112233445566:hello-topic
40
+ def full_sns_topic_arn(topic_name)
41
+ return topic_name if topic_name.include?("arn:aws:sns")
42
+
43
+ "arn:aws:sns:#{Jets.aws.region}:#{Jets.aws.account}:#{topic_name}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,96 @@
1
+ # ## Event Source Mapping
2
+ #
3
+ # Underneath the hood, the `sqs_event` method sets up a [Lambda::EventSourceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html). So:
4
+ #
5
+ # ```ruby
6
+ # class HardJob
7
+ # class_timeout 30 # must be less than or equal to the SQS queue default timeout
8
+ #
9
+ # sqs_event "hello-queue"
10
+ # def dig
11
+ # puts "dig event #{JSON.dump(event)}"
12
+ # end
13
+ # end
14
+ # ```
15
+ #
16
+ # Cloud also be written with something like this:
17
+ #
18
+ # ```ruby
19
+ # class HardJob
20
+ # class_timeout 30 # must be less than or equal to the SQS queue default timeout
21
+ #
22
+ # event_source_mapping(
23
+ # event_source_arn: "arn:aws:sqs:us-west-2:112233445566:hello-queue",
24
+ # )
25
+ # iam_policy(
26
+ # action: ["sqs:ReceiveMessage",
27
+ # "sqs:DeleteMessage",
28
+ # "sqs:GetQueueAttributes"],
29
+ # effect: "Allow",
30
+ # resource: "arn:aws:sqs:us-west-2:112233445566:hello-queue",
31
+ # )
32
+ # def dig
33
+ # puts "dig event #{JSON.dump(event)}"
34
+ # end
35
+ # end
36
+ # ```
37
+ #
38
+ module Jets::Job::Dsl
39
+ module SqsEvent
40
+ def sqs_event(queue_name, options={})
41
+ if queue_name.to_s =~ /generate/
42
+ queue_arn = "!GetAtt {namespace}SqsQueue.Arn"
43
+ default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
44
+ declare_sqs_queue(options.delete(:queue_properties)) # delete to avoid using them for event_source_mapping
45
+ elsif queue_name.include?('!Ref') # reference shared resource
46
+ queue_arn = queue_name
47
+ default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
48
+ else # existing queue: short name or full arn
49
+ queue_arn = full_sqs_queue_arn(queue_name)
50
+ default_iam_policy = default_sqs_iam_policy(queue_arn)
51
+ end
52
+
53
+ # Create iam policy allows access to queue
54
+ # Allow disabling in case use wants to add permission application-wide and not have extra IAM policy
55
+ iam_policy_props = options.delete(:iam_policy) || @iam_policy || default_iam_policy
56
+ iam_policy(iam_policy_props) unless iam_policy_props == :disable
57
+
58
+ props = options # by this time options only has EventSourceMapping properties
59
+ default = {
60
+ event_source_arn: queue_arn
61
+ }
62
+ props = default.merge(props)
63
+
64
+ event_source_mapping(props)
65
+ end
66
+
67
+ def declare_sqs_queue(props)
68
+ props ||= {} # since options.delete(:queue_properties) can be nil
69
+ r = Jets::Resource::Sqs::Queue.new(props)
70
+ with_fresh_properties do
71
+ resource(r.definition) # add associated resource immediately
72
+ end
73
+ end
74
+
75
+ # Expands simple queue name to full arn. Example:
76
+ #
77
+ # hello-queue
78
+ # To:
79
+ # arn:aws:sqs:us-west-2:112233445566:hello-queue
80
+ def full_sqs_queue_arn(queue_name)
81
+ return queue_name if queue_name.include?("arn:aws:sqs")
82
+
83
+ "arn:aws:sqs:#{Jets.aws.region}:#{Jets.aws.account}:#{queue_name}"
84
+ end
85
+
86
+ def default_sqs_iam_policy(queue_name_arn='*')
87
+ {
88
+ action: ["sqs:ReceiveMessage",
89
+ "sqs:DeleteMessage",
90
+ "sqs:GetQueueAttributes"],
91
+ effect: "Allow",
92
+ resource: queue_name_arn,
93
+ }
94
+ end
95
+ end
96
+ end
@@ -155,7 +155,7 @@ module Jets::Lambda::Dsl
155
155
  # interfere with being able to pass in any keys for the properties hash at the end.
156
156
  #
157
157
  # TODO: If there's a cleaner way of doing this, let me know.
158
- def with_resource_options(fresh_properties: false, multiple_resources: false)
158
+ def with_fresh_properties(fresh_properties: true, multiple_resources: true)
159
159
  @associated_properties = nil if fresh_properties # dont use any current associated_properties
160
160
  @multiple_resources = multiple_resources
161
161
 
@@ -36,8 +36,14 @@ module Jets
36
36
  # down to the sub bin/rackup command cleans up the child process fine.
37
37
  Bundler.with_clean_env do
38
38
  args = ''
39
- args << " --host #{@options[:host]}" if @options[:host] # only forward the host option
40
- # port is always 9292 for simplicity
39
+ # only forward the host option, port is always 9292 for simplicity
40
+ if @options[:host]
41
+ args << " --host #{@options[:host]}"
42
+ else
43
+ args << " --host 127.0.0.1" # using the default localhost is not starting up https://stackoverflow.com/questions/4356646/address-family-not-supported-by-protocol-family
44
+ end
45
+
46
+
41
47
  command = "cd #{rack_project} && bin/rackup#{args}" # leads to the same wrapper rack scripts
42
48
  puts "=> #{command}".color(:green)
43
49
  system(command)
@@ -1,3 +1,4 @@
1
1
  module Jets::Resource::Sns
2
2
  autoload :Topic, 'jets/resource/sns/topic'
3
+ autoload :Subscription, 'jets/resource/sns/subscription'
3
4
  end
@@ -0,0 +1,29 @@
1
+ # CloudFormation SNS Subscription docs: https://amzn.to/2SJtN3C
2
+ module Jets::Resource::Sns
3
+ class Subscription < Jets::Resource::Base
4
+ def initialize(props)
5
+ @props = props # associated_properties from dsl.rb
6
+ end
7
+
8
+ def definition
9
+ {
10
+ subscription_logical_id => {
11
+ type: "AWS::SNS::Subscription",
12
+ properties: merged_properties,
13
+ }
14
+ }
15
+ end
16
+
17
+ # Do not name this method properties, that is a computed method of `Jets::Resource::Base`
18
+ def merged_properties
19
+ {
20
+ endpoint: "!GetAtt {namespace}LambdaFunction.Arn",
21
+ protocol: "lambda",
22
+ }.deep_merge(@props)
23
+ end
24
+
25
+ def subscription_logical_id
26
+ "{namespace}_sns_subscription"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ # CloudFormation SNS Topic docs: https://amzn.to/2MYbUZc
2
+ module Jets::Resource::Sns
3
+ class Topic < Jets::Resource::Base
4
+ def initialize(props)
5
+ @props = props # associated_properties from dsl.rb
6
+ end
7
+
8
+ def definition
9
+ {
10
+ topic_logical_id => {
11
+ type: "AWS::SNS::Topic",
12
+ properties: merged_properties,
13
+ }
14
+ }
15
+ end
16
+
17
+ # Do not name this method properties, that is a computed method of `Jets::Resource::Base`
18
+ def merged_properties
19
+ display_name = "{namespace} Topic"[0..99] # limit is 100 chars
20
+ {
21
+ display_name: display_name,
22
+ # Not setting subscription this way but instead with a SNS::Subscription resource so the interface
23
+ # is consistent. Leaving comment in here to remind me and in case decide to change this.
24
+ # subscription: [
25
+ # endpoint: "!GetAtt {namespace}LambdaFunction.Arn",
26
+ # protocol: "lambda"
27
+ # ]
28
+ }.deep_merge(@props)
29
+ end
30
+
31
+ def topic_logical_id
32
+ "{namespace}_sns_topic"
33
+ end
34
+ end
35
+ end
@@ -32,6 +32,11 @@ module Jets
32
32
  request.headers.deep_merge!(params.delete(:headers) || {})
33
33
 
34
34
  request.params.body_params = params.delete(:params) || params || {}
35
+
36
+ request.params.query_params = params.delete(:query)
37
+ request.params.query_params ||= params if request.method == :get
38
+ request.params.query_params ||= {}
39
+
35
40
  request.params.path_params = params
36
41
 
37
42
  @response = request.dispatch!
@@ -1,9 +1,9 @@
1
1
  module Jets
2
2
  module SpecHelpers
3
3
  class Params
4
- attr_accessor :path_params, :body_params
5
- def initialize(path_params={}, body_params={})
6
- @path_params, @body_params = path_params, body_params
4
+ attr_accessor :path_params, :body_params, :query_params
5
+ def initialize(path_params={}, body_params={}, query_params={})
6
+ @path_params, @body_params, @query_params = path_params, body_params, query_params
7
7
  end
8
8
  end
9
9
  end
@@ -41,6 +41,12 @@ module Jets
41
41
  json['isBase64Encoded'] = true
42
42
  end
43
43
 
44
+ params.query_params.to_a.each do |e|
45
+ key, value = e
46
+ json['queryStringParameters'] ||= {}
47
+ json['queryStringParameters'][key.to_s] = value.to_s
48
+ end
49
+
44
50
  json
45
51
  end
46
52
 
@@ -2,7 +2,7 @@ module Jets::Stack::Main::Dsl
2
2
  module Sns
3
3
  def sns_topic(id, props={})
4
4
  resource(id, "AWS::SNS::Topic", props)
5
- output(id)
5
+ output(id) # Topic Arn
6
6
  end
7
7
 
8
8
  def sns_subscription(id, props={})
data/lib/jets/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "1.7.1"
2
+ VERSION = "1.7.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 1.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-08 00:00:00.000000000 Z
11
+ date: 2019-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -438,7 +438,6 @@ files:
438
438
  - Dockerfile
439
439
  - Dockerfile.base
440
440
  - Gemfile
441
- - Gemfile.lock
442
441
  - Guardfile
443
442
  - LICENSE.txt
444
443
  - Procfile
@@ -653,6 +652,8 @@ files:
653
652
  - lib/jets/job/base.rb
654
653
  - lib/jets/job/dsl.rb
655
654
  - lib/jets/job/dsl/event_source_mapping.rb
655
+ - lib/jets/job/dsl/sns_event.rb
656
+ - lib/jets/job/dsl/sqs_event.rb
656
657
  - lib/jets/klass.rb
657
658
  - lib/jets/lambda.rb
658
659
  - lib/jets/lambda/dsl.rb
@@ -744,6 +745,8 @@ files:
744
745
  - lib/jets/resource/route53/record_set.rb
745
746
  - lib/jets/resource/s3.rb
746
747
  - lib/jets/resource/sns.rb
748
+ - lib/jets/resource/sns/subscription.rb
749
+ - lib/jets/resource/sns/topic.rb
747
750
  - lib/jets/resource/sqs.rb
748
751
  - lib/jets/resource/sqs/queue.rb
749
752
  - lib/jets/resource/standardizer.rb
data/Gemfile.lock DELETED
@@ -1,190 +0,0 @@
1
- GIT
2
- remote: https://github.com/tongueroo/webpacker.git
3
- revision: 3651cc317358018ebd16de75df3b8184adf1b818
4
- branch: jets
5
- specs:
6
- webpacker (3.2.0)
7
- activesupport (>= 4.2)
8
- rack-proxy (>= 0.6.1)
9
- railties (>= 4.2)
10
-
11
- PATH
12
- remote: .
13
- specs:
14
- jets (1.7.1)
15
- activerecord (~> 5.2.1)
16
- activesupport (~> 5.2.1)
17
- aws-sdk-apigateway
18
- aws-sdk-cloudformation
19
- aws-sdk-cloudwatchlogs
20
- aws-sdk-dynamodb
21
- aws-sdk-lambda
22
- aws-sdk-s3
23
- aws-sdk-sns
24
- aws-sdk-sqs
25
- dotenv
26
- gems
27
- hashie
28
- jets-html-sanitizer
29
- json
30
- kramdown
31
- memoist
32
- mimemagic
33
- rack
34
- railties (~> 5.2.1)
35
- rainbow
36
- recursive-open-struct
37
- text-table
38
- thor
39
-
40
- GEM
41
- remote: https://rubygems.org/
42
- specs:
43
- actionpack (5.2.2)
44
- actionview (= 5.2.2)
45
- activesupport (= 5.2.2)
46
- rack (~> 2.0)
47
- rack-test (>= 0.6.3)
48
- rails-dom-testing (~> 2.0)
49
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
50
- actionview (5.2.2)
51
- activesupport (= 5.2.2)
52
- builder (~> 3.1)
53
- erubi (~> 1.4)
54
- rails-dom-testing (~> 2.0)
55
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
56
- activemodel (5.2.2)
57
- activesupport (= 5.2.2)
58
- activerecord (5.2.2)
59
- activemodel (= 5.2.2)
60
- activesupport (= 5.2.2)
61
- arel (>= 9.0)
62
- activesupport (5.2.2)
63
- concurrent-ruby (~> 1.0, >= 1.0.2)
64
- i18n (>= 0.7, < 2)
65
- minitest (~> 5.1)
66
- tzinfo (~> 1.1)
67
- arel (9.0.0)
68
- aws-eventstream (1.0.1)
69
- aws-partitions (1.136.0)
70
- aws-sdk-apigateway (1.23.0)
71
- aws-sdk-core (~> 3, >= 3.39.0)
72
- aws-sigv4 (~> 1.0)
73
- aws-sdk-cloudformation (1.14.0)
74
- aws-sdk-core (~> 3, >= 3.39.0)
75
- aws-sigv4 (~> 1.0)
76
- aws-sdk-cloudwatchlogs (1.13.0)
77
- aws-sdk-core (~> 3, >= 3.39.0)
78
- aws-sigv4 (~> 1.0)
79
- aws-sdk-core (3.46.0)
80
- aws-eventstream (~> 1.0)
81
- aws-partitions (~> 1.0)
82
- aws-sigv4 (~> 1.0)
83
- jmespath (~> 1.0)
84
- aws-sdk-dynamodb (1.20.0)
85
- aws-sdk-core (~> 3, >= 3.39.0)
86
- aws-sigv4 (~> 1.0)
87
- aws-sdk-kms (1.13.0)
88
- aws-sdk-core (~> 3, >= 3.39.0)
89
- aws-sigv4 (~> 1.0)
90
- aws-sdk-lambda (1.17.0)
91
- aws-sdk-core (~> 3, >= 3.39.0)
92
- aws-sigv4 (~> 1.0)
93
- aws-sdk-s3 (1.30.1)
94
- aws-sdk-core (~> 3, >= 3.39.0)
95
- aws-sdk-kms (~> 1)
96
- aws-sigv4 (~> 1.0)
97
- aws-sdk-sns (1.9.0)
98
- aws-sdk-core (~> 3, >= 3.39.0)
99
- aws-sigv4 (~> 1.0)
100
- aws-sdk-sqs (1.10.0)
101
- aws-sdk-core (~> 3, >= 3.39.0)
102
- aws-sigv4 (~> 1.0)
103
- aws-sigv4 (1.0.3)
104
- builder (3.2.3)
105
- byebug (10.0.2)
106
- concurrent-ruby (1.1.4)
107
- crass (1.0.4)
108
- diff-lcs (1.3)
109
- dotenv (2.6.0)
110
- dynomite (1.2.2)
111
- activesupport
112
- aws-sdk-dynamodb
113
- erubi (1.8.0)
114
- gems (1.1.1)
115
- json
116
- hashie (3.6.0)
117
- i18n (1.5.3)
118
- concurrent-ruby (~> 1.0)
119
- jets-html-sanitizer (1.0.4)
120
- loofah (~> 2.2, >= 2.2.2)
121
- jmespath (1.4.0)
122
- json (2.1.0)
123
- kramdown (2.1.0)
124
- loofah (2.2.3)
125
- crass (~> 1.0.2)
126
- nokogiri (>= 1.5.9)
127
- memoist (0.16.0)
128
- method_source (0.9.2)
129
- mimemagic (0.3.3)
130
- mini_portile2 (2.4.0)
131
- minitest (5.11.3)
132
- mysql2 (0.5.2)
133
- nokogiri (1.10.1)
134
- mini_portile2 (~> 2.4.0)
135
- rack (2.0.6)
136
- rack-proxy (0.6.5)
137
- rack
138
- rack-test (1.1.0)
139
- rack (>= 1.0, < 3)
140
- rails-dom-testing (2.0.3)
141
- activesupport (>= 4.2.0)
142
- nokogiri (>= 1.6)
143
- rails-html-sanitizer (1.0.4)
144
- loofah (~> 2.2, >= 2.2.2)
145
- railties (5.2.2)
146
- actionpack (= 5.2.2)
147
- activesupport (= 5.2.2)
148
- method_source
149
- rake (>= 0.8.7)
150
- thor (>= 0.19.0, < 2.0)
151
- rainbow (3.0.0)
152
- rake (12.3.2)
153
- recursive-open-struct (1.1.0)
154
- rspec (3.8.0)
155
- rspec-core (~> 3.8.0)
156
- rspec-expectations (~> 3.8.0)
157
- rspec-mocks (~> 3.8.0)
158
- rspec-core (3.8.0)
159
- rspec-support (~> 3.8.0)
160
- rspec-expectations (3.8.2)
161
- diff-lcs (>= 1.2.0, < 2.0)
162
- rspec-support (~> 3.8.0)
163
- rspec-mocks (3.8.0)
164
- diff-lcs (>= 1.2.0, < 2.0)
165
- rspec-support (~> 3.8.0)
166
- rspec-support (3.8.0)
167
- rspec_junit_formatter (0.4.1)
168
- rspec-core (>= 2, < 4, != 2.12.0)
169
- text-table (1.2.4)
170
- thor (0.20.3)
171
- thread_safe (0.3.6)
172
- tzinfo (1.2.5)
173
- thread_safe (~> 0.1)
174
-
175
- PLATFORMS
176
- ruby
177
-
178
- DEPENDENCIES
179
- bundler
180
- byebug
181
- dynomite
182
- jets!
183
- mysql2 (~> 0.5.2)
184
- rake
185
- rspec
186
- rspec_junit_formatter
187
- webpacker!
188
-
189
- BUNDLED WITH
190
- 1.17.3