Class: Sass::Plugin::Compiler

### Home Classes Methods

### In Files

- lib/sass/plugin/compiler.rb

### Parent

Object

### Methods

- ::new
- #engine_options
- #on_updating_stylesheet
- #on_updating_stylesheet_with_deprecation_warning
- #on_updating_stylesheet_without_deprecation_warning
- #stylesheet_needs_update?
- #update_stylesheets
- #watch

### Included Modules

- Sass::Util
- Sass::Plugin::Configuration

### Class/Module Index

Quicksearch

- Sass
- Sass::CSS
- Sass::CacheStores
- Sass::CacheStores::Base
- Sass::CacheStores::Chain
- Sass::CacheStores::Filesystem
- Sass::CacheStores::Memory
- Sass::CacheStores::Null
- Sass::Callbacks
- Sass::Callbacks::InstanceMethods
- Sass::Engine
- Sass::Engine::Line
- Sass::Environment
- Sass::Exec
- Sass::Exec::Generic
- Sass::Exec::Sass
- Sass::Exec::SassConvert
- Sass::Exec::Scss
- Sass::Importers
- Sass::Importers::Base
- Sass::Importers::Filesystem
- Sass::Logger
- Sass::Logger::Base
- Sass::Logger::LogLevel
- Sass::Logger::LogLevel::ClassMethods
- Sass::Media
- Sass::Media::Query
- Sass::Media::QueryList
- Sass::Plugin
- Sass::Plugin::Compiler
- Sass::Plugin::Configuration
- Sass::Plugin::MerbBootLoader
- Sass::Plugin::Rack
- Sass::Plugin::StalenessChecker
- Sass::Repl
- Sass::SCSS
- Sass::SCSS::CssParser
- Sass::SCSS::Parser
- Sass::SCSS::RX
- Sass::SCSS::ScriptLexer
- Sass::SCSS::ScriptParser
- Sass::SCSS::StaticParser
- Sass::Script
- Sass::Script::ArgList
- Sass::Script::Bool
- Sass::Script::Color
- Sass::Script::CssLexer
- Sass::Script::CssParser
- Sass::Script::Funcall
- Sass::Script::Functions
- Sass::Script::Functions::EvaluationContext
- Sass::Script::Interpolation
- Sass::Script::Lexer
- Sass::Script::List
- Sass::Script::Literal
- Sass::Script::Node
- Sass::Script::Null
- Sass::Script::Number
- Sass::Script::Operation
- Sass::Script::Parser
- Sass::Script::String
- Sass::Script::StringInterpolation
- Sass::Script::UnaryOperation
- Sass::Script::Variable
- Sass::Selector
- Sass::Selector::AbstractSequence
- Sass::Selector::Attribute
- Sass::Selector::Class
- Sass::Selector::CommaSequence
- Sass::Selector::Element
- Sass::Selector::Id
- Sass::Selector::Interpolation
- Sass::Selector::Parent
- Sass::Selector::Placeholder
- Sass::Selector::Pseudo
- Sass::Selector::SelectorPseudoClass
- Sass::Selector::Sequence
- Sass::Selector::Simple
- Sass::Selector::SimpleSequence
- Sass::Selector::Universal
- Sass::Shared
- Sass::Supports
- Sass::Supports::Condition
- Sass::Supports::Declaration
- Sass::Supports::Interpolation
- Sass::Supports::Negation
- Sass::Supports::Operator
- Sass::SyntaxError
- Sass::Tree
- Sass::Tree::CharsetNode
- Sass::Tree::CommentNode
- Sass::Tree::ContentNode
- Sass::Tree::CssImportNode
- Sass::Tree::DebugNode
- Sass::Tree::DirectiveNode
- Sass::Tree::EachNode
- Sass::Tree::ExtendNode
- Sass::Tree::ForNode
- Sass::Tree::FunctionNode
- Sass::Tree::IfNode
- Sass::Tree::ImportNode
- Sass::Tree::MediaNode
- Sass::Tree::MixinDefNode
- Sass::Tree::MixinNode
- Sass::Tree::Node
- Sass::Tree::PropNode
- Sass::Tree::ReturnNode
- Sass::Tree::RootNode
- Sass::Tree::RuleNode
- Sass::Tree::SupportsNode
- Sass::Tree::TraceNode
- Sass::Tree::VariableNode
- Sass::Tree::Visitors
- Sass::Tree::Visitors::Base
- Sass::Tree::Visitors::CheckNesting
- Sass::Tree::Visitors::Convert
- Sass::Tree::Visitors::Cssize
- Sass::Tree::Visitors::DeepCopy
- Sass::Tree::Visitors::Extend
- Sass::Tree::Visitors::Perform
- Sass::Tree::Visitors::SetOptions
- Sass::Tree::Visitors::ToCss
- Sass::Tree::WarnNode
- Sass::Tree::WhileNode
- Sass::UnitConversionError
- Sass::Util
- Sass::Util::MultibyteStringScanner
- Sass::Util::StaticConditionalContext
- Sass::Util::SubsetMap
- Sass::Util::Test
- Sass::Version
- ActionController
- ActionController::Base
- Object

