Skip to content

Commit

Permalink
Merge pull request #462 from LightGuard/feature/add_more_hooks
Browse files Browse the repository at this point in the history
Adding new extension hooks
  • Loading branch information
LightGuard committed Apr 21, 2015
2 parents 5ed8820 + 74f23c5 commit 402581a
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 26 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ spec/.sass-cache/*/*.scssc
.rvmrc
.sass-cache
coverage
_site
18 changes: 14 additions & 4 deletions lib/awestruct/engine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,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 @@ -247,22 +247,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_all_extensions.each do |e|
pipeline.add_before_extension( e )
end
p.extensions.each do |e|
pipeline.extension( e )
end
p.after_all_extensions.each do |e|
pipeline.add_after_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.add_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 @@ -362,6 +371,7 @@ def generate_output
$LOG.error 'An error occurred during output generation, all pages may not have completed during generation'
exit Awestruct::ExceptionHelper::EXITCODES[:generation_error]
end
site.engine.pipeline.execute_after_generation(site)
end

def generate_page(page, generated_path, produce_output=true)
Expand Down Expand Up @@ -445,7 +455,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
38 changes: 30 additions & 8 deletions lib/awestruct/extensions/pipeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,47 @@

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_all_extensions
attr_reader :extensions
attr_reader :after_extensions
attr_reader :after_all_extensions
attr_reader :helpers
attr_reader :transformers
attr_reader :after_generation_extensions

def initialize(&block)
@extensions = []
@helpers = []
@transformers = []
@before_all_extensions = []
@extensions = []
@helpers = []
@transformers = []
@after_all_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_all_extensions << ext
end

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

@before_all_extensions << ext if ext.respond_to?(:before_extensions)
@after_all_extensions << ext if ext.respond_to?(:after_extensions)
@after_generation_extensions << ext if ext.respond_to?(:after_generation)
end

def after_extensions(ext)
@after_all_extensions << ext
end

def helper(helper)
Expand All @@ -44,6 +62,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
52 changes: 45 additions & 7 deletions lib/awestruct/pipeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,35 @@ module Awestruct
class Pipeline

attr_reader :handler_chains
attr_reader :before_all_extensions
attr_reader :extensions
attr_reader :after_all_extensions
attr_reader :helpers
attr_reader :transformers
attr_reader :after_generation_extensions

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

def add_before_extension(e)
@before_all_extensions << e
end

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

def add_after_extension(e)
@after_all_extensions << e
end

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

def execute(site)
execute_extensions(site)
def add_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_all_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_all_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_all_extensions.size).to eql 1
expect(@pipeline.extensions.size).to eql 1
expect(@pipeline.after_all_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 before_extensions 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

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

Awestruct::Extensions::Pipeline.new do
extension 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 402581a

Please sign in to comment.