sass 3.2.0.alpha.7 → 3.2.0.alpha.8
Sign up to get free protection for your applications and to get access to all the features.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/lib/sass/importers/filesystem.rb +9 -4
- data/test/sass/engine_test.rb +11 -7
- 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/importer_test.rb +103 -0
- metadata +4 -2
data/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
c041cad208c85248ccfd728f9c0a5ffe9eb9d51a
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.0.alpha.
|
1
|
+
3.2.0.alpha.8
|
@@ -13,7 +13,7 @@ module Sass
|
|
13
13
|
# @param root [String] The root path.
|
14
14
|
# This importer will import files relative to this path.
|
15
15
|
def initialize(root)
|
16
|
-
@root = root
|
16
|
+
@root = File.expand_path(root)
|
17
17
|
end
|
18
18
|
|
19
19
|
# @see Base#find_relative
|
@@ -58,9 +58,8 @@ module Sass
|
|
58
58
|
# If a full uri is passed, this removes the root from it
|
59
59
|
# otherwise returns the name unchanged
|
60
60
|
def remove_root(name)
|
61
|
-
|
62
|
-
|
63
|
-
name[root.length..-1]
|
61
|
+
if name.index(@root + "/") == 0
|
62
|
+
name[(@root.length + 1)..-1]
|
64
63
|
else
|
65
64
|
name
|
66
65
|
end
|
@@ -85,6 +84,7 @@ module Sass
|
|
85
84
|
# The first element of each pair is a filename to look for;
|
86
85
|
# the second element is the syntax that file would be in (`:sass` or `:scss`).
|
87
86
|
def possible_files(name)
|
87
|
+
name = escape_glob_characters(name)
|
88
88
|
dirname, basename, extname = split(name)
|
89
89
|
sorted_exts = extensions.sort
|
90
90
|
syntax = extensions[extname]
|
@@ -93,6 +93,11 @@ module Sass
|
|
93
93
|
sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]}
|
94
94
|
end
|
95
95
|
|
96
|
+
def escape_glob_characters(name)
|
97
|
+
name.gsub(/[\*\[\]\{\}\?]/) do |char|
|
98
|
+
"\\#{char}"
|
99
|
+
end
|
100
|
+
end
|
96
101
|
|
97
102
|
REDUNDANT_DIRECTORY = %r{#{Regexp.escape(File::SEPARATOR)}\.#{Regexp.escape(File::SEPARATOR)}}
|
98
103
|
# Given a base directory and an `@import`ed name,
|
data/test/sass/engine_test.rb
CHANGED
@@ -57,12 +57,7 @@ MSG
|
|
57
57
|
"& a\n :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
|
58
58
|
"a\n :b\n c" => "Illegal nesting: Only properties may be nested beneath properties.",
|
59
59
|
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
60
|
-
"@import foo.sass" => "File to import not found or unreadable: foo.sass.",
|
61
60
|
"$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
|
62
|
-
"@import foo.sass" => <<MSG,
|
63
|
-
File to import not found or unreadable: foo.sass.
|
64
|
-
Load path: .
|
65
|
-
MSG
|
66
61
|
"@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
|
67
62
|
"foo\n @import foo.css" => "CSS import directives may only be used at the root of a document.",
|
68
63
|
"@if true\n @import foo" => "Import directives may not be used within control directives or mixins.",
|
@@ -579,12 +574,21 @@ CSS
|
|
579
574
|
assert File.exists?(sassc_file)
|
580
575
|
end
|
581
576
|
|
577
|
+
def test_nonexistent_import
|
578
|
+
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
|
579
|
+
File to import not found or unreadable: nonexistent.sass.
|
580
|
+
Load path: #{Dir.pwd}
|
581
|
+
ERR
|
582
|
+
render("@import nonexistent.sass")
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
582
586
|
def test_nonexistent_extensionless_import
|
583
587
|
assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
|
584
588
|
File to import not found or unreadable: nonexistent.
|
585
|
-
Load path: .
|
589
|
+
Load path: #{Dir.pwd}
|
586
590
|
ERR
|
587
|
-
|
591
|
+
render("@import nonexistent")
|
588
592
|
end
|
589
593
|
end
|
590
594
|
|
@@ -0,0 +1 @@
|
|
1
|
+
.pear { color: green; }
|
@@ -0,0 +1 @@
|
|
1
|
+
@import "apple";
|
data/test/sass/importer_test.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
require File.dirname(__FILE__) + '/../test_helper'
|
3
3
|
require File.dirname(__FILE__) + '/test_helper'
|
4
4
|
|
5
|
+
require 'sass/plugin'
|
6
|
+
|
5
7
|
class ImporterTest < Test::Unit::TestCase
|
6
8
|
|
7
9
|
class FruitImporter < Sass::Importers::Base
|
@@ -38,6 +40,72 @@ class ImporterTest < Test::Unit::TestCase
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
# This importer maps one import to another import
|
44
|
+
# based on the mappings passed to importer's constructor.
|
45
|
+
class IndirectImporter < Sass::Importers::Base
|
46
|
+
def initialize(mappings, mtimes)
|
47
|
+
@mappings = mappings
|
48
|
+
@mtimes = mtimes
|
49
|
+
end
|
50
|
+
def find_relative(uri, base, options)
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
def find(name, options)
|
54
|
+
if @mappings.has_key?(name)
|
55
|
+
Sass::Engine.new(
|
56
|
+
%Q[@import "#{@mappings[name]}";],
|
57
|
+
options.merge(
|
58
|
+
:filename => name,
|
59
|
+
:syntax => :scss,
|
60
|
+
:importer => self
|
61
|
+
)
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
def mtime(uri, options)
|
66
|
+
@mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
|
67
|
+
end
|
68
|
+
def key(uri, options)
|
69
|
+
[self.class.name, uri]
|
70
|
+
end
|
71
|
+
def to_s
|
72
|
+
"IndirectImporter(#{@mappings.keys.join(", ")})"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# This importer maps the import to single class
|
77
|
+
# based on the mappings passed to importer's constructor.
|
78
|
+
class ClassImporter < Sass::Importers::Base
|
79
|
+
def initialize(mappings, mtimes)
|
80
|
+
@mappings = mappings
|
81
|
+
@mtimes = mtimes
|
82
|
+
end
|
83
|
+
def find_relative(uri, base, options)
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
def find(name, options)
|
87
|
+
if @mappings.has_key?(name)
|
88
|
+
Sass::Engine.new(
|
89
|
+
%Q[.#{name}{#{@mappings[name]}}],
|
90
|
+
options.merge(
|
91
|
+
:filename => name,
|
92
|
+
:syntax => :scss,
|
93
|
+
:importer => self
|
94
|
+
)
|
95
|
+
)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
def mtime(uri, options)
|
99
|
+
@mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
|
100
|
+
end
|
101
|
+
def key(uri, options)
|
102
|
+
[self.class.name, uri]
|
103
|
+
end
|
104
|
+
def to_s
|
105
|
+
"ClassImporter(#{@mappings.keys.join(", ")})"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
41
109
|
def test_can_resolve_generated_imports
|
42
110
|
scss_file = %Q{
|
43
111
|
$pear-color: green;
|
@@ -79,4 +147,39 @@ CSS
|
|
79
147
|
ensure
|
80
148
|
FileUtils.rm_rf(absolutize("tmp"))
|
81
149
|
end
|
150
|
+
|
151
|
+
def test_staleness_check_across_importers
|
152
|
+
file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
|
153
|
+
# Make sure the first import is older
|
154
|
+
indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
|
155
|
+
# Make css file is newer so the dependencies are the only way for the css file to be out of date.
|
156
|
+
FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
|
157
|
+
# Make sure the first import is older
|
158
|
+
class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
|
159
|
+
|
160
|
+
options = {
|
161
|
+
:style => :compact,
|
162
|
+
:filename => fixture_file("test_staleness_check_across_importers.scss"),
|
163
|
+
:importer => file_system_importer,
|
164
|
+
:load_paths => [file_system_importer, indirect_importer, class_importer],
|
165
|
+
:syntax => :scss
|
166
|
+
}
|
167
|
+
|
168
|
+
assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
|
169
|
+
Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
|
170
|
+
|
171
|
+
checker = Sass::Plugin::StalenessChecker.new(options)
|
172
|
+
|
173
|
+
assert checker.stylesheet_needs_update?(
|
174
|
+
fixture_file("test_staleness_check_across_importers.css"),
|
175
|
+
fixture_file("test_staleness_check_across_importers.scss"),
|
176
|
+
file_system_importer
|
177
|
+
)
|
178
|
+
end
|
179
|
+
def fixture_dir
|
180
|
+
File.join(File.dirname(__FILE__), "fixtures")
|
181
|
+
end
|
182
|
+
def fixture_file(path)
|
183
|
+
File.join(fixture_dir, path)
|
184
|
+
end
|
82
185
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.0.alpha.
|
4
|
+
version: 3.2.0.alpha.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Weizenbaum
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-
|
14
|
+
date: 2011-06-11 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -264,6 +264,8 @@ files:
|
|
264
264
|
- test/sass/test_helper.rb
|
265
265
|
- test/sass/util/subset_map_test.rb
|
266
266
|
- test/sass/util_test.rb
|
267
|
+
- test/sass/fixtures/test_staleness_check_across_importers.css
|
268
|
+
- test/sass/fixtures/test_staleness_check_across_importers.scss
|
267
269
|
- test/test_helper.rb
|
268
270
|
- extra/update_watch.rb
|
269
271
|
- Rakefile
|