state_machine_job 1.0.0 → 2.0.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: 399f472130b3ee8015808ca3295f2802c5610bce
4
- data.tar.gz: 038d38a55ee2d05627a6a0392d3e957bb1ab06b6
2
+ SHA256:
3
+ metadata.gz: 7321f4a9acadaf04e7ae9e042984c0236a515d75afb4fa4c099285c8fa315081
4
+ data.tar.gz: 7cb0105c55838f3d0e2814ccb5c0e2e867d787b81ab3c04ca90eef416f69bb63
5
5
  SHA512:
6
- metadata.gz: 2eca4e96a81540fc28e25cfa7bd005478254b434cc0a78f04489c94f529da5796260f14d477e04bb857b2ee3f78b7430a8f87b0f06006788a7f6fe8b03c67659
7
- data.tar.gz: 94668d80123330fa26e56ecc1e4c1918c46afff64d3afae6ad953a010273458ac69279204d7ad9454edf3d94117adc931cd16588ce86ded59adf0b1a3aeb7d0d
6
+ metadata.gz: 32a5ee63e8d498fcc5457700f554451b02b243069d9ff92f22cebe96f1382e31030c775a3ddf5a45bc9db36174098dba177206b8cfd1fa568e5fce024e7b7c98
7
+ data.tar.gz: cecc86f4fc4dbdc206128251c2cb987f68ff392128397682f8f535970c8c9ed7a0c7de234dc0f745a04806db79fec298b91b743a2ae6f5e2d7f897e690a805ce
data/CHANGELOG.md CHANGED
@@ -1,24 +1,15 @@
1
1
  # CHANGELOG
2
2
 
3
- ### Version 1.0.0
3
+ ### Version 2.0.0
4
4
 
5
- 2017-08-02
5
+ 2018-07-27
6
6
 
