1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge branch 'master' of github.com:rails/rails

This commit is contained in:
Jeremy Kemper 2010-03-28 11:34:16 -07:00
commit 7e3b4c1f2f
61 changed files with 147 additions and 6 deletions

View file

@ -2,6 +2,7 @@ require 'mail'
require 'action_mailer/tmail_compat'
require 'action_mailer/collector'
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/object/blank'
module ActionMailer #:nodoc:
# Action Mailer allows you to send email from your application using a mailer model and views.

View file

@ -1,4 +1,5 @@
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/blank'
module ActionMailer
module OldApi #:nodoc:

View file

@ -1,4 +1,5 @@
require 'active_support/base64'
require 'active_support/core_ext/object/blank'
module ActionController
module HttpAuthentication

View file

@ -1,4 +1,5 @@
require 'active_support/core_ext/class/attribute'
require 'active_support/core_ext/object/blank'
module ActionController
def self.add_renderer(key, &block)

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionController
module Railties
class LogSubscriber < Rails::LogSubscriber

View file

@ -1,4 +1,5 @@
require 'rack/session/abstract/id'
require 'active_support/core_ext/object/blank'
module ActionController
module TemplateAssertions

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Http
module Cache

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/object/duplicable'
module ActionDispatch
module Http

View file

@ -1,5 +1,6 @@
require 'set'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/object/blank'
module Mime
class Mimes < Array

View file

@ -1,5 +1,6 @@
require 'digest/md5'
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/object/blank'
module ActionDispatch # :nodoc:
# Represents an HTTP response generated by a controller action. One can use

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Http
module UploadedFile

View file

@ -1,5 +1,6 @@
require 'rack/utils'
require 'rack/request'
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Session

View file

@ -1,4 +1,5 @@
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Session

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Routing
class RouteSet

View file

@ -1,4 +1,5 @@
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/object/blank'
module ActionDispatch
module Routing

View file

@ -1,7 +1,7 @@
require 'active_support/testing/performance'
require 'active_support/testing/default'
if defined?(ActiveSupport::Testing::Performance)
begin
module ActionDispatch
# An integration test that runs a code profiler on your test methods.
# Profiling output for combinations of each test method, measurement, and
@ -14,4 +14,6 @@ if defined?(ActiveSupport::Testing::Performance)
include ActiveSupport::Testing::Default
end
end
rescue NameError
$stderr.puts "Specify ruby-prof as application's dependency in Gemfile to run benchmarks."
end

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionDispatch
class TestRequest < Request
DEFAULT_ENV = Rack::MockRequest.env_for('/')

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers
# CaptureHelper exposes methods to let you extract generated markup which

View file

@ -4,6 +4,7 @@ require 'action_view/helpers/tag_helper'
require 'action_view/helpers/form_tag_helper'
require 'active_support/core_ext/class/inheritable_attributes'
require 'active_support/core_ext/hash/slice'
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers

View file

@ -1,6 +1,7 @@
require 'cgi'
require 'erb'
require 'action_view/helpers/form_helper'
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers

View file

@ -1,6 +1,7 @@
require 'cgi'
require 'action_view/helpers/tag_helper'
require 'active_support/core_ext/object/returning'
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/big_decimal/conversions'
require 'active_support/core_ext/float/rounding'
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers #:nodoc:

View file

@ -1,6 +1,7 @@
require 'set'
require 'active_support/json'
require 'active_support/core_ext/object/returning'
require 'active_support/core_ext/object/blank'
module ActionView
module Helpers

View file

@ -1,3 +1,4 @@
require 'active_support/core_ext/object/blank'
require 'set'
module ActionView

View file

@ -1,3 +1,4 @@
require 'active_support/core_ext/object/blank'
require 'action_view/helpers/tag_helper'
module ActionView

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActionView
# There's also a convenience method for rendering sub templates within the current controller that depends on a
# single object (we call this kind of sub templates for partials). It relies on the fact that partials should

View file

@ -1,3 +1,4 @@
require 'active_support/core_ext/object/blank'
require 'action_controller/test_case'
require 'action_view'

View file

