Skip to content

Commit

Permalink
Merge commit 'mainstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
lifo committed May 6, 2008
2 parents 4a0118d + e520fd5 commit 63e8bca
Show file tree
Hide file tree
Showing 12 changed files with 111 additions and 20 deletions.
8 changes: 3 additions & 5 deletions actionpack/lib/action_controller/resources.rb
Expand Up @@ -524,11 +524,9 @@ def map_member_actions(map, resource)
resource.member_methods.each do |method, actions|
actions.each do |action|
action_options = action_options_for(action, resource, method)
action_path = action
if resource.options[:path_names]
action_path = resource.options[:path_names][action]
action_path ||= Base.resources_path_names[action] || action
end

action_path = resource.options[:path_names][action] if resource.options[:path_names].is_a?(Hash)
action_path ||= Base.resources_path_names[action] || action

map.named_route("#{action}_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}#{resource.action_separator}#{action_path}", action_options)
map.named_route("formatted_#{action}_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}#{resource.action_separator}#{action_path}.:format",action_options)
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_view/base.rb
Expand Up @@ -185,7 +185,7 @@ class Base
attr_internal :request

delegate :request_forgery_protection_token, :template, :params, :session, :cookies, :response, :headers,
:flash, :logger, :to => :controller
:flash, :logger, :action_name, :to => :controller

module CompiledTemplates #:nodoc:
# holds compiled template code
Expand Down
9 changes: 9 additions & 0 deletions actionpack/test/controller/new_render_test.rb
Expand Up @@ -246,6 +246,10 @@ def accessing_request_in_template
def accessing_logger_in_template
render :inline => "<%= logger.class %>"
end

def accessing_action_name_in_template
render :inline => "<%= action_name %>"
end

def accessing_params_in_template_with_layout
render :layout => nil, :inline => "Hello: <%= params[:name] %>"
Expand Down Expand Up @@ -545,6 +549,11 @@ def test_access_to_logger_in_view
get :accessing_logger_in_template
assert_equal "Logger", @response.body
end

def test_access_to_action_name_in_view
get :accessing_action_name_in_template
assert_equal "accessing_action_name_in_template", @response.body
end

def test_render_xml
get :render_xml_hello
Expand Down
30 changes: 26 additions & 4 deletions actionpack/test/controller/resources_test.rb
Expand Up @@ -226,6 +226,28 @@ def test_member_when_override_paths_for_default_restful_actions_with
end
end

def test_member_when_changed_default_restful_actions_and_path_names_not_specified
default_path_names = ActionController::Base.resources_path_names
ActionController::Base.resources_path_names = {:new => 'nuevo', :edit => 'editar'}

with_restful_routing :messages do
new_options = { :action => 'new', :controller => 'messages' }
new_path = "/messages/nuevo"
edit_options = { :action => 'edit', :id => '1', :controller => 'messages' }
edit_path = "/messages/1/editar"

assert_restful_routes_for :messages do |options|
assert_recognizes(options.merge(new_options), :path => new_path, :method => :get)
end

assert_restful_routes_for :messages do |options|
assert_recognizes(options.merge(edit_options), :path => edit_path, :method => :get)
end
end
ensure
ActionController::Base.resources_path_names = default_path_names
end

def test_with_two_member_actions_with_same_method
[:put, :post].each do |method|
with_restful_routing :messages, :member => { :mark => method, :unmark => method } do
Expand Down Expand Up @@ -691,11 +713,11 @@ def assert_restful_routes_for(controller_name, options = {})
options[:options] ||= {}
options[:options][:controller] = options[:controller] || controller_name.to_s

new_action = "new"
edit_action = "edit"
new_action = ActionController::Base.resources_path_names[:new] || "new"
edit_action = ActionController::Base.resources_path_names[:edit] || "edit"
if options[:path_names]
new_action = options[:path_names][:new] || "new"
edit_action = options[:path_names][:edit] || "edit"
new_action = options[:path_names][:new] if options[:path_names][:new]
edit_action = options[:path_names][:edit] if options[:path_names][:edit]
end