7
- [Compare changes](http://github.com/codevise/state_machine_job/compare/0-x-stable...v1.0.0)
7
+ [Compare changes](http://github.com/codevise/state_machine_job/compare/1-x-stable...v2.0.0)
8
8
 
9
- - Do not silence exceptions. Ensure state machine can transition to
10
- failed state by invoking error result event, but then re-raise
11
- exception, so they show up in the Resque error list. Jobs are still
12
- free to rescue exceptions themselves and return an error result
13
- instead.
14
- ([#5](https://github.com/codevise/state_machine_job/pull/5))
15
- - Add backtrace info to exception logging
16
- ([#3](https://github.com/codevise/state_machine_job/pull/3))
17
- - Restrict activesupport to < 5 for now
18
- ([#4](https://github.com/codevise/state_machine_job/pull/4))
19
- - Use sinatra 1 in development and tests for ruby 2.1 compatibility
20
- ([#6](https://github.com/codevise/state_machine_job/pull/6))
9
+ - Breaking change: Decouple from Resque and use Active Job. See README
10
+ for updated usage instructions.
11
+ ([#9](https://github.com/codevise/state_machine_job/pull/9))
21
12
 
22
13
  See
23
- [0-x-stable branch](https://github.com/codevise/state_machine_job/blob/0-x-stable/CHANGELOG.md)
14
+ [1-x-stable branch](http://github.com/codevise/state_machine_job/blob/1-x-stable/CHANGELOG.md)
24
15
  for previous changes.
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in state_machine_job.gemspec
4
4
  gemspec
5
-
6
- # Sinatra 2 requires Ruby 2.2
7
- gem 'sinatra', '~> 1.0'
data/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/state_machine_job.svg)](http://badge.fury.io/rb/state_machine_job)
4
4
  [![Build Status](https://travis-ci.org/codevise/state_machine_job.svg?branch=master)](https://travis-ci.org/codevise/state_machine_job)
5
5
 
6
- Enqueue resque jobs on state machine transitions and change state
7
- according to job result.
6
+ Enqueue jobs on state machine transitions and change state according
7
+ to job result.
8
8
 
9
9
  ## Installation
10
10
 
@@ -12,19 +12,15 @@ Add this line to your application's Gemfile:
12
12
 
13
13
  gem 'state_machine_job'
14
14
 
15
- Requires the [resque-logger](https://github.com/salizzar/resque-logger)
16
- gem to be present and configured.
17
-
18
15
  ## Usage
19
16
 
20
- Extend your resque job with the `StateMachineJob` mixin and provide a
21
- `perform_with_result` class method instead of the normal `perform`
22
- method:
17
+ Include the `StateMachineJob` mixin in your job and provide a
18
+ `perform_with_result` method instead of the normal `perform` method:
23
19
 
24
- class SomeJob
25
- extend StateMachineJob
20
+ class SomeJob < ApplicationJob
21
+ include StateMachineJob
26
22
 
27
- def self.perform_with_result(record, payload)
23
+ def perform_with_result(record, payload)
28
24
  # do something
29
25
  :ok
30
26
  end
@@ -61,8 +57,8 @@ event or by manually updateing the attribute), `SomeJob` will
61
57
  automatically be enqueued. If `perform_with_result` returns `:ok`, the
62
58
  state machine transitions to the `'done'` state. You can specify as
63
59
  many results as you want. Note that any exception raised by
64
- `perform_with_result` is rescued and translated to the result
65
- `:error`.
60
+ `perform_with_result` leads to a state machine transition as if the
61
+ result had been `:error`. The exception is not rescued, though.
66
62
 
67
63
  ### Passing custom Payload
68
64
 
@@ -117,8 +113,7 @@ You can tell the state machine to retry a job based on its result:
117
113
 
118
114
  When `perform_with_result` returns the result `:pending`, the state
119
115
  machine will remain in the `runnning` state and enqueue a delayed
120
- job. This functionality requires the [`resque-scheduler`](https://github.com/resque/resque-scheduler)
121
- gem.
116
+ job. This feature uses the Active Job `set(wait: n)` functionality.
122
117
 
123
118
  ### Retrying Jobs Based on State
124
119
 
@@ -1,40 +1,27 @@
1
1
  require 'state_machine_job/version'
2
2
  require 'state_machine_job/macro'
3
3
 
4
- require 'resque'
5
- require 'resque/plugins/logger'
6
- require 'resque_logger'
7
-
8
4
  module StateMachineJob
9
- include Resque::Plugins::Logger
10
-
11
- def perform(model_name, id, payload = {})
12
- logger.info "#{self.name} - perform for #{model_name} #{id}"
13
-
14
- record = model_name.constantize.find_by_id(id)
15
-
16
- if record
17
- begin
18
- result = perform_with_result(record, payload)
19
- rescue Exception => e
20
- result = :error
21
-
22
- logger.error "#{self.name} - exception for #{model_name} #{id}: #{e.inspect}"
23
- e.backtrace.each { |line| logger.info(line) }
24
-
25
- raise
26
- ensure
27
- logger.info "#{self.name} - result #{result} for #{model_name} #{id}"
28
- record.send(event_name(result))
29
- end
30
- else
31
- logger.info "#{self.name} - #{model_name} #{id} not found. Skipping job."
5
+ def perform(record, payload = {})
6
+ record_name = "#{record.class.name} #{record.id}"
7
+ logger.info "perform for #{record_name}"
8
+
9
+ begin
10
+ result = perform_with_result(record, payload)
11
+ rescue StandardError
12
+ result = :error
13
+ raise
14
+ ensure
15
+ logger.info "result #{result} for #{record_name}"
16
+ record.send(StateMachineJob.result_method_name(self.class, result))
32
17
  end
33
18
  end
34
19
 
35
- private
20
+ def self.result_event_name(job, result)
21
+ [job.name.underscore.split('/'), result].flatten.join('_').to_sym
22
+ end
36
23
 
37
- def event_name(result)
38
- ([self.name.underscore.split('/'), result].flatten.join('_') + '!').to_sym
24
+ def self.result_method_name(job, result)
25
+ "#{result_event_name(job, result)}!"
39
26
  end
40
27
  end
@@ -1,15 +1,14 @@
1
1
  module StateMachineJob
2
2
  module Macro
3
- def job(job_class, queue = Resque, &block)
4
- Job.new(job_class, self, queue).instance_eval(&block)
3
+ def job(job_class, &block)
4
+ JobDSL.new(job_class, self).instance_eval(&block)
5
5
  end
6
6
 
7
- class Job
8
- def initialize(job, state_machine, queue)
7
+ class JobDSL
8
+ def initialize(job, state_machine)
9
9
  @job = job
10
10
  @state_machine = state_machine
11
- @queue = queue
12
- @payload = lambda do |*args|
11
+ @payload = lambda do |*|
13
12
  {}
14
13
  end
15
14
  end
@@ -38,7 +37,7 @@ module StateMachineJob
38
37
  on_enter_state = @on_enter_state
39
38
 
40
39
  if options[:state]
41
- @state_machine.event(job_result_event_name(job_result)) do
40
+ @state_machine.event(StateMachineJob.result_event_name(@job, job_result)) do
42
41
  if options[:retry_if_state]
43
42
  transition options[:retry_if_state] => on_enter_state
44
43
  end
@@ -46,34 +45,23 @@ module StateMachineJob
46
45
  transition(all => options[:state], :if => options[:if])
47
46
  end
48
47
  elsif options[:retry_after]
49
- @state_machine.define_helper :instance, retry_job_method_name(job_result) do |machine, object|
50
- @queue.enqueue_in(options[:retry_after], @job, object.class.name, object.id, @payload.call(object))
48
+ @state_machine.define_helper :instance, StateMachineJob.result_method_name(@job, job_result) do |_machine, object|
49
+ @job.set(wait: options[:retry_after]).perform_later(object, @payload.call(object))
51
50
  end
52
51
  end
53
52
  end
54
53
 
55
54
  def on_enter(state)
56
- job, state_machine, queue = @job, @state_machine, @queue
57
55
  @on_enter_state = state
58
56
 
59
57
  @state_machine.after_transition @state_machine.any => state do |object|
60
- queue.enqueue(job, object.class.name, object.id, @payload.call(object))
58
+ @job.perform_later(object, @payload.call(object))
61
59
  end
62
60
  end
63
61
 
64
62
  def payload(&block)
65
63
  @payload = block
66
64
  end
67
-
68
- private
69
-
70
- def retry_job_method_name(result)
71
- "#{job_result_event_name(result)}!"
72
- end
73
-
74
- def job_result_event_name(result)
75
- [@job.name.underscore.split('/'), result].flatten.join('_').to_sym
76
- end
77
65
  end
78
66
  end
79
67
  end
@@ -1,3 +1,3 @@
1
1
  module StateMachineJob
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,16 @@
1
- require 'rspec'
1
+ require 'action_controller/railtie'
2
+ require 'rspec/rails'
2
3
 
3
4
  PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
4
5
  $LOAD_PATH << File.join(PROJECT_ROOT, 'lib')
5
6
 
6
7
  require 'active_support/inflector'
8
+ require 'active_model'
9
+ require 'active_job'
7
10
  require 'state_machine'
8
11
  require 'state_machine_job'
9
12
 
10
- Dir[File.join(PROJECT_ROOT, 'spec', 'support', '**', '*.rb')].each { |file| require(file) }
13
+ ActiveJob::Base.logger = Logger.new(nil)
14
+ ActiveJob::Base.queue_adapter = :test
15
+
16
+ GlobalID.app = :test
@@ -1,100 +1,109 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'rspec/rails/matchers/active_job'
4
+ require 'timecop'
5
+
3
6
  module StateMachineJob
4
7
  describe Macro do
5
- class TestJob
8
+ class TestJob < ActiveJob::Base
9
+ include StateMachineJob
6
10
  end
7
11
 
8
- it 'enques job with model name, record id and payload arguments when entering on_enter state' do
9
- queue = double('queue')
10
- model = Class.new do
11
- attr_accessor :some_attribute
12
+ class BaseModel
13
+ include ActiveModel::Model
14
+ include GlobalID::Identification
12
15
 
13
- def initialize(some_attribute)
14
- self.some_attribute = some_attribute
15
- super()
16
- end
16
+ attr_accessor :id
17
17
 
18
- def id
19
- 43
20
- end
18
+ cattr_accessor :instances
21
19
 
22
- state_machine :initial => :idle do
23
- extend StateMachineJob::Macro
20
+ def initialize(*)
21
+ super
22
+ instances[id] = self
23
+ end
24
24
 
25
- state :idle
26
- state :running
27
- state :done
28
- state :failed
25
+ def self.find(id)
26
+ instances.fetch(id.to_i)
27
+ end
28
+ end
29
29
 
30
- event :run do
31
- transition :idle => :running
32
- end
30
+ before do
31
+ BaseModel.instances = {}
32
+ end
33
33
 
34
- job TestJob, queue do
35
- on_enter :running
36
- payload do |record|
37
- {:some_attribute => record.some_attribute}
38
- end
39
- result :ok => :done
34
+ class Model < BaseModel
35
+ attr_accessor :state, :some_attribute
36
+
37
+ state_machine initial: :idle do
38
+ extend StateMachineJob::Macro
39
+
40
+ state :idle
41
+ state :running
42
+ state :done
43
+ state :failed
44
+
45
+ event :run do
46
+ transition idle: :running
47
+ end
48
+
49
+ job TestJob do
50
+ on_enter :running
51
+ payload do |record|
52
+ {some_attribute: record.some_attribute}
40
53
  end
54
+ result ok: :done
41
55
  end
42
56
  end
43
- record = model.new('value')
57
+ end
44
58
 
45
- def model.name
46
- 'Model'
47
- end
59
+ it 'enques job with record and payload arguments when entering on_enter state' do
60
+ record = Model.new(id: 5, some_attribute: 'value')
48
61
 
49
- expect(queue).to receive(:enqueue).with(TestJob, 'Model', 43, {:some_attribute => 'value'})
50
62
  record.run
51
- end
52
63
 
53
- it 'enques job after retry time with model name, record id and payload arguments when retry after result event is invoked' do
54
- queue = double('queue')
55
- model = Class.new do
56
- attr_accessor :some_attribute
64
+ expect(TestJob).to have_been_enqueued.with(record, some_attribute: 'value')
65
+ end
57
66
 
58
- def initialize(some_attribute)
59
- self.some_attribute = some_attribute
60
- super()
61
- end
67
+ class ModelWithRetry < BaseModel
68
+ attr_accessor :state, :some_attribute
62
69
 
63
- def id
64
- 43
65
- end
70
+ state_machine initial: :idle do
71
+ extend StateMachineJob::Macro
66
72
 
67
- state_machine :initial => :idle do
68
- extend StateMachineJob::Macro
73
+ state :idle
74
+ state :running
75
+ state :done
76
+ state :failed
69
77
 
70
- state :idle
71
- state :running
72
- state :done
73
- state :failed
78
+ event :run do
79
+ transition idle: :running
80
+ end
74
81
 
75
- job TestJob, queue do
76
- on_enter :running
77
- payload do |record|
78
- {:some_attribute => record.some_attribute}
79
- end
80
- result :failed, :retry_after => 60
81
- result :ok => :done
82
+ job TestJob do
83
+ on_enter :running
84
+ payload do |record|
85
+ {some_attribute: record.some_attribute}
82
86
  end
87
+ result ok: :done
88
+ result :failed, retry_after: 60
83
89
  end
84
90
  end
85
- record = model.new('value')
91
+ end
86
92
 
87
- def model.name
88
- 'Model'
89
- end
93
+ it 'enques job after retry time with record and payload when result event is invoked' do
94
+ Timecop.freeze do
95
+ record = ModelWithRetry.new(id: 5, some_attribute: 'value')
96
+
97
+ record.state_machine_job_test_job_failed!
90
98
 
91
- expect(queue).to receive(:enqueue_in).with(60, TestJob, 'Model', 43, {:some_attribute => 'value'})
92
- record.state_machine_job_test_job_failed!
99
+ expect(TestJob).to have_been_enqueued
100
+ .at(60.seconds.from_now).with(record, some_attribute: 'value')
101
+ end
93
102
  end
94
103
 
95
104
  it 'has event for job result which transitions to result state' do
96
105
  object = Class.new do
97
- state_machine :initial => :idle do
106
+ state_machine initial: :idle do
98
107
  extend StateMachineJob::Macro
99
108
 
100
109
  state :idle
@@ -103,12 +112,12 @@ module StateMachineJob
103
112
  state :failed
104
113
 
105
114
  event :run do
106
- transition :idle => :running
115
+ transition idle: :running
107
116
  end
108
117
 
109
118
  job TestJob do
110
119
  on_enter :running
111
- result :ok => :done
120
+ result ok: :done
112
121
  end
113
122
  end
114
123
  end.new
@@ -121,7 +130,7 @@ module StateMachineJob
121
130
 
122
131
  it 'result supports state option signature' do
123
132
  object = Class.new do
124
- state_machine :initial => :idle do
133
+ state_machine initial: :idle do
125
134
  extend StateMachineJob::Macro
126
135
 
127
136
  state :idle
@@ -129,12 +138,12 @@ module StateMachineJob
129
138
  state :done
130
139
 
131
140
  event :run do
132
- transition :idle => :running
141
+ transition idle: :running
133
142
  end
134
143
 
135
144
  job TestJob do
136
145
  on_enter :running
137
- result :ok, :state => :done
146
+ result :ok, state: :done
138
147
  end
139
148
  end
140
149
  end.new
@@ -148,12 +157,12 @@ module StateMachineJob
148
157
  it 'result raises descriptive error when trying to use hash only signature with additional options' do
149
158
  expect {
150
159
  Class.new do
151
- state_machine :initial => :idle do
160
+ state_machine initial: :idle do
152
161
  extend StateMachineJob::Macro
153
162
 
154
163
  job TestJob do
155
164
  on_enter :running
156
- result :ok => :done, :if => true
165
+ result ok: :done, if: true
157
166
  end
158
167
  end
159
168
  end
@@ -162,13 +171,8 @@ module StateMachineJob
162
171
 
163
172
  describe ':if option' do
164
173
  it 'allows skipping matching results' do
165
- queue = double('queue')
166
174
  object = Class.new do
167
- def id
168
- 43
169
- end
170
-
171
- state_machine :initial => :idle do
175
+ state_machine initial: :idle do
172
176
  extend StateMachineJob::Macro
173
177
 
174
178
  state :idle
@@ -177,13 +181,13 @@ module StateMachineJob
177
181
  state :other
178
182
 
179
183
  event :run do
180
- transition :idle => :running
184
+ transition idle: :running
181
185
  end
182
186
 
183
- job TestJob, queue do
187
+ job TestJob do
184
188
  on_enter :running
185
- result :ok, :state => :done, :if => lambda { false }
186
- result :ok, :state => :other
189
+ result :ok, state: :done, if: -> { false }
190
+ result :ok, state: :other
187
191
  end
188
192
  end
189
193
  end.new
@@ -195,13 +199,8 @@ module StateMachineJob
195
199
  end
196
200
 
197
201
  it 'uses matching results if condition is truthy' do
198
- queue = double('queue')
199
202
  object = Class.new do
200
- def id
201
- 43
202
- end
203
-
204
- state_machine :initial => :idle do
203
+ state_machine initial: :idle do
205
204
  extend StateMachineJob::Macro
206
205
 
207
206
  state :idle
@@ -210,13 +209,13 @@ module StateMachineJob
210
209
  state :other
211
210
 
212
211
  event :run do
213
- transition :idle => :running
212
+ transition idle: :running
214
213
  end
215
214
 
216
- job TestJob, queue do
215
+ job TestJob do
217
216
  on_enter :running
218
- result :ok, :state => :done, :if => lambda { true }
219
- result :ok, :state => :other
217
+ result :ok, state: :done, if: -> { true }
218
+ result :ok, state: :other
220
219
  end
221
220
  end
222
221
  end.new
@@ -230,12 +229,12 @@ module StateMachineJob
230
229
  it 'raises descriptive error when used in combination with :retry_after option' do
231
230
  expect {
232
231
  Class.new do
233
- state_machine :initial => :idle do
232
+ state_machine initial: :idle do
234
233
  extend StateMachineJob::Macro
235
234
 
236
235
  job TestJob do
237
236
  on_enter :running
238
- result :ok, :state => :done, :if => true, :retry_after => 100
237
+ result :ok, state: :done, if: true, retry_after: 100
239
238
  end
240
239
  end
241
240
  end
@@ -244,34 +243,31 @@ module StateMachineJob
244
243
  end
245
244
 
246
245
  describe ':retry_if_state option' do
247
- it 'returns to on_enter state if state matches option when job finishes' do
248
- queue = double('queue')
249
- object = Class.new do
250
- def id
251
- 43
252
- end
246
+ class ModelWithRetryIfState < BaseModel
247
+ attr_accessor :state, :some_attribute
253
248
 
254
- state_machine :initial => :idle do
255
- extend StateMachineJob::Macro
249
+ state_machine initial: :idle do
250
+ extend StateMachineJob::Macro
256
251
 
257
- state :idle
258
- state :running
259
- state :done
260
- state :failed
252
+ state :idle
253
+ state :running
254
+ state :done
255
+ state :failed
261
256
 
262
- event :run do
263
- transition :idle => :running
264
- transition :running => :rerun_required
265
- end
257
+ event :run do
258
+ transition idle: :running
259
+ transition running: :rerun_required
260
+ end
266
261
 
267
- job TestJob, queue do
268
- on_enter :running
269
- result :ok, :state => :done, :retry_if_state => :rerun_required
270
- end
262
+ job TestJob do
263
+ on_enter :running
264
+ result :ok, state: :done, retry_if_state: :rerun_required
271
265
  end
272
- end.new
266
+ end
267
+ end
273
268
 
274
- expect(queue).to receive(:enqueue).with(TestJob, nil, 43, {})
269
+ it 'returns to on_enter state if state matches option when job finishes' do
270
+ object = ModelWithRetryIfState.new(id: 43)
275
271
 
276
272
  object.state = :running
277
273
  object.run
@@ -281,31 +277,7 @@ module StateMachineJob
281
277
  end
282
278
 
283
279
  it 'returns to result state if state does not match option when job finishes' do
284
- queue = double('queue')
285
- object = Class.new do
286
- def id
287
- 43
288
- end
289
-
290
- state_machine :initial => :idle do
291
- extend StateMachineJob::Macro
292
-
293
- state :idle
294
- state :running
295
- state :done
296
- state :failed
297
-
298
- event :run do
299
- transition :idle => :running
300
- transition :running => :rerun_required
301
- end
302
-
303
- job TestJob, queue do
304
- on_enter :running
305
- result :ok, :state => :done, :retry_if_state => :rerun_required
306
- end
307
- end
308
- end.new
280
+ object = ModelWithRetryIfState.new(id: 43)
309
281
 
310
282
  object.state = :running
311
283
  object.state_machine_job_test_job_ok
@@ -316,11 +288,11 @@ module StateMachineJob
316
288
  it 'raises descriptive error when on_enter is used after result' do
317
289
  expect {
318
290
  Class.new do
319
- state_machine :initial => :idle do
291
+ state_machine initial: :idle do
320
292
  extend StateMachineJob::Macro
321
293
 
322
294
  job TestJob do
323
- result :ok, :state => :done, :retry_if_state => :rerun_required
295
+ result :ok, state: :done, retry_if_state: :rerun_required
324
296
  on_enter :running
325
297
  end
326
298
  end
@@ -331,12 +303,12 @@ module StateMachineJob
331
303
  it 'raises descriptive error when used in combination with :retry_after option' do
332
304
  expect {
333
305
  Class.new do
334
- state_machine :initial => :idle do
306
+ state_machine initial: :idle do
335
307
  extend StateMachineJob::Macro
336
308
 
337
309
  job TestJob do
338
310
  on_enter :running
339
- result :ok, :state => :done, :retry_if_state => :rerun_required, :retry_after => 100
311
+ result :ok, state: :done, retry_if_state: :rerun_required, retry_after: 100
340
312
  end
341
313
  end
342
314
  end
@@ -347,11 +319,11 @@ module StateMachineJob
347
319
  it 'does not raise exception if on_enter is used after result without :retry_if_state option' do
348
320
  expect {
349
321
  Class.new do
350
- state_machine :initial => :idle do
322
+ state_machine initial: :idle do
351
323
  extend StateMachineJob::Macro
352
324
 
353
325
  job TestJob do
354
- result :ok, :state => :done
326
+ result :ok, state: :done
355
327
  on_enter :running
356
328
  end
357
329
  end
@@ -1,118 +1,64 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe StateMachineJob do
4
- class TestQueue
5
- def enqueue(job, *args)
6
- job.perform(*args)
7
- end
4
+ class TestJob < ActiveJob::Base
5
+ include StateMachineJob
8
6
 
9
- def self.instance
10
- @instance ||= TestQueue.new
11
- end
7
+ def perform_with_result(record, payload); end
12
8
  end
13
9
 
14
- class TestJob1
15
- @queue = 'test_job_1'
16
- extend StateMachineJob
17
- end
10
+ class Model
11
+ def id
12
+ 3
13
+ end
14
+
15
+ def test_job_ok!; end
18
16
 
19
- class TestJob2
20
- @queue = 'test_job_2'
21
- extend StateMachineJob
17
+ def test_job_error!; end
22
18
  end
23
19
 
24
20
  class SomeError < StandardError; end
25
21
 
26
- class Model
27
- state_machine :initial => :idle do
28
- extend StateMachineJob::Macro
29
-
30
- state :idle
31
- state :first_running
32
- state :second_running
33
- state :done
34
- state :failed
35
-
36
- event :run do
37
- transition :idle => :first_running
38
- end
39
-
40
- job TestJob1, TestQueue.instance do
41
- on_enter :first_running
42
- payload do |object|
43
- {:n => 1}
44
- end
45
- result :ok => :second_running
46
- result :error => :failed
47
- end
48
-
49
- job TestJob2, TestQueue.instance do
50
- on_enter :second_running
51
- payload do |object|
52
- {:n => 2}
53
- end
54
- result :ok => :done
55
- result :error => :failed
56
- end
57
- end
58
- end
59
-
60
- it 'calls find on model and passes record and payload to perform_with_result method' do
61
- model = Model.new
22
+ it 'passes record and payload to perform_with_result method' do
23
+ record = Model.new
24
+ payload = {n: 1}
25
+ job = TestJob.new
62
26
 
63
- allow(model).to receive(:id).and_return(5)
64
- allow(Model).to receive(:find_by_id).and_return(model)
65
- expect(TestJob1).to receive(:perform_with_result).with(model, {:n => 1}).and_return(:ok)
66
- expect(TestJob2).to receive(:perform_with_result).with(model, {:n => 2}).and_return(:ok)
27
+ expect(job).to receive(:perform_with_result)
28
+ .with(record, payload).and_return(:ok)
67
29
 
68
- model.run
30
+ job.perform(record, payload)
69
31
  end
70
32
 
71
33
  it 'invokes job result event on record' do
72
- model = Model.new
34
+ record = Model.new
35
+ job = TestJob.new
73
36
 
74
- allow(model).to receive(:id).and_return(5)
75
- allow(Model).to receive(:find_by_id).and_return(model)
76
- allow(TestJob1).to receive(:perform_with_result).and_return(:ok)
77
- allow(TestJob2).to receive(:perform_with_result).and_return(:ok)
37
+ allow(job).to receive(:perform_with_result).and_return(:ok)
38
+ expect(record).to receive(:test_job_ok!)
78
39
 
79
- expect(model).to receive(:test_job1_ok!)
80
-
81
- model.run
40
+ job.perform(record)
82
41
  end
83
42
 
84
43
  it 'lets exception bubble raised by perform_with_result' do
85
- model = Model.new
44
+ record = Model.new
45
+ job = TestJob.new
86
46
 
87
- allow(model).to receive(:id).and_return(5)
88
- allow(Model).to receive(:find_by_id).and_return(model)
89
- allow(TestJob1).to receive(:perform_with_result).and_raise(SomeError)
47
+ allow(job).to receive(:perform_with_result).and_raise(SomeError)
90
48
 
91
- expect {
92
- model.run
93
- }.to raise_error(SomeError)
49
+ expect { job.perform(record) }.to raise_error(SomeError)
94
50
  end
95
51
 
96
52
  it 'invokes error job result event on record if perform_with_result raises' do
97
- model = Model.new
98
-
99
- allow(model).to receive(:id).and_return(5)
100
- allow(Model).to receive(:find_by_id).and_return(model)
101
- allow(TestJob1).to receive(:perform_with_result).and_raise(SomeError)
53
+ record = Model.new
54
+ job = TestJob.new
102
55
 
103
- expect(model).to receive(:test_job1_error!)
56
+ allow(job).to receive(:perform_with_result).and_raise(SomeError)
57
+ expect(record).to receive(:test_job_error!)
104
58
 
105
59
  begin
106
- model.run
107
- rescue SomeError
60
+ job.perform(record)
61
+ rescue SomeError # rubocop:disable Lint/HandleExceptions
108
62
  end
109
63
  end
110
-
111
- it 'job is skipped if record cannot be found' do
112
- allow(Model).to receive(:find_by_id).and_return(nil)
113
-
114
- expect {
115
- TestJob1.perform(Model.name, -1, {})
116
- }.not_to raise_exception
117
- end
118
64
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = StateMachineJob::VERSION
9
9
  spec.authors = ["Codevise Solutions Ltd."]
10
10
  spec.email = ["info@codevise.de"]
11
- spec.description = %q{State Machine + Resque.}
12
- spec.summary = %q{Resque jobs class for rails state machines.}
11
+ spec.description = %q{State Machine + Active Job}
12
+ spec.summary = %q{Trigger jobs via Rails state machines.}
13
13
  spec.homepage = "http://github.com/codevise/state_machine_job"
14
14
  spec.licenses = ['MIT']
15
15
 
@@ -20,11 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.3'
22
22
  spec.add_development_dependency 'rake', '< 13'
23
- spec.add_development_dependency 'rspec', '~> 3.6'
24
- spec.add_development_dependency 'activesupport', '< 5'
23
+ spec.add_development_dependency 'rspec-rails', '~> 3.7'
24
+ spec.add_development_dependency 'activesupport', '< 6'
25
+ spec.add_development_dependency 'activemodel', '< 6'
25
26
  spec.add_development_dependency 'semmy', '~> 1.0'
27
+ spec.add_development_dependency 'timecop', '~> 0.9.1'
26
28
 
27
- spec.add_runtime_dependency 'resque', '~> 1.25'
28
- spec.add_runtime_dependency 'resque-logger', '~> 0.2.0'
29
+ spec.add_runtime_dependency 'activejob', ['>= 4.2', '< 6']
29
30
  spec.add_runtime_dependency 'state_machine', '~> 1.2'
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_machine_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Codevise Solutions Ltd.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-02 00:00:00.000000000 Z
11
+ date: 2018-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,33 +39,47 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '13'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rspec-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.6'
47
+ version: '3.7'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.6'
54
+ version: '3.7'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: activesupport
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "<"
60
60
  - !ruby/object:Gem::Version
61
- version: '5'
61
+ version: '6'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "<"
67
67
  - !ruby/object:Gem::Version
68
- version: '5'
68
+ version: '6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activemodel
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "<"
74
+ - !ruby/object:Gem::Version
75
+ version: '6'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '6'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: semmy
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -81,33 +95,39 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '1.0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: resque
98
+ name: timecop
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '1.25'
90
- type: :runtime
103
+ version: 0.9.1
104
+ type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '1.25'
110
+ version: 0.9.1
97
111
  - !ruby/object:Gem::Dependency
98
- name: resque-logger
112
+ name: activejob
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: 0.2.0
117
+ version: '4.2'
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '6'
104
121
  type: :runtime
105
122
  prerelease: false
106
123
  version_requirements: !ruby/object:Gem::Requirement
107
124
  requirements:
108
- - - "~>"
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '4.2'
128
+ - - "<"
109
129
  - !ruby/object:Gem::Version
110
- version: 0.2.0
130
+ version: '6'
111
131
  - !ruby/object:Gem::Dependency
112
132
  name: state_machine
113
133
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +142,7 @@ dependencies:
122
142
  - - "~>"
123
143
  - !ruby/object:Gem::Version
124
144
  version: '1.2'
125
- description: State Machine + Resque.
145
+ description: State Machine + Active Job
126
146
  email:
127
147
  - info@codevise.de
128
148
  executables: []
@@ -142,7 +162,6 @@ files:
142
162
  - spec/spec_helper.rb
143
163
  - spec/state_machine_job/macro_spec.rb
144
164
  - spec/state_machine_job_spec.rb
145
- - spec/support/setup_resque_logger.rb
146
165
  - state_machine_job.gemspec
147
166
  homepage: http://github.com/codevise/state_machine_job
148
167
  licenses:
@@ -164,12 +183,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
183
  version: '0'
165
184
  requirements: []
166
185
  rubyforge_project:
167
- rubygems_version: 2.6.8
186
+ rubygems_version: 2.7.5
168
187
  signing_key:
169
188
  specification_version: 4
170
- summary: Resque jobs class for rails state machines.
189
+ summary: Trigger jobs via Rails state machines.
171
190
  test_files:
172
191
  - spec/spec_helper.rb
173
192
  - spec/state_machine_job/macro_spec.rb
174
193
  - spec/state_machine_job_spec.rb
175
- - spec/support/setup_resque_logger.rb
@@ -1,11 +0,0 @@
1
- require 'resque_logger'
2
-
3
- log_dir = 'spec/tmp/log'
4
- FileUtils.mkdir_p(log_dir)
5
-
6
- Resque.logger_config = {
7
- folder: log_dir,
8
- class_name: Logger,
9
- level: Logger::INFO,
10
- formatter: Logger::Formatter.new
11
- }