Create the application object from config/environment.rb

This is preliminary and not necessarily reflective of the
  full plan.
This commit is contained in:
Yehuda Katz + Carl Lerche 2009-09-28 17:57:36 -07:00
parent 8ffc2e3b8d
commit 6f6a589d4b
6 changed files with 46 additions and 59 deletions

View File

@ -1,12 +1,20 @@
module Rails
class Application
attr_accessor :middleware, :routes
attr_accessor :routes, :config
def self.load(environment_file)
environment = File.read(environment_file)
Object.class_eval(environment, environment_file)
end
def initialize
@middleware = ActionDispatch::MiddlewareStack.new
@routes = ActionController::Routing::Routes
end
def middleware
config.middleware
end
def call(env)
@app ||= middleware.build(@routes)
@app.call(env)

View File

@ -5,6 +5,14 @@ module Rails
# ---
# TODO: w0t?
class << self
def application
@@application
end
def application=(application)
@@application = application
end
# The Configuration instance used to configure the Rails environment
def configuration
@@configuration
@ -14,14 +22,6 @@ module Rails
@@configuration = configuration
end
def application
@@application
end
def application=(application)
@@application = application
end
def initialized?
@initialized || false
end

View File

@ -1,7 +1,8 @@
# Rack Dispatcher
# Bootstrap rails
require ::File.dirname(__FILE__) + '/config/boot'
# Require your environment file to bootstrap Rails
require ::File.dirname(__FILE__) + '/config/environment'
# Dispatch the request
run ActionController::Dispatcher.new
run Rails::Application.load(::File.dirname(__FILE__) + '/config/environment.rb')

View File

@ -46,7 +46,7 @@ module Rails
%w(railties/lib).each do |path|
$:.unshift("#{RAILS_ROOT}/vendor/rails/#{path}")
end
require "rails/initializer"
require "rails"
Rails::Initializer.run(:install_gem_spec_stubs)
Rails::GemDependency.add_frozen_gem_path
end
@ -56,7 +56,7 @@ module Rails
def load_initializer
self.class.load_rubygems
load_rails_gem
require 'rails/initializer'
require 'rails'
end
def load_rails_gem

View File

@ -90,7 +90,6 @@ module Rails
def run(initializer = nil)
Rails.configuration = Base.config = @config
Rails.application = nil
if initializer
run_initializer(initializer)
@ -98,7 +97,14 @@ module Rails
@initializers.each {|block| run_initializer(block) }
end
Rails.application
# HAX
# TODO: remove hax
unless initializer
app = Rails::Application.new
app.config = @config
Rails.application = app
end
end
end
@ -605,11 +611,4 @@ Run `rake gems:install` to install the missing gems.
Rails::Generators.options.deep_merge! config.generators.options
end
end
Initializer.default.add :build_application do
if configuration.frameworks.include?(:action_controller)
Rails.application = Rails::Application.new
Rails.application.middleware = configuration.middleware
end
end
end

View File

@ -6,6 +6,10 @@ module ApplicationTests
class LoadTest < Test::Unit::TestCase
include ActiveSupport::Testing::Isolation
def rackup
ActionDispatch::Utils.parse_config("#{app_path}/config.ru")
end
def setup
build_app
end
@ -14,48 +18,23 @@ module ApplicationTests
assert File.exist?(app_path("config"))
end
test "running Rails::Application.load on the path returns a (vaguely) useful application" do
app_file "config.ru", <<-CONFIG
require File.dirname(__FILE__) + '/config/environment'
run ActionController::Dispatcher.new
CONFIG
@app = ActionDispatch::Utils.parse_config("#{app_path}/config.ru")
test "config.ru can be racked up" do
@app = rackup
assert_welcome get("/")
end
test "config.ru is used" do
app_file "config.ru", <<-CONFIG
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
headers["Config-Ru-Test"] = "TESTING"
[status, headers, body]
end
end
use MyMiddleware
run proc {|env| [200, {"Content-Type" => "text/html"}, ["VICTORY"]] }
CONFIG
@app = ActionDispatch::Utils.parse_config("#{app_path}/config.ru")
assert_body "VICTORY", get("/omg")
assert_header "Config-Ru-Test", "TESTING", get("/omg")
test "Rails.application is available after config.ru has been racked up" do
rackup
assert Rails.application.is_a?(Rails::Application)
end
test "arbitrary.rb can be used as a config" do
app_file "myapp.rb", <<-CONFIG
Myapp = proc {|env| [200, {"Content-Type" => "text/html"}, ["OMG ROBOTS"]] }
CONFIG
test "class_evaling config/environment.rb returns the application object" do
assert Rails::Application.load("#{app_path}/config/environment.rb").is_a?(Rails::Application)
end
@app = ActionDispatch::Utils.parse_config("#{app_path}/myapp.rb")
assert_body "OMG ROBOTS", get("/omg")
test "the config object is available on the application object" do
rackup
assert_equal 'UTC', Rails.application.config.time_zone
end
end
end