finite_machine 0.10.1 → 0.10.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec0da72426b4f28c1b3e06cb7bce0de974ac4445
4
- data.tar.gz: 36d0560b1fc8148cf9c3d194aff3843148e56854
3
+ metadata.gz: edb4b2a96673bef5c94c26d477821d2e59a5f756
4
+ data.tar.gz: 518346cb8ac30326a5a9550f6b0b18bea9de5918
5
5
  SHA512:
6
- metadata.gz: 57dbe7dada41dcfe1fafda95f2a5e7664cdaa62c506e9afdf5f943aa561bae2ea2d9a9a399bc910a08c82e3c76e5350345f89471c90e4deb9e8133a4a37c3a73
7
- data.tar.gz: a14127d9c43b5bcb68b0223c4b5dc3f807c48513ba6fe89fda7e0f4e191e849ac013d2144bf489c54fbe71b9b7c61d0999bef986e436159a3de287acdae807e8
6
+ metadata.gz: d179ed858abc96e2776de1f45278b261ce50f8adccf1841420c334a4f2427d0999ee3cc46e40c263bff62cadbf68284a619d491f8ea8016cfa0d3c576d1dd40c
7
+ data.tar.gz: 2036811dac682bb9decb39a5c39e5cc7c026109db57e97946dd3ca26b8106d109eaecffd200c6c8481cf5c5fb3a5fff6eaae5ed188b9e4bd1ab2d3ea1276aa6a
@@ -1,3 +1,12 @@
1
+ 0.10.2 (July 5, 2015)
2
+
3
+ * Fix to run 'on_after' callbacks even when event cancalled by @craiglittle
4
+ * Fix to cancel transition when no matching choice is found by @craiglittle
5
+ * Change StateParser #parse method
6
+ * Change EventBuilder to EventDefinition and invert dependencies
7
+ * Change Event#call to #trigger
8
+ * Change Transition#call to #execute
9
+
1
10
  0.10.1 (May 24, 2015)
2
11
 
3
12
  * Add ability to inherit state machine definitions
@@ -17,7 +17,7 @@ require "finite_machine/async_call"
17
17
  require "finite_machine/hook_event"
18
18
  require "finite_machine/env"
19
19
  require "finite_machine/event"
20
- require "finite_machine/event_builder"
20
+ require "finite_machine/event_definition"
21
21
  require "finite_machine/event_queue"
22
22
  require "finite_machine/events_chain"
23
23
  require "finite_machine/hooks"
@@ -41,6 +41,9 @@ module FiniteMachine
41
41
  #
42
42
  # @param [Exception] exception
43
43
  #
44
+ # @return [Boolean]
45
+ # true if handler is found, nil otherwise
46
+ #
44
47
  # @api public
45
48
  def catch_error(exception)
46
49
  if handler = handler_for_error(exception)
@@ -2,20 +2,32 @@
2
2
 
3
3
  module FiniteMachine
4
4
  # A class representing event with transitions
5
+ #
6
+ # Used by {EventDefinition} to create events.
7
+ #
8
+ # @api private
5
9
  class Event
6
10
  include Comparable
7
11
  include Threadable
8
12
 
9
13
  # The name of this event
14
+ #
15
+ # @return [Symbol]
10
16
  attr_threadsafe :name
11
17
 
12
18
  # The state transitions for this event
19
+ #
20
+ # @return [Array[Transition]]
13
21
  attr_threadsafe :state_transitions
14
22
 
15
23
  # The reference to the state machine for this event
24
+ #
25
+ # @return [StateMachine]
16
26
  attr_threadsafe :machine
17
27
 
18
28
  # The silent option for this transition
29
+ #
30
+ # @return [Boolean]
19
31
  attr_threadsafe :silent
20
32
 
21
33
  # Initialize an Event
@@ -39,19 +51,21 @@ module FiniteMachine
39
51
  # @example
40
52
  # event << FiniteMachine::Transition.new machine, :a => :b
41
53
  #
42
- # @return [nil]
54
+ # @return [Event]
43
55
  #
44
56
  # @api public
45
57
  def <<(transition)
46
58
  sync_exclusive do
47
59
  Array(transition).flatten.each { |trans| state_transitions << trans }
48
60
  end
61
+ self
49
62
  end
