xass 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +11 -0
- data/CONTRIBUTING +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +201 -0
- data/Rakefile +349 -0
- data/VERSION +1 -0
- data/VERSION_NAME +1 -0
- data/bin/push +13 -0
- data/bin/sass +13 -0
- data/bin/sass-convert +12 -0
- data/bin/scss +13 -0
- data/extra/update_watch.rb +13 -0
- data/init.rb +18 -0
- data/lib/sass/cache_stores/base.rb +88 -0
- data/lib/sass/cache_stores/chain.rb +33 -0
- data/lib/sass/cache_stores/filesystem.rb +64 -0
- data/lib/sass/cache_stores/memory.rb +47 -0
- data/lib/sass/cache_stores/null.rb +25 -0
- data/lib/sass/cache_stores.rb +15 -0
- data/lib/sass/callbacks.rb +66 -0
- data/lib/sass/css.rb +409 -0
- data/lib/sass/engine.rb +930 -0
- data/lib/sass/environment.rb +101 -0
- data/lib/sass/error.rb +201 -0
- data/lib/sass/exec.rb +707 -0
- data/lib/sass/importers/base.rb +139 -0
- data/lib/sass/importers/filesystem.rb +186 -0
- data/lib/sass/importers.rb +22 -0
- data/lib/sass/logger/base.rb +32 -0
- data/lib/sass/logger/log_level.rb +49 -0
- data/lib/sass/logger.rb +15 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin/compiler.rb +406 -0
- data/lib/sass/plugin/configuration.rb +123 -0
- data/lib/sass/plugin/generic.rb +15 -0
- data/lib/sass/plugin/merb.rb +48 -0
- data/lib/sass/plugin/rack.rb +60 -0
- data/lib/sass/plugin/rails.rb +47 -0
- data/lib/sass/plugin/staleness_checker.rb +199 -0
- data/lib/sass/plugin.rb +133 -0
- data/lib/sass/railtie.rb +10 -0
- data/lib/sass/repl.rb +57 -0
- data/lib/sass/root.rb +7 -0
- data/lib/sass/script/arg_list.rb +52 -0
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +29 -0
- data/lib/sass/script/css_parser.rb +31 -0
- data/lib/sass/script/funcall.rb +245 -0
- data/lib/sass/script/functions.rb +1543 -0
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +345 -0
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/node.rb +99 -0
- data/lib/sass/script/null.rb +37 -0
- data/lib/sass/script/number.rb +453 -0
- data/lib/sass/script/operation.rb +110 -0
- data/lib/sass/script/parser.rb +502 -0
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/string_interpolation.rb +103 -0
- data/lib/sass/script/unary_operation.rb +69 -0
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/script.rb +39 -0
- data/lib/sass/scss/css_parser.rb +36 -0
- data/lib/sass/scss/parser.rb +1180 -0
- data/lib/sass/scss/rx.rb +133 -0
- data/lib/sass/scss/script_lexer.rb +15 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/scss/static_parser.rb +54 -0
- data/lib/sass/scss.rb +16 -0
- data/lib/sass/selector/abstract_sequence.rb +94 -0
- data/lib/sass/selector/comma_sequence.rb +92 -0
- data/lib/sass/selector/sequence.rb +507 -0
- data/lib/sass/selector/simple.rb +119 -0
- data/lib/sass/selector/simple_sequence.rb +215 -0
- data/lib/sass/selector.rb +452 -0
- data/lib/sass/shared.rb +76 -0
- data/lib/sass/supports.rb +229 -0
- data/lib/sass/tree/charset_node.rb +22 -0
- data/lib/sass/tree/comment_node.rb +82 -0
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +60 -0
- data/lib/sass/tree/debug_node.rb +18 -0
- data/lib/sass/tree/directive_node.rb +42 -0
- data/lib/sass/tree/each_node.rb +24 -0
- data/lib/sass/tree/extend_node.rb +36 -0
- data/lib/sass/tree/for_node.rb +36 -0
- data/lib/sass/tree/function_node.rb +34 -0
- data/lib/sass/tree/if_node.rb +52 -0
- data/lib/sass/tree/import_node.rb +75 -0
- data/lib/sass/tree/media_node.rb +58 -0
- data/lib/sass/tree/mixin_def_node.rb +38 -0
- data/lib/sass/tree/mixin_node.rb +39 -0
- data/lib/sass/tree/node.rb +196 -0
- data/lib/sass/tree/prop_node.rb +152 -0
- data/lib/sass/tree/return_node.rb +18 -0
- data/lib/sass/tree/root_node.rb +78 -0
- data/lib/sass/tree/rule_node.rb +132 -0
- data/lib/sass/tree/supports_node.rb +51 -0
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +30 -0
- data/lib/sass/tree/visitors/base.rb +75 -0
- data/lib/sass/tree/visitors/check_nesting.rb +147 -0
- data/lib/sass/tree/visitors/convert.rb +316 -0
- data/lib/sass/tree/visitors/cssize.rb +241 -0
- data/lib/sass/tree/visitors/deep_copy.rb +102 -0
- data/lib/sass/tree/visitors/extend.rb +68 -0
- data/lib/sass/tree/visitors/perform.rb +446 -0
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +228 -0
- data/lib/sass/tree/warn_node.rb +18 -0
- data/lib/sass/tree/while_node.rb +18 -0
- data/lib/sass/util/multibyte_string_scanner.rb +155 -0
- data/lib/sass/util/subset_map.rb +109 -0
- data/lib/sass/util/test.rb +10 -0
- data/lib/sass/util.rb +948 -0
- data/lib/sass/version.rb +126 -0
- data/lib/sass.rb +95 -0
- data/rails/init.rb +1 -0
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +89 -0
- data/test/sass/callbacks_test.rb +61 -0
- data/test/sass/conversion_test.rb +1760 -0
- data/test/sass/css2sass_test.rb +458 -0
- data/test/sass/data/hsl-rgb.txt +319 -0
- data/test/sass/engine_test.rb +3244 -0
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +1482 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +1139 -0
- data/test/sass/importer_test.rb +192 -0
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/mock_importer.rb +49 -0
- data/test/sass/more_results/more1.css +9 -0
- data/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/test/sass/more_results/more_import.css +29 -0
- data/test/sass/more_templates/_more_partial.sass +2 -0
- data/test/sass/more_templates/more1.sass +23 -0
- data/test/sass/more_templates/more_import.sass +11 -0
- data/test/sass/plugin_test.rb +564 -0
- data/test/sass/results/alt.css +4 -0
- data/test/sass/results/basic.css +9 -0
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/compact.css +5 -0
- data/test/sass/results/complex.css +86 -0
- data/test/sass/results/compressed.css +1 -0
- data/test/sass/results/expanded.css +19 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/if.css +3 -0
- data/test/sass/results/import.css +31 -0
- data/test/sass/results/import_charset.css +5 -0
- data/test/sass/results/import_charset_1_8.css +5 -0
- data/test/sass/results/import_charset_ibm866.css +5 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/line_numbers.css +49 -0
- data/test/sass/results/mixins.css +95 -0
- data/test/sass/results/multiline.css +24 -0
- data/test/sass/results/nested.css +22 -0
- data/test/sass/results/options.css +1 -0
- data/test/sass/results/parent_ref.css +13 -0
- data/test/sass/results/script.css +16 -0
- data/test/sass/results/scss_import.css +31 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/test/sass/results/subdir/subdir.css +3 -0
- data/test/sass/results/units.css +11 -0
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +299 -0
- data/test/sass/script_test.rb +622 -0
- data/test/sass/scss/css_test.rb +1100 -0
- data/test/sass/scss/rx_test.rb +156 -0
- data/test/sass/scss/scss_test.rb +2106 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_partial.sass +2 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/alt.sass +16 -0
- data/test/sass/templates/basic.sass +23 -0
- data/test/sass/templates/bork1.sass +2 -0
- data/test/sass/templates/bork2.sass +2 -0
- data/test/sass/templates/bork3.sass +2 -0
- data/test/sass/templates/bork4.sass +2 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/compact.sass +17 -0
- data/test/sass/templates/complex.sass +305 -0
- data/test/sass/templates/compressed.sass +15 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/expanded.sass +17 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/if.sass +11 -0
- data/test/sass/templates/import.sass +12 -0
- data/test/sass/templates/import_charset.sass +9 -0
- data/test/sass/templates/import_charset_1_8.sass +6 -0
- data/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/importee.less +2 -0
- data/test/sass/templates/importee.sass +19 -0
- data/test/sass/templates/line_numbers.sass +13 -0
- data/test/sass/templates/mixin_bork.sass +5 -0
- data/test/sass/templates/mixins.sass +76 -0
- data/test/sass/templates/multiline.sass +20 -0
- data/test/sass/templates/nested.sass +25 -0
- data/test/sass/templates/nested_bork1.sass +2 -0
- data/test/sass/templates/nested_bork2.sass +2 -0
- data/test/sass/templates/nested_bork3.sass +2 -0
- data/test/sass/templates/nested_bork4.sass +2 -0
- data/test/sass/templates/nested_import.sass +2 -0
- data/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/test/sass/templates/options.sass +2 -0
- data/test/sass/templates/parent_ref.sass +25 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/script.sass +101 -0
- data/test/sass/templates/scss_import.scss +11 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/test/sass/templates/subdir/subdir.sass +6 -0
- data/test/sass/templates/units.sass +11 -0
- data/test/sass/templates/warn.sass +3 -0
- data/test/sass/templates/warn_imported.sass +4 -0
- data/test/sass/test_helper.rb +8 -0
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/subset_map_test.rb +91 -0
- data/test/sass/util_test.rb +382 -0
- data/test/test_helper.rb +80 -0
- metadata +354 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Sass
|
|
2
|
+
module CacheStores
|
|
3
|
+
# An abstract base class for backends for the Sass cache.
|
|
4
|
+
# Any key-value store can act as such a backend;
|
|
5
|
+
# it just needs to implement the
|
|
6
|
+
# \{#_store} and \{#_retrieve} methods.
|
|
7
|
+
#
|
|
8
|
+
# To use a cache store with Sass,
|
|
9
|
+
# use the {file:SASS_REFERENCE.md#cache_store-option `:cache_store` option}.
|
|
10
|
+
#
|
|
11
|
+
# @abstract
|
|
12
|
+
class Base
|
|
13
|
+
# Store cached contents for later retrieval
|
|
14
|
+
# Must be implemented by all CacheStore subclasses
|
|
15
|
+
#
|
|
16
|
+
# Note: cache contents contain binary data.
|
|
17
|
+
#
|
|
18
|
+
# @param key [String] The key to store the contents under
|
|
19
|
+
# @param version [String] The current sass version.
|
|
20
|
+
# Cached contents must not be retrieved across different versions of sass.
|
|
21
|
+
# @param sha [String] The sha of the sass source.
|
|
22
|
+
# Cached contents must not be retrieved if the sha has changed.
|
|
23
|
+
# @param contents [String] The contents to store.
|
|
24
|
+
def _store(key, version, sha, contents)
|
|
25
|
+
raise "#{self.class} must implement #_store."
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Retrieved cached contents.
|
|
29
|
+
# Must be implemented by all subclasses.
|
|
30
|
+
#
|
|
31
|
+
# Note: if the key exists but the sha or version have changed,
|
|
32
|
+
# then the key may be deleted by the cache store, if it wants to do so.
|
|
33
|
+
#
|
|
34
|
+
# @param key [String] The key to retrieve
|
|
35
|
+
# @param version [String] The current sass version.
|
|
36
|
+
# Cached contents must not be retrieved across different versions of sass.
|
|
37
|
+
# @param sha [String] The sha of the sass source.
|
|
38
|
+
# Cached contents must not be retrieved if the sha has changed.
|
|
39
|
+
# @return [String] The contents that were previously stored.
|
|
40
|
+
# @return [NilClass] when the cache key is not found or the version or sha have changed.
|
|
41
|
+
def _retrieve(key, version, sha)
|
|
42
|
+
raise "#{self.class} must implement #_retrieve."
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Store a {Sass::Tree::RootNode}.
|
|
46
|
+
#
|
|
47
|
+
# @param key [String] The key to store it under.
|
|
48
|
+
# @param sha [String] The checksum for the contents that are being stored.
|
|
49
|
+
# @param obj [Object] The object to cache.
|
|
50
|
+
def store(key, sha, root)
|
|
51
|
+
_store(key, Sass::VERSION, sha, Marshal.dump(root))
|
|
52
|
+
rescue TypeError, LoadError => e
|
|
53
|
+
Sass::Util.sass_warn "Warning. Error encountered while saving cache #{path_to(key)}: #{e}"
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Retrieve a {Sass::Tree::RootNode}.
|
|
58
|
+
#
|
|
59
|
+
# @param key [String] The key the root element was stored under.
|
|
60
|
+
# @param sha [String] The checksum of the root element's content.
|
|
61
|
+
# @return [Object] The cached object.
|
|
62
|
+
def retrieve(key, sha)
|
|
63
|
+
contents = _retrieve(key, Sass::VERSION, sha)
|
|
64
|
+
Marshal.load(contents) if contents
|
|
65
|
+
rescue EOFError, TypeError, ArgumentError, LoadError => e
|
|
66
|
+
Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
|
|
67
|
+
nil
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Return the key for the sass file.
|
|
71
|
+
#
|
|
72
|
+
# The `(sass_dirname, sass_basename)` pair
|
|
73
|
+
# should uniquely identify the Sass document,
|
|
74
|
+
# but otherwise there are no restrictions on their content.
|
|
75
|
+
#
|
|
76
|
+
# @param sass_dirname [String]
|
|
77
|
+
# The fully-expanded location of the Sass file.
|
|
78
|
+
# This corresponds to the directory name on a filesystem.
|
|
79
|
+
# @param sass_basename [String] The name of the Sass file that is being referenced.
|
|
80
|
+
# This corresponds to the basename on a filesystem.
|
|
81
|
+
def key(sass_dirname, sass_basename)
|
|
82
|
+
dir = Digest::SHA1.hexdigest(sass_dirname)
|
|
83
|
+
filename = "#{sass_basename}c"
|
|
84
|
+
"#{dir}/#{filename}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Sass
|
|
2
|
+
module CacheStores
|
|
3
|
+
# A meta-cache that chains multiple caches together.
|
|
4
|
+
# Specifically:
|
|
5
|
+
#
|
|
6
|
+
# * All `#store`s are passed to all caches.
|
|
7
|
+
# * `#retrieve`s are passed to each cache until one has a hit.
|
|
8
|
+
# * When one cache has a hit, the value is `#store`d in all earlier caches.
|
|
9
|
+
class Chain < Base
|
|
10
|
+
# Create a new cache chaining the given caches.
|
|
11
|
+
#
|
|
12
|
+
# @param caches [Array<Sass::CacheStores::Base>] The caches to chain.
|
|
13
|
+
def initialize(*caches)
|
|
14
|
+
@caches = caches
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @see Base#store
|
|
18
|
+
def store(key, sha, obj)
|
|
19
|
+
@caches.each {|c| c.store(key, sha, obj)}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @see Base#retrieve
|
|
23
|
+
def retrieve(key, sha)
|
|
24
|
+
@caches.each_with_index do |c, i|
|
|
25
|
+
next unless obj = c.retrieve(key, sha)
|
|
26
|
+
@caches[0...i].each {|prev| prev.store(key, sha, obj)}
|
|
27
|
+
return obj
|
|
28
|
+
end
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
module Sass
|
|
4
|
+
module CacheStores
|
|
5
|
+
# A backend for the Sass cache using the filesystem.
|
|
6
|
+
class Filesystem < Base
|
|
7
|
+
# The directory where the cached files will be stored.
|
|
8
|
+
#
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_accessor :cache_location
|
|
11
|
+
|
|
12
|
+
# @param cache_location [String] see \{#cache\_location}
|
|
13
|
+
def initialize(cache_location)
|
|
14
|
+
@cache_location = cache_location
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @see Base#\_retrieve
|
|
18
|
+
def _retrieve(key, version, sha)
|
|
19
|
+
return unless File.readable?(path_to(key))
|
|
20
|
+
File.open(path_to(key), "rb") do |f|
|
|
21
|
+
if f.readline("\n").strip == version && f.readline("\n").strip == sha
|
|
22
|
+
return f.read
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
begin
|
|
26
|
+
File.unlink path_to(key)
|
|
27
|
+
rescue Errno::ENOENT
|
|
28
|
+
# Already deleted. Race condition?
|
|
29
|
+
end
|
|
30
|
+
nil
|
|
31
|
+
rescue EOFError, TypeError, ArgumentError => e
|
|
32
|
+
Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @see Base#\_store
|
|
36
|
+
def _store(key, version, sha, contents)
|
|
37
|
+
# return unless File.writable?(File.dirname(@cache_location))
|
|
38
|
+
# return if File.exists?(@cache_location) && !File.writable?(@cache_location)
|
|
39
|
+
compiled_filename = path_to(key)
|
|
40
|
+
# return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
|
|
41
|
+
# return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
|
|
42
|
+
FileUtils.mkdir_p(File.dirname(compiled_filename))
|
|
43
|
+
Sass::Util.atomic_create_and_write_file(compiled_filename, 0600) do |f|
|
|
44
|
+
f.puts(version)
|
|
45
|
+
f.puts(sha)
|
|
46
|
+
f.write(contents)
|
|
47
|
+
end
|
|
48
|
+
rescue Errno::EACCES
|
|
49
|
+
#pass
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
# Returns the path to a file for the given key.
|
|
55
|
+
#
|
|
56
|
+
# @param key [String]
|
|
57
|
+
# @return [String] The path to the cache file.
|
|
58
|
+
def path_to(key)
|
|
59
|
+
key = key.gsub(/[<>:\\|?*%]/) {|c| "%%%03d" % Sass::Util.ord(c)}
|
|
60
|
+
File.join(cache_location, key)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Sass
|
|
2
|
+
module CacheStores
|
|
3
|
+
# A backend for the Sass cache using in-process memory.
|
|
4
|
+
class Memory < Base
|
|
5
|
+
# Since the {Memory} store is stored in the Sass tree's options hash,
|
|
6
|
+
# when the options get serialized as part of serializing the tree,
|
|
7
|
+
# you get crazy exponential growth in the size of the cached objects
|
|
8
|
+
# unless you don't dump the cache.
|
|
9
|
+
#
|
|
10
|
+
# @private
|
|
11
|
+
def _dump(depth)
|
|
12
|
+
""
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# If we deserialize this class, just make a new empty one.
|
|
16
|
+
#
|
|
17
|
+
# @private
|
|
18
|
+
def self._load(repr)
|
|
19
|
+
Memory.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Create a new, empty cache store.
|
|
23
|
+
def initialize
|
|
24
|
+
@contents = {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @see Base#retrieve
|
|
28
|
+
def retrieve(key, sha)
|
|
29
|
+
if @contents.has_key?(key)
|
|
30
|
+
return unless @contents[key][:sha] == sha
|
|
31
|
+
obj = @contents[key][:obj]
|
|
32
|
+
obj.respond_to?(:deep_copy) ? obj.deep_copy : obj.dup
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @see Base#store
|
|
37
|
+
def store(key, sha, obj)
|
|
38
|
+
@contents[key] = {:sha => sha, :obj => obj}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Destructively clear the cache.
|
|
42
|
+
def reset!
|
|
43
|
+
@contents = {}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Sass
|
|
2
|
+
module CacheStores
|
|
3
|
+
# Doesn't store anything, but records what things it should have stored.
|
|
4
|
+
# This doesn't currently have any use except for testing and debugging.
|
|
5
|
+
#
|
|
6
|
+
# @private
|
|
7
|
+
class Null < Base
|
|
8
|
+
def initialize
|
|
9
|
+
@keys = {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def _retrieve(key, version, sha)
|
|
13
|
+
nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def _store(key, version, sha, contents)
|
|
17
|
+
@keys[key] = true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def was_set?(key)
|
|
21
|
+
@keys[key]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'stringio'
|
|
2
|
+
|
|
3
|
+
module Sass
|
|
4
|
+
# Sass cache stores are in charge of storing cached information,
|
|
5
|
+
# especially parse trees for Sass documents.
|
|
6
|
+
#
|
|
7
|
+
# User-created importers must inherit from {CacheStores::Base}.
|
|
8
|
+
module CacheStores
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require 'sass/cache_stores/base'
|
|
13
|
+
require 'sass/cache_stores/filesystem'
|
|
14
|
+
require 'sass/cache_stores/memory'
|
|
15
|
+
require 'sass/cache_stores/chain'
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Sass
|
|
2
|
+
# A lightweight infrastructure for defining and running callbacks.
|
|
3
|
+
# Callbacks are defined using \{#define\_callback\} at the class level,
|
|
4
|
+
# and called using `run_#{name}` at the instance level.
|
|
5
|
+
#
|
|
6
|
+
# Clients can add callbacks by calling the generated `on_#{name}` method,
|
|
7
|
+
# and passing in a block that's run when the callback is activated.
|
|
8
|
+
#
|
|
9
|
+
# @example Define a callback
|
|
10
|
+
# class Munger
|
|
11
|
+
# extend Sass::Callbacks
|
|
12
|
+
# define_callback :string_munged
|
|
13
|
+
#
|
|
14
|
+
# def munge(str)
|
|
15
|
+
# res = str.gsub(/[a-z]/, '\1\1')
|
|
16
|
+
# run_string_munged str, res
|
|
17
|
+
# res
|
|
18
|
+
# end
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# @example Use a callback
|
|
22
|
+
# m = Munger.new
|
|
23
|
+
# m.on_string_munged {|str, res| puts "#{str} was munged into #{res}!"}
|
|
24
|
+
# m.munge "bar" #=> bar was munged into bbaarr!
|
|
25
|
+
module Callbacks
|
|
26
|
+
# Automatically includes {InstanceMethods}
|
|
27
|
+
# when something extends this module.
|
|
28
|
+
#
|
|
29
|
+
# @param base [Module]
|
|
30
|
+
def self.extended(base)
|
|
31
|
+
base.send(:include, InstanceMethods)
|
|
32
|
+
end
|
|
33
|
+
protected
|
|
34
|
+
|
|
35
|
+
module InstanceMethods
|
|
36
|
+
# Removes all callbacks registered against this object.
|
|
37
|
+
def clear_callbacks!
|
|
38
|
+
@_sass_callbacks = {}
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Define a callback with the given name.
|
|
43
|
+
# This will define an `on_#{name}` method
|
|
44
|
+
# that registers a block,
|
|
45
|
+
# and a `run_#{name}` method that runs that block
|
|
46
|
+
# (optionall with some arguments).
|
|
47
|
+
#
|
|
48
|
+
# @param name [Symbol] The name of the callback
|
|
49
|
+
# @return [void]
|
|
50
|
+
def define_callback(name)
|
|
51
|
+
class_eval <<RUBY, __FILE__, __LINE__ + 1
|
|
52
|
+
def on_#{name}(&block)
|
|
53
|
+
@_sass_callbacks ||= {}
|
|
54
|
+
(@_sass_callbacks[#{name.inspect}] ||= []) << block
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def run_#{name}(*args)
|
|
58
|
+
return unless @_sass_callbacks
|
|
59
|
+
return unless @_sass_callbacks[#{name.inspect}]
|
|
60
|
+
@_sass_callbacks[#{name.inspect}].each {|c| c[*args]}
|
|
61
|
+
end
|
|
62
|
+
private :run_#{name}
|
|
63
|
+
RUBY
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|