collection_path = "/#{options[:path_prefix]}#{options[:as] || controller_name}"
Expand Down
7 changes: 6 additions & 1 deletion activerecord/lib/active_record/association_preload.rb
Expand Up @@ -65,7 +65,13 @@ def set_association_collection_records(id_to_record_map, reflection_name, associ
end

def set_association_single_records(id_to_record_map, reflection_name, associated_records, key)
seen_keys = {}
associated_records.each do |associated_record|
#this is a has_one or belongs_to: there should only be one record.
#Unfortunately we can't (in portable way) ask the database for 'all records where foo_id in (x,y,z), but please
# only one row per distinct foo_id' so this where we enforce that
next if seen_keys[associated_record[key].to_s]
seen_keys[associated_record[key].to_s] = true
mapped_records = id_to_record_map[associated_record[key].to_s]
mapped_records.each do |mapped_record|
mapped_record.send("set_#{reflection_name}_target", associated_record)
Expand Down Expand Up @@ -122,7 +128,6 @@ def preload_has_one_association(records, reflection, preload_options={})
else
records.each {|record| record.send("set_#{reflection.name}_target", nil)}


set_association_single_records(id_to_record_map, reflection.name, find_associated_records(ids, reflection, preload_options), reflection.primary_key_name)
end
end
Expand Down
25 changes: 24 additions & 1 deletion activerecord/lib/active_record/associations.rb 100755 → 100644
Expand Up @@ -1446,6 +1446,12 @@ def construct_finder_sql_for_association_limiting(options, join_dependency)
tables_from_conditions = conditions_tables(options)
tables_from_order = order_tables(options)
all_tables = tables_from_conditions + tables_from_order
distinct_join_associations = all_tables.uniq.map{|table|
join_dependency.joins_for_table_name(table)
}.flatten.compact.uniq




is_distinct = !options[:joins].blank? || include_eager_conditions?(options, tables_from_conditions) || include_eager_order?(options, tables_from_order)
sql = "SELECT "
Expand All @@ -1457,7 +1463,7 @@ def construct_finder_sql_for_association_limiting(options, join_dependency)
sql << " FROM #{connection.quote_table_name table_name} "

if is_distinct
sql << join_dependency.join_associations.reject{ |ja| !all_tables.include?(ja.table_name) }.collect(&:association_join).join
sql << distinct_join_associations.collect(&:association_join).join
add_joins!(sql, options, scope)
end

Expand Down Expand Up @@ -1617,6 +1623,23 @@ def remove_duplicate_results!(base, records, associations)
end
end

def join_for_table_name(table_name)
@joins.select{|j|j.aliased_table_name == table_name.gsub(/^\"(.*)\"$/){$1} }.first rescue nil
end

def joins_for_table_name(table_name)
join = join_for_table_name(table_name)
result = nil
if join && join.is_a?(JoinAssociation)
result = [join]
if join.parent && join.parent.is_a?(JoinAssociation)
result = joins_for_table_name(join.parent.aliased_table_name) +
result
end
end
result
end

protected
def build(associations, parent = nil)
parent ||= @joins.last
Expand Down
4 changes: 4 additions & 0 deletions activerecord/test/cases/associations/eager_test.rb
Expand Up @@ -29,6 +29,10 @@ def test_loading_with_one_association
post = Post.find(:first, :include => :comments, :conditions => "posts.title = 'Welcome to the weblog'")
assert_equal 2, post.comments.size
assert post.comments.include?(comments(:greetings))

posts = Post.find(:all, :include => :last_comment)
post = posts.find { |p| p.id == 1 }
assert_equal Post.find(1).last_comment, post.last_comment
end

def test_loading_conditions_with_or
Expand Down
9 changes: 9 additions & 0 deletions activerecord/test/cases/finder_test.rb
Expand Up @@ -8,6 +8,7 @@
require 'models/developer'
require 'models/post'
require 'models/customer'
require 'models/job'

class FinderTest < ActiveRecord::TestCase
fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers
Expand Down Expand Up @@ -857,6 +858,14 @@ def test_select_rows
Company.connection.select_rows("SELECT id, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! {|i| i.map! {|j| j.to_s unless j.nil?}}
end

def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
assert_equal 2, Post.find(:all,:include=>{:authors=>:author_address},:order=>' author_addresses.id DESC ', :limit=>2).size

assert_equal 3, Post.find(:all,:include=>{:author=>:author_address,:authors=>:author_address},
:order=>' author_addresses_authors.id DESC ', :limit=>3).size
end


protected
def bind(statement, *vars)
if vars.first.is_a?(Hash)
Expand Down
2 changes: 2 additions & 0 deletions activerecord/test/models/post.rb
Expand Up @@ -9,6 +9,8 @@ def greeting

belongs_to :author_with_posts, :class_name => "Author", :foreign_key => :author_id, :include => :posts

has_one :last_comment, :class_name => 'Comment', :order => 'id desc'

has_many :comments, :order => "body" do
def find_most_recent
find(:first, :order => "id DESC")
Expand Down
14 changes: 14 additions & 0 deletions activesupport/lib/active_support/deprecation.rb
Expand Up @@ -175,6 +175,20 @@ def warn(callstack, called, args)
ActiveSupport::Deprecation.warn("#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}", callstack)
end
end

class DeprecatedInstanceVariable < Delegator #:nodoc:
def initialize(value, method)
super(value)
@method = method
@value = value
end

def __getobj__
ActiveSupport::Deprecation.warn("Instance variable @#{@method} is deprecated! Call instance method #{@method} instead.")
@value
end
end

end
end

Expand Down
10 changes: 10 additions & 0 deletions activesupport/test/deprecation_test.rb
Expand Up @@ -149,3 +149,13 @@ def message
assert_nil @last_message
end
end

class DeprecatedIvarTest < Test::Unit::TestCase

def test_deprecated_ivar
@action = ActiveSupport::Deprecation::DeprecatedInstanceVariable.new("fubar", :foobar)

assert_deprecated(/Instance variable @foobar is deprecated! Call instance method foobar instead/) { assert_equal "fubar", @action }
end

end
11 changes: 3 additions & 8 deletions railties/lib/tasks/databases.rake
Expand Up @@ -46,7 +46,7 @@ namespace :db do
@encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
begin
ActiveRecord::Base.establish_connection(config.merge('database' => 'template1'))
ActiveRecord::Base.connection.create_database(config['database'], :encoding => @encoding)
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
ActiveRecord::Base.establish_connection(config)
rescue
$stderr.puts $!, *($!.backtrace)
Expand Down Expand Up @@ -314,14 +314,9 @@ namespace :db do
ActiveRecord::Base.establish_connection(:test)
ActiveRecord::Base.connection.recreate_database(abcs["test"]["database"])
when "postgresql"
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
enc_option = "-E #{abcs["test"]["encoding"]}" if abcs["test"]["encoding"]

ActiveRecord::Base.clear_active_connections!
`dropdb -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
`createdb #{enc_option} -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
drop_database(abcs['test'])
create_database(abcs['test'])
when "sqlite","sqlite3"
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
File.delete(dbfile) if File.exist?(dbfile)
Expand Down

0 comments on commit 63e8bca

Please sign in to comment.