diff --git a/CHANGELOG.md b/CHANGELOG.md index 310a903..31125ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ ## 4.1.0 (not yet released) - * `aasm_human_event_name` is deprecated, use `aasm.human_event_name` instead + * `aasm_column` has been removed. Use `aasm.attribute_name` instead + * `aasm_human_event_name` has been removed. Use `aasm.human_event_name` instead + +## 4.0.x (not yet released) + + * `aasm_column` is deprecated. Use `aasm.attribute_name` instead ## 4.0.2 @@ -11,6 +16,7 @@ ## 4.0.1 * fire guards only once per transition (see [issue #184](https://github.com/aasm/aasm/issues/184) for details) + * `aasm_human_event_name` is deprecated, use `aasm.human_event_name` instead ## 4.0.0 diff --git a/lib/aasm/base.rb b/lib/aasm/base.rb index a4b3d54..2eb833e 100644 --- a/lib/aasm/base.rb +++ b/lib/aasm/base.rb @@ -34,6 +34,16 @@ module AASM end end + # This method is both a getter and a setter + def attribute_name(column_name=nil) + if column_name + @state_machine.config.column = column_name.to_sym + else + @state_machine.config.column ||= :aasm_state + end + @state_machine.config.column + end + def initial_state(new_initial_state=nil) if new_initial_state @state_machine.initial_state = new_initial_state diff --git a/lib/aasm/localizer.rb b/lib/aasm/localizer.rb index 5bc44fa..e1cd126 100644 --- a/lib/aasm/localizer.rb +++ b/lib/aasm/localizer.rb @@ -21,7 +21,7 @@ module AASM def item_for(klass, state, ancestor, options={}) separator = options[:old_style] ? '.' : '/' - :"#{i18n_scope(klass)}.attributes.#{i18n_klass(ancestor)}.#{klass.aasm_column}#{separator}#{state}" + :"#{i18n_scope(klass)}.attributes.#{i18n_klass(ancestor)}.#{klass.aasm.attribute_name}#{separator}#{state}" end def translate_queue(checklist) diff --git a/lib/aasm/persistence/active_record_persistence.rb b/lib/aasm/persistence/active_record_persistence.rb index b8979c0..31e164a 100644 --- a/lib/aasm/persistence/active_record_persistence.rb +++ b/lib/aasm/persistence/active_record_persistence.rb @@ -84,17 +84,17 @@ module AASM # # NOTE: intended to be called from an event def aasm_write_state(state) - old_value = read_attribute(self.class.aasm_column) + old_value = read_attribute(self.class.aasm.attribute_name) aasm_write_attribute state success = if aasm_skipping_validations value = aasm_raw_attribute_value state - self.class.where(self.class.primary_key => self.id).update_all(self.class.aasm_column => value) == 1 + self.class.where(self.class.primary_key => self.id).update_all(self.class.aasm.attribute_name => value) == 1 else self.save end unless success - write_attribute(self.class.aasm_column, old_value) + write_attribute(self.class.aasm.attribute_name, old_value) return false end @@ -128,11 +128,11 @@ module AASM end def aasm_column_looks_like_enum - self.class.columns_hash[self.class.aasm_column.to_s].type == :integer + self.class.columns_hash[self.class.aasm.attribute_name.to_s].type == :integer end def aasm_guess_enum_method - self.class.aasm_column.to_s.pluralize.to_sym + self.class.aasm.attribute_name.to_s.pluralize.to_sym end def aasm_skipping_validations @@ -140,7 +140,7 @@ module AASM end def aasm_write_attribute(state) - write_attribute self.class.aasm_column, aasm_raw_attribute_value(state) + write_attribute self.class.aasm.attribute_name, aasm_raw_attribute_value(state) end def aasm_raw_attribute_value(state) @@ -167,7 +167,7 @@ module AASM # foo.aasm_state # => nil # def aasm_ensure_initial_state - aasm.enter_initial_state if send(self.class.aasm_column).blank? + aasm.enter_initial_state if send(self.class.aasm.attribute_name).blank? end def aasm_fire_event(name, options, *args, &block) diff --git a/lib/aasm/persistence/base.rb b/lib/aasm/persistence/base.rb index e103b7c..be12ac5 100644 --- a/lib/aasm/persistence/base.rb +++ b/lib/aasm/persistence/base.rb @@ -6,7 +6,7 @@ module AASM base.extend ClassMethods end - # Returns the value of the aasm_column - called from aasm.current_state + # Returns the value of the aasm.attribute_name - 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): @@ -33,7 +33,7 @@ module AASM # # This allows for nil aasm states - be sure to add validation to your model def aasm_read_state - state = send(self.class.aasm_column) + state = send(self.class.aasm.attribute_name) if new_record? state.blank? ? aasm.determine_state_name(self.class.aasm.initial_state) : state.to_sym else @@ -42,41 +42,9 @@ module AASM end module ClassMethods - # Maps to the aasm_column in the database. Defaults to "aasm_state". You can write - # (example provided here for ActiveRecord, but it's true for Mongoid as well): - # - # create_table :foos do |t| - # t.string :name - # t.string :aasm_state - # end - # - # class Foo < ActiveRecord::Base - # include AASM - # end - # - # OR: - # - # create_table :foos do |t| - # t.string :name - # t.string :status - # end - # - # class Foo < ActiveRecord::Base - # include AASM - # aasm_column :status - # end - # - # This method is both a getter and a setter - def aasm_column(column_name=nil) - if column_name - AASM::StateMachine[self].config.column = column_name.to_sym - # @aasm_column = column_name.to_sym - else - AASM::StateMachine[self].config.column ||= :aasm_state - # @aasm_column ||= :aasm_state - end - # @aasm_column - AASM::StateMachine[self].config.column + def aasm_column(attribute_name=nil) + warn "[DEPRECATION] aasm_column is deprecated. Use aasm.attribute_name instead" + aasm.attribute_name(attribute_name) end end # ClassMethods @@ -90,7 +58,7 @@ module AASM if AASM::StateMachine[@klass].config.create_scopes && !@klass.respond_to?(name) if @klass.ancestors.map {|klass| klass.to_s}.include?("ActiveRecord::Base") - conditions = {"#{@klass.table_name}.#{@klass.aasm_column}" => name.to_s} + conditions = {"#{@klass.table_name}.#{@klass.aasm.attribute_name}" => name.to_s} if ActiveRecord::VERSION::MAJOR >= 3 @klass.class_eval do scope name, lambda { where(conditions) } @@ -101,7 +69,7 @@ module AASM end end elsif @klass.ancestors.map {|klass| klass.to_s}.include?("Mongoid::Document") - scope_options = lambda { @klass.send(:where, {@klass.aasm_column.to_sym => name.to_s}) } + scope_options = lambda { @klass.send(:where, {@klass.aasm.attribute_name.to_sym => name.to_s}) } @klass.send(:scope, name, scope_options) end end diff --git a/lib/aasm/persistence/mongoid_persistence.rb b/lib/aasm/persistence/mongoid_persistence.rb index 0cf4663..8c1d872 100644 --- a/lib/aasm/persistence/mongoid_persistence.rb +++ b/lib/aasm/persistence/mongoid_persistence.rb @@ -55,7 +55,7 @@ module AASM end def with_state_scope(state) - with_scope where(aasm_column.to_sym => state.to_s) do + with_scope where(aasm.attribute_name.to_sym => state.to_s) do yield if block_given? end end @@ -75,11 +75,11 @@ module AASM # # NOTE: intended to be called from an event def aasm_write_state(state) - old_value = read_attribute(self.class.aasm_column) - write_attribute(self.class.aasm_column, state.to_s) + old_value = read_attribute(self.class.aasm.attribute_name) + write_attribute(self.class.aasm.attribute_name, state.to_s) unless self.save(:validate => false) - write_attribute(self.class.aasm_column, old_value) + write_attribute(self.class.aasm.attribute_name, old_value) return false end @@ -99,7 +99,7 @@ module AASM # # NOTE: intended to be called from an event def aasm_write_state_without_persistence(state) - write_attribute(self.class.aasm_column, state.to_s) + write_attribute(self.class.aasm.attribute_name, state.to_s) end private @@ -120,14 +120,14 @@ module AASM # foo.aasm_state # => nil # def aasm_ensure_initial_state - send("#{self.class.aasm_column}=", aasm.enter_initial_state.to_s) if send(self.class.aasm_column).blank? + send("#{self.class.aasm.attribute_name}=", aasm.enter_initial_state.to_s) if send(self.class.aasm.attribute_name).blank? end end # InstanceMethods module NamedScopeMethods def aasm_state_with_named_scope name, options = {} aasm_state_without_named_scope name, options - self.named_scope name, :conditions => { "#{table_name}.#{self.aasm_column}" => name.to_s} unless self.respond_to?(name) + self.named_scope name, :conditions => { "#{table_name}.#{self.aasm.attribute_name}" => name.to_s} unless self.respond_to?(name) end end end diff --git a/lib/aasm/persistence/sequel_persistence.rb b/lib/aasm/persistence/sequel_persistence.rb index 9de3e62..50c76c9 100644 --- a/lib/aasm/persistence/sequel_persistence.rb +++ b/lib/aasm/persistence/sequel_persistence.rb @@ -17,7 +17,7 @@ module AASM super end - # Returns the value of the aasm_column - called from aasm.current_state + # Returns the value of the aasm.attribute_name - called from aasm.current_state # # If it's a new record, and the aasm state column is blank it returns the initial state # @@ -43,7 +43,7 @@ module AASM # # This allows for nil aasm states - be sure to add validation to your model def aasm_read_state - state = send(self.class.aasm_column) + state = send(self.class.aasm.attribute_name) if new? && state.to_s.strip.empty? aasm.determine_state_name(self.class.aasm.initial_state) elsif state.nil? @@ -70,7 +70,7 @@ module AASM # def aasm_ensure_initial_state aasm.enter_initial_state if - send(self.class.aasm_column).to_s.strip.empty? + send(self.class.aasm.attribute_name).to_s.strip.empty? end # Writes state to the state column and persists it to the database @@ -83,7 +83,7 @@ module AASM # # NOTE: intended to be called from an event def aasm_write_state state - aasm_column = self.class.aasm_column + aasm_column = self.class.aasm.attribute_name update_only({aasm_column => state.to_s}, aasm_column) end @@ -100,7 +100,7 @@ module AASM # # NOTE: intended to be called from an event def aasm_write_state_without_persistence state - send("#{self.class.aasm_column}=", state.to_s) + send("#{self.class.aasm.attribute_name}=", state.to_s) end end end diff --git a/spec/unit/persistence/active_record_persistence_spec.rb b/spec/unit/persistence/active_record_persistence_spec.rb index a5d7865..80feba4 100644 --- a/spec/unit/persistence/active_record_persistence_spec.rb +++ b/spec/unit/persistence/active_record_persistence_spec.rb @@ -30,7 +30,7 @@ describe "instance methods" do let(:columns_hash) { Hash[column_name, column] } before :each do - gate.class.stub(:aasm_column).and_return(column_name.to_sym) + gate.class.aasm.stub(:attribute_name).and_return(column_name.to_sym) gate.class.stub(:columns_hash).and_return(columns_hash) end @@ -55,7 +55,7 @@ describe "instance methods" do subject { lambda{ gate.send(:aasm_guess_enum_method) } } before :each do - gate.class.stub(:aasm_column).and_return(:value) + gate.class.aasm.stub(:attribute_name).and_return(:value) end it "pluralizes AASM column name" do @@ -81,7 +81,7 @@ describe "instance methods" do context "when AASM enum setting is simply set to true" do before :each do AASM::StateMachine[Gate].config.stub(:enum).and_return(true) - Gate.stub(:aasm_column).and_return(:value) + Gate.aasm.stub(:attribute_name).and_return(:value) gate.stub(:aasm_guess_enum_method).and_return(:values) end @@ -104,7 +104,7 @@ describe "instance methods" do context "when AASM enum setting is not enabled" do before :each do AASM::StateMachine[Gate].config.stub(:enum).and_return(nil) - Gate.stub(:aasm_column).and_return(:value) + Gate.aasm.stub(:attribute_name).and_return(:value) end context "when AASM column looks like enum" do @@ -172,7 +172,7 @@ describe "instance methods" do gate.aasm_write_state state_sym expect(obj).to have_received(:update_all) - .with(Hash[gate.class.aasm_column, state_code]) + .with(Hash[gate.class.aasm.attribute_name, state_code]) end end @@ -253,7 +253,7 @@ describe "instance methods" do expect(gate.aasm.current_state).to eq(:closed) end - it "should return the aasm column when not new and the aasm_column is not nil" do + it "should return the aasm column when not new and the aasm.attribute_name is not nil" do allow(gate).to receive(:new_record?).and_return(false) gate.aasm_state = "state" expect(gate.aasm.current_state).to eq(:state) @@ -293,8 +293,8 @@ describe 'subclasses' do end it "should have the same column as its parent even for the new dsl" do - expect(SimpleNewDsl.aasm_column).to eq(:status) - expect(DerivateNewDsl.aasm_column).to eq(:status) + expect(SimpleNewDsl.aasm.attribute_name).to eq(:status) + expect(DerivateNewDsl.aasm.attribute_name).to eq(:status) end end diff --git a/spec/unit/persistence/sequel_persistence_spec.rb b/spec/unit/persistence/sequel_persistence_spec.rb index e62fdc7..a447f75 100644 --- a/spec/unit/persistence/sequel_persistence_spec.rb +++ b/spec/unit/persistence/sequel_persistence_spec.rb @@ -81,8 +81,8 @@ describe 'sequel' do end it "should have the same column as its parent even for the new dsl" do - expect(@model.aasm_column).to eq(:status) - expect(Class.new(@model).aasm_column).to eq(:status) + expect(@model.aasm.attribute_name).to eq(:status) + expect(Class.new(@model).aasm.attribute_name).to eq(:status) end end