piko-fast-gem 0.0.1

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.

Potentially problematic release.


This version of piko-fast-gem might be problematic. Click here for more details.

Files changed (211) hide show
  1. checksums.yaml +7 -0
  2. data/piko-fast-gem.gemspec +11 -0
  3. data/sassc-2.4.0/CHANGELOG.md +97 -0
  4. data/sassc-2.4.0/CODE_OF_CONDUCT.md +10 -0
  5. data/sassc-2.4.0/Gemfile +2 -0
  6. data/sassc-2.4.0/LICENSE.txt +22 -0
  7. data/sassc-2.4.0/README.md +68 -0
  8. data/sassc-2.4.0/Rakefile +51 -0
  9. data/sassc-2.4.0/ext/depend +4 -0
  10. data/sassc-2.4.0/ext/extconf.rb +92 -0
  11. data/sassc-2.4.0/ext/libsass/VERSION +1 -0
  12. data/sassc-2.4.0/ext/libsass/contrib/plugin.cpp +60 -0
  13. data/sassc-2.4.0/ext/libsass/include/sass/base.h +97 -0
  14. data/sassc-2.4.0/ext/libsass/include/sass/context.h +174 -0
  15. data/sassc-2.4.0/ext/libsass/include/sass/functions.h +139 -0
  16. data/sassc-2.4.0/ext/libsass/include/sass/values.h +145 -0
  17. data/sassc-2.4.0/ext/libsass/include/sass/version.h +12 -0
  18. data/sassc-2.4.0/ext/libsass/include/sass.h +15 -0
  19. data/sassc-2.4.0/ext/libsass/include/sass2scss.h +120 -0
  20. data/sassc-2.4.0/ext/libsass/src/MurmurHash2.hpp +91 -0
  21. data/sassc-2.4.0/ext/libsass/src/ast.cpp +953 -0
  22. data/sassc-2.4.0/ext/libsass/src/ast.hpp +1064 -0
  23. data/sassc-2.4.0/ext/libsass/src/ast2c.cpp +80 -0
  24. data/sassc-2.4.0/ext/libsass/src/ast2c.hpp +39 -0
  25. data/sassc-2.4.0/ext/libsass/src/ast_def_macros.hpp +140 -0
  26. data/sassc-2.4.0/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  27. data/sassc-2.4.0/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  28. data/sassc-2.4.0/ext/libsass/src/ast_helpers.hpp +292 -0
  29. data/sassc-2.4.0/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  30. data/sassc-2.4.0/ext/libsass/src/ast_sel_super.cpp +539 -0
  31. data/sassc-2.4.0/ext/libsass/src/ast_sel_unify.cpp +275 -0
  32. data/sassc-2.4.0/ext/libsass/src/ast_sel_weave.cpp +616 -0
  33. data/sassc-2.4.0/ext/libsass/src/ast_selectors.cpp +1043 -0
  34. data/sassc-2.4.0/ext/libsass/src/ast_selectors.hpp +522 -0
  35. data/sassc-2.4.0/ext/libsass/src/ast_supports.cpp +114 -0
  36. data/sassc-2.4.0/ext/libsass/src/ast_supports.hpp +121 -0
  37. data/sassc-2.4.0/ext/libsass/src/ast_values.cpp +1154 -0
  38. data/sassc-2.4.0/ext/libsass/src/ast_values.hpp +498 -0
  39. data/sassc-2.4.0/ext/libsass/src/b64/cencode.h +32 -0
  40. data/sassc-2.4.0/ext/libsass/src/b64/encode.h +79 -0
  41. data/sassc-2.4.0/ext/libsass/src/backtrace.cpp +50 -0
  42. data/sassc-2.4.0/ext/libsass/src/backtrace.hpp +29 -0
  43. data/sassc-2.4.0/ext/libsass/src/base64vlq.cpp +47 -0
  44. data/sassc-2.4.0/ext/libsass/src/base64vlq.hpp +30 -0
  45. data/sassc-2.4.0/ext/libsass/src/bind.cpp +312 -0
  46. data/sassc-2.4.0/ext/libsass/src/bind.hpp +15 -0
  47. data/sassc-2.4.0/ext/libsass/src/c2ast.cpp +64 -0
  48. data/sassc-2.4.0/ext/libsass/src/c2ast.hpp +14 -0
  49. data/sassc-2.4.0/ext/libsass/src/c99func.c +54 -0
  50. data/sassc-2.4.0/ext/libsass/src/cencode.c +106 -0
  51. data/sassc-2.4.0/ext/libsass/src/check_nesting.cpp +393 -0
  52. data/sassc-2.4.0/ext/libsass/src/check_nesting.hpp +70 -0
  53. data/sassc-2.4.0/ext/libsass/src/color_maps.cpp +652 -0
  54. data/sassc-2.4.0/ext/libsass/src/color_maps.hpp +323 -0
  55. data/sassc-2.4.0/ext/libsass/src/constants.cpp +199 -0
  56. data/sassc-2.4.0/ext/libsass/src/constants.hpp +200 -0
  57. data/sassc-2.4.0/ext/libsass/src/context.cpp +863 -0
  58. data/sassc-2.4.0/ext/libsass/src/context.hpp +140 -0
  59. data/sassc-2.4.0/ext/libsass/src/cssize.cpp +521 -0
  60. data/sassc-2.4.0/ext/libsass/src/cssize.hpp +71 -0
  61. data/sassc-2.4.0/ext/libsass/src/dart_helpers.hpp +199 -0
  62. data/sassc-2.4.0/ext/libsass/src/debug.hpp +43 -0
  63. data/sassc-2.4.0/ext/libsass/src/debugger.hpp +963 -0
  64. data/sassc-2.4.0/ext/libsass/src/emitter.cpp +297 -0
  65. data/sassc-2.4.0/ext/libsass/src/emitter.hpp +101 -0
  66. data/sassc-2.4.0/ext/libsass/src/environment.cpp +260 -0
  67. data/sassc-2.4.0/ext/libsass/src/environment.hpp +124 -0
  68. data/sassc-2.4.0/ext/libsass/src/error_handling.cpp +233 -0
  69. data/sassc-2.4.0/ext/libsass/src/error_handling.hpp +239 -0
  70. data/sassc-2.4.0/ext/libsass/src/eval.cpp +1543 -0
  71. data/sassc-2.4.0/ext/libsass/src/eval.hpp +110 -0
  72. data/sassc-2.4.0/ext/libsass/src/eval_selectors.cpp +75 -0
  73. data/sassc-2.4.0/ext/libsass/src/expand.cpp +875 -0
  74. data/sassc-2.4.0/ext/libsass/src/expand.hpp +98 -0
  75. data/sassc-2.4.0/ext/libsass/src/extender.cpp +1188 -0
  76. data/sassc-2.4.0/ext/libsass/src/extender.hpp +399 -0
  77. data/sassc-2.4.0/ext/libsass/src/extension.cpp +43 -0
  78. data/sassc-2.4.0/ext/libsass/src/extension.hpp +89 -0
  79. data/sassc-2.4.0/ext/libsass/src/file.cpp +531 -0
  80. data/sassc-2.4.0/ext/libsass/src/file.hpp +124 -0
  81. data/sassc-2.4.0/ext/libsass/src/fn_colors.cpp +596 -0
  82. data/sassc-2.4.0/ext/libsass/src/fn_colors.hpp +85 -0
  83. data/sassc-2.4.0/ext/libsass/src/fn_lists.cpp +285 -0
  84. data/sassc-2.4.0/ext/libsass/src/fn_lists.hpp +34 -0
  85. data/sassc-2.4.0/ext/libsass/src/fn_maps.cpp +94 -0
  86. data/sassc-2.4.0/ext/libsass/src/fn_maps.hpp +30 -0
  87. data/sassc-2.4.0/ext/libsass/src/fn_miscs.cpp +244 -0
  88. data/sassc-2.4.0/ext/libsass/src/fn_miscs.hpp +40 -0
  89. data/sassc-2.4.0/ext/libsass/src/fn_numbers.cpp +227 -0
  90. data/sassc-2.4.0/ext/libsass/src/fn_numbers.hpp +45 -0
  91. data/sassc-2.4.0/ext/libsass/src/fn_selectors.cpp +205 -0
  92. data/sassc-2.4.0/ext/libsass/src/fn_selectors.hpp +35 -0
  93. data/sassc-2.4.0/ext/libsass/src/fn_strings.cpp +268 -0
  94. data/sassc-2.4.0/ext/libsass/src/fn_strings.hpp +34 -0
  95. data/sassc-2.4.0/ext/libsass/src/fn_utils.cpp +158 -0
  96. data/sassc-2.4.0/ext/libsass/src/fn_utils.hpp +62 -0
  97. data/sassc-2.4.0/ext/libsass/src/inspect.cpp +1125 -0
  98. data/sassc-2.4.0/ext/libsass/src/inspect.hpp +101 -0
  99. data/sassc-2.4.0/ext/libsass/src/json.cpp +1436 -0
  100. data/sassc-2.4.0/ext/libsass/src/json.hpp +117 -0
  101. data/sassc-2.4.0/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  102. data/sassc-2.4.0/ext/libsass/src/lexer.cpp +122 -0
  103. data/sassc-2.4.0/ext/libsass/src/lexer.hpp +304 -0
  104. data/sassc-2.4.0/ext/libsass/src/listize.cpp +70 -0
  105. data/sassc-2.4.0/ext/libsass/src/listize.hpp +37 -0
  106. data/sassc-2.4.0/ext/libsass/src/mapping.hpp +19 -0
  107. data/sassc-2.4.0/ext/libsass/src/memory/allocator.cpp +48 -0
  108. data/sassc-2.4.0/ext/libsass/src/memory/allocator.hpp +138 -0
  109. data/sassc-2.4.0/ext/libsass/src/memory/config.hpp +20 -0
  110. data/sassc-2.4.0/ext/libsass/src/memory/memory_pool.hpp +186 -0
  111. data/sassc-2.4.0/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  112. data/sassc-2.4.0/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  113. data/sassc-2.4.0/ext/libsass/src/memory.hpp +12 -0
  114. data/sassc-2.4.0/ext/libsass/src/operation.hpp +223 -0
  115. data/sassc-2.4.0/ext/libsass/src/operators.cpp +267 -0
  116. data/sassc-2.4.0/ext/libsass/src/operators.hpp +30 -0
  117. data/sassc-2.4.0/ext/libsass/src/ordered_map.hpp +112 -0
  118. data/sassc-2.4.0/ext/libsass/src/output.cpp +320 -0
  119. data/sassc-2.4.0/ext/libsass/src/output.hpp +47 -0
  120. data/sassc-2.4.0/ext/libsass/src/parser.cpp +2965 -0
  121. data/sassc-2.4.0/ext/libsass/src/parser.hpp +394 -0
  122. data/sassc-2.4.0/ext/libsass/src/parser_selectors.cpp +189 -0
  123. data/sassc-2.4.0/ext/libsass/src/permutate.hpp +164 -0
  124. data/sassc-2.4.0/ext/libsass/src/plugins.cpp +188 -0
  125. data/sassc-2.4.0/ext/libsass/src/plugins.hpp +57 -0
  126. data/sassc-2.4.0/ext/libsass/src/position.cpp +165 -0
  127. data/sassc-2.4.0/ext/libsass/src/position.hpp +147 -0
  128. data/sassc-2.4.0/ext/libsass/src/prelexer.cpp +1780 -0
  129. data/sassc-2.4.0/ext/libsass/src/prelexer.hpp +484 -0
  130. data/sassc-2.4.0/ext/libsass/src/remove_placeholders.cpp +86 -0
  131. data/sassc-2.4.0/ext/libsass/src/remove_placeholders.hpp +37 -0
  132. data/sassc-2.4.0/ext/libsass/src/sass.cpp +156 -0
  133. data/sassc-2.4.0/ext/libsass/src/sass.hpp +147 -0
  134. data/sassc-2.4.0/ext/libsass/src/sass2scss.cpp +895 -0
  135. data/sassc-2.4.0/ext/libsass/src/sass_context.cpp +741 -0
  136. data/sassc-2.4.0/ext/libsass/src/sass_context.hpp +129 -0
  137. data/sassc-2.4.0/ext/libsass/src/sass_functions.cpp +210 -0
  138. data/sassc-2.4.0/ext/libsass/src/sass_functions.hpp +50 -0
  139. data/sassc-2.4.0/ext/libsass/src/sass_values.cpp +362 -0
  140. data/sassc-2.4.0/ext/libsass/src/sass_values.hpp +82 -0
  141. data/sassc-2.4.0/ext/libsass/src/settings.hpp +19 -0
  142. data/sassc-2.4.0/ext/libsass/src/source.cpp +69 -0
  143. data/sassc-2.4.0/ext/libsass/src/source.hpp +95 -0
  144. data/sassc-2.4.0/ext/libsass/src/source_data.hpp +32 -0
  145. data/sassc-2.4.0/ext/libsass/src/source_map.cpp +202 -0
  146. data/sassc-2.4.0/ext/libsass/src/source_map.hpp +65 -0
  147. data/sassc-2.4.0/ext/libsass/src/stylesheet.cpp +22 -0
  148. data/sassc-2.4.0/ext/libsass/src/stylesheet.hpp +57 -0
  149. data/sassc-2.4.0/ext/libsass/src/to_value.cpp +114 -0
  150. data/sassc-2.4.0/ext/libsass/src/to_value.hpp +46 -0
  151. data/sassc-2.4.0/ext/libsass/src/units.cpp +507 -0
  152. data/sassc-2.4.0/ext/libsass/src/units.hpp +110 -0
  153. data/sassc-2.4.0/ext/libsass/src/utf8/checked.h +336 -0
  154. data/sassc-2.4.0/ext/libsass/src/utf8/core.h +332 -0
  155. data/sassc-2.4.0/ext/libsass/src/utf8/unchecked.h +235 -0
  156. data/sassc-2.4.0/ext/libsass/src/utf8.h +34 -0
  157. data/sassc-2.4.0/ext/libsass/src/utf8_string.cpp +104 -0
  158. data/sassc-2.4.0/ext/libsass/src/utf8_string.hpp +38 -0
  159. data/sassc-2.4.0/ext/libsass/src/util.cpp +723 -0
  160. data/sassc-2.4.0/ext/libsass/src/util.hpp +105 -0
  161. data/sassc-2.4.0/ext/libsass/src/util_string.cpp +125 -0
  162. data/sassc-2.4.0/ext/libsass/src/util_string.hpp +73 -0
  163. data/sassc-2.4.0/ext/libsass/src/values.cpp +140 -0
  164. data/sassc-2.4.0/ext/libsass/src/values.hpp +12 -0
  165. data/sassc-2.4.0/lib/sassc/dependency.rb +17 -0
  166. data/sassc-2.4.0/lib/sassc/engine.rb +141 -0
  167. data/sassc-2.4.0/lib/sassc/error.rb +37 -0
  168. data/sassc-2.4.0/lib/sassc/functions_handler.rb +73 -0
  169. data/sassc-2.4.0/lib/sassc/import_handler.rb +50 -0
  170. data/sassc-2.4.0/lib/sassc/importer.rb +31 -0
  171. data/sassc-2.4.0/lib/sassc/native/native_context_api.rb +147 -0
  172. data/sassc-2.4.0/lib/sassc/native/native_functions_api.rb +159 -0
  173. data/sassc-2.4.0/lib/sassc/native/sass2scss_api.rb +10 -0
  174. data/sassc-2.4.0/lib/sassc/native/sass_input_style.rb +13 -0
  175. data/sassc-2.4.0/lib/sassc/native/sass_output_style.rb +12 -0
  176. data/sassc-2.4.0/lib/sassc/native/sass_value.rb +97 -0
  177. data/sassc-2.4.0/lib/sassc/native/string_list.rb +10 -0
  178. data/sassc-2.4.0/lib/sassc/native.rb +64 -0
  179. data/sassc-2.4.0/lib/sassc/sass_2_scss.rb +9 -0
  180. data/sassc-2.4.0/lib/sassc/script/functions.rb +8 -0
  181. data/sassc-2.4.0/lib/sassc/script/value/bool.rb +32 -0
  182. data/sassc-2.4.0/lib/sassc/script/value/color.rb +95 -0
  183. data/sassc-2.4.0/lib/sassc/script/value/list.rb +136 -0
  184. data/sassc-2.4.0/lib/sassc/script/value/map.rb +69 -0
  185. data/sassc-2.4.0/lib/sassc/script/value/number.rb +389 -0
  186. data/sassc-2.4.0/lib/sassc/script/value/string.rb +96 -0
  187. data/sassc-2.4.0/lib/sassc/script/value.rb +137 -0
  188. data/sassc-2.4.0/lib/sassc/script/value_conversion/base.rb +13 -0
  189. data/sassc-2.4.0/lib/sassc/script/value_conversion/bool.rb +13 -0
  190. data/sassc-2.4.0/lib/sassc/script/value_conversion/color.rb +18 -0
  191. data/sassc-2.4.0/lib/sassc/script/value_conversion/list.rb +25 -0
  192. data/sassc-2.4.0/lib/sassc/script/value_conversion/map.rb +21 -0
  193. data/sassc-2.4.0/lib/sassc/script/value_conversion/number.rb +13 -0
  194. data/sassc-2.4.0/lib/sassc/script/value_conversion/string.rb +17 -0
  195. data/sassc-2.4.0/lib/sassc/script/value_conversion.rb +69 -0
  196. data/sassc-2.4.0/lib/sassc/script.rb +17 -0
  197. data/sassc-2.4.0/lib/sassc/util/normalized_map.rb +117 -0
  198. data/sassc-2.4.0/lib/sassc/util.rb +231 -0
  199. data/sassc-2.4.0/lib/sassc/version.rb +5 -0
  200. data/sassc-2.4.0/lib/sassc.rb +205 -0
  201. data/sassc-2.4.0/sassc.gemspec +69 -0
  202. data/sassc-2.4.0/test/custom_importer_test.rb +127 -0
  203. data/sassc-2.4.0/test/engine_test.rb +314 -0
  204. data/sassc-2.4.0/test/error_test.rb +29 -0
  205. data/sassc-2.4.0/test/fixtures/paths.scss +10 -0
  206. data/sassc-2.4.0/test/functions_test.rb +340 -0
  207. data/sassc-2.4.0/test/native_test.rb +213 -0
  208. data/sassc-2.4.0/test/output_style_test.rb +107 -0
  209. data/sassc-2.4.0/test/sass_2_scss_test.rb +14 -0
  210. data/sassc-2.4.0/test/test_helper.rb +45 -0
  211. metadata +249 -0
