activejob-scheduler 0.0.1 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ module Scheduler
5
+ # Thrown when the config file doesn't exist.
6
+ class MissingConfigError < Error
7
+ def initialize
8
+ super 'Define config/jobs.yml before using activejob-scheduler'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ module Scheduler
5
+ # Thrown when a job is not defined for the given class_name.
6
+ class NotDefinedError < Scheduler::Error
7
+ def initialize(job_class_name)
8
+ super "Job not defined for class name '#{job_class_name}'"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ module Scheduler
5
+ # Thrown when an unsupported type is used as a job class name.
6
+ class NotSupportedError < Error
7
+ def initialize(job_class)
8
+ super "#{job_class} must be an ActionMailer::Base or ActiveJob::Base"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ module Scheduler
5
+ # Look up the schedule at +config/jobs.yml+ and create a collection
6
+ # of +ActiveJob::Scheduler::Job+ objects to be used throughout the
7
+ # library.
8
+ #
9
+ # @api public
10
+ class Schedule
11
+ include Enumerable
12
+
13
+ # Path to the config file on disk.
14
+ #
15
+ # @attr_reader [String]
16
+ attr_reader :path
17
+
18
+ # Iterator for the collection of job objects.
19
+ #
20
+ # @return [Iterator]
21
+ delegate :each, to: :events
22
+
23
+ def initialize
24
+ @path = Rails.root.join 'config', 'jobs.yml'
25
+ end
26
+
27
+ # Find a job by its +class_name+
28
+ #
29
+ # @param [String] name - Class name of the job
30
+ # @return [ActiveJob::Scheduler::Job] or +nil+ if it can't be
31
+ # found.
32
+ def find_by_name(name)
33
+ find do |event|
34
+ event.job_class_name == name.to_s
35
+ end
36
+ end
37
+
38
+ alias [] find_by_name
39
+
40
+ # Enqueue all configured background jobs immediately.
41
+ #
42
+ # @return [Array<ActiveJob::Base>]
43
+ def start
44
+ events.map(&:enqueue)
45
+ end
46
+
47
+ private
48
+
49
+ # All events scheduled.
50
+ #
51
+ # @private
52
+ # @return [Array<ActiveJob::Scheduler::Job>]
53
+ def events
54
+ @events ||= events_from_yaml + events_from_jobs + events_from_mailers
55
+ end
56
+
57
+ # All events from the jobs DSL.
58
+ #
59
+ # @private
60
+ # @return [Array<ActiveJob::Scheduler::Job>]
61
+ def events_from_jobs
62
+ Pathname.glob(Rails.root.join('app', 'jobs', '*.rb')).each do |job|
63
+ require_dependency job.to_s
64
+ end
65
+
66
+ ActiveJob::Base
67
+ .descendants
68
+ .select { |job| job.to_event.present? }
69
+ .map { |job| Event.new(job.to_event) }
70
+ end
71
+
72
+ # All events from the mailer DSL.
73
+ #
74
+ # @private
75
+ # @return [Array<ActiveJob::Scheduler::Job>]
76
+ def events_from_mailers
77
+ Pathname.glob(Rails.root.join('app', 'mailers', '*.rb')).each do |job|
78
+ require_dependency job.to_s
79
+ end
80
+
81
+ ActionMailer::Base
82
+ .descendants
83
+ .select { |mailer| mailer.events.present? }
84
+ .flat_map { |mailer| mailer.events.map { |event| Event.new(event) } }
85
+ end
86
+
87
+ # All events scheduled in the jobs.yml file.
88
+ #
89
+ # @private
90
+ # @return [Array<ActiveJob::Scheduler::Job>]
91
+ def events_from_yaml
92
+ yaml.map do |name, options|
93
+ Event.new(
94
+ name: name,
95
+ class_name: options['class_name'],
96
+ arguments: options['args'],
97
+ description: options['description'],
98
+ interval: options.slice(*Interval::TYPES)
99
+ )
100
+ end
101
+ end
102
+
103
+ # Read the jobs.yml file as a Hash.
104
+ #
105
+ # @private
106
+ # @return [Hash]
107
+ def yaml
108
+ @yaml ||= YAML.load_file path
109
+ rescue StandardError
110
+ {}
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveJob
2
4
  module Scheduler
3
- VERSION = "0.0.1"
5
+ # Version of this library
6
+ VERSION = '1.0.0.pre'
4
7
  end
