Upgrade to Rails 2.2.0
As a side benefit, fix an (non-user-visible) bug in display_s5(). Also fixed a bug where removing orphaned pages did not expire cached summary pages.
This commit is contained in:
parent
39348c65c2
commit
7600aef48b
827 changed files with 123652 additions and 11027 deletions
|
@ -1,4 +1,8 @@
|
|||
module ActiveModel
|
||||
class Base
|
||||
include Observing
|
||||
# disabled, until they're tested
|
||||
# include Callbacks
|
||||
# include Validations
|
||||
end
|
||||
end
|
|
@ -1,3 +1,5 @@
|
|||
require 'active_model/core'
|
||||
|
||||
module ActiveModel
|
||||
module Callbacks
|
||||
|
||||
|
|
7
vendor/rails/activemodel/lib/active_model/core.rb
vendored
Normal file
7
vendor/rails/activemodel/lib/active_model/core.rb
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
# This file is required by each major ActiveModel component for the core requirements. This allows you to
|
||||
# load individual pieces of ActiveModel as needed.
|
||||
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', '..', '..', 'activesupport', 'lib')
|
||||
|
||||
# premature optimization?
|
||||
# So far, we only need the string inflections and not the rest of ActiveSupport.
|
||||
require 'active_support/inflector'
|
|
@ -1,4 +1,6 @@
|
|||
require 'observer'
|
||||
require 'singleton'
|
||||
require 'active_model/core'
|
||||
|
||||
module ActiveModel
|
||||
module Observing
|
||||
|
@ -73,7 +75,7 @@ module ActiveModel
|
|||
# Start observing the declared classes and their subclasses.
|
||||
def initialize
|
||||
self.observed_classes = self.class.models if self.class.models
|
||||
observed_classes.each { |klass| add_observer! klass }
|
||||
observed_classes.each { |klass| klass.add_observer(self) }
|
||||
end
|
||||
|
||||
# Send observed_method(object) if the method exists.
|
||||
|
@ -85,16 +87,12 @@ module ActiveModel
|
|||
# Passes the new subclass.
|
||||
def observed_class_inherited(subclass) #:nodoc:
|
||||
self.class.observe(observed_classes + [subclass])
|
||||
add_observer!(subclass)
|
||||
subclass.add_observer(self)
|
||||
end
|
||||
|
||||
protected
|
||||
def observed_classes
|
||||
@observed_classes ||= [self.class.observed_class]
|
||||
end
|
||||
|
||||
def add_observer!(klass)
|
||||
klass.add_observer(self)
|
||||
end
|
||||
protected
|
||||
def observed_classes
|
||||
@observed_classes ||= [self.class.observed_class]
|
||||
end
|
||||
end
|
||||
end
|
66
vendor/rails/activemodel/lib/active_model/state_machine.rb
vendored
Normal file
66
vendor/rails/activemodel/lib/active_model/state_machine.rb
vendored
Normal file
|
@ -0,0 +1,66 @@
|
|||
Dir[File.dirname(__FILE__) + "/state_machine/*.rb"].sort.each do |path|
|
||||
filename = File.basename(path)
|
||||
require "active_model/state_machine/#{filename}"
|
||||
end
|
||||
|
||||
module ActiveModel
|
||||
module StateMachine
|
||||
class InvalidTransition < Exception
|
||||
end
|
||||
|
||||
def self.included(base)
|
||||
base.extend ClassMethods
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def inherited(klass)
|
||||
super
|
||||
klass.state_machines = state_machines
|
||||
end
|
||||
|
||||
def state_machines
|
||||
@state_machines ||= {}
|
||||
end
|
||||
|
||||
def state_machines=(value)
|
||||
@state_machines = value ? value.dup : nil
|
||||
end
|
||||
|
||||
def state_machine(name = nil, options = {}, &block)
|
||||
if name.is_a?(Hash)
|
||||
options = name
|
||||
name = nil
|
||||
end
|
||||
name ||= :default
|
||||
state_machines[name] ||= Machine.new(self, name)
|
||||
block ? state_machines[name].update(options, &block) : state_machines[name]
|
||||
end
|
||||
end
|
||||
|
||||
def current_state(name = nil, new_state = nil, persist = false)
|
||||
sm = self.class.state_machine(name)
|
||||
ivar = sm.current_state_variable
|
||||
if name && new_state
|
||||
if persist && respond_to?(:write_state)
|
||||
write_state(sm, new_state)
|
||||
end
|
||||
|
||||
if respond_to?(:write_state_without_persistence)
|
||||
write_state_without_persistence(sm, new_state)
|
||||
end
|
||||
|
||||
instance_variable_set(ivar, new_state)
|
||||
else
|
||||
instance_variable_set(ivar, nil) unless instance_variable_defined?(ivar)
|
||||
value = instance_variable_get(ivar)
|
||||
return value if value
|
||||
|
||||
if respond_to?(:read_state)
|
||||
value = instance_variable_set(ivar, read_state(sm))
|
||||
end
|
||||
|
||||
value || sm.initial_state
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
62
vendor/rails/activemodel/lib/active_model/state_machine/event.rb
vendored
Normal file
62
vendor/rails/activemodel/lib/active_model/state_machine/event.rb
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
module ActiveModel
|
||||
module StateMachine
|
||||
class Event
|
||||
attr_reader :name, :success
|
||||
|
||||
def initialize(machine, name, options = {}, &block)
|
||||
@machine, @name, @transitions = machine, name, []
|
||||
if machine
|
||||
machine.klass.send(:define_method, "#{name}!") do |*args|
|
||||
machine.fire_event(name, self, true, *args)
|
||||
end
|
||||
|
||||
machine.klass.send(:define_method, name.to_s) do |*args|
|
||||
machine.fire_event(name, self, false, *args)
|
||||
end
|
||||
end
|
||||
update(options, &block)
|
||||
end
|
||||
|
||||
def fire(obj, to_state = nil, *args)
|
||||
transitions = @transitions.select { |t| t.from == obj.current_state(@machine ? @machine.name : nil) }
|
||||
raise InvalidTransition if transitions.size == 0
|
||||
|
||||
next_state = nil
|
||||
transitions.each do |transition|
|
||||
next if to_state && !Array(transition.to).include?(to_state)
|
||||
if transition.perform(obj)
|
||||
next_state = to_state || Array(transition.to).first
|
||||
transition.execute(obj, *args)
|
||||
break
|
||||
end
|
||||
end
|
||||
next_state
|
||||
end
|
||||
|
||||
def transitions_from_state?(state)
|
||||
@transitions.any? { |t| t.from? state }
|
||||
end
|
||||
|
||||
def ==(event)
|
||||
if event.is_a? Symbol
|
||||
name == event
|
||||
else
|
||||
name == event.name
|
||||
end
|
||||
end
|
||||
|
||||
def update(options = {}, &block)
|
||||
if options.key?(:success) then @success = options[:success] end
|
||||
if block then instance_eval(&block) end
|
||||
self
|
||||
end
|
||||
|
||||
private
|
||||
def transitions(trans_opts)
|
||||
Array(trans_opts[:from]).each do |s|
|
||||
@transitions << StateTransition.new(trans_opts.merge({:from => s.to_sym}))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
74
vendor/rails/activemodel/lib/active_model/state_machine/machine.rb
vendored
Normal file
74
vendor/rails/activemodel/lib/active_model/state_machine/machine.rb
vendored
Normal file
|
@ -0,0 +1,74 @@
|
|||
module ActiveModel
|
||||
module StateMachine
|
||||
class Machine
|
||||
attr_accessor :initial_state, :states, :events, :state_index
|
||||
attr_reader :klass, :name
|
||||
|
||||
def initialize(klass, name, options = {}, &block)
|
||||
@klass, @name, @states, @state_index, @events = klass, name, [], {}, {}
|
||||
update(options, &block)
|
||||
end
|
||||
|
||||
def initial_state
|
||||
@initial_state ||= (states.first ? states.first.name : nil)
|
||||
end
|
||||
|
||||
def update(options = {}, &block)
|
||||
if options.key?(:initial) then @initial_state = options[:initial] end
|
||||
if block then instance_eval(&block) end
|
||||
self
|
||||
end
|
||||
|
||||
def fire_event(event, record, persist, *args)
|
||||
state_index[record.current_state(@name)].call_action(:exit, record)
|
||||
if new_state = @events[event].fire(record, *args)
|
||||
state_index[new_state].call_action(:enter, record)
|
||||
|
||||
if record.respond_to?(event_fired_callback)
|
||||
record.send(event_fired_callback, record.current_state, new_state)
|
||||
end
|
||||
|
||||
record.current_state(@name, new_state, persist)
|
||||
record.send(@events[event].success) if @events[event].success
|
||||
true
|
||||
else
|
||||
if record.respond_to?(event_failed_callback)
|
||||
record.send(event_failed_callback, event)
|
||||
end
|
||||
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def states_for_select
|
||||
states.map { |st| [st.display_name, st.name.to_s] }
|
||||
end
|
||||
|
||||
def events_for(state)
|
||||
events = @events.values.select { |event| event.transitions_from_state?(state) }
|
||||
events.map! { |event| event.name }
|
||||
end
|
||||
|
||||
def current_state_variable
|
||||
"@#{@name}_current_state"
|
||||
end
|
||||
|
||||
private
|
||||
def state(name, options = {})
|
||||
@states << (state_index[name] ||= State.new(name, :machine => self)).update(options)
|
||||
end
|
||||
|
||||
def event(name, options = {}, &block)
|
||||
(@events[name] ||= Event.new(self, name)).update(options, &block)
|
||||
end
|
||||
|
||||
def event_fired_callback
|
||||
@event_fired_callback ||= (@name == :default ? '' : "#{@name}_") + 'event_fired'
|
||||
end
|
||||
|
||||
def event_failed_callback
|
||||
@event_failed_callback ||= (@name == :default ? '' : "#{@name}_") + 'event_failed'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
50
vendor/rails/activemodel/lib/active_model/state_machine/state.rb
vendored
Normal file
50
vendor/rails/activemodel/lib/active_model/state_machine/state.rb
vendored
Normal file
|
@ -0,0 +1,50 @@
|
|||
module ActiveModel
|
||||
module StateMachine
|
||||
class State
|
||||
attr_reader :name, :options
|
||||
|
||||
def initialize(name, options = {})
|
||||
@name = name
|
||||
machine = options.delete(:machine)
|
||||
if machine
|
||||
machine.klass.send(:define_method, "#{name}?") do
|
||||
current_state.to_s == name.to_s
|
||||
end
|
||||
end
|
||||
update(options)
|
||||
end
|
||||
|
||||
def ==(state)
|
||||
if state.is_a? Symbol
|
||||
name == state
|
||||
else
|
||||
name == state.name
|
||||
end
|
||||
end
|
||||
|
||||
def call_action(action, record)
|
||||
action = @options[action]
|
||||
case action
|
||||
when Symbol, String
|
||||
record.send(action)
|
||||
when Proc
|
||||
action.call(record)
|
||||
end
|
||||
end
|
||||
|
||||
def display_name
|
||||
@display_name ||= name.to_s.gsub(/_/, ' ').capitalize
|
||||
end
|
||||
|
||||
def for_select
|
||||
[display_name, name.to_s]
|
||||
end
|
||||
|
||||
def update(options = {})
|
||||
if options.key?(:display) then @display_name = options.delete(:display) end
|
||||
@options = options
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
40
vendor/rails/activemodel/lib/active_model/state_machine/state_transition.rb
vendored
Normal file
40
vendor/rails/activemodel/lib/active_model/state_machine/state_transition.rb
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
module ActiveModel
|
||||
module StateMachine
|
||||
class StateTransition
|
||||
attr_reader :from, :to, :options
|
||||
|
||||
def initialize(opts)
|
||||
@from, @to, @guard, @on_transition = opts[:from], opts[:to], opts[:guard], opts[:on_transition]
|
||||
@options = opts
|
||||
end
|
||||
|
||||
def perform(obj)
|
||||
case @guard
|
||||
when Symbol, String
|
||||
obj.send(@guard)
|
||||
when Proc
|
||||
@guard.call(obj)
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
def execute(obj, *args)
|
||||
case @on_transition
|
||||
when Symbol, String
|
||||
obj.send(@on_transition, *args)
|
||||
when Proc
|
||||
@on_transition.call(obj, *args)
|
||||
end
|
||||
end
|
||||
|
||||
def ==(obj)
|
||||
@from == obj.from && @to == obj.to
|
||||
end
|
||||
|
||||
def from?(value)
|
||||
@from == value
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,8 +1,10 @@
|
|||
require 'active_model/core'
|
||||
|
||||
module ActiveModel
|
||||
module Validations
|
||||
def self.included(base) # :nodoc:
|
||||
base.extend(ClassMethods)
|
||||
base.send!(:include, ActiveSupport::Callbacks)
|
||||
base.__send__(:include, ActiveSupport::Callbacks)
|
||||
base.define_callbacks :validate, :validate_on_create, :validate_on_update
|
||||
end
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ module ActiveModel
|
|||
|
||||
enum = configuration[:in] || configuration[:within]
|
||||
|
||||
raise(ArgumentError, "An object with the method include? is required must be supplied as the :in option of the configuration hash") unless enum.respond_to?("include?")
|
||||
raise(ArgumentError, "An object with the method include? is required must be supplied as the :in option of the configuration hash") unless enum.respond_to?(:include?)
|
||||
|
||||
validates_each(attr_names, configuration) do |record, attr_name, value|
|
||||
record.errors.add(attr_name, configuration[:message] % value) if enum.include?(value)
|
||||
|
|
|
@ -26,7 +26,7 @@ module ActiveModel
|
|||
|
||||
enum = configuration[:in] || configuration[:within]
|
||||
|
||||
raise(ArgumentError, "An object with the method include? is required must be supplied as the :in option of the configuration hash") unless enum.respond_to?("include?")
|
||||
raise(ArgumentError, "An object with the method include? is required must be supplied as the :in option of the configuration hash") unless enum.respond_to?(:include?)
|
||||
|
||||
validates_each(attr_names, configuration) do |record, attr_name, value|
|
||||
record.errors.add(attr_name, configuration[:message] % value) unless enum.include?(value)
|
||||
|
|
|
@ -25,7 +25,7 @@ module ActiveModel
|
|||
# Configuration options:
|
||||
# * <tt>:message</tt> - Specifies a custom error message (default is: "has already been taken")
|
||||
# * <tt>:scope</tt> - One or more columns by which to limit the scope of the uniqueness constraint.
|
||||
# * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by non-text columns (+false+ by default).
|
||||
# * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by non-text columns (+true+ by default).
|
||||
# * <tt>:allow_nil</tt> - If set to +true+, skips this validation if the attribute is +nil+ (default is: +false+)
|
||||
# * <tt>:allow_blank</tt> - If set to +true+, skips this validation if the attribute is blank (default is: +false+)
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
|
@ -79,8 +79,8 @@ module ActiveModel
|
|||
results = finder_class.with_exclusive_scope do
|
||||
connection.select_all(
|
||||
construct_finder_sql(
|
||||
:select => "#{attr_name}",
|
||||
:from => "#{finder_class.quoted_table_name}",
|
||||
:select => attr_name,
|
||||
:from => finder_class.quoted_table_name,
|
||||
:conditions => [condition_sql, *condition_params]
|
||||
)
|
||||
)
|
||||
|
@ -101,4 +101,4 @@ module ActiveModel
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue