active_elastic_job 1.6.1 → 3.0.0.alpha

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
- SHA1:
3
- metadata.gz: 40e70ada8de50817f51cf0b7b072c7e7db235891
4
- data.tar.gz: 90c6b139491fa78b74c21057545dac46c12cb141
2
+ SHA256:
3
+ metadata.gz: 76f95bc2f952a3d57402a5c41428e02f4662725e2c784d547c75ce8081edbf31
4
+ data.tar.gz: 495df5d131344373516e77507461861a72007387adb6dde0a5c8a0274e535bf5
5
5
  SHA512:
6
- metadata.gz: 12a17b97286370f30888de96a8b951ddb9f2b243f881849002854121740eaa3cf006baab5adbb68788e963357a6dc29e327452e69523d7f72f9312718ef55548
7
- data.tar.gz: cf321ceae15a266ca97c335ee9e3e6b993fa940294047fb0fc57b887d05253660649642fb0089d30f3a3744eefb7d2d27fc01f503fe201a18dc0dba07f14c663
6
+ metadata.gz: fb613b8ad89d5b86437bd831b28247e54c3adc54127bdb6264f5ccc0fda7d4d26ffaec5fa5e312e09d042c580e088bb74753601f3b4aa1c68d19505ac3d7f31f
7
+ data.tar.gz: 6149c28f1cce197d6722e83ca2927173133aca4b2d2afbb4803ff7b2191c3d314841c4e57c57cb3d7b1a6ea43e889e7029b09ccf5f125379d4d3f26e3340aeda
@@ -8,20 +8,31 @@ Gem::Specification.new do |spec|
8
8
  spec.platform = Gem::Platform::RUBY
9
9
  spec.name = 'active_elastic_job'
10
10
  spec.version = ActiveElasticJob.version
11
- spec.authors = ['Tawan Sierek']
12
- spec.email = ['tawan@sierek.com']
11
+ spec.authors = ['Tawan Sierek', 'Joey Paris']
12
+ spec.email = ['tawan@sierek.com', 'mail@joeyparis.me']
13
13
  spec.summary = 'Active Elastic Job is a simple to use Active Job backend for Rails applications deployed on the Amazon Elastic Beanstalk platform.'
14
14
  spec.description = 'Run background jobs / tasks of Rails applications deployed in Amazon Elastic Beanstalk environments. Active Elastic Job is an Active Job backend which is easy to setup. No need for customised container commands or other workarounds.'
15
15
  spec.license = 'MIT'
16
- spec.homepage = 'https://github.com/tawan/active-elastic-job'
16
+ spec.homepage = 'https://github.com/active-elastic-job/active-elastic-job'
17
17
 
18
18
  spec.files = Dir.glob('lib/**/*') + [ 'active-elastic-job.gemspec' ]
19
19
  spec.executables = []
20
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.required_ruby_version = '>= 1.9.3'
23
+ spec.required_ruby_version = '>= 2.5'
24
24
 
25
- spec.add_dependency 'aws-sdk', '~> 2'
26
- spec.add_dependency 'rails', '>= 4.2', '< 5.0.1'
25
+ spec.add_dependency 'aws-sdk-sqs', '~> 1'
26
+ spec.add_dependency 'rails', '>= 5.0', '<7'
27
+
28
+ spec.add_development_dependency 'benchmark-ips', '~> 2.8'
29
+ spec.add_development_dependency 'bundler', '~> 2.2'
30
+ spec.add_development_dependency 'byebug', '~> 11.1'
31
+ spec.add_development_dependency 'climate_control', '~> 0.2'
32
+ spec.add_development_dependency 'dotenv', '~> 2.7'
33
+ spec.add_development_dependency 'fuubar', '~> 2.5'
34
+ spec.add_development_dependency 'rdoc', '~> 6.3'
35
+ spec.add_development_dependency 'rspec', '~> 3.4'
36
+ spec.add_development_dependency 'sqlite3', '~> 1.4'
37
+ spec.add_development_dependency 'amazing_print', '~> 1.2'
27
38
  end
@@ -1,4 +1,4 @@
1
- require 'aws-sdk-core'
1
+ require 'aws-sdk-sqs'
2
2
  require 'active_elastic_job/version'
