oreorenasass 3.4.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.
Files changed (268) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +11 -0
  3. data/CONTRIBUTING +3 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +221 -0
  6. data/Rakefile +370 -0
  7. data/VERSION +1 -0
  8. data/VERSION_NAME +1 -0
  9. data/bin/sass +13 -0
  10. data/bin/sass-convert +12 -0
  11. data/bin/scss +13 -0
  12. data/extra/update_watch.rb +13 -0
  13. data/init.rb +18 -0
  14. data/lib/sass/cache_stores/base.rb +88 -0
  15. data/lib/sass/cache_stores/chain.rb +34 -0
  16. data/lib/sass/cache_stores/filesystem.rb +60 -0
  17. data/lib/sass/cache_stores/memory.rb +47 -0
  18. data/lib/sass/cache_stores/null.rb +25 -0
  19. data/lib/sass/cache_stores.rb +15 -0
  20. data/lib/sass/callbacks.rb +67 -0
  21. data/lib/sass/css.rb +407 -0
  22. data/lib/sass/engine.rb +1181 -0
  23. data/lib/sass/environment.rb +191 -0
  24. data/lib/sass/error.rb +198 -0
  25. data/lib/sass/exec/base.rb +187 -0
  26. data/lib/sass/exec/sass_convert.rb +264 -0
  27. data/lib/sass/exec/sass_scss.rb +424 -0
  28. data/lib/sass/exec.rb +9 -0
  29. data/lib/sass/features.rb +47 -0
  30. data/lib/sass/importers/base.rb +182 -0
  31. data/lib/sass/importers/filesystem.rb +211 -0
  32. data/lib/sass/importers.rb +22 -0
  33. data/lib/sass/logger/base.rb +30 -0
  34. data/lib/sass/logger/log_level.rb +45 -0
  35. data/lib/sass/logger.rb +12 -0
  36. data/lib/sass/media.rb +210 -0
  37. data/lib/sass/plugin/compiler.rb +565 -0
  38. data/lib/sass/plugin/configuration.rb +118 -0
  39. data/lib/sass/plugin/generic.rb +15 -0
  40. data/lib/sass/plugin/merb.rb +48 -0
  41. data/lib/sass/plugin/rack.rb +60 -0
  42. data/lib/sass/plugin/rails.rb +47 -0
  43. data/lib/sass/plugin/staleness_checker.rb +199 -0
  44. data/lib/sass/plugin.rb +133 -0
  45. data/lib/sass/railtie.rb +10 -0
  46. data/lib/sass/repl.rb +57 -0
  47. data/lib/sass/root.rb +7 -0
  48. data/lib/sass/script/css_lexer.rb +33 -0
  49. data/lib/sass/script/css_parser.rb +34 -0
  50. data/lib/sass/script/functions.rb +2626 -0
  51. data/lib/sass/script/lexer.rb +449 -0
  52. data/lib/sass/script/parser.rb +637 -0
  53. data/lib/sass/script/tree/funcall.rb +306 -0
  54. data/lib/sass/script/tree/interpolation.rb +118 -0
  55. data/lib/sass/script/tree/list_literal.rb +77 -0
  56. data/lib/sass/script/tree/literal.rb +45 -0
  57. data/lib/sass/script/tree/map_literal.rb +64 -0
  58. data/lib/sass/script/tree/node.rb +109 -0
  59. data/lib/sass/script/tree/operation.rb +103 -0
  60. data/lib/sass/script/tree/selector.rb +26 -0
  61. data/lib/sass/script/tree/string_interpolation.rb +104 -0
  62. data/lib/sass/script/tree/unary_operation.rb +69 -0
  63. data/lib/sass/script/tree/variable.rb +57 -0
  64. data/lib/sass/script/tree.rb +16 -0
  65. data/lib/sass/script/value/arg_list.rb +36 -0
  66. data/lib/sass/script/value/base.rb +240 -0
  67. data/lib/sass/script/value/bool.rb +35 -0
  68. data/lib/sass/script/value/color.rb +680 -0
  69. data/lib/sass/script/value/helpers.rb +262 -0
  70. data/lib/sass/script/value/list.rb +113 -0
  71. data/lib/sass/script/value/map.rb +70 -0
  72. data/lib/sass/script/value/null.rb +44 -0
  73. data/lib/sass/script/value/number.rb +530 -0
  74. data/lib/sass/script/value/string.rb +97 -0
  75. data/lib/sass/script/value.rb +11 -0
  76. data/lib/sass/script.rb +66 -0
  77. data/lib/sass/scss/css_parser.rb +42 -0
  78. data/lib/sass/scss/parser.rb +1209 -0
  79. data/lib/sass/scss/rx.rb +141 -0
  80. data/lib/sass/scss/script_lexer.rb +15 -0
  81. data/lib/sass/scss/script_parser.rb +25 -0
  82. data/lib/sass/scss/static_parser.rb +368 -0
  83. data/lib/sass/scss.rb +16 -0
  84. data/lib/sass/selector/abstract_sequence.rb +109 -0
  85. data/lib/sass/selector/comma_sequence.rb +175 -0
  86. data/lib/sass/selector/pseudo.rb +256 -0
  87. data/lib/sass/selector/sequence.rb +600 -0
  88. data/lib/sass/selector/simple.rb +117 -0
  89. data/lib/sass/selector/simple_sequence.rb +325 -0
  90. data/lib/sass/selector.rb +326 -0
  91. data/lib/sass/shared.rb +76 -0
  92. data/lib/sass/source/map.rb +210 -0
  93. data/lib/sass/source/position.rb +39 -0
  94. data/lib/sass/source/range.rb +41 -0
  95. data/lib/sass/stack.rb +120 -0
  96. data/lib/sass/supports.rb +227 -0
  97. data/lib/sass/tree/at_root_node.rb +83 -0
  98. data/lib/sass/tree/charset_node.rb +22 -0
  99. data/lib/sass/tree/comment_node.rb +82 -0
  100. data/lib/sass/tree/content_node.rb +9 -0
  101. data/lib/sass/tree/css_import_node.rb +60 -0
  102. data/lib/sass/tree/debug_node.rb +18 -0
  103. data/lib/sass/tree/directive_node.rb +59 -0
  104. data/lib/sass/tree/each_node.rb +24 -0
  105. data/lib/sass/tree/error_node.rb +18 -0
  106. data/lib/sass/tree/extend_node.rb +43 -0
  107. data/lib/sass/tree/for_node.rb +36 -0
  108. data/lib/sass/tree/function_node.rb +39 -0
  109. data/lib/sass/tree/if_node.rb +52 -0
  110. data/lib/sass/tree/import_node.rb +74 -0
  111. data/lib/sass/tree/keyframe_rule_node.rb +15 -0
  112. data/lib/sass/tree/media_node.rb +48 -0
  113. data/lib/sass/tree/mixin_def_node.rb +38 -0
  114. data/lib/sass/tree/mixin_node.rb +52 -0
  115. data/lib/sass/tree/node.rb +238 -0
  116. data/lib/sass/tree/prop_node.rb +171 -0
  117. data/lib/sass/tree/return_node.rb +19 -0
  118. data/lib/sass/tree/root_node.rb +44 -0
  119. data/lib/sass/tree/rule_node.rb +145 -0
  120. data/lib/sass/tree/supports_node.rb +38 -0
  121. data/lib/sass/tree/trace_node.rb +33 -0
  122. data/lib/sass/tree/variable_node.rb +36 -0
  123. data/lib/sass/tree/visitors/base.rb +72 -0
  124. data/lib/sass/tree/visitors/check_nesting.rb +177 -0
  125. data/lib/sass/tree/visitors/convert.rb +334 -0
  126. data/lib/sass/tree/visitors/cssize.rb +369 -0
  127. data/lib/sass/tree/visitors/deep_copy.rb +107 -0
  128. data/lib/sass/tree/visitors/extend.rb +68 -0
  129. data/lib/sass/tree/visitors/perform.rb +539 -0
  130. data/lib/sass/tree/visitors/set_options.rb +139 -0
  131. data/lib/sass/tree/visitors/to_css.rb +381 -0
  132. data/lib/sass/tree/warn_node.rb +18 -0
  133. data/lib/sass/tree/while_node.rb +18 -0
  134. data/lib/sass/util/cross_platform_random.rb +19 -0
  135. data/lib/sass/util/multibyte_string_scanner.rb +157 -0
  136. data/lib/sass/util/normalized_map.rb +130 -0
  137. data/lib/sass/util/ordered_hash.rb +192 -0
  138. data/lib/sass/util/subset_map.rb +110 -0
  139. data/lib/sass/util/test.rb +9 -0
  140. data/lib/sass/util.rb +1318 -0
  141. data/lib/sass/version.rb +124 -0
  142. data/lib/sass.rb +102 -0
  143. data/rails/init.rb +1 -0
  144. data/test/sass/cache_test.rb +131 -0
  145. data/test/sass/callbacks_test.rb +61 -0
  146. data/test/sass/compiler_test.rb +232 -0
  147. data/test/sass/conversion_test.rb +2054 -0
  148. data/test/sass/css2sass_test.rb +477 -0
  149. data/test/sass/data/hsl-rgb.txt +319 -0
  150. data/test/sass/encoding_test.rb +219 -0
  151. data/test/sass/engine_test.rb +3301 -0
  152. data/test/sass/exec_test.rb +86 -0
  153. data/test/sass/extend_test.rb +1661 -0
  154. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  155. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  156. data/test/sass/functions_test.rb +1926 -0
  157. data/test/sass/importer_test.rb +412 -0
  158. data/test/sass/logger_test.rb +58 -0
  159. data/test/sass/mock_importer.rb +49 -0
  160. data/test/sass/more_results/more1.css +9 -0
  161. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  162. data/test/sass/more_results/more_import.css +29 -0
  163. data/test/sass/more_templates/_more_partial.sass +2 -0
  164. data/test/sass/more_templates/more1.sass +23 -0
  165. data/test/sass/more_templates/more_import.sass +11 -0
  166. data/test/sass/plugin_test.rb +554 -0
  167. data/test/sass/results/alt.css +4 -0
  168. data/test/sass/results/basic.css +9 -0
  169. data/test/sass/results/cached_import_option.css +3 -0
  170. data/test/sass/results/compact.css +5 -0
  171. data/test/sass/results/complex.css +86 -0
  172. data/test/sass/results/compressed.css +1 -0
  173. data/test/sass/results/expanded.css +19 -0
  174. data/test/sass/results/filename_fn.css +3 -0
  175. data/test/sass/results/if.css +3 -0
  176. data/test/sass/results/import.css +31 -0
  177. data/test/sass/results/import_charset.css +5 -0
  178. data/test/sass/results/import_charset_1_8.css +5 -0
  179. data/test/sass/results/import_charset_ibm866.css +5 -0
  180. data/test/sass/results/import_content.css +1 -0
  181. data/test/sass/results/line_numbers.css +49 -0
  182. data/test/sass/results/mixins.css +95 -0
  183. data/test/sass/results/multiline.css +24 -0
  184. data/test/sass/results/nested.css +22 -0
  185. data/test/sass/results/options.css +1 -0
  186. data/test/sass/results/parent_ref.css +13 -0
  187. data/test/sass/results/script.css +16 -0
  188. data/test/sass/results/scss_import.css +31 -0
  189. data/test/sass/results/scss_importee.css +2 -0
  190. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  191. data/test/sass/results/subdir/subdir.css +3 -0
  192. data/test/sass/results/units.css +11 -0
  193. data/test/sass/results/warn.css +0 -0
  194. data/test/sass/results/warn_imported.css +0 -0
  195. data/test/sass/script_conversion_test.rb +328 -0
  196. data/test/sass/script_test.rb +1054 -0
  197. data/test/sass/scss/css_test.rb +1215 -0
  198. data/test/sass/scss/rx_test.rb +156 -0
  199. data/test/sass/scss/scss_test.rb +3900 -0
  200. data/test/sass/scss/test_helper.rb +37 -0
  201. data/test/sass/source_map_test.rb +977 -0
  202. data/test/sass/superselector_test.rb +191 -0
  203. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  204. data/test/sass/templates/_double_import_loop2.sass +1 -0
  205. data/test/sass/templates/_filename_fn_import.scss +11 -0
  206. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  207. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  208. data/test/sass/templates/_imported_content.sass +3 -0
  209. data/test/sass/templates/_partial.sass +2 -0
  210. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  211. data/test/sass/templates/alt.sass +16 -0
  212. data/test/sass/templates/basic.sass +23 -0
  213. data/test/sass/templates/bork1.sass +2 -0
  214. data/test/sass/templates/bork2.sass +2 -0
  215. data/test/sass/templates/bork3.sass +2 -0
  216. data/test/sass/templates/bork4.sass +2 -0
  217. data/test/sass/templates/bork5.sass +3 -0
  218. data/test/sass/templates/cached_import_option.scss +3 -0
  219. data/test/sass/templates/compact.sass +17 -0
  220. data/test/sass/templates/complex.sass +305 -0
  221. data/test/sass/templates/compressed.sass +15 -0
  222. data/test/sass/templates/double_import_loop1.sass +1 -0
  223. data/test/sass/templates/expanded.sass +17 -0
  224. data/test/sass/templates/filename_fn.scss +18 -0
  225. data/test/sass/templates/if.sass +11 -0
  226. data/test/sass/templates/import.sass +12 -0
  227. data/test/sass/templates/import_charset.sass +9 -0
  228. data/test/sass/templates/import_charset_1_8.sass +6 -0
  229. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  230. data/test/sass/templates/import_content.sass +4 -0
  231. data/test/sass/templates/importee.less +2 -0
  232. data/test/sass/templates/importee.sass +19 -0
  233. data/test/sass/templates/line_numbers.sass +13 -0
  234. data/test/sass/templates/mixin_bork.sass +5 -0
  235. data/test/sass/templates/mixins.sass +76 -0
  236. data/test/sass/templates/multiline.sass +20 -0
  237. data/test/sass/templates/nested.sass +25 -0
  238. data/test/sass/templates/nested_bork1.sass +2 -0
  239. data/test/sass/templates/nested_bork2.sass +2 -0
  240. data/test/sass/templates/nested_bork3.sass +2 -0
  241. data/test/sass/templates/nested_bork4.sass +2 -0
  242. data/test/sass/templates/nested_import.sass +2 -0
  243. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  244. data/test/sass/templates/options.sass +2 -0
  245. data/test/sass/templates/parent_ref.sass +25 -0
  246. data/test/sass/templates/same_name_different_ext.sass +2 -0
  247. data/test/sass/templates/same_name_different_ext.scss +1 -0
  248. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  249. data/test/sass/templates/script.sass +101 -0
  250. data/test/sass/templates/scss_import.scss +12 -0
  251. data/test/sass/templates/scss_importee.scss +1 -0
  252. data/test/sass/templates/single_import_loop.sass +1 -0
  253. data/test/sass/templates/subdir/import_up1.scss +1 -0
  254. data/test/sass/templates/subdir/import_up2.scss +1 -0
  255. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  256. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  257. data/test/sass/templates/subdir/subdir.sass +6 -0
  258. data/test/sass/templates/units.sass +11 -0
  259. data/test/sass/templates/warn.sass +3 -0
  260. data/test/sass/templates/warn_imported.sass +4 -0
  261. data/test/sass/test_helper.rb +8 -0
  262. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  263. data/test/sass/util/normalized_map_test.rb +51 -0
  264. data/test/sass/util/subset_map_test.rb +91 -0
  265. data/test/sass/util_test.rb +467 -0
  266. data/test/sass/value_helpers_test.rb +179 -0
  267. data/test/test_helper.rb +109 -0
  268. metadata +386 -0
