Class: Sass::Importers::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/sass/importers/base.rb

Overview

This class is abstract.

The abstract base class for Sass importers. All importers should inherit from this.

At the most basic level, an importer is given a string and must return a Engine containing some Sass code. This string can be interpreted however the importer wants; however, subclasses are encouraged to use the URI format for pathnames.

Importers that have some notion of "relative imports" should take a single load path in their constructor, and interpret paths as relative to that. They should also implement the #find_relative method.

Importers should be serializable via Marshal.dump. In addition to the standard _dump and _load methods, importers can define _before_dump, _after_dump, _around_dump, and _after_load methods as per Util#dump and Util#load.

Direct Known Subclasses

Filesystem

Instance Method Summary collapse

Instance Method Details

#find(uri, options) ⇒ Sass::Engine?

Find a Sass file, if it exists.

This is the primary entry point of the Importer. It corresponds directly to an @import statement in Sass. It should do three basic things:

  • Determine if the URI is in this importer's format. If not, return nil.
  • Determine if the file indicated by the URI actually exists and is readable. If not, return nil.
  • Read the file and place the contents in a Engine. Return that engine.

If this importer's format allows for file extensions, it should treat them the same way as the default Filesystem importer. If the URI explicitly has a .sass or .scss filename, the importer should look for that exact file and import it as the syntax indicated. If it doesn't exist, the importer should return nil.

If the URI doesn't have either of these extensions, the importer should look for files with the extensions. If no such files exist, it should return nil.

The Engine to be returned should be passed options, with a few modifications. :syntax should be set appropriately, :filename should be set to uri, and :importer should be set to this importer.

Parameters:

  • uri (String)

    The URI to import.

  • options ({Symbol => Object})

    Options for the Sass file containing the @import that's currently being resolved. This is safe for subclasses to modify destructively. Callers should only pass in a value they don't mind being destructively modified.

Returns:

  • (Sass::Engine, nil)

    An Engine containing the imported file, or nil if it couldn't be found or was in the wrong format.



86
87
88
# File 'lib/sass/importers/base.rb', line 86

def find(uri, options)
  Sass::Util.abstract(self)
end

#find_relative(uri, base, options) ⇒ Sass::Engine?

Find a Sass file relative to another file. Importers without a notion of "relative paths" should just return nil here.

If the importer does have a notion of "relative paths", it should ignore its load path during this method.

See #find for important information on how this method should behave.

The :filename option passed to the returned Engine should be of a format that could be passed to #find.

Parameters:

  • uri (String)

    The URI to import. This is not necessarily relative, but this method should only return true if it is.

  • base (String)

    The base filename. If uri is relative, it should be interpreted as relative to base. base is guaranteed to be in a format importable by this importer.

  • options ({Symbol => Object})

    Options for the Sass file containing the @import that's currently being resolved.

Returns:

  • (Sass::Engine, nil)

    An Engine containing the imported file, or nil if it couldn't be found or was in the wrong format.



46
47
48
# File 'lib/sass/importers/base.rb', line 46

def find_relative(uri, base, options)
  Sass::Util.abstract(self)
end

#key(uri, options) ⇒ (String, String)

Get the cache key pair for the given Sass URI. The URI need not be checked for validity.

The only strict requirement is that the returned pair of strings uniquely identify the file at the given URI. However, the first component generally corresponds roughly to the directory, and the second to the basename, of the URI.

Note that keys must be unique across importers. Thus it's probably a good idea to include the importer name at the beginning of the first component.

Parameters:

  • uri (String)

    A URI known to be valid for this importer.

  • options ({Symbol => Object})

    Options for the Sass file containing the @import currently being checked.

Returns:

  • ((String, String))

    The key pair which uniquely identifies the file at the given URI.



121
122
123
# File 'lib/sass/importers/base.rb', line 121

def key(uri, options)
  Sass::Util.abstract(self)
end

#mtime(uri, options) ⇒ Time?

Returns the time the given Sass file was last modified.

If the given file has been deleted or the time can't be accessed for some other reason, this should return nil.

Parameters:

  • uri (String)

    The URI of the file to check. Comes from a :filename option set on an engine returned by this importer.

  • options ({Symbol => Objet})

    Options for the Sass file containing the @import currently being checked.

Returns:

  • (Time, nil)


100
101
102
# File 'lib/sass/importers/base.rb', line 100

def mtime(uri, options)
  Sass::Util.abstract(self)
end

#to_sString

A string representation of the importer. Should be overridden by subclasses.

This is used to help debugging, and should usually just show the load path encapsulated by this importer.

Returns:

  • (String)


132
133
134
# File 'lib/sass/importers/base.rb', line 132

def to_s
  Sass::Util.abstract(self)
end