aasm 3.0.9 → 3.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.0.10
4
+
5
+ * added support for transitions from all other states (thanks to Stefan 'swrobel' Wrobel)
6
+
3
7
  ## 3.0.9
4
8
 
5
9
  * guard checks (e.g. may_edit?) now support guard parameters as well
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # AASM - Ruby state machines [![Build Status](https://secure.travis-ci.org/aasm/aasm.png)](http://travis-ci.org/aasm/aasm)
1
+ # AASM - Ruby state machines [![Build Status](https://secure.travis-ci.org/aasm/aasm.png)](http://travis-ci.org/aasm/aasm) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/aasm/aasm)
2
2
 
3
3
  This package contains AASM, a library for adding finite state machines to Ruby classes.
4
4
 
@@ -101,8 +101,9 @@ This example uses a few of the more complex features available.
101
101
  transitions :to => :intimate, :from => [:dating], :guard => :drunk?
102
102
  end
103
103
 
104
+ # Will allow transitioning from any state if guard allows it
104
105
  event :get_married do
105
- transitions :to => :married, :from => [:dating, :intimate], :guard => :willing_to_give_up_manhood?
106
+ transitions :to => :married, :guard => :willing_to_give_up_manhood?
106
107
  end
107
108
  end
108
109
  aasm_initial_state Proc.new { |relationship| relationship.strictly_for_fun? ? :intimate : :dating }
@@ -13,34 +13,11 @@ module AASM
13
13
  # executes the transition guards to determine if a transition is even
14
14
  # an option given current conditions.
15
15
  def may_fire?(obj, to_state=nil, *args)
16
- transitions = @transitions.select { |t| t.from == obj.aasm_current_state }
17
- return false if transitions.size == 0
18
-
19
- result = false
20
- transitions.each do |transition|
21
- next if to_state and !Array(transition.to).include?(to_state)
22
- if transition.perform(obj, *args)
23
- result = true
24
- break
25
- end
26
- end
27
- result
16
+ _fire(obj, true, to_state, *args) # true indicates test firing
28
17
  end
29
18
 
30
19
  def fire(obj, to_state=nil, *args)
31
- transitions = @transitions.select { |t| t.from == obj.aasm_current_state }
32
- return nil if transitions.size == 0
33
-
34
- next_state = nil
35
- transitions.each do |transition|
36
- next if to_state and !Array(transition.to).include?(to_state)
37
- if transition.perform(obj, *args)
38
- next_state = to_state || Array(transition.to).first
39
- transition.execute(obj, *args)
40
- break
41
- end
42
- end
43
- next_state
20
+ _fire(obj, false, to_state, *args) # false indicates this is not a test (fire!)
44
21
  end
45
22
 
46
23
  def transitions_from_state?(state)
@@ -112,6 +89,32 @@ module AASM
112
89
  self
113
90
  end
114
91
 
92
+ # Execute if test? == false, otherwise return true/false depending on whether it would fire
93
+ def _fire(obj, test, to_state=nil, *args)
94
+ if @transitions.map(&:from).any?
95
+ transitions = @transitions.select { |t| t.from == obj.aasm_current_state }
96
+ return nil if transitions.size == 0
97
+ else
98
+ transitions = @transitions
99
+ end
100
+
101
+ result = test ? false : nil
102
+ transitions.each do |transition|
103
+ next if to_state and !Array(transition.to).include?(to_state)
104
+ if transition.perform(obj, *args)
105
+ if test
106
+ result = true
107
+ else
108
+ result = to_state || Array(transition.to).first
109
+ transition.execute(obj, *args)
110
+ end
111
+
112
+ break
113
+ end
114
+ end
115
+ result
116
+ end
117
+
115
118
  def _fire_callbacks(action, record)
116
119
  case action
117
120
  when Symbol, String
@@ -122,9 +125,12 @@ module AASM
122
125
  end
123
126
 
124
127
  def transitions(trans_opts)
128
+ # Create a separate transition for each from state to the given state
125
129
  Array(trans_opts[:from]).each do |s|
126
130
  @transitions << AASM::SupportingClasses::StateTransition.new(trans_opts.merge({:from => s.to_sym}))
