Rack::SassC

Rack middleware for processing sass/scss files. The current version has many limitations but feel free to send pull requests if you find a bug or if you wish to improve the functionnalities.

The current behaviour implies these limitations:

The files are processed each time they are requested. Since by default it does it only when not in production, the speed penalty is kind of acceptable. But I intend to improve it and use modification time.

The files cannot be nested, they are assumed to be directly inside the SCSS directory, and the generated files are therefore created directly inside the CSS directory.

There is no special error handling yet. Any error will raise a typical error page.

Installation

Add this line to your application's Gemfile:

gem 'rack-sassc'

And then execute:

bundle install

Or install it yourself as:

gem install rack-sassc

Usage

In your config.ru:

require 'rack/sassc'

use Rack::SassC

This is the basic usage with default behaviour, which is equivalent to using these options:

require 'rack/sassc'

use Rack::SassC, {
  check: ENV['RACK_ENV'] != 'production',
  syntax: :scss,
  css_location: 'public/css',
  scss_location: 'public/scss',
  create_map_file: true,
}

Here is the explanation for each option:

check determines if the files are processed or not. Setting it to false is equivalent to not having the middleware at all. By default it is true if the rack environment is NOT production. The value of check can also be a Proc which receives the env on each request.

scss_location and css_location are just the name of the directories in which we search for template files and we generate css/map files. These paths are expanded.

syntax is :scss or :sass. It is used for the engine, but also for the extension of template files, which means they have to match.

create_map_file is self explanatory. No map file will be created if set to false.

Additionally, you can pass another option called engine_opts. It will be merged with the default options of the SassC engine. For example if you don't want a compressed output, you could do this:

use Rack::SassC, {
  engine_opts: {style: :nested}
}

The default options for the engine are the following:

{
  style: :compressed, 
  syntax: @opts[:syntax],
  load_paths: [@opts[:scss_location]],
}

Or this when no map file is to be created:

{
  style: :compressed, 
  syntax: @opts[:syntax],
  load_paths: [@opts[:scss_location]],
  source_map_file: "#{filename}.css.map",
  source_map_contents: true,
}

Changelog

0.0.0 All new

0.1.0 :public_location, :css_dirname and :scss_dirname 3 options where all replaced by 2 options: :css_location and :scss_location. Meaning the locations can be outside of the public directory (for scss/sass). They also can be absolute or will be expanded from current directory. The behaviour of default options remains unchanged: css is assumed to be in 'public/css' and scss in 'public/scss'. The update is based on a conversation about a pull request by @straight-shoota.

Alternatives

As far as I know the only alternative to this library is SasscRack by hkrutzer which arguably has a much better name than mine ;-)