5
8
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_job/scheduler'
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :activejob do
4
+ desc 'Enqueue Scheduled Jobs'
5
+ task schedule: [:environment] do
6
+ ActiveJob::Scheduler.start
7
+ end
8
+ end
metadata CHANGED
@@ -1,126 +1,274 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activejob-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Scott
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2014-06-10 00:00:00.000000000 Z
11
+ date: 2019-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: mocha
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.9'
20
40
  type: :development
21
41
  prerelease: false
22
42
  version_requirements: !ruby/object:Gem::Requirement
23
43
  requirements:
24
- - - ~>
44
+ - - "~>"
25
45
  - !ruby/object:Gem::Version
26
- version: '1.5'
46
+ version: '1.9'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '6'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '6'
27
61
  - !ruby/object:Gem::Dependency
28
62
  name: rake
29
63
  requirement: !ruby/object:Gem::Requirement
30
64
  requirements:
31
- - - '>='
65
+ - - "~>"
32
66
  - !ruby/object:Gem::Version
33
- version: '0'
67
+ version: '10.0'
34
68
  type: :development
35
69
  prerelease: false
36
70
  version_requirements: !ruby/object:Gem::Requirement
37
71
  requirements:
38
- - - '>='
72
+ - - "~>"
39
73
  - !ruby/object:Gem::Version
40
- version: '0'
74
+ version: '10.0'
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: rspec
43
77
  requirement: !ruby/object:Gem::Requirement
44
78
  requirements:
45
- - - '>='
79
+ - - "~>"
46
80
  - !ruby/object:Gem::Version
47
- version: '0'
81
+ version: '3'
48
82
  type: :development
49
83
  prerelease: false
50
84
  version_requirements: !ruby/object:Gem::Requirement
51
85
  requirements:
52
- - - '>='
86
+ - - "~>"
53
87
  - !ruby/object:Gem::Version
54
- version: '0'
88
+ version: '3'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rubocop
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 0.49.0
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.49.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.17'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.17'
117
+ - !ruby/object:Gem::Dependency
118
+ name: sqlite3
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.4'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.4'
131
+ - !ruby/object:Gem::Dependency
132
+ name: yard
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 0.9.20
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 0.9.20
145
+ - !ruby/object:Gem::Dependency
146
+ name: actionmailer
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">"
150
+ - !ruby/object:Gem::Version
151
+ version: '5'
152
+ - - "<"
153
+ - !ruby/object:Gem::Version
154
+ version: '7'
155
+ type: :runtime
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">"
160
+ - !ruby/object:Gem::Version
161
+ version: '5'
162
+ - - "<"
163
+ - !ruby/object:Gem::Version
164
+ version: '7'
55
165
  - !ruby/object:Gem::Dependency
56
166
  name: activejob
57
167
  requirement: !ruby/object:Gem::Requirement
58
168
  requirements:
59
- - - '>='
169
+ - - ">"
60
170
  - !ruby/object:Gem::Version
61
- version: '0'
171
+ version: '5'
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: '7'
62
175
  type: :runtime
63
176
  prerelease: false
64
177
  version_requirements: !ruby/object:Gem::Requirement
65
178
  requirements:
66
- - - '>='
179
+ - - ">"
67
180
  - !ruby/object:Gem::Version
68
- version: '0'
181
+ version: '5'
182
+ - - "<"
183
+ - !ruby/object:Gem::Version
184
+ version: '7'
69
185
  - !ruby/object:Gem::Dependency
70
- name: rufus-scheduler
186
+ name: activesupport
71
187
  requirement: !ruby/object:Gem::Requirement
72
188
  requirements:
73
- - - '>='
189
+ - - ">"
74
190
  - !ruby/object:Gem::Version
75
- version: '0'
191
+ version: '5'
192
+ - - "<"
193
+ - !ruby/object:Gem::Version
194
+ version: '7'
76
195
  type: :runtime
77
196
  prerelease: false
78
197
  version_requirements: !ruby/object:Gem::Requirement
79
198
  requirements:
80
- - - '>='
199
+ - - ">"
81
200
  - !ruby/object:Gem::Version
82
- version: '0'
201
+ version: '5'
202
+ - - "<"
203
+ - !ruby/object:Gem::Version
204
+ version: '7'
83
205
  - !ruby/object:Gem::Dependency
