address code review feedback from #3553

- change site:reset to site:after_reset
- raise an exception when registering uncallable hook
- set default hook priority at the public API level
This commit is contained in:
Stephen Crosby 2015-05-02 15:56:19 -07:00
parent 245d9677d7
commit 736e6a78f1
4 changed files with 16 additions and 12 deletions

View File

@ -2,11 +2,11 @@ Feature: Hooks
As a plugin author As a plugin author
I want to be able to run code during various stages of the build process I want to be able to run code during various stages of the build process
Scenario: Run some code on site reset Scenario: Run some code after site reset
Given I have a _plugins directory Given I have a _plugins directory
And I have a "_plugins/ext.rb" file with content: And I have a "_plugins/ext.rb" file with content:
""" """
Jekyll::Hooks.register :site, :reset do |site| Jekyll::Hooks.register :site, :after_reset do |site|
pageklass = Class.new(Jekyll::Page) do pageklass = Class.new(Jekyll::Page) do
def initialize(site, base) def initialize(site, base)
@site = site @site = site

View File

@ -20,7 +20,7 @@ module Jekyll
# initial empty hooks # initial empty hooks
@registry = { @registry = {
:site => { :site => {
reset: [], after_reset: [],
post_read: [], post_read: [],
pre_render: [], pre_render: [],
post_write: [], post_write: [],
@ -48,23 +48,23 @@ module Jekyll
@hook_priority = {} @hook_priority = {}
NotAvailable = Class.new(RuntimeError) NotAvailable = Class.new(RuntimeError)
Uncallable = Class.new(RuntimeError)
# register hook(s) to be called later # register hook(s) to be called later, public API
def self.register(owners, event, priority: nil, &block) def self.register(owners, event, priority: DEFAULT_PRIORITY, &block)
Array(owners).each do |owner| Array(owners).each do |owner|
register_one(owner, event, priority: priority_value(priority), &block) register_one(owner, event, priority_value(priority), &block)
end end
end end
# Ensure the priority is a Fixnum # Ensure the priority is a Fixnum
def self.priority_value(priority=nil) def self.priority_value(priority)
return DEFAULT_PRIORITY unless priority
return priority if priority.is_a?(Fixnum) return priority if priority.is_a?(Fixnum)
PRIORITY_MAP[priority] || DEFAULT_PRIORITY PRIORITY_MAP[priority] || DEFAULT_PRIORITY
end end
# register a single hook to be called later # register a single hook to be called later, internal API
def self.register_one(owner, event, priority: nil, &block) def self.register_one(owner, event, priority, &block)
unless @registry[owner] unless @registry[owner]
raise NotAvailable, "Hooks are only available for the following " << raise NotAvailable, "Hooks are only available for the following " <<
"classes: #{@registry.keys.inspect}" "classes: #{@registry.keys.inspect}"
@ -75,6 +75,10 @@ module Jekyll
"following hooks #{@registry[owner].keys.inspect}" "following hooks #{@registry[owner].keys.inspect}"
end end
unless block.respond_to? :call
raise Uncallable, "Hooks must respond to :call"
end
insert_hook owner, event, priority, &block insert_hook owner, event, priority, &block
end end

View File

@ -76,7 +76,7 @@ module Jekyll
raise ArgumentError, "limit_posts must be a non-negative number" raise ArgumentError, "limit_posts must be a non-negative number"
end end
Jekyll::Hooks.trigger self, :reset Jekyll::Hooks.trigger self, :after_reset
end end
# Load necessary libraries, plugins, converters, and generators. # Load necessary libraries, plugins, converters, and generators.

View File

@ -520,7 +520,7 @@ The complete list of available hooks is below:
<p><code>:site</code></p> <p><code>:site</code></p>
</td> </td>
<td> <td>
<p><code>:reset</code></p> <p><code>:after_reset</code></p>
</td> </td>
<td> <td>
<p>Just after site reset</p> <p>Just after site reset</p>