Merge pull request #7695 from benolee/backport_cc7dd66_and_c0ba0f0

backport runner fixes to 3-2-stable

Conflicts:
	railties/CHANGELOG.md
This commit is contained in:
Rafael Mendonça França
2013-05-12 15:13:47 -03:00
10 changed files with 87 additions and 1 deletions

View File

@@ -1,10 +1,13 @@
## unreleased ##
* Require ActiveRecord::Base in railtie hooks for rake_tasks, console and runner to
avoid circular constant loading issues. [Backport #7695] [Fixes #7683 and #882] *Ben Holley*
* Maintain context for joins within ActiveRecord::Relation merges.
Backport #10164.
*Neeraj Singh + Andrew Horner*
* Make sure the `EXPLAIN` command is never triggered by a `select_db` call.
*Daniel Schierbeck*

View File

@@ -30,6 +30,7 @@ module ActiveRecord
)
rake_tasks do
require "active_record/base"
load "active_record/railties/databases.rake"
end
@@ -38,9 +39,14 @@ module ActiveRecord
# first time. Also, make it output to STDERR.
console do |app|
require "active_record/railties/console_sandbox" if app.sandbox?
require "active_record/base"
ActiveRecord::Base.logger = Logger.new(STDERR)
end
runner do |app|
require "active_record/base"
end
initializer "active_record.initialize_timezone" do
ActiveSupport.on_load(:active_record) do
self.time_zone_aware_attributes = true

View File

@@ -1,5 +1,7 @@
## unreleased ##
* Add support for runner hook. [Backport: #7695] *Ben Holley*
* Fixes bug with scaffold generator with `--assets=false --resource-route=false`.
Fixes #9525.

View File

@@ -154,6 +154,14 @@ module Rails
self
end
# Load the application runner and invoke the registered hooks.
# Check <tt>Rails::Railtie.runner</tt> for more info.
def load_runner(app=self)
initialize_runner
super
self
end
# Rails.application.env_config stores some of the Rails initial environment parameters.
# Currently stores:
#
@@ -305,6 +313,9 @@ module Rails
require "rails/console/helpers"
end
def initialize_runner #:nodoc:
end
def build_original_fullpath(env)
path_info = env["PATH_INFO"]
query_string = env["QUERY_STRING"]

View File

@@ -42,6 +42,7 @@ ENV["RAILS_ENV"] = options[:environment]
require APP_PATH
Rails.application.require_environment!
Rails.application.load_runner
if code_or_file.nil?
$stderr.puts "Run '#{$0} -h' for help."

View File

@@ -430,6 +430,11 @@ module Rails
super
end
def load_runner(app=self)
railties.all { |r| r.load_runner(app) }
super
end
def eager_load!
railties.all(&:eager_load!)

View File

@@ -145,6 +145,12 @@ module Rails
@load_console
end
def runner(&blk)
@load_runner ||= []
@load_runner << blk if blk
@load_runner
end
def generators(&blk)
@generators ||= []
@generators << blk if blk
@@ -179,6 +185,10 @@ module Rails
self.class.console.each { |block| block.call(app) }
end
def load_runner(app=self)
self.class.runner.each { |block| block.call(app) }
end
def load_tasks(app=self)
extend Rake::DSL if defined? Rake::DSL
self.class.rake_tasks.each { |block| self.instance_exec(app, &block) }

View File

@@ -174,5 +174,27 @@ module ApplicationTests
end
end
end
def test_load_activerecord_base_when_we_use_observers
Dir.chdir(app_path) do
`bundle exec rails g model user;
bundle exec rake db:migrate;
bundle exec rails g observer user;`
add_to_config "config.active_record.observers = :user_observer"
assert_equal "0", `bundle exec rails r "puts User.count"`.strip
app_file "lib/tasks/count_user.rake", <<-RUBY
namespace :user do
task :count => :environment do
puts User.count
end
end
RUBY
assert_equal "0", `bundle exec rake user:count`.strip
end
end
end
end

View File

@@ -57,5 +57,15 @@ module ApplicationTests
assert_match "script/program_name.rb", Dir.chdir(app_path) { `bundle exec rails runner "script/program_name.rb"` }
end
def test_with_hook
add_to_config <<-RUBY
runner do |app|
app.config.ran = true
end
RUBY
assert_match "true", Dir.chdir(app_path) { `bundle exec rails runner "puts Rails.application.config.ran"` }
end
end
end

View File

@@ -163,6 +163,22 @@ module RailtiesTest
assert $ran_block
end
test "runner block is executed when MyApp.load_runner is called" do
$ran_block = false
class MyTie < Rails::Railtie
runner do
$ran_block = true
end
end
require "#{app_path}/config/environment"
assert !$ran_block
AppTemplate::Application.load_runner
assert $ran_block
end
test "railtie can add initializers" do
$ran_block = false