aasm 3.0.9 → 3.0.10

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.
@@ -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