From 14130554949a1e17c24608efd7eb87308db80945 Mon Sep 17 00:00:00 2001 From: LightGuard Date: Mon, 7 Apr 2014 09:51:04 -0600 Subject: [PATCH] Partials are now reloaded --- lib/awestruct/cli/auto.rb | 3 +- lib/awestruct/dependencies.rb | 3 -- lib/awestruct/engine.rb | 56 ++++++++++++++++++----------- lib/awestruct/extensions/partial.rb | 31 +++++++++++----- lib/awestruct/page.rb | 7 ++++ lib/awestruct/site.rb | 4 ++- 6 files changed, 70 insertions(+), 34 deletions(-) diff --git a/lib/awestruct/cli/auto.rb b/lib/awestruct/cli/auto.rb index 1bc8a710..6daff04e 100644 --- a/lib/awestruct/cli/auto.rb +++ b/lib/awestruct/cli/auto.rb @@ -44,9 +44,10 @@ def run() generate_thread = Thread.new { begin + # TODO: Have to figure something out for extensions and other files without an output path + # Probably add another method in engin to to do the regen w/o mucking with site.pages and run through things again page = engine.page_by_output_path(path) if ( page ) - pages = engine.generate_page_and_dependencies( page ) if ( guard ) diff --git a/lib/awestruct/dependencies.rb b/lib/awestruct/dependencies.rb index bb941e7f..2f2dc8df 100644 --- a/lib/awestruct/dependencies.rb +++ b/lib/awestruct/dependencies.rb @@ -40,9 +40,6 @@ def self.push_page(page) def self.pop_page page = @pages.pop $LOG.debug "pop #{page.output_path} #{@pages.empty?}" if $LOG.debug? - if ( @pages.empty? && ! page.nil? ) - page.dependencies.persist! - end end diff --git a/lib/awestruct/engine.rb b/lib/awestruct/engine.rb index 653f7ca0..2eaee86a 100644 --- a/lib/awestruct/engine.rb +++ b/lib/awestruct/engine.rb @@ -318,11 +318,13 @@ def generate_page(page, generated_path, produce_output=true) # path - relative to output dir def page_by_output_path(path) - site.pages.find { |p| - p.source_path.to_s == path - } || site.layouts.find { |p| - p.source_path.to_s == path - } + if (path.include? '_layout') + site.layouts.find { |p| p.source_path.to_s == path } + elsif (path.include? '_partial') + site.partials.find { |p| p.source_path.to_s == path } + else + site.pages.find { |p| p.source_path.to_s == path } + end end def generate_page_and_dependencies(page) @@ -331,31 +333,33 @@ def generate_page_and_dependencies(page) return end - if !page.output_path.nil? + if !page.output_path.nil? && !page.is_partial? && !page.__is_layout generate_page_internal(page) end pages = [ page ] - pages.each do |page| - $LOG.debug "--------------------" if $LOG.debug? - $LOG.debug "Page: #{page.output_path} #{page.relative_source_path} #{page.__is_layout ? 'Layout':''}" if $LOG.debug? - $LOG.debug "Detected change in content (#{page.dependencies.content_hash})" if page.dependencies.has_changed_content if $LOG.debug? - $LOG.debug "!! Detected change in front matter. To fully reflect the change you'll need to restart Awestruct (#{page.dependencies.key_hash})" if page.dependencies.has_changed_keys if $LOG.debug? - $LOG.debug "No changes detected" unless page.dependencies.has_changed_content or page.dependencies.has_changed_keys if $LOG.debug? - $LOG.debug "Dependencies Matrix: (non unique source path)" if $LOG.debug? - $LOG.debug "\t Outgoing dependencies:" if $LOG.debug? - $LOG.debug "\t\t Content -> #{page.dependencies.dependencies.size}" if $LOG.debug? - $LOG.debug "\t\t Key -> #{page.dependencies.key_dependencies.size}" if $LOG.debug? - $LOG.debug "\t Incoming dependencies:" if $LOG.debug? - $LOG.debug "\t\t Content <- #{page.dependencies.dependents.size}" if $LOG.debug? - $LOG.debug "\t\t Key <- #{page.dependencies.key_dependents.size}" if $LOG.debug? - $LOG.debug "--------------------" if $LOG.debug? + pages.each do |p| + if $LOG.debug? + $LOG.debug "--------------------" + $LOG.debug "Page: #{p.output_path} #{p.relative_source_path} #{p.__is_layout ? 'Layout':''}" + $LOG.debug "Detected change in content (#{p.dependencies.content_hash})" if p.dependencies.has_changed_content + $LOG.debug "!! Detected change in front matter. To fully reflect the change you'll need to restart Awestruct (#{p.dependencies.key_hash})" if p.dependencies.has_changed_keys + $LOG.debug "No changes detected" unless p.dependencies.has_changed_content or p.dependencies.has_changed_keys + $LOG.debug "Dependencies Matrix: (non unique source path)" + $LOG.debug "\t Outgoing dependencies:" + $LOG.debug "\t\t Content -> #{p.dependencies.dependencies.size}" + $LOG.debug "\t\t Key -> #{p.dependencies.key_dependencies.size}" + $LOG.debug "\t Incoming dependencies:" + $LOG.debug "\t\t Content <- #{p.dependencies.dependents.size}" + $LOG.debug "\t\t Key <- #{p.dependencies.key_dependents.size}" + $LOG.debug "--------------------" + end end regen_pages = Set.new - if page.dependencies.has_changed_content or page.__is_layout + if page.dependencies.has_changed_content || page.__is_layout || page.is_partial? regen_pages += page.dependencies.dependents end @@ -372,7 +376,17 @@ def generate_page_and_dependencies(page) $LOG.debug "Starting regeneration of content dependent pages:" if regen_pages.size > 0 && $LOG.debug? + old_site_pages = site.pages + site.pages = regen_pages + + @pipeline = Pipeline.new + load_yamls + load_pipeline + execute_pipeline + @site.pages = old_site_pages + regen_pages.each do |p| + puts "Regenerating page #{p.output_path}" generate_page_internal(p) pages << p end diff --git a/lib/awestruct/extensions/partial.rb b/lib/awestruct/extensions/partial.rb index 91a05bc1..49cb0c5c 100644 --- a/lib/awestruct/extensions/partial.rb +++ b/lib/awestruct/extensions/partial.rb @@ -11,7 +11,6 @@ def partial(path, params = {}) end page = site.engine.load_site_page( filename ) - return nil if !page params.each do |k,v| @@ -19,15 +18,31 @@ def partial(path, params = {}) end if params page.send("output_page=", self[:page]) - - begin - page.content - rescue Exception => e - ExceptionHelper.log_error "Error occurred while rendering partial #{filename} contained in #{self[:page].source_path}" - ExceptionHelper.backtrace e + page.partial = true + + from_site = site.partials.find {|p| p.source_path == page.source_path} + + # Setup dependency tracking + if from_site + from_site.dependencies.add_dependent self[:page] + self[:page].dependencies.add_dependency from_site + Awestruct::Dependencies.track_dependency(from_site) + else + page.dependencies.add_dependent self[:page] + self[:page].dependencies.add_dependency page + Awestruct::Dependencies.track_dependency(page) + site.partials << page + + begin + page.content + rescue Exception => e + ExceptionHelper.log_error "Error occurred while rendering partial #{filename} contained in #{self[:page].source_path}" + ExceptionHelper.backtrace e + end end - end + end end end end + diff --git a/lib/awestruct/page.rb b/lib/awestruct/page.rb index 72f1a8cf..a01b9948 100644 --- a/lib/awestruct/page.rb +++ b/lib/awestruct/page.rb @@ -12,6 +12,7 @@ class Page < Awestruct::AStruct attr_accessor :site attr_accessor :handler attr_reader :dependencies + attr_writer :partial def initialize(site, handler=nil) @site = site @@ -92,6 +93,8 @@ def stale? def stale_output?(output_path) return true if ! File.exist?( output_path ) return true if input_mtime > File.mtime( output_path ) + return true if stale? + # TODO: Add stale callback and execute it false end @@ -177,5 +180,9 @@ def ==(other_page) self.object_id == other_page.object_id end + def is_partial? + @partial + end + end end diff --git a/lib/awestruct/site.rb b/lib/awestruct/site.rb index 14229c5c..bae468c5 100644 --- a/lib/awestruct/site.rb +++ b/lib/awestruct/site.rb @@ -10,8 +10,9 @@ class Site < Awestruct::AStruct attr_reader :tmp_dir attr_reader :timestamp - attr_reader :pages + attr_accessor :pages attr_reader :layouts + attr_reader :partials attr_reader :config attr_reader :engine @@ -20,6 +21,7 @@ def initialize(engine, config) @engine = engine @pages = [] @layouts = Layouts.new + @partials = [] @config = config self.encoding = false @timestamp = Time.now.to_i