Improve documentation and variable naming for Middleman::Extensions

This commit is contained in:
Ben Hollis 2014-05-22 21:48:37 -07:00
parent 1a7da200d1
commit f60a49d2ce

View file

@ -3,72 +3,80 @@ require 'middleman-core/extension'
module Middleman module Middleman
# The Extensions module is used to handle global registration and loading of Middleman Extensions. # The Extensions module is used to handle global registration and loading of Middleman Extensions.
# #
# The application-facing extension API (activate, etc) is in Middleman::CoreExtensions::Extensions in # The application-facing extension API ({Middleman::CoreExtensions::Extensions#activate activate}, etc) is in {Middleman::CoreExtensions::Extensions} in
# middleman-core/core_extensions/extensions.rb. # `middleman-core/core_extensions/extensions.rb`.
module Extensions module Extensions
@registered = {}
class << self class << self
def registered # A hash of all registered extensions. Registered extensions are not necessarily active - this
@_registered ||= {} # is the set of all extensions that are known to Middleman.
end # @return [Hash{Symbol => Class<Middleman::Extension>, Proc}] A directory of known extensions indexed by the name they were registered under. The value may be a Proc, which can be lazily called to return an extension class.
attr_reader :registered
# Register a new extension. Choose a name which will be # Register a new extension. Choose a name which will be
# used to activate the extension in config.rb, like this: # used to activate the extension in `config.rb`, like this:
# #
# activate :my_extension # activate :my_extension
# #
# Provide your extension module either as the namespace # Provide your extension class either as the second parameter:
# parameter:
# #
# Middleman::Extensions.register(:my_extension, MyExtension) # Middleman::Extensions.register(:my_extension, MyExtension)
# #
# Or return it from a block: # Or better, return it from a block, which allows you to lazily require the implementation:
# #
# Middleman::Extensions.register(:my_extension) do # Middleman::Extensions.register :my_extension do
# require 'my_extension' # require 'my_extension'
# MyExtension # MyExtension
# end # end
# #
# @param [Symbol] name The name of the extension # @param [Symbol] name The name of the extension
# @param [Module] namespace The extension module # @param [Class<Middleman::Extension>] extension_class The extension class (Must inherit from {Middleman::Extension})
# @yield Instead of passing a module in namespace, you can provide # @yield Instead of passing a module in namespace, you can provide
# a block which returns your extension module. This gives # a block which returns your extension class. This gives
# you the ability to require other files only when the # you the ability to require other files only when the
# extension is activated. # extension is first activated.
def register(name, namespace=nil, &block) # @return [void]
def register(name, extension_class=nil, &block)
raise "Extension name must be a symbol" unless name.is_a?(Symbol)
# If we've already got an extension registered under this name, bail out # If we've already got an extension registered under this name, bail out
raise "There is already an extension registered with the name '#{name}'" if registered.key?(name.to_sym) raise "There is already an extension registered with the name '#{name}'" if registered.key?(name)
registered[name.to_sym] = if block_given? registered[name] = if block_given?
block block
elsif namespace && namespace.ancestors.include?(::Middleman::Extension) elsif extension_class && extension_class.ancestors.include?(::Middleman::Extension)
namespace extension_class
else else
raise 'You must provide a Middleman::Extension or a block that returns a Middleman::Extension' raise 'You must provide a Middleman::Extension or a block that returns a Middleman::Extension'
end end
end end
# Load an extension by name, evaluating block definition if necessary. # @api private
# Load an extension by name, lazily evaluating the block provided to {#register} if necessary.
# @param [Symbol] name The name of the extension
# @return [Class<Middleman::Extension>] A {Middleman::Extension} class implementing the extension
#
def load(name) def load(name)
name = name.to_sym raise "Extension name must be a symbol" unless name.is_a?(Symbol)
unless registered.key?(name) unless registered.key?(name)
raise "Unknown Extension: #{name}. Check the name and make sure you have referenced the extension's gem in your Gemfile." raise "Unknown Extension: #{name}. Check the name and make sure you have referenced the extension's gem in your Gemfile."
end end
extension = registered[name] extension_class = registered[name]
if extension.is_a?(Proc) if extension_class.is_a?(Proc)
extension = extension.call extension_class = extension_class.call
registered[name] = extension registered[name] = extension_class
end end
unless extension.ancestors.include?(::Middleman::Extension) unless extension_class.ancestors.include?(::Middleman::Extension)
raise "Tried to activate old-style extension: #{name}. They are no longer supported." raise "Tried to activate old-style extension: #{name}. They are no longer supported."
end end
# Set the extension's name to whatever it was registered as. # Set the extension's name to whatever it was registered as.
extension.ext_name = name extension_class.ext_name = name
extension extension_class
end end
end end
end end