sass-embedded 0.16.1 → 0.16.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ecdaedc0510249bc9b8e7da46e0b786a607153db705b5224214d5a2ef407f2a
4
- data.tar.gz: 91ea0069f066bad0693367290eee7242f10b2514ba6502b3682bdfccfd3fe9d5
3
+ metadata.gz: bc4a584b02baef5fc270ec2ce84d7843c01f3656e64aa0c30e303a1d4c123313
4
+ data.tar.gz: d2230700daf1964f727ca1e5d5c695244cdb1d304700ad15997526ccb62ad31c
5
5
  SHA512:
6
- metadata.gz: 1549a6a67863a7d3f3604a3f084fea4721540cbe9ffc9919505b0e71e6eac751eb5e6fa096673234307c6930962cef79ab5ba796c9c9c690fe157a8a3c580857
7
- data.tar.gz: d98d4678e005203209feb31d1af90b842aef964dc7771cfd3ebc22a2e7558a9929cb014d750c8b9bfb9b8725c3d9764ac3da93bab0695ea9a46c32879f93ff77
6
+ metadata.gz: 9fc031920618a3bc5b40a5c146b7ef8fc56b9d048b5c481b214425f3e17b72d05651ef1645b29ac08a15c5504d0c48b4f6605e6e5c13224560a9b26d212b13e9
7
+ data.tar.gz: e2a1e112ab8241f2a5393d01b237d1a9d41dcca7f386fdaa42a287c5a9cd82d4a6ec909775598a4235a373573ff76381df302f07f16861399ecad35734ea9913
@@ -8,6 +8,8 @@ module Sass
8
8
  attr_reader :global_functions
9
9
 
10
10
  def initialize(functions)
11
+ functions = functions.transform_keys(&:to_s)
12
+
11
13
  @global_functions = functions.keys
12
14
  @functions_by_name = functions.transform_keys do |signature|
13
15
  signature = signature.chomp
@@ -37,10 +39,10 @@ module Sass
37
39
 
38
40
  def function_call(function_call_request)
39
41
  arguments = function_call_request.arguments.map do |argument|
40
- protofier.from_proto_value(argument)
42
+ value_protofier.from_proto(argument)
41
43
  end
42
44
 
43
- success = protofier.to_proto_value(get(function_call_request).call(arguments))
45
+ success = value_protofier.to_proto(get(function_call_request).call(arguments))
44
46
  accessed_argument_lists = arguments
45
47
  .filter do |argument|
46
48
  argument.is_a?(Sass::Value::ArgumentList) && argument.instance_eval do
@@ -72,8 +74,8 @@ module Sass
72
74
  end
73
75
  end
74
76
 
75
- def protofier
76
- @protofier ||= Protofier.new(self)
77
+ def value_protofier
78
+ @value_protofier ||= ValueProtofier.new(self)
77
79
  end
78
80
  end
79
81
 
@@ -20,6 +20,8 @@ module Sass
20
20
  end
21
21
 
22
22
  def register(importer)
23
+ importer = Structifier.to_struct(importer)
24
+
23
25
  is_importer = importer.respond_to?(:canonicalize) && importer.respond_to?(:load)
24
26
  is_file_importer = importer.respond_to?(:find_file_url)
25
27
 
@@ -56,7 +58,7 @@ module Sass
56
58
 
57
59
  def import(import_request)
58
60
  importer = @importers_by_id[import_request.importer_id]
59
- importer_result = Protofier.to_struct importer.load(import_request.url)
61
+ importer_result = Structifier.to_struct importer.load(import_request.url)
60
62
 