50
63
  alias_method :add, :<<
51
64
 
52
65
  # Find next transition
53
66
  #
54
- # @return [FiniteMachine::Transition]
67
+ # @return [Transition]
68
+ # the next available transition
55
69
  #
56
70
  # @api private
57
71
  def next_transition
@@ -65,7 +79,7 @@ module FiniteMachine
65
79
  #
66
80
  # @param [Array[Object]] args
67
81
  #
68
- # return FiniteMachine::TransitionChoice
82
+ # return [Transition]
69
83
  #
70
84
  # @api private
71
85
  def find_transition(*args)
@@ -81,17 +95,18 @@ module FiniteMachine
81
95
  # If silent option is passed the event will not fire any callbacks
82
96
  #
83
97
  # @example
84
- # transition = Transition.create(machine, {})
85
- # transition.call
98
+ # transition = Event.new(machine, {})
99
+ # transition.trigger
86
100
  #
87
- # @return [nil]
101
+ # @return [Boolean]
102
+ # true is transition succeeded, false otherwise
88
103
  #
89
104
  # @api public
90
- def call(*args, &block)
105
+ def trigger(*args, &block)
91
106
  sync_exclusive do
92
107
  event_transition = next_transition
93
108
  if silent
94
- event_transition.call(*args, &block)
109
+ event_transition.execute(*args, &block)
95
110
  else
96
111
  machine.send(:transition, event_transition, *args, &block)
97
112
  end
@@ -1,8 +1,13 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module FiniteMachine
4
- # A class responsible for building event methods
5
- class EventBuilder
4
+ # A class responsible for defining event methods on state machine
5
+ #
6
+ # Used to add event definitions from {TransitionBuilder} to
7
+ # the {StateMachine} to obtain convenience helpers.
8
+ #
9
+ # @api private
10
+ class EventDefinition
6
11
  include Threadable
7
12
  include Safety
8
13
 
@@ -18,15 +23,15 @@ module FiniteMachine
18
23
  @machine = machine
19
24
  end
20
25
 
21
- # Build state machine events
26
+ # Define transition event names as state machine events
22
27
  #
23
- # @param [FiniteMachine::Transition] transition
24
- # the transition for which event is build
28
+ # @param [Transition] transition
29
+ # the transition for which event definition is created
25
30
  #
26
- # @return [FiniteMachine::Transition]
31
+ # @return [Transition]
27
32
  #
28
33
  # @api private
29
- def call(transition)
34
+ def apply(transition)
30
35
  name = transition.name
31
36
  detect_event_conflict!(name)
32
37
  if machine.singleton_class.send(:method_defined?, name)
@@ -53,12 +58,12 @@ module FiniteMachine
53
58
  # @api private
54
59
  def define_event_transition(name, transition)
55
60
  silent = transition.silent
56
- _event = FiniteMachine::Event.new(machine, name: name, silent: silent)
61
+ _event = Event.new(machine, name: name, silent: silent)
57
62
  _event << transition
58
63
  machine.events_chain.add(name, _event)
59
64
 
60
65
  machine.send(:define_singleton_method, name) do |*args, &block|
61
- _event.call(*args, &block)
66
+ _event.trigger(*args, &block)
62
67
  end
63
68
  end
64
69
 
@@ -99,7 +99,7 @@ module FiniteMachine
99
99
  # @api public
100
100
  def check_choice_conditions(name, *args, &block)
101
101
  chain[name].state_transitions.any? do |trans|
102
- trans.check_conditions(*args, &block)
102
+ trans.current? && trans.check_conditions(*args, &block)
103
103
  end
104
104
  end
105
105
 
@@ -66,10 +66,8 @@ module FiniteMachine
66
66
  # @return [Hash]
67
67
  #
68
68
  # @api public
69
- def call(event_type, event_state)
70
- collection[event_type][event_state].each do |hook|
71
- yield hook
72
- end
69
+ def call(event_type, event_state, &block)
70
+ collection[event_type][event_state].each(&block)
73
71
  end
74
72
 
75
73
  # Check if collection has any elements
@@ -257,8 +257,9 @@ module FiniteMachine
257
257
  exception = InvalidStateError
258
258
  catch_error(exception) ||
259
259
  fail(exception, "inappropriate current state '#{state}'")
260
- true
260
+ return false
261
261
  end
