Permalink
Browse files

Merge pull request #43 from siuying/mongoid-support

use active_model to avoid invoke ActiveRecord
  • Loading branch information...
2 parents 5e4b1c0 + 639fc1d commit cab16be3e70043ccd6e93d7b57e0d21275e28fe7 @troessner troessner committed Mar 20, 2012
View
@@ -12,11 +12,11 @@
This goes into your Gemfile:
- gem "transitions", :require => ["transitions", "active_record/transitions"]
+ gem "transitions", :require => ["transitions", "active_model/transitions"]
-… and this into your AR model:
+… and this into your ORM model:
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
== Standalone
@@ -62,7 +62,7 @@ bang(!)-version will call <tt>write_state</tt>.
Given a model like this:
class Order < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine :auto_scopes => true do
state :pick_line_items
state :picking_line_items
@@ -0,0 +1,74 @@
+# Copyright (c) 2009 Rick Olson
+
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+module ActiveModel
+ module Transitions
+ extend ActiveSupport::Concern
+
+ included do
+ include ::Transitions
+ after_initialize :set_initial_state
+ validates_presence_of :state
+ validate :state_inclusion
+ end
+
+ # The optional options argument is passed to find when reloading so you may
+ # do e.g. record.reload(:lock => true) to reload the same record with an
+ # exclusive row lock.
+ def reload(options = nil)
+ super.tap do
+ self.class.state_machines.values.each do |sm|
+ remove_instance_variable(sm.current_state_variable) if instance_variable_defined?(sm.current_state_variable)
+ end
+ end
+ end
+
+ protected
+
+ def write_state(state_machine, state)
+ ivar = state_machine.current_state_variable
+ prev_state = current_state(state_machine.name)
+ instance_variable_set(ivar, state)
+ self.state = state.to_s
+ save!
+ rescue ActiveRecord::RecordInvalid
+ self.state = prev_state.to_s
+ instance_variable_set(ivar, prev_state)
+ raise
+ end
+
+ def read_state(state_machine)
+ self.state && self.state.to_sym
+ end
+
+ def set_initial_state
+ self.state ||= self.class.state_machine.initial_state.to_s if self.has_attribute?(:state)
+ end
+
+ def state_inclusion
+ unless self.class.state_machine.states.map{|s| s.name.to_s }.include?(self.state.to_s)
+ self.errors.add(:state, :inclusion, :value => self.state)
+ end
+ end
+ end
+end
+
@@ -1,74 +1,5 @@
-# Copyright (c) 2009 Rick Olson
-
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation files
-# (the "Software"), to deal in the Software without restriction,
-# including without limitation the rights to use, copy, modify, merge,
-# publish, distribute, sublicense, and/or sell copies of the Software,
-# and to permit persons to whom the Software is furnished to do so,
-# subject to the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
+require_relative '../active_model/transitions'
module ActiveRecord
- module Transitions
- extend ActiveSupport::Concern
-
- included do
- include ::Transitions
- after_initialize :set_initial_state
- validates_presence_of :state
- validate :state_inclusion
- end
-
- # The optional options argument is passed to find when reloading so you may
- # do e.g. record.reload(:lock => true) to reload the same record with an
- # exclusive row lock.
- def reload(options = nil)
- super.tap do
- self.class.state_machines.values.each do |sm|
- remove_instance_variable(sm.current_state_variable) if instance_variable_defined?(sm.current_state_variable)
- end
- end
- end
-
- protected
-
- def write_state(state_machine, state)
- ivar = state_machine.current_state_variable
- prev_state = current_state(state_machine.name)
- instance_variable_set(ivar, state)
- self.state = state.to_s
- save!
- rescue ActiveRecord::RecordInvalid
- self.state = prev_state.to_s
- instance_variable_set(ivar, prev_state)
- raise
- end
-
- def read_state(state_machine)
- self.state && self.state.to_sym
- end
-
- def set_initial_state
- self.state ||= self.class.state_machine.initial_state.to_s if self.has_attribute?(:state)
- end
-
- def state_inclusion
- unless self.class.state_machine.states.map{|s| s.name.to_s }.include?(self.state.to_s)
- self.errors.add(:state, :inclusion, :value => self.state)
- end
- end
- end
-end
-
+ Transitions = ActiveModel::Transitions
+end
View
@@ -9,7 +9,7 @@
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
$LOAD_PATH.unshift(File.dirname(__FILE__))
require "transitions"
-require "active_record/transitions"
+require "active_model/transitions"
class Test::Unit::TestCase
@@ -33,7 +33,7 @@ def self.up
CreateLights.migrate(:up)
class TrafficLight < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine :auto_scopes => true do
state :off
@@ -73,7 +73,7 @@ class ConditionalValidatingTrafficLight < TrafficLight
end
class LightBulb < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine do
state :off
@@ -203,7 +203,7 @@ class TestScopes < Test::Unit::TestCase
test 'scope generation raises an exception if we try to overwrite an existing method' do
assert_raise(Transitions::InvalidMethodOverride) {
class Light < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine :auto_scopes => true do
state :new
@@ -4,7 +4,7 @@
create_database
class Order < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine do
state :opened
@@ -104,7 +104,7 @@ def create_order(state = nil)
test "passing an invalid value to timestamp options should raise an exception" do
assert_raise(ArgumentError) do
class Order < ActiveRecord::Base
- include ActiveRecord::Transitions
+ include ActiveModel::Transitions
state_machine do
event :replace, timestamp: 1 do
transitions :from => :prepared, :to => :placed

0 comments on commit cab16be

Please sign in to comment.