sassc 1.12.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +61 -0
  4. data/Gemfile +1 -3
  5. data/LICENSE.txt +1 -1
  6. data/README.md +3 -59
  7. data/lib/sassc.rb +20 -1
  8. data/lib/sassc/dependency.rb +2 -0
  9. data/lib/sassc/engine.rb +2 -0
  10. data/lib/sassc/error.rb +9 -3
  11. data/lib/sassc/functions_handler.rb +3 -2
  12. data/lib/sassc/import_handler.rb +2 -0
  13. data/lib/sassc/importer.rb +2 -0
  14. data/lib/sassc/native.rb +3 -2
  15. data/lib/sassc/native/lib_c.rb +2 -0
  16. data/lib/sassc/native/native_context_api.rb +2 -0
  17. data/lib/sassc/native/native_functions_api.rb +2 -0
  18. data/lib/sassc/native/sass2scss_api.rb +2 -0
  19. data/lib/sassc/native/sass_input_style.rb +2 -0
  20. data/lib/sassc/native/sass_output_style.rb +2 -0
  21. data/lib/sassc/native/sass_value.rb +2 -0
  22. data/lib/sassc/native/string_list.rb +2 -0
  23. data/lib/sassc/sass_2_scss.rb +2 -0
  24. data/lib/sassc/script.rb +5 -35
  25. data/lib/sassc/script/functions.rb +2 -0
  26. data/lib/sassc/script/value.rb +137 -0
  27. data/lib/sassc/script/value/bool.rb +32 -0
  28. data/lib/sassc/script/value/color.rb +95 -0
  29. data/lib/sassc/script/value/list.rb +136 -0
  30. data/lib/sassc/script/value/map.rb +69 -0
  31. data/lib/sassc/script/value/number.rb +389 -0
  32. data/lib/sassc/script/value/string.rb +96 -0
  33. data/lib/sassc/script/value_conversion.rb +62 -82
  34. data/lib/sassc/script/value_conversion/base.rb +2 -0
  35. data/lib/sassc/script/value_conversion/bool.rb +2 -0
  36. data/lib/sassc/script/value_conversion/color.rb +2 -0
  37. data/lib/sassc/script/value_conversion/list.rb +2 -0
  38. data/lib/sassc/script/value_conversion/map.rb +2 -0
  39. data/lib/sassc/script/value_conversion/number.rb +2 -0
  40. data/lib/sassc/script/value_conversion/string.rb +2 -0
  41. data/lib/sassc/util.rb +231 -0
  42. data/lib/sassc/util/normalized_map.rb +117 -0
  43. data/lib/sassc/version.rb +3 -1
  44. data/lib/tasks/libsass.rb +2 -0
  45. data/sassc.gemspec +9 -5
  46. data/test/custom_importer_test.rb +2 -0
  47. data/test/engine_test.rb +5 -3
  48. data/test/error_test.rb +2 -0
  49. data/test/functions_test.rb +31 -37
  50. data/test/native_test.rb +2 -4
  51. data/test/output_style_test.rb +2 -0
  52. data/test/sass_2_scss_test.rb +2 -0
  53. data/test/test_helper.rb +2 -0
  54. metadata +23 -29
  55. data/lib/sassc/cache_stores.rb +0 -6
  56. data/lib/sassc/cache_stores/base.rb +0 -8
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+
5
+ # A hash that normalizes its string keys while still allowing you to get back
6
+ # to the original keys that were stored. If several different values normalize
7
+ # to the same value, whichever is stored last wins.
8
+
9
+ class SassC::Util::NormalizedMap
10
+
11
+ # Create a normalized map
12
+ def initialize(map = nil)
13
+ @key_strings = {}
14
+ @map = {}
15
+ map.each {|key, value| self[key] = value} if map
16
+ end
17
+
18
+ # Specifies how to transform the key.
19
+ # This can be overridden to create other normalization behaviors.
20
+ def normalize(key)
21
+ key.tr("-", "_")
22
+ end
23
+
24
+ # Returns the version of `key` as it was stored before
25
+ # normalization. If `key` isn't in the map, returns it as it was
26
+ # passed in.
27
+ # @return [String]
28
+ def denormalize(key)
29
+ @key_strings[normalize(key)] || key
30
+ end
31
+
32
+ # @private
33
+ def []=(k, v)
34
+ normalized = normalize(k)
35
+ @map[normalized] = v
36
+ @key_strings[normalized] = k
37
+ v
38
+ end
39
+
40
+ # @private
41
+ def [](k)
42
+ @map[normalize(k)]
43
+ end
44
+
45
+ # @private
46
+ def has_key?(k)
47
+ @map.has_key?(normalize(k))
48
+ end
49
+
50
+ # @private
51
+ def delete(k)
52
+ normalized = normalize(k)
53
+ @key_strings.delete(normalized)
54
+ @map.delete(normalized)
55
+ end
56
+
57
+ # @return [Hash] Hash with the keys as they were stored (before normalization).
58
+ def as_stored
59
+ SassC::Util.map_keys(@map) {|k| @key_strings[k]}
60
+ end
61
+
62
+ def empty?
63
+ @map.empty?
64
+ end
65
+
66
+ def values
67
+ @map.values
68
+ end
69
+
70
+ def keys
71
+ @map.keys
72
+ end
73
+
74
+ def each
75
+ @map.each {|k, v| yield(k, v)}
76
+ end
77
+
78
+ def size
79
+ @map.size
80
+ end
81
+
82
+ def to_hash
83
+ @map.dup
84
+ end
85
+
86
+ def to_a
87
+ @map.to_a
88
+ end
89
+
90
+ def map
91
+ @map.map {|k, v| yield(k, v)}
92
+ end
93
+
94
+ def dup
95
+ d = super
96
+ d.send(:instance_variable_set, "@map", @map.dup)
97
+ d
98
+ end
99
+
100
+ def sort_by
101
+ @map.sort_by {|k, v| yield k, v}
102
+ end
103
+
104
+ def update(map)
105
+ map = map.as_stored if map.is_a?(NormalizedMap)
106
+ map.each {|k, v| self[k] = v}
107
+ end
108
+
109
+ def method_missing(method, *args, &block)
110
+ @map.send(method, *args, &block)
111
+ end
112
+
113
+ def respond_to_missing?(method, include_private = false)
114
+ @map.respond_to?(method, include_private)
115
+ end
116
+
117
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SassC
2
- VERSION = "1.12.1"
4
+ VERSION = "2.0.0"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :libsass do
2
4
  desc "Compile libsass"