262
+ return true
262
263
  end
263
264
 
264
265
  # Performs transition
@@ -274,24 +275,28 @@ module FiniteMachine
274
275
  sync_exclusive do
275
276
  notify HookEvent::Before, event_transition, *args
276
277
 
277
- return CANCELLED if valid_state?(event_transition)
278
- return CANCELLED unless event_transition.valid?(*args, &block)
278
+ if valid_state?(event_transition) && event_transition.valid?(*args, &block)
279
+ notify HookEvent::Exit, event_transition, *args
279
280
 
280
- notify HookEvent::Exit, event_transition, *args
281
+ begin
282
+ event_transition.execute(*args)
283
+ Logger.report_transition(event_transition, *args) if log_transitions
281
284
 
282
- begin
283
- event_transition.call(*args)
284
- Logger.report_transition(event_transition, *args) if log_transitions
285
+ notify HookEvent::Transition, event_transition, *args
286
+ rescue Exception => e
287
+ catch_error(e) || raise_transition_error(e)
288
+ end
285
289
 
286
- notify HookEvent::Transition, event_transition, *args
287
- rescue Exception => e
288
- catch_error(e) || raise_transition_error(e)
289
- end
290
+ notify HookEvent::Enter, event_transition, *args
291
+
292
+ notify HookEvent::After, event_transition, *args
290
293
 
291
- notify HookEvent::Enter, event_transition, *args
292
- notify HookEvent::After, event_transition, *args
294
+ event_transition.same?(state) ? NOTRANSITION : SUCCEEDED
295
+ else
296
+ notify HookEvent::After, event_transition, *args
293
297
 
294
- event_transition.same?(state) ? NOTRANSITION : SUCCEEDED
298
+ CANCELLED
299
+ end
295
300
  end
296
301
  end
297
302
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  module FiniteMachine
4
4
  # A class responsible for converting transition arguments to states
5
+ #
6
+ # Used by {TransitionBuilder} to parse user input state transitions.
7
+ #
8
+ # @api private
5
9
  class StateParser
6
10
  include Threadable
7
11
 
@@ -19,6 +23,7 @@ module FiniteMachine
19
23
  # @api public
20
24
  def initialize(attrs)
21
25
  @attrs = ensure_only_states!(attrs)
26
+ freeze
22
27
  end
23
28
 
24
29
  # Extract states from attributes
@@ -28,16 +33,14 @@ module FiniteMachine
28
33
  # @example
29
34
  # StateParpser.new(attr).parase_states
30
35
  #
31
- # @return [Hash[Symbol]] states
36
+ # @yield [Hash[Symbol]] the resolved states
37
+ #
38
+ # @return [Hash[Symbol]] the resolved states
32
39
  #
33
40
  # @api public
34
- def parse_states(&block)
35
- transitions = if contains_from_to_keys?
36
- convert_from_to_attributes_to_states_hash
37
- else
38
- convert_attributes_to_states_hash
39
- end
40
- block ? transitions.each(&block) : transitions
41
+ def parse(&block)
42
+ states = extract_states
43
+ block ? states.each(&block) : states
41
44
  end
42
45
 
43
46
  # Check if attributes contain :from or :to key
@@ -84,10 +87,10 @@ module FiniteMachine
84
87
  #
85
88
  # @api private
86
89
  def ensure_only_states!(attrs)
87
- _attrs = attrs.dup
88
- BLACKLIST.each { |key| _attrs.delete(key) }
89
- raise_not_enough_transitions unless _attrs.any?
90
- _attrs
90
+ attributes = attrs.dup
91
+ BLACKLIST.each { |key| attributes.delete(key) }
92
+ raise_not_enough_transitions unless attributes.any?
93
+ attributes
91
94
  end
92
95
 
93
96
  # Convert attrbiutes with :from, :to keys to states hash
@@ -104,6 +107,10 @@ module FiniteMachine
104
107
 
105
108
  # Convert collapsed attributes to states hash
106
109
  #
110
+ # @example
111
+ # parser = StateParser.new([:green, :red] => :yellow)
112
+ # parser.parse # => {green: :yellow, red: :yellow}
113
+ #
107
114
  # @return [Hash[Symbol]]
108
115
  #
109
116
  # @api private