84
- name: activemodel
206
+ name: fugit
85
207
  requirement: !ruby/object:Gem::Requirement
86
208
  requirements:
87
- - - '>='
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '1.3'
212
+ type: :runtime
213
+ prerelease: false
214
+ version_requirements: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - "~>"
217
+ - !ruby/object:Gem::Version
218
+ version: '1.3'
219
+ - !ruby/object:Gem::Dependency
220
+ name: travis-release
221
+ requirement: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - "~>"
88
224
  - !ruby/object:Gem::Version
89
225
  version: '0'
90
226
  type: :runtime
91
227
  prerelease: false
92
228
  version_requirements: !ruby/object:Gem::Requirement
93
229
  requirements:
94
- - - '>='
230
+ - - "~>"
95
231
  - !ruby/object:Gem::Version
96
232
  version: '0'
97
- description: A scheduling apparatus for ActiveJob based on Rufus. Resque::Scheduler
98
- for everyone!
233
+ description: Scheduled jobs for ActiveJob.
99
234
  email:
100
- - tscott@telvue.com
101
- executables:
102
- - ajs
235
+ - tscott@weblinc.com
236
+ executables: []
103
237
  extensions: []
104
238
  extra_rdoc_files: []
105
239
  files:
106
- - .gitignore
240
+ - ".gitignore"
241
+ - ".rspec"
242
+ - ".rubocop.yml"
243
+ - ".travis.yml"
244
+ - CODE_OF_CONDUCT.md
107
245
  - Gemfile
108
246
  - LICENSE.txt
247
+ - MIT-LICENSE
109
248
  - README.md
110
249
  - Rakefile
111
250
  - activejob-scheduler.gemspec
112
- - bin/ajs
251
+ - bin/console
252
+ - bin/rails
253
+ - bin/rake
254
+ - bin/rspec
255
+ - bin/setup
256
+ - bin/test
113
257
  - lib/active_job/scheduler.rb
114
- - lib/active_job/scheduler/cli.rb
258
+ - lib/active_job/scheduler/engine.rb
259
+ - lib/active_job/scheduler/error.rb
260
+ - lib/active_job/scheduler/event.rb
261
+ - lib/active_job/scheduler/interval.rb
115
262
  - lib/active_job/scheduler/job.rb
116
- - lib/active_job/scheduler/jobs.rb
117
- - lib/active_job/scheduler/task.rb
263
+ - lib/active_job/scheduler/mailer.rb
264
+ - lib/active_job/scheduler/missing_config_error.rb
265
+ - lib/active_job/scheduler/not_defined_error.rb
266
+ - lib/active_job/scheduler/not_supported_error.rb
267
+ - lib/active_job/scheduler/schedule.rb
118
268
  - lib/active_job/scheduler/version.rb
119
- - spec/active_job/scheduler/job_spec.rb
120
- - spec/active_job/scheduler/jobs_spec.rb
121
- - spec/fixtures/jobs.yml
122
- - spec/spec_helper.rb
123
- homepage: http://github.com/tubbo/activejob-scheduler
269
+ - lib/activejob-scheduler.rb
270
+ - lib/tasks/activejob_scheduler_tasks.rake
271
+ homepage: https://github.com/tubbo/activejob-scheduler
124
272
  licenses:
125
273
  - MIT
126
274
  metadata: {}
@@ -130,22 +278,17 @@ require_paths:
130
278
  - lib
131
279
  required_ruby_version: !ruby/object:Gem::Requirement
132
280
  requirements:
133
- - - '>='
281
+ - - ">="
134
282
  - !ruby/object:Gem::Version
135
283
  version: '0'
136
284
  required_rubygems_version: !ruby/object:Gem::Requirement
137
285
  requirements:
138
- - - '>='
286
+ - - ">"
139
287
  - !ruby/object:Gem::Version
140
- version: '0'
288
+ version: 1.3.1
141
289
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.0.3
290
+ rubygems_version: 3.0.3
144
291
  signing_key:
145
292
  specification_version: 4
146
- summary: A scheduling apparatus for ActiveJob based on Rufus.
147
- test_files:
148
- - spec/active_job/scheduler/job_spec.rb
149
- - spec/active_job/scheduler/jobs_spec.rb
150
- - spec/fixtures/jobs.yml
151
- - spec/spec_helper.rb
293
+ summary: Scheduled jobs for ActiveJob.
294
+ test_files: []