active_elastic_job 2.0.1 → 3.2.0

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: 98e8fc2ff4cbd08606241083c7e3ceccd8108108
4
- data.tar.gz: f55ec5c86259ab8c9439afab8692e0b546a71114
2
+ SHA256:
3
+ metadata.gz: 13d1e6ed87dd9769df952fb0017b638febe10bbb414263b71a6b0caf3dfc2b52
4
+ data.tar.gz: 69fd12721bd019bc46ec105c35de482f914f82fee1bcf22d18df44f3985ca9db
5
5
  SHA512:
6
- metadata.gz: 9896471a6018a88efe19c55508c748456aabb3d84656adf710915323a0c19e86b776df934874cfdeee5a2f3ec4e2a68360b7c6c7a171d6ad64a12ef42b6baee9
7
- data.tar.gz: a14cb288a8c2392b6fafe0506c9355bf51d009097e8362de28bd761951c621b71716faf043b6a6c405d0813363410e9399e80b1dc3db9652c28f4efa32627bf6
6
+ metadata.gz: f34c118939fb99f8826ea1f2b6e6cb7c4407e23d5ecce2162563d4a9f36978a578e2f9fc72fd50d98e453adb6689ca68c2b3f01d37374d081a4a93ca6a66718e
7
+ data.tar.gz: d2c2ee1810263d6504b8ab774dbacb6a4be44a789f624577ca79097d8989fd0a0f74b96bc0ad7b655ed88b8903c3a8d81b1c5eae0cb16343d8d1995b15186c98
@@ -8,20 +8,33 @@ 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.7'
24
24
 
25
- spec.add_dependency 'aws-sdk', '~> 2'
26
- spec.add_dependency 'rails', '>= 4.2'
25
+ spec.add_dependency 'aws-sdk-sqs', '~> 1'
26
+ spec.add_dependency 'rails', '>= 5.2.6', '< 7.1'
27
+
28
+ spec.add_development_dependency 'amazing_print', '~> 1.2'
29
+ spec.add_development_dependency 'benchmark-ips', '~> 2.8'
30
+ spec.add_development_dependency 'bootsnap', '~>1.9'
31
+ spec.add_development_dependency 'bundler', '~> 2.2'
32
+ spec.add_development_dependency 'byebug', '~> 11.1'
33
+ spec.add_development_dependency 'climate_control', '~> 0.2'
34
+ spec.add_development_dependency 'dotenv', '~> 2.7'
35
+ spec.add_development_dependency 'fuubar', '~> 2.5'
36
+ spec.add_development_dependency 'rdoc', '~> 6.3'
37
+ spec.add_development_dependency 'rspec', '~> 3.4'
38
+ spec.add_development_dependency 'sprockets-rails', '~> 3.4'
39
+ spec.add_development_dependency 'sqlite3', '~> 1.4'
27
40
  end
@@ -25,7 +25,10 @@ module ActiveElasticJob
25
25
  { 'Content-Type'.freeze => 'text/plain'.freeze },
26
26
  [ 'Request forbidden!'.freeze ]
27
27
  ]
28
- DOCKER_HOST_IP = '172.17.0.1'.freeze
28
+
29
+ # 172.17.0.x is the default for Docker
30
+ # 172.18.0.x is the default for the bridge network of Docker Compose
31
+ DOCKER_HOST_IP = /172.1(7|8).0.\d+/.freeze
29
32
 
30
33
  def initialize(app) #:nodoc:
31
34
  @app = app
@@ -33,7 +36,7 @@ module ActiveElasticJob
33
36
 
34
37
  def call(env) #:nodoc:
35
38
  request = ActionDispatch::Request.new env
36
- if enabled? && aws_sqsd?(request)
39
+ if enabled? && (aws_sqsd?(request) || sqsd?(request))
37
40
  unless request.local? || sent_from_docker_host?(request)
38
41
  return FORBIDDEN_RESPONSE
39
42
  end
@@ -47,7 +50,7 @@ module ActiveElasticJob
47
50
  rescue ActiveElasticJob::MessageVerifier::InvalidDigest => e
48
51
  return FORBIDDEN_RESPONSE
49
52
  end
50
- return OK_RESPONSE
53
+ return OK_RESPONSE
51
54
  end
52
55
  end
53
56
  @app.call(env)
