diff --git a/middleman-core/features/v4_extension_callbacks.feature b/middleman-core/features/v4_extension_callbacks.feature new file mode 100644 index 00000000..6ce04b1e --- /dev/null +++ b/middleman-core/features/v4_extension_callbacks.feature @@ -0,0 +1,8 @@ +Feature: v4 Extensions should have after_activated hooks + + Scenario: Hello Helper + Given the Server is running at "v4-extension-callbacks" + Then going to "/index.html" should not raise an exception + And I should see "Extension One: true" + And I should see "Extension Two: true" + \ No newline at end of file diff --git a/middleman-core/fixtures/v4-extension-callbacks/config.rb b/middleman-core/fixtures/v4-extension-callbacks/config.rb new file mode 100644 index 00000000..174bbec3 --- /dev/null +++ b/middleman-core/fixtures/v4-extension-callbacks/config.rb @@ -0,0 +1,26 @@ +class ExtensionOne < ::Middleman::Extension + def initialize(app, options_hash={}) + super + + after_extension_activated :extension_two do + app.set :extension_two_was_activated, true + end + end +end + +ExtensionOne.register + +class ExtensionTwo < ::Middleman::Extension + def initialize(app, options_hash={}) + super + + after_extension_activated :extension_one do + app.set :extension_one_was_activated, true + end + end +end + +ExtensionTwo.register + +activate :extension_one +activate :extension_two \ No newline at end of file diff --git a/middleman-core/fixtures/v4-extension-callbacks/source/index.html.erb b/middleman-core/fixtures/v4-extension-callbacks/source/index.html.erb new file mode 100644 index 00000000..a002e701 --- /dev/null +++ b/middleman-core/fixtures/v4-extension-callbacks/source/index.html.erb @@ -0,0 +1,2 @@ +Extension One: <%= extension_one_was_activated.inspect %> +Extension Two: <%= extension_two_was_activated.inspect %> \ No newline at end of file diff --git a/middleman-core/lib/middleman-core/core_extensions/extensions.rb b/middleman-core/lib/middleman-core/core_extensions/extensions.rb index 580dfc7d..be3639a9 100644 --- a/middleman-core/lib/middleman-core/core_extensions/extensions.rb +++ b/middleman-core/lib/middleman-core/core_extensions/extensions.rb @@ -142,6 +142,7 @@ module Middleman # Search the root of the project for required files $LOAD_PATH.unshift(root) + ::Middleman::Extension.clear_after_extension_callbacks run_hook :initialized if config[:autoload_sprockets] @@ -178,7 +179,7 @@ module Middleman run_hook :after_configuration logger.debug "Loaded extensions:" - self.extensions.each do |ext,_| + self.extensions.each do |ext, klass| if ext.is_a?(Hash) ext.each do |k,_| logger.debug "== Extension: #{k}" @@ -186,6 +187,10 @@ module Middleman else logger.debug "== Extension: #{ext}" end + + if klass.is_a?(::Middleman::Extension) + ::Middleman::Extension.activated_extension(klass) + end end end end diff --git a/middleman-core/lib/middleman-core/extensions.rb b/middleman-core/lib/middleman-core/extensions.rb index 93fed5b7..c049f6f6 100644 --- a/middleman-core/lib/middleman-core/extensions.rb +++ b/middleman-core/lib/middleman-core/extensions.rb @@ -1,4 +1,5 @@ require "active_support/core_ext/class/attribute" +require "active_support/core_ext/module/delegation" module Middleman @@ -131,11 +132,31 @@ module Middleman def activate new(::Middleman::Application) end + + def clear_after_extension_callbacks + @_extension_activation_callbacks = {} + end + + def after_extension_activated(name, &block) + @_extension_activation_callbacks ||= {} + @_extension_activation_callbacks[name] ||= [] + @_extension_activation_callbacks[name] << block if block_given? + end + + def activated_extension(instance) + name = instance.class.extension_name + return unless @_extension_activation_callbacks && @_extension_activation_callbacks[name] + @_extension_activation_callbacks[name].each do |block| + block.arity == 1 ? block.call(instance) : block.call() + end + end end attr_accessor :options attr_reader :app + delegate :after_extension_activated, :to => :"::Middleman::Extension" + def initialize(klass, options_hash={}, &block) @_helpers = [] @klass = klass diff --git a/middleman-core/spec/middleman-core/sitemap_spec.rb b/middleman-core/spec/middleman-core/sitemap_spec.rb deleted file mode 100644 index e69de29b..00000000