haml-edge 3.1.73 → 3.1.74

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.
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- coding: utf-8 -*-
3
3
  require File.dirname(__FILE__) + '/../test_helper'
4
+ require File.dirname(__FILE__) + '/test_helper'
4
5
  require 'sass/engine'
5
6
  require 'stringio'
6
7
 
@@ -11,6 +12,7 @@ module Sass::Script::Functions::UserFunctions
11
12
  end
12
13
 
13
14
  class SassEngineTest < Test::Unit::TestCase
15
+ FAKE_FILE_NAME = __FILE__.gsub(/rb$/,"sass")
14
16
  # A map of erroneous Sass documents to the error messages they should produce.
15
17
  # The error messages may be arrays;
16
18
  # if so, the second element should be the line number that should be reported for the error.
@@ -61,9 +63,7 @@ MSG
61
63
  "$a: b\n :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
62
64
  "@import foo.sass" => <<MSG,
63
65
  File to import not found or unreadable: foo.sass.
64
- Load paths:
65
- #{File.dirname(__FILE__)}
66
- .
66
+ Load path: .
67
67
  MSG
68
68
  "@import templates/basic\n foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
69
69
  "foo\n @import templates/basic" => "Import directives may only be used at the root of a document.",
@@ -144,6 +144,33 @@ MSG
144
144
  renders_correctly "nested", { :style => :nested }
145
145
  renders_correctly "compressed", { :style => :compressed }
146
146
  end
147
+
148
+ def test_compile
149
+ assert_equal "div { hello: world; }\n", Sass.compile("$who: world\ndiv\n hello: $who", :syntax => :sass, :style => :compact)
150
+ assert_equal "div { hello: world; }\n", Sass.compile("$who: world; div { hello: $who }", :style => :compact)
151
+ end
152
+
153
+ def test_compile_file
154
+ FileUtils.mkdir_p(absolutize("tmp"))
155
+ open(absolutize("tmp/test_compile_file.sass"), "w") {|f| f.write("$who: world\ndiv\n hello: $who")}
156
+ open(absolutize("tmp/test_compile_file.scss"), "w") {|f| f.write("$who: world; div { hello: $who }")}
157
+ assert_equal "div { hello: world; }\n", Sass.compile_file(absolutize("tmp/test_compile_file.sass"), :style => :compact)
158
+ assert_equal "div { hello: world; }\n", Sass.compile_file(absolutize("tmp/test_compile_file.scss"), :style => :compact)
159
+ ensure
160
+ FileUtils.rm_rf(absolutize("tmp"))
161
+ end
162
+
163
+ def test_compile_file_to_css_file
164
+ FileUtils.mkdir_p(absolutize("tmp"))
165
+ open(absolutize("tmp/test_compile_file.sass"), "w") {|f| f.write("$who: world\ndiv\n hello: $who")}
166
+ open(absolutize("tmp/test_compile_file.scss"), "w") {|f| f.write("$who: world; div { hello: $who }")}
167
+ Sass.compile_file(absolutize("tmp/test_compile_file.sass"), absolutize("tmp/test_compile_file_sass.css"), :style => :compact)
168
+ Sass.compile_file(absolutize("tmp/test_compile_file.scss"), absolutize("tmp/test_compile_file_scss.css"), :style => :compact)
169
+ assert_equal "div { hello: world; }\n", File.read(absolutize("tmp/test_compile_file_sass.css"))
170
+ assert_equal "div { hello: world; }\n", File.read(absolutize("tmp/test_compile_file_scss.css"))
171
+ ensure
172
+ FileUtils.rm_rf(absolutize("tmp"))
173
+ end
147
174
 
148
175
  def test_flexible_tabulation
