Class: Nanoc3::Extra::AutoCompiler

### Home Classes Methods

### In Files

- lib/nanoc3/extra/auto_compiler.rb

### Parent

Object

### Methods

- ::new
- #call

### Files

- ChangeLog
- LICENSE

### Class/Module Index

Quicksearch

- Nanoc3
- Nanoc3::ArrayExtensions
- Nanoc3::CLI
- Nanoc3::CLI::Base
- Nanoc3::CLI::Commands
- Nanoc3::CLI::Commands::Autocompile
- Nanoc3::CLI::Commands::Compile
- Nanoc3::CLI::Commands::CreateItem
- Nanoc3::CLI::Commands::CreateLayout
- Nanoc3::CLI::Commands::CreateSite
- Nanoc3::CLI::Commands::Debug
- Nanoc3::CLI::Commands::Help
- Nanoc3::CLI::Commands::Info
- Nanoc3::CLI::Commands::Update
- Nanoc3::CLI::Commands::View
- Nanoc3::CLI::Logger
- Nanoc3::CodeSnippet
- Nanoc3::Compiler
- Nanoc3::CompilerDSL
- Nanoc3::Context
- Nanoc3::DataSource
- Nanoc3::DataSources
- Nanoc3::DataSources::Delicious
- Nanoc3::DataSources::Filesystem
- Nanoc3::DataSources::FilesystemUnified
- Nanoc3::DataSources::FilesystemVerbose
- Nanoc3::DataSources::LastFM
- Nanoc3::DataSources::Twitter
- Nanoc3::DependencyTracker
- Nanoc3::DirectedGraph
- Nanoc3::Errors
- Nanoc3::Errors::CannotDetermineFilter
- Nanoc3::Errors::CannotLayoutBinaryItem
- Nanoc3::Errors::CannotUseBinaryFilter
- Nanoc3::Errors::CannotUseTextualFilter
- Nanoc3::Errors::DataNotYetAvailable
- Nanoc3::Errors::Generic
- Nanoc3::Errors::NoMatchingCompilationRuleFound
- Nanoc3::Errors::NoMatchingRoutingRuleFound
- Nanoc3::Errors::NoRulesFileFound
- Nanoc3::Errors::RecursiveCompilation
- Nanoc3::Errors::UnknownDataSource
- Nanoc3::Errors::UnknownFilter
- Nanoc3::Errors::UnknownLayout
- Nanoc3::Errors::UnmetDependency
- Nanoc3::Extra
- Nanoc3::Extra::AutoCompiler
- Nanoc3::Extra::CHiCk
- Nanoc3::Extra::CHiCk::CacheController
- Nanoc3::Extra::CHiCk::Client
- Nanoc3::Extra::CHiCk::RackClient
- Nanoc3::Extra::Deployers
- Nanoc3::Extra::Deployers::Rsync
- Nanoc3::Extra::FileProxy
- Nanoc3::Extra::TimeExtensions
- Nanoc3::Extra::VCS
- Nanoc3::Extra::VCSes
- Nanoc3::Extra::VCSes::Bazaar
- Nanoc3::Extra::VCSes::Dummy
- Nanoc3::Extra::VCSes::Git
- Nanoc3::Extra::VCSes::Mercurial
- Nanoc3::Extra::VCSes::Subversion
- Nanoc3::Extra::Validators
- Nanoc3::Extra::Validators::Links
- Nanoc3::Extra::Validators::Links::EachPairEnumerator
- Nanoc3::Extra::Validators::W3C
- Nanoc3::Filter
- Nanoc3::Filters
- Nanoc3::Filters::BlueCloth
- Nanoc3::Filters::CodeRay
- Nanoc3::Filters::ColorizeSyntax
- Nanoc3::Filters::ERB
- Nanoc3::Filters::Erubis
- Nanoc3::Filters::Haml
- Nanoc3::Filters::Kramdown
- Nanoc3::Filters::Less
- Nanoc3::Filters::Markaby
- Nanoc3::Filters::Maruku
- Nanoc3::Filters::RDiscount
- Nanoc3::Filters::RDoc
- Nanoc3::Filters::Rainpress
- Nanoc3::Filters::RedCloth
- Nanoc3::Filters::RelativizePaths
- Nanoc3::Filters::RubyPants
- Nanoc3::Filters::Sass
- Nanoc3::HashExtensions
- Nanoc3::Helpers
- Nanoc3::Helpers::Blogging
- Nanoc3::Helpers::Breadcrumbs
- Nanoc3::Helpers::Capturing
- Nanoc3::Helpers::Filtering
- Nanoc3::Helpers::HTMLEscape
- Nanoc3::Helpers::LinkTo
- Nanoc3::Helpers::Rendering
- Nanoc3::Helpers::Tagging
- Nanoc3::Helpers::Text
- Nanoc3::Helpers::XMLSitemap
- Nanoc3::Item
- Nanoc3::ItemRep
- Nanoc3::Layout
- Nanoc3::NotificationCenter
- Nanoc3::PluginRegistry
- Nanoc3::PluginRegistry::PluginMethods
- Nanoc3::Rule
- Nanoc3::RuleContext
- Nanoc3::Site
- Nanoc3::StringExtensions
- Nanoc3::Tasks
- Nanoc3::Tasks::Clean
- Array
- Enumerable
- Hash
- Object
- OrderedHash
- String
- Time

No matching classes.

# Nanoc3::Extra::AutoCompiler

A web server that will automatically compile items as they are requested. It also serves static files such as stylesheets and images.

### Attributes

site[R]

@return [Nanoc3::Site] The site this autocompiler belongs to

### Public Class Methods

new(site_path) click to toggle source

Creates a new autocompiler for the given site.

@param [String] site_path The path to the site to autocompile

    # File lib/nanoc3/extra/auto_compiler.rb, line 14
    def initialize(site_path)
      require 'rack'
      require 'mime/types'

      # Set site
      @site_path = site_path

      # Create mutex to prevent parallel requests
      @mutex = Mutex.new
    end

### Public Instance Methods

call(env) click to toggle source

Calls the autocompiler. The behaviour of this method is defined by the [Rack specification](rack.rubyforge.org/doc/files/SPEC.html).

@param [Hash] env The environment, as defined by the Rack specification

@return [Array] An array containing the status, the headers, and the body, as defined by the Rack specification

    # File lib/nanoc3/extra/auto_compiler.rb, line 32
    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 rep
        site.compiler.run(rep.item) 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'] = []
      site.compiler.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

[Validate]

Generated with the Darkfish Rdoc Generator 2.