@@ -87,6 +90,18 @@ module ActiveElasticJob
87
90
  current_user_agent[0..('aws-sqsd'.freeze.size - 1)] == 'aws-sqsd'.freeze)
88
91
  end
89
92
 
93
+ def sqsd?(request)
94
+ # Does not match against a Regexp
95
+ # in order to avoid performance penalties.
96
+ # Instead performs a simple string comparison.
97
+ # Benchmark runs showed an performance increase of
98
+ # up to 40%
99
+ current_user_agent = request.headers['User-Agent'.freeze]
100
+ return (current_user_agent.present? &&
101
+ current_user_agent.size >= 'sqsd'.freeze.size &&
102
+ current_user_agent[0..('sqsd'.freeze.size - 1)] == 'sqsd'.freeze)
103
+ end
104
+
90
105
  def periodic_tasks_route
91
106
  @periodic_tasks_route ||= config.periodic_tasks_route
92
107
  end
@@ -118,11 +133,15 @@ module ActiveElasticJob
118
133
  end
119
134
 
120
135
  def sent_from_docker_host?(request)
121
- app_runs_in_docker_container? && request.remote_ip == DOCKER_HOST_IP
136
+ app_runs_in_docker_container? && ip_originates_from_docker?(request)
137
+ end
138
+
139
+ def ip_originates_from_docker?(request)
140
+ (request.remote_ip =~ DOCKER_HOST_IP).present? or (request.remote_addr =~ DOCKER_HOST_IP).present?
122
141
  end
123
142
 
124
143
  def app_runs_in_docker_container?
125
- @app_in_docker_container ||= `[ -f /proc/1/cgroup ] && cat /proc/1/cgroup` =~ /docker/
144
+ (`[ -f /proc/1/cgroup ] && cat /proc/1/cgroup` =~ /(ecs|docker)/).present?
126
145
  end
127
146
  end
128
147
  end
@@ -1,16 +1,19 @@
1
1
  module ActiveElasticJob
2
2
  class Railtie < Rails::Railtie
3
3
  config.active_elastic_job = ActiveSupport::OrderedOptions.new
4
- config.active_elastic_job.process_jobs = ENV['PROCESS_ACTIVE_ELASTIC_JOBS'] == 'true'
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'
5
6
  config.active_elastic_job.aws_credentials = lambda { Aws::InstanceProfileCredentials.new }
7
+ config.active_elastic_job.aws_region = ENV['AWS_REGION']
6
8
  config.active_elastic_job.periodic_tasks_route = '/periodic_tasks'.freeze
7
9
 
8
10
  initializer "active_elastic_job.insert_middleware" do |app|
9
11
  if app.config.active_elastic_job.secret_key_base.blank?
10
- app.config.active_elastic_job.secret_key_base = app.secrets[:secret_key_base]
12
+ app.config.active_elastic_job.secret_key_base = ENV["SECRET_KEY_BASE"] || app.credentials.secret_key_base || app.secrets.secret_key_base
11
13
  end
12
14
 
13
15
  if app.config.active_elastic_job.process_jobs == true
16
+ app.config.active_elastic_job.aws_credentials ||= lambda { Aws::InstanceProfileCredentials.new }
14
17
  if app.config.force_ssl
15
18
  app.config.middleware.insert_before(ActionDispatch::SSL,ActiveElasticJob::Rack::SqsMessageConsumer)
16
19
  else
@@ -1,8 +1,8 @@
1
1
  module ActiveElasticJob
2
2
  module VERSION
3
- MAJOR = 2
4
- MINOR = 0
5
- TINY = 1
3
+ MAJOR = 3
4
+ MINOR = 2
5
+ TINY = 0
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -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'
@@ -28,7 +28,7 @@ module ActiveJob
28
28
  class SerializedJobTooBig < Error
29
29
  def initialize(serialized_job)
30
30
  super(<<-MSG)
31
- The job contains #{serialized_job.bytesize} bytes in its serialzed form,
31
+ The job contains #{serialized_job.bytesize} bytes in its serialized form,
32
32
  which exceeds the allowed maximum of #{MAX_MESSAGE_SIZE} bytes imposed by Amazon SQS.
33
33
  MSG
34
34
  end
@@ -76,6 +76,18 @@ module ActiveJob
76
76
  end
77
77
  end
78
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
+
79
91
  def enqueue(job) #:nodoc:
80
92
  self.class.enqueue job