3
5
  task :compile do
@@ -1,9 +1,11 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'sassc/version'
5
+ require "sassc/version"
5
6
 
6
7
  Gem::Specification.new do |spec|
8
+
7
9
  spec.name = "sassc"
8
10
  spec.version = SassC::VERSION
9
11
  spec.authors = ["Ryan Boland"]
@@ -17,19 +19,20 @@ Gem::Specification.new do |spec|
17
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
21
 
22
+ spec.required_ruby_version = ">= 2.3.3"
23
+
20
24
  spec.require_paths = ["lib"]
21
25
 
22
26
  spec.extensions = ["ext/Rakefile"]
23
27
 
24
- spec.add_development_dependency "rake"
25
28
  spec.add_development_dependency "minitest", "~> 5.5.1"
26
29
  spec.add_development_dependency "minitest-around"
27
30
  spec.add_development_dependency "test_construct"
28
31
  spec.add_development_dependency "pry"
29
32
  spec.add_development_dependency "bundler"
30
33
 
34
+ spec.add_dependency "rake"
31
35
  spec.add_dependency "ffi", "~> 1.9.6"
32
- spec.add_dependency "sass", ">= 3.3.0"
33
36
 
34
37
  gem_dir = File.expand_path(File.dirname(__FILE__)) + "/"
35
38
  `git submodule --quiet foreach pwd`.split($\).each do |submodule_path|
@@ -42,4 +45,5 @@ Gem::Specification.new do |spec|
42
45
  end
43
46
  end
44
47
  end
48
+
45
49
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -224,7 +226,7 @@ CSS
224
226
  end
225
227
 
226
228
  def test_encoding_matches_input
227
- input = "$size: 30px;"
229
+ input = String.new("$size: 30px;")
228
230
  input.force_encoding("UTF-8")
229
231
  output = Engine.new(input).render
230
232
  assert_equal input.encoding, output.encoding
@@ -257,13 +259,13 @@ CSS
257
259
  end
258
260
 
259
261
  def test_empty_template_returns_a_new_object
260
- input = ''
262
+ input = String.new
261
263
  output = Engine.new(input).render
262
264
  assert input.object_id != output.object_id, 'empty template must return a new object'
263
265
  end
264
266
 
265
267
  def test_empty_template_encoding_matches_input
266
- input = ''.force_encoding("ISO-8859-1")
268
+ input = String.new.force_encoding("ISO-8859-1")
267
269
  output = Engine.new(input).render
268
270
  assert_equal input.encoding, output.encoding
269
271
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
  require "stringio"
3
- require "sass/script"
4
5
 
5
6
  module SassC
6
7
  class FunctionsTest < MiniTest::Test
@@ -114,7 +115,7 @@ module SassC
114
115
  assert_sass <<-SCSS, <<-EXPECTED_CSS
115
116
  div { color: nice_color_argument(red); }
116
117
  SCSS
