state_shifter 0.8.0 → 0.8.1
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.
- data/Gemfile +2 -1
- data/Gemfile.lock +14 -9
- data/VERSION +1 -1
- data/examples/advanced.rb +6 -2
- data/examples/malformed_events.rb +1 -17
- data/examples/malformed_persistence.rb +0 -75
- data/examples/malformed_states.rb +1 -17
- data/lib/state_shifter/definition/active_record_integration_methods.rb +7 -3
- data/lib/state_shifter/definition/class_methods.rb +1 -1
- data/lib/state_shifter/definition/contents.rb +2 -1
- data/lib/state_shifter/definition/instance_methods.rb +2 -1
- data/lib/state_shifter/state.rb +2 -1
- data/spec/state_shifter_spec.rb +17 -0
- data/state_shifter.gemspec +8 -6
- metadata +21 -6
- data/.rspec +0 -1
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -28,19 +28,23 @@ GEM
|
|
28
28
|
rdoc (3.12)
|
29
29
|
json (~> 1.4)
|
30
30
|
redcarpet (2.1.1)
|
31
|
-
rspec (2.
|
32
|
-
rspec-core (~> 2.
|
33
|
-
rspec-expectations (~> 2.
|
34
|
-
rspec-mocks (~> 2.
|
35
|
-
rspec-core (2.
|
36
|
-
rspec-expectations (2.
|
37
|
-
diff-lcs (~> 1.1.
|
38
|
-
rspec-mocks (2.
|
31
|
+
rspec (2.9.0)
|
32
|
+
rspec-core (~> 2.9.0)
|
33
|
+
rspec-expectations (~> 2.9.0)
|
34
|
+
rspec-mocks (~> 2.9.0)
|
35
|
+
rspec-core (2.9.0)
|
36
|
+
rspec-expectations (2.9.1)
|
37
|
+
diff-lcs (~> 1.1.3)
|
38
|
+
rspec-mocks (2.9.0)
|
39
|
+
rspec-nc (0.0.4)
|
40
|
+
rspec (~> 2.9)
|
41
|
+
terminal-notifier (~> 1.4.2)
|
39
42
|
simplecov (0.6.4)
|
40
43
|
multi_json (~> 1.0)
|
41
44
|
simplecov-html (~> 0.5.3)
|
42
45
|
simplecov-html (0.5.3)
|
43
46
|
sqlite3 (1.3.6)
|
47
|
+
terminal-notifier (1.4.2)
|
44
48
|
tzinfo (0.3.33)
|
45
49
|
yard (0.8.2.1)
|
46
50
|
|
@@ -53,7 +57,8 @@ DEPENDENCIES
|
|
53
57
|
jeweler (~> 1.8.4)
|
54
58
|
rdoc (~> 3.12)
|
55
59
|
redcarpet
|
56
|
-
rspec (~> 2.
|
60
|
+
rspec (~> 2.9.0)
|
61
|
+
rspec-nc
|
57
62
|
simplecov
|
58
63
|
sqlite3
|
59
64
|
yard (~> 0.7)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.1
|
data/examples/advanced.rb
CHANGED
@@ -41,14 +41,14 @@ class Advanced
|
|
41
41
|
end
|
42
42
|
|
43
43
|
state :notify_stakeholders do
|
44
|
-
on_entry :
|
44
|
+
on_entry :send_notification, :stakeholders, :organizers
|
45
45
|
event :stakeholders_notified => :cancelled
|
46
46
|
end
|
47
47
|
|
48
48
|
state :cancelled
|
49
49
|
|
50
50
|
state :notify_pending_users do
|
51
|
-
on_entry :
|
51
|
+
on_entry :send_notification, :pending_users
|
52
52
|
event :pending_users_notified => :finalized
|
53
53
|
end
|
54
54
|
|
@@ -80,6 +80,10 @@ class Advanced
|
|
80
80
|
|
81
81
|
###
|
82
82
|
|
83
|
+
def send_notification to
|
84
|
+
#
|
85
|
+
end
|
86
|
+
|
83
87
|
def entries_deadline_reached?
|
84
88
|
true
|
85
89
|
end
|
@@ -12,22 +12,6 @@ class MalformedEvents
|
|
12
12
|
event :submit => :being_reviewed
|
13
13
|
end
|
14
14
|
|
15
|
-
state :being_reviewed do
|
16
|
-
event :accept => :accepted, :if => :cool_article?
|
17
|
-
event :reject => :rejected, :if => :bad_article?
|
18
|
-
end
|
19
|
-
|
20
|
-
state :accepted
|
21
|
-
state :rejected
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def cool_article?
|
26
|
-
true
|
27
|
-
end
|
28
|
-
|
29
|
-
def bad_article?
|
30
|
-
false
|
31
15
|
end
|
32
|
-
|
16
|
+
|
33
17
|
end
|
@@ -13,85 +13,10 @@ class MalformedPersistence
|
|
13
13
|
event :abort_initialized_contest => :finalized
|
14
14
|
end
|
15
15
|
|
16
|
-
state :running do
|
17
|
-
|
18
|
-
on_entry do |previous_state, trigger_event|
|
19
|
-
running_entry previous_state, trigger_event
|
20
|
-
end
|
21
|
-
|
22
|
-
event :abort_running_contest => :notify_stakeholders
|
23
|
-
event :changed_properties
|
24
|
-
event :keep_users_engaged
|
25
|
-
event :deadline_reached => :notify_organizers, :if => :entries_deadline_reached?
|
26
|
-
event :spots_filled => :notify_organizers, :if => :spots_filled?
|
27
|
-
event :deadline_reached_without_approvals => :notify_pending_users, :if => :entries_deadline_reached_without_approvals?
|
28
|
-
event :deadline_reached_without_entries => :finalized, :if => :entries_deadline_reached_without_entries?
|
29
|
-
end
|
30
|
-
|
31
|
-
state :notify_organizers do
|
32
|
-
on_entry :send_notification_to_organizers
|
33
|
-
event :organizers_notified => :awaiting_organizer_reply
|
34
|
-
end
|
35
|
-
|
36
|
-
state :awaiting_organizer_reply do
|
37
|
-
event :organizer_confirmation_missing => :notify_stakeholders, :if => :organizer_confirmation_deadline_reached?
|
38
|
-
event :keep_organizers_engaged
|
39
|
-
event :organizer_confirmation_received => :notify_approved_users
|
40
|
-
event :organizer_has_more_tickets => :running
|
41
|
-
end
|
42
|
-
|
43
|
-
state :notify_stakeholders do
|
44
|
-
on_entry :send_notification_to_stakeholders
|
45
|
-
event :stakeholders_notified => :cancelled
|
46
|
-
end
|
47
|
-
|
48
|
-
state :cancelled
|
49
|
-
|
50
|
-
state :notify_pending_users do
|
51
|
-
on_entry :send_notification_to_pending_users
|
52
|
-
event :pending_users_notified => :finalized
|
53
|
-
end
|
54
|
-
|
55
|
-
state :notify_approved_users do
|
56
|
-
on_entry :send_notification_to_approved_users
|
57
|
-
event :approved_users_notified => :send_list_to_organizers
|
58
|
-
end
|
59
|
-
|
60
|
-
state :send_list_to_organizers do
|
61
|
-
on_entry :send_guestlist_to_organizers
|
62
|
-
event :list_sent_to_organizers => :awaiting_attendance
|
63
|
-
end
|
64
|
-
|
65
|
-
state :awaiting_attendance do
|
66
|
-
event :remind_to_fill_in_report => :create_report_filling_requests
|
67
|
-
end
|
68
|
-
|
69
|
-
state :create_report_filling_requests do
|
70
|
-
on_entry :send_report_filling_requests
|
71
|
-
event :finalize => :finalized
|
72
|
-
end
|
73
|
-
|
74
|
-
state :finalized
|
75
|
-
|
76
|
-
on_transition do |from,to,trigger_event, duration|
|
77
|
-
benchmark from, to, trigger_event, duration
|
78
|
-
end
|
79
16
|
end
|
80
17
|
|
81
18
|
persist_attribute :lollies
|
82
19
|
|
83
20
|
###
|
84
21
|
|
85
|
-
def entries_deadline_reached?
|
86
|
-
true
|
87
|
-
end
|
88
|
-
|
89
|
-
def running_entry previous_state, trigger_event
|
90
|
-
#
|
91
|
-
end
|
92
|
-
|
93
|
-
def benchmark from, to, trigger_event, duration
|
94
|
-
#
|
95
|
-
end
|
96
|
-
|
97
22
|
end
|
@@ -12,22 +12,6 @@ class MalformedStates
|
|
12
12
|
event :review => :being_reviewed
|
13
13
|
end
|
14
14
|
|
15
|
-
state :being_reviewed do
|
16
|
-
event :accept => :accepted, :if => :cool_article?
|
17
|
-
event :reject => :rejected, :if => :bad_article?
|
18
|
-
end
|
19
|
-
|
20
|
-
state :accepted
|
21
|
-
state :rejected
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def cool_article?
|
26
|
-
true
|
27
|
-
end
|
28
|
-
|
29
|
-
def bad_article?
|
30
|
-
false
|
31
15
|
end
|
32
|
-
|
16
|
+
|
33
17
|
end
|
@@ -4,18 +4,22 @@ module StateShifter
|
|
4
4
|
|
5
5
|
class ::StateShifter::Definition::StatePersistenceAttributeNotPresent < RuntimeError; end
|
6
6
|
|
7
|
-
def
|
7
|
+
def check_attr_presence
|
8
8
|
raise StatePersistenceAttributeNotPresent unless self.attribute_names.include? self.class.persist_attr_name.to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_current_state
|
12
|
+
check_attr_presence
|
9
13
|
read_attribute self.class.persist_attr_name
|
10
14
|
end
|
11
15
|
|
12
16
|
def set_current_state value
|
13
|
-
|
17
|
+
check_attr_presence
|
14
18
|
update_attribute self.class.persist_attr_name, value
|
15
19
|
end
|
16
20
|
|
17
21
|
def write_initial_state
|
18
|
-
raise StatePersistenceAttributeNotPresent unless self.attribute_names.include?
|
22
|
+
raise StatePersistenceAttributeNotPresent unless self.attribute_names.include?(self.class.persist_attr_name.to_s)
|
19
23
|
write_attribute self.class.persist_attr_name, self.class.state_machine_definition.initial_state.name.to_sym
|
20
24
|
end
|
21
25
|
|
@@ -43,7 +43,7 @@ module StateShifter
|
|
43
43
|
|
44
44
|
this_event = state_machine_definition.get(:event, event_name)
|
45
45
|
|
46
|
-
current_state == this_event.from && !check_guards(event_name).is_a?(Array)
|
46
|
+
current_state.to_sym == this_event.from.to_sym && !check_guards(event_name).is_a?(Array)
|
47
47
|
|
48
48
|
end
|
49
49
|
|
@@ -51,11 +51,12 @@ module StateShifter
|
|
51
51
|
@current_state.events[event_name.to_sym] = this_event
|
52
52
|
end
|
53
53
|
|
54
|
-
def on_entry event_name=nil, &proc_contents
|
54
|
+
def on_entry event_name=nil, *event_args, &proc_contents
|
55
55
|
if event_name.nil?
|
56
56
|
@current_state.entry_callback = proc_contents
|
57
57
|
else
|
58
58
|
@current_state.entry_callback = event_name
|
59
|
+
@current_state.entry_callback_args = ( event_args.size == 1 ? event_args.first : event_args )
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
@@ -59,8 +59,9 @@ module StateShifter
|
|
59
59
|
proc_or_method_name = current_state_def.entry_callback
|
60
60
|
|
61
61
|
if proc_or_method_name.is_a?(Symbol)
|
62
|
+
method_args = current_state_def.entry_callback_args
|
62
63
|
begin
|
63
|
-
self.send proc_or_method_name
|
64
|
+
self.send proc_or_method_name, method_args
|
64
65
|
rescue NoMethodError
|
65
66
|
raise ::StateShifter::CallbackMethodNotDefined, proc_or_method_name
|
66
67
|
end
|
data/lib/state_shifter/state.rb
CHANGED
@@ -3,12 +3,13 @@ module StateShifter
|
|
3
3
|
class State
|
4
4
|
|
5
5
|
attr_reader :name, :events
|
6
|
-
attr_accessor :entry_callback
|
6
|
+
attr_accessor :entry_callback, :entry_callback_args
|
7
7
|
|
8
8
|
def initialize name
|
9
9
|
@name = name
|
10
10
|
@events = {}
|
11
11
|
@entry_callback = nil
|
12
|
+
@entry_callback_args = []
|
12
13
|
end
|
13
14
|
|
14
15
|
def has_entry_callback?
|
data/spec/state_shifter_spec.rb
CHANGED
@@ -159,6 +159,23 @@ describe 'Advanced state machine functionality' do
|
|
159
159
|
@advanced.deadline_reached!
|
160
160
|
end
|
161
161
|
|
162
|
+
it 'state on_entry callbacks with an argument should work' do
|
163
|
+
@advanced.forced_start
|
164
|
+
@advanced.stub!(:entries_deadline_reached_without_approvals?).and_return(true)
|
165
|
+
|
166
|
+
# method name only with args
|
167
|
+
@advanced.should_receive(:send_notification).with(:pending_users)
|
168
|
+
@advanced.deadline_reached_without_approvals!
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'state on_entry callbacks with an array of arguments should work' do
|
172
|
+
@advanced.forced_start
|
173
|
+
|
174
|
+
# method name only with args
|
175
|
+
@advanced.should_receive(:send_notification).with([:stakeholders, :organizers])
|
176
|
+
@advanced.abort_running_contest!
|
177
|
+
end
|
178
|
+
|
162
179
|
it 'the on_transition callback should work' do
|
163
180
|
@advanced.should_receive(:benchmark).with(:initialized, :running, :forced_start!, an_instance_of(Float)).and_return(nil)
|
164
181
|
@advanced.forced_start!
|
data/state_shifter.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "state_shifter"
|
8
|
-
s.version = "0.8.
|
8
|
+
s.version = "0.8.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bruno Antunes"]
|
12
|
-
s.date = "2012-08-
|
12
|
+
s.date = "2012-08-28"
|
13
13
|
s.description = "state_shifter is a gem that adds state machine behavior to a class"
|
14
14
|
s.email = "sardaukar.siet@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -18,7 +18,6 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
".rspec",
|
22
21
|
"Gemfile",
|
23
22
|
"Gemfile.lock",
|
24
23
|
"LICENSE.txt",
|
@@ -57,7 +56,8 @@ Gem::Specification.new do |s|
|
|
57
56
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
58
57
|
s.add_development_dependency(%q<activerecord>, ["~> 3.2.x"])
|
59
58
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
60
|
-
s.add_development_dependency(%q<rspec>, ["
|
59
|
+
s.add_development_dependency(%q<rspec-nc>, [">= 0"])
|
60
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.9.0"])
|
61
61
|
s.add_development_dependency(%q<yard>, ["~> 0.7"])
|
62
62
|
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
63
63
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -67,7 +67,8 @@ Gem::Specification.new do |s|
|
|
67
67
|
else
|
68
68
|
s.add_dependency(%q<activerecord>, ["~> 3.2.x"])
|
69
69
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
70
|
-
s.add_dependency(%q<rspec>, ["
|
70
|
+
s.add_dependency(%q<rspec-nc>, [">= 0"])
|
71
|
+
s.add_dependency(%q<rspec>, ["~> 2.9.0"])
|
71
72
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
72
73
|
s.add_dependency(%q<redcarpet>, [">= 0"])
|
73
74
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -78,7 +79,8 @@ Gem::Specification.new do |s|
|
|
78
79
|
else
|
79
80
|
s.add_dependency(%q<activerecord>, ["~> 3.2.x"])
|
80
81
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
81
|
-
s.add_dependency(%q<rspec>, ["
|
82
|
+
s.add_dependency(%q<rspec-nc>, [">= 0"])
|
83
|
+
s.add_dependency(%q<rspec>, ["~> 2.9.0"])
|
82
84
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
83
85
|
s.add_dependency(%q<redcarpet>, [">= 0"])
|
84
86
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: state_shifter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -43,6 +43,22 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec-nc
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: rspec
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +66,7 @@ dependencies:
|
|
50
66
|
requirements:
|
51
67
|
- - ~>
|
52
68
|
- !ruby/object:Gem::Version
|
53
|
-
version: 2.
|
69
|
+
version: 2.9.0
|
54
70
|
type: :development
|
55
71
|
prerelease: false
|
56
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +74,7 @@ dependencies:
|
|
58
74
|
requirements:
|
59
75
|
- - ~>
|
60
76
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.
|
77
|
+
version: 2.9.0
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
79
|
name: yard
|
64
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,7 +180,6 @@ extra_rdoc_files:
|
|
164
180
|
- README.md
|
165
181
|
files:
|
166
182
|
- .document
|
167
|
-
- .rspec
|
168
183
|
- Gemfile
|
169
184
|
- Gemfile.lock
|
170
185
|
- LICENSE.txt
|
@@ -205,7 +220,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
205
220
|
version: '0'
|
206
221
|
segments:
|
207
222
|
- 0
|
208
|
-
hash:
|
223
|
+
hash: -2251984499056087548
|
209
224
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
225
|
none: false
|
211
226
|
requirements:
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|