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 +5 -5
- data/active-elastic-job.gemspec +17 -6
- data/lib/active_elastic_job.rb +1 -1
- data/lib/active_elastic_job/rack/sqs_message_consumer.rb +68 -36
- data/lib/active_elastic_job/railtie.rb +15 -4
- data/lib/active_elastic_job/version.rb +4 -4
- data/lib/active_job/queue_adapters/active_elastic_job_adapter.rb +47 -28
- metadata +156 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 76f95bc2f952a3d57402a5c41428e02f4662725e2c784d547c75ce8081edbf31
|
4
|
+
data.tar.gz: 495df5d131344373516e77507461861a72007387adb6dde0a5c8a0274e535bf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb613b8ad89d5b86437bd831b28247e54c3adc54127bdb6264f5ccc0fda7d4d26ffaec5fa5e312e09d042c580e088bb74753601f3b4aa1c68d19505ac3d7f31f
|
7
|
+
data.tar.gz: 6149c28f1cce197d6722e83ca2927173133aca4b2d2afbb4803ff7b2191c3d314841c4e57c57cb3d7b1a6ea43e889e7029b09ccf5f125379d4d3f26e3340aeda
|
data/active-elastic-job.gemspec
CHANGED
@@ -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/
|
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 = '>=
|
23
|
+
spec.required_ruby_version = '>= 2.5'
|
24
24
|
|
25
|
-
spec.add_dependency 'aws-sdk', '~>
|
26
|
-
spec.add_dependency 'rails', '>=
|
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
|
data/lib/active_elastic_job.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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)
|
36
|
+
if enabled? && aws_sqsd?(request)
|
32
37
|
unless request.local? || sent_from_docker_host?(request)
|
33
|
-
|
34
|
-
return ['403', {CONTENT_TYPE_HEADER_NAME => 'text/plain' }, [ m ]]
|
38
|
+
return FORBIDDEN_RESPONSE
|
35
39
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
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[
|
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
|
-
#
|
79
|
+
# Does not match against a Regexp
|
72
80
|
# in order to avoid performance penalties.
|
73
|
-
# Instead
|
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 >=
|
79
|
-
current_user_agent[0..(
|
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[
|
111
|
+
if request.headers['HTTP_X_AWS_SQSD_ATTR_ORIGIN'.freeze] == ActiveElasticJob::ACRONYM
|
84
112
|
return true
|
85
|
-
elsif request.headers[
|
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
|
-
|
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
|
-
|
5
|
-
|
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(
|
18
|
+
app.config.middleware.insert_before(ActionDispatch::SSL,ActiveElasticJob::Rack::SqsMessageConsumer)
|
8
19
|
else
|
9
|
-
app.config.middleware.use(
|
20
|
+
app.config.middleware.use(ActiveElasticJob::Rack::SqsMessageConsumer)
|
10
21
|
end
|
11
22
|
end
|
12
23
|
end
|
@@ -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
|
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
|
-
'#{
|
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
|
-
|
92
|
+
self.class.enqueue job
|
87
93
|
end
|
88
94
|
|
89
95
|
def enqueue_at(job, timestamp) #:nodoc:
|
90
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
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
|
-
|
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:
|
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:
|
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: '
|
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: '
|
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: '
|
34
|
+
version: '5.0'
|
34
35
|
- - "<"
|
35
36
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
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: '
|
44
|
+
version: '5.0'
|
44
45
|
- - "<"
|
45
46
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
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/
|
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:
|
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:
|
223
|
+
version: 1.3.1
|
82
224
|
requirements: []
|
83
|
-
|
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
|