@@ -118,6 +125,19 @@ module FiniteMachine
118
125
  end
119
126
  end
120
127
 
128
+ # Perform extraction of states from user supplied definitions
129
+ #
130
+ # @return [Hash[Symbol]] the resolved states
131
+ #
132
+ # @api private
133
+ def extract_states
134
+ if contains_from_to_keys?
135
+ convert_from_to_attributes_to_states_hash
136
+ else
137
+ convert_attributes_to_states_hash
138
+ end
139
+ end
140
+
121
141
  # Raise error when not enough transitions are provided
122
142
  #
123
143
  # @raise [NotEnoughTransitionsError]
@@ -26,7 +26,7 @@ module FiniteMachine
26
26
  attr_threadsafe :cancelled
27
27
 
28
28
  # All states for this transition event
29
- attr_threadsafe :map
29
+ attr_threadsafe :states
30
30
 
31
31
  # Silence callbacks
32
32
  attr_threadsafe :silent
@@ -40,10 +40,10 @@ module FiniteMachine
40
40
  def initialize(machine, attrs = {})
41
41
  @machine = machine
42
42
  @name = attrs.fetch(:name, DEFAULT_STATE)
43
- @map = attrs.fetch(:parsed_states, {})
43
+ @states = attrs.fetch(:parsed_states, {})
44
44
  @silent = attrs.fetch(:silent, false)
45
- @from_states = @map.keys
46
- @to_states = @map.values
45
+ @from_states = @states.keys
46
+ @to_states = @states.values
47
47
  @from_state = @from_states.first
48
48
  @if = Array(attrs.fetch(:if, []))
49
49
  @unless = Array(attrs.fetch(:unless, []))
@@ -54,21 +54,21 @@ module FiniteMachine
54
54
  # Create transition with associated helper methods
55
55
  #
56
56
  # @param [FiniteMachine::StateMachine] machine
57
+ #
57
58
  # @param [Hash] attrs
58
59
  #
59
60
  # @example
60
- # Transition.create(machine, {})
61
+ # attributes = {parsed_states: {green: :yellow}, silent: true}
62
+ # Transition.create(machine, attrbiutes)
61
63
  #
62
- # @return [FiniteMachine::Transition]
64
+ # @return [Transition]
63
65
  #
64
66
  # @api public
65
67
  def self.create(machine, attrs = {})
66
68
  transition = new(machine, attrs)
67
69
  transition.update_transitions
68
- transition.define_state_methods
69
-
70
- builder = EventBuilder.new(machine)
71
- builder.call(transition)
70
+ transition.define_state_query_methods
71
+ transition
72
72
  end
73
73
 
74
74
  # Decide :to state from available transitions for this event
@@ -79,7 +79,12 @@ module FiniteMachine
79
79
  def to_state(*args)
80
80
  if transition_choice?
81
81
  found_trans = machine.select_choice_transition(name, from_state, *args)
82
- found_trans.map[from_state] || found_trans.map[ANY_STATE]
82
+
83
+ if found_trans.nil? # no choice found
84
+ from_state
85
+ else
86
+ found_trans.states[from_state] || found_trans.states[ANY_STATE]
87
+ end
83
88
  else
84
89
  available_trans = machine.transitions[name]
85
90
  available_trans[from_state] || available_trans[ANY_STATE]
@@ -114,7 +119,7 @@ module FiniteMachine
114
119
  #
115
120
  # @api public
116
121
  def same?(state)
117
- map[state] == state || (map[ANY_STATE] == state && from_state == state)
122
+ states[state] == state || (states[ANY_STATE] == state && from_state == state)
118
123
  end
119
124
 
120
125
  # Check if from matches current state
@@ -161,24 +166,30 @@ module FiniteMachine
161
166
 
162
167
  # Add transition to the machine
163
168
  #
164
- # @return [FiniteMachine::Transition]
169
+ # @return [Transition]
165
170
  #
166
171
  # @api private
167
172
  def update_transitions
168
173
  from_states.each do |from|
169
174
  if (value = machine.transitions[name][from])
170
- machine.transitions[name][from] = [value, map[from]].flatten
175
+ machine.transitions[name][from] = [value, states[from]].flatten
171
176
  else
172
- machine.transitions[name][from] = map[from] || ANY_STATE
177
+ machine.transitions[name][from] = states[from] || ANY_STATE
173
178
  end
