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 CHANGED
@@ -8,7 +8,8 @@ source "http://rubygems.org"
8
8
  group :development do
9
9
  gem 'activerecord', '~> 3.2.x'
10
10
  gem 'sqlite3'
11
- gem "rspec", "~> 2.8.0"
11
+ gem 'rspec-nc'
12
+ gem "rspec", "~> 2.9.0"
12
13
  gem "yard", "~> 0.7"
13
14
  gem 'redcarpet'
14
15
  gem "rdoc", "~> 3.12"
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.8.0)
32
- rspec-core (~> 2.8.0)
33
- rspec-expectations (~> 2.8.0)
34
- rspec-mocks (~> 2.8.0)
35
- rspec-core (2.8.0)
36
- rspec-expectations (2.8.0)
37
- diff-lcs (~> 1.1.2)
38
- rspec-mocks (2.8.0)
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.8.0)
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.0
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 :send_notification_to_stakeholders
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 :send_notification_to_pending_users
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 get_current_state
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
- raise StatePersistenceAttributeNotPresent unless self.attribute_names.include? self.class.persist_attr_name.to_s
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? self.class.persist_attr_name.to_s
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
@@ -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?
@@ -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!
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "state_shifter"
8
- s.version = "0.8.0"
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-27"
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>, ["~> 2.8.0"])
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>, ["~> 2.8.0"])
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>, ["~> 2.8.0"])
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.0
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-27 00:00:00.000000000 Z
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.8.0
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.8.0
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: 3920605756095371187
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