sassc 1.12.1 → 2.0.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 (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
  - - ">="