3
3
  require 'active_elastic_job/md5_message_digest_calculation'
4
4
  require 'active_job/queue_adapters/active_elastic_job_adapter'
@@ -5,7 +5,13 @@ module ActiveElasticJob
5
5
  # This middleware intercepts requests which are sent by the SQS daemon
6
6
  # running in {Amazon Elastic Beanstalk worker environments}[http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html].
7
7
  # It does this by looking at the +User-Agent+ header.
8
- # Furthermore, it verifies the digest which is sent along with a legit SQS
8
+ # Requesets from the SQS daemon are handled in two alternative cases:
9
+ #
10
+ # (1) the processed SQS message was originally triggered by a periodic task
11
+ # supported by Elastic Beanstalk's Periodic Task feature
12
+ #
13
+ # (2) the processed SQS message was queued by this gem representing an active job.
14
+ # In this case it verifies the digest which is sent along with a legit SQS
9
15
  # message, and passed as an HTTP header in the resulting request.
10
16
  # The digest is based on Rails' +secrets.secret_key_base+.
11
17
  # Therefore, the application running in the web environment, which generates
@@ -13,14 +19,13 @@ module ActiveElasticJob
13
19
  # environment, which verifies the digest, have to use the *same*
14
20
  # +secrets.secret_key_base+ setting.
15
21
  class SqsMessageConsumer
16
- USER_AGENT_PREFIX = 'aws-sqsd'.freeze
17
- DIGEST_HEADER_NAME = 'HTTP_X_AWS_SQSD_ATTR_MESSAGE_DIGEST'.freeze
18
- ORIGIN_HEADER_NAME = 'HTTP_X_AWS_SQSD_ATTR_ORIGIN'.freeze
19
- CONTENT_TYPE = 'application/json'.freeze
20
- CONTENT_TYPE_HEADER_NAME = 'Content-Type'.freeze
21
- OK_RESPONSE_CODE = '200'.freeze
22
- INSIDE_DOCKER_CONTAINER = `[ -f /proc/1/cgroup ] && cat /proc/1/cgroup` =~ /docker/
23
- DOCKER_HOST_IP = "172.17.0.1".freeze
22
+ OK_RESPONSE = [ '200'.freeze, { 'Content-Type'.freeze => 'text/plain'.freeze }, [ 'OK'.freeze ] ]
23
+ FORBIDDEN_RESPONSE = [
24
+ '403'.freeze,
25
+ { 'Content-Type'.freeze => 'text/plain'.freeze },
26
+ [ 'Request forbidden!'.freeze ]
27
+ ]
28
+ DOCKER_HOST_IP = /172.17.0.\d+/.freeze
24
29
 
25
30
  def initialize(app) #:nodoc:
26
31
  @app = app
@@ -28,25 +33,22 @@ module ActiveElasticJob
28
33
 
29
34
  def call(env) #:nodoc:
30
35
  request = ActionDispatch::Request.new env
31
- if enabled? && aws_sqsd?(request) && originates_from_gem?(request)
36
+ if enabled? && aws_sqsd?(request)
32
37
  unless request.local? || sent_from_docker_host?(request)
33
- m = "Accepts only requests from localhost for job processing".freeze
34
- return ['403', {CONTENT_TYPE_HEADER_NAME => 'text/plain' }, [ m ]]
38
+ return FORBIDDEN_RESPONSE
35
39
  end
36
- begin
37
- verify!(request)
38
- job = JSON.load(request.body)
39
- ActiveJob::Base.execute(job)
40
- rescue ActiveElasticJob::MessageVerifier::InvalidDigest => e
41
- return [
42
- '403',
43
- {CONTENT_TYPE_HEADER_NAME => 'text/plain' },
44
- ["incorrect digest"]]
40
+
41
+ if periodic_task?(request)
42
+ execute_periodic_task(request)
43
+ return OK_RESPONSE
44
+ elsif originates_from_gem?(request)
45
+ begin
46
+ execute_job(request)
47
+ rescue ActiveElasticJob::MessageVerifier::InvalidDigest => e
48
+ return FORBIDDEN_RESPONSE
49
+ end
50
+ return OK_RESPONSE
45
51
  end
