diff options
Diffstat (limited to 'railties/lib/rails/railtie.rb')
-rw-r--r-- | railties/lib/rails/railtie.rb | 100 |
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 |