61
63
  EmbeddedProtocol::InboundMessage::ImportResponse.new(
62
64
  id: import_request.id,
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ class Embedded
5
+ class CompileContext
6
+ # The {LoggerRegistry} for {CompileContext}.
7
+ class LoggerRegistry
8
+ attr_reader :logger
9
+
10
+ def initialize(logger)
11
+ @logger = Structifier.to_struct(logger)
12
+ end
13
+
14
+ def log(event)
15
+ case event.type
16
+ when :DEBUG
17
+ if logger.respond_to? :debug
18
+ logger.debug(event.message, span: Protofier.from_proto_source_span(event.span))
19
+ else
20
+ warn(event.formatted)
21
+ end
22
+ when :DEPRECATION_WARNING
23
+ if logger.respond_to? :warn
24
+ logger.warn(event.message, deprecation: true,
25
+ span: Protofier.from_proto_source_span(event.span),
26
+ stack: event.stack_trace)
27
+ else
28
+ warn(event.formatted)
29
+ end
30
+ when :WARNING
31
+ if logger.respond_to? :warn
32
+ logger.warn(event.message, deprecation: false,
33
+ span: Protofier.from_proto_source_span(event.span),
34
+ stack: event.stack_trace)
35
+ else
36
+ warn(event.formatted)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ private_constant :LoggerRegistry
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,237 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ class Embedded
5
+ class CompileContext
6
+ # The {ValueProtofier} between Pure Ruby types and Protobuf Ruby types.
7
+ class ValueProtofier
8
+ def initialize(function_registry)
9
+ @function_registry = function_registry
10
+ end
11
+
12
+ def to_proto(obj)
13
+ case obj
14
+ when Sass::Value::String
15
+ Sass::EmbeddedProtocol::Value.new(
16
+ string: Sass::EmbeddedProtocol::Value::String.new(
17
+ text: obj.text,
18
+ quoted: obj.quoted?
19
+ )
20
+ )
21
+ when Sass::Value::Number
22
+ Sass::EmbeddedProtocol::Value.new(
23
+ number: Sass::EmbeddedProtocol::Value::Number.new(
24
+ value: obj.value.to_f,
25
+ numerators: obj.numerator_units,
26
+ denominators: obj.denominator_units
27
+ )
28
+ )
29
+ when Sass::Value::Color
30
+ if obj.instance_eval { @hue.nil? }
31
+ Sass::EmbeddedProtocol::Value.new(
32
+ rgb_color: Sass::EmbeddedProtocol::Value::RgbColor.new(
33
+ red: obj.red,
34
+ green: obj.green,
35
+ blue: obj.blue,
36
+ alpha: obj.alpha.to_f
37
+ )
38
+ )
39
+ elsif obj.instance_eval { @saturation.nil? }
40
+ Sass::EmbeddedProtocol::Value.new(
41
+ hwb_color: Sass::EmbeddedProtocol::Value::HwbColor.new(
42
+ hue: obj.hue.to_f,
43
+ whiteness: obj.whiteness.to_f,
44
+ blackness: obj.blackness.to_f,
45
+ alpha: obj.alpha.to_f
46
+ )
47
+ )
48
+ else
49
+ Sass::EmbeddedProtocol::Value.new(
50
+ hsl_color: Sass::EmbeddedProtocol::Value::HslColor.new(
51
+ hue: obj.hue.to_f,
52
+ saturation: obj.saturation.to_f,
53
+ lightness: obj.lightness.to_f,
54
+ alpha: obj.alpha.to_f
55
+ )
56
+ )
57
+ end
58
+ when Sass::Value::ArgumentList
59
+ Sass::EmbeddedProtocol::Value.new(
60
+ argument_list: Sass::EmbeddedProtocol::Value::ArgumentList.new(
61
+ id: obj.instance_eval { @id },
62
+ contents: obj.contents.map { |element| to_proto(element) },
63
+ keywords: obj.keywords.transform_values { |value| to_proto(value) },
64
+ separator: ListSeparator.to_proto(obj.separator)
65
+ )
66
+ )
67
+ when Sass::Value::List
68
+ Sass::EmbeddedProtocol::Value.new(
69
+ list: Sass::EmbeddedProtocol::Value::List.new(
70
+ contents: obj.contents.map { |element| to_proto(element) },
71
+ separator: ListSeparator.to_proto(obj.separator),
72
+ has_brackets: obj.bracketed?
73
+ )
74
+ )
75
+ when Sass::Value::Map
76
+ Sass::EmbeddedProtocol::Value.new(
77
+ map: Sass::EmbeddedProtocol::Value::Map.new(
78
+ entries: obj.contents.map do |key, value|
79
+ Sass::EmbeddedProtocol::Value::Map::Entry.new(
80
+ key: to_proto(key),
81
+ value: to_proto(value)
82
+ )
83
+ end
84
+ )
85
+ )
86
+ when Sass::Value::Function
87
+ if obj.id
88
+ Sass::EmbeddedProtocol::Value.new(
89
+ compiler_function: Sass::EmbeddedProtocol::Value::CompilerFunction.new(
90
+ id: obj.id
91
+ )
92
+ )
93
+ else
94
+ Sass::EmbeddedProtocol::Value.new(
95
+ host_function: Sass::EmbeddedProtocol::Value::HostFunction.new(
96
+ id: @function_registry.register(obj.callback),
97
+ signature: obj.signature
98
+ )
99
+ )
100
+ end
101
+ when Sass::Value::Boolean
102
+ Sass::EmbeddedProtocol::Value.new(
103
+ singleton: obj.value ? :TRUE : :FALSE
104
+ )
105
+ when Sass::Value::Null
106
+ Sass::EmbeddedProtocol::Value.new(
107
+ singleton: :NULL
108
+ )
109
+ else
110
+ raise Sass::ScriptError, "Unknown Sass::Value #{obj}"
111
+ end
112
+ end
113
+
114
+ def from_proto(proto)
115
+ obj = proto.method(proto.value).call
116
+ case proto.value
117
+ when :string
118
+ Sass::Value::String.new(
119
+ obj.text,
120
+ quoted: obj.quoted
121
+ )
122
+ when :number
123
+ Sass::Value::Number.new(
124
+ obj.value,
125
+ obj.numerators,
126
+ obj.denominators
127
+ )
128
+ when :rgb_color
129
+ Sass::Value::Color.new(
130
+ red: obj.red,
131
+ green: obj.green,
132
+ blue: obj.blue,
133
+ alpha: obj.alpha
134
+ )
135
+ when :hsl_color
136
+ Sass::Value::Color.new(
137
+ hue: obj.hue,
138
+ saturation: obj.saturation,
139
+ lightness: obj.lightness,
140
+ alpha: obj.alpha
141
+ )
142
+ when :hwb_color
143
+ Sass::Value::Color.new(
144
+ hue: obj.hue,
145
+ whiteness: obj.whiteness,
146
+ blackness: obj.blackness,
147
+ alpha: obj.alpha
148
+ )
149
+ when :argument_list
150
+ Sass::Value::ArgumentList.new(
151
+ obj.contents.map do |element|
152
+ from_proto(element)
153
+ end,
154
+ obj.keywords.entries.to_h do |entry|
155
+ [entry.first, from_proto(entry.last)]
156
+ end,
157
+ ListSeparator.from_proto(obj.separator)
158
+ ).instance_eval do
159
+ @id = obj.id
160
+ self
161
+ end
162
+ when :list
163
+ Sass::Value::List.new(
164
+ obj.contents.map do |element|
165
+ from_proto(element)
166
+ end,
167
+ separator: ListSeparator.from_proto(obj.separator),
168
+ bracketed: obj.has_brackets
169
+ )
170
+ when :map
171
+ Sass::Value::Map.new(
172
+ obj.entries.to_h do |entry|
173
+ [from_proto(entry.key), from_proto(entry.value)]
174
+ end
175
+ )
176
+ when :compiler_function
177
+ Sass::Value::Function.new(obj.id)
178
+ when :host_function
179
+ raise ProtocolError, 'The compiler may not send Value.host_function to host'
180
+ when :singleton
181
+ case obj
182
+ when :TRUE
183
+ Sass::Value::Boolean::TRUE
184
+ when :FALSE
185
+ Sass::Value::Boolean::FALSE
186
+ when :NULL
187
+ Sass::Value::Null::NULL
188
+ else
189
+ raise Sass::ScriptError, "Unknown Value.singleton #{obj}"
190
+ end
191
+ else
192
+ raise Sass::ScriptError, "Unknown Value.value #{obj}"
193
+ end
194
+ end
195
+
196
+ # The {ListSeparator} Protofier.
197
+ module ListSeparator
198
+ module_function
199
+
200
+ def to_proto(separator)
201
+ case separator
202
+ when ','
203
+ :COMMA
204
+ when ' '
205
+ :SPACE
206
+ when '/'
207
+ :SLASH
208
+ when nil
209
+ :UNDECIDED
210
+ else
211
+ raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
212
+ end
213
+ end
214
+
215
+ def from_proto(separator)
216
+ case separator
217
+ when :COMMA
218
+ ','
219
+ when :SPACE
220
+ ' '
221
+ when :SLASH
222
+ '/'
223
+ when :UNDECIDED
224
+ nil
225
+ else
226
+ raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
227
+ end
228
+ end
229
+ end
230
+
231
+ private_constant :ListSeparator
232
+ end
233
+
234
+ private_constant :ValueProtofier
235
+ end
236
+ end
237
+ end
@@ -27,34 +27,33 @@ module Sass
27
27
  logger:,
28
28
  quiet_deps:,
29
29
  verbose:)
