Skip to content

Commit

Permalink
renames load_(once_)paths to autoload_(once_)paths in dependencies an…
Browse files Browse the repository at this point in the history
…d config
  • Loading branch information
fxn committed Jun 23, 2010
1 parent 4a0a640 commit 6f83a50
Show file tree
Hide file tree
Showing 10 changed files with 59 additions and 54 deletions.
2 changes: 2 additions & 0 deletions activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*Rails 3.0.0 [Release Candidate] (unreleased)*

* Renamed ActiveSupport::Dependecies.load_(once_)paths to autoload_(once_)paths. [fxn]

* Added ActiveSupport::FileUpdateChecker to execute a block only if a set of files changed, used by Router and I18n locale files. [José Valim]

* Added ActiveSupport::DescendantsTracker to track descendants with support to constants reloading. [José Valim]
Expand Down
24 changes: 12 additions & 12 deletions activesupport/lib/active_support/dependencies.rb
Expand Up @@ -33,14 +33,14 @@ module Dependencies #:nodoc:

# The set of directories from which we may automatically load files. Files
# under these directories will be reloaded on each request in development mode,
# unless the directory also appears in load_once_paths.
mattr_accessor :load_paths
self.load_paths = []
# unless the directory also appears in autoload_once_paths.
mattr_accessor :autoload_paths
self.autoload_paths = []

# The set of directories from which automatically loaded constants are loaded
# only once. All directories in this set must also be present in +load_paths+.
mattr_accessor :load_once_paths
self.load_once_paths = []
# only once. All directories in this set must also be present in +autoload_paths+.
mattr_accessor :autoload_once_paths
self.autoload_once_paths = []

# An array of qualified constant names that have been loaded. Adding a name to
# this array will cause it to be unloaded the next time Dependencies are cleared.
Expand Down Expand Up @@ -352,7 +352,7 @@ def local_const_defined?(mod, const) #:nodoc:

# Given +path+, a filesystem path to a ruby file, return an array of constant
# paths which would cause Dependencies to attempt to load this file.
def loadable_constants_for_path(path, bases = load_paths)
def loadable_constants_for_path(path, bases = autoload_paths)
expanded_path = Pathname.new(path[/\A(.*?)(\.rb)?\Z/, 1]).expand_path

bases.inject([]) do |paths, root|
Expand All @@ -363,11 +363,11 @@ def loadable_constants_for_path(path, bases = load_paths)
end.uniq
end

# Search for a file in load_paths matching the provided suffix.
# Search for a file in autoload_paths matching the provided suffix.
def search_for_file(path_suffix)
path_suffix = path_suffix.sub(/(\.rb)?$/, ".rb")

load_paths.each do |root|
autoload_paths.each do |root|
path = File.join(root, path_suffix)
return path if File.file? path
end
Expand All @@ -377,14 +377,14 @@ def search_for_file(path_suffix)
# Does the provided path_suffix correspond to an autoloadable module?
# Instead of returning a boolean, the autoload base for this module is returned.
def autoloadable_module?(path_suffix)
load_paths.each do |load_path|
autoload_paths.each do |load_path|
return load_path if File.directory? File.join(load_path, path_suffix)
end
nil
end

def load_once_path?(path)
load_once_paths.any? { |base| path.starts_with? base }
autoload_once_paths.any? { |base| path.starts_with? base }
end

# Attempt to autoload the provided module name by searching for a directory
Expand All @@ -396,7 +396,7 @@ def autoload_module!(into, const_name, qualified_name, path_suffix)
return nil unless base_path = autoloadable_module?(path_suffix)
mod = Module.new
into.const_set const_name, mod
autoloaded_constants << qualified_name unless load_once_paths.include?(base_path)
autoloaded_constants << qualified_name unless autoload_once_paths.include?(base_path)
return mod
end

Expand Down
36 changes: 18 additions & 18 deletions activesupport/test/dependencies_test.rb
Expand Up @@ -25,11 +25,11 @@ def with_loading(*from)
this_dir = File.dirname(__FILE__)
parent_dir = File.dirname(this_dir)
$LOAD_PATH.unshift(parent_dir) unless $LOAD_PATH.include?(parent_dir)
prior_load_paths = ActiveSupport::Dependencies.load_paths
ActiveSupport::Dependencies.load_paths = from.collect { |f| "#{this_dir}/#{f}" }
prior_autoload_paths = ActiveSupport::Dependencies.autoload_paths
ActiveSupport::Dependencies.autoload_paths = from.collect { |f| "#{this_dir}/#{f}" }
yield
ensure
ActiveSupport::Dependencies.load_paths = prior_load_paths
ActiveSupport::Dependencies.autoload_paths = prior_autoload_paths
ActiveSupport::Dependencies.mechanism = old_mechanism
ActiveSupport::Dependencies.explicitly_unloadable_constants = []
end
Expand Down Expand Up @@ -264,15 +264,15 @@ def test_loadable_constants_for_path_should_handle_relative_paths
def test_loadable_constants_for_path_should_provide_all_results
fake_root = '/usr/apps/backpack'
with_loading fake_root, fake_root + '/lib' do
root = ActiveSupport::Dependencies.load_paths.first
root = ActiveSupport::Dependencies.autoload_paths.first
assert_equal ["Lib::A::B", "A::B"], ActiveSupport::Dependencies.loadable_constants_for_path(root + '/lib/a/b')
end
end