117
- div { color: "red"; }
118
+ div { color: rgb(255, 0, 0); }
118
119
  EXPECTED_CSS
119
120
  end
120
121
 
@@ -197,8 +198,13 @@ module SassC
197
198
  end
198
199
 
199
200
  module Script::Functions
201
+
200
202
  def javascript_path(path)
201
- Script::String.new("/js/#{path.value}", :string)
203
+ SassC::Script::Value::String.new("/js/#{path.value}", :string)
204
+ end
205
+
206
+ def stylesheet_path(path)
207
+ SassC::Script::Value::String.new("/css/#{path.value}", :identifier)
202
208
  end
203
209
 
204
210
  def no_return_path(path)
@@ -206,12 +212,12 @@ module SassC
206
212
  end
207
213
 
208
214
  def sass_return_path(path)
209
- Script::String.new("#{path.value}", :string)
215
+ SassC::Script::Value::String.new("#{path.value}", :string)
210
216
  end
211
217
 
212
218
  def optional_arguments(path, optional = nil)
213
- optional ||= Script::String.new("bar")
214
- Script::String.new("#{path.value}/#{optional.value}", :string)
219
+ optional ||= SassC::Script::Value::String.new("bar")
220
+ SassC::Script::Value::String.new("#{path.value}/#{optional.value}", :string)
215
221
  end
216
222
 
217
223
  def function_that_raises_errors
@@ -222,44 +228,44 @@ module SassC
222
228
  end
223
229
 
224
230
  def nice_color_argument(color)
225
- return Script::String.new(color.to_s, :string)
231
+ return SassC::Script::Value::String.new(color.to_s, :identifier)
226
232
  end
227
233
 
228
234
  def returns_a_color
229
- return Script::Color.new(red: 0, green: 0, blue: 0)
235
+ return SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
230
236
  end
231
237
 
232
238
  def returns_a_number
233
- return Sass::Script::Value::Number.new(-312,'rem')
239
+ return SassC::Script::Value::Number.new(-312,'rem')
234
240
  end
235
241
 
236
242
  def returns_a_bool
237
- return Sass::Script::Value::Bool.new(true)
243
+ return SassC::Script::Value::Bool.new(true)
238
244
  end
239
245
 
240
246
  def inspect_bool ( argument )
241
- raise StandardError.new "passed value is not a Sass::Script::Value::Bool" unless argument.is_a? Sass::Script::Value::Bool
247
+ raise StandardError.new "passed value is not a Sass::Script::Value::Bool" unless argument.is_a? SassC::Script::Value::Bool
242
248
  return argument
243
249
  end
244
250
 
245
251
  def inspect_number ( argument )
246
- raise StandardError.new "passed value is not a Sass::Script::Value::Number" unless argument.is_a? Sass::Script::Value::Number
252
+ raise StandardError.new "passed value is not a Sass::Script::Value::Number" unless argument.is_a? SassC::Script::Value::Number
247
253
  return argument
248
254
  end
249
255
 
250
256
  def inspect_map ( argument )
251
257
  argument.to_h.each_pair do |key, value|
252
- raise StandardError.new "key #{key.inspect} is not a string" unless key.is_a? Sass::Script::Value::String
258
+ raise StandardError.new "key #{key.inspect} is not a string" unless key.is_a? SassC::Script::Value::String
253
259
 
254
260
  valueClass = case key.value
255
261
  when 'string'
256
- Sass::Script::Value::String
262
+ SassC::Script::Value::String
257
263
  when 'number'
258
- Sass::Script::Value::Number
264
+ SassC::Script::Value::Number
259
265
  when 'color'
260
- Sass::Script::Value::Color
266
+ SassC::Script::Value::Color
261
267
  when 'map'
262
- Sass::Script::Value::Map
268
+ SassC::Script::Value::Map
263
269
  end
264
270
 
265
271
  raise StandardError.new "unknown key #{key.inspect}" unless valueClass
@@ -269,41 +275,29 @@ module SassC
269
275
  end
270
276
 
271
277
  def inspect_list(argument)
272
- raise StandardError.new "passed value is not a Sass::Script::Value::List" unless argument.is_a? Sass::Script::Value::List
278
+ raise StandardError.new "passed value is not a Sass::Script::Value::List" unless argument.is_a? SassC::Script::Value::List
273
279
  return argument
274
280
  end
275
281
 
276
282
  def returns_sass_value
277
- return Sass::Script::Value::Color.new(red: 0, green: 0, blue: 0)
283
+ return SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
278
284
  end
279
285
 
280
286
  def returns_sass_map
281
- key = Script::String.new("color", "string")
282
- value = Sass::Script::Value::Color.new(red: 0, green: 0, blue: 0)
287
+ key = SassC::Script::Value::String.new("color", "string")
288
+ value = SassC::Script::Value::Color.new(red: 0, green: 0, blue: 0)
283
289
  values = {}
