state_machine_job 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWUyMDg1Yjc1ZWUzNjE4NWMyNDliMjBiMGFlYzkyMDFkMzZhNTFmNg==
5
+ data.tar.gz: !binary |-
6
+ NWU5ZGNjN2IzOWE1NGVmMzU5MTEyNGZjOTMyMGM3NzQ2MTQ3Y2NmNQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MTUxMGEyOTVjYWE1Mzk1YzdiZjJmMDAxZmJkZjlmNTA4YWFmMTJjNTBlOTY0
10
+ MzA1MGM3ZGRmYjQyODMzMjkzYWVmMjAxYzlkNjExODQ0ZDFjZjliMzZlNmRh
11
+ ZDM1NWE2NjhiODY5YWYwOWZkYzRmYzM1NmEwNmNjNDEzZjkwNWM=
12
+ data.tar.gz: !binary |-
13
+ ZDdkZGFhZWU1MTdkMzkxOWNhMWEwNTcyZjRlY2QzMWIzOTkxODY4MjczZmFl
14
+ MjE1YmI5ODY0Mzc1NWY4NzQxOGE4MGY5MTAzNjVmZTk5YTFiMDdlMDI4Njhi
15
+ NWM5ZmYyMDFhNGU5MmE1NjBlNTFiODhkMjNhNjNhYTJjOTEzYTg=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ spec/tmp
16
+ spec/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.9.3
3
+
4
+ script: "bundle exec rspec"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in state_machine_job.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Codevise Solutions
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # State Machine Job
2
+
3
+ Enqueue resque jobs on state machine transitions and change state
4
+ according to job result.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'state_machine_job'
11
+
12
+ ## Usage
13
+
14
+ Extend your resque job with the `StateMachineJob` mixin and provide a
15
+ `perform_with_result` class method instead of the normal `perform`
16
+ method:
17
+
18
+ class SomeJob
19
+ extend StateMachineJob
20
+
21
+ def self.perform_with_result(record, payload)
22
+ # do something
23
+ :ok
24
+ end
25
+ end
26
+
27
+ The `record` parameter is a reference to the object the state machine
28
+ will be defined on.
29
+
30
+ Now you can wire up the job in a state machine using the
31
+ `StateMachineJob::Macro`:
32
+
33
+ state_machine :initial => 'idle' do
34
+ extend StateMachineJob::Macro
35
+
36
+ state 'idle'
37
+ state 'running'
38
+ state 'done'
39
+ state 'failed'
40
+
41
+ event :run do
42
+ transition 'idle' => "running"
43
+ end
44
+
45
+ job SomeJob do
46
+ on_enter 'running'
47
+
48
+ payload do |record|
49
+ {:some_attribute => record.some_attribute}
50
+ end
51
+
52
+ result :ok => 'done'
53
+ result :error => 'failed'
54
+ end
55
+ end
56
+
57
+ When the `state` attribute changes to `'running'` (either by the `run`
58
+ event or by manually updateing the attribute), `SomeJob` will
59
+ automatically be enqueued. If `perform_with_result` returns `:ok`, the
60
+ state machine transitions to the `'done'` state. You can specify as
61
+ many results as you want. Note that any exception raised by
62
+ `perform_with_result` is rescued and translated to the result
63
+ `:error`.
64
+
65
+ ### Passing custom Payload
66
+
67
+ You can specify further options to pass to the `perform_with_result`
68
+ method using the `payload` method:
69
+
70
+ job SomeJob do
71
+ on_enter 'running'
72
+
73
+ payload do |record|
74
+ {:some_attribute => record.some_attribute}
75
+ end
76
+
77
+ result :ok => 'done'
78
+ result :error => 'failed'
79
+ end
80
+
81
+ `perform_with_result` is now called with the given hash of options as
82
+ the second parameter.
83
+
84
+ ### Retrying Jobs
85
+
86
+ You can tell the state machine to retry a job based on its result:
87
+
88
+ job SomeJob do
89
+ on_enter 'running'
90
+
91
+ result :ok => 'done'
92
+ result :pending, :retry_after => 2.minutes
93
+ result :error => 'failed'
94
+ end
95
+
96
+ When `perform_with_result` returns the result `:pending`, the state
97
+ machine will remain in the `runnning` state and enqueue a delayed
98
+ job. This functionality requires the `resque-scheduler` gem.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,37 @@
1
+ require 'state_machine_job/version'
2
+ require 'state_machine_job/macro'
3
+
4
+ require 'resque'
5
+ require 'resque/plugins/logger'
6
+ require 'resque_logger'
7
+
8
+ 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
+ result =
18
+ begin
19
+ perform_with_result(record, payload)
20
+ rescue Exception => e
21
+ logger.error "#{self.name} - exception for #{model_name} #{id}: #{e.inspect}"
22
+ :error
23
+ end
24
+
25
+ logger.info "#{self.name} - result #{result} for #{model_name} #{id}"
26
+ record.send(event_name(result))
27
+ else
28
+ logger.info "#{self.name} - #{model_name} #{id} not found. Skipping job."
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def event_name(result)
35
+ ([self.name.underscore.split('/'), result].flatten.join('_') + '!').to_sym
36
+ end
37
+ end
@@ -0,0 +1,56 @@
1
+ module StateMachineJob
2
+ module Macro
3
+ def job(job_class, queue = Resque, &block)
4
+ Job.new(job_class, self, queue).instance_eval(&block)
5
+ end
6
+
7
+ class Job
8
+ def initialize(job, state_machine, queue)
9
+ @job = job
10
+ @state_machine = state_machine
11
+ @queue = queue
12
+ @payload = lambda do |*args|
13
+ {}
14
+ end
15
+ end
16
+
17
+ def result(job_result, options = {})
18
+ if job_result.is_a?(Hash)
19
+ return result(job_result.first.first, :state => job_result.first.last)
20
+ end
21
+
22
+ if options[:state]
23
+ @state_machine.event(job_result_event_name(job_result)) do
24
+ transition any => options[:state]
25
+ end
26
+ elsif options[:retry_after]
27
+ @state_machine.define_helper :instance, retry_job_method_name(job_result) do |machine, object|
28
+ @queue.enqueue_in(options[:retry_after], @job, object.class.name, object.id, @payload.call(object))
29
+ end
30
+ end
31
+ end
32
+
33
+ def on_enter(state)
34
+ job, state_machine, queue = @job, @state_machine, @queue
35
+
36
+ @state_machine.after_transition @state_machine.any => state do |object|
37
+ queue.enqueue(job, object.class.name, object.id, @payload.call(object))
38
+ end
39
+ end
40
+
41
+ def payload(&block)
42
+ @payload = block
43
+ end
44
+
45
+ private
46
+
47
+ def retry_job_method_name(result)
48
+ "#{job_result_event_name(result)}!"
49
+ end
50
+
51
+ def job_result_event_name(result)
52
+ [@job.name.underscore.split('/'), result].flatten.join('_').to_sym
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ module StateMachineJob
2
+ VERSION = "0.0.5"
3
+ end
@@ -0,0 +1,10 @@
1
+ require 'rspec'
2
+
3
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
4
+ $LOAD_PATH << File.join(PROJECT_ROOT, 'lib')
5
+
6
+ require 'active_support/inflector'
7
+ require 'state_machine'
8
+ require 'state_machine_job'
9
+
10
+ Dir[File.join(PROJECT_ROOT, 'spec', 'support', '**', '*.rb')].each { |file| require(file) }
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ module StateMachineJob
4
+ describe Macro do
5
+ class TestJob
6
+ end
7
+
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
+
13
+ def initialize(some_attribute)
14
+ self.some_attribute = some_attribute
15
+ super()
16
+ end
17
+
18
+ def id
19
+ 43
20
+ end
21
+
22
+ state_machine :initial => :idle do
23
+ extend StateMachineJob::Macro
24
+
25
+ state :idle
26
+ state :running
27
+ state :done
28
+ state :failed
29
+
30
+ event :run do
31
+ transition :idle => :running
32
+ end
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
40
+ end
41
+ end
42
+ end
43
+ record = model.new('value')
44
+
45
+ def model.name
46
+ 'Model'
47
+ end
48
+
49
+ expect(queue).to receive(:enqueue).with(TestJob, 'Model', 43, {:some_attribute => 'value'})
50
+ record.run
51
+ end
52
+
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
57
+
58
+ def initialize(some_attribute)
59
+ self.some_attribute = some_attribute
60
+ super()
61
+ end
62
+
63
+ def id
64
+ 43
65
+ end
66
+
67
+ state_machine :initial => :idle do
68
+ extend StateMachineJob::Macro
69
+
70
+ state :idle
71
+ state :running
72
+ state :done
73
+ state :failed
74
+
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
+ end
83
+ end
84
+ end
85
+ record = model.new('value')
86
+
87
+ def model.name
88
+ 'Model'
89
+ end
90
+
91
+ expect(queue).to receive(:enqueue_in).with(60, TestJob, 'Model', 43, {:some_attribute => 'value'})
92
+ record.state_machine_job_test_job_failed!
93
+ end
94
+
95
+ it 'has event for job result which transitions to result state' do
96
+ object = Class.new do
97
+ state_machine :initial => :idle do
98
+ extend StateMachineJob::Macro
99
+
100
+ state :idle
101
+ state :running
102
+ state :done
103
+ state :failed
104
+
105
+ event :run do
106
+ transition :idle => :running
107
+ end
108
+
109
+ job TestJob do
110
+ on_enter :running
111
+ result :ok => :done
112
+ end
113
+ end
114
+ end.new
115
+
116
+ object.state = :running
117
+ object.state_machine_job_test_job_ok
118
+
119
+ expect(object.state).to eq('done')
120
+ end
121
+
122
+ it 'result supports state option signature' do
123
+ object = Class.new do
124
+ state_machine :initial => :idle do
125
+ extend StateMachineJob::Macro
126
+
127
+ state :idle
128
+ state :running
129
+ state :done
130
+
131
+ event :run do
132
+ transition :idle => :running
133
+ end
134
+
135
+ job TestJob do
136
+ on_enter :running
137
+ result :ok, :state => :done
138
+ end
139
+ end
140
+ end.new
141
+
142
+ object.state = :running
143
+ object.state_machine_job_test_job_ok
144
+
145
+ expect(object.state).to eq('done')
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe StateMachineJob do
4
+ class TestQueue
5
+ def enqueue(job, *args)
6
+ job.perform(*args)
7
+ end
8
+
9
+ def self.instance
10
+ @instance ||= TestQueue.new
11
+ end
12
+ end
13
+
14
+ class TestJob1
15
+ @queue = 'test_job_1'
16
+ extend StateMachineJob
17
+ end
18
+
19
+ class TestJob2
20
+ @queue = 'test_job_2'
21
+ extend StateMachineJob
22
+ end
23
+
24
+ class Model
25
+ state_machine :initial => :idle do
26
+ extend StateMachineJob::Macro
27
+
28
+ state :idle
29
+ state :first_running
30
+ state :second_running
31
+ state :done
32
+
33
+ event :run do
34
+ transition :idle => :first_running
35
+ end
36
+
37
+ job TestJob1, TestQueue.instance do
38
+ on_enter :first_running
39
+ payload do |object|
40
+ {:n => 1}
41
+ end
42
+ result :ok => :second_running
43
+ end
44
+
45
+ job TestJob2, TestQueue.instance do
46
+ on_enter :second_running
47
+ payload do |object|
48
+ {:n => 2}
49
+ end
50
+ result :ok => :done
51
+ end
52
+ end
53
+ end
54
+
55
+ it 'calls find on model and passes record and payload to perform_with_result method' do
56
+ model = Model.new
57
+
58
+ allow(model).to receive(:id).and_return(5)
59
+ allow(Model).to receive(:find_by_id).and_return(model)
60
+ expect(TestJob1).to receive(:perform_with_result).with(model, {:n => 1}).and_return(:ok)
61
+ expect(TestJob2).to receive(:perform_with_result).with(model, {:n => 2}).and_return(:ok)
62
+
63
+ model.run
64
+ end
65
+
66
+ it 'invokes job result event on record' do
67
+ model = Model.new
68
+
69
+ allow(model).to receive(:id).and_return(5)
70
+ allow(Model).to receive(:find_by_id).and_return(model)
71
+ allow(TestJob1).to receive(:perform_with_result).and_return(:ok)
72
+ allow(TestJob2).to receive(:perform_with_result).and_return(:ok)
73
+
74
+ expect(model).to receive(:test_job1_ok!)
75
+
76
+ model.run
77
+ end
78
+
79
+ it 'job is skipped if record cannot be found' do
80
+ allow(Model).to receive(:find_by_id).and_return(nil)
81
+
82
+ expect {
83
+ TestJob1.perform(Model.name, -1, {})
84
+ }.not_to raise_exception
85
+ end
86
+ end
@@ -0,0 +1,11 @@
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
+ }
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'state_machine_job/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "state_machine_job"
8
+ spec.version = StateMachineJob::VERSION
9
+ spec.authors = ["Codevise Solutions Ltd."]
10
+ spec.email = ["info@codevise.de"]
11
+ spec.description = %q{State Machine + Resque.}
12
+ spec.summary = %q{Resque jobs class for rails state machines.}
13
+ spec.homepage = "http://github.com/codevise/state_machine_job"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.3'
21
+ spec.add_development_dependency 'gem_tasks'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'ci_reporter'
24
+ spec.add_development_dependency 'rspec'
25
+ spec.add_development_dependency 'activesupport'
26
+
27
+ spec.add_runtime_dependency 'resque'
28
+ spec.add_runtime_dependency 'resque-logger'
29
+ spec.add_runtime_dependency 'state_machine'
30
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: state_machine_job
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Codevise Solutions Ltd.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ type: :development
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: gem_tasks
29
+ type: :development
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ type: :development
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ci_reporter
57
+ type: :development
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ type: :development
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ type: :development
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: resque
99
+ type: :runtime
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: resque-logger
113
+ type: :runtime
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: state_machine
127
+ type: :runtime
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: State Machine + Resque.
140
+ email:
141
+ - info@codevise.de
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - .gitignore
147
+ - .travis.yml
148
+ - Gemfile
149
+ - LICENSE.txt
150
+ - README.md
151
+ - Rakefile
152
+ - lib/state_machine_job.rb
153
+ - lib/state_machine_job/macro.rb
154
+ - lib/state_machine_job/version.rb
155
+ - spec/spec_helper.rb
156
+ - spec/state_machine_job/macro_spec.rb
157
+ - spec/state_machine_job_spec.rb
158
+ - spec/support/setup_resque_logger.rb
159
+ - state_machine_job.gemspec
160
+ homepage: http://github.com/codevise/state_machine_job
161
+ licenses: []
162
+ metadata: {}
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.1.11
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: Resque jobs class for rails state machines.
183
+ test_files:
184
+ - spec/spec_helper.rb
185
+ - spec/state_machine_job/macro_spec.rb
186
+ - spec/state_machine_job_spec.rb
187
+ - spec/support/setup_resque_logger.rb