174
179
  end
180
+ self
175
181
  end
176
182
 
177
183
  # Define helper state mehods for the transition states
178
184
  #
185
+ # @return [Transition]
186
+ #
179
187
  # @api private
180
- def define_state_methods
181
- from_states.concat(to_states).each { |state| define_state_method(state) }
188
+ def define_state_query_methods
189
+ from_states.concat(to_states).each do |state|
190
+ define_state_query_method(state)
191
+ end
192
+ self
182
193
  end
183
194
 
184
195
  # Define state helper method
@@ -186,7 +197,7 @@ module FiniteMachine
186
197
  # @param [Symbol] state
187
198
  #
188
199
  # @api private
189
- def define_state_method(state)
200
+ def define_state_query_method(state)
190
201
  return if machine.respond_to?("#{state}?")
191
202
  machine.send(:define_singleton_method, "#{state}?") do
192
203
  machine.is?(state.to_sym)
@@ -225,7 +236,7 @@ module FiniteMachine
225
236
  # @return [nil]
226
237
  #
227
238
  # @api private
228
- def call(*args)
239
+ def execute(*args)
229
240
  sync_exclusive do
230
241
  return if cancelled
231
242
  self.from_state = machine.state
@@ -250,7 +261,7 @@ module FiniteMachine
250
261
  #
251
262
  # @api public
252
263
  def inspect
253
- transitions = @map.map { |from, to| "#{from} -> #{to}" }.join(', ')
264
+ transitions = @states.map { |from, to| "#{from} -> #{to}" }.join(', ')
254
265
  "<##{self.class} @name=#{@name}, @transitions=#{transitions}, @when=#{@conditions}>"
255
266
  end
256
267
  end # Transition
@@ -2,6 +2,8 @@
2
2
 
3
3
  module FiniteMachine
4
4
  # A class reponsible for building transition out of parsed states
5
+ #
6
+ # @api private
5
7
  class TransitionBuilder
6
8
  include Threadable
7
9
 
@@ -10,6 +12,8 @@ module FiniteMachine
10
12
 
11
13
  attr_threadsafe :attributes
12
14
 
15
+ attr_threadsafe :event_definition
16
+
13
17
  # Initialize a TransitionBuilder
14
18
  #
15
19
  # @example
@@ -19,6 +23,7 @@ module FiniteMachine
19
23
  def initialize(machine, attributes = {})
20
24
  @machine = machine
21
25
  @attributes = attributes
26
+ @event_definition = EventDefinition.new(machine)
22
27
  end
23
28
 
24
29
  # Creates transitions for the states
@@ -33,9 +38,10 @@ module FiniteMachine
33
38
  #
34
39
  # @api public
35
40
  def call(states)
36
- FiniteMachine::StateParser.new(states).parse_states do |from, to|
41
+ FiniteMachine::StateParser.new(states).parse do |from, to|
37
42
  attributes.merge!(parsed_states: { from => to })
38
- Transition.create(machine, attributes)
43
+ transition = Transition.create(machine, attributes)
44
+ event_definition.apply(transition)
39
45
  end
40
46
  end
41
47
  end # TransitionBuilder
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module FiniteMachine
4
- VERSION = "0.10.1"
4
+ VERSION = "0.10.2"
5
5
  end
@@ -902,4 +902,32 @@ RSpec.describe FiniteMachine, 'callbacks' do
902
902
  fsm.stop
903
903
  expect(called).to eq(['on_enter_red'])
904
904
  end
905
+
906
+ it "executes event-based callbacks even when state does not change" do
907
+ called = []
908
+ fsm = FiniteMachine.define do
909
+ initial :active
910
+
911
+ events {
912
+ event :advance, :active => :inactive, if: -> { false }
913
+ event :advance, :inactive => :active, if: -> { false }
914
+ }
915
+
916
+ callbacks {
917
+ on_before do |event|
918
+ called << "before_#{event.name}_#{event.from}_#{event.to}"
919
+ end
920
+ on_after do |event|
921
+ called << "after_#{event.name}_#{event.from}_#{event.to}"
922
+ end
923
+ }
924
+ end
925
+ expect(fsm.current).to eq(:active)
926
+ fsm.advance
927
+ expect(fsm.current).to eq(:active)
928
+ expect(called).to eq([
929
+ 'before_advance_active_inactive',
930
+ 'after_advance_active_inactive'
931
+ ])
932
+ end
905
933
  end