127
131
  end
132
+ # Create a transition if to is specified without from (transitions from ANY state)
133
+ @transitions << AASM::SupportingClasses::StateTransition.new(trans_opts) if @transitions.empty? && trans_opts[:to]
128
134
  end
129
135
 
130
136
  end
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "3.0.9"
2
+ VERSION = "3.0.10"
3
3
  end
@@ -9,9 +9,14 @@ class Silencer
9
9
  event :cry do
10
10
  transitions :from => :silent, :to => :crying
11
11
  end
12
+
12
13
  event :smile do
13
14
  transitions :from => :crying, :to => :smiling
14
15
  end
16
+
17
+ event :smile_any do
18
+ transitions :to => :smiling
19
+ end
15
20
  end
16
21
 
17
22
  end
@@ -19,6 +19,12 @@ describe 'transitions' do
19
19
  sub.smile!.should be_false
20
20
  sub.should be_silent
21
21
  end
22
+
23
+ it 'should not raise an exception when from is nil even if whiny' do
24
+ silencer = Silencer.new
25
+ silencer.smile_any!.should be_true
26
+ silencer.should be_smiling
27
+ end
22
28
 
23
29
  end
24
30
 
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: 3.0.9
4
+ version: 3.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,11 +12,11 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-09-26 00:00:00.000000000Z
15
+ date: 2012-10-19 00:00:00.000000000Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activerecord
19
- requirement: &70261337622160 !ruby/object:Gem::Requirement
19
+ requirement: &70142949460520 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: '0'
25
25
  type: :development
26
26
  prerelease: false
27
- version_requirements: *70261337622160
27
+ version_requirements: *70142949460520
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
- requirement: &70261337621740 !ruby/object:Gem::Requirement
30
+ requirement: &70142949460100 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: '0'
36
36
  type: :development
37
37
  prerelease: false
38
- version_requirements: *70261337621740
38
+ version_requirements: *70142949460100
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: sdoc
41
- requirement: &70261337621320 !ruby/object:Gem::Requirement
41
+ requirement: &70142949459680 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: '0'
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *70261337621320
49
+ version_requirements: *70142949459680
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: rspec
52
- requirement: &70261337620820 !ruby/object:Gem::Requirement
52
+ requirement: &70142949459180 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ~>
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: '2.0'
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *70261337620820
60
+ version_requirements: *70142949459180
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rr
63
- requirement: &70261337620400 !ruby/object:Gem::Requirement
63
+ requirement: &70142949458760 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: '0'
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *70261337620400
71
+ version_requirements: *70142949458760
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: shoulda
74
- requirement: &70261337651400 !ruby/object:Gem::Requirement
74
+ requirement: &70142949489760 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ! '>='
@@ -79,10 +79,10 @@ dependencies:
79
79
  version: '0'
80
80
  type: :development
81
81
  prerelease: false
82
- version_requirements: *70261337651400
82
+ version_requirements: *70142949489760
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: sqlite3
85
- requirement: &70261337650980 !ruby/object:Gem::Requirement
85
+ requirement: &70142949489340 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ! '>='
@@ -90,10 +90,10 @@ dependencies:
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
- version_requirements: *70261337650980
93
+ version_requirements: *70142949489340
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: minitest
96
- requirement: &70261337650560 !ruby/object:Gem::Requirement
96
+ requirement: &70142949488920 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ! '>='
@@ -101,10 +101,10 @@ dependencies:
101
101
  version: '0'
102
102
  type: :development
103
103
  prerelease: false
104
- version_requirements: *70261337650560
104
+ version_requirements: *70142949488920
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: ruby-debug-completion
107
- requirement: &70261337650140 !ruby/object:Gem::Requirement
107
+ requirement: &70142949488500 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
110
  - - ! '>='
@@ -112,7 +112,7 @@ dependencies:
112
112
  version: '0'
113
113
  type: :development
114
114
  prerelease: false
115
- version_requirements: *70261337650140
115
+ version_requirements: *70142949488500
116
116
  description: AASM is a continuation of the acts as state machine rails plugin, built
117
117
  for plain Ruby objects.
118
118
  email: scott@elitists.net, ttilley@gmail.com, aasm@mt7.de