Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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.