def test_loadable_constants_for_path_should_uniq_results
fake_root = '/usr/apps/backpack/lib'
with_loading fake_root, fake_root + '/' do
root = ActiveSupport::Dependencies.load_paths.first
root = ActiveSupport::Dependencies.autoload_paths.first
assert_equal ["A::B"], ActiveSupport::Dependencies.loadable_constants_for_path(root + '/a/b')
end
end
Expand Down Expand Up @@ -344,7 +344,7 @@ def test_qualified_name_for

def test_file_search
with_loading 'dependencies' do
root = ActiveSupport::Dependencies.load_paths.first
root = ActiveSupport::Dependencies.autoload_paths.first
assert_equal nil, ActiveSupport::Dependencies.search_for_file('service_three')
assert_equal nil, ActiveSupport::Dependencies.search_for_file('service_three.rb')
assert_equal root + '/service_one.rb', ActiveSupport::Dependencies.search_for_file('service_one')
Expand All @@ -354,14 +354,14 @@ def test_file_search

def test_file_search_uses_first_in_load_path
with_loading 'dependencies', 'autoloading_fixtures' do
deps, autoload = ActiveSupport::Dependencies.load_paths
deps, autoload = ActiveSupport::Dependencies.autoload_paths
assert_match %r/dependencies/, deps
assert_match %r/autoloading_fixtures/, autoload

assert_equal deps + '/conflict.rb', ActiveSupport::Dependencies.search_for_file('conflict')
end
with_loading 'autoloading_fixtures', 'dependencies' do
autoload, deps = ActiveSupport::Dependencies.load_paths
autoload, deps = ActiveSupport::Dependencies.autoload_paths
assert_match %r/dependencies/, deps
assert_match %r/autoloading_fixtures/, autoload

Expand Down Expand Up @@ -418,7 +418,7 @@ def test_const_missing_within_anonymous_module

def test_removal_from_tree_should_be_detected
with_loading 'dependencies' do
root = ActiveSupport::Dependencies.load_paths.first
root = ActiveSupport::Dependencies.autoload_paths.first
c = ServiceOne
ActiveSupport::Dependencies.clear
assert ! defined?(ServiceOne)
Expand All @@ -433,7 +433,7 @@ def test_removal_from_tree_should_be_detected

def test_references_should_work
with_loading 'dependencies' do
root = ActiveSupport::Dependencies.load_paths.first
root = ActiveSupport::Dependencies.autoload_paths.first
c = ActiveSupport::Dependencies.ref("ServiceOne")
service_one_first = ServiceOne
assert_equal service_one_first, c.get
Expand All @@ -460,9 +460,9 @@ def test_nested_load_error_isnt_rescued
end
end

def test_load_once_paths_do_not_add_to_autoloaded_constants
def test_autoload_once_paths_do_not_add_to_autoloaded_constants
with_autoloading_fixtures do
ActiveSupport::Dependencies.load_once_paths = ActiveSupport::Dependencies.load_paths.dup
ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_paths.dup

assert ! ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
assert ! ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
Expand All @@ -473,7 +473,7 @@ def test_load_once_paths_do_not_add_to_autoloaded_constants
end
ensure
Object.class_eval { remove_const :ModuleFolder }
ActiveSupport::Dependencies.load_once_paths = []
ActiveSupport::Dependencies.autoload_once_paths = []
end

def test_application_should_special_case_application_controller
Expand Down Expand Up @@ -760,20 +760,20 @@ def test_remove_constant_handles_double_colon_at_start

def test_load_once_constants_should_not_be_unloaded
with_autoloading_fixtures do
ActiveSupport::Dependencies.load_once_paths = ActiveSupport::Dependencies.load_paths
ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_paths
::A.to_s
assert defined?(A)
ActiveSupport::Dependencies.clear
assert defined?(A)
end
ensure
ActiveSupport::Dependencies.load_once_paths = []
ActiveSupport::Dependencies.autoload_once_paths = []
Object.class_eval { remove_const :A if const_defined?(:A) }
end