@@ -85,7 +85,7 @@ RSpec.describe FiniteMachine, '#choice' do
85
85
  expect(fsm.current).to eq(:agreement_form)
86
86
  end
87
87
 
88
- it "choses state when skipped if/unless" do
88
+ it "chooses state when skipped if/unless" do
89
89
  fsm = FiniteMachine.define do
90
90
  initial :company_form
91
91
 
@@ -102,7 +102,7 @@ RSpec.describe FiniteMachine, '#choice' do
102
102
  expect(fsm.current).to eq(:promo_form)
103
103
  end
104
104
 
105
- it "choice default state when branching conditions don't match" do
105
+ it "chooses default state when branching conditions don't match" do
106
106
  fsm = FiniteMachine.define do
107
107
  initial :company_form
108
108
 
@@ -213,6 +213,46 @@ RSpec.describe FiniteMachine, '#choice' do
213
213
  expect(fsm.current).to eq(:fulfilled)
214
214
  end
215
215
 
216
+ it "does not transition when no matching choice for multiple event definitions" do
217
+ ticket = double(:ticket, :pending? => true, :finished? => false)
218
+ called = []
219
+ fsm = FiniteMachine.define do
220
+ initial :inactive
221
+
222
+ target ticket
223
+
224
+ events {
225
+ event :advance, from: [:inactive, :paused, :fulfilled] do
226
+ choice :active, if: proc { |_ticket| !_ticket.pending? }
227
+ end
228
+
229
+ event :advance, from: [:inactive, :active, :fulfilled] do
230
+ choice :paused, if: proc { |_ticket| _ticket.pending? }
231
+ end
232
+
233
+ event :advance, from: [:inactive, :active, :paused] do
234
+ choice :fulfilled, if: proc { |_ticket| _ticket.finished? }
235
+ end
236
+ }
237
+
238
+ callbacks {
239
+ on_before(:advance) { called << 'on_before_advance' }
240
+ on_after(:advance) { called << 'on_after_advance' }
241
+ }
242
+ end
243
+ expect(fsm.current).to eq(:inactive)
244
+ fsm.advance
245
+ expect(fsm.current).to eq(:paused)
246
+ fsm.advance
247
+ expect(fsm.current).to eq(:paused)
248
+ expect(called).to eq([
249
+ 'on_before_advance',
250
+ 'on_after_advance',
251
+ 'on_before_advance',
252
+ 'on_after_advance'
253
+ ])
254
+ end
255
+
216
256
  it "sets callback properties correctly" do
217
257
  expected = {name: :init, from: :none, to: :red, a: nil, b: nil, c: nil }
218
258
 
@@ -7,12 +7,10 @@ RSpec.describe FiniteMachine::Event, '#<<' do
7
7
 
8
8
  let(:object) { described_class }
9
9
 
10
- subject(:event) { object.new(machine, name: :test) }
11
-
12
10
  it "adds multiple transitions" do
13
11
  transition = double(:transition)
14
- event << transition
15
- event << transition
12
+ event = object.new(machine)
13
+ event << transition << transition
16
14
  expect(event.state_transitions).to match_array([transition, transition])
17
15
  end
18
16
  end
@@ -181,7 +181,10 @@ RSpec.describe FiniteMachine, 'events' do
181
181
 
182
182
  expect(fsm.current).to eql(:green)
183
183
 
184
- expect { fsm.stop }.to raise_error(FiniteMachine::InvalidStateError, /state 'green'/)
184
+ expect {
185
+ fsm.stop
186
+ }.to raise_error(FiniteMachine::InvalidStateError,
187
+ /inappropriate current state 'green'/)
185
188
  end
186
189
 
187
190
  it "allows to transition to any state" do
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe FiniteMachine::StateParser, '#inspect' do
5
+ RSpec.describe FiniteMachine::StateParser, '#parse' do
6
6
  let(:object) { described_class }
7
7
 
8
8
  subject(:parser) { object.new(attrs) }
@@ -12,7 +12,7 @@ RSpec.describe FiniteMachine::StateParser, '#inspect' do
12
12
 
