sass 3.1.0 → 3.3.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/CONTRIBUTING +1 -1
- data/MIT-LICENSE +2 -2
- data/README.md +29 -17
- data/Rakefile +43 -9
- data/VERSION +1 -1
- data/VERSION_DATE +1 -0
- data/VERSION_NAME +1 -1
- data/bin/sass +6 -1
- data/bin/sass-convert +6 -1
- data/bin/scss +6 -1
- data/ext/mkrf_conf.rb +27 -0
- data/lib/sass/cache_stores/base.rb +7 -3
- data/lib/sass/cache_stores/chain.rb +3 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -7
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +2 -1
- data/lib/sass/css.rb +168 -53
- data/lib/sass/engine.rb +502 -174
- data/lib/sass/environment.rb +151 -111
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +176 -60
- data/lib/sass/features.rb +40 -0
- data/lib/sass/importers/base.rb +46 -7
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +113 -30
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +30 -0
- data/lib/sass/logger/log_level.rb +45 -0
- data/lib/sass/logger.rb +12 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin/compiler.rb +194 -104
- data/lib/sass/plugin/configuration.rb +18 -25
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +37 -11
- data/lib/sass/plugin.rb +10 -13
- data/lib/sass/railtie.rb +2 -1
- data/lib/sass/repl.rb +5 -6
- data/lib/sass/script/css_lexer.rb +8 -4
- data/lib/sass/script/css_parser.rb +5 -2
- data/lib/sass/script/functions.rb +1547 -618
- data/lib/sass/script/lexer.rb +122 -72
- data/lib/sass/script/parser.rb +304 -135
- data/lib/sass/script/tree/funcall.rb +306 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
- data/lib/sass/script/tree/list_literal.rb +77 -0
- data/lib/sass/script/tree/literal.rb +45 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +15 -0
- data/lib/sass/script/value/arg_list.rb +36 -0
- data/lib/sass/script/value/base.rb +238 -0
- data/lib/sass/script/value/bool.rb +40 -0
- data/lib/sass/script/{color.rb → value/color.rb} +256 -74
- data/lib/sass/script/value/deprecated_false.rb +55 -0
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +128 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +49 -0
- data/lib/sass/script/{number.rb → value/number.rb} +115 -62
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +12 -0
- data/lib/sass/script.rb +35 -9
- data/lib/sass/scss/css_parser.rb +2 -12
- data/lib/sass/scss/parser.rb +657 -230
- data/lib/sass/scss/rx.rb +17 -12
- data/lib/sass/scss/static_parser.rb +37 -6
- data/lib/sass/scss.rb +0 -1
- data/lib/sass/selector/abstract_sequence.rb +35 -3
- data/lib/sass/selector/comma_sequence.rb +29 -14
- data/lib/sass/selector/sequence.rb +371 -74
- data/lib/sass/selector/simple.rb +28 -13
- data/lib/sass/selector/simple_sequence.rb +163 -36
- data/lib/sass/selector.rb +138 -36
- data/lib/sass/shared.rb +3 -5
- data/lib/sass/source/map.rb +196 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +126 -0
- data/lib/sass/supports.rb +228 -0
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +34 -29
- 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 +3 -3
- data/lib/sass/tree/directive_node.rb +33 -3
- data/lib/sass/tree/each_node.rb +9 -9
- data/lib/sass/tree/extend_node.rb +20 -6
- data/lib/sass/tree/for_node.rb +6 -6
- data/lib/sass/tree/function_node.rb +12 -4
- data/lib/sass/tree/if_node.rb +2 -15
- data/lib/sass/tree/import_node.rb +11 -5
- data/lib/sass/tree/media_node.rb +27 -11
- data/lib/sass/tree/mixin_def_node.rb +15 -4
- data/lib/sass/tree/mixin_node.rb +27 -7
- data/lib/sass/tree/node.rb +69 -35
- data/lib/sass/tree/prop_node.rb +47 -31
- data/lib/sass/tree/return_node.rb +4 -3
- data/lib/sass/tree/root_node.rb +20 -4
- data/lib/sass/tree/rule_node.rb +37 -26
- data/lib/sass/tree/supports_node.rb +38 -0
- data/lib/sass/tree/trace_node.rb +33 -0
- data/lib/sass/tree/variable_node.rb +10 -4
- data/lib/sass/tree/visitors/base.rb +5 -8
- data/lib/sass/tree/visitors/check_nesting.rb +67 -52
- data/lib/sass/tree/visitors/convert.rb +134 -53
- data/lib/sass/tree/visitors/cssize.rb +245 -51
- 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 +331 -105
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +259 -95
- data/lib/sass/tree/warn_node.rb +3 -3
- data/lib/sass/tree/while_node.rb +3 -3
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/multibyte_string_scanner.rb +157 -0
- data/lib/sass/util/normalized_map.rb +130 -0
- data/lib/sass/util/ordered_hash.rb +192 -0
- data/lib/sass/util/subset_map.rb +11 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +565 -39
- data/lib/sass/version.rb +27 -15
- data/lib/sass.rb +39 -4
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/compiler_test.rb +223 -0
- data/test/sass/conversion_test.rb +901 -107
- data/test/sass/css2sass_test.rb +94 -0
- data/test/sass/engine_test.rb +1059 -164
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +933 -837
- 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 +995 -136
- data/test/sass/importer_test.rb +338 -18
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/more_results/more_import.css +2 -2
- data/test/sass/plugin_test.rb +114 -30
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/import.css +2 -2
- data/test/sass/results/import_charset.css +1 -0
- data/test/sass/results/import_charset_1_8.css +1 -0
- data/test/sass/results/import_charset_ibm866.css +1 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/script.css +1 -1
- data/test/sass/results/scss_import.css +2 -2
- data/test/sass/results/units.css +2 -2
- data/test/sass/script_conversion_test.rb +43 -1
- data/test/sass/script_test.rb +380 -36
- data/test/sass/scss/css_test.rb +257 -75
- data/test/sass/scss/scss_test.rb +2322 -110
- data/test/sass/source_map_test.rb +887 -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_content.sass +3 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/import_charset.sass +2 -0
- data/test/sass/templates/import_charset_1_8.sass +2 -0
- data/test/sass/templates/import_charset_ibm866.sass +2 -0
- data/test/sass/templates/import_content.sass +4 -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/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/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/normalized_map_test.rb +51 -0
- data/test/sass/util_test.rb +183 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +45 -5
- data/vendor/listen/CHANGELOG.md +228 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +30 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/{fssm → listen}/LICENSE +1 -1
- data/vendor/listen/README.md +315 -0
- data/vendor/listen/Rakefile +47 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen/adapter.rb +214 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
- data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
- data/vendor/listen/lib/listen/directory_record.rb +371 -0
- data/vendor/listen/lib/listen/listener.rb +225 -0
- data/vendor/listen/lib/listen/multi_listener.rb +143 -0
- data/vendor/listen/lib/listen/turnstile.rb +28 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/lib/listen.rb +40 -0
- data/vendor/listen/listen.gemspec +22 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
- data/vendor/listen/spec/listen/listener_spec.rb +169 -0
- data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +73 -0
- data/vendor/listen/spec/spec_helper.rb +21 -0
- data/vendor/listen/spec/support/adapter_helper.rb +629 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +156 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +344 -271
- data/lib/sass/less.rb +0 -382
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -162
- data/lib/sass/script/list.rb +0 -76
- data/lib/sass/script/literal.rb +0 -245
- data/lib/sass/script/variable.rb +0 -54
- data/lib/sass/scss/sass_parser.rb +0 -11
- data/test/sass/less_conversion_test.rb +0 -653
- data/vendor/fssm/README.markdown +0 -55
- data/vendor/fssm/Rakefile +0 -59
- data/vendor/fssm/VERSION.yml +0 -5
- data/vendor/fssm/example.rb +0 -9
- data/vendor/fssm/fssm.gemspec +0 -77
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
- data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
- data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
- data/vendor/fssm/lib/fssm/monitor.rb +0 -26
- data/vendor/fssm/lib/fssm/path.rb +0 -91
- data/vendor/fssm/lib/fssm/pathname.rb +0 -502
- data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
- data/vendor/fssm/lib/fssm/state/file.rb +0 -24
- data/vendor/fssm/lib/fssm/support.rb +0 -63
- data/vendor/fssm/lib/fssm/tree.rb +0 -176
- data/vendor/fssm/lib/fssm.rb +0 -33
- data/vendor/fssm/profile/prof-cache.rb +0 -40
- data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
- data/vendor/fssm/profile/prof-pathname.rb +0 -68
- data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
- data/vendor/fssm/profile/prof.html +0 -2379
- data/vendor/fssm/spec/path_spec.rb +0 -75
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +0 -14
data/lib/sass/version.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
# Once the split is complete, we can remove it.
|
3
|
-
require File.dirname(__FILE__) + '/../sass'
|
1
|
+
require 'date'
|
4
2
|
require 'sass/util'
|
5
3
|
|
6
4
|
module Sass
|
@@ -9,13 +7,13 @@ module Sass
|
|
9
7
|
# but its Git revision hash as well,
|
10
8
|
# if it was installed from Git.
|
11
9
|
module Version
|
12
|
-
include Sass::Util
|
13
|
-
|
14
10
|
# Returns a hash representing the version of Sass.
|
15
11
|
# The `:major`, `:minor`, and `:teeny` keys have their respective numbers as Fixnums.
|
16
12
|
# The `:name` key has the name of the version.
|
17
13
|
# The `:string` key contains a human-readable string representation of the version.
|
18
14
|
# The `:number` key is the major, minor, and teeny keys separated by periods.
|
15
|
+
# The `:date` key, which is not guaranteed to be defined, is the `DateTime`
|
16
|
+
# at which this release was cut.
|
19
17
|
# If Sass is checked out from Git, the `:rev` key will have the revision hash.
|
20
18
|
# For example:
|
21
19
|
#
|
@@ -23,6 +21,7 @@ module Sass
|
|
23
21
|
# :string => "2.1.0.9616393",
|
24
22
|
# :rev => "9616393b8924ef36639c7e82aa88a51a24d16949",
|
25
23
|
# :number => "2.1.0",
|
24
|
+
# :date => DateTime.parse("Apr 30 13:52:01 2009 -0700"),
|
26
25
|
# :major => 2, :minor => 1, :teeny => 0
|
27
26
|
# }
|
28
27
|
#
|
@@ -36,18 +35,21 @@ module Sass
|
|
36
35
|
# {
|
37
36
|
# :string => "3.0.beta.1",
|
38
37
|
# :number => "3.0.beta.1",
|
38
|
+
# :date => DateTime.parse("Mar 31 00:38:04 2010 -0700"),
|
39
39
|
# :major => 3, :minor => 0, :teeny => -1,
|
40
40
|
# :prerelease => "beta",
|
41
41
|
# :prerelease_number => 1
|
42
42
|
# }
|
43
43
|
#
|
44
44
|
# @return [{Symbol => String/Fixnum}] The version hash
|
45
|
+
# @comment
|
46
|
+
# rubocop:disable ClassVars
|
45
47
|
def version
|
46
48
|
return @@version if defined?(@@version)
|
47
49
|
|
48
|
-
numbers = File.read(scope('VERSION')).strip.split('.').
|
50
|
+
numbers = File.read(Sass::Util.scope('VERSION')).strip.split('.').
|
49
51
|
map {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
|
50
|
-
name = File.read(scope('VERSION_NAME')).strip
|
52
|
+
name = File.read(Sass::Util.scope('VERSION_NAME')).strip
|
51
53
|
@@version = {
|
52
54
|
:major => numbers[0],
|
53
55
|
:minor => numbers[1],
|
@@ -55,6 +57,10 @@ module Sass
|
|
55
57
|
:name => name
|
56
58
|
}
|
57
59
|
|
60
|
+
if (date = version_date)
|
61
|
+
@@version[:date] = date
|
62
|
+
end
|
63
|
+
|
58
64
|
if numbers[3].is_a?(String)
|
59
65
|
@@version[:teeny] = -1
|
60
66
|
@@version[:prerelease] = numbers[3]
|
@@ -64,7 +70,7 @@ module Sass
|
|
64
70
|
@@version[:number] = numbers.join('.')
|
65
71
|
@@version[:string] = @@version[:number].dup
|
66
72
|
|
67
|
-
if rev = revision_number
|
73
|
+
if (rev = revision_number)
|
68
74
|
@@version[:rev] = rev
|
69
75
|
unless rev[0] == ?(
|
70
76
|
@@version[:string] << "." << rev[0...7]
|
@@ -74,22 +80,23 @@ module Sass
|
|
74
80
|
@@version[:string] << " (#{name})"
|
75
81
|
@@version
|
76
82
|
end
|
83
|
+
# rubocop:enable ClassVars
|
77
84
|
|
78
85
|
private
|
79
86
|
|
80
87
|
def revision_number
|
81
|
-
if File.exists?(scope('REVISION'))
|
82
|
-
rev = File.read(scope('REVISION')).strip
|
88
|
+
if File.exists?(Sass::Util.scope('REVISION'))
|
89
|
+
rev = File.read(Sass::Util.scope('REVISION')).strip
|
83
90
|
return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)'
|
84
91
|
end
|
85
92
|
|
86
|
-
return unless File.exists?(scope('.git/HEAD'))
|
87
|
-
rev = File.read(scope('.git/HEAD')).strip
|
93
|
+
return unless File.exists?(Sass::Util.scope('.git/HEAD'))
|
94
|
+
rev = File.read(Sass::Util.scope('.git/HEAD')).strip
|
88
95
|
return rev unless rev =~ /^ref: (.*)$/
|
89
96
|
|
90
97
|
ref_name = $1
|
91
|
-
ref_file = scope(".git/#{ref_name}")
|
92
|
-
info_file = scope(".git/info/refs")
|
98
|
+
ref_file = Sass::Util.scope(".git/#{ref_name}")
|
99
|
+
info_file = Sass::Util.scope(".git/info/refs")
|
93
100
|
return File.read(ref_file).strip if File.exists?(ref_file)
|
94
101
|
return unless File.exists?(info_file)
|
95
102
|
File.open(info_file) do |f|
|
@@ -99,7 +106,12 @@ module Sass
|
|
99
106
|
return sha
|
100
107
|
end
|
101
108
|
end
|
102
|
-
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
|
112
|
+
def version_date
|
113
|
+
return unless File.exists?(Sass::Util.scope('VERSION_DATE'))
|
114
|
+
DateTime.parse(File.read(Sass::Util.scope('VERSION_DATE')).strip)
|
103
115
|
end
|
104
116
|
end
|
105
117
|
|
data/lib/sass.rb
CHANGED
@@ -17,6 +17,36 @@ require 'sass/version'
|
|
17
17
|
#
|
18
18
|
# Also see the {file:SASS_REFERENCE.md full Sass reference}.
|
19
19
|
module Sass
|
20
|
+
class << self
|
21
|
+
# @private
|
22
|
+
attr_accessor :tests_running
|
23
|
+
end
|
24
|
+
|
25
|
+
# The global load paths for Sass files. This is meant for plugins and
|
26
|
+
# libraries to register the paths to their Sass stylesheets to that they may
|
27
|
+
# be `@imported`. This load path is used by every instance of {Sass::Engine}.
|
28
|
+
# They are lower-precedence than any load paths passed in via the
|
29
|
+
# {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}.
|
30
|
+
#
|
31
|
+
# If the `SASS_PATH` environment variable is set,
|
32
|
+
# the initial value of `load_paths` will be initialized based on that.
|
33
|
+
# The variable should be a colon-separated list of path names
|
34
|
+
# (semicolon-separated on Windows).
|
35
|
+
#
|
36
|
+
# Note that files on the global load path are never compiled to CSS
|
37
|
+
# themselves, even if they aren't partials. They exist only to be imported.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# Sass.load_paths << File.dirname(__FILE__ + '/sass')
|
41
|
+
# @return [Array<String, Pathname, Sass::Importers::Base>]
|
42
|
+
def self.load_paths
|
43
|
+
@load_paths ||= if ENV['SASS_PATH']
|
44
|
+
ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':')
|
45
|
+
else
|
46
|
+
[]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
20
50
|
# Compile a Sass or SCSS string to CSS.
|
21
51
|
# Defaults to SCSS.
|
22
52
|
#
|
@@ -34,9 +64,6 @@ module Sass
|
|
34
64
|
|
35
65
|
# Compile a file on disk to CSS.
|
36
66
|
#
|
37
|
-
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
38
|
-
# @param options [{Symbol => Object}] An options hash;
|
39
|
-
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
40
67
|
# @raise [Sass::SyntaxError] if there's an error in the document
|
41
68
|
# @raise [Encoding::UndefinedConversionError] if the source encoding
|
42
69
|
# cannot be converted to UTF-8
|
@@ -45,11 +72,17 @@ module Sass
|
|
45
72
|
# @overload compile_file(filename, options = {})
|
46
73
|
# Return the compiled CSS rather than writing it to a file.
|
47
74
|
#
|
75
|
+
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
76
|
+
# @param options [{Symbol => Object}] An options hash;
|
77
|
+
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
48
78
|
# @return [String] The compiled CSS.
|
49
79
|
#
|
50
80
|
# @overload compile_file(filename, css_filename, options = {})
|
51
81
|
# Write the compiled CSS to a file.
|
52
82
|
#
|
83
|
+
# @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
|
84
|
+
# @param options [{Symbol => Object}] An options hash;
|
85
|
+
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
53
86
|
# @param css_filename [String] The location to which to write the compiled CSS.
|
54
87
|
def self.compile_file(filename, *args)
|
55
88
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -57,7 +90,7 @@ module Sass
|
|
57
90
|
result = Sass::Engine.for_file(filename, options).render
|
58
91
|
if css_filename
|
59
92
|
options[:css_filename] ||= css_filename
|
60
|
-
open(css_filename,"w") {|css_file| css_file.write(result)}
|
93
|
+
open(css_filename, "w") {|css_file| css_file.write(result)}
|
61
94
|
nil
|
62
95
|
else
|
63
96
|
result
|
@@ -65,8 +98,10 @@ module Sass
|
|
65
98
|
end
|
66
99
|
end
|
67
100
|
|
101
|
+
require 'sass/logger'
|
68
102
|
require 'sass/util'
|
69
103
|
|
70
104
|
require 'sass/engine'
|
71
105
|
require 'sass/plugin' if defined?(Merb::Plugins)
|
72
106
|
require 'sass/railtie'
|
107
|
+
require 'sass/features'
|
data/test/sass/cache_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
4
|
require 'sass/engine'
|
4
5
|
|
5
6
|
class CacheTest < Test::Unit::TestCase
|
@@ -11,6 +12,7 @@ class CacheTest < Test::Unit::TestCase
|
|
11
12
|
|
12
13
|
def teardown
|
13
14
|
FileUtils.rm_rf @@cache_dir
|
15
|
+
clean_up_sassc
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_file_cache_writes_a_file
|
@@ -64,6 +66,19 @@ class CacheTest < Test::Unit::TestCase
|
|
64
66
|
assert_equal an_object, cache.retrieve("an_object", "")
|
65
67
|
end
|
66
68
|
|
69
|
+
class Unmarshalable
|
70
|
+
def _dump(_)
|
71
|
+
raise 'Unmarshalable'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_cache_node_with_unmarshalable_option
|
76
|
+
engine = Sass::Engine.new("foo {a: b + c}",
|
77
|
+
:syntax => :scss, :object => Unmarshalable.new, :filename => 'file.scss',
|
78
|
+
:importer => Sass::Importers::Filesystem.new(absolutize('templates')))
|
79
|
+
engine.to_tree
|
80
|
+
end
|
81
|
+
|
67
82
|
private
|
68
83
|
def root_node
|
69
84
|
Sass::Engine.new(<<-SCSS, :syntax => :scss).to_tree
|
@@ -0,0 +1,223 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
4
|
+
require 'sass/plugin'
|
5
|
+
require 'sass/plugin/compiler'
|
6
|
+
|
7
|
+
class CompilerTest < Test::Unit::TestCase
|
8
|
+
class FakeListener
|
9
|
+
attr_accessor :options
|
10
|
+
attr_accessor :directories
|
11
|
+
attr_reader :start_called
|
12
|
+
attr_reader :thread
|
13
|
+
|
14
|
+
def initialize(*args, &on_filesystem_event)
|
15
|
+
self.options = args.last.is_a?(Hash) ? args.pop : {}
|
16
|
+
self.directories = args
|
17
|
+
@on_filesystem_event = on_filesystem_event
|
18
|
+
@start_called = false
|
19
|
+
reset_events!
|
20
|
+
end
|
21
|
+
|
22
|
+
def fire_events!(*args)
|
23
|
+
@on_filesystem_event.call(@modified, @added, @removed)
|
24
|
+
reset_events!
|
25
|
+
end
|
26
|
+
|
27
|
+
def changed(filename)
|
28
|
+
@modified << File.expand_path(filename)
|
29
|
+
end
|
30
|
+
|
31
|
+
def added(filename)
|
32
|
+
@added << File.expand_path(filename)
|
33
|
+
end
|
34
|
+
|
35
|
+
def removed(filename)
|
36
|
+
@removed << File.expand_path(filename)
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_start!(&run_during_start)
|
40
|
+
@run_during_start = run_during_start
|
41
|
+
end
|
42
|
+
|
43
|
+
# used for Listen < 2.0
|
44
|
+
def start!
|
45
|
+
@run_during_start.call(self) if @run_during_start
|
46
|
+
end
|
47
|
+
|
48
|
+
# used for Listen >= 2.0
|
49
|
+
def start
|
50
|
+
@thread = Thread.new {@run_during_start.call(self) if @run_during_start}
|
51
|
+
end
|
52
|
+
|
53
|
+
def stop
|
54
|
+
end
|
55
|
+
|
56
|
+
def reset_events!
|
57
|
+
@modified = []
|
58
|
+
@added = []
|
59
|
+
@removed = []
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
module MockWatcher
|
64
|
+
attr_accessor :run_during_start
|
65
|
+
attr_accessor :update_stylesheets_times
|
66
|
+
attr_accessor :update_stylesheets_called_with
|
67
|
+
attr_accessor :deleted_css_files
|
68
|
+
|
69
|
+
def fake_listener
|
70
|
+
@fake_listener
|
71
|
+
end
|
72
|
+
|
73
|
+
def update_stylesheets(individual_files)
|
74
|
+
@update_stylesheets_times ||= 0
|
75
|
+
@update_stylesheets_times += 1
|
76
|
+
(@update_stylesheets_called_with ||= []) << individual_files
|
77
|
+
end
|
78
|
+
|
79
|
+
def try_delete_css(css_filename)
|
80
|
+
(@deleted_css_files ||= []) << css_filename
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
def create_listener(*args, &on_filesystem_event)
|
85
|
+
@fake_listener = FakeListener.new(*args, &on_filesystem_event)
|
86
|
+
@fake_listener.on_start!(&run_during_start)
|
87
|
+
@fake_listener
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_initialize
|
92
|
+
watcher
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_watch_starts_the_listener
|
96
|
+
start_called = false
|
97
|
+
c = watcher do |listener|
|
98
|
+
start_called = true
|
99
|
+
end
|
100
|
+
c.watch
|
101
|
+
assert start_called, "start! was not called"
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_sass_callbacks_fire_from_listener_events
|
105
|
+
c = watcher do |listener|
|
106
|
+
listener.changed "changed.scss"
|
107
|
+
listener.added "added.scss"
|
108
|
+
listener.removed "removed.scss"
|
109
|
+
listener.fire_events!
|
110
|
+
end
|
111
|
+
|
112
|
+
modified_fired = false
|
113
|
+
c.on_template_modified do |sass_file|
|
114
|
+
modified_fired = true
|
115
|
+
assert_equal "changed.scss", sass_file
|
116
|
+
end
|
117
|
+
|
118
|
+
added_fired = false
|
119
|
+
c.on_template_created do |sass_file|
|
120
|
+
added_fired = true
|
121
|
+
assert_equal "added.scss", sass_file
|
122
|
+
end
|
123
|
+
|
124
|
+
removed_fired = false
|
125
|
+
c.on_template_deleted do |sass_file|
|
126
|
+
removed_fired = true
|
127
|
+
assert_equal "removed.scss", sass_file
|
128
|
+
end
|
129
|
+
|
130
|
+
c.watch
|
131
|
+
|
132
|
+
assert_equal 2, c.update_stylesheets_times
|
133
|
+
assert modified_fired
|
134
|
+
assert added_fired
|
135
|
+
assert removed_fired
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_removing_a_sass_file_removes_corresponding_css_file
|
139
|
+
c = watcher do |listener|
|
140
|
+
listener.removed "remove_me.scss"
|
141
|
+
listener.fire_events!
|
142
|
+
end
|
143
|
+
|
144
|
+
c.watch
|
145
|
+
|
146
|
+
assert_equal "./remove_me.css", c.deleted_css_files.first
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_an_importer_can_watch_an_image
|
150
|
+
image_importer = Sass::Importers::Filesystem.new(".")
|
151
|
+
class << image_importer
|
152
|
+
def watched_file?(filename)
|
153
|
+
filename =~ /\.png$/
|
154
|
+
end
|
155
|
+
end
|
156
|
+
c = watcher(:load_paths => [image_importer]) do |listener|
|
157
|
+
listener.changed "image.png"
|
158
|
+
listener.fire_events!
|
159
|
+
end
|
160
|
+
|
161
|
+
modified_fired = false
|
162
|
+
c.on_template_modified do |f|
|
163
|
+
modified_fired = true
|
164
|
+
assert_equal "image.png", f
|
165
|
+
end
|
166
|
+
|
167
|
+
c.watch
|
168
|
+
|
169
|
+
assert_equal 2, c.update_stylesheets_times
|
170
|
+
assert modified_fired
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_watching_specific_files_and_one_is_deleted
|
174
|
+
directories = nil
|
175
|
+
c = watcher do |listener|
|
176
|
+
directories = listener.directories
|
177
|
+
listener.removed "/asdf/foobar/sass/foo.scss"
|
178
|
+
listener.fire_events!
|
179
|
+
end
|
180
|
+
c.watch([["/asdf/foobar/sass/foo.scss", "/asdf/foobar/css/foo.css", nil]])
|
181
|
+
assert directories.include?("/asdf/foobar/sass"), directories.inspect
|
182
|
+
assert_equal "/asdf/foobar/css/foo.css", c.deleted_css_files.first, "the corresponding css file was not deleted"
|
183
|
+
assert_equal [], c.update_stylesheets_called_with[1], "the sass file should not have been compiled"
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_watched_directories_are_dedupped
|
187
|
+
directories = nil
|
188
|
+
c = watcher(:load_paths => [".", "./foo", "."]) do |listener|
|
189
|
+
directories = listener.directories
|
190
|
+
end
|
191
|
+
c.watch
|
192
|
+
assert_equal [File.expand_path(".")], directories
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_a_changed_css_in_a_watched_directory_does_not_force_a_compile
|
196
|
+
c = watcher do |listener|
|
197
|
+
listener.changed "foo.css"
|
198
|
+
listener.fire_events!
|
199
|
+
end
|
200
|
+
|
201
|
+
c.on_template_modified do |f|
|
202
|
+
assert false, "Should not have been called"
|
203
|
+
end
|
204
|
+
|
205
|
+
c.watch
|
206
|
+
|
207
|
+
assert_equal 1, c.update_stylesheets_times
|
208
|
+
end
|
209
|
+
|
210
|
+
private
|
211
|
+
|
212
|
+
def default_options
|
213
|
+
{:template_location => [[".","."]]}
|
214
|
+
end
|
215
|
+
|
216
|
+
def watcher(options = {}, &run_during_start)
|
217
|
+
options = default_options.merge(options)
|
218
|
+
watcher = Sass::Plugin::Compiler.new(options)
|
219
|
+
watcher.extend(MockWatcher)
|
220
|
+
watcher.run_during_start = run_during_start
|
221
|
+
watcher
|
222
|
+
end
|
223
|
+
end
|