46
- return [
47
- OK_RESPONSE_CODE ,
48
- {CONTENT_TYPE_HEADER_NAME => CONTENT_TYPE },
49
- [ '' ]]
50
52
  end
51
53
  @app.call(env)
52
54
  end
@@ -54,35 +56,61 @@ module ActiveElasticJob
54
56
  private
55
57
 
56
58
  def enabled?
57
- var = ENV['DISABLE_SQS_CONSUMER'.freeze]
58
- var == nil || var == 'false'.freeze
59
+ Rails.application.config.active_elastic_job.process_jobs == true
59
60
  end
60
61
 
61
62
  def verify!(request)
62
- secret_key_base = Rails.application.secrets[:secret_key_base]
63
63
  @verifier ||= ActiveElasticJob::MessageVerifier.new(secret_key_base)
64
- digest = request.headers[DIGEST_HEADER_NAME]
64
+ digest = request.headers['HTTP_X_AWS_SQSD_ATTR_MESSAGE_DIGEST'.freeze]
65
65
  message = request.body_stream.read
66
66
  request.body_stream.rewind
67
67
  @verifier.verify!(message, digest)
68
68
  end
69
69
 
70
+ def secret_key_base
71
+ config.secret_key_base
72
+ end
73
+
74
+ def config
75
+ Rails.application.config.active_elastic_job
76
+ end
77
+
70
78
  def aws_sqsd?(request)
71
- # we do not match against a Regexp
79
+ # Does not match against a Regexp
72
80
  # in order to avoid performance penalties.
73
- # Instead we make a simple string comparison.
81
+ # Instead performs a simple string comparison.
74
82
  # Benchmark runs showed an performance increase of
75
83
  # up to 40%
76
84
  current_user_agent = request.headers['User-Agent'.freeze]
77
85
  return (current_user_agent.present? &&
78
- current_user_agent.size >= USER_AGENT_PREFIX.size &&
79
- current_user_agent[0..(USER_AGENT_PREFIX.size - 1)] == USER_AGENT_PREFIX)
86
+ current_user_agent.size >= 'aws-sqsd'.freeze.size &&
87
+ current_user_agent[0..('aws-sqsd'.freeze.size - 1)] == 'aws-sqsd'.freeze)
88
+ end
89
+
90
+ def periodic_tasks_route
91
+ @periodic_tasks_route ||= config.periodic_tasks_route
92
+ end
93
+
94
+ def periodic_task?(request)
95
+ !request.fullpath.nil? && request.fullpath[0..(periodic_tasks_route.size - 1)] == periodic_tasks_route
96
+ end
97
+
98
+ def execute_job(request)
99
+ verify!(request)
100
+ job = JSON.load(request.body)
101
+ ActiveJob::Base.execute(job)
102
+ end
103
+
104
+ def execute_periodic_task(request)
105
+ job_name = request.headers['X-Aws-Sqsd-Taskname']
106
+ job = job_name.constantize.new
107
+ job.perform_now
80
108
  end
81
109
 
82
110
  def originates_from_gem?(request)
83
- if request.headers[ORIGIN_HEADER_NAME] == ActiveElasticJob::ACRONYM
111
+ if request.headers['HTTP_X_AWS_SQSD_ATTR_ORIGIN'.freeze] == ActiveElasticJob::ACRONYM
84
112
  return true
85
- elsif request.headers[DIGEST_HEADER_NAME] != nil
113
+ elsif request.headers['HTTP_X_AWS_SQSD_ATTR_MESSAGE_DIGEST'.freeze] != nil
86
114
  return true
87
115
  else
88
116
  return false
@@ -90,7 +118,11 @@ module ActiveElasticJob
90
118
  end
91
119
 
92
120
  def sent_from_docker_host?(request)
93
- INSIDE_DOCKER_CONTAINER && request.remote_ip == DOCKER_HOST_IP
121
+ app_runs_in_docker_container? && request.remote_ip =~ DOCKER_HOST_IP
122
+ end
123
+
124
+ def app_runs_in_docker_container?
125
+ @app_in_docker_container ||= `[ -f /proc/1/cgroup ] && cat /proc/1/cgroup` =~ /(ecs|docker)/
94
126
  end
95
127
  end
96
128
  end
@@ -1,12 +1,23 @@
1
1
  module ActiveElasticJob
