state_machine 0.7.5 → 0.7.6
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/CHANGELOG.rdoc +10 -0
- data/README.rdoc +1 -1
- data/Rakefile +9 -2
- data/lib/state_machine.rb +17 -12
- data/lib/state_machine/assertions.rb +4 -5
- data/lib/state_machine/callback.rb +27 -21
- data/lib/state_machine/condition_proxy.rb +1 -1
- data/lib/state_machine/eval_helpers.rb +1 -2
- data/lib/state_machine/event.rb +3 -3
- data/lib/state_machine/event_collection.rb +5 -6
- data/lib/state_machine/integrations/active_record.rb +25 -16
- data/lib/state_machine/integrations/active_record/locale.rb +1 -0
- data/lib/state_machine/integrations/data_mapper.rb +6 -9
- data/lib/state_machine/integrations/data_mapper/observer.rb +5 -5
- data/lib/state_machine/integrations/sequel.rb +5 -7
- data/lib/state_machine/machine.rb +65 -55
- data/lib/state_machine/machine_collection.rb +15 -17
- data/lib/state_machine/matcher_helpers.rb +1 -0
- data/lib/state_machine/state.rb +6 -4
- data/lib/state_machine/state_collection.rb +3 -3
- data/lib/state_machine/transition.rb +3 -3
- data/test/unit/eval_helpers_test.rb +18 -0
- data/test/unit/event_collection_test.rb +30 -0
- data/test/unit/integrations/active_record_test.rb +78 -8
- data/test/unit/integrations/data_mapper_test.rb +77 -0
- data/test/unit/integrations/sequel_test.rb +54 -2
- data/test/unit/machine_collection_test.rb +20 -0
- data/test/unit/machine_test.rb +154 -5
- data/test/unit/state_test.rb +17 -3
- data/test/unit/transition_test.rb +27 -0
- metadata +2 -2
data/test/unit/machine_test.rb
CHANGED
@@ -11,10 +11,18 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
11
11
|
assert_equal @klass, @machine.owner_class
|
12
12
|
end
|
13
13
|
|
14
|
+
def test_should_have_a_name
|
15
|
+
assert_equal :state, @machine.name
|
16
|
+
end
|
17
|
+
|
14
18
|
def test_should_have_an_attribute
|
15
19
|
assert_equal :state, @machine.attribute
|
16
20
|
end
|
17
21
|
|
22
|
+
def test_should_prefix_custom_attributes_with_attribute
|
23
|
+
assert_equal :state_event, @machine.attribute(:event)
|
24
|
+
end
|
25
|
+
|
18
26
|
def test_should_have_an_initial_state
|
19
27
|
assert_not_nil @machine.initial_state(@object)
|
20
28
|
end
|
@@ -143,17 +151,25 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
143
151
|
end
|
144
152
|
end
|
145
153
|
|
146
|
-
class
|
154
|
+
class MachineWithCustomNameTest < Test::Unit::TestCase
|
147
155
|
def setup
|
148
156
|
@klass = Class.new
|
149
157
|
@machine = StateMachine::Machine.new(@klass, :status)
|
150
158
|
@object = @klass.new
|
151
159
|
end
|
152
160
|
|
153
|
-
def
|
161
|
+
def test_should_use_custom_name
|
162
|
+
assert_equal :status, @machine.name
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_should_use_custom_name_for_attribute
|
154
166
|
assert_equal :status, @machine.attribute
|
155
167
|
end
|
156
168
|
|
169
|
+
def test_should_prefix_custom_attributes_with_custom_name
|
170
|
+
assert_equal :status_event, @machine.attribute(:event)
|
171
|
+
end
|
172
|
+
|
157
173
|
def test_should_define_a_reader_attribute_for_the_attribute
|
158
174
|
assert @object.respond_to?(:status)
|
159
175
|
end
|
@@ -998,21 +1014,46 @@ end
|
|
998
1014
|
|
999
1015
|
class MachinePersistenceTest < Test::Unit::TestCase
|
1000
1016
|
def setup
|
1001
|
-
@klass = Class.new
|
1017
|
+
@klass = Class.new do
|
1018
|
+
attr_accessor :state_event
|
1019
|
+
end
|
1002
1020
|
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
1003
1021
|
@object = @klass.new
|
1004
1022
|
end
|
1005
1023
|
|
1006
1024
|
def test_should_allow_reading_state
|
1007
|
-
assert_equal 'parked', @machine.read(@object)
|
1025
|
+
assert_equal 'parked', @machine.read(@object, :state)
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
def test_should_allow_reading_custom_attributes
|
1029
|
+
assert_nil @machine.read(@object, :event)
|
1030
|
+
|
1031
|
+
@object.state_event = 'ignite'
|
1032
|
+
assert_equal 'ignite', @machine.read(@object, :event)
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
def test_should_allow_reading_custom_instance_variables
|
1036
|
+
@klass.class_eval do
|
1037
|
+
attr_writer :state_value
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
@object.state_value = 1
|
1041
|
+
assert_raise(NoMethodError) { @machine.read(@object, :value) }
|
1042
|
+
assert_equal 1, @machine.read(@object, :value, true)
|
1008
1043
|
end
|
1009
1044
|
|
1010
1045
|
def test_should_allow_writing_state
|
1011
|
-
@machine.write(@object, 'idling')
|
1046
|
+
@machine.write(@object, :state, 'idling')
|
1012
1047
|
assert_equal 'idling', @object.state
|
1013
1048
|
end
|
1049
|
+
|
1050
|
+
def test_should_allow_writing_custom_attributes
|
1051
|
+
@machine.write(@object, :event, 'ignite')
|
1052
|
+
assert_equal 'ignite', @object.state_event
|
1053
|
+
end
|
1014
1054
|
end
|
1015
1055
|
|
1056
|
+
|
1016
1057
|
class MachineWithStatesTest < Test::Unit::TestCase
|
1017
1058
|
def setup
|
1018
1059
|
@klass = Class.new
|
@@ -1445,6 +1486,40 @@ class MachineWithExistingMachinesOnOwnerClassTest < Test::Unit::TestCase
|
|
1445
1486
|
end
|
1446
1487
|
end
|
1447
1488
|
|
1489
|
+
class MachineWithExistingMachinesWithSameAttributesOnOwnerClassTest < Test::Unit::TestCase
|
1490
|
+
def setup
|
1491
|
+
@klass = Class.new
|
1492
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
1493
|
+
@second_machine = StateMachine::Machine.new(@klass, :public_state, :attribute => :state)
|
1494
|
+
@object = @klass.new
|
1495
|
+
end
|
1496
|
+
|
1497
|
+
def test_should_track_each_state_machine
|
1498
|
+
expected = {:state => @machine, :public_state => @second_machine}
|
1499
|
+
assert_equal expected, @klass.state_machines
|
1500
|
+
end
|
1501
|
+
|
1502
|
+
def test_should_initialize_based_on_first_available_initial_state
|
1503
|
+
assert_equal 'parked', @object.state
|
1504
|
+
end
|
1505
|
+
|
1506
|
+
def test_should_allow_transitions_on_both_machines
|
1507
|
+
@machine.event :ignite do
|
1508
|
+
transition :parked => :idling
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
@second_machine.event :park do
|
1512
|
+
transition :idling => :parked
|
1513
|
+
end
|
1514
|
+
|
1515
|
+
@object.ignite
|
1516
|
+
assert_equal 'idling', @object.state
|
1517
|
+
|
1518
|
+
@object.park
|
1519
|
+
assert_equal 'parked', @object.state
|
1520
|
+
end
|
1521
|
+
end
|
1522
|
+
|
1448
1523
|
class MachineWithNamespaceTest < Test::Unit::TestCase
|
1449
1524
|
def setup
|
1450
1525
|
@klass = Class.new
|
@@ -1491,6 +1566,80 @@ class MachineWithNamespaceTest < Test::Unit::TestCase
|
|
1491
1566
|
end
|
1492
1567
|
end
|
1493
1568
|
|
1569
|
+
class MachineWithCustomAttributeTest < Test::Unit::TestCase
|
1570
|
+
def setup
|
1571
|
+
StateMachine::Integrations.const_set('Custom', Module.new do
|
1572
|
+
class << self; attr_reader :defaults; end
|
1573
|
+
@defaults = {:action => :save, :use_transactions => false}
|
1574
|
+
|
1575
|
+
def create_with_scope(name)
|
1576
|
+
lambda {}
|
1577
|
+
end
|
1578
|
+
|
1579
|
+
def create_without_scope(name)
|
1580
|
+
lambda {}
|
1581
|
+
end
|
1582
|
+
end)
|
1583
|
+
|
1584
|
+
@klass = Class.new
|
1585
|
+
@machine = StateMachine::Machine.new(@klass, :state, :attribute => :state_id, :initial => :active, :integration => :custom) do
|
1586
|
+
event :ignite do
|
1587
|
+
transition :parked => :idling
|
1588
|
+
end
|
1589
|
+
end
|
1590
|
+
@object = @klass.new
|
1591
|
+
end
|
1592
|
+
|
1593
|
+
def test_should_define_a_reader_attribute_for_the_attribute
|
1594
|
+
assert @object.respond_to?(:state_id)
|
1595
|
+
end
|
1596
|
+
|
1597
|
+
def test_should_define_a_writer_attribute_for_the_attribute
|
1598
|
+
assert @object.respond_to?(:state_id=)
|
1599
|
+
end
|
1600
|
+
|
1601
|
+
def test_should_define_a_predicate_for_the_attribute
|
1602
|
+
assert @object.respond_to?(:state?)
|
1603
|
+
end
|
1604
|
+
|
1605
|
+
def test_should_define_a_name_reader_for_the_attribute
|
1606
|
+
assert @object.respond_to?(:state_name)
|
1607
|
+
end
|
1608
|
+
|
1609
|
+
def test_should_define_an_event_reader_for_the_attribute
|
1610
|
+
assert @object.respond_to?(:state_events)
|
1611
|
+
end
|
1612
|
+
|
1613
|
+
def test_should_define_a_transition_reader_for_the_attribute
|
1614
|
+
assert @object.respond_to?(:state_transitions)
|
1615
|
+
end
|
1616
|
+
|
1617
|
+
def test_should_define_singular_with_scope
|
1618
|
+
assert @klass.respond_to?(:with_state)
|
1619
|
+
end
|
1620
|
+
|
1621
|
+
def test_should_define_singular_without_scope
|
1622
|
+
assert @klass.respond_to?(:without_state)
|
1623
|
+
end
|
1624
|
+
|
1625
|
+
def test_should_define_plural_with_scope
|
1626
|
+
assert @klass.respond_to?(:with_states)
|
1627
|
+
end
|
1628
|
+
|
1629
|
+
def test_should_define_plural_without_scope
|
1630
|
+
assert @klass.respond_to?(:without_states)
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
def test_should_define_state_machines_reader
|
1634
|
+
expected = {:state => @machine}
|
1635
|
+
assert_equal expected, @klass.state_machines
|
1636
|
+
end
|
1637
|
+
|
1638
|
+
def teardown
|
1639
|
+
StateMachine::Integrations.send(:remove_const, 'Custom')
|
1640
|
+
end
|
1641
|
+
end
|
1642
|
+
|
1494
1643
|
class MachineFinderWithoutExistingMachineTest < Test::Unit::TestCase
|
1495
1644
|
def setup
|
1496
1645
|
@klass = Class.new
|
data/test/unit/state_test.rb
CHANGED
@@ -258,7 +258,8 @@ class StateWithCachedLambdaValueTest < Test::Unit::TestCase
|
|
258
258
|
def setup
|
259
259
|
@klass = Class.new
|
260
260
|
@machine = StateMachine::Machine.new(@klass)
|
261
|
-
@
|
261
|
+
@dynamic_value = lambda {'value'}
|
262
|
+
@machine.states << @state = StateMachine::State.new(@machine, :parked, :value => @dynamic_value, :cache => true)
|
262
263
|
end
|
263
264
|
|
264
265
|
def test_should_be_caching
|
@@ -266,20 +267,27 @@ class StateWithCachedLambdaValueTest < Test::Unit::TestCase
|
|
266
267
|
end
|
267
268
|
|
268
269
|
def test_should_evaluate_value
|
269
|
-
|
270
|
+
assert_equal 'value', @state.value
|
270
271
|
end
|
271
272
|
|
272
273
|
def test_should_only_evaluate_value_once
|
273
274
|
value = @state.value
|
274
275
|
assert_same value, @state.value
|
275
276
|
end
|
277
|
+
|
278
|
+
def test_should_update_value_index_for_state_collection
|
279
|
+
@state.value
|
280
|
+
assert_equal @state, @machine.states['value', :value]
|
281
|
+
assert_nil @machine.states[@dynamic_value, :value]
|
282
|
+
end
|
276
283
|
end
|
277
284
|
|
278
285
|
class StateWithoutCachedLambdaValueTest < Test::Unit::TestCase
|
279
286
|
def setup
|
280
287
|
@klass = Class.new
|
281
288
|
@machine = StateMachine::Machine.new(@klass)
|
282
|
-
@
|
289
|
+
@dynamic_value = lambda {'value'}
|
290
|
+
@machine.states << @state = StateMachine::State.new(@machine, :parked, :value => @dynamic_value)
|
283
291
|
end
|
284
292
|
|
285
293
|
def test_should_not_be_caching
|
@@ -290,6 +298,12 @@ class StateWithoutCachedLambdaValueTest < Test::Unit::TestCase
|
|
290
298
|
value = @state.value
|
291
299
|
assert_not_same value, @state.value
|
292
300
|
end
|
301
|
+
|
302
|
+
def test_should_not_update_value_index_for_state_collection
|
303
|
+
@state.value
|
304
|
+
assert_nil @machine.states['value', :value]
|
305
|
+
assert_equal @state, @machine.states[@dynamic_value, :value]
|
306
|
+
end
|
293
307
|
end
|
294
308
|
|
295
309
|
class StateWithMatcherTest < Test::Unit::TestCase
|
@@ -197,6 +197,33 @@ class TransitionWithNamespaceTest < Test::Unit::TestCase
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
200
|
+
class TransitionWithCustomMachineAttributeTest < Test::Unit::TestCase
|
201
|
+
def setup
|
202
|
+
@klass = Class.new
|
203
|
+
@machine = StateMachine::Machine.new(@klass, :state, :attribute => :state_id)
|
204
|
+
@machine.state :off, :value => 1
|
205
|
+
@machine.state :active, :value => 2
|
206
|
+
@machine.event :activate
|
207
|
+
|
208
|
+
@object = @klass.new
|
209
|
+
@object.state_id = 1
|
210
|
+
|
211
|
+
@transition = StateMachine::Transition.new(@object, @machine, :activate, :off, :active)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_should_persist
|
215
|
+
@transition.persist
|
216
|
+
assert_equal 2, @object.state_id
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_should_rollback
|
220
|
+
@object.state_id = 2
|
221
|
+
@transition.rollback
|
222
|
+
|
223
|
+
assert_equal 1, @object.state_id
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
200
227
|
class TransitionWithActionTest < Test::Unit::TestCase
|
201
228
|
def setup
|
202
229
|
@klass = Class.new do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: state_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-17 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|