def test_load_once_paths_should_behave_when_recursively_loading
def test_autoload_once_paths_should_behave_when_recursively_loading
with_loading 'dependencies', 'autoloading_fixtures' do
ActiveSupport::Dependencies.load_once_paths = [ActiveSupport::Dependencies.load_paths.last]
ActiveSupport::Dependencies.autoload_once_paths = [ActiveSupport::Dependencies.autoload_paths.last]
assert !defined?(CrossSiteDependency)
assert_nothing_raised { CrossSiteDepender.nil? }
assert defined?(CrossSiteDependency)
Expand All @@ -784,7 +784,7 @@ def test_load_once_paths_should_behave_when_recursively_loading
"CrossSiteDependency shouldn't have been unloaded!"
end
ensure
ActiveSupport::Dependencies.load_once_paths = []
ActiveSupport::Dependencies.autoload_once_paths = []
end

def test_hook_called_multiple_times
Expand Down
3 changes: 3 additions & 0 deletions railties/CHANGELOG
@@ -1,6 +1,9 @@
*Rails 3.0.0 [Release Candidate] (unreleased)*

* config.load_(once_)paths in config/application.rb got renamed to config.autoload_(once_)paths. [fxn]

* Abort generation/booting on Ruby 1.9.1. [fxn]

* Made the rails command work even when you're in a subdirectory [Chad Fowler]


Expand Down
4 changes: 2 additions & 2 deletions railties/lib/rails/application.rb
Expand Up @@ -67,7 +67,7 @@ def inherited(base)
raise "You cannot have more than one Rails::Application" if Rails.application
super
Rails.application = base.instance
Rails.application.add_lib_to_load_paths!
Rails.application.add_lib_to_load_path!
ActiveSupport.run_load_hooks(:before_configuration, base.instance)
end

Expand Down Expand Up @@ -97,7 +97,7 @@ def method_missing(*args, &block)
# are changing config.root inside your application definition or having a custom
# Rails application, you will need to add lib to $LOAD_PATH on your own in case
# you need to load files in lib/ during the application configuration as well.
def add_lib_to_load_paths! #:nodoc:
def add_lib_to_load_path! #:nodoc:
path = config.root.join('lib').to_s
$LOAD_PATH.unshift(path) if File.exists?(path)
end
Expand Down
10 changes: 5 additions & 5 deletions railties/lib/rails/application/finisher.rb
Expand Up @@ -7,14 +7,14 @@ module Finisher
config.generators.templates.unshift(*paths.lib.templates.to_a)
end

initializer :ensure_load_once_paths_as_subset do
extra = ActiveSupport::Dependencies.load_once_paths -
ActiveSupport::Dependencies.load_paths
initializer :ensure_autoload_once_paths_as_subset do
extra = ActiveSupport::Dependencies.autoload_once_paths -
ActiveSupport::Dependencies.autoload_paths

unless extra.empty?
abort <<-end_error
load_once_paths must be a subset of the load_paths.
Extra items in load_once_paths: #{extra * ','}
autoload_once_paths must be a subset of the autoload_paths.
Extra items in autoload_once_paths: #{extra * ','}
end_error
end
end
Expand Down
16 changes: 8 additions & 8 deletions railties/lib/rails/engine.rb
Expand Up @@ -32,14 +32,14 @@ module Rails
# == Configuration
#
# Besides the Railtie configuration which is shared across the application, in a
# Rails::Engine you can access load_paths, eager_load_paths and load_once_paths,
# Rails::Engine you can access autoload_paths, eager_load_paths and autoload_once_paths,
# which differently from a Railtie, are scoped to the current Engine.
#
# Example:
#
# class MyEngine < Rails::Engine
# # Add a load path for this specific Engine
# config.load_paths << File.expand_path("../lib/some/path", __FILE__)
# config.autoload_paths << File.expand_path("../lib/some/path", __FILE__)
#
# initializer "my_engine.add_middleware" do |app|
# app.middleware.use MyEngine::Middleware
Expand Down Expand Up @@ -142,7 +142,7 @@ def eager_load!

# Add configured load paths to ruby load paths and remove duplicates.
initializer :set_load_path, :before => :bootstrap_hook do
config.load_paths.reverse_each do |path|
config.autoload_paths.reverse_each do |path|
$LOAD_PATH.unshift(path) if File.directory?(path)
end
$LOAD_PATH.uniq!
Expand All @@ -154,17 +154,17 @@ def eager_load!
# This needs to be an initializer, since it needs to run once
# per engine and get the engine as a block parameter
initializer :set_autoload_paths, :before => :bootstrap_hook do |app|
ActiveSupport::Dependencies.load_paths.unshift(*config.load_paths)
ActiveSupport::Dependencies.autoload_paths.unshift(*config.autoload_paths)