2
2
  class Railtie < Rails::Railtie
3
+ config.active_elastic_job = ActiveSupport::OrderedOptions.new
4
+ process_active_elastic_jobs = ENV['PROCESS_ACTIVE_ELASTIC_JOBS']
5
+ config.active_elastic_job.process_jobs = !process_active_elastic_jobs.nil? && process_active_elastic_jobs.downcase == 'true'
6
+ config.active_elastic_job.aws_credentials = lambda { Aws::InstanceProfileCredentials.new }
7
+ config.active_elastic_job.aws_region = ENV['AWS_REGION']
8
+ config.active_elastic_job.periodic_tasks_route = '/periodic_tasks'.freeze
9
+
3
10
  initializer "active_elastic_job.insert_middleware" do |app|
4
- disabled = ENV['DISABLE_SQS_CONSUMER']
5
- if disabled == 'false' || disabled.nil?
11
+ if app.config.active_elastic_job.secret_key_base.blank?
12
+ app.config.active_elastic_job.secret_key_base = app.secrets[:secret_key_base]
13
+ end
14
+
15
+ if app.config.active_elastic_job.process_jobs == true
16
+ app.config.active_elastic_job.aws_credentials ||= lambda { Aws::InstanceProfileCredentials.new }
6
17
  if app.config.force_ssl
7
- app.config.middleware.insert_before("ActionDispatch::SSL","ActiveElasticJob::Rack::SqsMessageConsumer")
18
+ app.config.middleware.insert_before(ActionDispatch::SSL,ActiveElasticJob::Rack::SqsMessageConsumer)
8
19
  else
9
- app.config.middleware.use("ActiveElasticJob::Rack::SqsMessageConsumer")
20
+ app.config.middleware.use(ActiveElasticJob::Rack::SqsMessageConsumer)
10
21
  end
11
22
  end
12
23
  end
@@ -1,9 +1,9 @@
1
1
  module ActiveElasticJob
2
2
  module VERSION
3
- MAJOR = 1
4
- MINOR = 6
5
- TINY = 1
6
- PRE = nil
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ TINY = 0
6
+ PRE = 'alpha'
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
9
9
 
@@ -19,12 +19,6 @@ module ActiveJob
19
19
  MAX_MESSAGE_SIZE = (256 * 1024)
20
20
  MAX_DELAY_IN_MINUTES = 15
21
21
 
22
- if Gem::Version.new(Aws::VERSION) >= Gem::Version.new('2.2.19')
23
- AWS_CLIENT_VERIFIES_MD5_DIGESTS = true
24
- else
25
- AWS_CLIENT_VERIFIES_MD5_DIGESTS = false
26
- end
27
-
28
22
  extend ActiveElasticJob::MD5MessageDigestCalculation
29
23
 
30
24
  class Error < RuntimeError; end;
@@ -33,9 +27,8 @@ module ActiveJob
33
27
  # imposed by Amazon SQS.
34
28
  class SerializedJobTooBig < Error
35
29
  def initialize(serialized_job)
36
- msg = <<-MSG
37
30
  super(<<-MSG)
38
- The job contains #{serialized_job.bytesize} bytes in its serialzed form,
31
+ The job contains #{serialized_job.bytesize} bytes in its serialized form,
39
32
  which exceeds the allowed maximum of #{MAX_MESSAGE_SIZE} bytes imposed by Amazon SQS.
40
33
  MSG
41
34
  end
@@ -56,14 +49,15 @@ module ActiveJob
56
49
  # #..
57
50
  # end
58
51
  class NonExistentQueue < Error
59
- def initialize(queue_name)
52
+ def initialize(queue_name, aws_region)
60
53
 
61
54
  super(<<-MSG)
62
55
  The job is bound to queue at #{queue_name}.
63
56
  Unfortunately a queue with this name does not exist in this
64
57
  region. Either create an Amazon SQS queue named #{queue_name} -
65
58
  you can do this in AWS console, make sure to select region
66
- '#{ENV['AWS_REGION']}' - or you select another queue for your jobs.
59
+ '#{aws_region}' - or you
60
+ select another queue for your jobs.
67
61
  MSG
68
62
  end
69
63
  end
@@ -82,12 +76,24 @@ module ActiveJob
82
76
  end
