提交 a1687e48 编写于 作者: J José Valim

Make ActiveSupport::Autoload local

Previously, ActiveSupport::Autoload was global and reserved
for usage inside Rails. This pull request makes it local,
fixes its test (they were not being run because its file
was named wrongly) and make it part of Rails public API.
上级 11bc3487
......@@ -37,7 +37,6 @@ module ActiveSupport
autoload :LogSubscriber
autoload :Notifications
# TODO: Narrow this list down
eager_autoload do
autoload :BacktraceCleaner
autoload :BasicObject
......@@ -55,12 +54,12 @@ module ActiveSupport
autoload :OptionMerger
autoload :OrderedHash
autoload :OrderedOptions
autoload :Rescuable
autoload :StringInquirer
autoload :TaggedLogging
autoload :XmlMini
end
autoload :Rescuable
autoload :SafeBuffer, "active_support/core_ext/string/output_safety"
autoload :TestCase
end
......
require "active_support/inflector/methods"
module ActiveSupport
# Autoload and eager load conveniences for your library.
#
# This module allows you to define autoloads based on
# Rails conventions (i.e. no need to define the path
# it is automatically guessed based on the filename)
# and also define a set of constants that needs to be
# eager loaded:
#
# module MyLib
# extend ActiveSupport::Autoload
#
# autoload :Model
#
# eager_autoload do
# autoload :Cache
# end
# end
#
# Then your library can be eager loaded by simply calling:
#
# MyLib.eager_load!
#
module Autoload
@@autoloads = {}
@@under_path = nil
@@at_path = nil
@@eager_autoload = false
def self.extended(base)
base.class_eval do
@_autoloads = {}
@_under_path = nil
@_at_path = nil
@_eager_autoload = false
end
end
def autoload(const_name, path = @@at_path)
def autoload(const_name, path = @_at_path)
unless path
full = [name, @@under_path, const_name.to_s, path].compact.join("::")
full = [name, @_under_path, const_name.to_s, path].compact.join("::")
path = Inflector.underscore(full)
end
if @@eager_autoload
@@autoloads[const_name] = path
if @_eager_autoload
@_autoloads[const_name] = path
end
super const_name, path
end
def autoload_under(path)
@@under_path, old_path = path, @@under_path
@_under_path, old_path = path, @_under_path
yield
ensure
@@under_path = old_path
@_under_path = old_path
end
def autoload_at(path)
@@at_path, old_path = path, @@at_path
@_at_path, old_path = path, @_at_path
yield
ensure
@@at_path = old_path
@_at_path = old_path
end
def eager_autoload
old_eager, @@eager_autoload = @@eager_autoload, true
old_eager, @_eager_autoload = @_eager_autoload, true
yield
ensure
@@eager_autoload = old_eager
@_eager_autoload = old_eager
end
def self.eager_autoload!
@@autoloads.values.each { |file| require file }
def eager_load!
@_autoloads.values.each { |file| require file }
end
def autoloads
@@autoloads
@_autoloads
end
end
end
......@@ -28,15 +28,6 @@ module ::Fixtures::Autoload
assert_nothing_raised { ::Fixtures::Autoload::SomeClass }
end
test ":eager constants can be triggered via ActiveSupport::Autoload.eager_autoload!" do
module ::Fixtures::Autoload
autoload :SomeClass, "fixtures/autoload/some_class"
end
ActiveSupport::Autoload.eager_autoload!
assert $LOADED_FEATURES.include?("fixtures/autoload/some_class.rb")
assert_nothing_raised { ::Fixtures::Autoload::SomeClass }
end
test "the location of autoloaded constants defaults to :name.underscore" do
module ::Fixtures::Autoload
autoload :SomeClass
......@@ -51,8 +42,7 @@ module ::Fixtures::Autoload
autoload :SomeClass
end
ActiveSupport::Autoload.eager_autoload!
assert $LOADED_FEATURES.include?("fixtures/autoload/some_class.rb")
::Fixtures::Autoload.eager_load!
assert_nothing_raised { ::Fixtures::Autoload::SomeClass }
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册