30
- @path = path
31
- @source = source
32
-
33
- @load_paths = load_paths
34
- @syntax = syntax
35
- @url = url
36
-
37
- @source_map = source_map
38
- @source_map_include_sources = source_map_include_sources
39
- @style = style
40
-
41
- @function_registery = FunctionRegistry.new(functions.transform_keys(&:to_s))
42
- @importer_registery = ImporterRegistry.new(importers.map do |obj|
43
- Protofier.to_struct(obj)
44
- end, load_paths)
45
- @importer = importer.nil? ? nil : @importer_registery.register(Protofier.to_struct(importer))
46
-
47
- @alert_ascii = alert_ascii
48
- @alert_color = alert_color
49
-
50
- @logger = Protofier.to_struct(logger)
51
-
52
- @quiet_deps = quiet_deps
53
- @verbose = verbose
30
+ @function_registery = FunctionRegistry.new(functions)
31
+ @importer_registery = ImporterRegistry.new(importers, load_paths)
32
+ @logger_registery = LoggerRegistry.new(logger)
54
33
 
55
34
  super(channel)
56
35
 
57
- send_message compile_request
36
+ send_message EmbeddedProtocol::InboundMessage::CompileRequest.new(
37
+ id: id,
38
+ string: unless source.nil?
39
+ EmbeddedProtocol::InboundMessage::CompileRequest::StringInput.new(
40
+ source: source,
41
+ url: url&.to_s,
42
+ syntax: Protofier.to_proto_syntax(syntax),
43
+ importer: importer.nil? ? nil : @importer_registery.register(importer)
44
+ )
45
+ end,
46
+ path: path,
47
+ style: Protofier.to_proto_output_style(style),
48
+ source_map: source_map,
49
+ source_map_include_sources: source_map_include_sources,
50
+ importers: @importer_registery.importers,
51
+ global_functions: @function_registery.global_functions,
52
+ alert_ascii: alert_ascii,
53
+ alert_color: alert_color,
54
+ quiet_deps: quiet_deps,
55
+ verbose: verbose
56
+ )
58
57
  end
