Skip to content

Commit

Permalink
Adding new extension hooks
Browse files Browse the repository at this point in the history
There are three new extension hooks in place now:

* before_extensions
+
All extensions added via this method, following the same extension rules, will be
run before any other extensions loaded with `extension`.
* after_extensions
+
All extensions added via this method, following the same extension rules, will be
run after any other extensions loaded with `extension`.
* after_generation
+
All extensions added via this method, following the same extension rules, will be
run after the page generation is completed. This will only run on the
first generation, not on reloads.

Extensions will now be notified if they are being reloaded. To be
notified of this an extension must have an `on_reload(site)` method,
which will be called if there is a change. An extension is then free to
re-run an initialization logic, clean-up the site variable, or create
new state needed for a re-run of the `execute(site)` method.
  • Loading branch information
LightGuard committed Apr 7, 2015
1 parent 782bddd commit d12d8e4
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 23 deletions.
18 changes: 14 additions & 4 deletions lib/awestruct/engine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def run(profile, base_url, default_base_url, force=false, generate=true)
load_pages
$LOG.debug 'execute_pipeline' if $LOG.debug?
$LOG.info 'Excecuting pipeline...' if $LOG.info?
execute_pipeline
execute_pipeline(false)
$LOG.debug 'configure_compass' if $LOG.debug?
configure_compass
$LOG.debug 'set_urls' if $LOG.debug?
Expand Down Expand Up @@ -246,22 +246,31 @@ def load_pipeline
pipeline_file = File.join( ext_dir, 'pipeline.rb' )
if ( File.exists?( pipeline_file ) )
p = eval(File.read( pipeline_file ), nil, pipeline_file, 1)
p.before_pipeline_extensions.each do |e|
pipeline.before_pipeline_extension( e )
end
p.extensions.each do |e|
pipeline.extension( e )
end
p.after_pipeline_extensions.each do |e|
pipeline.after_pipeline_extension( e )
end
p.helpers.each do |h|
pipeline.helper( h )
end
p.transformers.each do |t|
pipeline.transformer( t )
end
p.after_generation_extensions.each do |e|
pipeline.after_generation_extension( e )
end
end
end

def execute_pipeline
def execute_pipeline(on_reload = false)
FileUtils.mkdir_p( site.config.output_dir )
FileUtils.mkdir_p( site.config.tmp_dir )
pipeline.execute( site )
pipeline.execute( site, on_reload )
end

def configure_compass
Expand Down Expand Up @@ -356,6 +365,7 @@ def generate_output
generate_page( page, generated_path, false )
end
end
site.engine.pipeline.execute_after_generation(site)
end

def generate_page(page, generated_path, produce_output=true)
Expand Down Expand Up @@ -438,7 +448,7 @@ def run_auto_for_non_page(file, generate = true)
@pipeline = Pipeline.new
load_yamls
load_pipeline
execute_pipeline
execute_pipeline(true)

if ( generate )
site.pages.each do |p|
Expand Down
30 changes: 24 additions & 6 deletions lib/awestruct/extensions/pipeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,45 @@

module Awestruct
module Extensions
# Public. Extension declaration class, initialized by the end user to
# declare their extensions, helpers, transformers, etc.
class Pipeline

attr_reader :before_extensions
attr_reader :before_pipeline_extensions
attr_reader :extensions
attr_reader :after_extensions
attr_reader :after_pipeline_extensions
attr_reader :helpers
attr_reader :transformers
attr_reader :after_generation_extensions

def initialize(&block)
@extensions = []
@helpers = []
@transformers = []
@before_pipeline_extensions = []
@extensions = []
@helpers = []
@transformers = []
@after_pipeline_extensions = []
@after_generation_extensions = []
begin
instance_eval &block if block
instance_eval(&block) if block
rescue Exception => e
abort("Failed to initialize pipeline: #{e}")
end
end

def before_extensions(ext)
@before_pipeline_extensions << ext
end

def extension(ext)
@extensions << ext
# TC: why? transformer and extension?
ext.transform(@transformers) if ext.respond_to?('transform')
end

def after_extensions(ext)
@after_pipeline_extensions << ext
end

def helper(helper)
@helpers << helper
end
Expand All @@ -44,6 +58,10 @@ def transformer(transformer)
@transformers << transformer
end

def after_generation(ext)
@after_generation_extensions << ext
end