No matching classes.

# Sass::Plugin::Compiler

The Compiler class handles compilation of multiple files and/or directories, including checking which CSS files are out-of-date and need to be updated and calling Sass to perform the compilation on those files.

{Sass::Plugin} uses this class to update stylesheets for a single application. Unlike {Sass::Plugin}, though, the Compiler class has no global state, and so multiple instances may be created and used independently.

If you need to compile a Sass string into CSS, please see the {Sass::Engine} class.

Unlike {Sass::Plugin}, this class doesn't keep track of whether or how many times a stylesheet should be updated. Therefore, the following `Sass::Plugin` options are ignored by the Compiler:

- `:never_update`

- `:always_check`

### Public Class Methods

new(options = {}) click to toggle source

Creates a new compiler.

@param options [{Symbol => Object}]

    See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.

    # File lib/sass/plugin/compiler.rb, line 37
    def initialize(options = {})
      self.options.merge!(options)
    end

### Public Instance Methods

engine_options(additional_options = {}) click to toggle source

Non-destructively modifies {#options} so that default values are properly set, and returns the result.

@param additional_options [{Symbol => Object}] An options hash with which to merge {#options} @return [{Symbol => Object}] The modified options hash

    # File lib/sass/plugin/compiler.rb, line 302
    def engine_options(additional_options = {})
      opts = options.merge(additional_options)
      opts[:load_paths] = load_paths(opts)
      opts
    end

on_updating_stylesheet(&block) click to toggle source
Also aliased as: on_updating_stylesheet_without_deprecation_warning
Alias for: on_updating_stylesheet_with_deprecation_warning
on_updating_stylesheet_with_deprecation_warning(&block) click to toggle source

    # File lib/sass/plugin/compiler.rb, line 86
    def on_updating_stylesheet_with_deprecation_warning(&block)
      Sass::Util.sass_warn("Sass::Compiler#on_updating_stylesheet callback is deprecated and will be removed in a future release. Use Sass::Compiler#on_updated_stylesheet instead, which is run after stylesheet compilation.")
      on_updating_stylesheet_without_deprecation_warning(&block)
    end

Also aliased as: on_updating_stylesheet
on_updating_stylesheet_without_deprecation_warning(&block) click to toggle source
Alias for: on_updating_stylesheet
stylesheet_needs_update?(css_file, template_file) click to toggle source

Compass expects this to exist

    # File lib/sass/plugin/compiler.rb, line 309
    def stylesheet_needs_update?(css_file, template_file)
      StalenessChecker.stylesheet_needs_update?(css_file, template_file)
    end

update_stylesheets(individual_files = []) click to toggle source

Updates out-of-date stylesheets.

Checks each Sass/SCSS file in {file:SASS_REFERENCE.md#template_location-option `:template_location`} to see if it's been modified more recently than the corresponding CSS file in {file:SASS_REFERENCE.md#css_location-option `:css_location`}. If it has, it updates the CSS file.

@param individual_files [Array<(String, String)>]

    A list of files to check for updates
    **in addition to those specified by the
    {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
    The first string in each pair is the location of the Sass/SCSS file,
    the second is the location of the CSS file that it should be compiled to.

    # File lib/sass/plugin/compiler.rb, line 185
    def update_stylesheets(individual_files = [])
      individual_files = individual_files.dup
      Sass::Plugin.checked_for_updates = true
      staleness_checker = StalenessChecker.new(engine_options)

      template_location_array.each do |template_location, css_location|
        Sass::Util.glob(File.join(template_location, "**", "[^_]*.s[ca]ss")).sort.each do |file|
          # Get the relative path to the file
          name = file.sub(template_location.to_s.sub(/\/*$/, '/'), "")
          css = css_filename(name, css_location)
          individual_files << [file, css]
        end
      end

      run_updating_stylesheets individual_files

      individual_files.each do |file, css|
        if options[:always_update] || staleness_checker.stylesheet_needs_update?(css, file)
          update_stylesheet(file, css)
        else
          run_not_updating_stylesheet(file, css)
        end
      end
    end

watch(individual_files = []) click to toggle source

Watches the template directory (or directories) and updates the CSS files whenever the related Sass/SCSS files change. `watch` never returns.

Whenever a change is detected to a Sass/SCSS file in {file:SASS_REFERENCE.md#template_location-option `:template_location`}, the corresponding CSS file in {file:SASS_REFERENCE.md#css_location-option `:css_location`} will be recompiled. The CSS files of any Sass/SCSS files that import the changed file will also be recompiled.

Before the watching starts in earnest, `watch` calls {#update_stylesheets}.

Note that `watch` uses the [Listen](github.com/guard/listen) library to monitor the filesystem for changes. Listen isn't loaded until `watch` is run. The version of Listen distributed with Sass is loaded by default, but if another version has already been loaded that will be used instead.

@param individual_files [Array<(String, String)>]

    A list of files to watch for updates
    **in addition to those specified by the
    {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
    The first string in each pair is the location of the Sass/SCSS file,
    the second is the location of the CSS file that it should be compiled to.

    # File lib/sass/plugin/compiler.rb, line 234
    def watch(individual_files = [])
      update_stylesheets(individual_files)

      load_listen!

      template_paths = template_locations # cache the locations
      individual_files_hash = individual_files.inject({}) do |h, files|
        parent = File.dirname(files.first)
        (h[parent] ||= []) << files unless template_paths.include?(parent)
        h
      end
      directories = template_paths + individual_files_hash.keys +
        [{:relative_paths => true}]

      # TODO: Keep better track of what depends on what
      # so we don't have to run a global update every time anything changes.
      listener = Listen::MultiListener.new(*directories) do |modified, added, removed|
        modified.each do |f|
          parent = File.dirname(f)
          if files = individual_files_hash[parent]
            next unless files.first == f
          else
            next unless f =~ /\.s[ac]ss$/
          end
          run_template_modified(f)
        end

        added.each do |f|
          parent = File.dirname(f)
          if files = individual_files_hash[parent]
            next unless files.first == f
          else
            next unless f =~ /\.s[ac]ss$/
          end
          run_template_created(f)
        end

        removed.each do |f|
          parent = File.dirname(f)
          if files = individual_files_hash[parent]
            next unless files.first == f
            try_delete_css files[1]
          else
            next unless f =~ /\.s[ac]ss$/
            try_delete_css f.gsub(/\.s[ac]ss$/, '.css')
          end
          run_template_deleted(f)
        end

        update_stylesheets(individual_files)
      end

      # The native windows listener is much slower than the polling
      # option, according to https://github.com/nex3/sass/commit/a3031856b22bc834a5417dedecb038b7be9b9e3e#commitcomment-1295118
      listener.force_polling(true) if @options[:poll] || Sass::Util.windows?

      begin
        listener.start
      rescue Exception => e
        raise e unless e.is_a?(Interrupt)
      end
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.