81
93
  end
@@ -100,6 +112,7 @@ module ActiveJob
100
112
  message[:message_body],
101
113
  message[:message_attributes])
102
114
  end
115
+ job.provider_job_id = resp.message_id
103
116
  rescue Aws::SQS::Errors::NonExistentQueue => e
104
117
  unless @queue_urls[job.queue_name.to_s].nil?
105
118
  @queue_urls[job.queue_name.to_s] = nil
@@ -113,27 +126,46 @@ module ActiveJob
113
126
  private
114
127
 
115
128
  def aws_client_verifies_md5_digests?
116
- Gem::Version.new(Aws::VERSION) >= Gem::Version.new('2.2.19'.freeze)
129
+ Gem::Version.new(Aws::CORE_GEM_VERSION) >= Gem::Version.new('2.2.19'.freeze)
117
130
  end
118
131
 
119
132
  def build_message(queue_name, serialized_job, timestamp)
120
- {
133
+ args = {
121
134
  queue_url: queue_url(queue_name),
122
135
  message_body: serialized_job,
123
136
  delay_seconds: calculate_delay(timestamp),
124
- message_attributes: {
125
- "message-digest".freeze => {
126
- string_value: message_digest(serialized_job),
127
- data_type: "String".freeze
128
- },
129
- origin: {
130
- string_value: ActiveElasticJob::ACRONYM,
131
- data_type: "String".freeze
132
- }
137
+ message_attributes: build_message_attributes(serialized_job)
138
+ }
139
+
140
+ if queue_name.split('.').last == 'fifo'
141
+ args.merge!(fifo_required_params(serialized_job))
142
+ end
143
+
144
+ return args
145
+ end
146
+
147
+ def build_message_attributes(serialized_job)
148
+ {
149
+ "message-digest".freeze => {
150
+ string_value: message_digest(serialized_job),
151
+ data_type: "String".freeze
152
+ },
153
+ origin: {
154
+ string_value: ActiveElasticJob::ACRONYM,
155
+ data_type: "String".freeze
133
156
  }
134
157
  }
135
158
  end
136
159
 
160
+ def fifo_required_params(serialized_job)
161
+ parsed_job = JSON.parse(serialized_job)
162
+
163
+ {
164
+ message_group_id: parsed_job['job_class'],
165
+ message_deduplication_id: parsed_job['job_id']
166
+ }
167
+ end
168
+
137
169
  def queue_url(queue_name)
138
170
  cache_key = queue_name.to_s
139
171
  @queue_urls ||= { }
@@ -147,12 +179,7 @@ module ActiveJob
147
179
  def calculate_delay(timestamp)
148
180
  delay = (timestamp - Time.current.to_f).to_i + 1
149
181
  if delay > MAX_DELAY_IN_MINUTES.minutes
150
- msg = "Jobs cannot be scheduled more than " <<
151
- "#{MAX_DELAY_IN_MINUTES} minutes into the future. " <<
152
- "See http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html" <<
153
- " for further details!"
154
-
155
- raise RangeError, msg
182
+ raise DelayTooLong.new
156
183
  end
157
184
  delay = 0 if delay < 0
158
185
  delay
@@ -165,7 +192,13 @@ module ActiveJob
165
192
  end
166
193
 
167
194
  def aws_sqs_client
168
- @aws_sqs_client ||= Aws::SQS::Client.new(credentials: aws_sqs_client_credentials )
195
+ options = {
196
+ credentials: aws_sqs_client_credentials,
197
+ region: aws_region
198
+ }
199
+ endpoint = Rails.application.config.active_elastic_job.endpoint
200
+ options[:endpoint] = endpoint if endpoint.present?
201
+ @aws_sqs_client ||= Aws::SQS::Client.new(options)
169
202
  end
170
203
 
171
204
  def aws_sqs_client_credentials
@@ -184,13 +217,13 @@ module ActiveJob
184
217
  Rails.application.config.active_elastic_job
185
218
  end
186
219
 
187
- def message_digest(messsage_body)
220
+ def message_digest(message_body)
188
221
  @verifier ||= ActiveElasticJob::MessageVerifier.new(secret_key_base)
189
- @verifier.generate_digest(messsage_body)
222
+ @verifier.generate_digest(message_body)
190
223
  end
191
224
 
192
- def verify_md5_digests!(response, messsage_body, message_attributes)
193
- calculated = md5_of_message_body(messsage_body)
225
+ def verify_md5_digests!(response, message_body, message_attributes)
226
+ calculated = md5_of_message_body(message_body)
194
227
  returned = response.md5_of_message_body
195
228
  if calculated != returned
196
229
  raise MD5MismatchError.new response.message_id, calculated, returned
@@ -199,7 +232,7 @@ module ActiveJob
199
232
  if message_attributes
200
233
  calculated = md5_of_message_attributes(message_attributes)
201
234
  returned = response.md5_of_message_attributes
202
- if calculated != returned
235
+ if calculated != returned
203
236
  raise MD5MismatchError.new response.message_id, calculated, returned
204
237
  end
205
238
  end
metadata CHANGED
@@ -1,48 +1,224 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_elastic_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tawan Sierek
8
- autorequire:
8
+ - Joey Paris
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-02-05 00:00:00.000000000 Z
12
+ date: 2022-01-19 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.2.6
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '7.1'
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
37
41
  requirements:
38
42
  - - ">="
39
43
  - !ruby/object:Gem::Version
40
- version: '4.2'
44
+ version: 5.2.6
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '7.1'
48
+ - !ruby/object:Gem::Dependency
49
+ name: amazing_print
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ - !ruby/object:Gem::Dependency
63
+ name: benchmark-ips
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.8'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.8'
76
+ - !ruby/object:Gem::Dependency
77
+ name: bootsnap
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.9'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.9'
90
+ - !ruby/object:Gem::Dependency
91
+ name: bundler
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.2'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.2'
104
+ - !ruby/object:Gem::Dependency
105
+ name: byebug
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '11.1'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '11.1'
118
+ - !ruby/object:Gem::Dependency
119
+ name: climate_control
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.2'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.2'
132
+ - !ruby/object:Gem::Dependency
133
+ name: dotenv
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.7'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.7'
146
+ - !ruby/object:Gem::Dependency
147
+ name: fuubar
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.5'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.5'
160
+ - !ruby/object:Gem::Dependency
161
+ name: rdoc
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '6.3'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '6.3'
174
+ - !ruby/object:Gem::Dependency
175
+ name: rspec
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '3.4'
181
+ type: :development
182
+ prerelease: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '3.4'
188
+ - !ruby/object:Gem::Dependency
189
+ name: sprockets-rails
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '3.4'
195
+ type: :development
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '3.4'
202
+ - !ruby/object:Gem::Dependency
203
+ name: sqlite3
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.4'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '1.4'
41
216
  description: Run background jobs / tasks of Rails applications deployed in Amazon
42
217
  Elastic Beanstalk environments. Active Elastic Job is an Active Job backend which
43
218
  is easy to setup. No need for customised container commands or other workarounds.
44
219
  email:
45
220
  - tawan@sierek.com
221
+ - mail@joeyparis.me
46
222
  executables: []
47
223
  extensions: []
48
224
  extra_rdoc_files: []
@@ -55,11 +231,11 @@ files:
55
231
  - lib/active_elastic_job/railtie.rb
56
232
  - lib/active_elastic_job/version.rb
57
233
  - lib/active_job/queue_adapters/active_elastic_job_adapter.rb
58
- homepage: https://github.com/tawan/active-elastic-job
234
+ homepage: https://github.com/active-elastic-job/active-elastic-job
59
235
  licenses:
60
236
  - MIT
61
237
  metadata: {}
62
- post_install_message:
238
+ post_install_message:
63
239
  rdoc_options: []
64
240
  require_paths:
65
241
  - lib
@@ -67,16 +243,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
67
243
  requirements:
68
244
  - - ">="
69
245
  - !ruby/object:Gem::Version
70
- version: 1.9.3
246
+ version: '2.7'
71
247
  required_rubygems_version: !ruby/object:Gem::Requirement
72
248
  requirements:
73
249
  - - ">="
74
250
  - !ruby/object:Gem::Version
75
251
  version: '0'
76
252
  requirements: []
77
- rubyforge_project:
78
- rubygems_version: 2.4.5.1
79
- signing_key:
253
+ rubygems_version: 3.2.32
254
+ signing_key:
80
255
  specification_version: 4
81
256
  summary: Active Elastic Job is a simple to use Active Job backend for Rails applications
82
257
  deployed on the Amazon Elastic Beanstalk platform.