transitions 0.1.9 → 0.1.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.
- checksums.yaml +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +4 -0
- data/README.md +16 -8
- data/lib/active_model/transitions.rb +5 -2
- data/lib/transitions/state_transition.rb +7 -3
- data/lib/transitions/version.rb +1 -1
- data/lib/transitions.rb +4 -0
- data/test/active_record/test_custom_select.rb +36 -0
- data/test/machine/test_machine.rb +7 -0
- data/test/state_transition/test_state_transition_guard_check.rb +12 -0
- metadata +16 -33
- data/.rvmrc +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4680820f6d1835b1e12df126890a7c898070b74b
|
4
|
+
data.tar.gz: 98e7433625dee0e047fda25da2c46611c0d93228
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3c91efda00de051d2b0990d6bc82fd71d9eb27ad41e6f8d44ed6adf85e37a77a1372a0f824b04b3e44a0d8c72963fa410804e6f8bcaed6732315468acb4f3c7e
|
7
|
+
data.tar.gz: 5471dd6553cc527e69e90571ef68709ec7dd28678f96cb43d9e6d9df07c0ecb78a05c014d0e361d80365d121ad4164af10dd92cd9ab87b7e19af9637ea953cfe
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
transitions
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
### Overview
|
2
|
-
|
3
|
-
[
|
4
|
-
|
5
|
-
http://travis-ci.org/troessner/transitions) [<img
|
6
|
-
src="https://badge.fury.io/rb/transitions.png" alt="Gem Version"
|
7
|
-
/>](http://badge.fury.io/rb/transitions)
|
2
|
+
[](http://travis-ci.org/troessner/transitions)
|
3
|
+
[](http://badge.fury.io/rb/transitions)
|
4
|
+
[](https://codeclimate.com/github/troessner/transitions)
|
8
5
|
|
9
6
|
### Synopsis
|
10
7
|
|
@@ -71,7 +68,7 @@ wherever you load your dependencies in your application.
|
|
71
68
|
* You can only use one state machine per model. While in theory you can
|
72
69
|
define two or more, this won't work as you would expect. Not supporting
|
73
70
|
this was intentional, if you're interested in the ratione look up version
|
74
|
-
1.0
|
71
|
+
0.1.0 in the CHANGELOG.
|
75
72
|
|
76
73
|
* Use symbols, not strings for declaring the state machine. Using strings is
|
77
74
|
**not** supported as is using whitespace in names (because `transitions`
|
@@ -110,6 +107,11 @@ In addition, a `can_transition?` method is added to the object that expects one
|
|
110
107
|
>> Product.new.can_transition? :out_of_stock
|
111
108
|
=> true
|
112
109
|
|
110
|
+
If you need to get all available transitions for current state you can simply call:
|
111
|
+
|
112
|
+
>> Product.new.available_transitions
|
113
|
+
=> [:discontinued, :out_of_stock]
|
114
|
+
|
113
115
|
#### Automatic scope generation
|
114
116
|
|
115
117
|
`transitions` will automatically generate scopes for you if you are using
|
@@ -142,12 +144,18 @@ you can use this feature a la:
|
|
142
144
|
Each event definition takes an optional `guard` argument, which acts as a
|
143
145
|
predicate for the transition.
|
144
146
|
|
145
|
-
You can pass in
|
147
|
+
You can pass in Symbols, Strings, or Procs like this:
|
146
148
|
|
147
149
|
event :discontinue do
|
148
150
|
transitions :to => :discontinued, :from => [:available, :out_of_stock], :guard => :can_discontinue
|
149
151
|
end
|
150
152
|
|
153
|
+
or
|
154
|
+
|
155
|
+
event :discontinue do
|
156
|
+
transitions :to => :discontinued, :from => [:available, :out_of_stock], :guard => [:can_discontinue, :super_sure?]
|
157
|
+
end
|
158
|
+
|
151
159
|
Any arguments passed to the event method will be passed on to the `guard`
|
152
160
|
predicate.
|
153
161
|
|
@@ -87,8 +87,11 @@ module ActiveModel
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def set_initial_state
|
90
|
-
|
91
|
-
self.
|
90
|
+
# In case we use a query with a custom select that excludes our state attribute name we need to skip the initialization below.
|
91
|
+
if self.has_attribute?(transitions_state_column_name)
|
92
|
+
self[transitions_state_column_name] ||= self.class.get_state_machine.initial_state.to_s
|
93
|
+
self.class.get_state_machine.state_index[self[transitions_state_column_name].to_sym].call_action(:enter, self)
|
94
|
+
end
|
92
95
|
end
|
93
96
|
|
94
97
|
def state_presence
|
@@ -30,11 +30,15 @@ module Transitions
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def perform(obj, *args)
|
33
|
-
|
33
|
+
[@guard].flatten.all? { |g| perform_guard(obj, g, *args) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def perform_guard(obj, guard, *args)
|
37
|
+
case guard
|
34
38
|
when Symbol, String
|
35
|
-
obj.send(
|
39
|
+
obj.send(guard, *args)
|
36
40
|
when Proc
|
37
|
-
|
41
|
+
guard.call(obj, *args)
|
38
42
|
else
|
39
43
|
true
|
40
44
|
end
|
data/lib/transitions/version.rb
CHANGED
data/lib/transitions.rb
CHANGED
@@ -72,6 +72,10 @@ module Transitions
|
|
72
72
|
instance_variable_set(ivar, new_state)
|
73
73
|
end
|
74
74
|
|
75
|
+
def available_transitions
|
76
|
+
self.class.get_state_machine.events_for(current_state)
|
77
|
+
end
|
78
|
+
|
75
79
|
def can_transition?(*events)
|
76
80
|
events.all? do |event|
|
77
81
|
self.class.get_state_machine.events_for(current_state).include?(event.to_sym)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
# Regressiontest for https://github.com/troessner/transitions/issues/95
|
4
|
+
# TODO We use this Trafficlight class quite a lot in our specs including a ton of duplication.
|
5
|
+
# Unify class and migration definition in one place and then clean up all related specs, including this one.
|
6
|
+
class CreateTrafficLights < ActiveRecord::Migration
|
7
|
+
def self.up
|
8
|
+
create_table(:traffic_lights, :force => true) do |t|
|
9
|
+
t.string :state
|
10
|
+
t.string :name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TrafficLight < ActiveRecord::Base
|
16
|
+
include ActiveModel::Transitions
|
17
|
+
|
18
|
+
state_machine do
|
19
|
+
state :off
|
20
|
+
state :on
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestCustomSelect < Test::Unit::TestCase
|
25
|
+
def setup
|
26
|
+
set_up_db CreateTrafficLights
|
27
|
+
@light = TrafficLight.create!
|
28
|
+
end
|
29
|
+
|
30
|
+
test "should not trigger an exception when we use a custom select query which excludes the name of our state attribute" do
|
31
|
+
result = TrafficLight.select("id, name")
|
32
|
+
assert_nothing_raised NoMethodError do
|
33
|
+
result.inspect
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -36,6 +36,13 @@ class TransitionsMachineTest < Test::Unit::TestCase
|
|
36
36
|
assert events.include?(:timeout)
|
37
37
|
end
|
38
38
|
|
39
|
+
test "knows all available transitions for current state" do
|
40
|
+
machine = MachineTestSubject.new
|
41
|
+
assert_equal [:restart], machine.available_transitions
|
42
|
+
machine.restart
|
43
|
+
assert_equal [:shutdown, :timeout], machine.available_transitions
|
44
|
+
end
|
45
|
+
|
39
46
|
test "knows that it can use a transition when it is available" do
|
40
47
|
machine = MachineTestSubject.new
|
41
48
|
machine.restart
|
@@ -39,4 +39,16 @@ class TestStateTransitionGuardCheck < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
st.perform(obj, *args)
|
41
41
|
end
|
42
|
+
|
43
|
+
test "should call the method on the object if guard is a symbol" do
|
44
|
+
opts = {:from => "foo", :to => "bar", :guard => [:test_guard, :test_another_guard] }
|
45
|
+
st = Transitions::StateTransition.new(opts)
|
46
|
+
|
47
|
+
obj = stub
|
48
|
+
obj.expects(:test_guard).with(*args).returns(true)
|
49
|
+
obj.expects(:test_another_guard).with(*args).returns(true)
|
50
|
+
|
51
|
+
assert st.perform(obj, *args)
|
52
|
+
end
|
53
|
+
|
42
54
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transitions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.10
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jakub Kuzma
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-08-07 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: bundler
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ~>
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ~>
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,7 +28,6 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: test-unit
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
32
|
- - ~>
|
37
33
|
- !ruby/object:Gem::Version
|
@@ -39,7 +35,6 @@ dependencies:
|
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
39
|
- - ~>
|
45
40
|
- !ruby/object:Gem::Version
|
@@ -47,7 +42,6 @@ dependencies:
|
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: mocha
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
46
|
- - ~>
|
53
47
|
- !ruby/object:Gem::Version
|
@@ -55,7 +49,6 @@ dependencies:
|
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
53
|
- - ~>
|
61
54
|
- !ruby/object:Gem::Version
|
@@ -63,55 +56,48 @@ dependencies:
|
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: rake
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: random_data
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - '>='
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - '>='
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: sqlite3
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
|
-
- -
|
88
|
+
- - '>='
|
101
89
|
- !ruby/object:Gem::Version
|
102
90
|
version: '0'
|
103
91
|
type: :development
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
|
-
- -
|
95
|
+
- - '>='
|
109
96
|
- !ruby/object:Gem::Version
|
110
97
|
version: '0'
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: activerecord
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
101
|
requirements:
|
116
102
|
- - ~>
|
117
103
|
- !ruby/object:Gem::Version
|
@@ -119,7 +105,6 @@ dependencies:
|
|
119
105
|
type: :development
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
109
|
- - ~>
|
125
110
|
- !ruby/object:Gem::Version
|
@@ -131,7 +116,8 @@ extensions: []
|
|
131
116
|
extra_rdoc_files: []
|
132
117
|
files:
|
133
118
|
- .gitignore
|
134
|
-
- .
|
119
|
+
- .ruby-gemset
|
120
|
+
- .ruby-version
|
135
121
|
- .travis.yml
|
136
122
|
- CHANGELOG.md
|
137
123
|
- Gemfile
|
@@ -149,6 +135,7 @@ files:
|
|
149
135
|
- test/active_record/test_active_record.rb
|
150
136
|
- test/active_record/test_active_record_scopes.rb
|
151
137
|
- test/active_record/test_active_record_timestamps.rb
|
138
|
+
- test/active_record/test_custom_select.rb
|
152
139
|
- test/event/test_event.rb
|
153
140
|
- test/event/test_event_arguments.rb
|
154
141
|
- test/event/test_event_being_fired.rb
|
@@ -167,29 +154,25 @@ files:
|
|
167
154
|
- transitions.gemspec
|
168
155
|
homepage: http://github.com/troessner/transitions
|
169
156
|
licenses: []
|
157
|
+
metadata: {}
|
170
158
|
post_install_message:
|
171
159
|
rdoc_options: []
|
172
160
|
require_paths:
|
173
161
|
- lib
|
174
162
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
163
|
requirements:
|
177
|
-
- -
|
164
|
+
- - '>='
|
178
165
|
- !ruby/object:Gem::Version
|
179
166
|
version: '0'
|
180
|
-
segments:
|
181
|
-
- 0
|
182
|
-
hash: -611477343
|
183
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
-
none: false
|
185
168
|
requirements:
|
186
|
-
- -
|
169
|
+
- - '>='
|
187
170
|
- !ruby/object:Gem::Version
|
188
171
|
version: 1.3.6
|
189
172
|
requirements: []
|
190
173
|
rubyforge_project: transitions
|
191
|
-
rubygems_version:
|
174
|
+
rubygems_version: 2.0.6
|
192
175
|
signing_key:
|
193
|
-
specification_version:
|
176
|
+
specification_version: 4
|
194
177
|
summary: State machine extracted from ActiveModel
|
195
178
|
test_files: []
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm 1.9.3@transitions --create
|