Class: Nanoc3::Extra::AutoCompiler
- Inherits:
-
Object
- Object
- Nanoc3::Extra::AutoCompiler
- Defined in:
- lib/nanoc3/extra/auto_compiler.rb
Overview
A web server that will automatically compile items as they are requested. It also serves static files such as stylesheets and images.
Instance Attribute Summary collapse
-
#site ⇒ Nanoc3::Site
readonly
The site this autocompiler belongs to.
Instance Method Summary collapse
-
#call(env) ⇒ Array
Calls the autocompiler.
-
#initialize(site_path) ⇒ AutoCompiler
constructor
Creates a new autocompiler for the given site.
Constructor Details
#initialize(site_path) ⇒ AutoCompiler
Creates a new autocompiler for the given site.
15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/nanoc3/extra/auto_compiler.rb', line 15 def initialize(site_path) require 'rack' require 'mime/types' # Set site @site_path = site_path # Create mutex to prevent parallel requests require 'thread' @mutex = Mutex.new end |
Instance Attribute Details
#site ⇒ Nanoc3::Site (readonly)
Returns The site this autocompiler belongs to.
10 11 12 |
# File 'lib/nanoc3/extra/auto_compiler.rb', line 10 def site @site end |
Instance Method Details
#call(env) ⇒ Array
Calls the autocompiler. The behaviour of this method is defined by the [Rack specification](rack.rubyforge.org/doc/files/SPEC.html).
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/nanoc3/extra/auto_compiler.rb', line 34 def call(env) @mutex.synchronize do # Start with a new site build_site # Find rep path = Rack::Utils::unescape(env['PATH_INFO']) reps = site.items.map { |i| i.reps }.flatten rep = reps.find do |r| r.path == path || r.raw_path == site.config[:output_dir] + path end # Recompile site.compile if rep # Get paths by appending index filenames if path =~ /\/$/ possible_paths = site.config[:index_filenames].map { |f| path + f } else possible_paths = [ path ] end # Find matching file modified_path = possible_paths.find { |f| File.file?(site.config[:output_dir] + f) } modified_path ||= path # Serve using Rack::File puts "*** serving file #{modified_path}" res = file_server.call(env.merge('PATH_INFO' => modified_path)) puts "*** done serving file #{modified_path}" res end rescue StandardError, ScriptError => e # Add compilation stack to env env['nanoc.stack'] = [] stack.reverse.each do |obj| if obj.is_a?(Nanoc3::ItemRep) # item rep env['nanoc.stack'] << "[item] #{obj.item.identifier} (rep #{obj.name})" else # layout env['nanoc.stack'] << "[layout] #{obj.identifier}" end end # Re-raise error raise e end |