transitions 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # 0.0.14 (2012-04-16):
2
+
3
+ * (troessner) Improve error messages for invalid transitions.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- transitions (0.0.13)
4
+ transitions (0.0.14)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.rdoc CHANGED
@@ -12,11 +12,11 @@
12
12
 
13
13
  This goes into your Gemfile:
14
14
 
15
- gem "transitions", :require => ["transitions", "active_record/transitions"]
15
+ gem "transitions", :require => ["transitions", "active_model/transitions"]
16
16
 
17
- … and this into your AR model:
17
+ … and this into your ORM model:
18
18
 
19
- include ActiveRecord::Transitions
19
+ include ActiveModel::Transitions
20
20
 
21
21
  == Standalone
22
22
 
@@ -62,7 +62,7 @@ bang(!)-version will call <tt>write_state</tt>.
62
62
  Given a model like this:
63
63
 
64
64
  class Order < ActiveRecord::Base
65
- include ActiveRecord::Transitions
65
+ include ActiveModel::Transitions
66
66
  state_machine :auto_scopes => true do
67
67
  state :pick_line_items
68
68
  state :picking_line_items
@@ -117,7 +117,7 @@ the name of the timestamp column.
117
117
 
118
118
  # This will look for an attribute named repaired_on to update upon save
119
119
  event :rebuild, :timestamp => :repaired_on do
120
- transiions :from => :exploded, :to => :rebuilt
120
+ transitions :from => :exploded, :to => :rebuilt
121
121
  end
122
122
 
123
123
  == Listing all the available states
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2009 Rick Olson
2
+
3
+ # Permission is hereby granted, free of charge, to any person
4
+ # obtaining a copy of this software and associated documentation files
5
+ # (the "Software"), to deal in the Software without restriction,
6
+ # including without limitation the rights to use, copy, modify, merge,
7
+ # publish, distribute, sublicense, and/or sell copies of the Software,
8
+ # and to permit persons to whom the Software is furnished to do so,
9
+ # subject to the following conditions:
10
+
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18
+ # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19
+ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ module ActiveModel
24
+ module Transitions
25
+ extend ActiveSupport::Concern
26
+
27
+ included do
28
+ include ::Transitions
29
+ after_initialize :set_initial_state
30
+ validates_presence_of :state
31
+ validate :state_inclusion
32
+ end
33
+
34
+ # The optional options argument is passed to find when reloading so you may
35
+ # do e.g. record.reload(:lock => true) to reload the same record with an
36
+ # exclusive row lock.
37
+ def reload(options = nil)
38
+ super.tap do
39
+ self.class.state_machines.values.each do |sm|
40
+ remove_instance_variable(sm.current_state_variable) if instance_variable_defined?(sm.current_state_variable)
41
+ end
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ def write_state(state_machine, state)
48
+ ivar = state_machine.current_state_variable
49
+ prev_state = current_state(state_machine.name)
50
+ instance_variable_set(ivar, state)
51
+ self.state = state.to_s
52
+ save!
53
+ rescue ActiveRecord::RecordInvalid
54
+ self.state = prev_state.to_s
55
+ instance_variable_set(ivar, prev_state)
56
+ raise
57
+ end
58
+
59
+ def read_state(state_machine)
60
+ self.state && self.state.to_sym
61
+ end
62
+
63
+ def set_initial_state
64
+ self.state ||= self.class.state_machine.initial_state.to_s if self.has_attribute?(:state)
65
+ end
66
+
67
+ def state_inclusion
68
+ unless self.class.state_machine.states.map{|s| s.name.to_s }.include?(self.state.to_s)
69
+ self.errors.add(:state, :inclusion, :value => self.state)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
@@ -1,74 +1,5 @@
1
- # Copyright (c) 2009 Rick Olson
2
-
3
- # Permission is hereby granted, free of charge, to any person
4
- # obtaining a copy of this software and associated documentation files
5
- # (the "Software"), to deal in the Software without restriction,
6
- # including without limitation the rights to use, copy, modify, merge,
7
- # publish, distribute, sublicense, and/or sell copies of the Software,
8
- # and to permit persons to whom the Software is furnished to do so,
9
- # subject to the following conditions:
10
-
11
- # The above copyright notice and this permission notice shall be
12
- # included in all copies or substantial portions of the Software.
13
-
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18
- # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19
- # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
- # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- # SOFTWARE.
1
+ require_relative '../active_model/transitions'
22
2
 
