Tests pass, AWDoR passes, and a fresh app boots.

This commit is contained in:
Yehuda Katz + Carl Lerche 2009-06-19 15:55:32 -07:00
parent 9d398f4827
commit 042bd0a5c8
1 changed files with 228 additions and 121 deletions

View File

@ -1,4 +1,6 @@
require "pathname" require "pathname"
$LOAD_PATH.unshift File.dirname(__FILE__)
require 'railties_path' require 'railties_path'
require 'rails/version' require 'rails/version'
require 'rails/gem_dependency' require 'rails/gem_dependency'
@ -7,26 +9,143 @@ require 'rails/rack'
RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV) RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV)
module Rails module Rails
# Needs to be duplicated from Active Support since its needed before Active
# Support is available. Here both Options and Hash are namespaced to prevent
# conflicts with other implementations AND with the classes residing in Active Support.
# ---
# TODO: w0t?
class << self
# The Configuration instance used to configure the Rails environment
def configuration
@@configuration
end
def configuration=(configuration)
@@configuration = configuration
end
def initialized?
@initialized || false
end
def initialized=(initialized)
@initialized ||= initialized
end
def logger
if defined?(RAILS_DEFAULT_LOGGER)
RAILS_DEFAULT_LOGGER
else
nil
end
end
def backtrace_cleaner
@@backtrace_cleaner ||= begin
# Relies on ActiveSupport, so we have to lazy load to postpone definition until AS has been loaded
require 'rails/backtrace_cleaner'
Rails::BacktraceCleaner.new
end
end
def root
Pathname.new(RAILS_ROOT) if defined?(RAILS_ROOT)
end
def env
@_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV)
end
def cache
RAILS_CACHE
end
def version
VERSION::STRING
end
def public_path
@@public_path ||= self.root ? File.join(self.root, "public") : "public"
end
def public_path=(path)
@@public_path = path
end
end
class OrderedOptions < Array #:nodoc:
def []=(key, value)
key = key.to_sym
if pair = find_pair(key)
pair.pop
pair << value
else
self << [key, value]
end
end
def [](key)
pair = find_pair(key.to_sym)
pair ? pair.last : nil
end
def method_missing(name, *args)
if name.to_s =~ /(.*)=$/
self[$1.to_sym] = args.first
else
self[name]
end
end
private
def find_pair(key)
self.each { |i| return i if i.first == key }
return false
end
end
class Configuration class Configuration
attr_accessor :cache_classes, :load_paths, :eager_load_paths, :framework_paths, attr_accessor :cache_classes, :load_paths, :eager_load_paths, :framework_paths,
:load_once_paths, :gems_dependencies_loaded, :after_initialize_blocks, :load_once_paths, :gems_dependencies_loaded, :after_initialize_blocks,
:frameworks, :framework_root_path, :root_path, :plugin_paths, :plugins, :frameworks, :framework_root_path, :root_path, :plugin_paths, :plugins,
:plugin_loader, :plugin_locators, :gems, :loaded_plugins, :reload_plugins, :plugin_loader, :plugin_locators, :gems, :loaded_plugins, :reload_plugins,
:i18n, :gems :i18n, :gems, :whiny_nils, :consider_all_requests_local,
:action_controller, :active_record, :action_view, :active_support,
:action_mailer, :active_resource,
:log_path, :log_level, :logger, :preload_frameworks,
:database_configuration_file, :cache_store, :time_zone,
:view_path, :metals, :controller_paths, :routes_configuration_file,
:eager_load_paths, :dependency_loading
def initialize def initialize
set_root_path! set_root_path!
@framework_paths = [] @framework_paths = []
@load_once_paths = [] @load_once_paths = []
@after_initialize_blocks = [] @after_initialize_blocks = []
@loaded_plugins = [] @loaded_plugins = []
@plugin_paths = default_plugin_paths @dependency_loading = true
@frameworks = default_frameworks @eager_load_paths = default_eager_load_paths
@plugin_loader = default_plugin_loader @load_paths = default_load_paths
@plugin_locators = default_plugin_locators @plugin_paths = default_plugin_paths
@gems = default_gems @frameworks = default_frameworks
@i18n = default_i18n @plugin_loader = default_plugin_loader
@plugin_locators = default_plugin_locators
@gems = default_gems
@i18n = default_i18n
@log_path = default_log_path
@log_level = default_log_level
@cache_store = default_cache_store
@view_path = default_view_path
@controller_paths = default_controller_paths
@routes_configuration_file = default_routes_configuration_file
@database_configuration_file = default_database_configuration_file
for framework in default_frameworks
self.send("#{framework}=", Rails::OrderedOptions.new)
end
self.active_support = Rails::OrderedOptions.new
end end
def after_initialize(&blk) def after_initialize(&blk)
@ -72,6 +191,86 @@ module Rails
ActionController::Dispatcher.middleware ActionController::Dispatcher.middleware
end end
# Loads and returns the contents of the #database_configuration_file. The
# contents of the file are processed via ERB before being sent through
# YAML::load.
def database_configuration
require 'erb'
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
end
def default_routes_configuration_file
File.join(root_path, 'config', 'routes.rb')
end
def default_controller_paths
paths = [File.join(root_path, 'app', 'controllers')]
paths.concat builtin_directories
paths
end
def default_cache_store
if File.exist?("#{root_path}/tmp/cache/")
[ :file_store, "#{root_path}/tmp/cache/" ]
else
:memory_store
end
end
def default_database_configuration_file
File.join(root_path, 'config', 'database.yml')
end
def default_view_path
File.join(root_path, 'app', 'views')
end
def default_eager_load_paths
%w(
app/metal
app/models
app/controllers
app/helpers
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
end
def default_load_paths
paths = []
# Add the old mock paths only if the directories exists
paths.concat(Dir["#{root_path}/test/mocks/#{RAILS_ENV}"]) if File.exists?("#{root_path}/test/mocks/#{RAILS_ENV}")
# Add the app's controller directory
paths.concat(Dir["#{root_path}/app/controllers/"])
# Followed by the standard includes.
paths.concat %w(
app
app/metal
app/models
app/controllers
app/helpers
app/services
lib
vendor
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
paths.concat builtin_directories
end
def builtin_directories
# Include builtins only in the development environment.
(RAILS_ENV == 'development') ? Dir["#{RAILTIES_PATH}/builtin/*/"] : []
end
def default_log_path
File.join(root_path, 'log', "#{RAILS_ENV}.log")
end
def default_log_level
RAILS_ENV == 'production' ? :info : :debug
end
def default_frameworks def default_frameworks
[ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ]
end end
@ -123,6 +322,10 @@ module Rails
[] []
end end
def environment_path
"#{root_path}/config/environments/#{RAILS_ENV}.rb"
end
def reload_plugins? def reload_plugins?
@reload_plugins @reload_plugins
end end
@ -201,7 +404,7 @@ module Rails
end end
def run(initializer = nil) def run(initializer = nil)
Base.config = @config Rails.configuration = Base.config = @config
if initializer if initializer
run_initializer(initializer) run_initializer(initializer)
@ -217,6 +420,7 @@ module Rails
def self.run(initializer = nil, config = nil) def self.run(initializer = nil, config = nil)
default.config = config if config default.config = config if config
default.config ||= Configuration.new
default.run(initializer) default.run(initializer)
end end
end end
@ -281,9 +485,9 @@ module Rails
Initializer.default.add :add_gem_load_paths do Initializer.default.add :add_gem_load_paths do
require 'rails/gem_dependency' require 'rails/gem_dependency'
Rails::GemDependency.add_frozen_gem_path Rails::GemDependency.add_frozen_gem_path
unless @configuration.gems.empty? unless config.gems.empty?
require "rubygems" require "rubygems"
@configuration.gems.each { |gem| gem.add_load_paths } config.gems.each { |gem| gem.add_load_paths }
end end
end end
@ -330,7 +534,7 @@ module Rails
# is typically one of development, test, or production. # is typically one of development, test, or production.
Initializer.default.add :load_environment do Initializer.default.add :load_environment do
silence_warnings do silence_warnings do
return if @environment_loaded next if @environment_loaded
@environment_loaded = true @environment_loaded = true
config = configuration config = configuration
@ -408,7 +612,7 @@ module Rails
begin begin
logger = ActiveSupport::BufferedLogger.new(configuration.log_path) logger = ActiveSupport::BufferedLogger.new(configuration.log_path)
logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase) logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase)
if configuration.environment == "production" if RAILS_ENV == "production"
logger.auto_flushing = false logger.auto_flushing = false
end end
rescue StandardError => e rescue StandardError => e
@ -525,7 +729,7 @@ module Rails
end end
Initializer.default.add :check_for_unbuilt_gems do Initializer.default.add :check_for_unbuilt_gems do
unbuilt_gems = @configuration.gems.select {|gem| gem.frozen? && !gem.built? } unbuilt_gems = config.gems.select {|gem| gem.frozen? && !gem.built? }
if unbuilt_gems.size > 0 if unbuilt_gems.size > 0
# don't print if the gems:build rake tasks are being run # don't print if the gems:build rake tasks are being run
unless $gems_build_rake_task unless $gems_build_rake_task
@ -545,7 +749,7 @@ Run `rake gems:build` to build the unbuilt gems.
Initializer.default.add :load_gems do Initializer.default.add :load_gems do
unless $gems_rake_task unless $gems_rake_task
@configuration.gems.each { |gem| gem.load } config.gems.each { |gem| gem.load }
end end
end end
@ -574,9 +778,9 @@ Run `rake gems:build` to build the unbuilt gems.
Initializer.default.add :add_gem_load_paths do Initializer.default.add :add_gem_load_paths do
require 'rails/gem_dependency' require 'rails/gem_dependency'
Rails::GemDependency.add_frozen_gem_path Rails::GemDependency.add_frozen_gem_path
unless @configuration.gems.empty? unless config.gems.empty?
require "rubygems" require "rubygems"
@configuration.gems.each { |gem| gem.add_load_paths } config.gems.each { |gem| gem.add_load_paths }
end end
end end
@ -584,7 +788,7 @@ Run `rake gems:build` to build the unbuilt gems.
# load_gems # load_gems
Initializer.default.add :check_gem_dependencies do Initializer.default.add :check_gem_dependencies do
unloaded_gems = @configuration.gems.reject { |g| g.loaded? } unloaded_gems = config.gems.reject { |g| g.loaded? }
if unloaded_gems.size > 0 if unloaded_gems.size > 0
configuration.gems_dependencies_loaded = false configuration.gems_dependencies_loaded = false
# don't print if the gems rake tasks are being run # don't print if the gems rake tasks are being run
@ -643,7 +847,7 @@ Run `rake gems:install` to install the missing gems.
# # Prepare dispatcher callbacks and run 'prepare' callbacks # # Prepare dispatcher callbacks and run 'prepare' callbacks
Initializer.default.add :prepare_dispatcher do Initializer.default.add :prepare_dispatcher do
return unless configuration.frameworks.include?(:action_controller) next unless configuration.frameworks.include?(:action_controller)
require 'dispatcher' unless defined?(::Dispatcher) require 'dispatcher' unless defined?(::Dispatcher)
Dispatcher.define_dispatcher_callbacks(configuration.cache_classes) Dispatcher.define_dispatcher_callbacks(configuration.cache_classes)
end end
@ -654,7 +858,7 @@ Run `rake gems:install` to install the missing gems.
# this does nothing. Otherwise, it loads the routing definitions and sets up # this does nothing. Otherwise, it loads the routing definitions and sets up
# loading module used to lazily load controllers (Configuration#controller_paths). # loading module used to lazily load controllers (Configuration#controller_paths).
Initializer.default.add :initialize_routing do Initializer.default.add :initialize_routing do
return unless configuration.frameworks.include?(:action_controller) next unless configuration.frameworks.include?(:action_controller)
ActionController::Routing.controller_paths += configuration.controller_paths ActionController::Routing.controller_paths += configuration.controller_paths
ActionController::Routing::Routes.add_configuration_file(configuration.routes_configuration_file) ActionController::Routing::Routes.add_configuration_file(configuration.routes_configuration_file)
@ -681,7 +885,7 @@ Run `rake gems:install` to install the missing gems.
# Eager load application classes # Eager load application classes
Initializer.default.add :load_application_classes do Initializer.default.add :load_application_classes do
return if $rails_rake_task next if $rails_rake_task
if configuration.cache_classes if configuration.cache_classes
configuration.eager_load_paths.each do |load_path| configuration.eager_load_paths.each do |load_path|
matcher = /\A#{Regexp.escape(load_path)}(.*)\.rb\Z/ matcher = /\A#{Regexp.escape(load_path)}(.*)\.rb\Z/
@ -699,100 +903,3 @@ Run `rake gems:install` to install the missing gems.
end end
end end
end end
# Needs to be duplicated from Active Support since its needed before Active
# Support is available. Here both Options and Hash are namespaced to prevent
# conflicts with other implementations AND with the classes residing in Active Support.
# ---
# TODO: w0t?
module Rails
class << self
# The Configuration instance used to configure the Rails environment
def configuration
@@configuration
end
def configuration=(configuration)
@@configuration = configuration
end
def initialized?
@initialized || false
end
def initialized=(initialized)
@initialized ||= initialized
end
def logger
if defined?(RAILS_DEFAULT_LOGGER)
RAILS_DEFAULT_LOGGER
else
nil
end
end
def backtrace_cleaner
@@backtrace_cleaner ||= begin
# Relies on ActiveSupport, so we have to lazy load to postpone definition until AS has been loaded
require 'rails/backtrace_cleaner'
Rails::BacktraceCleaner.new
end
end
def root
Pathname.new(RAILS_ROOT) if defined?(RAILS_ROOT)
end
def env
@_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV)
end
def cache
RAILS_CACHE
end
def version
VERSION::STRING
end
def public_path
@@public_path ||= self.root ? File.join(self.root, "public") : "public"
end
def public_path=(path)
@@public_path = path
end
end
class OrderedOptions < Array #:nodoc:
def []=(key, value)
key = key.to_sym
if pair = find_pair(key)
pair.pop
pair << value
else
self << [key, value]
end
end
def [](key)
pair = find_pair(key.to_sym)
pair ? pair.last : nil
end
def method_missing(name, *args)
if name.to_s =~ /(.*)=$/
self[$1.to_sym] = args.first
else
self[name]
end
end
private
def find_pair(key)
self.each { |i| return i if i.first == key }
return false
end
end
end