@ -1,4 +1,7 @@
require 'active_model/attribute_methods'
require 'active_support/concern'
require 'active_support/hash_with_indifferent_access'
require 'active_support/core_ext/object/duplicable'
module ActiveModel
# <tt>ActiveModel::Dirty</tt> provides a way to track changes in your

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/object/blank'
require 'active_support/ordered_hash'
module ActiveModel

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/array/wrap'
require "active_support/core_ext/module/anonymous"
require 'active_support/core_ext/object/blank'
module ActiveModel #:nodoc:
# A simple base class that can be used along with

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/enumerable'
require 'active_support/core_ext/object/blank'
module ActiveRecord
class InverseOfAssociationNotFoundError < ActiveRecordError #:nodoc:
@ -85,6 +86,15 @@ module ActiveRecord
end
end
# This error is raised when trying to destroy a parent instance in a N:1, 1:1 assosications
# (has_many, has_one) when there is at least 1 child assosociated instance.
# ex: if @project.tasks.size > 0, DeleteRestrictionError will be raised when trying to destroy @project
class DeleteRestrictionError < ActiveRecordError #:nodoc:
def initialize(reflection)
super("Cannot delete record because of dependent #{reflection.name}")
end
end
# See ActiveRecord::Associations::ClassMethods for documentation.
module Associations # :nodoc:
extend ActiveSupport::Concern
@ -830,6 +840,8 @@ module ActiveRecord
# objects are deleted *without* calling their +destroy+ method. If set to <tt>:nullify</tt> all associated
# objects' foreign keys are set to +NULL+ *without* calling their +save+ callbacks. *Warning:* This option is ignored when also using
# the <tt>:through</tt> option.
# the <tt>:through</tt> option. If set to <tt>:restrict</tt>
# this object cannot be deleted if it has any associated object.
# [:finder_sql]
# Specify a complete SQL statement to fetch the association. This is a good way to go for complex
# associations that depend on multiple tables. Note: When this option is used, +find_in_collection+ is _not_ added.
@ -1468,9 +1480,15 @@ module ActiveRecord
# Creates before_destroy callback methods that nullify, delete or destroy
# has_many associated objects, according to the defined :dependent rule.
# If the association is marked as :dependent => :restrict, create a callback
# that prevents deleting entirely.
#
# See HasManyAssociation#delete_records. Dependent associations
# delete children, otherwise foreign key is set to NULL.
# See HasManyAssociation#delete_records. Dependent associations
# delete children if the option is set to :destroy or :delete_all, set the
# foreign key to NULL if the option is set to :nullify, and do not touch the
# child records if the option is set to :restrict.
#
# The +extra_conditions+ parameter, which is not used within the main
# Active Record codebase, is meant to allow plugins to define extra
@ -1530,14 +1548,24 @@ module ActiveRecord
%@#{dependent_conditions}@)
end
CALLBACK
when :restrict
method_name = "has_many_dependent_restrict_for_#{reflection.name}".to_sym
define_method(method_name) do
unless send(reflection.name).empty?
raise DeleteRestrictionError.new(reflection)
end
end
before_destroy method_name
else
raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, or :nullify (#{reflection.options[:dependent].inspect})"
raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, :nullify or :restrict (#{reflection.options[:dependent].inspect})"
end
end
end
# Creates before_destroy callback methods that nullify, delete or destroy
# has_one associated objects, according to the defined :dependent rule.
# If the association is marked as :dependent => :restrict, create a callback
# that prevents deleting entirely.
def configure_dependency_for_has_one(reflection)
if reflection.options.include?(:dependent)
name = reflection.options[:dependent]
@ -1558,8 +1586,16 @@ module ActiveRecord
association.update_attribute(#{reflection.primary_key_name.inspect}, nil) if association
end
eoruby
when :restrict
method_name = "has_one_dependent_restrict_for_#{reflection.name}".to_sym
define_method(method_name) do
unless send(reflection.name).nil?
raise DeleteRestrictionError.new(reflection)
end
end
before_destroy method_name
else
raise ArgumentError, "The :dependent option expects either :destroy, :delete or :nullify (#{reflection.options[:dependent].inspect})"
raise ArgumentError, "The :dependent option expects either :destroy, :delete, :nullify or :restrict (#{reflection.options[:dependent].inspect})"
end
before_destroy method_name

View file

@ -1,4 +1,5 @@
require "active_record/associations/through_association_scope"
require 'active_support/core_ext/object/blank'
module ActiveRecord
module Associations

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module AttributeMethods
module Dirty

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module AttributeMethods
module Query

View file

@ -13,6 +13,8 @@ require 'active_support/core_ext/hash/slice'
require 'active_support/core_ext/string/behavior'
require 'active_support/core_ext/object/singleton_class'
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/object/blank'
require 'arel'
require 'active_record/errors'

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/duplicable'
module ActiveRecord
module ConnectionAdapters # :nodoc:
module QueryCache

View file

@ -1,3 +1,4 @@
require 'active_support/core_ext/object/blank'
require 'date'
require 'set'
require 'bigdecimal'

View file

@ -1,5 +1,6 @@
require 'active_record/connection_adapters/abstract_adapter'
require 'active_support/core_ext/kernel/requires'
require 'active_support/core_ext/object/blank'
require 'set'
module MysqlCompat #:nodoc:

View file

@ -1,5 +1,6 @@
require 'active_record/connection_adapters/abstract_adapter'
require 'active_support/core_ext/kernel/requires'
require 'active_support/core_ext/object/blank'
begin
require_library_or_gem 'pg'

View file

@ -4,6 +4,7 @@ require 'csv'
require 'zlib'
require 'active_support/dependencies'
require 'active_support/core_ext/logger'
require 'active_support/core_ext/object/blank'
if RUBY_VERSION < '1.9'
module YAML #:nodoc:

View file

@ -1,6 +1,7 @@
require 'active_support/core_ext/array'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/object/singleton_class'
require 'active_support/core_ext/object/blank'
module ActiveRecord
module NamedScope

View file

@ -1,5 +1,6 @@
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/blank'
module ActiveRecord
module NestedAttributes #:nodoc:

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
class QueryCache
module ClassMethods

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
class Relation
JoinOperation = Struct.new(:relation, :join_class, :on)

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module Batches # :nodoc:
# Yields each record that was found by the find +options+. The find is

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module Calculations
# Count operates using three different approaches.

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module FinderMethods
# Find operates with four different retrieval approaches:

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module QueryMethods
extend ActiveSupport::Concern

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
module SpawnMethods
def merge(r)

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveRecord
# Allows programmers to programmatically define a schema in a portable
# DSL. This means you can define tables, indexes, etc. without using SQL

View file

@ -439,9 +439,15 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids
end
def test_invalid_belongs_to_dependent_option_raises_exception
def test_invalid_belongs_to_dependent_option_nullify_raises_exception
assert_raise ArgumentError do
Author.belongs_to :special_author_address, :dependent => :nullify
end
end
def test_invalid_belongs_to_dependent_option_restrict_raises_exception
assert_raise ArgumentError do
Author.belongs_to :special_author_address, :dependent => :restrict
end
end
end

View file

@ -836,6 +836,14 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
assert_equal num_accounts, Account.count
end
def test_restrict
firm = RestrictedFirm.new(:name => 'restrict')
firm.save!
child_firm = firm.companies.create(:name => 'child')
assert !firm.companies.empty?
assert_raise(ActiveRecord::DeleteRestrictionError) { firm.destroy }
end
def test_included_in_collection
assert companies(:first_firm).clients.include?(Client.find(2))
end

View file

@ -177,7 +177,15 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
assert_nothing_raised { firm.destroy }
end
def test_succesful_build_association
def test_dependence_with_restrict
firm = RestrictedFirm.new(:name => 'restrict')
firm.save!
account = firm.create_account(:credit_limit => 10)
assert !firm.account.nil?
assert_raise(ActiveRecord::DeleteRestrictionError) { firm.destroy }
end
def test_successful_build_association
firm = Firm.new("name" => "GlobalMegaCorp")
firm.save

View file

@ -95,6 +95,11 @@ class DependentFirm < Company
has_many :companies, :foreign_key => 'client_of', :dependent => :nullify
end
class RestrictedFirm < Company
has_one :account, :foreign_key => "firm_id", :dependent => :restrict, :order => "id"
has_many :companies, :foreign_key => 'client_of', :order => "id", :dependent => :restrict
end
class Client < Company
belongs_to :firm, :foreign_key => "client_of"
belongs_to :firm_with_basic_id, :class_name => "Firm", :foreign_key => "firm_id"

View file

@ -9,6 +9,7 @@ require 'active_support/core_ext/module/aliasing'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/object/misc'
require 'active_support/core_ext/object/to_query'
require 'active_support/core_ext/object/duplicable'
require 'set'
require 'uri'

View file

@ -1,3 +1,5 @@
require 'active_support/core_ext/object/blank'
module ActiveResource
# A module to support custom REST methods and sub-resources, allowing you to break out
# of the "default" REST methods with your own custom resource requests. For example,

View file

@ -1,4 +1,5 @@
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/object/blank'
module ActiveResource
class ResourceInvalid < ClientError #:nodoc:

View file

@ -1,4 +1,5 @@
require 'libxml'
require 'active_support/core_ext/object/blank'
# = XmlMini LibXML implementation using a SAX-based parser
module ActiveSupport

View file

@ -1,4 +1,5 @@
require 'nokogiri'
require 'active_support/core_ext/object/blank'
# = XmlMini Nokogiri implementation using a SAX-based parser
module ActiveSupport

View file

@ -2,7 +2,7 @@ require 'test_helper'
require 'rails/performance_test_help'
# Profiling results for each test method are written to tmp/performance.
class BrowsingTest < ActionController::PerformanceTest
class BrowsingTest < ActionDispatch::PerformanceTest
def test_homepage
get '/'
end

View file

@ -1,5 +1,6 @@
require 'rails/generators/resource_helpers'
require 'rails/generators/rails/model/model_generator'
require 'active_support/core_ext/object/blank'
module Rails
module Generators