23
3
  module ActiveRecord
24
- module Transitions
25
- extend ActiveSupport::Concern
26
-
27
- included do
28
- include ::Transitions
29
- after_initialize :set_initial_state
30
- validates_presence_of :state
31
- validate :state_inclusion
32
- end
33
-
34
- # The optional options argument is passed to find when reloading so you may
35
- # do e.g. record.reload(:lock => true) to reload the same record with an
36
- # exclusive row lock.
37
- def reload(options = nil)
38
- super.tap do
39
- self.class.state_machines.values.each do |sm|
40
- remove_instance_variable(sm.current_state_variable) if instance_variable_defined?(sm.current_state_variable)
41
- end
42
- end
43
- end
44
-
45
- protected
46
-
47
- def write_state(state_machine, state)
48
- ivar = state_machine.current_state_variable
49
- prev_state = current_state(state_machine.name)
50
- instance_variable_set(ivar, state)
51
- self.state = state.to_s
52
- save!
53
- rescue ActiveRecord::RecordInvalid
54
- self.state = prev_state.to_s
55
- instance_variable_set(ivar, prev_state)
56
- raise
57
- end
58
-
59
- def read_state(state_machine)
60
- self.state && self.state.to_sym
61
- end
62
-
63
- def set_initial_state
64
- self.state ||= self.class.state_machine.initial_state.to_s if self.has_attribute?(:state)
65
- end
66
-
67
- def state_inclusion
68
- unless self.class.state_machine.states.map{|s| s.name.to_s }.include?(self.state.to_s)
69
- self.errors.add(:state, :inclusion, :value => self.state)
70
- end
71
- end
72
- end
73
- end
74
-
4
+ Transitions = ActiveModel::Transitions
5
+ end
@@ -40,7 +40,7 @@ module Transitions
40
40
 
41
41
  def fire(obj, to_state = nil, *args)
42
42
  transitions = @transitions.select { |t| t.from == obj.current_state(@machine ? @machine.name : nil) }
43
- raise InvalidTransition if transitions.size == 0
43
+ raise InvalidTransition, error_message_for_invalid_transitions(obj) if transitions.size == 0
44
44
 
45
45
  next_state = nil
46
46
  transitions.each do |transition|
@@ -133,5 +133,9 @@ module Transitions
133
133
  lambda { |record| record.send(callback_symbol_or_proc) }
134
134
  end
135
135
  end
136
+
137
+ def error_message_for_invalid_transitions(obj)
138
+ "No transitions present for `#{obj.class.name}` #{obj.class < ActiveRecord::Base && obj.persisted? ? "with ID #{obj.id} " : nil}with current state `#{obj.current_state}`"
139
+ end
136
140
  end
137
141
  end
@@ -1,3 +1,3 @@
1
1
  module Transitions
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.14"
3
3
  end
data/test/helper.rb CHANGED
@@ -9,7 +9,7 @@ require "ruby-debug"
9
9
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
10
10
  $LOAD_PATH.unshift(File.dirname(__FILE__))
11
11
  require "transitions"
12
- require "active_record/transitions"
12
+ require "active_model/transitions"
13
13
 
14
14
  class Test::Unit::TestCase
15
15
 
@@ -33,7 +33,7 @@ CreateLightBulbs.migrate(:up)
33
33
  CreateLights.migrate(:up)
34
34
 
35
35
  class TrafficLight < ActiveRecord::Base
36
- include ActiveRecord::Transitions
36
+ include ActiveModel::Transitions
37
37
 
38
38
  state_machine :auto_scopes => true do
39
39
  state :off
@@ -73,7 +73,7 @@ class ConditionalValidatingTrafficLight < TrafficLight
73
73
  end
74
74
 
75
75
  class LightBulb < ActiveRecord::Base
76
- include ActiveRecord::Transitions
76
+ include ActiveModel::Transitions
77
77
 
78
78
  state_machine do
79
79
  state :off
@@ -203,7 +203,7 @@ class TestScopes < Test::Unit::TestCase
203
203
  test 'scope generation raises an exception if we try to overwrite an existing method' do
204
204
  assert_raise(Transitions::InvalidMethodOverride) {
205
205
  class Light < ActiveRecord::Base
206
- include ActiveRecord::Transitions
206
+ include ActiveModel::Transitions
207
207
 
208
208
  state_machine :auto_scopes => true do
209
209
  state :new
@@ -4,7 +4,7 @@ require 'active_support/core_ext/module/aliasing'
4
4
  create_database
5
5
 
6
6
  class Order < ActiveRecord::Base
7
- include ActiveRecord::Transitions
7
+ include ActiveModel::Transitions
8
8
 
9
9
  state_machine do
10
10
  state :opened
@@ -104,7 +104,7 @@ class TestActiveRecordTimestamps < Test::Unit::TestCase
104
104
  test "passing an invalid value to timestamp options should raise an exception" do
105
105
  assert_raise(ArgumentError) do
106
106
  class Order < ActiveRecord::Base
107
- include ActiveRecord::Transitions
107
+ include ActiveModel::Transitions
108
108
  state_machine do
109
109
  event :replace, timestamp: 1 do
110
110
  transitions :from => :prepared, :to => :placed
@@ -3,10 +3,14 @@ require "helper"
3
3
  class TestEventBeingFired < Test::Unit::TestCase
4
4
  test "should raise an Transitions::InvalidTransition error if the transitions are empty" do
5
5
  event = Transitions::Event.new(nil, :event)
6
+ class AnotherDummy; end
7
+ obj = AnotherDummy.new
8
+ obj.stubs(:current_state).returns(:running)
6
9
 
7
- assert_raise Transitions::InvalidTransition do
8
- event.fire(nil)
10
+ exception = assert_raise Transitions::InvalidTransition do
11
+ event.fire(obj)
9
12
  end
13
+ assert_match /No transitions present for `TestEventBeingFired::AnotherDummy` with current state `running`/, exception.message
10
14
  end
11
15
 
12
16
  test "should return the state of the first matching transition it finds" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transitions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-20 00:00:00.000000000Z
13
+ date: 2012-04-16 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
- requirement: &77702010 !ruby/object:Gem::Requirement
17
+ requirement: &74398430 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '1'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *77702010
25
+ version_requirements: *74398430
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: test-unit
28
- requirement: &77701310 !ruby/object:Gem::Requirement
28
+ requirement: &74398010 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '2.2'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *77701310
36
+ version_requirements: *74398010
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: mocha
39
- requirement: &77700870 !ruby/object:Gem::Requirement
39
+ requirement: &74397730 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *77700870
47
+ version_requirements: *74397730
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: sqlite3-ruby
50
- requirement: &77700370 !ruby/object:Gem::Requirement
50
+ requirement: &74397410 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *77700370
58
+ version_requirements: *74397410
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: activerecord
61
- requirement: &77699800 !ruby/object:Gem::Requirement
61
+ requirement: &74396940 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '3'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *77699800
69
+ version_requirements: *74396940
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: ruby-debug19
72
- requirement: &77698980 !ruby/object:Gem::Requirement
72
+ requirement: &74396440 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *77698980
80
+ version_requirements: *74396440
81
81
  description: Lightweight state machine extracted from ActiveModel
82
82
  email: timo.roessner@googlemail.com
83
83
  executables: []
@@ -87,11 +87,13 @@ files:
87
87
  - .gitignore
88
88
  - .rvmrc
89
89
  - .travis.yml
90
+ - CHANGELOG.md
90
91
  - Gemfile
91
92
  - Gemfile.lock
92
93
  - LICENSE
93
94
  - README.rdoc
94
95
  - Rakefile
96
+ - lib/active_model/transitions.rb
95
97
  - lib/active_record/transitions.rb
96
98
  - lib/transitions.rb
97
99
  - lib/transitions/event.rb
@@ -128,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
130
  version: '0'
129
131
  segments:
130
132
  - 0
131
- hash: 819396333
133
+ hash: 950488929
132
134
  required_rubygems_version: !ruby/object:Gem::Requirement
133
135
  none: false
134
136
  requirements: