Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Starting to replace scattered path configuration settings with the pa…

…th object
  • Loading branch information...
commit 188a892c5a097ee6d62249d048a6be7d2dfe9649 1 parent 4153c6b
Yehuda Katz + Carl Lerche authored
View
27 railties/lib/initializer.rb
@@ -5,6 +5,7 @@
require 'rails/version'
require 'rails/gem_dependency'
require 'rails/rack'
+require 'rails/paths'
require 'rails/core'
require 'rails/configuration'
@@ -112,24 +113,6 @@ def self.run(initializer = nil, config = nil)
require 'ruby_version_check'
end
- Initializer.default.add :set_root_path do
- raise 'RAILS_ROOT is not set' unless defined?(RAILS_ROOT)
- raise 'RAILS_ROOT is not a directory' unless File.directory?(RAILS_ROOT)
-
- configuration.root_path =
- # Pathname is incompatible with Windows, but Windows doesn't have
- # real symlinks so File.expand_path is safe.
- if RUBY_PLATFORM =~ /(:?mswin|mingw)/
- File.expand_path(RAILS_ROOT)
-
- # Otherwise use Pathname#realpath which respects symlinks.
- else
- Pathname.new(RAILS_ROOT).realpath.to_s
- end
-
- RAILS_ROOT.replace configuration.root_path
- end
-
# If Rails is vendored and RubyGems is available, install stub GemSpecs
# for Rails, Active Support, Active Record, Action Pack, Action Mailer, and
# Active Resource. This allows Gem plugins to depend on Rails even when
@@ -158,8 +141,9 @@ def self.run(initializer = nil, config = nil)
# Set the <tt>$LOAD_PATH</tt> based on the value of
# Configuration#load_paths. Duplicates are removed.
Initializer.default.add :set_load_path do
- load_paths = configuration.load_paths + configuration.framework_paths
- load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) }
+ # TODO: Think about unifying this with the general Rails paths
+ configuration.framework_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) }
+ configuration.paths.add_to_load_path
$LOAD_PATH.uniq!
end
@@ -221,6 +205,8 @@ def self.run(initializer = nil, config = nil)
Initializer.default.add :load_environment do
silence_warnings do
next if @environment_loaded
+ next unless File.file?(configuration.environment_path)
+
@environment_loaded = true
config = configuration
@@ -564,6 +550,7 @@ def self.run(initializer = nil, config = nil)
# Eager load application classes
Initializer.default.add :load_application_classes do
next if $rails_rake_task
+
if configuration.cache_classes
configuration.eager_load_paths.each do |load_path|
matcher = /\A#{Regexp.escape(load_path)}(.*)\.rb\Z/
View
33 railties/lib/rails/configuration.rb
@@ -10,7 +10,7 @@ class Configuration
: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
+ :eager_load_paths, :dependency_loading, :paths
def initialize
set_root_path!
@@ -61,7 +61,36 @@ def set_root_path!
Pathname.new(RAILS_ROOT).realpath.to_s
end
- RAILS_ROOT.replace self.root_path
+ @paths = Rails::Application::Root.new(root_path)
+ @paths.app = "app"
+ @paths.app.metals = "app/metal"
+ @paths.app.models = "app/models"
+ @paths.app.controllers = "app/controllers"
+ @paths.app.helpers = "app/helpers"
+ @paths.app.services = "app/services"
+ @paths.lib = "lib"
+ @paths.vendor = "vendor"
+ @paths.vendor.plugins = "vendor/plugins"
+ @paths.cache = "tmp/cache"
+ @paths.config = "config"
+ @paths.config.locales = "config/locales"
+ @paths.config.environments = "config/environments"
+
+ @paths.app.controllers.push *builtin_directories
+
+ @paths.app.load_path!
+ @paths.app.metals.load_path!
+ @paths.app.models.eager_load!
+ @paths.app.controllers.eager_load!
+ @paths.app.helpers.eager_load!
+ @paths.app.services.load_path!
+ @paths.app.metals.eager_load!
+ @paths.lib.load_path!
+ @paths.vendor.load_path!
+
+ @paths.config.environments.glob = "#{RAILS_ENV}.rb"
+
+ RAILS_ROOT.replace root_path
end
# Enable threaded mode. Allows concurrent requests to controller actions and
View
43 railties/lib/rails/paths.rb
@@ -19,7 +19,7 @@ def method_missing(id, *args)
class Root
include PathParent
- attr_reader :path, :load_once, :eager_load
+ attr_reader :path
def initialize(path)
raise unless path.is_a?(String)
@@ -28,7 +28,32 @@ def initialize(path)
# TODO: Move logic from set_root_path initializer
@path = File.expand_path(path)
@root = self
- @load_once, @eager_load = Set.new, Set.new
+ @load_once, @eager_load, @all_paths = [], [], []
+ end
+
+ def load_once
+ @load_once.uniq!
+ @load_once
+ end
+
+ def eager_load
+ @eager_load.uniq!
+ @eager_load
+ end
+
+ def all_paths
+ @all_paths.uniq!
+ @all_paths
+ end
+
+ def load_paths
+ all_paths.map { |path| path.paths }.flatten
+ end
+
+ def add_to_load_path
+ load_paths.reverse_each do |path|
+ $LOAD_PATH.unshift(path) if File.directory?(path)
+ end
end
end
@@ -57,7 +82,7 @@ def unshift(path)
def load_once!
@load_once = true
- @root.load_once << self
+ @root.load_once.push *self.paths
end
def load_once?
@@ -66,13 +91,23 @@ def load_once?
def eager_load!
@eager_load = true
- @root.eager_load << self
+ @root.all_paths << self
+ @root.eager_load.push *self.paths
end
def eager_load?
@eager_load
end
+ def load_path!
+ @load_path = true
+ @root.all_paths << self
+ end
+
+ def load_path?
+ @load_path
+ end
+
def paths
@paths.map do |path|
path.index('/') == 0 ? path : File.join(@root.path, path)
View
2  railties/lib/railties_path.rb
@@ -1 +1 @@
-RAILTIES_PATH = File.join(File.dirname(__FILE__), '..')
+RAILTIES_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..'))
View
1  railties/test/abstract_unit.rb
@@ -2,6 +2,7 @@
$:.unshift File.dirname(__FILE__) + "/../../activerecord/lib"
$:.unshift File.dirname(__FILE__) + "/../../actionpack/lib"
$:.unshift File.dirname(__FILE__) + "/../../actionmailer/lib"
+$:.unshift File.dirname(__FILE__) + "/../../activeresource/lib"
$:.unshift File.dirname(__FILE__) + "/../lib"
$:.unshift File.dirname(__FILE__) + "/../builtin/rails_info"
View
86 railties/test/initializer/path_test.rb
@@ -0,0 +1,86 @@
+require 'abstract_unit'
+require 'active_support/ruby/shim'
+require 'initializer'
+
+RAILS_ROOT.replace File.join(File.dirname(__FILE__), "root")
+
+module Rails
+ def self.vendor_rails? ; false ; end
+end
+
+# TODO: Can this be reset?
+Rails::Initializer.run do |config|
+ config.frameworks = [:action_controller, :action_view, :action_mailer, :active_record]
+end
+
+class PathsTest < ActiveSupport::TestCase
+ def setup
+ @paths = Rails::Initializer.default.config.paths
+ end
+
+ def root(*path)
+ File.expand_path(File.join(File.dirname(__FILE__), "root", *path))
+ end
+
+ def assert_path(paths, *dir)
+ assert_equal [root(*dir)], paths.paths
+ end
+
+ test "booting up Rails yields a valid paths object" do
+ assert_path @paths.app, "app"
+ assert_path @paths.app.metals, "app", "metal"
+ assert_path @paths.app.models, "app", "models"
+ assert_path @paths.app.helpers, "app", "helpers"
+ assert_path @paths.app.services, "app", "services"
+ assert_path @paths.lib, "lib"
+ assert_path @paths.vendor, "vendor"
+ assert_path @paths.vendor.plugins, "vendor", "plugins"
+ assert_path @paths.cache, "tmp", "cache"
+ assert_path @paths.config, "config"
+ assert_path @paths.config.locales, "config", "locales"
+ assert_path @paths.config.environments, "config", "environments"
+
+ assert_equal Pathname.new(File.dirname(__FILE__)).join("root", "app", "controllers").expand_path,
+ Pathname.new(@paths.app.controllers.to_a.first).expand_path
+ assert_equal Pathname.new(File.dirname(__FILE__)).join("..", "..", "builtin", "rails_info").expand_path,
+ Pathname.new(@paths.app.controllers.to_a[1]).expand_path
+ end
+
+ test "booting up Rails yields a list of paths that are eager" do
+ assert @paths.app.models.eager_load?
+ assert @paths.app.controllers.eager_load?
+ assert @paths.app.helpers.eager_load?
+ assert @paths.app.metals.eager_load?
+ end
+
+ test "environments has a glob equal to the current environment" do
+ assert_equal "#{RAILS_ENV}.rb", @paths.config.environments.glob
+ end
+
+ def assert_in_load_path(*path)
+ assert $:.any? { |p| File.expand_path(p) == root(*path) }, "Load path does not include '#{root(*path)}'. They are:\n-----\n #{$:.join("\n")}\n-----"
+ end
+
+ def assert_not_in_load_path(*path)
+ assert !$:.any? { |p| File.expand_path(p) == root(*path) }, "Load path includes '#{root(*path)}'. They are:\n-----\n #{$:.join("\n")}\n-----"
+ end
+
+ test "load path includes each of the paths in config.paths as long as the directories exist" do
+ assert_in_load_path "app"
+ assert_in_load_path "app", "controllers"
+ assert_in_load_path "app", "metal"
+ assert_in_load_path "app", "models"
+ assert_in_load_path "app", "helpers"
+ assert_in_load_path "lib"
+ assert_in_load_path "vendor"
+
+ assert_not_in_load_path "app", "views"
+ assert_not_in_load_path "app", "services"
+ assert_not_in_load_path "config"
+ assert_not_in_load_path "config", "locales"
+ assert_not_in_load_path "config", "environments"
+ assert_not_in_load_path "tmp"
+ assert_not_in_load_path "tmp", "cache"
+ end
+
+end
View
0  railties/test/initializer/root/app/controllers/.keep
No changes.
View
0  railties/test/initializer/root/app/helpers/.keep
No changes.
View
0  railties/test/initializer/root/app/metal/.keep
No changes.
View
0  railties/test/initializer/root/app/models/.keep
No changes.
View
0  railties/test/initializer/root/app/views/.keep
No changes.
View
4 railties/test/initializer/root/config/database.yml
@@ -0,0 +1,4 @@
+development:
+ adapter: sqlite3
+ database: db/railties.db
+ timeout: 5000
View
0  railties/test/initializer/root/config/environments/.keep
No changes.
View
0  railties/test/initializer/root/config/locales/.keep
No changes.
View
0  railties/test/initializer/root/config/routes.rb
No changes.
View
0  railties/test/initializer/root/lib/.keep
No changes.
View
0  railties/test/initializer/root/tmp/.keep
No changes.
View
0  railties/test/initializer/root/tmp/cache/.keep
No changes.
View
0  railties/test/initializer/root/vendor/.keep
No changes.
View
21 railties/test/paths_test.rb
@@ -69,28 +69,28 @@ def setup
@root.app = "/app"
@root.app.load_once!
assert @root.app.load_once?
- assert @root.load_once.include?(@root.app)
+ assert @root.load_once.include?(@root.app.paths.first)
end
test "making a path load_once more than once only includes it once in @root.load_once" do
@root.app = "/app"
@root.app.load_once!
@root.app.load_once!
- assert_equal 1, @root.load_once.select {|p| p == @root.app }.size
+ assert_equal 1, @root.load_once.select {|p| p == @root.app.paths.first }.size
end
test "it is possible to mark a path as eager" do
@root.app = "/app"
@root.app.eager_load!
assert @root.app.eager_load?
- assert @root.eager_load.include?(@root.app)
+ assert @root.eager_load.include?(@root.app.paths.first)
end
test "making a path eager more than once only includes it once in @root.eager_paths" do
@root.app = "/app"
@root.app.eager_load!
@root.app.eager_load!
- assert_equal 1, @root.eager_load.select {|p| p == @root.app }.size
+ assert_equal 1, @root.eager_load.select {|p| p == @root.app.paths.first }.size
end
test "a path should have a glob that defaults to **/*.rb" do
@@ -103,4 +103,17 @@ def setup
@root.app.glob = "*.rb"
assert_equal "*.rb", @root.app.glob
end
+
+ test "a path can be added to the load path" do
+ @root.app = "app"
+ @root.app.load_path!
+ @root.app.models = "app/models"
+ assert_equal ["/foo/bar/app"], @root.load_paths
+ end
+
+ test "adding a path to the eager paths also adds it to the load path" do
+ @root.app = "app"
+ @root.app.eager_load!
+ assert_equal ["/foo/bar/app"], @root.load_paths
+ end
end
Something went wrong with that request. Please try again.