@@ -0,0 +1,412 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require File.dirname(__FILE__) + '/test_helper'
4
+ require 'mock_importer'
5
+ require 'sass/plugin'
6
+
7
+ class ImporterTest < MiniTest::Test
8
+
9
+ class FruitImporter < Sass::Importers::Base
10
+ def find(name, context = nil)
11
+ fruit = parse(name)
12
+ return unless fruit
13
+ color = case fruit
14
+ when "apple"
15
+ "red"
16
+ when "orange"
17
+ "orange"
18
+ else
19
+ "blue"
20
+ end
21
+ contents = %Q{
22
+ $#{fruit}-color: #{color} !default;
23
+ @mixin #{fruit} {
24
+ color: $#{fruit}-color;
25
+ }
26
+ }
27
+ Sass::Engine.new(contents, :filename => name, :syntax => :scss, :importer => self)
28
+ end
29
+
30
+ def key(name, context)
31
+ [self.class.name, name]
32
+ end
33
+
34
+ def public_url(name, sourcemap_directory = nil)
35
+ "http://#{parse(name)}.example.com/style.scss"
36
+ end
37
+
38
+ private
39
+
40
+ def parse(name)
41
+ name[%r{fruits/(\w+)(\.s[ac]ss)?}, 1]
42
+ end
43
+ end
44
+
45
+ class NoPublicUrlImporter < FruitImporter
46
+ def public_url(name, sourcemap_directory = nil)
47
+ nil
48
+ end
49
+
50
+ private
51
+
52
+ def parse(name)
53
+ name[%r{ephemeral/(\w+)(\.s[ac]ss)?}, 1]
54
+ end
55
+ end
56
+
57
+ # This class proves that you can override the extension scheme for importers
58
+ class ReversedExtImporter < Sass::Importers::Filesystem
59
+ def extensions
60
+ {"sscs" => :scss, "ssas" => :sass}
61
+ end
62
+ end
63
+
64
+ # This importer maps one import to another import
65
+ # based on the mappings passed to importer's constructor.
66
+ class IndirectImporter < Sass::Importers::Base
67
+ def initialize(mappings, mtimes)
68
+ @mappings = mappings
69
+ @mtimes = mtimes
70
+ end
71
+ def find_relative(uri, base, options)
72
+ nil
73
+ end
74
+ def find(name, options)
75
+ if @mappings.has_key?(name)
76
+ Sass::Engine.new(
77
+ %Q[@import "#{@mappings[name]}";],
78
+ options.merge(
79
+ :filename => name,
80
+ :syntax => :scss,
81
+ :importer => self
82
+ )
83
+ )
84
+ end
85
+ end
86
+ def mtime(uri, options)
87
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
88
+ end
89
+ def key(uri, options)
90
+ [self.class.name, uri]
91
+ end
92
+ def to_s
93
+ "IndirectImporter(#{@mappings.keys.join(", ")})"
94
+ end
95
+ end
96
+
97
+ # This importer maps the import to single class
98
+ # based on the mappings passed to importer's constructor.
99
+ class ClassImporter < Sass::Importers::Base
100
+ def initialize(mappings, mtimes)
101
+ @mappings = mappings
102
+ @mtimes = mtimes
103
+ end
104
+ def find_relative(uri, base, options)
105
+ nil
106
+ end
107
+ def find(name, options)
108
+ if @mappings.has_key?(name)
109
+ Sass::Engine.new(
110
+ %Q[.#{name}{#{@mappings[name]}}],
111
+ options.merge(
112
+ :filename => name,
113
+ :syntax => :scss,
114
+ :importer => self
115
+ )
116
+ )
117
+ end
118
+ end
119
+ def mtime(uri, options)
120
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
121
+ end
122
+ def key(uri, options)
123
+ [self.class.name, uri]
124
+ end
125
+ def to_s
126
+ "ClassImporter(#{@mappings.keys.join(", ")})"
127
+ end
128
+ end
129
+
130
+ def test_can_resolve_generated_imports
131
+ scss_file = %Q{
132
+ $pear-color: green;
133
+ @import "fruits/apple"; @import "fruits/orange"; @import "fruits/pear";
134
+ .apple { @include apple; }
135
+ .orange { @include orange; }
136
+ .pear { @include pear; }
137
+ }
138
+ css_file = <<CSS
139
+ .apple { color: red; }
140
+
141
+ .orange { color: orange; }
142
+
143
+ .pear { color: green; }
144
+ CSS
145
+ options = {:style => :compact, :load_paths => [FruitImporter.new], :syntax => :scss}
146
+ assert_equal css_file, Sass::Engine.new(scss_file, options).render
147
+ end
148
+
149
+ def test_extension_overrides
150
+ FileUtils.mkdir_p(absolutize("tmp"))
151
+ open(absolutize("tmp/foo.ssas"), "w") {|f| f.write(".foo\n reversed: true\n")}
152
+ open(absolutize("tmp/bar.sscs"), "w") {|f| f.write(".bar {reversed: true}\n")}
153
+ scss_file = %Q{
154
+ @import "foo", "bar";
155
+ @import "foo.ssas", "bar.sscs";
156
+ }
157
+ css_file = <<CSS
158
+ .foo { reversed: true; }
159
+
160
+ .bar { reversed: true; }
161
+
162
+ .foo { reversed: true; }
163
+
164
+ .bar { reversed: true; }
165
+ CSS
166
+ options = {:style => :compact, :load_paths => [ReversedExtImporter.new(absolutize("tmp"))], :syntax => :scss}
167
+ assert_equal css_file, Sass::Engine.new(scss_file, options).render
168
+ ensure
169
+ FileUtils.rm_rf(absolutize("tmp"))
170
+ end
171
+
172
+ def test_staleness_check_across_importers
173
+ file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
174
+ # Make sure the first import is older
175
+ indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
176
+ # Make css file is newer so the dependencies are the only way for the css file to be out of date.
177
+ FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
178
+ # Make sure the first import is older
179
+ class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
180
+
181
+ options = {
182
+ :style => :compact,
183
+ :filename => fixture_file("test_staleness_check_across_importers.scss"),
184
+ :importer => file_system_importer,
185
+ :load_paths => [file_system_importer, indirect_importer, class_importer],
186
+ :syntax => :scss
187
+ }
188
+
189
+ assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
190
+ Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
191
+
192
+ checker = Sass::Plugin::StalenessChecker.new(options)
193
+
194
+ assert checker.stylesheet_needs_update?(
195
+ fixture_file("test_staleness_check_across_importers.css"),
196
+ fixture_file("test_staleness_check_across_importers.scss"),
197
+ file_system_importer
198
+ )
199
+ end
200
+
201
+ def test_source_map_with_only_css_uri_supports_public_url_imports
202
+ fruit_importer = FruitImporter.new
203
+
204
+ options = {
205
+ :filename => 'fruits/orange',
206
+ :importer => fruit_importer,
207
+ :syntax => :scss
208
+ }
209
+
210
+ engine = Sass::Engine.new(<<SCSS, options)
211
+ .orchard {
212
+ color: blue;
213
+ }
214
+ SCSS
215
+
216
+ _, sourcemap = engine.render_with_sourcemap('sourcemap_uri')
217
+ assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri')
218
+ {
219
+ "version": 3,
220
+ "mappings": "AAAA,QAAS;EACP,KAAK,EAAE,IAAI",
221
+ "sources": ["http://orange.example.com/style.scss"],
222
+ "names": [],
223
+ "file": "css_uri"
224
+ }
225
+ JSON
226
+ end
227
+
228
+ def test_source_map_with_only_css_uri_can_have_no_public_url
229
+ ephemeral_importer = NoPublicUrlImporter.new
230
+ mock_importer = MockImporter.new
231
+ def mock_importer.public_url(name, sourcemap_directory = nil)
232
+ "source_uri"
233
+ end
234
+
235
+ options = {
236
+ :filename => filename_for_test,
237
+ :sourcemap_filename => sourcemap_filename_for_test,
238
+ :importer => mock_importer,
239
+ :syntax => :scss,
240
+ :load_paths => [ephemeral_importer],
241
+ :cache => false
242
+ }
243
+
244
+ engine = Sass::Engine.new(<<SCSS, options)
245
+ @import "ephemeral/orange";
246
+ .orange {
247
+ @include orange;
248
+ }
249
+ SCSS
250
+
251
+ css_output, sourcemap = engine.render_with_sourcemap('sourcemap_uri')
252
+ assert_equal <<CSS.strip, css_output.strip
253
+ .orange {
254
+ color: orange; }
255
+
256
+ /*# sourceMappingURL=sourcemap_uri */
257
+ CSS
258
+ map = sourcemap.to_json(:css_uri => 'css_uri')
259
+ assert_equal <<JSON.strip, map
260
+ {
261
+ "version": 3,
262
+ "mappings": "AACA,OAAQ",
263
+ "sources": ["source_uri"],
264
+ "names": [],
265
+ "file": "css_uri"
266
+ }
267
+ JSON
268
+ end
269
+
270
+ def test_source_map_with_only_css_uri_falls_back_to_file_uris
271
+ file_system_importer = Sass::Importers::Filesystem.new('.')
272
+ options = {
273
+ :filename => filename_for_test(:scss),
274
+ :sourcemap_filename => sourcemap_filename_for_test,
275
+ :importer => file_system_importer,
276
+ :syntax => :scss
277
+ }
278
+
279
+ engine = Sass::Engine.new(<<SCSS, options)
280
+ .foo {a: b}
281
+ SCSS
282
+
283
+ _, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
284
+
285
+ uri = Sass::Util.file_uri_from_path(Sass::Util.absolute_path(filename_for_test(:scss)))
286
+ assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri')
287
+ {
288
+ "version": 3,
289
+ "mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
290
+ "sources": ["#{uri}"],
291
+ "names": [],
292
+ "file": "css_uri"
293
+ }
294
+ JSON
295
+ end
296
+
297
+ def test_source_map_with_css_uri_and_css_path_falls_back_to_file_uris
298
+ file_system_importer = Sass::Importers::Filesystem.new('.')
299
+ options = {
300
+ :filename => filename_for_test(:scss),
301
+ :sourcemap_filename => sourcemap_filename_for_test,
302
+ :importer => file_system_importer,
303
+ :syntax => :scss
304
+ }
305
+
306
+ engine = Sass::Engine.new(<<SCSS, options)
307
+ .foo {a: b}
308
+ SCSS
309
+
310
+ _, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
311
+
312
+ uri = Sass::Util.file_uri_from_path(Sass::Util.absolute_path(filename_for_test(:scss)))
313
+ assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri', :css_path => 'css_path')
314
+ {
315
+ "version": 3,
316
+ "mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
317
+ "sources": ["#{uri}"],
318
+ "names": [],
319
+ "file": "css_uri"
320
+ }
321
+ JSON
322
+ end
323
+
324
+ def test_source_map_with_css_uri_and_sourcemap_path_supports_filesystem_importer
325
+ file_system_importer = Sass::Importers::Filesystem.new('.')
326
+ css_uri = 'css_uri'
327
+ sourcemap_path = 'map/style.map'
328
+ options = {
329
+ :filename => 'sass/style.scss',
330
+ :sourcemap_filename => sourcemap_path,
331
+ :importer => file_system_importer,
332
+ :syntax => :scss
333
+ }
334
+
335
+ engine = Sass::Engine.new(<<SCSS, options)
336
+ .foo {a: b}
337
+ SCSS
338
+
339
+ rendered, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
340
+
341
+
342
+ rendered, sourcemap = engine.render_with_sourcemap('http://map.example.com/map/style.map')
343
+ assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => css_uri, :sourcemap_path => sourcemap_path)
344
+ {
345
+ "version": 3,
346
+ "mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
347
+ "sources": ["../sass/style.scss"],
348
+ "names": [],
349
+ "file": "css_uri"
350
+ }
351
+ JSON
352
+ end
353
+
354
+ def test_source_map_with_css_path_and_sourcemap_path_supports_file_system_importer
355
+ file_system_importer = Sass::Importers::Filesystem.new('.')
356
+ sass_path = 'sass/style.scss'
357
+ css_path = 'static/style.css'
358
+ sourcemap_path = 'map/style.map'
359
+ options = {
360
+ :filename => sass_path,
361
+ :sourcemap_filename => sourcemap_path,
362
+ :importer => file_system_importer,
363
+ :syntax => :scss
364
+ }
365
+
366
+ engine = Sass::Engine.new(<<SCSS, options)
367
+ .foo {a: b}
368
+ SCSS
369
+
370
+ _, sourcemap = engine.render_with_sourcemap('http://map.example.com/map/style.map')
371
+ assert_equal <<JSON.strip, sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path)
372
+ {
373
+ "version": 3,
374
+ "mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
375
+ "sources": ["../sass/style.scss"],
376
+ "names": [],
377
+ "file": "../static/style.css"
378
+ }
379
+ JSON
380
+ end
381
+
382
+ def test_render_with_sourcemap_requires_filename
383
+ file_system_importer = Sass::Importers::Filesystem.new('.')
384
+ engine = Sass::Engine.new(".foo {a: b}", :syntax => :scss, :importer => file_system_importer)
385
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE) {engine.render_with_sourcemap('sourcemap_url')}
386
+ Error generating source map: couldn't determine public URL for the source stylesheet.
387
+ No filename is available so there's nothing for the source map to link to.
388
+ MESSAGE
389
+ end
390
+
391
+ def test_render_with_sourcemap_requires_importer_with_public_url
392
+ class_importer = ClassImporter.new({"pear" => "color: green;"}, {"pear" => Time.now})
393
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE) {class_importer.find("pear", {}).render_with_sourcemap('sourcemap_url')}
394
+ Error generating source map: couldn't determine public URL for "pear".
395
+ Without a public URL, there's nothing for the source map to link to.
396
+ Custom importers should define the #public_url method.
397
+ MESSAGE
398
+ end
399
+
400
+ def fixture_dir
401
+ File.join(File.dirname(__FILE__), "fixtures")
402
+ end
403
+
404
+ def fixture_file(path)
405
+ File.join(fixture_dir, path)
406
+ end
407
+
408
+ def test_absolute_files_across_template_locations
409
+ importer = Sass::Importers::Filesystem.new(absolutize 'templates')
410
+ refute_nil importer.mtime(absolutize('more_templates/more1.sass'), {})
411
+ end
412
+ end
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require 'pathname'
4
+
5
+ class LoggerTest < MiniTest::Test
6
+
7
+ class InterceptedLogger < Sass::Logger::Base
8
+
9
+ attr_accessor :messages
10
+
11
+ def initialize(*args)
12
+ super
13
+ self.messages = []
14
+ end
15
+
16
+ def reset!
17
+ self.messages = []
18
+ end
19
+
20
+ def _log(*args)
21
+ messages << [args]
22
+ end
23
+
24
+ end
25
+
26
+ def test_global_sass_logger_instance_exists
27
+ assert Sass.logger.respond_to?(:warn)
28
+ end
29
+
30
+ def test_log_level_orders
31
+ logged_levels = {
32
+ :trace => [ [], [:trace, :debug, :info, :warn, :error]],
33
+ :debug => [ [:trace], [:debug, :info, :warn, :error]],
34
+ :info => [ [:trace, :debug], [:info, :warn, :error]],
35
+ :warn => [ [:trace, :debug, :info], [:warn, :error]],
36
+ :error => [ [:trace, :debug, :info, :warn], [:error]]
37
+ }
38
+ logged_levels.each do |level, (should_not_be_logged, should_be_logged)|
39
+ logger = Sass::Logger::Base.new(level)
40
+ should_not_be_logged.each do |should_level|
41
+ assert !logger.logging_level?(should_level)
42
+ end
43
+ should_be_logged.each do |should_level|
44
+ assert logger.logging_level?(should_level)
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_logging_can_be_disabled
50
+ logger = InterceptedLogger.new
51
+ logger.error("message #1")
52
+ assert_equal 1, logger.messages.size
53
+ logger.reset!
54
+ logger.disabled = true
55
+ logger.error("message #2")
56
+ assert_equal 0, logger.messages.size
57
+ end
58
+ end