aasm 4.4.0 → 4.5.0
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +37 -0
- data/lib/aasm/instance_base.rb +3 -0
- data/lib/aasm/rspec/allow_event.rb +22 -0
- data/lib/aasm/rspec/allow_transition_to.rb +22 -0
- data/lib/aasm/rspec/have_state.rb +22 -0
- data/lib/aasm/rspec/transition_from.rb +32 -0
- data/lib/aasm/rspec.rb +5 -0
- data/lib/aasm/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/inspection_spec.rb +5 -0
- data/spec/unit/rspec_matcher_spec.rb +79 -0
- metadata +10 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 92b6a0df28245debe06c0ecbd3bd95e91b0cf323
|
|
4
|
+
data.tar.gz: 99bfa6652b17a26388b073ee431a1878ce961a4e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d6cf5a7eea74d1c20108d48370d0f6048722efefb6af0110c70de56dd13032bcaabf57749add95ae25dc086faab8cbb5dcf9ad08ad4cafbafdfb400481ce1fd4
|
|
7
|
+
data.tar.gz: 90a92ba66f2b4d67c898a9076f324e0c99ce768aa5160f6d70dc74bca48e8ba4cf95317bf5e203b66985e9dcd77a52fb814dc65cc45f498dfeab20fde31fecb8
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 4.5.0
|
|
4
|
+
|
|
5
|
+
* add RSpec matchers `have_state`, `allow_event` and `allow_transition_to` (see [issue #147](https://github.com/aasm/aasm/issues/147) for details)
|
|
6
|
+
* add RSpec matcher `transition_from` (see [issue #178](https://github.com/aasm/aasm/issues/178) for details, thanks to [@thomasstephane](https://github.com/thomasstephane))
|
|
7
|
+
|
|
8
|
+
## 4.4.1
|
|
9
|
+
|
|
10
|
+
* add support for rejecting certain events on inspection (see [issue #272](https://github.com/aasm/aasm/issues/272) for details, thanks to [@dubroe](https://github.com/dubroe))
|
|
11
|
+
|
|
3
12
|
## 4.4.0
|
|
4
13
|
|
|
5
14
|
* add support global transation callbacks (see [issue #221](https://github.com/aasm/aasm/issues/221) and [issue #253](https://github.com/aasm/aasm/issues/253) for details)
|
data/README.md
CHANGED
|
@@ -712,6 +712,8 @@ job.aasm.states(:permitted => true).map(&:name)
|
|
|
712
712
|
# show all possible (triggerable) events (allowed by transitions)
|
|
713
713
|
job.aasm.events.map(&:name)
|
|
714
714
|
=> [:sleep]
|
|
715
|
+
job.aasm.events(:reject => :sleep).map(&:name)
|
|
716
|
+
=> []
|
|
715
717
|
|
|
716
718
|
# list states for select
|
|
717
719
|
Job.aasm.states_for_select
|
|
@@ -719,6 +721,41 @@ Job.aasm.states_for_select
|
|
|
719
721
|
```
|
|
720
722
|
|
|
721
723
|
|
|
724
|
+
### Testing
|
|
725
|
+
|
|
726
|
+
AASM provides some matchers for [RSpec](http://rspec.info): `transition_from`, `have_state`, `allow_event` and `allow_transition_to`. Add `require 'aasm/rspec'` to your `spec_helper.rb` file and use them like this
|
|
727
|
+
|
|
728
|
+
```ruby
|
|
729
|
+
# classes with only the default state machine
|
|
730
|
+
job = Job.new
|
|
731
|
+
expect(job).to transition_from(:sleeping).to(:running).on_event(:run)
|
|
732
|
+
expect(job).not_to transition_from(:sleeping).to(:cleaning).on_event(:run)
|
|
733
|
+
expect(job).to have_state(:sleeping)
|
|
734
|
+
expect(job).not_to have_state(:running)
|
|
735
|
+
expect(job).to allow_event :run
|
|
736
|
+
expect(job).to_not allow_event :clean
|
|
737
|
+
expect(job).to allow_transition_to(:running)
|
|
738
|
+
expect(job).to_not allow_transition_to(:cleaning)
|
|
739
|
+
|
|
740
|
+
# classes with multiple state machine
|
|
741
|
+
multiple = SimpleMultipleExample.new
|
|
742
|
+
expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
|
|
743
|
+
expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
|
|
744
|
+
expect(multiple).to have_state(:standing).on(:move)
|
|
745
|
+
expect(multiple).not_to have_state(:walking).on(:move)
|
|
746
|
+
expect(multiple).to allow_event(:walk).on(:move)
|
|
747
|
+
expect(multiple).to_not allow_event(:hold).on(:move)
|
|
748
|
+
expect(multiple).to allow_transition_to(:walking).on(:move)
|
|
749
|
+
expect(multiple).to_not allow_transition_to(:running).on(:move)
|
|
750
|
+
expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
|
|
751
|
+
expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
|
|
752
|
+
expect(multiple).to have_state(:sleeping).on(:work)
|
|
753
|
+
expect(multiple).not_to have_state(:processing).on(:work)
|
|
754
|
+
expect(multiple).to allow_event(:start).on(:move)
|
|
755
|
+
expect(multiple).to_not allow_event(:stop).on(:move)
|
|
756
|
+
expect(multiple).to allow_transition_to(:processing).on(:move)
|
|
757
|
+
expect(multiple).to_not allow_transition_to(:sleeping).on(:move)
|
|
758
|
+
```
|
|
722
759
|
|
|
723
760
|
## <a id="installation">Installation ##
|
|
724
761
|
|
data/lib/aasm/instance_base.rb
CHANGED
|
@@ -49,6 +49,9 @@ module AASM
|
|
|
49
49
|
state = options[:state] || current_state
|
|
50
50
|
events = @instance.class.aasm(@name).events.select {|e| e.transitions_from_state?(state) }
|
|
51
51
|
|
|
52
|
+
options[:reject] = Array(options[:reject])
|
|
53
|
+
events.reject! { |e| options[:reject].include?(e.name) }
|
|
54
|
+
|
|
52
55
|
if options[:permitted]
|
|
53
56
|
# filters the results of events_for_current_state so that only those that
|
|
54
57
|
# are really currently possible (given transition guards) are shown.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
RSpec::Matchers.define :allow_event do |event|
|
|
2
|
+
match do |obj|
|
|
3
|
+
@state_machine_name ||= :default
|
|
4
|
+
obj.aasm(@state_machine_name).may_fire_event?(event)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
chain :on do |state_machine_name|
|
|
8
|
+
@state_machine_name = state_machine_name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
description do
|
|
12
|
+
"allow event #{expected} (on :#{@state_machine_name})"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
failure_message do |obj|
|
|
16
|
+
"expected that the event :#{expected} would be allowed (on :#{@state_machine_name})"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
failure_message_when_negated do |obj|
|
|
20
|
+
"expected that the event :#{expected} would not be allowed (on :#{@state_machine_name})"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
RSpec::Matchers.define :allow_transition_to do |state|
|
|
2
|
+
match do |obj|
|
|
3
|
+
@state_machine_name ||= :default
|
|
4
|
+
obj.aasm(@state_machine_name).states(:permitted => true).include?(state)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
chain :on do |state_machine_name|
|
|
8
|
+
@state_machine_name = state_machine_name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
description do
|
|
12
|
+
"allow transition to #{expected} (on :#{@state_machine_name})"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
failure_message do |obj|
|
|
16
|
+
"expected that the state :#{expected} would be reachable (on :#{@state_machine_name})"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
failure_message_when_negated do |obj|
|
|
20
|
+
"expected that the state :#{expected} would not be reachable (on :#{@state_machine_name})"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
RSpec::Matchers.define :have_state do |state|
|
|
2
|
+
match do |obj|
|
|
3
|
+
@state_machine_name ||= :default
|
|
4
|
+
obj.aasm(@state_machine_name).current_state == state.to_sym
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
chain :on do |state_machine_name|
|
|
8
|
+
@state_machine_name = state_machine_name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
description do
|
|
12
|
+
"have state #{expected} (on :#{@state_machine_name})"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
failure_message do |obj|
|
|
16
|
+
"expected that :#{obj.aasm(@state_machine_name).current_state} would be :#{expected} (on :#{@state_machine_name})"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
failure_message_when_negated do |obj|
|
|
20
|
+
"expected that :#{obj.aasm(@state_machine_name).current_state} would not be :#{expected} (on :#{@state_machine_name})"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
RSpec::Matchers.define :transition_from do |from_state|
|
|
2
|
+
match do |obj|
|
|
3
|
+
@state_machine_name ||= :default
|
|
4
|
+
obj.aasm(@state_machine_name).current_state = from_state.to_sym
|
|
5
|
+
# expect(obj).to receive(:broadcast_event).with(@event.to_s, obj, from_state, @to_state)
|
|
6
|
+
obj.send(@event) && obj.aasm(@state_machine_name).current_state == @to_state.to_sym
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
chain :on do |state_machine_name|
|
|
10
|
+
@state_machine_name = state_machine_name
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
chain :to do |state|
|
|
14
|
+
@to_state = state
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
chain :on_event do |event|
|
|
18
|
+
@event = event
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
description do
|
|
22
|
+
"transition state to :#{@to_state} from :#{expected} on event :#{@event} (on :#{@state_machine_name})"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
failure_message do |obj|
|
|
26
|
+
"expected that :#{obj.aasm(@state_machine_name).current_state} would be :#{@to_state} (on :#{@state_machine_name})"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
failure_message_when_negated do |obj|
|
|
30
|
+
"expected that :#{obj.aasm(@state_machine_name).current_state} would not be :#{@to_state} (on :#{@state_machine_name})"
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/aasm/rspec.rb
ADDED
data/lib/aasm/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
|
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
|
|
2
2
|
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
|
3
3
|
require 'aasm'
|
|
4
4
|
require 'rspec'
|
|
5
|
+
require 'aasm/rspec'
|
|
5
6
|
|
|
6
7
|
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
|
7
8
|
# require 'ruby-debug/completion'
|
|
@@ -103,4 +103,9 @@ describe 'permitted events' do
|
|
|
103
103
|
expect(foo.aasm.events(:permitted => true)).to include(:close)
|
|
104
104
|
expect(foo.aasm.events(:permitted => true)).not_to include(:null)
|
|
105
105
|
end
|
|
106
|
+
|
|
107
|
+
it 'should not include events in the reject option' do
|
|
108
|
+
expect(foo.aasm.events(:permitted => true, reject: :close)).not_to include(:close)
|
|
109
|
+
expect(foo.aasm.events(:permitted => true, reject: [:close])).not_to include(:close)
|
|
110
|
+
end
|
|
106
111
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'state machine' do
|
|
4
|
+
let(:simple) { SimpleExample.new }
|
|
5
|
+
let(:multiple) { SimpleMultipleExample.new }
|
|
6
|
+
|
|
7
|
+
describe 'transition_from' do
|
|
8
|
+
it "works for simple state machines" do
|
|
9
|
+
expect(simple).to transition_from(:initialised).to(:filled_out).on_event(:fill_out)
|
|
10
|
+
expect(simple).to_not transition_from(:initialised).to(:authorised).on_event(:fill_out)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "works for multiple state machines" do
|
|
14
|
+
expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
|
|
15
|
+
expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
|
|
16
|
+
|
|
17
|
+
expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
|
|
18
|
+
expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe 'allow_transition_to' do
|
|
23
|
+
it "works for simple state machines" do
|
|
24
|
+
expect(simple).to allow_transition_to(:filled_out)
|
|
25
|
+
expect(simple).to_not allow_transition_to(:authorised)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "works for multiple state machines" do
|
|
29
|
+
expect(multiple).to allow_transition_to(:walking).on(:move)
|
|
30
|
+
expect(multiple).to_not allow_transition_to(:standing).on(:move)
|
|
31
|
+
|
|
32
|
+
expect(multiple).to allow_transition_to(:processing).on(:work)
|
|
33
|
+
expect(multiple).to_not allow_transition_to(:sleeping).on(:work)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "have_state" do
|
|
38
|
+
it "works for simple state machines" do
|
|
39
|
+
expect(simple).to have_state :initialised
|
|
40
|
+
expect(simple).to_not have_state :filled_out
|
|
41
|
+
simple.fill_out
|
|
42
|
+
expect(simple).to have_state :filled_out
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "works for multiple state machines" do
|
|
46
|
+
expect(multiple).to have_state(:standing).on(:move)
|
|
47
|
+
expect(multiple).to_not have_state(:walking).on(:move)
|
|
48
|
+
multiple.walk
|
|
49
|
+
expect(multiple).to have_state(:walking).on(:move)
|
|
50
|
+
|
|
51
|
+
expect(multiple).to have_state(:sleeping).on(:work)
|
|
52
|
+
expect(multiple).to_not have_state(:processing).on(:work)
|
|
53
|
+
multiple.start
|
|
54
|
+
expect(multiple).to have_state(:processing).on(:work)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "allow_event" do
|
|
59
|
+
it "works for simple state machines" do
|
|
60
|
+
expect(simple).to allow_event :fill_out
|
|
61
|
+
expect(simple).to_not allow_event :authorise
|
|
62
|
+
simple.fill_out
|
|
63
|
+
expect(simple).to allow_event :authorise
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "works for multiple state machines" do
|
|
67
|
+
expect(multiple).to allow_event(:walk).on(:move)
|
|
68
|
+
expect(multiple).to_not allow_event(:hold).on(:move)
|
|
69
|
+
multiple.walk
|
|
70
|
+
expect(multiple).to allow_event(:hold).on(:move)
|
|
71
|
+
|
|
72
|
+
expect(multiple).to allow_event(:start).on(:work)
|
|
73
|
+
expect(multiple).to_not allow_event(:stop).on(:work)
|
|
74
|
+
multiple.start
|
|
75
|
+
expect(multiple).to allow_event(:stop).on(:work)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aasm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Scott Barron
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2015-
|
|
13
|
+
date: 2015-11-16 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rake
|
|
@@ -116,6 +116,11 @@ files:
|
|
|
116
116
|
- lib/aasm/persistence/mongoid_persistence.rb
|
|
117
117
|
- lib/aasm/persistence/plain_persistence.rb
|
|
118
118
|
- lib/aasm/persistence/sequel_persistence.rb
|
|
119
|
+
- lib/aasm/rspec.rb
|
|
120
|
+
- lib/aasm/rspec/allow_event.rb
|
|
121
|
+
- lib/aasm/rspec/allow_transition_to.rb
|
|
122
|
+
- lib/aasm/rspec/have_state.rb
|
|
123
|
+
- lib/aasm/rspec/transition_from.rb
|
|
119
124
|
- lib/aasm/state_machine.rb
|
|
120
125
|
- lib/aasm/version.rb
|
|
121
126
|
- spec/database.rb
|
|
@@ -224,6 +229,7 @@ files:
|
|
|
224
229
|
- spec/unit/persistence/sequel_persistence_spec.rb
|
|
225
230
|
- spec/unit/readme_spec.rb
|
|
226
231
|
- spec/unit/reloading_spec.rb
|
|
232
|
+
- spec/unit/rspec_matcher_spec.rb
|
|
227
233
|
- spec/unit/simple_example_spec.rb
|
|
228
234
|
- spec/unit/simple_multiple_example_spec.rb
|
|
229
235
|
- spec/unit/state_spec.rb
|
|
@@ -250,7 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
250
256
|
version: '0'
|
|
251
257
|
requirements: []
|
|
252
258
|
rubyforge_project:
|
|
253
|
-
rubygems_version: 2.
|
|
259
|
+
rubygems_version: 2.2.2
|
|
254
260
|
signing_key:
|
|
255
261
|
specification_version: 4
|
|
256
262
|
summary: State machine mixin for Ruby objects
|
|
@@ -361,6 +367,7 @@ test_files:
|
|
|
361
367
|
- spec/unit/persistence/sequel_persistence_spec.rb
|
|
362
368
|
- spec/unit/readme_spec.rb
|
|
363
369
|
- spec/unit/reloading_spec.rb
|
|
370
|
+
- spec/unit/rspec_matcher_spec.rb
|
|
364
371
|
- spec/unit/simple_example_spec.rb
|
|
365
372
|
- spec/unit/simple_multiple_example_spec.rb
|
|
366
373
|
- spec/unit/state_spec.rb
|