haml 3.0.21 → 3.0.22

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (195) hide show
  1. data/Rakefile +1 -41
  2. data/VERSION +1 -1
  3. data/lib/haml/precompiler.rb +8 -6
  4. data/lib/haml/template/plugin.rb +16 -6
  5. data/lib/sass/less.rb +31 -12
  6. data/lib/sass/script/funcall.rb +2 -1
  7. data/lib/sass/script/operation.rb +10 -5
  8. data/lib/sass/script/parser.rb +9 -0
  9. data/test/haml/engine_test.rb +25 -0
  10. data/test/sass/less_conversion_test.rb +24 -3
  11. data/test/sass/script_conversion_test.rb +60 -0
  12. metadata +243 -426
  13. data/vendor/sass/CONTRIBUTING +0 -3
  14. data/vendor/sass/MIT-LICENSE +0 -20
  15. data/vendor/sass/README.md +0 -201
  16. data/vendor/sass/Rakefile +0 -363
  17. data/vendor/sass/TODO +0 -39
  18. data/vendor/sass/VERSION +0 -1
  19. data/vendor/sass/VERSION_NAME +0 -1
  20. data/vendor/sass/bin/css2sass +0 -13
  21. data/vendor/sass/bin/sass +0 -8
  22. data/vendor/sass/bin/sass-convert +0 -7
  23. data/vendor/sass/doc-src/FAQ.md +0 -35
  24. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +0 -210
  25. data/vendor/sass/doc-src/SASS_CHANGELOG.md +0 -1870
  26. data/vendor/sass/doc-src/SASS_REFERENCE.md +0 -1713
  27. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +0 -155
  28. data/vendor/sass/ext/extconf.rb +0 -10
  29. data/vendor/sass/extra/update_watch.rb +0 -13
  30. data/vendor/sass/init.rb +0 -18
  31. data/vendor/sass/lib/sass.rb +0 -71
  32. data/vendor/sass/lib/sass/cache_store.rb +0 -208
  33. data/vendor/sass/lib/sass/callbacks.rb +0 -66
  34. data/vendor/sass/lib/sass/css.rb +0 -294
  35. data/vendor/sass/lib/sass/engine.rb +0 -792
  36. data/vendor/sass/lib/sass/environment.rb +0 -143
  37. data/vendor/sass/lib/sass/error.rb +0 -201
  38. data/vendor/sass/lib/sass/exec.rb +0 -619
  39. data/vendor/sass/lib/sass/importers.rb +0 -22
  40. data/vendor/sass/lib/sass/importers/base.rb +0 -138
  41. data/vendor/sass/lib/sass/importers/filesystem.rb +0 -121
  42. data/vendor/sass/lib/sass/less.rb +0 -363
  43. data/vendor/sass/lib/sass/plugin.rb +0 -126
  44. data/vendor/sass/lib/sass/plugin/compiler.rb +0 -346
  45. data/vendor/sass/lib/sass/plugin/configuration.rb +0 -123
  46. data/vendor/sass/lib/sass/plugin/generic.rb +0 -15
  47. data/vendor/sass/lib/sass/plugin/merb.rb +0 -48
  48. data/vendor/sass/lib/sass/plugin/rack.rb +0 -47
  49. data/vendor/sass/lib/sass/plugin/rails.rb +0 -41
  50. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +0 -145
  51. data/vendor/sass/lib/sass/railtie.rb +0 -8
  52. data/vendor/sass/lib/sass/repl.rb +0 -58
  53. data/vendor/sass/lib/sass/root.rb +0 -7
  54. data/vendor/sass/lib/sass/script.rb +0 -63
  55. data/vendor/sass/lib/sass/script/bool.rb +0 -18
  56. data/vendor/sass/lib/sass/script/color.rb +0 -491
  57. data/vendor/sass/lib/sass/script/css_lexer.rb +0 -29
  58. data/vendor/sass/lib/sass/script/css_parser.rb +0 -31
  59. data/vendor/sass/lib/sass/script/funcall.rb +0 -79
  60. data/vendor/sass/lib/sass/script/functions.rb +0 -852
  61. data/vendor/sass/lib/sass/script/interpolation.rb +0 -70
  62. data/vendor/sass/lib/sass/script/lexer.rb +0 -337
  63. data/vendor/sass/lib/sass/script/literal.rb +0 -236
  64. data/vendor/sass/lib/sass/script/node.rb +0 -101
  65. data/vendor/sass/lib/sass/script/number.rb +0 -423
  66. data/vendor/sass/lib/sass/script/operation.rb +0 -92
  67. data/vendor/sass/lib/sass/script/parser.rb +0 -392
  68. data/vendor/sass/lib/sass/script/string.rb +0 -67
  69. data/vendor/sass/lib/sass/script/string_interpolation.rb +0 -93
  70. data/vendor/sass/lib/sass/script/unary_operation.rb +0 -57
  71. data/vendor/sass/lib/sass/script/variable.rb +0 -48
  72. data/vendor/sass/lib/sass/scss.rb +0 -17
  73. data/vendor/sass/lib/sass/scss/css_parser.rb +0 -51
  74. data/vendor/sass/lib/sass/scss/parser.rb +0 -838
  75. data/vendor/sass/lib/sass/scss/rx.rb +0 -126
  76. data/vendor/sass/lib/sass/scss/sass_parser.rb +0 -11
  77. data/vendor/sass/lib/sass/scss/script_lexer.rb +0 -15
  78. data/vendor/sass/lib/sass/scss/script_parser.rb +0 -25
  79. data/vendor/sass/lib/sass/scss/static_parser.rb +0 -40
  80. data/vendor/sass/lib/sass/selector.rb +0 -361
  81. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +0 -62
  82. data/vendor/sass/lib/sass/selector/comma_sequence.rb +0 -82
  83. data/vendor/sass/lib/sass/selector/sequence.rb +0 -236
  84. data/vendor/sass/lib/sass/selector/simple.rb +0 -113
  85. data/vendor/sass/lib/sass/selector/simple_sequence.rb +0 -135
  86. data/vendor/sass/lib/sass/shared.rb +0 -78
  87. data/vendor/sass/lib/sass/tree/comment_node.rb +0 -128
  88. data/vendor/sass/lib/sass/tree/debug_node.rb +0 -36
  89. data/vendor/sass/lib/sass/tree/directive_node.rb +0 -75
  90. data/vendor/sass/lib/sass/tree/extend_node.rb +0 -65
  91. data/vendor/sass/lib/sass/tree/for_node.rb +0 -67
  92. data/vendor/sass/lib/sass/tree/if_node.rb +0 -81
  93. data/vendor/sass/lib/sass/tree/import_node.rb +0 -124
  94. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +0 -60
  95. data/vendor/sass/lib/sass/tree/mixin_node.rb +0 -123
  96. data/vendor/sass/lib/sass/tree/node.rb +0 -490
  97. data/vendor/sass/lib/sass/tree/prop_node.rb +0 -220
  98. data/vendor/sass/lib/sass/tree/root_node.rb +0 -125
  99. data/vendor/sass/lib/sass/tree/rule_node.rb +0 -273
  100. data/vendor/sass/lib/sass/tree/variable_node.rb +0 -39
  101. data/vendor/sass/lib/sass/tree/warn_node.rb +0 -42
  102. data/vendor/sass/lib/sass/tree/while_node.rb +0 -48
  103. data/vendor/sass/lib/sass/util.rb +0 -700
  104. data/vendor/sass/lib/sass/util/subset_map.rb +0 -101
  105. data/vendor/sass/lib/sass/version.rb +0 -109
  106. data/vendor/sass/rails/init.rb +0 -1
  107. data/vendor/sass/sass.gemspec +0 -32
  108. data/vendor/sass/test/sass/cache_test.rb +0 -74
  109. data/vendor/sass/test/sass/callbacks_test.rb +0 -61
  110. data/vendor/sass/test/sass/conversion_test.rb +0 -1210
  111. data/vendor/sass/test/sass/css2sass_test.rb +0 -364
  112. data/vendor/sass/test/sass/data/hsl-rgb.txt +0 -319
  113. data/vendor/sass/test/sass/engine_test.rb +0 -2283
  114. data/vendor/sass/test/sass/extend_test.rb +0 -1348
  115. data/vendor/sass/test/sass/functions_test.rb +0 -565
  116. data/vendor/sass/test/sass/importer_test.rb +0 -104
  117. data/vendor/sass/test/sass/less_conversion_test.rb +0 -632
  118. data/vendor/sass/test/sass/mock_importer.rb +0 -49
  119. data/vendor/sass/test/sass/more_results/more1.css +0 -9
  120. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +0 -26
  121. data/vendor/sass/test/sass/more_results/more_import.css +0 -29
  122. data/vendor/sass/test/sass/more_templates/_more_partial.sass +0 -2
  123. data/vendor/sass/test/sass/more_templates/more1.sass +0 -23
  124. data/vendor/sass/test/sass/more_templates/more_import.sass +0 -11
  125. data/vendor/sass/test/sass/plugin_test.rb +0 -430
  126. data/vendor/sass/test/sass/results/alt.css +0 -4
  127. data/vendor/sass/test/sass/results/basic.css +0 -9
  128. data/vendor/sass/test/sass/results/compact.css +0 -5
  129. data/vendor/sass/test/sass/results/complex.css +0 -86
  130. data/vendor/sass/test/sass/results/compressed.css +0 -1
  131. data/vendor/sass/test/sass/results/expanded.css +0 -19
  132. data/vendor/sass/test/sass/results/import.css +0 -31
  133. data/vendor/sass/test/sass/results/line_numbers.css +0 -49
  134. data/vendor/sass/test/sass/results/mixins.css +0 -95
  135. data/vendor/sass/test/sass/results/multiline.css +0 -24
  136. data/vendor/sass/test/sass/results/nested.css +0 -22
  137. data/vendor/sass/test/sass/results/options.css +0 -1
  138. data/vendor/sass/test/sass/results/parent_ref.css +0 -13
  139. data/vendor/sass/test/sass/results/script.css +0 -16
  140. data/vendor/sass/test/sass/results/scss_import.css +0 -31
  141. data/vendor/sass/test/sass/results/scss_importee.css +0 -2
  142. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +0 -1
  143. data/vendor/sass/test/sass/results/subdir/subdir.css +0 -3
  144. data/vendor/sass/test/sass/results/units.css +0 -11
  145. data/vendor/sass/test/sass/results/warn.css +0 -0
  146. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  147. data/vendor/sass/test/sass/script_conversion_test.rb +0 -254
  148. data/vendor/sass/test/sass/script_test.rb +0 -470
  149. data/vendor/sass/test/sass/scss/css_test.rb +0 -897
  150. data/vendor/sass/test/sass/scss/rx_test.rb +0 -156
  151. data/vendor/sass/test/sass/scss/scss_test.rb +0 -1088
  152. data/vendor/sass/test/sass/scss/test_helper.rb +0 -37
  153. data/vendor/sass/test/sass/templates/_partial.sass +0 -2
  154. data/vendor/sass/test/sass/templates/alt.sass +0 -16
  155. data/vendor/sass/test/sass/templates/basic.sass +0 -23
  156. data/vendor/sass/test/sass/templates/bork1.sass +0 -2
  157. data/vendor/sass/test/sass/templates/bork2.sass +0 -2
  158. data/vendor/sass/test/sass/templates/bork3.sass +0 -2
  159. data/vendor/sass/test/sass/templates/bork4.sass +0 -2
  160. data/vendor/sass/test/sass/templates/compact.sass +0 -17
  161. data/vendor/sass/test/sass/templates/complex.sass +0 -305
  162. data/vendor/sass/test/sass/templates/compressed.sass +0 -15
  163. data/vendor/sass/test/sass/templates/expanded.sass +0 -17
  164. data/vendor/sass/test/sass/templates/import.sass +0 -12
  165. data/vendor/sass/test/sass/templates/importee.less +0 -2
  166. data/vendor/sass/test/sass/templates/importee.sass +0 -19
  167. data/vendor/sass/test/sass/templates/line_numbers.sass +0 -13
  168. data/vendor/sass/test/sass/templates/mixin_bork.sass +0 -5
  169. data/vendor/sass/test/sass/templates/mixins.sass +0 -76
  170. data/vendor/sass/test/sass/templates/multiline.sass +0 -20
  171. data/vendor/sass/test/sass/templates/nested.sass +0 -25
  172. data/vendor/sass/test/sass/templates/nested_bork1.sass +0 -2
  173. data/vendor/sass/test/sass/templates/nested_bork2.sass +0 -2
  174. data/vendor/sass/test/sass/templates/nested_bork3.sass +0 -2
  175. data/vendor/sass/test/sass/templates/nested_bork4.sass +0 -2
  176. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +0 -6
  177. data/vendor/sass/test/sass/templates/options.sass +0 -2
  178. data/vendor/sass/test/sass/templates/parent_ref.sass +0 -25
  179. data/vendor/sass/test/sass/templates/script.sass +0 -101
  180. data/vendor/sass/test/sass/templates/scss_import.scss +0 -11
  181. data/vendor/sass/test/sass/templates/scss_importee.scss +0 -1
  182. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +0 -2
  183. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +0 -3
  184. data/vendor/sass/test/sass/templates/subdir/subdir.sass +0 -6
  185. data/vendor/sass/test/sass/templates/units.sass +0 -11
  186. data/vendor/sass/test/sass/templates/warn.sass +0 -3
  187. data/vendor/sass/test/sass/templates/warn_imported.sass +0 -4
  188. data/vendor/sass/test/sass/test_helper.rb +0 -8
  189. data/vendor/sass/test/sass/util/subset_map_test.rb +0 -91
  190. data/vendor/sass/test/sass/util_test.rb +0 -275
  191. data/vendor/sass/test/test_helper.rb +0 -64
  192. data/vendor/sass/yard/callbacks.rb +0 -29
  193. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +0 -26
  194. data/vendor/sass/yard/default/layout/html/footer.erb +0 -12
  195. data/vendor/sass/yard/inherited_hash.rb +0 -41
