aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/railtie.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/railtie.rb')
-rw-r--r--railties/lib/rails/railtie.rb100
1 files changed, 52 insertions, 48 deletions
diff --git a/railties/lib/rails/railtie.rb b/railties/lib/rails/railtie.rb
index 8a6e2716dc..7fca565124 100644
--- a/railties/lib/rails/railtie.rb
+++ b/railties/lib/rails/railtie.rb
@@ -1,58 +1,45 @@
require 'rails/initializable'
require 'rails/configuration'
require 'active_support/inflector'
-require 'active_support/deprecation'
module Rails
- # Railtie is the core of the Rails Framework and provides several hooks to extend
+ # Railtie is the core of the Rails framework and provides several hooks to extend
# Rails and/or modify the initialization process.
#
# Every major component of Rails (Action Mailer, Action Controller,
- # Action View, Active Record and Active Resource) are all Railties, so each of
- # them is responsible to set their own initialization. This makes, for example,
- # Rails absent of any Active Record hook, allowing any other ORM framework to hook in.
+ # Action View, Active Record and Active Resource) is a Railtie. Each of
+ # them is responsible for their own initialization. This makes Rails itself
+ # absent of any component hooks, allowing other components to be used in
+ # place of any of the Rails defaults.
#
# Developing a Rails extension does _not_ require any implementation of
# Railtie, but if you need to interact with the Rails framework during
- # or after boot, then Railtie is what you need to do that interaction.
+ # or after boot, then Railtie is needed.
#
- # For example, the following would need you to implement Railtie in your
- # plugin:
+ # For example, an extension doing any of the following would require Railtie:
#
# * creating initializers
- # * configuring a Rails framework or the Application, like setting a generator
- # * adding Rails config.* keys to the environment
- # * setting up a subscriber to the Rails +ActiveSupport::Notifications+
- # * adding rake tasks into rails
+ # * configuring a Rails framework for the application, like setting a generator
+ # * adding config.* keys to the environment
+ # * setting up a subscriber with ActiveSupport::Notifications
+ # * adding rake tasks
#
# == Creating your Railtie
#
- # Implementing Railtie in your Rails extension is done by creating a class
- # Railtie that has your extension name and making sure that this gets loaded
- # during boot time of the Rails stack.
+ # To extend Rails using Railtie, create a Railtie class which inherits
+ # from Rails::Railtie within your extension's namespace. This class must be
+ # loaded during the Rails boot process.
#
- # You can do this however you wish, but here is an example if you want to provide
- # it for a gem that can be used with or without Rails:
+ # The following example demonstrates an extension which can be used with or without Rails.
#
- # * Create a file (say, lib/my_gem/railtie.rb) which contains class Railtie inheriting from
- # Rails::Railtie and is namespaced to your gem:
- #
- # # lib/my_gem/railtie.rb
- # module MyGem
- # class Railtie < Rails::Railtie
- # end
+ # # lib/my_gem/railtie.rb
+ # module MyGem
+ # class Railtie < Rails::Railtie
# end
+ # end
#
- # * Require your own gem as well as rails in this file:
- #
- # # lib/my_gem/railtie.rb
- # require 'my_gem'
- # require 'rails'
- #
- # module MyGem
- # class Railtie < Rails::Railtie
- # end
- # end
+ # # lib/my_gem.rb
+ # require 'my_gem/railtie' if defined?(Rails)
#
# == Initializers
#
@@ -84,10 +71,10 @@ module Rails
#
# class MyRailtie < Rails::Railtie
# # Customize the ORM
- # config.generators.orm :my_railtie_orm
+ # config.app_generators.orm :my_railtie_orm
#
# # Add a to_prepare block which is executed once in production
- # # and before which request in development
+ # # and before each request in development
# config.to_prepare do
# MyRailtie.setup!
# end
@@ -98,7 +85,7 @@ module Rails
# If your railtie has rake tasks, you can tell Rails to load them through the method
# rake tasks:
#
- # class MyRailtie < Railtie
+ # class MyRailtie < Rails::Railtie
# rake_tasks do
# load "path/to/my_railtie.tasks"
# end
@@ -108,7 +95,7 @@ module Rails
# your generators at a different location, you can specify in your Railtie a block which
# will load them during normal generators lookup:
#
- # class MyRailtie < Railtie
+ # class MyRailtie < Rails::Railtie
# generators do
# require "path/to/my_railtie_generator"
# end
@@ -121,7 +108,7 @@ module Rails
# described here can be used in all three.
#
# Be sure to look at the documentation of those specific classes for more information.
- #
+ #
class Railtie
autoload :Configurable, "rails/railtie/configurable"
autoload :Configuration, "rails/railtie/configuration"
@@ -131,25 +118,19 @@ module Rails
ABSTRACT_RAILTIES = %w(Rails::Railtie Rails::Plugin Rails::Engine Rails::Application)
class << self
+ private :new
+
def subclasses
@subclasses ||= []
end
def inherited(base)
unless base.abstract_railtie?
- base.send(:include, self::Configurable)
+ base.send(:include, Railtie::Configurable)
subclasses << base
end
end
- def railtie_name(*)
- ActiveSupport::Deprecation.warn "railtie_name is deprecated and has no effect", caller
- end
-
- def log_subscriber(*)
- ActiveSupport::Deprecation.warn "log_subscriber is deprecated and has no effect", caller
- end
-
def rake_tasks(&blk)
@rake_tasks ||= []
@rake_tasks << blk if blk
@@ -171,6 +152,22 @@ module Rails
def abstract_railtie?
ABSTRACT_RAILTIES.include?(name)
end
+
+ def railtie_name(name = nil)
+ @railtie_name = name.to_s if name
+ @railtie_name ||= generate_railtie_name(self.name)
+ end
+
+ protected
+ def generate_railtie_name(class_or_module)
+ ActiveSupport::Inflector.underscore(class_or_module).gsub("/", "_")
+ end
+ end
+
+ delegate :railtie_name, :to => "self.class"
+
+ def config
+ @config ||= Railtie::Configuration.new
end
def eager_load!
@@ -182,6 +179,13 @@ module Rails
def load_tasks
self.class.rake_tasks.each(&:call)
+
+ # load also tasks from all superclasses
+ klass = self.class.superclass
+ while klass.respond_to?(:rake_tasks)
+ klass.rake_tasks.each { |t| self.instance_exec(&t) }
+ klass = klass.superclass
+ end
end
def load_generators