83
77
  end
84
78
 
79
+ # Raised when the delay is longer than the MAX_DELAY_IN_MINUTES
80
+ class DelayTooLong < RangeError
81
+ def initialize()
82
+ super(<<-MSG)
83
+ Jobs cannot be scheduled more than #{MAX_DELAY_IN_MINUTES} minutes
84
+ into the future.
85
+ See http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html
86
+ for further details!
87
+ MSG
88
+ end
89
+ end
90
+
85
91
  def enqueue(job) #:nodoc:
86
- ActiveElasticJobAdapter.enqueue job
92
+ self.class.enqueue job
87
93
  end
88
94
 
89
95
  def enqueue_at(job, timestamp) #:nodoc:
90
- ActiveElasticJobAdapter.enqueue_at(job, timestamp)
96
+ self.class.enqueue_at(job, timestamp)
91
97
  end
92
98
 
93
99
  class << self
@@ -106,12 +112,13 @@ module ActiveJob
106
112
  message[:message_body],
107
113
  message[:message_attributes])
108
114
  end
115
+ job.provider_job_id = resp.message_id
109
116
  rescue Aws::SQS::Errors::NonExistentQueue => e
110
117
  unless @queue_urls[job.queue_name.to_s].nil?
111
118
  @queue_urls[job.queue_name.to_s] = nil
112
119
  retry
113
120
  end
114
- raise NonExistentQueue, job
121
+ raise NonExistentQueue.new(job, aws_region)
115
122
  rescue Aws::Errors::ServiceError => e
116
123
  raise Error, "Could not enqueue job, #{e.message}"
117
124
  end
@@ -119,7 +126,7 @@ module ActiveJob
119
126
  private
120
127
 
121
128
  def aws_client_verifies_md5_digests?
122
- return AWS_CLIENT_VERIFIES_MD5_DIGESTS
129
+ Gem::Version.new(Aws::CORE_GEM_VERSION) >= Gem::Version.new('2.2.19'.freeze)
123
130
  end
124
131
 
125
132
  def build_message(queue_name, serialized_job, timestamp)
@@ -147,18 +154,13 @@ module ActiveJob
147
154
  resp = aws_sqs_client.get_queue_url(queue_name: queue_name.to_s)
148
155
  @queue_urls[cache_key] = resp.queue_url
149
156
  rescue Aws::SQS::Errors::NonExistentQueue => e
150
- raise NonExistentQueue, queue_name
157
+ raise NonExistentQueue.new(queue_name, aws_region)
151
158
  end
152
159
 
153
160
  def calculate_delay(timestamp)
154
161
  delay = (timestamp - Time.current.to_f).to_i + 1
155
162
  if delay > MAX_DELAY_IN_MINUTES.minutes
156
- msg = "Jobs cannot be scheduled more than " <<
157
- "#{MAX_DELAY_IN_MINUTES} minutes into the future. " <<
158
- "See http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html" <<
159
- " for further details!"
160
-
161
- raise RangeError, msg
163
+ raise DelayTooLong.new
162
164
  end
163
165
  delay = 0 if delay < 0
164
166
  delay
@@ -171,12 +173,29 @@ module ActiveJob
171
173
  end
172
174
 
173
175
  def aws_sqs_client
174
- @aws_key ||= ENV['AWS_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_KEY'] || ENV['AMAZON_SECRET_ACCESS_KEY']
175
- @aws_sqs_client ||= Aws::SQS::Client.new(
176
- access_key_id: ENV['AWS_ACCESS_KEY_ID'],
177
- secret_access_key: @aws_key,
178
- region: ENV['AWS_REGION']
179
- )
176
+ options = {
177
+ credentials: aws_sqs_client_credentials,
178
+ region: aws_region
179
+ }
180
+ endpoint = Rails.application.config.active_elastic_job.endpoint
181
+ options[:endpoint] = endpoint if endpoint.present?
182
+ @aws_sqs_client ||= Aws::SQS::Client.new(options)
183
+ end
184
+
185
+ def aws_sqs_client_credentials
186
+ @aws_credentials ||= if config.aws_credentials.kind_of?(Proc)
187
+ config.aws_credentials.call
188
+ else
189
+ config.aws_credentials
190
+ end
191
+ end
192
+
193
+ def aws_region
194
+ config.aws_region
195
+ end
196
+
197
+ def config
198
+ Rails.application.config.active_elastic_job
180
199
  end