13
13
  it "raises error for no transitions" do
14
14
  expect {
15
- parser.parse_states
15
+ parser.parse
16
16
  }.to raise_error(FiniteMachine::NotEnoughTransitionsError)
17
17
  end
18
18
  end
@@ -21,7 +21,7 @@ RSpec.describe FiniteMachine::StateParser, '#inspect' do
21
21
  let(:attrs) { { from: :green, to: :yellow }}
22
22
 
23
23
  it "removes :from and :to keys" do
24
- expect(parser.parse_states).to eq({green: :yellow})
24
+ expect(parser.parse).to eq({green: :yellow})
25
25
  end
26
26
  end
27
27
 
@@ -29,7 +29,7 @@ RSpec.describe FiniteMachine::StateParser, '#inspect' do
29
29
  let(:attrs) { { from: :green }}
30
30
 
31
31
  it "adds to state as copy of from" do
32
- expect(parser.parse_states).to eq({green: :green})
32
+ expect(parser.parse).to eq({green: :green})
33
33
  end
34
34
  end
35
35
 
@@ -37,7 +37,7 @@ RSpec.describe FiniteMachine::StateParser, '#inspect' do
37
37
  let(:attrs) { { to: :green }}
38
38
 
39
39
  it "inserts :any from state" do
40
- expect(parser.parse_states).to eq({any: :green})
40
+ expect(parser.parse).to eq({any: :green})
41
41
  end
42
42
  end
43
43
 
@@ -45,15 +45,15 @@ RSpec.describe FiniteMachine::StateParser, '#inspect' do
45
45
  let(:attrs) { { green: :yellow } }
46
46
 
47
47
  it "copies attributes over" do
48
- expect(parser.parse_states).to eq({green: :yellow})
48
+ expect(parser.parse).to eq({green: :yellow})
49
49
  end
50
50
  end
51
51
 
52
52
  context 'when array of from states' do
53
- let(:attrs) { { [:green] => :yellow } }
53
+ let(:attrs) { { [:green, :red] => :yellow } }
54
54
 
55
55
  it "extracts states" do
56
- expect(parser.parse_states).to eq({green: :yellow})
56
+ expect(parser.parse).to include({red: :yellow, green: :yellow})
57
57
  end
58
58
  end
59
59
  end
@@ -13,7 +13,7 @@ RSpec.describe FiniteMachine::Transition, 'parsed_states' do
13
13
  it "groups states" do
14
14
  expect(transition.from_states).to eq([:any])
15
15
  expect(transition.to_states).to eq([:red])
16
- expect(transition.map).to eql({any: :red})
16
+ expect(transition.states).to eql({any: :red})
17
17
  end
18
18
  end
19
19
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finite_machine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-24 00:00:00.000000000 Z
11
+ date: 2015-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,7 +56,7 @@ files:
56
56
  - lib/finite_machine/dsl.rb
57
57
  - lib/finite_machine/env.rb
58
58
  - lib/finite_machine/event.rb
59
- - lib/finite_machine/event_builder.rb
59
+ - lib/finite_machine/event_definition.rb
60
60
  - lib/finite_machine/event_queue.rb
61
61
  - lib/finite_machine/events_chain.rb
62
62
  - lib/finite_machine/hook_event.rb
@@ -110,7 +110,7 @@ files:
110
110
  - spec/unit/logger_spec.rb
111
111
  - spec/unit/respond_to_spec.rb
112
112
  - spec/unit/state_parser/inspect_spec.rb
113
- - spec/unit/state_parser/parse_states_spec.rb
113
+ - spec/unit/state_parser/parse_spec.rb
114
114
  - spec/unit/states_spec.rb
115
115
  - spec/unit/subscribers_spec.rb
116
116
  - spec/unit/target_spec.rb
@@ -180,7 +180,7 @@ test_files:
180
180
  - spec/unit/logger_spec.rb
181
181
  - spec/unit/respond_to_spec.rb
182
182
  - spec/unit/state_parser/inspect_spec.rb
183
- - spec/unit/state_parser/parse_states_spec.rb
183
+ - spec/unit/state_parser/parse_spec.rb
184
184
  - spec/unit/states_spec.rb
185
185
  - spec/unit/subscribers_spec.rb
186
186
  - spec/unit/target_spec.rb