if reloadable?(app)
ActiveSupport::Dependencies.load_once_paths.unshift(*config.load_once_paths)
ActiveSupport::Dependencies.autoload_once_paths.unshift(*config.autoload_once_paths)
else
ActiveSupport::Dependencies.load_once_paths.unshift(*config.load_paths)
ActiveSupport::Dependencies.autoload_once_paths.unshift(*config.autoload_paths)
end

# Freeze so future modifications will fail rather than do nothing mysteriously
config.load_paths.freeze
config.load_once_paths.freeze
config.autoload_paths.freeze
config.autoload_once_paths.freeze
end

initializer :add_routing_paths do |app|
Expand Down
10 changes: 5 additions & 5 deletions railties/lib/rails/engine/configuration.rb
Expand Up @@ -4,7 +4,7 @@ module Rails
class Engine
class Configuration < ::Rails::Railtie::Configuration
attr_reader :root
attr_writer :eager_load_paths, :load_once_paths, :load_paths
attr_writer :eager_load_paths, :autoload_once_paths, :autoload_paths

def initialize(root=nil)
super()
Expand Down Expand Up @@ -41,12 +41,12 @@ def eager_load_paths
@eager_load_paths ||= paths.eager_load
end

def load_once_paths
@load_once_paths ||= paths.load_once
def autoload_once_paths
@autoload_once_paths ||= paths.load_once
end

def load_paths
@load_paths ||= paths.load_paths
def autoload_paths
@autoload_paths ||= paths.load_paths
end
end
end
Expand Down
Expand Up @@ -22,7 +22,7 @@ class Application < Rails::Application
# -- all .rb files in that directory are automatically loaded.

# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/extras )
# config.autoload_paths += %W( #{config.root}/extras )

# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named
Expand Down
6 changes: 3 additions & 3 deletions railties/test/generators/actions_test.rb
Expand Up @@ -130,9 +130,9 @@ def test_gem_should_insert_on_separate_lines

def test_environment_should_include_data_in_environment_initializer_block
run_generator
load_paths = 'config.load_paths += %w["#{Rails.root}/app/extras"]'
action :environment, load_paths
assert_file 'config/application.rb', /#{Regexp.escape(load_paths)}/
autoload_paths = 'config.autoload_paths += %w["#{Rails.root}/app/extras"]'
action :environment, autoload_paths
assert_file 'config/application.rb', /#{Regexp.escape(autoload_paths)}/
end

def test_environment_with_block_should_include_block_contents_in_environment_initializer_block
Expand Down

10 comments on commit 6f83a50

@iHiD
Copy link
Contributor

@iHiD iHiD commented on 6f83a50 Jun 25, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was load_paths depreciated?

This just broke all my apps with no previous warning.

Thanks,
iHiD

@josevalim
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it was. The deprecation was placed on Rails 2.3 apps, so it was a bit harder on people already using Rails 3 apps.

@iHiD
Copy link
Contributor

@iHiD iHiD commented on 6f83a50 Jun 25, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, that's fair enough. Thank you for answering.

@jpartogi
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a library under lib/a/b/c.rb and this change broke my app now.

With this change does it mean we have to load the libraries under the lib/ folder it as such:
Lib::A::B::C

@fxn
Copy link
Member Author

@fxn fxn commented on 6f83a50 Jun 28, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@scrum8, this particular commit only renames. Perhaps you mean 9b19a6f ?

If that is the case, you need to require c.rb where A::B::C is used:

require "a/b/c"

Note that you can use that relative path because lib is still in Ruby's load path.

@jpartogi
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @fxn,

Thanks for the response. So now we have to explicitly call require? Did I get this right?

@fxn
Copy link
Member Author

@fxn fxn commented on 6f83a50 Jun 28, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@scrum8, by default yes.

You can still get the old behavior adding lib to config.autoload_paths in config/application.rb.

@jpartogi
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks fxn,

Any reason why we have to explicitly configure it in config/application.rb now?

@fxn
Copy link
Member Author

@fxn fxn commented on 6f83a50 Jun 29, 2010

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applications are no longer configured in config/environment.rb in Rails 3. If you generate a new Rails 3 application you'll see there's a config/application.rb with contents that resemble what config/environment.rb had before.

@ryanbriones
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Sorry to be late to the party) Is there any explanation available on the interwebs on why the decision to not autoload lib by default?

Please sign in to comment.