284
290
  values[key] = value
285
- map = Sass::Script::Value::Map.new values
291
+ map = SassC::Script::Value::Map.new values
286
292
  return map
287
293
  end
288
294
 
289
295
  def returns_sass_list
290
- numbers = [10, 20, 30].map do |n|
291
- Sass::Script::Value::Number.new(n, '')
292
- end
293
-
294
- if Gem.loaded_specs['sass'].version < Gem::Version.create('3.5')
295
- Sass::Script::Value::List.new(numbers, :space)
296
- else
297
- Sass::Script::Value::List.new(numbers, separator: :space)
298
- end
296
+ numbers = [10, 20, 30].map { |n| SassC::Script::Value::Number.new(n, '') }
297
+ SassC::Script::Value::List.new(numbers, separator: :space)
299
298
  end
300
299
 
301
- module Compass
302
- def stylesheet_path(path)
303
- Script::String.new("/css/#{path.value}", :identifier)
304
- end
305
- end
306
- include Compass
307
300
  end
301
+
308
302
  end
309
303
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -57,10 +59,6 @@ module SassC
57
59
  refute_equal 0, status
58
60
  end
59
61
 
60
- def test_failed_compile_gives_error_message
61
- skip
62
- end
63
-
64
62
  def test_custom_function
65
63
  data_context = Native.make_data_context("foo { margin: foo(); }")
66
64
  context = Native.data_context_get_context(data_context)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  module SassC
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "minitest/autorun"
2
4
  require "minitest/pride"
3
5
  require "minitest/around/unit"
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sassc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Boland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-05 00:00:00.000000000 Z
11
+ date: 2018-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: minitest
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -95,33 +81,33 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: ffi
84
+ name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - "~>"
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
- version: 1.9.6
89
+ version: '0'
104
90
  type: :runtime
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - "~>"
94
+ - - ">="
109
95
  - !ruby/object:Gem::Version
110
- version: 1.9.6
96
+ version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
- name: sass
98
+ name: ffi
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - ">="
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: 3.3.0
103
+ version: 1.9.6
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - ">="
108
+ - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: 3.3.0
110
+ version: 1.9.6
125
111
  description: Use libsass with Ruby!
126
112
  email:
127
113
  - ryan@tanookilabs.com
@@ -133,6 +119,7 @@ files:
133
119
  - ".gitignore"
134
120
  - ".gitmodules"
135
121
  - ".travis.yml"
122
+ - CHANGELOG.md
136
123
  - CODE_OF_CONDUCT.md
137
124
  - Gemfile
138
125
  - LICENSE.txt
@@ -334,8 +321,6 @@ files:
334
321
  - ext/libsass/win/libsass.vcxproj
335
322
  - ext/libsass/win/libsass.vcxproj.filters
336
323
  - lib/sassc.rb
337
- - lib/sassc/cache_stores.rb
338
- - lib/sassc/cache_stores/base.rb
339
324
  - lib/sassc/dependency.rb
340
325
  - lib/sassc/engine.rb
341
326
  - lib/sassc/error.rb
@@ -354,6 +339,13 @@ files:
354
339
  - lib/sassc/sass_2_scss.rb
355
340
  - lib/sassc/script.rb
356
341
  - lib/sassc/script/functions.rb
342
+ - lib/sassc/script/value.rb
343
+ - lib/sassc/script/value/bool.rb
344
+ - lib/sassc/script/value/color.rb
345
+ - lib/sassc/script/value/list.rb
346
+ - lib/sassc/script/value/map.rb
347
+ - lib/sassc/script/value/number.rb
348
+ - lib/sassc/script/value/string.rb
357
349
  - lib/sassc/script/value_conversion.rb
358
350
  - lib/sassc/script/value_conversion/base.rb
359
351
  - lib/sassc/script/value_conversion/bool.rb
@@ -362,6 +354,8 @@ files:
362
354
  - lib/sassc/script/value_conversion/map.rb
363
355
  - lib/sassc/script/value_conversion/number.rb
364
356
  - lib/sassc/script/value_conversion/string.rb
357
+ - lib/sassc/util.rb
358
+ - lib/sassc/util/normalized_map.rb
365
359
  - lib/sassc/version.rb
366
360
  - lib/tasks/libsass.rb
367
361
  - sassc.gemspec
@@ -386,7 +380,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
386
380
  requirements:
387
381
  - - ">="
388
382
  - !ruby/object:Gem::Version
389
- version: '0'
383
+ version: 2.3.3
390
384
  required_rubygems_version: !ruby/object:Gem::Requirement
391
385
  requirements:
392
386
  - - ">="