149
176
  assert_equal("p {\n a: b; }\n p q {\n c: d; }\n",
@@ -156,14 +183,14 @@ MSG
156
183
  define_method("test_exception (#{key.inspect})") do
157
184
  line = 10
158
185
  begin
159
- silence_warnings {Sass::Engine.new(key, :filename => __FILE__, :line => line).render}
186
+ silence_warnings {Sass::Engine.new(key, :filename => FAKE_FILE_NAME, :line => line).render}
160
187
  rescue Sass::SyntaxError => err
161
188
  value = [value] unless value.is_a?(Array)
162
189
 
163
190
  assert_equal(value.first.rstrip, err.message, "Line: #{key}")
164
- assert_equal(__FILE__, err.sass_filename)
191
+ assert_equal(FAKE_FILE_NAME, err.sass_filename)
165
192
  assert_equal((value[1] || key.split("\n").length) + line - 1, err.sass_line, "Line: #{key}")
166
- assert_match(/#{Regexp.escape(__FILE__)}:[0-9]+/, err.backtrace[0], "Line: #{key}")
193
+ assert_match(/#{Regexp.escape(FAKE_FILE_NAME)}:[0-9]+/, err.backtrace[0], "Line: #{key}")
167
194
  else
168
195
  assert(false, "Exception not raised for\n#{key}")
169
196
  end
@@ -196,9 +223,9 @@ rule
196
223
  :broken
197
224
  SASS
198
225
  begin
199
- Sass::Engine.new(to_render, :filename => __FILE__, :line => (__LINE__-7)).render
226
+ Sass::Engine.new(to_render, :filename => FAKE_FILE_NAME, :line => (__LINE__-7)).render
200
227
  rescue Sass::SyntaxError => err
201
- assert_equal(__FILE__, err.sass_filename)
228
+ assert_equal(FAKE_FILE_NAME, err.sass_filename)
202
229
  assert_equal((__LINE__-6), err.sass_line)
203
230
  else
204
231
  assert(false, "Exception not raised for '#{to_render}'!")
@@ -500,17 +527,17 @@ CSS
500
527
  end
501
528
 
502
529
  def test_sass_import
503
- assert !File.exists?(sassc_path("importee"))
530
+ sassc_file = sassc_path("importee")
531
+ assert !File.exists?(sassc_file)
504
532
  renders_correctly "import", { :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"] }
505
- assert File.exists?(sassc_path("importee"))
533
+ assert File.exists?(sassc_file)
506
534
  end
507
535
 
508
536
  def test_nonexistent_extensionless_import
509
- assert_warning(<<WARN) do
510
- WARNING: Neither nonexistent.sass nor .scss found. Using nonexistent.css instead.
511
- This behavior is deprecated and will be removed in a future version.
512
- If you really need nonexistent.css, import it explicitly.
513
- WARN
537
+ assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
538
+ File to import not found or unreadable: nonexistent.
539
+ Load path: .
540
+ ERR
514
541
  assert_equal("@import url(nonexistent.css);\n", render("@import nonexistent"))
515
542
  end
516
543
  end
@@ -2204,6 +2231,7 @@ SASS
2204
2231
  sass_file = load_file(name, "sass")
2205
2232
  css_file = load_file(name, "css")
2206
2233
  options[:filename] ||= filename(name, "sass")
2234
+ options[:syntax] ||= :sass
2207
2235
  options[:css_filename] ||= filename(name, "css")
2208
2236
  css_result = Sass::Engine.new(sass_file, options).render
2209
2237
  assert_equal css_file, css_result
@@ -2221,7 +2249,10 @@ SASS
2221
2249
 
2222
2250
  def sassc_path(template)
2223
2251
  sassc_path = File.join(File.dirname(__FILE__) + "/templates/#{template}.sass")
2224
- Sass::Files.send(:sassc_filename, sassc_path, Sass::Engine::DEFAULT_OPTIONS)
2252
+ engine = Sass::Engine.new("", :filename => sassc_path,
2253
+ :importer => Sass::Importers::Filesystem.new("."))
2254
+ key = engine.send(:sassc_key)
2255
+ File.join(engine.options[:cache_location], key)
2225
2256
  end
2226
2257
  end
2227
2258
 
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require File.dirname(__FILE__) + '/test_helper'
4
+
5
+ class ImporterTest < Test::Unit::TestCase
6
+
7
+ class FruitImporter < Sass::Importers::Base
8
+ def find(name, context = nil)
9
+ if name =~ %r{fruits/(\w+)(\.s[ac]ss)?}
10
+ fruit = $1
11
+ color = case $1
12
+ when "apple"
13
+ "red"
14
+ when "orange"
15
+ "orange"
16
+ else
17
+ "blue"
18
+ end
19
+ contents = %Q{
20
+ $#{fruit}-color: #{color} !default;
21
+ @mixin #{fruit} {
22
+ color: $#{fruit}-color;
23
+ }
24
+ }
25
+ Sass::Engine.new(contents, :filename => name, :syntax => :scss, :importer => self)
26
+ end
27
+ end
28
+
29
+ def key(name, context)
30
+ [self.class.name, name]
31
+ end
32
+ end
33
+
34
+ # This class proves that you can override the extension scheme for importers
35
+ class ReversedExtImporter < Sass::Importers::Filesystem
36
+ def extensions
37
+ {"sscs" => :scss, "ssas" => :sass}
38
+ end
39
+ end
40
+
41
+ def test_can_resolve_generated_imports
42
+ scss_file = %Q{
43
+ $pear-color: green;
44
+ @import "fruits/apple"; @import "fruits/orange"; @import "fruits/pear";
45
+ .apple { @include apple; }
46
+ .orange { @include orange; }
47
+ .pear { @include pear; }
48
+ }
49
+ css_file = <<CSS
50
+ .apple { color: red; }
51
+
52
+ .orange { color: orange; }
53
+
54
+ .pear { color: green; }
55
+ CSS
56
+ options = {:style => :compact, :load_paths => [FruitImporter.new], :syntax => :scss}
57
+ assert_equal css_file, Sass::Engine.new(scss_file, options).render
58
+ end
59
+
60
+ def test_extension_overrides
61
+ FileUtils.mkdir_p(absolutize("tmp"))
62
+ open(absolutize("tmp/foo.ssas"), "w") {|f| f.write(".foo\n reversed: true\n")}
63
+ open(absolutize("tmp/bar.sscs"), "w") {|f| f.write(".bar {reversed: true}\n")}
64
+ scss_file = %Q{
65
+ @import "foo", "bar";
66
+ @import "foo.ssas", "bar.sscs";
67
+ }
68
+ css_file = <<CSS
69
+ .foo { reversed: true; }
70
+
71
+ .bar { reversed: true; }
72
+
73
+ .foo { reversed: true; }
74
+
75
+ .bar { reversed: true; }
76
+ CSS
77
+ options = {:style => :compact, :load_paths => [ReversedExtImporter.new(absolutize("tmp"))], :syntax => :scss}
78
+ assert_equal css_file, Sass::Engine.new(scss_file, options).render
79
+ ensure
80
+ FileUtils.rm_rf(absolutize("tmp"))
81
+ end
82
+ end
@@ -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/plugin'
4
5
  require 'fileutils'
5
6
 
@@ -10,9 +11,11 @@ class SassPluginTest < Test::Unit::TestCase
10
11
  options
11
12
  }
12
13
 
14
+ @@cache_store = Sass::InMemoryCacheStore.new
15
+
13
16
  def setup
14
- FileUtils.mkdir tempfile_loc
15
- FileUtils.mkdir tempfile_loc(nil,"more_")
17
+ FileUtils.mkdir_p tempfile_loc
18
+ FileUtils.mkdir_p tempfile_loc(nil,"more_")
16
19
  set_plugin_opts
17
20
  update_all_stylesheets!
18
21
  reset_mtimes
@@ -20,7 +23,7 @@ class SassPluginTest < Test::Unit::TestCase
20
23
 
21
24
  def teardown
22
25
  clean_up_sassc
23
- clear_callbacks
26
+ Sass::Plugin.reset!
24
27
  FileUtils.rm_r tempfile_loc
25
28
  FileUtils.rm_r tempfile_loc(nil,"more_")
26
29
  end
@@ -250,7 +253,7 @@ CSS
250
253
 
251
254
  def test_cached_dependencies_update
252
255
  FileUtils.mv(template_loc("basic"), template_loc("basic", "more_"))
253
- set_plugin_opts :load_paths => [result_loc, template_loc(nil, "more_")]
256
+ set_plugin_opts :load_paths => [template_loc(nil, "more_")]
254
257
 
255
258
  touch 'basic', 'more_'
256
259
  assert_needs_update "import"
@@ -260,6 +263,15 @@ CSS
260
263
  FileUtils.mv(template_loc("basic", "more_"), template_loc("basic"))
261
264
  end
262
265
 
266
+ def test_cached_relative_import
267
+ old_always_update = Sass::Plugin.options[:always_update]
268
+ Sass::Plugin.options[:always_update] = true
269
+ update_all_stylesheets!
270
+ assert_renders_correctly('subdir/subdir')
271
+ ensure
272
+ Sass::Plugin.options[:always_update] = old_always_update
273
+ end
274
+
263
275
  private
264
276
 
265
277
  def assert_renders_correctly(*arguments)
@@ -342,10 +354,6 @@ CSS
342
354
  assert_no_callback(*args.pop) {assert_no_callbacks(*args)}
343
355
  end
344
356
 
345
- def clear_callbacks
346
- Sass::Plugin.instance_variable_set('@_sass_callbacks', {})
347
- end
348
-
349
357
  def update_all_stylesheets!
350
358
  Haml::Util.silence_haml_warnings do
351
359
  Sass::Plugin.update_stylesheets
@@ -398,19 +406,17 @@ CSS
398
406
  end
399
407
  end
400
408
 
401
- def absolutize(file)
402
- "#{File.dirname(__FILE__)}/#{file}"
403
- end
404
-
405
409
  def set_plugin_opts(overrides = {})
406
- Sass::Plugin.options = {
410
+ Sass::Plugin.options.merge!(
407
411
  :template_location => template_loc,
408
412
  :css_location => tempfile_loc,
409
413
  :style => :compact,
410
- :load_paths => [result_loc],
411
414
  :always_update => true,
412
415
  :never_update => false,
413
- }.merge(overrides)
416
+ :full_exception => true,
417
+ :cache_store => @@cache_store
418
+ )
419
+ Sass::Plugin.options.merge!(overrides)
414
420
  end
415
421
  end
416
422
 
@@ -0,0 +1,5 @@
1
+ class Test::Unit::TestCase
2
+ def absolutize(file)
3
+ "#{File.dirname(__FILE__)}/#{file}"
4
+ end
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml-edge
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.73
4
+ version: 3.1.74
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: 2010-09-06 00:00:00 -04:00
14
+ date: 2010-09-13 00:00:00 -04:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -77,7 +77,6 @@ files:
77
77
  - lib/sass/engine.rb
78
78
  - lib/sass/environment.rb
79
79
  - lib/sass/error.rb
80
- - lib/sass/files.rb
81
80
  - lib/sass/less.rb
82
81
  - lib/sass/plugin.rb
83
82
  - lib/sass/plugin/configuration.rb
@@ -86,6 +85,7 @@ files:
86
85
  - lib/sass/plugin/rack.rb
87
86
  - lib/sass/plugin/rails.rb
88
87
  - lib/sass/plugin/staleness_checker.rb
88
+ - lib/sass/plugin/compiler.rb
89
89
  - lib/sass/repl.rb
90
90
  - lib/sass/script.rb
91
91
  - lib/sass/script/bool.rb
@@ -135,6 +135,10 @@ files:
135
135
  - lib/sass/tree/variable_node.rb
136
136
  - lib/sass/tree/warn_node.rb
137
137
  - lib/sass/tree/while_node.rb
138
+ - lib/sass/cache_store.rb
139
+ - lib/sass/importers.rb
140
+ - lib/sass/importers/base.rb
141
+ - lib/sass/importers/filesystem.rb
138
142
  - vendor/fssm/LICENSE
139
143
  - vendor/fssm/README.markdown
140
144
  - vendor/fssm/Rakefile
@@ -316,6 +320,9 @@ files:
316
320
  - test/sass/templates/units.sass
317
321
  - test/sass/templates/warn.sass
318
322
  - test/sass/templates/warn_imported.sass
323
+ - test/sass/cache_test.rb
324
+ - test/sass/importer_test.rb
325
+ - test/sass/test_helper.rb
319
326
  - test/test_helper.rb
320
327
  - extra/haml-mode.el
321
328
  - extra/sass-mode.el
@@ -380,3 +387,5 @@ test_files:
380
387
  - test/sass/scss/css_test.rb
381
388
  - test/sass/scss/rx_test.rb
382
389
  - test/sass/scss/scss_test.rb
390
+ - test/sass/cache_test.rb
391
+ - test/sass/importer_test.rb
data/lib/sass/files.rb DELETED
@@ -1,160 +0,0 @@
1
- require 'digest/sha1'
2
- require 'pathname'
3
- require 'fileutils'
4
-
5
- module Sass
6
- # This module contains various bits of functionality
7
- # related to finding and caching Sass files.
8
- module Files
9
- extend self
10
-
11
- # Returns the {Sass::Tree} for the given file,
12
- # reading it from the Sass cache if possible.
13
- #
14
- # @param filename [String] The path to the Sass or SCSS file
15
- # @param options [{Symbol => Object}] The options hash.
16
- # Only the {file:SASS_REFERENCE.md#cache-option `:cache_location`} option is used
17
- # @raise [Sass::SyntaxError] if there's an error in the document.
18
- # The caller has responsibility for setting backtrace information, if necessary
19
- def tree_for(filename, options)
20
- default_options = Sass::Engine::DEFAULT_OPTIONS.dup
21
- default_options.delete(:syntax)
22
- options = default_options.merge!(options)
23
- text = File.read(filename)
24
-
25
- if options[:cache] || options[:read_cache]
26
- compiled_filename = sassc_filename(filename, options)
27
- sha = Digest::SHA1.hexdigest(text)
28
-
29
- if root = try_to_read_sassc(filename, compiled_filename, sha)
30
- root.options = options.merge(:filename => filename)
31
- return root
32
- end
33
- end
34
-
35
- options = options.merge(:filename => filename)
36
- if filename =~ /\.scss$/
37
- options = {:syntax => :scss}.merge(options)
38
- elsif filename =~ /\.sass$/
39
- options = {:syntax => :sass}.merge(options)
40
- end
41
-
42
- engine = Sass::Engine.new(text, options)
43
-
44
- root = engine.to_tree
45
- try_to_write_sassc(root, compiled_filename, sha, options) if options[:cache]
46
- root
47
- end
48
-
49
- # Find the full filename of a Sass, SCSS, or CSS file to import.
50
- # This follows Sass's import rules:
51
- # if the filename given ends in `".sass"`, `".scss"`, or `".css"`,
52
- # it will try to find that type of file;
53
- # otherwise, it will try to find the corresponding Sass/SCSS file
54
- # and fall back on CSS if it's not available.
55
- #
56
- # Any Sass/SCSS filename returned will correspond to
57
- # an actual file of the corresponding type on the filesystem.
58
- # CSS filenames, however, may not;
59
- # they're expected to be put through directly to the stylesheet
60
- # as CSS `@import` statements.
61
- #
62
- # @param filename [String] The filename to search for
63
- # @param load_paths [Array<String>] The set of filesystem paths
64
- # to search for Sass/SCSS files.
65
- # @return [String] The filename of the imported file.
66
- # This is an absolute path if the file is a `".sass"` or `".scss"` file.
67
- # @raise [Sass::SyntaxError] if `filename` ends in `".sass"` or `".scss"`
68
- # and no corresponding Sass/SCSS file could be found.
69
- def find_file_to_import(filename, load_paths)
70
- was_sass = was_scss = false
71
- original_filename = filename
72
-
73
- if [".sass", ".scss"].include?(filename[-5..-1])
74
- was_sass = filename[-5..-1] == ".sass"
75
- was_scss = filename[-5..-1] == ".scss"
76
- filename = filename[0...-5]
77
- elsif filename[-4..-1] == ".css"
78
- return filename
79
- end
80
-
81
- new_filename = nil
82
- load_paths = load_paths.uniq
83
- load_paths.each do |load_path|
84
- new_filename ||= find_full_path("#{filename}.sass", load_path) unless was_scss
85
- new_filename ||= find_full_path("#{filename}.scss", load_path) unless was_sass
86
- end
87
-
88
- return new_filename if new_filename
89
- unless was_sass || was_scss
90
- Haml::Util.haml_warn <<END
91
- WARNING: Neither #{filename}.sass nor .scss found. Using #{filename}.css instead.
92
- This behavior is deprecated and will be removed in a future version.
93
- If you really need #{filename}.css, import it explicitly.
94
- END
95
- return filename + '.css'
96
- end
97
-
98
- message = "File to import not found or unreadable: #{original_filename}.\n"
99
- if load_paths.size == 1
100
- message << "Load path: #{load_paths.first}"
101
- else
102
- message << "Load paths:\n " << load_paths.join("\n ")
103
- end
104
-
105
- raise SyntaxError.new(message)
106
- end
107
-
108
- private
109
-
110
- def sassc_filename(filename, options)
111
- File.join(options[:cache_location],
112
- Digest::SHA1.hexdigest(File.dirname(File.expand_path(filename))),
113
- File.basename(filename) + 'c')
114
- end
115
-
116
- def try_to_read_sassc(filename, compiled_filename, sha)
117
- return unless File.readable?(compiled_filename)
118
-
119
- File.open(compiled_filename, "rb") do |f|
120
- return unless f.readline("\n").strip == Sass::VERSION
121
- return unless f.readline("\n").strip == sha
122
- return Marshal.load(f.read)
123
- end
124
- rescue EOFError, TypeError, ArgumentError => e
125
- Haml::Util.haml_warn "Warning. Error encountered while reading cache #{compiled_filename}: #{e}"
126
- end
127
-
128
- def try_to_write_sassc(root, compiled_filename, sha, options)
129
- return unless File.writable?(File.dirname(options[:cache_location]))
130
- return if File.exists?(options[:cache_location]) && !File.writable?(options[:cache_location])
131
- return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
132
- return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
133
- FileUtils.mkdir_p(File.dirname(compiled_filename))
134
- File.open(compiled_filename, "wb") do |f|
135
- f.write(Sass::VERSION)
136
- f.write("\n")
137
- f.write(sha)
138
- f.write("\n")
139
- f.write(Marshal.dump(root))
140
- end
141
- end
142
-
143
- def find_full_path(filename, load_path)
144
- partial_name = File.join(File.dirname(filename), "_#{File.basename(filename)}")
145
-
146
- if Pathname.new(filename).absolute?
147
- [partial_name, filename].each do |name|
148
- return name if File.readable?(name)
149
- end
150
- return nil
151
- end
152
-
153
- [partial_name, filename].each do |name|
154
- full_path = File.join(load_path, name)
155
- return full_path if File.readable?(full_path)
156
- end
157
- nil
158
- end
159
- end
160
- end