@@ -0,0 +1,314 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ module SassC
6
+ class EngineTest < MiniTest::Test
7
+ include TempFileTest
8
+
9
+ def render(data)
10
+ Engine.new(data).render
11
+ end
12
+
13
+ def test_line_comments
14
+ template = <<-SCSS
15
+ .foo {
16
+ baz: bang; }
17
+ SCSS
18
+ expected_output = <<-CSS
19
+ /* line 1, stdin */
20
+ .foo {
21
+ baz: bang; }
22
+ CSS
23
+ output = Engine.new(template, line_comments: true).render
24
+ assert_equal expected_output, output
25
+ end
26
+
27
+ def test_one_line_comments
28
+ assert_equal <<CSS, render(<<SCSS)
29
+ .foo {
30
+ baz: bang; }
31
+ CSS
32
+ .foo {// bar: baz;}
33
+ baz: bang; //}
34
+ }
35
+ SCSS
36
+ assert_equal <<CSS, render(<<SCSS)
37
+ .foo bar[val="//"] {
38
+ baz: bang; }
39
+ CSS
40
+ .foo bar[val="//"] {
41
+ baz: bang; //}
42
+ }
43
+ SCSS
44
+ end
45
+
46
+ def test_variables
47
+ assert_equal <<CSS, render(<<SCSS)
48
+ blat {
49
+ a: foo; }
50
+ CSS
51
+ $var: foo;
52
+
53
+ blat {a: $var}
54
+ SCSS
55
+
56
+ assert_equal <<CSS, render(<<SCSS)
57
+ foo {
58
+ a: 2;
59
+ b: 6; }
60
+ CSS
61
+ foo {
62
+ $var: 2;
63
+ $another-var: 4;
64
+ a: $var;
65
+ b: $var + $another-var;}
66
+ SCSS
67
+ end
68
+
69
+ def test_precision
70
+ template = <<-SCSS
71
+ $var: 1;
72
+ .foo {
73
+ baz: $var / 3; }
74
+ SCSS
75
+ expected_output = <<-CSS
76
+ .foo {
77
+ baz: 0.33333333; }
78
+ CSS
79
+ output = Engine.new(template, precision: 8).render
80
+ assert_equal expected_output, output
81
+ end
82
+
83
+ def test_precision_not_specified
84
+ template = <<-SCSS
85
+ $var: 1;
86
+ .foo {
87
+ baz: $var / 3; }
88
+ SCSS
89
+ expected_output = <<-CSS
90
+ .foo {
91
+ baz: 0.3333333333; }
92
+ CSS
93
+ output = Engine.new(template).render
94
+ assert_equal expected_output, output
95
+ end
96
+
97
+ def test_dependency_filenames_are_reported
98
+ base = temp_dir("").to_s
99
+
100
+ temp_file("not_included.scss", "$size: 30px;")
101
+ temp_file("import_parent.scss", "$size: 30px;")
102
+ temp_file("import.scss", "@import 'import_parent'; $size: 30px;")
103
+ temp_file("styles.scss", "@import 'import.scss'; .hi { width: $size; }")
104
+
105
+ engine = Engine.new(File.read("styles.scss"))
106
+ engine.render
107
+ deps = engine.dependencies
108
+
109
+ expected = ["/import.scss", "/import_parent.scss"]
110
+ assert_equal expected, deps.map { |dep| dep.options[:filename].gsub(base, "") }.sort
111
+ assert_equal expected, deps.map { |dep| dep.filename.gsub(base, "") }.sort
112
+ end
113
+
114
+ def test_no_dependencies
115
+ engine = Engine.new("$size: 30px;")
116
+ engine.render
117
+ deps = engine.dependencies
118
+ assert_equal [], deps
119
+ end
120
+
121
+ def test_not_rendered_error
122
+ engine = Engine.new("$size: 30px;")
123
+ assert_raises(NotRenderedError) { engine.dependencies }
124
+ end
125
+
126
+ def test_source_map
127
+ temp_dir('admin')
128
+
129
+ temp_file('admin/text-color.scss', <<SCSS)
130
+ p {
131
+ color: red;
132
+ }
133
+ SCSS
134
+ temp_file('style.scss', <<SCSS)
135
+ @import 'admin/text-color';
136
+
137
+ p {
138
+ padding: 20px;
139
+ }
140
+ SCSS
141
+ engine = Engine.new(File.read('style.scss'), {
142
+ source_map_file: "style.scss.map",
143
+ source_map_contents: true
144
+ })
145
+ engine.render
146
+
147
+ assert_equal <<MAP.strip, engine.source_map
148
+ {
149
+ \t"version": 3,
150
+ \t"file": "stdin.css",
151
+ \t"sources": [
152
+ \t\t"stdin",
153
+ \t\t"admin/text-color.scss"
154
+ \t],
155
+ \t"sourcesContent": [
156
+ \t\t"@import 'admin/text-color';\\n\\np {\\n padding: 20px;\\n}\\n",
157
+ \t\t"p {\\n color: red;\\n}\\n"
158
+ \t],
159
+ \t"names": [],
160
+ \t"mappings": "ACAA,AAAA,CAAC,CAAC;EACA,KAAK,EAAE,GAAG,GACX;;ADAD,AAAA,CAAC,CAAC;EACA,OAAO,EAAE,IAAI,GACd"
161
+ }
162
+ MAP
163
+ end
164
+
165
+ def test_no_source_map
166
+ engine = Engine.new("$size: 30px;")
167
+ engine.render
168
+ assert_raises(NotRenderedError) { engine.source_map }
169
+ end
170
+
171
+ def test_omit_source_map_url
172
+ temp_file('style.scss', <<SCSS)
173
+ p {
174
+ padding: 20px;
175
+ }
176
+ SCSS
177
+ engine = Engine.new(File.read('style.scss'), {
178
+ source_map_file: "style.scss.map",
179
+ source_map_contents: true,
180
+ omit_source_map_url: true
181
+ })
182
+ output = engine.render
183
+
184
+ refute_match /sourceMappingURL/, output
185
+ end
186
+
187
+ def test_load_paths
188
+ temp_dir("included_1")
189
+ temp_dir("included_2")
190
+
191
+ temp_file("included_1/import_parent.scss", "$s: 30px;")
192
+ temp_file("included_2/import.scss", "@import 'import_parent'; $size: $s;")
193
+ temp_file("styles.scss", "@import 'import.scss'; .hi { width: $size; }")
194
+
195
+ assert_equal ".hi {\n width: 30px; }\n", Engine.new(
196
+ File.read("styles.scss"),
197
+ load_paths: [ "included_1", "included_2" ]
198
+ ).render
199
+ end
200
+
201
+ def test_global_load_paths
202
+ temp_dir("included_1")
203
+ temp_dir("included_2")
204
+
205
+ temp_file("included_1/import_parent.scss", "$s: 30px;")
206
+ temp_file("included_2/import.scss", "@import 'import_parent'; $size: $s;")
207
+ temp_file("styles.scss", "@import 'import.scss'; .hi { width: $size; }")
208
+
209
+ ::SassC.load_paths << "included_1"
210
+ ::SassC.load_paths << "included_2"
211
+
212
+ assert_equal ".hi {\n width: 30px; }\n", Engine.new(
213
+ File.read("styles.scss"),
214
+ ).render
215
+ ::SassC.load_paths.clear
216
+ end
217
+
218
+ def test_env_load_paths
219
+ expected_load_paths = [ "included_1", "included_2" ]
220
+ ::SassC.instance_eval { @load_paths = nil }
221
+ ENV['SASS_PATH'] = expected_load_paths.join(File::PATH_SEPARATOR)
222
+ assert_equal expected_load_paths, ::SassC.load_paths
223
+ ::SassC.load_paths.clear
224
+ end
225
+
226
+ def test_load_paths_not_configured
227
+ temp_file("included_1/import_parent.scss", "$s: 30px;")
228
+ temp_file("included_2/import.scss", "@import 'import_parent'; $size: $s;")
229
+ temp_file("styles.scss", "@import 'import.scss'; .hi { width: $size; }")
230
+
231
+ assert_raises(SyntaxError) do
232
+ Engine.new(File.read("styles.scss")).render
233
+ end
234
+ end
235
+
236
+ def test_sass_variation
237
+ sass = <<SASS
238
+ $size: 30px
239
+ .foo
240
+ width: $size
241
+ SASS
242
+
243
+ css = <<CSS
244
+ .foo {
245
+ width: 30px; }
246
+ CSS
247
+
248
+ assert_equal css, Engine.new(sass, syntax: :sass).render
249
+ assert_equal css, Engine.new(sass, syntax: "sass").render
250
+ assert_raises(SyntaxError) { Engine.new(sass).render }
251
+ end
252
+
253
+ def test_encoding_matches_input
254
+ input = String.new("$size: 30px;")
255
+ input.force_encoding("UTF-8")
256
+ output = Engine.new(input).render
257
+ assert_equal input.encoding, output.encoding
258
+ end
259
+
260
+ def test_inline_source_maps
261
+ template = <<-SCSS
262
+ .foo {
263
+ baz: bang; }
264
+ SCSS
265
+ expected_output = <<-CSS
266
+ /* line 1, stdin */
267
+ .foo {
268
+ baz: bang; }
269
+ CSS
270
+
271
+ output = Engine.new(template, {
272
+ source_map_file: ".",
273
+ source_map_embed: true,
274
+ source_map_contents: true
275
+ }).render
276
+
277
+ assert_match /sourceMappingURL/, output
278
+ assert_match /.foo/, output
279
+ end
280
+
281
+ def test_empty_template
282
+ output = Engine.new('').render
283
+ assert_equal '', output
284
+ end
285
+
286
+ def test_empty_template_returns_a_new_object
287
+ input = String.new
288
+ output = Engine.new(input).render
289
+ assert !input.equal?(output), 'empty template must return a new object'
290
+ end
291
+
292
+ def test_empty_template_encoding_matches_input
293
+ input = String.new.force_encoding("ISO-8859-1")
294
+ output = Engine.new(input).render
295
+ assert_equal input.encoding, output.encoding
296
+ end
297
+
298
+ def test_handling_of_frozen_strings
299
+ output = Engine.new("body { background-color: red; }".freeze).render
300
+ assert_equal output, "body {\n background-color: red; }\n"
301
+ end
302
+
303
+ def test_import_plain_css
304
+ temp_file("test.css", ".something{color: red}")
305
+ expected_output = <<-CSS
306
+ .something {
307
+ color: red; }
308
+ CSS
309
+
310
+ output = Engine.new("@import 'test'").render
311
+ assert_equal expected_output, output
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ module SassC
6
+ class ErrorTest < MiniTest::Test
7
+ def render(data, opts={})
8
+ Engine.new(data, opts).render
9
+ end
10
+
11
+ def test_first_backtrace_is_sass
12
+ filename = "app/assets/stylesheets/application.scss"
13
+
14
+ begin
15
+ template = <<-SCSS
16
+ .foo {
17
+ baz: bang;
18
+ padding top: 10px;
19
+ }
20
+ SCSS
21
+
22
+ render(template, filename: filename)
23
+ rescue SassC::SyntaxError => err
24
+ expected = "#{filename}:3"
25
+ assert_equal expected, err.backtrace.first
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ div {
2
+ url: url(asset-path("foo.svg"));
3
+ url: url(image-path("foo.png"));
4
+ url: url(video-path("foo.mov"));
5
+ url: url(audio-path("foo.mp3"));
6
+ url: url(font-path("foo.woff"));
7
+ url: url(javascript-path('foo.js'));
8
+ url: url(javascript-path("foo.js"));
9
+ url: url(stylesheet-path("foo.css"));
10
+ }
@@ -0,0 +1,340 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+ require "stringio"
5
+
6
+ module SassC
7
+ class FunctionsTest < MiniTest::Test
8
+ include FixtureHelper
9
+
10
+ def setup
11
+ @real_stderr, $stderr = $stderr, StringIO.new
12
+ end
13
+
14
+ def teardown
15
+ $stderr = @real_stderr
16
+ end
17
+
18
+ def test_functions_may_return_sass_string_type
19
+ assert_sass <<-SCSS, <<-CSS
20
+ div { url: url(sass_return_path("foo.svg")); }
21
+ SCSS
22
+ div { url: url("foo.svg"); }
23
+ CSS
24
+ end
25
+
26
+ def test_functions_work_with_varying_quotes_and_string_types
27
+ assert_sass <<-SCSS, <<-CSS
28
+ div {
29
+ url: url(asset-path("foo.svg"));
30
+ url: url(image-path("foo.png"));
31
+ url: url(video-path("foo.mov"));
32
+ url: url(audio-path("foo.mp3"));
33
+ url: url(font-path("foo.woff"));
34
+ url: url(javascript-path('foo.js'));
35
+ url: url(javascript-path("foo.js"));
36
+ url: url(stylesheet-path("foo.css"));
37
+ }
38
+ SCSS
39
+ div {
40
+ url: url(asset-path("foo.svg"));
41
+ url: url(image-path("foo.png"));
42
+ url: url(video-path("foo.mov"));
43
+ url: url(audio-path("foo.mp3"));
44
+ url: url(font-path("foo.woff"));
45
+ url: url("/js/foo.js");
46
+ url: url("/js/foo.js");
47
+ url: url(/css/foo.css);
48
+ }
49
+ CSS
50
+ end
51
+
52
+ def test_function_with_no_return_value
53
+ assert_sass <<-SCSS, <<-CSS
54
+ div {url: url(no-return-path('foo.svg'));}
55
+ SCSS
56
+ div { url: url(); }
57
+ CSS
58
+ end
59
+
60
+ def test_function_that_returns_a_color
61
+ assert_sass <<-SCSS, <<-CSS
62
+ div { background: returns-a-color(); }
63
+ SCSS
64
+ div { background: black; }
65
+ CSS
66
+ end
67
+
68
+ def test_function_that_returns_a_number
69
+ assert_sass <<-SCSS, <<-CSS
70
+ div { width: returns-a-number(); }
71
+ SCSS
72
+ div { width: -312rem; }
73
+ CSS
74
+ end
75
+
76
+ def test_function_that_takes_a_number
77
+ assert_sass <<-SCSS, <<-CSS
78
+ div { display: inspect-number(42.1px); }
79
+ SCSS
80
+ div { display: 42.1px; }
81
+ CSS
82
+ end
83
+
84
+ def test_function_that_returns_a_bool
85
+ assert_sass <<-SCSS, <<-CSS
86
+ div { width: returns-a-bool(); }
87
+ SCSS
88
+ div { width: true; }
89
+ CSS
90
+ end
91
+
92
+ def test_function_that_takes_a_bool
93
+ assert_sass <<-SCSS, <<-CSS
94
+ div { display: inspect-bool(true)}
95
+ SCSS
96
+ div { display: true; }
97
+ CSS
98
+ end
99
+
100
+ def test_function_with_optional_arguments
101
+ assert_sass <<-SCSS, <<-EXPECTED_CSS
102
+ div {
103
+ url: optional_arguments('first');
104
+ url: optional_arguments('second', 'qux');
105
+ }
106
+ SCSS
107
+ div {
108
+ url: "first/bar";
109
+ url: "second/qux";
110
+ }
111
+ EXPECTED_CSS
112
+ end
113
+
114
+ def test_functions_may_accept_sass_color_type
115
+ assert_sass <<-SCSS, <<-EXPECTED_CSS
116
+ div { color: nice_color_argument(red); }
117
+ SCSS
118
+ div { color: rgb(255, 0, 0); }
119
+ EXPECTED_CSS
120
+ end
121
+
122
+ def test_function_with_unsupported_tag
123
+ skip('What are other unsupported tags?')
124
+ engine = Engine.new("div {url: function_with_unsupported_tag(());}")
125
+
126
+ exception = assert_raises(SassC::SyntaxError) do
127
+ engine.render
128
+ end
129
+
130
+ assert_match /Sass argument of type sass_list unsupported/, exception.message
131
+ assert_equal "[SassC::FunctionsHandler] Sass argument of type sass_list unsupported", stderr_output
132
+ end
133
+
134
+ def test_function_with_error
135
+ engine = Engine.new("div {url: function_that_raises_errors();}")
136
+
137
+ exception = assert_raises(SassC::SyntaxError) do
138
+ engine.render
139
+ end
140
+
141
+ assert_match /Error: error in C function function_that_raises_errors/, exception.message
142
+ assert_match /Intentional wrong thing happened somewhere inside the custom function/, exception.message
143
+ assert_match /\[SassC::FunctionsHandler\] Intentional wrong thing happened somewhere inside the custom function/, stderr_output
144
+ end
145
+
146
+ def test_function_that_returns_a_sass_value
147
+ assert_sass <<-SCSS, <<-CSS
148
+ div { background: returns-sass-value(); }
149
+ SCSS
150
+ div { background: black; }
151
+ CSS
152
+ end
153
+
154
+ def test_function_that_returns_a_sass_map
155
+ assert_sass <<-SCSS, <<-CSS
156
+ $my-map: returns-sass-map();
157
+ div { background: map-get( $my-map, color ); }
158
+ SCSS
159
+ div { background: black; }
160
+ CSS
161
+ end
162
+
163
+ def test_function_that_takes_a_sass_map
164
+ assert_sass <<-SCSS, <<-CSS
165
+ div { background-color: map-get( inspect-map(( color: black, number: 1.23px, string: "abc", map: ( x: 'y' ))), color ); }
166
+ SCSS
167
+ div { background-color: black; }
168
+ CSS
169
+ end
170
+
171
+ def test_function_that_returns_a_sass_list
172
+ assert_sass <<-SCSS, <<-CSS
173
+ $my-list: returns-sass-list();
174
+ div { width: nth( $my-list, 2 ); }
175
+ SCSS
176
+ div { width: 20; }
177
+ CSS
178
+ end
179
+
180
+ def test_function_that_takes_a_sass_list
181
+ assert_sass <<-SCSS, <<-CSS
182
+ div { width: nth(inspect-list((10 20 30)), 2); }
183
+ SCSS
184
+ div { width: 20; }
185
+ CSS
186
+ end
187
+
188
+ def test_concurrency
189
+ 10.times do
190
+ threads = []
191
+ 10.times do |i|
192
+ threads << Thread.new(i) do |id|
193
+ out = Engine.new("div { url: inspect_options(); }", {test_key1: 'test_value', test_key2: id}).render
194
+ assert_match /test_key1/, out
195
+ assert_match /test_key2/, out
196
+ assert_match /test_value/, out
197
+ assert_match /#{id}/, out
198
+ end
199
+ end
200
+ threads.each(&:join)
201
+ end
202
+ end
203
+
204
+ def test_pass_custom_functions_as_a_parameter
205
+ out = Engine.new("div { url: test-function(); }", {functions: ExternalFunctions}).render
206
+ assert_match /custom_function/, out
207
+ end
208
+
209
+ def test_pass_incompatible_type_to_custom_functions
210
+ assert_raises(TypeError) do
211
+ Engine.new("div { url: test-function(); }", {functions: Class.new}).render
212
+ end
213
+ end
214
+
215
+ private
216
+
217
+ def assert_sass(sass, expected_css)
218
+ engine = Engine.new(sass)
219
+ assert_equal expected_css.strip.gsub!(/\s+/, " "), # poor man's String#squish
220
+ engine.render.strip.gsub!(/\s+/, " ")
221
+ end
222
+
223
+ def stderr_output
224
+ $stderr.string.gsub("\u0000\n", '').chomp
225
+ end
226
+
227
+ module Script::Functions
228
+
229
+ def javascript_path(path)
230
+ SassC::Script::Value::String.new("/js/#{path.value}", :string)
231
+ end
232
+
233
+ def stylesheet_path(path)
234
+ SassC::Script::Value::String.new("/css/#{path.value}", :identifier)
235
+ end
236
+
237
+ def no_return_path(path)
238
+ nil
239
+ end
240
+
241
+ def sass_return_path(path)
242
+ SassC::Script::Value::String.new("#{path.value}", :string)
243
+ end
244
+
245
+ def optional_arguments(path, optional = nil)
246
+ optional ||= SassC::Script::Value::String.new("bar")
247
+ SassC::Script::Value::String.new("#{path.value}/#{optional.value}", :string)
248
+ end
249
+
250
+ def function_that_raises_errors
251
+ raise StandardError, "Intentional wrong thing happened somewhere inside the custom function"
252
+ end
253
+
254
+ def function_with_unsupported_tag(value)
255
+ end
256
+
257
+ def nice_color_argument(color)
258
+ return SassC::Script::Value::String.new(color.to_s, :identifier)
259
+ end
260
+
261
+ def returns_a_color
262
+ return SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
263
+ end
264
+
265
+ def returns_a_number
266
+ return SassC::Script::Value::Number.new(-312,'rem')
267
+ end
268
+
269
+ def returns_a_bool
270
+ return SassC::Script::Value::Bool.new(true)
271
+ end
272
+
273
+ def inspect_bool ( argument )
274
+ raise StandardError.new "passed value is not a Sass::Script::Value::Bool" unless argument.is_a? SassC::Script::Value::Bool
275
+ return argument
276
+ end
277
+
278
+ def inspect_number ( argument )
279
+ raise StandardError.new "passed value is not a Sass::Script::Value::Number" unless argument.is_a? SassC::Script::Value::Number
280
+ return argument
281
+ end
282
+
283
+ def inspect_map ( argument )
284
+ argument.to_h.each_pair do |key, value|
285
+ raise StandardError.new "key #{key.inspect} is not a string" unless key.is_a? SassC::Script::Value::String
286
+
287
+ valueClass = case key.value
288
+ when 'string'
289
+ SassC::Script::Value::String
290
+ when 'number'
291
+ SassC::Script::Value::Number
292
+ when 'color'
293
+ SassC::Script::Value::Color
294
+ when 'map'
295
+ SassC::Script::Value::Map
296
+ end
297
+
298
+ raise StandardError.new "unknown key #{key.inspect}" unless valueClass
299
+ raise StandardError.new "value for #{key.inspect} is not a #{valueClass}" unless value.is_a? valueClass
300
+ end
301
+ return argument
302
+ end
303
+
304
+ def inspect_list(argument)
305
+ raise StandardError.new "passed value is not a Sass::Script::Value::List" unless argument.is_a? SassC::Script::Value::List
306
+ return argument
307
+ end
308
+
309
+ def inspect_options
310
+ SassC::Script::Value::String.new(self.options.inspect, :string)
311
+ end
312
+
313
+ def returns_sass_value
314
+ return SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
315
+ end
316
+
317
+ def returns_sass_map
318
+ key = SassC::Script::Value::String.new("color", "string")
319
+ value = SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
320
+ values = {}
321
+ values[key] = value
322
+ map = SassC::Script::Value::Map.new values
323
+ return map
324
+ end
325
+
326
+ def returns_sass_list
327
+ numbers = [10, 20, 30].map { |n| SassC::Script::Value::Number.new(n, '') }
328
+ SassC::Script::Value::List.new(numbers, separator: :space)
329
+ end
330
+
331
+ end
332
+
333
+ module ExternalFunctions
334
+ def test_function
335
+ SassC::Script::Value::String.new("custom_function", :string)
336
+ end
337
+ end
338
+
339
+ end
340
+ end