diff --git a/API b/API new file mode 100644 index 00000000..a83fa380 --- /dev/null +++ b/API @@ -0,0 +1,9 @@ +Overwrite method to read the current state + + class MyClass + include AASM + + def aasm_read_state + # retrieve the current state manually + end + end diff --git a/lib/aasm/aasm.rb b/lib/aasm/aasm.rb index 6a6caa6b..1f6c0131 100644 --- a/lib/aasm/aasm.rb +++ b/lib/aasm/aasm.rb @@ -81,6 +81,11 @@ def aasm @aasm ||= AASM::InstanceBase.new(self) end + # may be overwritten by persistence mixins + def aasm_read_state + aasm.enter_initial_state + end + # deprecated def aasm_current_state # warn "#aasm_current_state is deprecated and will be removed in version 3.2.0; please use #aasm.state instead!" diff --git a/lib/aasm/instance_base.rb b/lib/aasm/instance_base.rb index a16c947e..41f73394 100644 --- a/lib/aasm/instance_base.rb +++ b/lib/aasm/instance_base.rb @@ -6,7 +6,7 @@ def initialize(instance) end def current_state - @current_state ||= persistable? ? @instance.aasm_read_state : enter_initial_state + @current_state ||= @instance.aasm_read_state end def current_state=(state) @@ -77,11 +77,5 @@ def set_current_state_with_persistence(state) save_success end - private - - def persistable? - @instance.respond_to?(:aasm_read_state) || @instance.private_methods.include?('aasm_read_state') - end - end end diff --git a/lib/aasm/persistence/active_record_persistence.rb b/lib/aasm/persistence/active_record_persistence.rb index b2c70d93..f5b511b5 100644 --- a/lib/aasm/persistence/active_record_persistence.rb +++ b/lib/aasm/persistence/active_record_persistence.rb @@ -35,7 +35,7 @@ def self.included(base) base.extend AASM::Persistence::Base::ClassMethods base.extend AASM::Persistence::ActiveRecordPersistence::ClassMethods base.send(:include, AASM::Persistence::ActiveRecordPersistence::InstanceMethods) - base.send(:include, AASM::Persistence::ReadState) unless base.method_defined?(:aasm_read_state) + base.send(:include, AASM::Persistence::ReadState) base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteState) unless base.method_defined?(:aasm_write_state) base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteStateWithoutPersistence) unless base.method_defined?(:aasm_write_state_without_persistence) diff --git a/lib/aasm/persistence/mongoid_persistence.rb b/lib/aasm/persistence/mongoid_persistence.rb index e1eda1c8..787031e1 100644 --- a/lib/aasm/persistence/mongoid_persistence.rb +++ b/lib/aasm/persistence/mongoid_persistence.rb @@ -37,7 +37,7 @@ def self.included(base) base.extend AASM::Persistence::Base::ClassMethods base.extend AASM::Persistence::MongoidPersistence::ClassMethods base.send(:include, AASM::Persistence::MongoidPersistence::InstanceMethods) - base.send(:include, AASM::Persistence::ReadState) unless base.method_defined?(:aasm_read_state) + base.send(:include, AASM::Persistence::ReadState) base.send(:include, AASM::Persistence::MongoidPersistence::WriteState) unless base.method_defined?(:aasm_write_state) base.send(:include, AASM::Persistence::MongoidPersistence::WriteStateWithoutPersistence) unless base.method_defined?(:aasm_write_state_without_persistence) diff --git a/lib/aasm/persistence/read_state.rb b/lib/aasm/persistence/read_state.rb index 74bdf4a3..c6f19a67 100644 --- a/lib/aasm/persistence/read_state.rb +++ b/lib/aasm/persistence/read_state.rb @@ -2,16 +2,17 @@ module AASM module Persistence module ReadState - # Returns the value of the aasm_column - called from aasm_current_state + # Returns the value of the aasm_column - called from aasm.current_state # # If it's a new record, and the aasm state column is blank it returns the initial state # (example provided here for ActiveRecord, but it's true for Mongoid as well): # # class Foo < ActiveRecord::Base # include AASM - # aasm_column :status - # aasm_state :opened - # aasm_state :closed + # aasm :column => :status do + # state :opened + # state :closed + # end # end # # foo = Foo.new diff --git a/spec/models/active_record/api.rb b/spec/models/active_record/api.rb new file mode 100644 index 00000000..7b4f39f6 --- /dev/null +++ b/spec/models/active_record/api.rb @@ -0,0 +1,43 @@ +class DefaultState + include AASM + aasm do + state :alpha, :initial => true + state :beta + state :gamma + end +end + +class ProvidedState + include AASM + aasm do + state :alpha, :initial => true + state :beta + state :gamma + end + + def aasm_read_state + :beta + end +end + +class PersistedState < ActiveRecord::Base + include AASM + aasm do + state :alpha, :initial => true + state :beta + state :gamma + end +end + +class ProvidedAndPersistedState < ActiveRecord::Base + include AASM + aasm do + state :alpha, :initial => true + state :beta + state :gamma + end + + def aasm_read_state + :gamma + end +end diff --git a/spec/models/persistence.rb b/spec/models/persistence.rb index e2e63de0..165c6e83 100644 --- a/spec/models/persistence.rb +++ b/spec/models/persistence.rb @@ -15,10 +15,11 @@ class Gate < ActiveRecord::Base end class Reader < ActiveRecord::Base + include AASM + def aasm_read_state "fi" end - include AASM end class Writer < ActiveRecord::Base diff --git a/spec/schema.rb b/spec/schema.rb index e6105378..3f1f1102 100644 --- a/spec/schema.rb +++ b/spec/schema.rb @@ -1,6 +1,6 @@ ActiveRecord::Schema.define(:version => 0) do - %w{gates readers writers transients simples simple_new_dsls thieves localizer_test_models}.each do |table_name| + %w{gates readers writers transients simples simple_new_dsls thieves localizer_test_models persisted_states provided_and_persisted_states}.each do |table_name| create_table table_name, :force => true do |t| t.string "aasm_state" end diff --git a/spec/unit/api_spec.rb b/spec/unit/api_spec.rb new file mode 100644 index 00000000..77682033 --- /dev/null +++ b/spec/unit/api_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' +require 'models/active_record/api.rb' + +describe "retrieving the current state" do + it "uses the AASM default" do + DefaultState.new.aasm.current_state.should eql :alpha + end + + it "uses the provided method" do + ProvidedState.new.aasm.current_state.should eql :beta + end + + it "uses the persistence storage" do + PersistedState.new.aasm.current_state.should eql :alpha + end + + it "uses the provided method even if persisted" do + ProvidedAndPersistedState.new.aasm.current_state.should eql :gamma + end +end diff --git a/spec/unit/persistence/active_record_persistence_spec.rb b/spec/unit/persistence/active_record_persistence_spec.rb index 9311f8c1..0c2fd9de 100644 --- a/spec/unit/persistence/active_record_persistence_spec.rb +++ b/spec/unit/persistence/active_record_persistence_spec.rb @@ -24,16 +24,6 @@ end end -describe "class methods for classes with own read state" do - let(:klass) {Reader} - it_should_behave_like "aasm model" - it "should include all persistence mixins but read state" do - klass.included_modules.should_not be_include(AASM::Persistence::ReadState) - klass.included_modules.should be_include(AASM::Persistence::ActiveRecordPersistence::WriteState) - klass.included_modules.should be_include(AASM::Persistence::ActiveRecordPersistence::WriteStateWithoutPersistence) - end -end - describe "class methods for classes with own write state" do let(:klass) {Writer} it_should_behave_like "aasm model"