def execute(site)
extensions.each do |ext|
ext.execute( site )
Expand Down
50 changes: 44 additions & 6 deletions lib/awestruct/pipeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,25 @@ module Awestruct
class Pipeline

attr_reader :handler_chains
attr_reader :before_pipeline_extensions
attr_reader :extensions
attr_reader :after_pipeline_extensions
attr_reader :helpers
attr_reader :transformers
attr_reader :after_generation_extensions

def initialize()
@handler_chains = HandlerChains.new
@extensions = []
@helpers = []
@transformers = []
@before_pipeline_extensions = []
@extensions = []
@helpers = []
@transformers = []
@after_pipeline_extensions = []
@after_generation_extensions = []
end

def before_pipeline_extension(e)
@before_pipeline_extensions << e
end

def extension(e)
Expand All @@ -20,6 +33,10 @@ def extension(e)
e.transform(@transformers) if e.respond_to?('transform')
end

def after_pipeline_extension(e)
@after_pipeline_extensions << e
end

def helper(h)
@helpers << h
end
Expand All @@ -28,12 +45,27 @@ def transformer(t)
@transformers << t
end

def execute(site)
execute_extensions(site)
def after_generation_extension(e)
@after_generation_extensions << e
end

def execute_extensions(site)
def execute(site, on_reload = false)
execute_extensions(site, on_reload)
end

def execute_extensions(site, on_reload)
@before_pipeline_extensions.each do |e|
e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
e.execute(site)
end

@extensions.each do |e|
e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
e.execute(site)
end

@after_pipeline_extensions.each do |e|
e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
e.execute(site)
end
end
Expand All @@ -45,6 +77,12 @@ def apply_transformers(site, page, rendered)
rendered
end

def execute_after_generation(site)
@after_generation_extensions.each do |e|
e.execute(site)
end
end

def mixin_helpers(context)
context.extend( Awestruct::ContextHelper )
@helpers.each do |h|
Expand Down
31 changes: 24 additions & 7 deletions spec/awestruct/pipeline_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,32 @@

require 'awestruct/pipeline'

require 'awestruct/engine'
require 'awestruct/pipeline'

describe Awestruct::Pipeline do
before do
dir = Pathname.new( test_data_dir 'engine' )
before do
dir = Pathname.new( test_data_dir 'pipeline' )
opts = Awestruct::CLI::Options.new
opts.source_dir = dir

@site = Hashery::OpenCascade[ { :encoding=>false, :dir=>dir, :config=>Awestruct::Config.new( opts ) } ]
Awestruct::Engine.new(@site.config)
@site = Hashery::OpenCascade[ { :encoding=>false, :dir=>dir, :config=>Awestruct::Config.new( opts ), :pages => [] } ]
@engine = Awestruct::Engine.new(@site.config)

log = StringIO.new
$LOG = Logger.new(log)
$LOG.level = Logger::DEBUG

@engine.load_pipeline
@pipeline = @engine.pipeline
end

context "after pipeline is loaded" do
specify "should have all specified extension points" do
expect(@pipeline.before_pipeline_extensions.size).to eql 1
expect(@pipeline.extensions.size).to eql 1
expect(@pipeline.after_pipeline_extensions.size).to eql 1
expect(@pipeline.helpers.size).to eql 1
expect(@pipeline.transformers.size).to eql 1
expect(@pipeline.after_generation_extensions.size).to eql 1
end
end

it "should provide a way to find a matching handler chain for a given path" do
Expand Down
26 changes: 26 additions & 0 deletions spec/support/test-data/pipeline/_ext/extensions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module Awestruct
module Test
module Extensions
class TestBeforeExtension
def execute site
end
end

class TestAfterExtension
def execute site
end
end

class TestAfterGenerationExtension
def execute site
end
end

class LinkTransformer
def transform site, page, content
end
end
end
end
end

11 changes: 11 additions & 0 deletions spec/support/test-data/pipeline/_ext/pipeline.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
require 'support/test-data/pipeline/_ext/extensions'

Awestruct::Extensions::Pipeline.new do
before_extensions Awestruct::Test::Extensions::TestBeforeExtension.new
extension Awestruct::Extensions::Indexifier.new
after_extensions Awestruct::Test::Extensions::TestAfterExtension.new
helper Awestruct::Extensions::Relative
transformer Awestruct::Test::Extensions::LinkTransformer.new
after_generation Awestruct::Test::Extensions::TestAfterGenerationExtension.new
end

0 comments on commit d12d8e4

Please sign in to comment.