181
200
 
182
201
  def message_digest(messsage_body)
@@ -201,7 +220,7 @@ module ActiveJob
201
220
  end
202
221
 
203
222
  def secret_key_base
204
- @secret_key_base ||= Rails.application.secrets[:secret_key_base]
223
+ config.secret_key_base
205
224
  end
206
225
  end
207
226
  end
metadata CHANGED
@@ -1,54 +1,196 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_elastic_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 3.0.0.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tawan Sierek
8
+ - Joey Paris
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-05-24 00:00:00.000000000 Z
12
+ date: 2021-01-27 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: aws-sdk
15
+ name: aws-sdk-sqs
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '2'
20
+ version: '1'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '2'
27
+ version: '1'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rails
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - ">="
32
33
  - !ruby/object:Gem::Version
33
- version: '4.2'
34
+ version: '5.0'
34
35
  - - "<"
35
36
  - !ruby/object:Gem::Version
36
- version: 5.0.1
37
+ version: '7'
37
38
  type: :runtime
38
39
  prerelease: false
39
40
  version_requirements: !ruby/object:Gem::Requirement
40
41
  requirements:
41
42
  - - ">="
42
43
  - !ruby/object:Gem::Version
43
- version: '4.2'
44
+ version: '5.0'
44
45
  - - "<"
45
46
  - !ruby/object:Gem::Version
46
- version: 5.0.1
47
+ version: '7'
48
+ - !ruby/object:Gem::Dependency
49
+ name: benchmark-ips
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.8'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.8'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.2'
76
+ - !ruby/object:Gem::Dependency
77
+ name: byebug
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '11.1'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '11.1'
90
+ - !ruby/object:Gem::Dependency
91
+ name: climate_control
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.2'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.2'
104
+ - !ruby/object:Gem::Dependency
105
+ name: dotenv
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.7'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.7'
118
+ - !ruby/object:Gem::Dependency
119
+ name: fuubar
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.5'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.5'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rdoc
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '6.3'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '6.3'
146
+ - !ruby/object:Gem::Dependency
147
+ name: rspec
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.4'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.4'
160
+ - !ruby/object:Gem::Dependency
161
+ name: sqlite3
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.4'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.4'
174
+ - !ruby/object:Gem::Dependency
175
+ name: amazing_print
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.2'
181
+ type: :development
182
+ prerelease: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.2'
47
188
  description: Run background jobs / tasks of Rails applications deployed in Amazon
48
189
  Elastic Beanstalk environments. Active Elastic Job is an Active Job backend which
49
190
  is easy to setup. No need for customised container commands or other workarounds.
50
191
  email:
51
192
  - tawan@sierek.com
193
+ - mail@joeyparis.me
52
194
  executables: []
53
195
  extensions: []
54
196
  extra_rdoc_files: []
@@ -61,7 +203,7 @@ files:
61
203
  - lib/active_elastic_job/railtie.rb
62
204
  - lib/active_elastic_job/version.rb
63
205
  - lib/active_job/queue_adapters/active_elastic_job_adapter.rb
64
- homepage: https://github.com/tawan/active-elastic-job
206
+ homepage: https://github.com/active-elastic-job/active-elastic-job
65
207
  licenses:
66
208
  - MIT
67
209
  metadata: {}
@@ -73,15 +215,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
73
215
  requirements:
74
216
  - - ">="
75
217
  - !ruby/object:Gem::Version
76
- version: 1.9.3
218
+ version: '2.5'
77
219
  required_rubygems_version: !ruby/object:Gem::Requirement
78
220
  requirements:
79
- - - ">="
221
+ - - ">"
80
222
  - !ruby/object:Gem::Version
81
- version: '0'
223
+ version: 1.3.1
82
224
  requirements: []
83
- rubyforge_project:
84
- rubygems_version: 2.4.5.1
225
+ rubygems_version: 3.1.2
85
226
  signing_key:
86
227
  specification_version: 4
87
228
  summary: Active Elastic Job is a simple to use Active Job backend for Rails applications