59
58
 
60
59
  def update(error, message)
@@ -70,7 +69,7 @@ module Sass
70
69
  when EmbeddedProtocol::OutboundMessage::LogEvent
71
70
  return unless message.compilation_id == id
72
71
 
73
- log message
72
+ @logger_registery.log message
74
73
  when EmbeddedProtocol::OutboundMessage::CanonicalizeRequest
75
74
  return unless message.compilation_id == id
76
75
 
@@ -101,57 +100,6 @@ module Sass
101
100
  super(e, nil)
102
101
  end
103
102
  end
104
-
105
- private
106
-
107
- def log(event)
108
- case event.type
109
- when :DEBUG
110
- if @logger.respond_to? :debug
111
- @logger.debug(event.message, span: Protofier.from_proto_source_span(event.span))
112
- else
113
- Kernel.warn(event.formatted)
114
- end
115
- when :DEPRECATION_WARNING
116
- if @logger.respond_to? :warn
117
- @logger.warn(event.message, deprecation: true,
118
- span: Protofier.from_proto_source_span(event.span),
119
- stack: event.stack_trace)
120
- else
121
- Kernel.warn(event.formatted)
122
- end
123
- when :WARNING
124
- if @logger.respond_to? :warn
125
- @logger.warn(event.message, deprecation: false,
126
- span: Protofier.from_proto_source_span(event.span),
127
- stack: event.stack_trace)
128
- else
129
- Kernel.warn(event.formatted)
130
- end
131
- end
132
- end
133
-
134
- def compile_request
135
- EmbeddedProtocol::InboundMessage::CompileRequest.new(
136
- id: id,
137
- string: unless @source.nil?
138
- EmbeddedProtocol::InboundMessage::CompileRequest::StringInput.new(
139
- source: @source,
140
- url: @url&.to_s,
141
- syntax: Protofier.to_proto_syntax(@syntax),
142
- importer: @importer
143
- )
144
- end,
145
- path: @path,
146
- style: Protofier.to_proto_output_style(@style),
147
- source_map: @source_map,
148
- source_map_include_sources: @source_map_include_sources,
149
- importers: @importer_registery.importers,
150
- global_functions: @function_registery.global_functions,
151
- alert_ascii: @alert_ascii,
152
- alert_color: @alert_color
153
- )
154
- end
155
103
  end
156
104
 
157
105
  private_constant :CompileContext
@@ -106,37 +106,16 @@ module Sass
106
106
  end
107
107
 
108
108
  def read
109
- length = read_varint(@stdout)
109
+ length = Varint.read(@stdout)
110
110
  @stdout.read(length)
111
111
  end
112
112
 
113
113
  def write(payload)
114
114
  @stdin_mutex.synchronize do
115
- write_varint(@stdin, payload.length)
116
- @stdin.write payload
115
+ Varint.write(@stdin, payload.length)
116
+ @stdin.write(payload)
117
117
  end
