mirror of
https://github.com/github/rails.git
synced 2026-02-03 10:45:01 -05:00
Merge branch 'master' of git@github.com:rails/rails
This commit is contained in:
@@ -78,6 +78,12 @@ class CGI #:nodoc:
|
||||
buf
|
||||
end
|
||||
|
||||
# FIXME: work around broken 1.8.7 DelegateClass#respond_to?
|
||||
def respond_to?(method, include_private = false)
|
||||
return true if super(method)
|
||||
return __getobj__.respond_to?(method, include_private)
|
||||
end
|
||||
|
||||
# Parses a raw cookie string into a hash of <tt>cookie-name => cookie-object</tt>
|
||||
# pairs.
|
||||
#
|
||||
|
||||
@@ -7,10 +7,8 @@ module ActiveRecord
|
||||
else
|
||||
@target = (AssociationProxy === record ? record.target : record)
|
||||
|
||||
unless record.new_record?
|
||||
@owner[@reflection.primary_key_name] = record.id
|
||||
@owner[@reflection.options[:foreign_type]] = record.class.base_class.name.to_s
|
||||
end
|
||||
@owner[@reflection.primary_key_name] = record.id
|
||||
@owner[@reflection.options[:foreign_type]] = record.class.base_class.name.to_s
|
||||
|
||||
@updated = true
|
||||
end
|
||||
|
||||
@@ -12,6 +12,8 @@ require 'models/author'
|
||||
require 'models/tag'
|
||||
require 'models/tagging'
|
||||
require 'models/comment'
|
||||
require 'models/sponsor'
|
||||
require 'models/member'
|
||||
|
||||
class BelongsToAssociationsTest < ActiveRecord::TestCase
|
||||
fixtures :accounts, :companies, :developers, :projects, :topics,
|
||||
@@ -381,5 +383,30 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
||||
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
|
||||
assert companies(:first_client).readonly_firm.readonly?
|
||||
end
|
||||
|
||||
|
||||
def test_polymorphic_assignment_foreign_type_field_updating
|
||||
# should update when assigning a saved record
|
||||
sponsor = Sponsor.new
|
||||
member = Member.create
|
||||
sponsor.sponsorable = member
|
||||
assert_equal "Member", sponsor.sponsorable_type
|
||||
|
||||
# should update when assigning a new record
|
||||
sponsor = Sponsor.new
|
||||
member = Member.new
|
||||
sponsor.sponsorable = member
|
||||
assert_equal "Member", sponsor.sponsorable_type
|
||||
end
|
||||
|
||||
def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
|
||||
sponsor = Sponsor.new
|
||||
saved_member = Member.create
|
||||
new_member = Member.new
|
||||
|
||||
sponsor.sponsorable = saved_member
|
||||
assert_equal saved_member.id, sponsor.sponsorable_id
|
||||
|
||||
sponsor.sponsorable = new_member
|
||||
assert_equal nil, sponsor.sponsorable_id
|
||||
end
|
||||
end
|
||||
|
||||
@@ -82,9 +82,10 @@ module Dependencies #:nodoc:
|
||||
# infinite loop with mutual dependencies.
|
||||
loaded << expanded
|
||||
|
||||
if load?
|
||||
log "loading #{file_name}"
|
||||
begin
|
||||
begin
|
||||
if load?
|
||||
log "loading #{file_name}"
|
||||
|
||||
# Enable warnings iff this file has not been loaded before and
|
||||
# warnings_on_first_load is set.
|
||||
load_args = ["#{file_name}.rb"]
|
||||
@@ -95,13 +96,13 @@ module Dependencies #:nodoc:
|
||||
else
|
||||
enable_warnings { result = load_file(*load_args) }
|
||||
end
|
||||
rescue Exception
|
||||
loaded.delete expanded
|
||||
raise
|
||||
else
|
||||
log "requiring #{file_name}"
|
||||
result = require file_name
|
||||
end
|
||||
else
|
||||
log "requiring #{file_name}"
|
||||
result = require file_name
|
||||
rescue Exception
|
||||
loaded.delete expanded
|
||||
raise
|
||||
end
|
||||
|
||||
# Record history *after* loading so first load gets warnings.
|
||||
|
||||
@@ -40,13 +40,15 @@ module ActiveSupport::Multibyte #:nodoc:
|
||||
# core dumps. Don't go there.
|
||||
@string
|
||||
end
|
||||
|
||||
|
||||
# Make duck-typing with String possible
|
||||
def respond_to?(method)
|
||||
super || @string.respond_to?(method) || handler.respond_to?(method) ||
|
||||
(method.to_s =~ /(.*)!/ && handler.respond_to?($1)) || false
|
||||
def respond_to?(method, include_priv = false)
|
||||
super || @string.respond_to?(method, include_priv) ||
|
||||
handler.respond_to?(method, include_priv) ||
|
||||
(method.to_s =~ /(.*)!/ && handler.respond_to?($1, include_priv)) ||
|
||||
false
|
||||
end
|
||||
|
||||
|
||||
# Create a new Chars instance.
|
||||
def initialize(str)
|
||||
@string = str.respond_to?(:string) ? str.string : str
|
||||
|
||||
@@ -248,14 +248,14 @@ module ActiveSupport
|
||||
def marshal_load(variables)
|
||||
initialize(variables[0], ::Time.send!(:get_zone, variables[1]), variables[2])
|
||||
end
|
||||
|
||||
|
||||
# Ensure proxy class responds to all methods that underlying time instance responds to.
|
||||
def respond_to?(sym)
|
||||
def respond_to?(sym, include_priv = false)
|
||||
# consistently respond false to acts_like?(:date), regardless of whether #time is a Time or DateTime
|
||||
return false if sym.to_s == 'acts_like_date?'
|
||||
super || time.respond_to?(sym)
|
||||
super || time.respond_to?(sym, include_priv)
|
||||
end
|
||||
|
||||
|
||||
# Send the missing method to +time+ instance, and wrap result in a new TimeWithZone with the existing +time_zone+.
|
||||
def method_missing(sym, *args, &block)
|
||||
result = time.__send__(sym, *args, &block)
|
||||
|
||||
@@ -673,7 +673,7 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
assert !defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
ensure
|
||||
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
|
||||
end
|
||||
@@ -686,11 +686,20 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
assert !defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
ensure
|
||||
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
|
||||
end
|
||||
|
||||
def test_autoload_doesnt_shadow_error_when_mechanism_not_set_to_load
|
||||
with_loading 'autoloading_fixtures' do
|
||||
Dependencies.mechanism = :require
|
||||
2.times do
|
||||
assert_raise(NameError) {"RaisesNameError".constantize}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_autoload_doesnt_shadow_name_error
|
||||
with_loading 'autoloading_fixtures' do
|
||||
assert !defined?(::RaisesNameError), "::RaisesNameError is defined but it hasn't been referenced yet!"
|
||||
@@ -714,7 +723,7 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
ensure
|
||||
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
|
||||
end
|
||||
|
||||
|
||||
def test_remove_constant_handles_double_colon_at_start
|
||||
Object.const_set 'DeleteMe', Module.new
|
||||
DeleteMe.const_set 'OrMe', Module.new
|
||||
@@ -724,7 +733,7 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
Dependencies.remove_constant "::DeleteMe"
|
||||
assert ! defined?(DeleteMe)
|
||||
end
|
||||
|
||||
|
||||
def test_load_once_constants_should_not_be_unloaded
|
||||
with_loading 'autoloading_fixtures' do
|
||||
Dependencies.load_once_paths = Dependencies.load_paths
|
||||
@@ -737,7 +746,7 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
Dependencies.load_once_paths = []
|
||||
Object.class_eval { remove_const :A if const_defined?(:A) }
|
||||
end
|
||||
|
||||
|
||||
def test_load_once_paths_should_behave_when_recursively_loading
|
||||
with_loading 'dependencies', 'autoloading_fixtures' do
|
||||
Dependencies.load_once_paths = [Dependencies.load_paths.last]
|
||||
@@ -753,5 +762,4 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
ensure
|
||||
Dependencies.load_once_paths = []
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -64,7 +64,4 @@ Rails::Initializer.run do |config|
|
||||
|
||||
# Activate observers that should always be running
|
||||
# config.active_record.observers = :cacher, :garbage_collector
|
||||
|
||||
# Make ActiveRecord only save the attributes that have changed since the record was loaded.
|
||||
# config.active_record.partial_updates = true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,8 +2,13 @@ require 'erb'
|
||||
require 'yaml'
|
||||
require 'optparse'
|
||||
|
||||
include_password = false
|
||||
|
||||
OptionParser.new do |opt|
|
||||
opt.banner = "Usage: dbconsole [environment]"
|
||||
opt.banner = "Usage: dbconsole [options] [environment]"
|
||||
opt.on("-p", "--include-password", "Automatically provide the database from database.yml") do |v|
|
||||
include_password = true
|
||||
end
|
||||
opt.parse!(ARGV)
|
||||
abort opt.to_s unless (0..1).include?(ARGV.size)
|
||||
end
|
||||
@@ -31,10 +36,13 @@ when "mysql"
|
||||
'port' => '--port',
|
||||
'socket' => '--socket',
|
||||
'username' => '--user',
|
||||
'password' => '--password',
|
||||
'encoding' => '--default-character-set'
|
||||
}.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
|
||||
|
||||
if config['password'] && include_password
|
||||
args << "--password=#{config['password']}"
|
||||
end
|
||||
|
||||
args << config['database']
|
||||
|
||||
exec(find_cmd('mysql5', 'mysql'), *args)
|
||||
@@ -43,7 +51,7 @@ when "postgresql"
|
||||
ENV['PGUSER'] = config["username"] if config["username"]
|
||||
ENV['PGHOST'] = config["host"] if config["host"]
|
||||
ENV['PGPORT'] = config["port"].to_s if config["port"]
|
||||
ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
|
||||
ENV['PGPASSWORD'] = config["password"].to_s if config["password"] && include_password
|
||||
exec(find_cmd('psql'), config["database"])
|
||||
|
||||
when "sqlite"
|
||||
|
||||
Reference in New Issue
Block a user