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,124 @@
1
+ require 'date'
2
+ require 'sass/util'
3
+
4
+ module Sass
5
+ # Handles Sass version-reporting.
6
+ # Sass not only reports the standard three version numbers,
7
+ # but its Git revision hash as well,
8
+ # if it was installed from Git.
9
+ module Version
10
+ # Returns a hash representing the version of Sass.
11
+ # The `:major`, `:minor`, and `:teeny` keys have their respective numbers as Fixnums.
12
+ # The `:name` key has the name of the version.
13
+ # The `:string` key contains a human-readable string representation of the version.
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.
17
+ # If Sass is checked out from Git, the `:rev` key will have the revision hash.
18
+ # For example:
19
+ #
20
+ # {
21
+ # :string => "2.1.0.9616393",
22
+ # :rev => "9616393b8924ef36639c7e82aa88a51a24d16949",
23
+ # :number => "2.1.0",
24
+ # :date => DateTime.parse("Apr 30 13:52:01 2009 -0700"),
25
+ # :major => 2, :minor => 1, :teeny => 0
26
+ # }
27
+ #
28
+ # If a prerelease version of Sass is being used,
29
+ # the `:string` and `:number` fields will reflect the full version
30
+ # (e.g. `"2.2.beta.1"`), and the `:teeny` field will be `-1`.
31
+ # A `:prerelease` key will contain the name of the prerelease (e.g. `"beta"`),
32
+ # and a `:prerelease_number` key will contain the rerelease number.
33
+ # For example:
34
+ #
35
+ # {
36
+ # :string => "3.0.beta.1",
37
+ # :number => "3.0.beta.1",
38
+ # :date => DateTime.parse("Mar 31 00:38:04 2010 -0700"),
39
+ # :major => 3, :minor => 0, :teeny => -1,
40
+ # :prerelease => "beta",
41
+ # :prerelease_number => 1
42
+ # }
43
+ #
44
+ # @return [{Symbol => String/Fixnum}] The version hash
45
+ # @comment
46
+ # rubocop:disable ClassVars
47
+ def version
48
+ return @@version if defined?(@@version)
49
+
50
+ numbers = File.read(Sass::Util.scope('VERSION')).strip.split('.').
51
+ map {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
52
+ name = File.read(Sass::Util.scope('VERSION_NAME')).strip
53
+ @@version = {
54
+ :major => numbers[0],
55
+ :minor => numbers[1],
56
+ :teeny => numbers[2],
57
+ :name => name
58
+ }
59
+
60
+ if (date = version_date)
61
+ @@version[:date] = date
62
+ end
63
+
64
+ if numbers[3].is_a?(String)
65
+ @@version[:teeny] = -1
66
+ @@version[:prerelease] = numbers[3]
67
+ @@version[:prerelease_number] = numbers[4]
68
+ end
69
+
70
+ @@version[:number] = numbers.join('.')
71
+ @@version[:string] = @@version[:number].dup
72
+
73
+ if (rev = revision_number)
74
+ @@version[:rev] = rev
75
+ unless rev[0] == ?(
76
+ @@version[:string] << "." << rev[0...7]
77
+ end
78
+ end
79
+
80
+ @@version[:string] << " (#{name})"
81
+ @@version
82
+ end
83
+ # rubocop:enable ClassVars
84
+
85
+ private
86
+
87
+ def revision_number
88
+ if File.exist?(Sass::Util.scope('REVISION'))
89
+ rev = File.read(Sass::Util.scope('REVISION')).strip
90
+ return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)'
91
+ end
92
+
93
+ return unless File.exist?(Sass::Util.scope('.git/HEAD'))
94
+ rev = File.read(Sass::Util.scope('.git/HEAD')).strip
95
+ return rev unless rev =~ /^ref: (.*)$/
96
+
97
+ ref_name = $1
98
+ ref_file = Sass::Util.scope(".git/#{ref_name}")
99
+ info_file = Sass::Util.scope(".git/info/refs")
100
+ return File.read(ref_file).strip if File.exist?(ref_file)
101
+ return unless File.exist?(info_file)
102
+ File.open(info_file) do |f|
103
+ f.each do |l|
104
+ sha, ref = l.strip.split("\t", 2)
105
+ next unless ref == ref_name
106
+ return sha
107
+ end
108
+ end
109
+ nil
110
+ end
111
+
112
+ def version_date
113
+ return unless File.exist?(Sass::Util.scope('VERSION_DATE'))
114
+ DateTime.parse(File.read(Sass::Util.scope('VERSION_DATE')).strip)
115
+ end
116
+ end
117
+
118
+ extend Sass::Version
119
+
120
+ # A string representing the version of Sass.
121
+ # A more fine-grained representation is available from Sass.version.
122
+ # @api public
123
+ VERSION = version[:string] unless defined?(Sass::VERSION)
124
+ end
data/lib/sass.rb ADDED
@@ -0,0 +1,102 @@
1
+ dir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
3
+
4
+ require 'sass/version'
5
+
6
+ # The module that contains everything Sass-related:
7
+ #
8
+ # * {Sass::Engine} is the class used to render Sass/SCSS within Ruby code.
9
+ # * {Sass::Plugin} is interfaces with web frameworks (Rails and Merb in particular).
10
+ # * {Sass::SyntaxError} is raised when Sass encounters an error.
11
+ # * {Sass::CSS} handles conversion of CSS to Sass.
12
+ #
13
+ # Also see the {file:SASS_REFERENCE.md full Sass reference}.
14
+ module Sass
15
+ class << self
16
+ # @private
17
+ attr_accessor :tests_running
18
+ end
19
+
20
+ # The global load paths for Sass files. This is meant for plugins and
21
+ # libraries to register the paths to their Sass stylesheets to that they may
22
+ # be `@imported`. This load path is used by every instance of {Sass::Engine}.
23
+ # They are lower-precedence than any load paths passed in via the
24
+ # {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}.
25
+ #
26
+ # If the `SASS_PATH` environment variable is set,
27
+ # the initial value of `load_paths` will be initialized based on that.
28
+ # The variable should be a colon-separated list of path names
29
+ # (semicolon-separated on Windows).
30
+ #
31
+ # Note that files on the global load path are never compiled to CSS
32
+ # themselves, even if they aren't partials. They exist only to be imported.
33
+ #
34
+ # @example
35
+ # Sass.load_paths << File.dirname(__FILE__ + '/sass')
36
+ # @return [Array<String, Pathname, Sass::Importers::Base>]
37
+ def self.load_paths
38
+ @load_paths ||= if ENV['SASS_PATH']
39
+ ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':')
40
+ else
41
+ []
42
+ end
43
+ end
44
+
45
+ # Compile a Sass or SCSS string to CSS.
46
+ # Defaults to SCSS.
47
+ #
48
+ # @param contents [String] The contents of the Sass file.
49
+ # @param options [{Symbol => Object}] An options hash;
50
+ # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
51
+ # @raise [Sass::SyntaxError] if there's an error in the document
52
+ # @raise [Encoding::UndefinedConversionError] if the source encoding
53
+ # cannot be converted to UTF-8
54
+ # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
55
+ def self.compile(contents, options = {})
56
+ options[:syntax] ||= :scss
57
+ Engine.new(contents, options).to_css
58
+ end
59
+
60
+ # Compile a file on disk to CSS.
61
+ #
62
+ # @raise [Sass::SyntaxError] if there's an error in the document
63
+ # @raise [Encoding::UndefinedConversionError] if the source encoding
64
+ # cannot be converted to UTF-8
65
+ # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
66
+ #
67
+ # @overload compile_file(filename, options = {})
68
+ # Return the compiled CSS rather than writing it to a file.
69
+ #
70
+ # @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
71
+ # @param options [{Symbol => Object}] An options hash;
72
+ # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
73
+ # @return [String] The compiled CSS.
74
+ #
75
+ # @overload compile_file(filename, css_filename, options = {})
76
+ # Write the compiled CSS to a file.
77
+ #
78
+ # @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
79
+ # @param options [{Symbol => Object}] An options hash;
80
+ # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
81
+ # @param css_filename [String] The location to which to write the compiled CSS.
82
+ def self.compile_file(filename, *args)
83
+ options = args.last.is_a?(Hash) ? args.pop : {}
84
+ css_filename = args.shift
85
+ result = Sass::Engine.for_file(filename, options).render
86
+ if css_filename
87
+ options[:css_filename] ||= css_filename
88
+ open(css_filename, "w") {|css_file| css_file.write(result)}
89
+ nil
90
+ else
91
+ result
92
+ end
93
+ end
94
+ end
95
+
96
+ require 'sass/logger'
97
+ require 'sass/util'
98
+
99
+ require 'sass/engine'
100
+ require 'sass/plugin' if defined?(Merb::Plugins)
101
+ require 'sass/railtie'
102
+ require 'sass/features'
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ Kernel.load File.join(File.dirname(__FILE__), '..', 'init.rb')
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require File.dirname(__FILE__) + '/test_helper'
4
+ require 'sass/engine'
5
+
6
+ class CacheTest < MiniTest::Test
7
+ @@cache_dir = "tmp/file_cache"
8
+
9
+ def setup
10
+ FileUtils.mkdir_p @@cache_dir
11
+ end
12
+
13
+ def teardown
14
+ FileUtils.rm_rf @@cache_dir
15
+ clean_up_sassc
16
+ end
17
+
18
+ def test_file_cache_writes_a_file
19
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
20
+ file_store.store("asdf/foo.scssc", "fakesha1", root_node)
21
+ assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
22
+ end
23
+
24
+ def test_file_cache_reads_a_file
25
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
26
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
27
+ file_store.store("asdf/foo.scssc", "fakesha1", root_node)
28
+ assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
29
+ assert_kind_of Sass::Tree::RootNode, file_store.retrieve("asdf/foo.scssc", "fakesha1")
30
+ end
31
+
32
+ def test_file_cache_miss_returns_nil
33
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
34
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
35
+ assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
36
+ end
37
+
38
+ def test_sha_change_invalidates_cache_and_cleans_up
39
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
40
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
41
+ file_store.store("asdf/foo.scssc", "fakesha1", root_node)
42
+ assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
43
+ assert_nil file_store.retrieve("asdf/foo.scssc", "differentsha1")
44
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
45
+ end
46
+
47
+ def test_version_change_invalidates_cache_and_cleans_up
48
+ file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
49
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
50
+ file_store.store("asdf/foo.scssc", "fakesha1", root_node)
51
+ assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
52
+ real_version = Sass::VERSION
53
+ begin
54
+ Sass::VERSION.replace("a different version")
55
+ assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
56
+ assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
57
+ ensure
58
+ Sass::VERSION.replace(real_version)
59
+ end
60
+ end
61
+
62
+ def test_arbitrary_objects_can_go_into_cache
63
+ cache = Sass::CacheStores::Memory.new
64
+ an_object = {:foo => :bar}
65
+ cache.store("an_object", "", an_object)
66
+ assert_equal an_object, cache.retrieve("an_object", "")
67
+ end
68
+
69
+ def test_cache_node_with_unmarshalable_option
70
+ engine_with_unmarshalable_options("foo {a: b + c}").to_tree
71
+ end
72
+
73
+ # Regression tests
74
+
75
+ def test_cache_mixin_def_splat_sass_node_with_unmarshalable_option
76
+ engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
77
+ =color($args...)
78
+ color: red
79
+ SASS
80
+ end
81
+
82
+ def test_cache_mixin_def_splat_scss_node_with_unmarshalable_option
83
+ engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
84
+ @mixin color($args...) {
85
+ color: red;
86
+ }
87
+ SCSS
88
+ end
89
+
90
+ def test_cache_function_splat_sass_node_with_unmarshalable_option
91
+ engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
92
+ @function color($args...)
93
+ @return red
94
+ SASS
95
+ end
96
+
97
+ def test_cache_function_splat_scss_node_with_unmarshalable_option
98
+ engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
99
+ @function color($args...) {
100
+ @return red;
101
+ }
102
+ SCSS
103
+ end
104
+
105
+ def test_cache_include_splat_sass_node_with_unmarshalable_option
106
+ engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
107
+ @include color($args..., $kwargs...)
108
+ SASS
109
+ end
110
+
111
+ def test_cache_include_splat_scss_node_with_unmarshalable_option
112
+ engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
113
+ @include color($args..., $kwargs...);
114
+ SCSS
115
+ end
116
+
117
+ private
118
+ def root_node
119
+ Sass::Engine.new(<<-SCSS, :syntax => :scss).to_tree
120
+ @mixin color($c) { color: $c}
121
+ div { @include color(red); }
122
+ SCSS
123
+ end
124
+
125
+ def engine_with_unmarshalable_options(src, options={})
126
+ Sass::Engine.new(src, {
127
+ :syntax => :scss, :object => Class.new.new, :filename => 'file.scss',
128
+ :importer => Sass::Importers::Filesystem.new(absolutize('templates'))
129
+ }.merge(options))
130
+ end
131
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require 'sass/callbacks'
4
+
5
+ class CallerBack
6
+ extend Sass::Callbacks
7
+ define_callback :foo
8
+ define_callback :bar
9
+
10
+ def do_foo
11
+ run_foo
12
+ end
13
+
14
+ def do_bar
15
+ run_bar 12
16
+ end
17
+ end
18
+
19
+ module ClassLevelCallerBack
20
+ extend Sass::Callbacks
21
+ define_callback :foo
22
+ extend self
23
+
24
+ def do_foo
25
+ run_foo
26
+ end
27
+ end
28
+
29
+ class SassCallbacksTest < MiniTest::Test
30
+ def test_simple_callback
31
+ cb = CallerBack.new
32
+ there = false
33
+ cb.on_foo {there = true}
34
+ cb.do_foo
35
+ assert there, "Expected callback to be called."
36
+ end
37
+
38
+ def test_multiple_callbacks
39
+ cb = CallerBack.new
40
+ str = ""
41
+ cb.on_foo {str += "first"}
42
+ cb.on_foo {str += " second"}
43
+ cb.do_foo
44
+ assert_equal "first second", str
45
+ end
46
+
47
+ def test_callback_with_arg
48
+ cb = CallerBack.new
49
+ val = nil
50
+ cb.on_bar {|a| val = a}
51
+ cb.do_bar
52
+ assert_equal 12, val
53
+ end
54
+
55
+ def test_class_level_callback
56
+ there = false
57
+ ClassLevelCallerBack.on_foo {there = true}
58
+ ClassLevelCallerBack.do_foo
59
+ assert there, "Expected callback to be called."
60
+ end
61
+ end
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env ruby
2
+ require 'minitest/autorun'
3
+ require File.dirname(__FILE__) + '/../test_helper'
4
+ require 'sass/plugin'
5
+ require 'sass/plugin/compiler'
6
+
7
+ class CompilerTest < MiniTest::Test
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
+ if Sass::Util.listen_geq_2?
86
+ options = args.pop if args.last.is_a?(Hash)
87
+ args.map do |dir|
88
+ @fake_listener = FakeListener.new(*args, &on_filesystem_event)
89
+ @fake_listener.on_start!(&run_during_start)
90
+ @fake_listener
91
+ end
92
+ else
93
+ @fake_listener = FakeListener.new(*args, &on_filesystem_event)
94
+ @fake_listener.on_start!(&run_during_start)
95
+ @fake_listener
96
+ end
97
+ end
98
+ end
99
+
100
+ def test_initialize
101
+ watcher
102
+ end
103
+
104
+ def test_watch_starts_the_listener
105
+ start_called = false
106
+ c = watcher do |listener|
107
+ start_called = true
108
+ end
109
+ c.watch
110
+ assert start_called, "start! was not called"
111
+ end
112
+
113
+ def test_sass_callbacks_fire_from_listener_events
114
+ c = watcher do |listener|
115
+ listener.changed "changed.scss"
116
+ listener.added "added.scss"
117
+ listener.removed "removed.scss"
118
+ listener.fire_events!
119
+ end
120
+
121
+ modified_fired = false
122
+ c.on_template_modified do |sass_file|
123
+ modified_fired = true
124
+ assert_equal "changed.scss", sass_file
125
+ end
126
+
127
+ added_fired = false
128
+ c.on_template_created do |sass_file|
129
+ added_fired = true
130
+ assert_equal "added.scss", sass_file
131
+ end
132
+
133
+ removed_fired = false
134
+ c.on_template_deleted do |sass_file|
135
+ removed_fired = true
136
+ assert_equal "removed.scss", sass_file
137
+ end
138
+
139
+ c.watch
140
+
141
+ assert_equal 2, c.update_stylesheets_times
142
+ assert modified_fired
143
+ assert added_fired
144
+ assert removed_fired
145
+ end
146
+
147
+ def test_removing_a_sass_file_removes_corresponding_css_file
148
+ c = watcher do |listener|
149
+ listener.removed "remove_me.scss"
150
+ listener.fire_events!
151
+ end
152
+
153
+ c.watch
154
+
155
+ assert_equal "./remove_me.css", c.deleted_css_files.first
156
+ end
157
+
158
+ def test_an_importer_can_watch_an_image
159
+ image_importer = Sass::Importers::Filesystem.new(".")
160
+ class << image_importer
161
+ def watched_file?(filename)
162
+ filename =~ /\.png$/
163
+ end
164
+ end
165
+ c = watcher(:load_paths => [image_importer]) do |listener|
166
+ listener.changed "image.png"
167
+ listener.fire_events!
168
+ end
169
+
170
+ modified_fired = false
171
+ c.on_template_modified do |f|
172
+ modified_fired = true
173
+ assert_equal "image.png", f
174
+ end
175
+
176
+ c.watch
177
+
178
+ assert_equal 2, c.update_stylesheets_times
179
+ assert modified_fired
180
+ end
181
+
182
+ def test_watching_specific_files_and_one_is_deleted
183
+ directories = nil
184
+ c = watcher do |listener|
185
+ directories = listener.directories
186
+ listener.removed File.expand_path("./foo.scss")
187
+ listener.fire_events!
188
+ end
189
+ c.watch([[File.expand_path("./foo.scss"), File.expand_path("./foo.css"), nil]])
190
+ assert directories.include?(File.expand_path(".")), directories.inspect
191
+ assert_equal File.expand_path("./foo.css"), c.deleted_css_files.first, "the corresponding css file was not deleted"
192
+ assert_equal [], c.update_stylesheets_called_with[1], "the sass file should not have been compiled"
193
+ end
194
+
195
+ def test_watched_directories_are_dedupped
196
+ directories = nil
197
+ c = watcher(:load_paths => [".", "./foo", "."]) do |listener|
198
+ directories = listener.directories
199
+ end
200
+ c.watch
201
+ assert_equal [File.expand_path(".")], directories
202
+ end
203
+
204
+ def test_a_changed_css_in_a_watched_directory_does_not_force_a_compile
205
+ c = watcher do |listener|
206
+ listener.changed "foo.css"
207
+ listener.fire_events!
208
+ end
209
+
210
+ c.on_template_modified do |f|
211
+ assert false, "Should not have been called"
212
+ end
213
+
214
+ c.watch
215
+
216
+ assert_equal 1, c.update_stylesheets_times
217
+ end
218
+
219
+ private
220
+
221
+ def default_options
222
+ {:template_location => [[".","."]]}
223
+ end
224
+
225
+ def watcher(options = {}, &run_during_start)
226
+ options = default_options.merge(options)
227
+ watcher = Sass::Plugin::Compiler.new(options)
228
+ watcher.extend(MockWatcher)
229
+ watcher.run_during_start = run_during_start
230
+ watcher
231
+ end
232
+ end