118
118
  end
119
-
120
- def read_varint(readable)
121
- value = bits = 0
122
- loop do
123
- byte = readable.readbyte
124
- value |= (byte & 0x7f) << bits
125
- bits += 7
126
- break if byte < 0x80
127
- end
128
- value
129
- end
130
-
131
- def write_varint(writeable, value)
132
- bytes = []
133
- until value < 0x80
134
- bytes << (0x80 | (value & 0x7f))
135
- value >>= 7
136
- end
137
- bytes << value
138
- writeable.write bytes.pack('C*')
139
- end
140
119
  end
141
120
 
142
121
  private_constant :Compiler
@@ -3,7 +3,7 @@
3
3
  module Sass
4
4
  class Embedded
5
5
  # The {Protofier} between Pure Ruby types and Protobuf Ruby types.
6
- class Protofier
6
+ module Protofier
7
7
  ONEOF_MESSAGE = EmbeddedProtocol::InboundMessage
8
8
  .descriptor
9
9
  .lookup_oneof('message')
@@ -13,313 +13,75 @@ module Sass
13
13
 
14
14
  private_constant :ONEOF_MESSAGE
15
15
 
16
- def initialize(function_registry)
17
- @function_registry = function_registry
18
- end
16
+ module_function
19
17
 
20
- def to_proto_value(obj)
21
- case obj
22
- when Sass::Value::String
23
- Sass::EmbeddedProtocol::Value.new(
24
- string: Sass::EmbeddedProtocol::Value::String.new(
25
- text: obj.text,
26
- quoted: obj.quoted?
27
- )
28
- )
29
- when Sass::Value::Number
30
- Sass::EmbeddedProtocol::Value.new(
31
- number: Sass::EmbeddedProtocol::Value::Number.new(
32
- value: obj.value.to_f,
33
- numerators: obj.numerator_units,
34
- denominators: obj.denominator_units
35
- )
36
- )
37
- when Sass::Value::Color
38
- if obj.instance_eval { @hue.nil? }
39
- Sass::EmbeddedProtocol::Value.new(
40
- rgb_color: Sass::EmbeddedProtocol::Value::RgbColor.new(
41
- red: obj.red,
42
- green: obj.green,
43
- blue: obj.blue,
44
- alpha: obj.alpha.to_f
45
- )
46
- )
47
- elsif obj.instance_eval { @saturation.nil? }
48
- Sass::EmbeddedProtocol::Value.new(
49
- hwb_color: Sass::EmbeddedProtocol::Value::HwbColor.new(
50
- hue: obj.hue.to_f,
51
- whiteness: obj.whiteness.to_f,
52
- blackness: obj.blackness.to_f,
53
- alpha: obj.alpha.to_f
54
- )
55
- )
56
- else
57
- Sass::EmbeddedProtocol::Value.new(
58
- hsl_color: Sass::EmbeddedProtocol::Value::HslColor.new(
59
- hue: obj.hue.to_f,
60
- saturation: obj.saturation.to_f,
61
- lightness: obj.lightness.to_f,
62
- alpha: obj.alpha.to_f
63
- )
64
- )
65
- end
66
- when Sass::Value::ArgumentList
67
- Sass::EmbeddedProtocol::Value.new(
68
- argument_list: Sass::EmbeddedProtocol::Value::ArgumentList.new(
69
- id: obj.instance_eval { @id },
70
- contents: obj.contents.map { |element| to_proto_value(element) },
71
- keywords: obj.keywords.transform_values { |value| to_proto_value(value) },
72
- separator: to_proto_separator(obj.separator)
73
- )
74
- )
75
- when Sass::Value::List
76
- Sass::EmbeddedProtocol::Value.new(
77
- list: Sass::EmbeddedProtocol::Value::List.new(
78
- contents: obj.contents.map { |element| to_proto_value(element) },
79
- separator: to_proto_separator(obj.separator),
80
- has_brackets: obj.bracketed?
81
- )
82
- )
83
- when Sass::Value::Map
84
- Sass::EmbeddedProtocol::Value.new(
85
- map: Sass::EmbeddedProtocol::Value::Map.new(
86
- entries: obj.contents.map do |key, value|
87
- Sass::EmbeddedProtocol::Value::Map::Entry.new(
88
- key: to_proto_value(key),
89
- value: to_proto_value(value)
90
- )
91
- end
92
- )
93
- )
94
- when Sass::Value::Function
95
- if obj.id
96
- Sass::EmbeddedProtocol::Value.new(
97
- compiler_function: Sass::EmbeddedProtocol::Value::CompilerFunction.new(
98
- id: obj.id
99
- )
100
- )
101
- else
102
- Sass::EmbeddedProtocol::Value.new(
103
- host_function: Sass::EmbeddedProtocol::Value::HostFunction.new(
104
- id: @function_registry.register(obj.callback),
105
- signature: obj.signature
106
- )
107
- )
108
- end
109
- when Sass::Value::Boolean
110
- Sass::EmbeddedProtocol::Value.new(
111
- singleton: obj.value ? :TRUE : :FALSE
18
+ def from_proto_compile_response(compile_response)
19
+ if compile_response.result == :failure
20
+ raise CompileError.new(
21
+ compile_response.failure.formatted || compile_response.failure.message,
22
+ compile_response.failure.message,
23
+ compile_response.failure.stack_trace,
24
+ from_proto_source_span(compile_response.failure.span)
112
25
  )
113
- when Sass::Value::Null
114
- Sass::EmbeddedProtocol::Value.new(
115
- singleton: :NULL
116
- )
117
- else
118
- raise Sass::ScriptError, "Unknown Sass::Value #{obj}"
119
26
  end
120
- end
121
27
 
122
- def from_proto_value(proto)
123
- value = proto.method(proto.value).call
124
- case proto.value
125
- when :string
126
- Sass::Value::String.new(
127
- value.text,
128
- quoted: value.quoted
129
- )
130
- when :number
131
- Sass::Value::Number.new(
132
- value.value,
133
- value.numerators,
134
- value.denominators
135
- )
136
- when :rgb_color
137
- Sass::Value::Color.new(
138
- red: value.red,
139
- green: value.green,
140
- blue: value.blue,
141
- alpha: value.alpha
142
- )
143
- when :hsl_color
144
- Sass::Value::Color.new(
145
- hue: value.hue,
146
- saturation: value.saturation,
147
- lightness: value.lightness,
148
- alpha: value.alpha
149
- )
150
- when :hwb_color
151
- Sass::Value::Color.new(
152
- hue: value.hue,
153
- whiteness: value.whiteness,
154
- blackness: value.blackness,
155
- alpha: value.alpha
156
- )
157
- when :argument_list
158
- Sass::Value::ArgumentList.new(
159
- value.contents.map do |i|
160
- from_proto_value(i)
161
- end,
162
- value.keywords.entries.to_h do |entry|
163
- [entry.first, from_proto_value(entry.last)]
164
- end,
165
- from_proto_separator(value.separator)
166
- ).instance_eval do
167
- @id = value.id
168
- self
169
- end
170
- when :list
171
- Sass::Value::List.new(
172
- value.contents.map do |element|
173
- from_proto_value(element)
174
- end,
175
- separator: from_proto_separator(value.separator),
176
- bracketed: value.has_brackets
177
- )
178
- when :map
179
- Sass::Value::Map.new(
180
- value.entries.to_h do |entry|
181
- [from_proto_value(entry.key), from_proto_value(entry.value)]
182
- end
183
- )
184
- when :compiler_function
185
- Sass::Value::Function.new(value.id)
186
- when :host_function
187
- raise ProtocolError, 'The compiler may not send Value.host_function to host'
188
- when :singleton
189
- case value
190
- when :TRUE
191
- Sass::Value::Boolean::TRUE
192
- when :FALSE
193
- Sass::Value::Boolean::FALSE
194
- when :NULL
195
- Sass::Value::Null::NULL
196
- else
197
- raise Sass::ScriptError "Unknown Value.singleton #{value}"
198
- end
199
- else
200
- raise Sass::ScriptError, "Unknown Value.value #{value}"
201
- end
28
+ CompileResult.new(
29
+ compile_response.success.css,
30
+ compile_response.success.source_map,
31
+ compile_response.success.loaded_urls
32
+ )
202
33
  end
203
34
 
204
- private
35
+ def from_proto_source_span(source_span)
36
+ return nil if source_span.nil?
205
37
 
206
- def to_proto_separator(separator)
207
- case separator
208
- when ','
209
- :COMMA
210
- when ' '
211
- :SPACE
212
- when '/'
213
- :SLASH
214
- when nil
215
- :UNDECIDED
216
- else
217
- raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
218
- end
38
+ Logger::SourceSpan.new(from_proto_source_location(source_span.start),
39
+ from_proto_source_location(source_span.end),
40
+ source_span.text,
41
+ source_span.url,
42
+ source_span.context)
219
43
  end
220
44
 
221
- def from_proto_separator(separator)
222
- case separator
223
- when :COMMA
224
- ','
225
- when :SPACE
226
- ' '
227
- when :SLASH
228
- '/'
229
- when :UNDECIDED
230
- nil
231
- else
232
- raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
233
- end
234
- end
235
-
236
- class << self
237
- def from_proto_compile_response(compile_response)
238
- if compile_response.result == :failure
239
- raise CompileError.new(
240
- compile_response.failure.formatted || compile_response.failure.message,
241
- compile_response.failure.message,
242
- compile_response.failure.stack_trace,
243
- from_proto_source_span(compile_response.failure.span)
244
- )
245
- end
246
-
247
- CompileResult.new(
248
- compile_response.success.css,
249
- compile_response.success.source_map,
250
- compile_response.success.loaded_urls
251
- )
252
- end
253
-
254
- def from_proto_source_span(source_span)
255
- return nil if source_span.nil?
256
-
257
- Logger::SourceSpan.new(from_proto_source_location(source_span.start),
258
- from_proto_source_location(source_span.end),
259
- source_span.text,
260
- source_span.url,
261
- source_span.context)
262
- end
263
-
264
- def from_proto_source_location(source_location)
265
- return nil if source_location.nil?
266
-
267
- Logger::SourceLocation.new(source_location.offset,
268
- source_location.line,
269
- source_location.column)
270
- end
45
+ def from_proto_source_location(source_location)
46
+ return nil if source_location.nil?
271
47
 
272
- def from_proto_message(proto)
273
- message = EmbeddedProtocol::OutboundMessage.decode(proto)
274
- message.method(message.message).call
275
- end
48
+ Logger::SourceLocation.new(source_location.offset,
49
+ source_location.line,
50
+ source_location.column)
51
+ end
276
52
 
277
- def to_proto_message(message)
278
- EmbeddedProtocol::InboundMessage.new(
279
- ONEOF_MESSAGE[message.class.descriptor] => message
280
- ).to_proto
281
- end
53
+ def from_proto_message(proto)
54
+ message = EmbeddedProtocol::OutboundMessage.decode(proto)
55
+ message.method(message.message).call
56
+ end
282
57
 
283
- def to_proto_syntax(syntax)
284
- case syntax&.to_sym
285
- when :scss
286
- EmbeddedProtocol::Syntax::SCSS
287
- when :indented
288
- EmbeddedProtocol::Syntax::INDENTED
289
- when :css
290
- EmbeddedProtocol::Syntax::CSS
291
- else
292
- raise ArgumentError, 'syntax must be one of :scss, :indented, :css'
293
- end
294
- end
58
+ def to_proto_message(message)
59
+ EmbeddedProtocol::InboundMessage.new(
60
+ ONEOF_MESSAGE[message.class.descriptor] => message
61
+ ).to_proto
62
+ end
295
63
 
296
- def to_proto_output_style(style)
297
- case style&.to_sym
298
- when :expanded
299
- EmbeddedProtocol::OutputStyle::EXPANDED
300
- when :compressed
301
- EmbeddedProtocol::OutputStyle::COMPRESSED
302
- else
303
- raise ArgumentError, 'style must be one of :expanded, :compressed'
304
- end
64
+ def to_proto_syntax(syntax)
65
+ case syntax&.to_sym
66
+ when :scss
67
+ EmbeddedProtocol::Syntax::SCSS
68
+ when :indented
69
+ EmbeddedProtocol::Syntax::INDENTED
70
+ when :css
71
+ EmbeddedProtocol::Syntax::CSS
72
+ else
73
+ raise ArgumentError, 'syntax must be one of :scss, :indented, :css'
305
74
  end
75
+ end
306
76
 
307
- def to_struct(obj)
308
- return obj unless obj.is_a? Hash
309
-
310
- struct = Object.new
311
- obj.each do |key, value|
312
- if value.respond_to? :call
313
- struct.define_singleton_method key.to_sym do |*args, **kwargs|
314
- value.call(*args, **kwargs)
315
- end
316
- else
317
- struct.define_singleton_method key.to_sym do
318
- value
319
- end
320
- end
321
- end
322
- struct
77
+ def to_proto_output_style(style)
78
+ case style&.to_sym
79
+ when :expanded
80
+ EmbeddedProtocol::OutputStyle::EXPANDED
81
+ when :compressed
82
+ EmbeddedProtocol::OutputStyle::COMPRESSED
83
+ else
84
+ raise ArgumentError, 'style must be one of :expanded, :compressed'
323
85
  end
324
86
  end
325
87
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ class Embedded
5
+ # The {Structifier} that convert {::Hash} to {Struct}-like object.
6
+ module Structifier
7
+ module_function
8
+
9
+ def to_struct(obj)
10
+ return obj unless obj.is_a? Hash
11
+
12
+ struct = Object.new
13
+ obj.each do |key, value|
14
+ if value.respond_to? :call
15
+ struct.define_singleton_method key.to_sym do |*args, **kwargs|
16
+ value.call(*args, **kwargs)
17
+ end
18
+ else
19
+ struct.define_singleton_method key.to_sym do
20
+ value
21
+ end
22
+ end
23
+ end
24
+ struct
25
+ end
26
+ end
27
+
28
+ private_constant :Structifier
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ class Embedded
5
+ # Read and write {Varint} from {::IO}.
6
+ module Varint
7
+ module_function
8
+
9
+ def read(readable)
10
+ value = bits = 0
11
+ loop do
12
+ byte = readable.readbyte
13
+ value |= (byte & 0x7f) << bits
14
+ bits += 7
15
+ break if byte < 0x80
16
+ end
17
+ value
18
+ end
19
+
20
+ def write(writeable, value)
21
+ bytes = []
22
+ until value < 0x80
23
+ bytes << (0x80 | (value & 0x7f))
24
+ value >>= 7
25
+ end
26
+ bytes << value
27
+ writeable.write bytes.pack('C*')
28
+ end
29
+ end
30
+
31
+ private_constant :Varint
32
+ end
33
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sass
4
4
  class Embedded
5
- VERSION = '0.16.1'
5
+ VERSION = '0.16.2'
6
6
  end
7
7
  end
data/lib/sass.rb CHANGED
@@ -8,12 +8,16 @@ require_relative 'sass/embedded/observer'
8
8
  require_relative 'sass/embedded/compile_context'
9
9
  require_relative 'sass/embedded/compile_context/function_registry'
10
10
  require_relative 'sass/embedded/compile_context/importer_registry'
11
+ require_relative 'sass/embedded/compile_context/logger_registry'
12
+ require_relative 'sass/embedded/compile_context/value_protofier'
11
13
  require_relative 'sass/embedded/compiler'
12
14
  require_relative 'sass/embedded/compiler/path'
13
15
  require_relative 'sass/embedded_protocol'
14
16
  require_relative 'sass/embedded/legacy'
15
17
  require_relative 'sass/embedded/protocol_error'
16
18
  require_relative 'sass/embedded/protofier'
19
+ require_relative 'sass/embedded/structifier'
20
+ require_relative 'sass/embedded/varint'
17
21
  require_relative 'sass/embedded/version'
18
22
  require_relative 'sass/embedded/version_context'
19
23
  require_relative 'sass/logger'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass-embedded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.1
4
+ version: 0.16.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - なつき
@@ -131,6 +131,8 @@ files:
131
131
  - lib/sass/embedded/compile_context.rb
132
132
  - lib/sass/embedded/compile_context/function_registry.rb
133
133
  - lib/sass/embedded/compile_context/importer_registry.rb
134
+ - lib/sass/embedded/compile_context/logger_registry.rb
135
+ - lib/sass/embedded/compile_context/value_protofier.rb
134
136
  - lib/sass/embedded/compiler.rb
135
137
  - lib/sass/embedded/compiler/path.rb
136
138
  - lib/sass/embedded/compiler/requirements.rb
@@ -138,6 +140,8 @@ files:
138
140
  - lib/sass/embedded/observer.rb
139
141
  - lib/sass/embedded/protocol_error.rb
140
142
  - lib/sass/embedded/protofier.rb
143
+ - lib/sass/embedded/structifier.rb
144
+ - lib/sass/embedded/varint.rb
141
145
  - lib/sass/embedded/version.rb
142
146
  - lib/sass/embedded/version_context.rb
143
147
  - lib/sass/embedded_protocol.rb
@@ -161,8 +165,8 @@ homepage: https://github.com/ntkme/sass-embedded-host-ruby
161
165
  licenses:
162
166
  - MIT
163
167
  metadata:
164
- documentation_uri: https://www.rubydoc.info/gems/sass-embedded/0.16.1
165
- source_code_uri: https://github.com/ntkme/sass-embedded-host-ruby/tree/v0.16.1
168
+ documentation_uri: https://www.rubydoc.info/gems/sass-embedded/0.16.2
169
+ source_code_uri: https://github.com/ntkme/sass-embedded-host-ruby/tree/v0.16.2
166
170
  funding_uri: https://github.com/sponsors/ntkme
167
171
  post_install_message:
168
172
  rdoc_options: []