aasm 4.4.1 → 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 +5 -0
- data/README.md +35 -0
- data/lib/aasm/rspec.rb +5 -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/version.rb +1 -1
- data/spec/spec_helper.rb +1 -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,10 @@
|
|
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
|
+
|
3
8
|
## 4.4.1
|
4
9
|
|
5
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))
|
data/README.md
CHANGED
@@ -721,6 +721,41 @@ Job.aasm.states_for_select
|
|
721
721
|
```
|
722
722
|
|
723
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
|
+
```
|
724
759
|
|
725
760
|
## <a id="installation">Installation ##
|
726
761
|
|
data/lib/aasm/rspec.rb
ADDED
@@ -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/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'
|
@@ -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
|