@@ -1,155 +0,0 @@
1
- # Intro to SCSS for Sass Users
2
-
3
- Sass 3 introduces a new syntax known as SCSS
4
- which is fully compatible with the syntax of CSS3,
5
- while still supporting the full power of Sass.
6
- This means that every valid CSS3 stylesheet
7
- is a valid SCSS file with the same meaning.
8
- In addition, SCSS understands most CSS hacks
9
- and vendor-specific syntax, such as [IE's old `filter` syntax](http://msdn.microsoft.com/en-us/library/ms533754%28VS.85%29.aspx).
10
-
11
- Since SCSS is a CSS extension,
12
- everything that works in CSS works in SCSS.
13
- This means that for a Sass user to understand it,
14
- they need only understand how the Sass extensions work.
15
- Most of these, such as variables, parent references, and directives work the same;
16
- the only difference is that SCSS requires semicolons
17
- and brackets instead of newlines and indentation.
18
- For example, a simple rule in Sass:
19
-
20
- #sidebar
21
- width: 30%
22
- background-color: #faa
23
-
24
- could be converted to SCSS just by adding brackets and semicolons:
25
-
26
- #sidebar {
27
- width: 30%;
28
- background-color: #faa;
29
- }
30
-
31
- In addition, SCSS is completely whitespace-insensitive.
32
- That means the above could also be written as:
33
-
34
- #sidebar {width: 30%; background-color: #faa}
35
-
36
- There are some differences that are slightly more complicated.
37
- These are detailed below.
38
- Note, though, that SCSS uses all the
39
- {file:SASS_CHANGELOG.md#3-0-0-syntax-changes syntax changes in Sass 3},
40
- so make sure you understand those before going forward.
41
-
42
- ## Nested Selectors
43
-
44
- To nest selectors, simply define a new ruleset
45
- inside an existing ruleset:
46
-
47
- #sidebar {
48
- a { text-decoration: none; }
49
- }
50
-
51
- Of course, white space is insignificant
52
- and the last trailing semicolon is optional
53
- so you can also do it like this:
54
-
55
- #sidebar { a { text-decoration: none } }
56
-
57
- ## Nested Properties
58
-
59
- To nest properties,
60
- simply create a new property set
61
- after an existing property's colon:
62
-
63
- #footer {
64
- border: {
65
- width: 1px;
66
- color: #ccc;
67
- style: solid;
68
- }
69
- }
70
-
71
- This compiles to:
72
-
73
- #footer {
74
- border-width: 1px;
75
- border-color: #cccccc;
76
- border-style: solid; }
77
-
78
- ## Mixins
79
-
80
- A mixin is declared with the `@mixin` directive:
81
-
82
- @mixin rounded($amount) {
83
- -moz-border-radius: $amount;
84
- -webkit-border-radius: $amount;
85
- border-radius: $amount;
86
- }
87
-
88
- A mixin is used with the `@include` directive:
89
-
90
- .box {
91
- border: 3px solid #777;
92
- @include rounded(0.5em);
93
- }
94
-
95
- This syntax is also available in the indented syntax,
96
- although the old `=` and `+` syntax still works.
97
-
98
- This is rather verbose compared to the `=` and `+` characters used in Sass syntax.
99
- This is because the SCSS format is designed for CSS compatibility rather than conciseness,
100
- and creating new syntax when the CSS directive syntax already exists
101
- adds new syntax needlessly and
102
- could create incompatibilities with future versions of CSS.
103
-
104
- ## Comments
105
-
106
- Like Sass, SCSS supports both comments that are preserved in the CSS output
107
- and comments that aren't.
108
- However, SCSS's comments are significantly more flexible.
109
- It supports standard multiline CSS comments with `/* */`,
110
- which are preserved where possible in the output.
111
- These comments can have whatever formatting you like;
112
- Sass will do its best to format them nicely.
113
-
114
- SCSS also uses `//` for comments that are thrown away, like Sass.
115
- Unlike Sass, though, `//` comments in SCSS may appear anywhere
116
- and last only until the end of the line.
117
-
118
- For example:
119
-
120
- /* This comment is
121
- * several lines long.
122
- * since it uses the CSS comment syntax,
123
- * it will appear in the CSS output. */
124
- body { color: black; }
125
-
126
- // These comments are only one line long each.
127
- // They won't appear in the CSS output,
128
- // since they use the single-line comment syntax.
129
- a { color: green; }
130
-
131
- is compiled to:
132
-
133
- /* This comment is
134
- * several lines long.
135
- * since it uses the CSS comment syntax,
136
- * it will appear in the CSS output. */
137
- body {
138
- color: black; }
139
-
140
- a {
141
- color: green; }
142
-
143
- ## `@import`
144
-
145
- The `@import` directive in SCSS functions just like that in Sass,
146
- except that it takes a quoted string to import.
147
- For example, this Sass:
148
-
149
- @import themes/dark
150
- @import font.sass
151
-
152
- would be this SCSS:
153
-
154
- @import "themes/dark";
155
- @import "font.sass";
@@ -1,10 +0,0 @@
1
- root = File.expand_path("../..", __FILE__)
2
- File.open(File.expand_path("lib/sass/root.rb", root), "w") do |f|
3
- f << <<-RUBY
4
- module Sass
5
- ROOT_DIR = #{root.inspect}
6
- end
7
- RUBY
8
- end
9
-
10
- File.open('Makefile', 'w') { |f| f.puts("install:\n\t$(exit 0)") }
@@ -1,13 +0,0 @@
1
- require 'rubygems'
2
- require 'sinatra'
3
- require 'json'
4
- set :port, 3124
5
- set :environment, :production
6
- enable :lock
7
- Dir.chdir(File.dirname(__FILE__) + "/..")
8
-
9
- post "/" do
10
- puts "Recieved payload!"
11
- puts "Rev: #{`git name-rev HEAD`.strip}"
12
- system %{rake handle_update --trace REF=#{JSON.parse(params["payload"])["ref"].inspect}}
13
- end
@@ -1,18 +0,0 @@
1
- begin
2
- require File.join(File.dirname(__FILE__), 'lib', 'sass') # From here
3
- rescue LoadError
4
- begin
5
- require 'sass' # From gem
6
- rescue LoadError => e
7
- # gems:install may be run to install Haml with the skeleton plugin
8
- # but not the gem itself installed.
9
- # Don't die if this is the case.
10
- raise e unless defined?(Rake) &&
11
- (Rake.application.top_level_tasks.include?('gems') ||
12
- Rake.application.top_level_tasks.include?('gems:install'))
13
- end
14
- end
15
-
16
- # Load Sass.
17
- # Sass may be undefined if we're running gems:install.
18
- require 'sass/plugin' if defined?(Sass)
@@ -1,71 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- $LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
3
-
4
- # This is necessary to set so that the Haml code that tries to load Sass
5
- # knows that Sass is indeed loading,
6
- # even if there's some crazy autoload stuff going on.
7
- SASS_BEGUN_TO_LOAD = true unless defined?(SASS_BEGUN_TO_LOAD)
8
-
9
- require 'sass/version'
10
-
11
- # The module that contains everything Sass-related:
12
- #
13
- # * {Sass::Engine} is the class used to render Sass/SCSS within Ruby code.
14
- # * {Sass::Plugin} is interfaces with web frameworks (Rails and Merb in particular).
15
- # * {Sass::SyntaxError} is raised when Sass encounters an error.
16
- # * {Sass::CSS} handles conversion of CSS to Sass.
17
- #
18
- # Also see the {file:SASS_REFERENCE.md full Sass reference}.
19
- module Sass
20
- # Compile a Sass or SCSS string to CSS.
21
- # Defaults to SCSS.
22
- #
23
- # @param contents [String] The contents of the Sass file.
24
- # @param options [{Symbol => Object}] An options hash;
25
- # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
26
- # @raise [Sass::SyntaxError] if there's an error in the document
27
- # @raise [Encoding::UndefinedConversionError] if the source encoding
28
- # cannot be converted to UTF-8
29
- # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
30
- def self.compile(contents, options = {})
31
- options[:syntax] ||= :scss
32
- Engine.new(contents, options).to_css
33
- end
34
-
35
- # Compile a file on disk to CSS.
36
- #
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
- # @raise [Sass::SyntaxError] if there's an error in the document
41
- # @raise [Encoding::UndefinedConversionError] if the source encoding
42
- # cannot be converted to UTF-8
43
- # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
44
- #
45
- # @overload compile_file(filename, options = {})
46
- # @return [String] The compiled CSS.
47
- #
48
- # @overload compile_file(filename, css_filename, options = {})
49
- # @param css_filename [String] The location to which to write the compiled CSS.
50
- def self.compile_file(filename, *args)
51
- options = args.last.is_a?(Hash) ? args.pop : {}
52
- css_filename ||= args.shift
53
- options[:css_filename] = css_filename
54
- result = Sass::Engine.for_file(filename, options).render
55
- if css_filename
56
- open(css_filename,"w") {|css_file| css_file.write(result) }
57
- nil
58
- else
59
- result
60
- end
61
- end
62
- end
63
-
64
- require 'sass/util'
65
-
66
- dir = Sass::Util.scope("vendor/fssm/lib")
67
- $LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
68
-
69
- require 'sass/engine'
70
- require 'sass/plugin' if defined?(Merb::Plugins)
71
- require 'sass/railtie'
@@ -1,208 +0,0 @@
1
- require 'stringio'
2
-
3
- module Sass
4
- # An abstract base class for backends for the Sass cache.
5
- # Any key-value store can act as such a backend;
6
- # it just needs to implement the
7
- # \{#_store} and \{#_retrieve} methods.
8
- #
9
- # To use a cache store with Sass,
10
- # use the {file:SASS_REFERENCE.md#cache_store-option `:cache_store` option}.
11
- class CacheStore
12
- # Store cached contents for later retrieval
13
- # Must be implemented by all CacheStore subclasses
14
- #
15
- # Note: cache contents contain binary data.
16
- #
17
- # @param key [String] The key to store the contents under
18
- # @param version [String] The current sass version.
19
- # Cached contents must not be retrieved across different versions of sass.
20
- # @param sha [String] The sha of the sass source.
21
- # Cached contents must not be retrieved if the sha has changed.
22
- # @param contents [String] The contents to store.
23
- def _store(key, version, sha, contents)
24
- raise "#{self.class} must implement #_store."
25
- end
26
-
27
- # Retrieved cached contents.
28
- # Must be implemented by all subclasses.
29
- #
30
- # Note: if the key exists but the sha or version have changed,
31
- # then the key may be deleted by the cache store, if it wants to do so.
32
- #
33
- # @param key [String] The key to retrieve
34
- # @param version [String] The current sass version.
35
- # Cached contents must not be retrieved across different versions of sass.
36
- # @param sha [String] The sha of the sass source.
37
- # Cached contents must not be retrieved if the sha has changed.
38
- # @return [String] The contents that were previously stored.
39
- # @return [NilClass] when the cache key is not found or the version or sha have changed.
40
- def _retrieve(key, version, sha)
41
- raise "#{self.class} must implement #_retrieve."
42
- end
43
-
44
- # Store a {Sass::Tree::RootNode}.
45
- #
46
- # @param key [String] The key to store it under.
47
- # @param sha [String] The checksum for the contents that are being stored.
48
- # @param obj [Object] The object to cache.
49
- def store(key, sha, root)
50
- _store(key, Sass::VERSION, sha, Sass::Util.dump(root))
51
- end
52
-
53
- # Retrieve a {Sass::Tree::RootNode}.
54
- #
55
- # @param key [String] The key the root element was stored under.
56
- # @param sha [String] The checksum of the root element's content.
57
- # @return [Object] The cached object.
58
- def retrieve(key, sha)
59
- contents = _retrieve(key, Sass::VERSION, sha)
60
- Sass::Util.load(contents) if contents
61
- rescue EOFError, TypeError, ArgumentError => e
62
- raise
63
- Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
64
- end
65
-
66
- # Return the key for the sass file.
67
- #
68
- # The `(sass_dirname, sass_basename)` pair
69
- # should uniquely identify the Sass document,
70
- # but otherwise there are no restrictions on their content.
71
- #
72
- # @param sass_dirname [String]
73
- # The fully-expanded location of the Sass file.
74
- # This corresponds to the directory name on a filesystem.
75
- # @param sass_basename [String] The name of the Sass file that is being referenced.
76
- # This corresponds to the basename on a filesystem.
77
- def key(sass_dirname, sass_basename)
78
- dir = Digest::SHA1.hexdigest(sass_dirname)
79
- filename = "#{sass_basename}c"
80
- "#{dir}/#{filename}"
81
- end
82
- end
83
-
84
- # A backend for the Sass cache using the filesystem.
85
- class FileCacheStore < CacheStore
86
- # The directory where the cached files will be stored.
87
- #
88
- # @return [String]
89
- attr_accessor :cache_location
90
-
91
- # Create a new FileCacheStore.
92
- #
93
- # @param cache_location [String] see \{#cache\_location}
94
- def initialize(cache_location)
95
- @cache_location = cache_location
96
- end
97
-
98
- # @see {CacheStore#\_retrieve\_}
99
- def _retrieve(key, version, sha)
100
- return unless File.readable?(path_to(key))
101
- contents = nil
102
- File.open(path_to(key), "rb") do |f|
103
- if f.readline("\n").strip == version && f.readline("\n").strip == sha
104
- return f.read
105
- end
106
- end
107
- File.unlink path_to(key)
108
- nil
109
- rescue EOFError, TypeError, ArgumentError => e
110
- Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
111
- end
112
-
113
- # @see {CacheStore#\_store\_}
114
- def _store(key, version, sha, contents)
115
- return unless File.writable?(File.dirname(@cache_location))
116
- return if File.exists?(@cache_location) && !File.writable?(@cache_location)
117
- compiled_filename = path_to(key)
118
- return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
119
- return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
120
- FileUtils.mkdir_p(File.dirname(compiled_filename))
121
- File.open(compiled_filename, "wb") do |f|
122
- f.puts(version)
123
- f.puts(sha)
124
- f.write(contents)
125
- end
126
- end
127
-
128
- private
129
-
130
- # Returns the path to a file for the given key.
131
- #
132
- # @param key [String]
133
- # @return [String] The path to the cache file.
134
- def path_to(key)
135
- File.join(cache_location, key)
136
- end
137
- end
138
-
139
- # A backend for the Sass cache using in-process memory.
140
- class InMemoryCacheStore < CacheStore
141
- # Since the {InMemoryCacheStore} is stored in the Sass tree's options hash,
142
- # when the options get serialized as part of serializing the tree,
143
- # you get crazy exponential growth in the size of the cached objects
144
- # unless you don't dump the cache.
145
- #
146
- # @private
147
- def _dump(depth)
148
- ""
149
- end
150
-
151
- # If we deserialize this class, just make a new empty one.
152
- #
153
- # @private
154
- def self._load(repr)
155
- InMemoryCacheStore.new
156
- end
157
-
158
- # Create a new, empty cache store.
159
- def initialize
160
- @contents = {}
161
- end
162
-
163
- # @see CacheStore#_retrieve
164
- def _retrieve(key, version, sha)
165
- if @contents.has_key?(key)
166
- return unless @contents[key][:version] == version
167
- return unless @contents[key][:sha] == sha
168
- return @contents[key][:contents]
169
- end
170
- end
171
-
172
- # @see CacheStore#_store
173
- def _store(key, version, sha, contents)
174
- @contents[key] = {
175
- :version => version,
176
- :sha => sha,
177
- :contents => contents
178
- }
179
- end
180
-
181
- # Destructively clear the cache.
182
- def reset!
183
- @contents = {}
184
- end
185
- end
186
-
187
- # Doesn't store anything, but records what things it should have stored.
188
- # This doesn't currently have any use except for testing and debugging.
189
- #
190
- # @private
191
- class NullCacheStore < CacheStore
192
- def initialize
193
- @keys = {}
194
- end
195
-
196
- def _retrieve(key, version, sha)
197
- nil
198
- end
199
-
200
- def _store(key, version, sha, contents)
201
- @keys[key] = true
202
- end
203
-
204
- def was_set?(key)
205
- @keys[key]
206
- end
207
- end
208
- end