mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
commit
d92a679def
5 changed files with 116 additions and 2 deletions
|
@ -7,3 +7,4 @@ require File.join(File.dirname(__FILE__), 'aasm', 'supporting_classes')
|
|||
require File.join(File.dirname(__FILE__), 'aasm', 'state_machine')
|
||||
require File.join(File.dirname(__FILE__), 'aasm', 'persistence')
|
||||
require File.join(File.dirname(__FILE__), 'aasm', 'aasm')
|
||||
require File.join(File.dirname(__FILE__), 'aasm', 'i18n')
|
||||
|
|
|
@ -7,6 +7,7 @@ module AASM
|
|||
|
||||
def self.included(base) #:nodoc:
|
||||
base.extend AASM::ClassMethods
|
||||
|
||||
AASM::Persistence.set_persistence(base)
|
||||
unless AASM::StateMachine[base]
|
||||
AASM::StateMachine[base] = AASM::StateMachine.new('')
|
||||
|
@ -70,6 +71,9 @@ module AASM
|
|||
AASM::StateMachine[self].states.map { |state| state.for_select }
|
||||
end
|
||||
|
||||
def human_event_name(event)
|
||||
AASM::I18n.new.human_event_name(self, event)
|
||||
end
|
||||
end
|
||||
|
||||
# Instance methods
|
||||
|
@ -105,6 +109,10 @@ module AASM
|
|||
events.map {|event| event.name}
|
||||
end
|
||||
|
||||
def human_state
|
||||
AASM::I18n.new.human_state(self)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_aasm_current_state_with_persistence(state)
|
||||
|
|
36
lib/aasm/i18n.rb
Normal file
36
lib/aasm/i18n.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
class AASM::I18n
|
||||
def human_event_name(klass, event)
|
||||
defaults = ancestors_list(klass).map do |ancestor|
|
||||
:"#{i18n_scope(klass)}.events.#{i18n_klass(ancestor)}.#{event}"
|
||||
end << event.to_s.humanize
|
||||
|
||||
I18n.translate(defaults.shift, :default => defaults, :raise => true)
|
||||
end
|
||||
|
||||
def human_state(obj)
|
||||
klass = obj.class
|
||||
defaults = ancestors_list(klass).map do |ancestor|
|
||||
:"#{i18n_scope(klass)}.attributes.#{i18n_klass(ancestor)}.#{klass.aasm_column}.#{obj.aasm_current_state}"
|
||||
end << obj.aasm_current_state.to_s.humanize
|
||||
|
||||
I18n.translate(defaults.shift, :default => defaults, :raise => true)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# added for rails 2.x compatibility
|
||||
def i18n_scope(klass)
|
||||
klass.respond_to?(:i18n_scope) ? klass.i18n_scope : :activerecord
|
||||
end
|
||||
|
||||
# added for rails < 3.0.3 compatibility
|
||||
def i18n_klass(klass)
|
||||
klass.model_name.respond_to?(:i18n_key) ? klass.model_name.i18n_key : klass.name.underscore
|
||||
end
|
||||
|
||||
def ancestors_list(klass)
|
||||
klass.ancestors.select do |ancestor|
|
||||
ancestor.respond_to?(:model_name) unless ancestor == ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
end
|
10
spec/en.yml
Normal file
10
spec/en.yml
Normal file
|
@ -0,0 +1,10 @@
|
|||
en:
|
||||
activerecord:
|
||||
events:
|
||||
i18n_test_model:
|
||||
close: "Let's close it!"
|
||||
|
||||
attributes:
|
||||
i18n_test_model:
|
||||
aasm_state:
|
||||
open: "It's opened now!"
|
59
spec/unit/i18n_spec.rb
Normal file
59
spec/unit/i18n_spec.rb
Normal file
|
@ -0,0 +1,59 @@
|
|||
require 'spec_helper'
|
||||
require 'active_record'
|
||||
require 'logger'
|
||||
require 'i18n'
|
||||
|
||||
ActiveRecord::Base.logger = Logger.new(STDERR)
|
||||
|
||||
class Connection
|
||||
end
|
||||
|
||||
class I18nTestModel < ActiveRecord::Base
|
||||
include AASM
|
||||
|
||||
attr_accessor :aasm_state
|
||||
|
||||
aasm_initial_state :open
|
||||
aasm_state :opened
|
||||
aasm_state :closed
|
||||
|
||||
aasm_event :close
|
||||
aasm_event :open
|
||||
end
|
||||
|
||||
describe AASM::I18n do
|
||||
before(:all) do
|
||||
I18n.load_path << 'spec/en.yml'
|
||||
I18n.default_locale = :en
|
||||
end
|
||||
|
||||
after(:all) { I18n.load_path.clear }
|
||||
|
||||
before do
|
||||
connection = mock(Connection, :columns => [])
|
||||
I18nTestModel.stub!(:connection).and_return(connection)
|
||||
end
|
||||
|
||||
let (:foo_opened) { I18nTestModel.new }
|
||||
let (:foo_closed) { I18nTestModel.new.tap { |x| x.aasm_state = :closed } }
|
||||
|
||||
context '.human_state' do
|
||||
it 'should return translated state value' do
|
||||
foo_opened.human_state.should == "It's opened now!"
|
||||
end
|
||||
|
||||
it 'should return humanized value if not localized' do
|
||||
foo_closed.human_state.should == "Closed"
|
||||
end
|
||||
end
|
||||
|
||||
context '.human_event_name' do
|
||||
it 'should return translated event name' do
|
||||
I18nTestModel.human_event_name(:close).should == "Let's close it!"
|
||||
end
|
||||
|
||||
it 'should return humanized event name' do
|
||||
I18nTestModel.human_event_name(:open).should == "Open"
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue