rails-workflow 1.4.4.4 → 1.4.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.yardopts +1 -1
- data/README.markdown +4 -664
- data/lib/active_support/overloads.rb +32 -0
- data/lib/workflow.rb +31 -37
- data/lib/workflow/callbacks.rb +5 -5
- data/lib/workflow/callbacks/{transition_callback_wrapper.rb → transition_callback.rb} +23 -23
- data/lib/workflow/callbacks/transition_callbacks/method_wrapper.rb +102 -0
- data/lib/workflow/callbacks/transition_callbacks/proc_wrapper.rb +48 -0
- data/lib/workflow/event.rb +55 -12
- data/lib/workflow/specification.rb +6 -6
- data/lib/workflow/state.rb +38 -10
- data/lib/workflow/version.rb +1 -1
- data/rails-workflow.gemspec +1 -1
- metadata +7 -5
- data/lib/workflow/callbacks/transition_callback_method_wrapper.rb +0 -65
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'workflow/state'
|
2
2
|
require 'workflow/event'
|
3
3
|
require 'workflow/errors'
|
4
|
-
require 'active_support/callbacks'
|
5
4
|
|
6
5
|
module Workflow
|
7
6
|
# Metadata object describing available states and state transitions.
|
@@ -51,13 +50,14 @@ module Workflow
|
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
53
|
+
# Find the state with the given name.
|
54
|
+
#
|
55
|
+
# @param [Symbol] name Name of state to find.
|
56
|
+
# @return [Workflow::State] The state with the given name.
|
54
57
|
def find_state(name)
|
55
58
|
states.find{|t| t.name == name.to_sym}
|
56
59
|
end
|
57
60
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
61
|
# @api private
|
62
62
|
#
|
63
63
|
# @param [Hash] meta Metadata
|
@@ -79,7 +79,7 @@ module Workflow
|
|
79
79
|
# @return [nil]
|
80
80
|
def state(name, meta: {}, &events)
|
81
81
|
name = name.to_sym
|
82
|
-
new_state = Workflow::State.new(name,
|
82
|
+
new_state = Workflow::State.new(name, @states.length, meta: meta)
|
83
83
|
@initial_state ||= new_state
|
84
84
|
@states << new_state
|
85
85
|
new_state.instance_eval(&events) if block_given?
|
@@ -110,7 +110,7 @@ module Workflow
|
|
110
110
|
# workflow do
|
111
111
|
# define_revert_events!
|
112
112
|
# state :foo do
|
113
|
-
#
|
113
|
+
# on :bar, to: :bax
|
114
114
|
# end
|
115
115
|
# state :bax
|
116
116
|
# end
|
data/lib/workflow/state.rb
CHANGED
@@ -1,14 +1,30 @@
|
|
1
1
|
module Workflow
|
2
|
+
# Represents one state for the defined workflow,
|
3
|
+
# with a list of {Workflow::Event}s that can transition to
|
4
|
+
# other states.
|
2
5
|
class State
|
3
6
|
include Comparable
|
4
7
|
|
5
|
-
|
6
|
-
|
8
|
+
# @!attribute [r] name
|
9
|
+
# @return [Symbol] The name of the state.
|
10
|
+
# @!attribute [r] events
|
11
|
+
# @return [Array] Array of {Workflow::Event}s defined for this state.
|
12
|
+
# @!attribute [r] meta
|
13
|
+
# @return [Hash] Extra information defined for this state.
|
14
|
+
attr_reader :name, :events, :meta
|
7
15
|
|
8
|
-
|
16
|
+
# @api private
|
17
|
+
# For creating {Workflow::State} objects please see {Specification#state}
|
18
|
+
# @param [Symbol] name The name of the state being created. Should be unique within its workflow.
|
19
|
+
# @param [Fixnum] sequence Sequencing number that will affect sorting comparisons with other states.
|
20
|
+
# @param [Hash] meta: Optional metadata for this state.
|
21
|
+
def initialize(name, sequence, meta: {})
|
9
22
|
@name, @sequence, @events, @meta = name.to_sym, sequence, [], meta
|
10
23
|
end
|
11
24
|
|
25
|
+
# Returns the event with the given name.
|
26
|
+
# @param [Symbol] name name of event to find
|
27
|
+
# @return [Workflow::Event] The event with the given name, or `nil`
|
12
28
|
def find_event(name)
|
13
29
|
events.find{|t| t.name == name}
|
14
30
|
end
|
@@ -17,10 +33,9 @@ module Workflow
|
|
17
33
|
# Must be called within the scope of the block within a call to {#state}.
|
18
34
|
#
|
19
35
|
# @param [Symbol] name The name of the event
|
20
|
-
# @param [
|
21
|
-
# @
|
22
|
-
# @
|
23
|
-
# @option args [Hash] :meta Optional metadata to be stored on the event object
|
36
|
+
# @param [Symbol] to: Optional name of {Workflow::State} this event will transition to. Must be omitted if a block is provided.
|
37
|
+
# @param [Hash] meta: Optional hash of metadata to be stored on the event object.
|
38
|
+
# @yield [] Transitions definition for this event.
|
24
39
|
# @return [nil]
|
25
40
|
#
|
26
41
|
#```ruby
|
@@ -45,7 +60,7 @@ module Workflow
|
|
45
60
|
# state :the_diner
|
46
61
|
#end
|
47
62
|
#```
|
48
|
-
def on(name, to: nil, meta:
|
63
|
+
def on(name, to: nil, meta: {}, &transitions)
|
49
64
|
if to && block_given?
|
50
65
|
raise Errors::WorkflowDefinitionError.new("Event target can only be received in the method call or the block, not both.")
|
51
66
|
end
|
@@ -58,7 +73,7 @@ module Workflow
|
|
58
73
|
raise Errors::WorkflowDefinitionError.new("Already defined an event [#{name}] for state[#{self.name}]")
|
59
74
|
end
|
60
75
|
|
61
|
-
event = Workflow::Event.new(name, meta)
|
76
|
+
event = Workflow::Event.new(name, meta: meta)
|
62
77
|
|
63
78
|
if to
|
64
79
|
event.to to
|
@@ -74,15 +89,28 @@ module Workflow
|
|
74
89
|
nil
|
75
90
|
end
|
76
91
|
|
92
|
+
# @return [String] String representation of object
|
77
93
|
def inspect
|
78
94
|
"<State name=#{name.inspect} events(#{events.length})=#{events.inspect}>"
|
79
95
|
end
|
80
96
|
|
97
|
+
# Overloaded comparison operator. Workflow states are sorted according to the order
|
98
|
+
# in which they were defined.
|
99
|
+
#
|
100
|
+
# @param [Workflow::State] other_state state to be compared against.
|
101
|
+
# @return [Integer]
|
81
102
|
def <=>(other_state)
|
82
103
|
unless other_state.is_a?(State)
|
83
104
|
raise StandardError.new "Other State #{other_state} is a #{other_state.class}. I can only be compared with a Workflow::State."
|
84
105
|
end
|
85
|
-
self.sequence <=> other_state.sequence
|
106
|
+
self.sequence <=> other_state.send(:sequence)
|
86
107
|
end
|
108
|
+
|
109
|
+
private
|
110
|
+
# @api private
|
111
|
+
# @!attribute [r] sequence
|
112
|
+
# @return [Fixnum] The position of this state within the order it was defined for in its workflow.
|
113
|
+
attr_reader :sequence
|
114
|
+
|
87
115
|
end
|
88
116
|
end
|
data/lib/workflow/version.rb
CHANGED
data/rails-workflow.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
|
11
11
|
spec.summary = %q{A finite-state-machine-inspired API for managing state changes in ActiveModel objects. Based on Vladimir Dobriakov's Workflow gem (https://github.com/geekq/workflow)}
|
12
12
|
spec.description = %q{Workflow specifically for ActiveModel objects.}
|
13
|
-
spec.homepage = "https://github.
|
13
|
+
spec.homepage = "https://tylergannon.github.io/rails-workflow/"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Gannon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -215,14 +215,16 @@ files:
|
|
215
215
|
- gemfiles/Gemfile.rails-4.0
|
216
216
|
- gemfiles/Gemfile.rails-5.0
|
217
217
|
- gemfiles/Gemfile.rails-edge
|
218
|
+
- lib/active_support/overloads.rb
|
218
219
|
- lib/workflow.rb
|
219
220
|
- lib/workflow/adapters/active_record.rb
|
220
221
|
- lib/workflow/adapters/active_record_validations.rb
|
221
222
|
- lib/workflow/adapters/remodel.rb
|
222
223
|
- lib/workflow/callbacks.rb
|
223
224
|
- lib/workflow/callbacks/callback.rb
|
224
|
-
- lib/workflow/callbacks/
|
225
|
-
- lib/workflow/callbacks/
|
225
|
+
- lib/workflow/callbacks/transition_callback.rb
|
226
|
+
- lib/workflow/callbacks/transition_callbacks/method_wrapper.rb
|
227
|
+
- lib/workflow/callbacks/transition_callbacks/proc_wrapper.rb
|
226
228
|
- lib/workflow/configuration.rb
|
227
229
|
- lib/workflow/draw.rb
|
228
230
|
- lib/workflow/errors.rb
|
@@ -233,7 +235,7 @@ files:
|
|
233
235
|
- lib/workflow/version.rb
|
234
236
|
- orders_workflow.png
|
235
237
|
- rails-workflow.gemspec
|
236
|
-
homepage: https://github.
|
238
|
+
homepage: https://tylergannon.github.io/rails-workflow/
|
237
239
|
licenses:
|
238
240
|
- MIT
|
239
241
|
metadata:
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module Workflow
|
2
|
-
module Callbacks
|
3
|
-
class TransitionCallbackMethodWrapper < TransitionCallbackWrapper
|
4
|
-
attr_reader :calling_class
|
5
|
-
|
6
|
-
def wrapper
|
7
|
-
cb_object = self
|
8
|
-
proc_string = build_proc(<<-EOF)
|
9
|
-
arguments = [
|
10
|
-
cb_object.send(:raw_proc).inspect,
|
11
|
-
cb_object.send(:name_arguments_string),
|
12
|
-
cb_object.send(:rest_param_string),
|
13
|
-
cb_object.send(:kw_arguments_string),
|
14
|
-
cb_object.send(:keyrest_string),
|
15
|
-
cb_object.send(:procedure_string)].compact.join(', ')
|
16
|
-
target.instance_eval("send(\#{arguments})")
|
17
|
-
EOF
|
18
|
-
p = eval(proc_string)
|
19
|
-
return overload_equality_operator(p)
|
20
|
-
end
|
21
|
-
|
22
|
-
# protected
|
23
|
-
|
24
|
-
def overload_equality_operator(outer_proc)
|
25
|
-
raw_proc = raw_proc
|
26
|
-
def outer_proc.raw_proc
|
27
|
-
raw_proc
|
28
|
-
end
|
29
|
-
def outer_proc.==(other)
|
30
|
-
if other.kind_of?(::Proc)
|
31
|
-
if other.respond_to?(:raw_proc)
|
32
|
-
self.raw_proc == other.raw_proc
|
33
|
-
else
|
34
|
-
self == other
|
35
|
-
end
|
36
|
-
elsif other.kind_of?(Symbol)
|
37
|
-
self.raw_proc == other
|
38
|
-
else
|
39
|
-
false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
return outer_proc
|
43
|
-
end
|
44
|
-
def name_arguments_string
|
45
|
-
name_params.map{|name| "name_proc.call(:#{name})"} if name_params.any?
|
46
|
-
end
|
47
|
-
|
48
|
-
def procedure_string
|
49
|
-
'&callbacks' if around_callback?
|
50
|
-
end
|
51
|
-
|
52
|
-
def callback_method
|
53
|
-
@meth ||= calling_class.instance_method(raw_proc)
|
54
|
-
end
|
55
|
-
|
56
|
-
def parameters
|
57
|
-
callback_method.parameters
|
58
|
-
end
|
59
|
-
|
60
|
-
def arity
|
61
|
-
callback_method.arity
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|