sass-embedded 0.7.0 → 0.7.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af257f49189b3ea9e19c67fd67dba0cbf35d010c7a222e36fd820afee7eb3e10
4
- data.tar.gz: a63caa77fc2a9793f5138896df09722aae680b85a11db50512da3281fba8fae7
3
+ metadata.gz: 107eda35f850f6a5d3744a89ba8dcd71abf8ea76659f0c51710ecde9f3233c53
4
+ data.tar.gz: f3e8d8d963f9a3bfffa00908b91e90d17fd4e9a04046a6c9a739e16b3eae5cb5
5
5
  SHA512:
6
- metadata.gz: 1b5e7ea087a76653e6e45ee2338eeb31224a85388b9ece793d90652176f50d77affb4816acccfa6c1dbe5ffb5221bebc3bd1d0a00dcade850e6413125c4d1fc6
7
- data.tar.gz: 7de00d938497c9d447c396d69eb4d6907683097c3b897c77ead784a17f3fcc691f8a67ca99bc5fbf9e7ce268db5f443e31d65903e81c8acb966238760db1a35a
6
+ metadata.gz: a9e2dcfbd314b616b66c53511fe021006c20e0a359bb9769db7bf87d14d9377443e245abf88f5da6e1b4414d34d4d05e529885b79169db7c86f8029ed3c7f1f5
7
+ data.tar.gz: d8ade839bab88a4ff4098f1b045b31dfd532570dbadcb76866fc3c13be603c445583ea2fe2b86aa9ba7b2472272f992d9dd28ce21eb64aaf8693d1ec557660b9
data/lib/sass.rb CHANGED
@@ -60,6 +60,7 @@ module Sass
60
60
  end
61
61
  end
62
62
 
63
+ require_relative 'sass/version'
63
64
  require_relative 'sass/platform'
64
65
  require_relative 'sass/util'
65
66
  require_relative 'sass/struct'
@@ -67,6 +68,6 @@ require_relative 'sass/result'
67
68
  require_relative 'sass/error'
68
69
  require_relative 'sass/transport'
69
70
  require_relative 'sass/observer'
70
- require_relative 'sass/version'
71
+ require_relative 'sass/info'
71
72
  require_relative 'sass/render'
72
73
  require_relative 'sass/embedded'
data/lib/sass/embedded.rb CHANGED
@@ -23,7 +23,7 @@ module Sass
23
23
  #
24
24
  # @raise [ProtocolError]
25
25
  def info
26
- @info ||= Version.new(@transport, next_id).message
26
+ @info ||= VersionContext.new(@transport, next_id).receive_message
27
27
  end
28
28
 
29
29
  # The {Embedded#render} method.
@@ -55,16 +55,16 @@ module Sass
55
55
  indent_width = parse_indent_width(indent_width)
56
56
  linefeed = parse_linefeed(linefeed)
57
57
 
58
- message = Render.new(@transport, next_id,
59
- data: data,
60
- file: file,
61
- indented_syntax: indented_syntax,
62
- include_paths: include_paths,
63
- output_style: output_style,
64
- source_map: source_map,
65
- out_file: out_file,
66
- functions: functions,
67
- importer: importer).message
58
+ message = RenderContext.new(@transport, next_id,
59
+ data: data,
60
+ file: file,
61
+ indented_syntax: indented_syntax,
62
+ include_paths: include_paths,
63
+ output_style: output_style,
64
+ source_map: source_map,
65
+ out_file: out_file,
66
+ functions: functions,
67
+ importer: importer).receive_message
68
68
 
69
69
  if message.failure
70
70
  raise RenderError.new(
@@ -75,7 +75,7 @@ module Sass
75
75
  elsif message.failure.span.url == ''
76
76
  'stdin'
77
77
  else
78
- Util.path(message.failure.span.url)
78
+ Util.path_from_file_uri(message.failure.span.url)
79
79
  end,
80
80
  message.failure.span ? message.failure.span.start.line + 1 : nil,
81
81
  message.failure.span ? message.failure.span.start.column + 1 : nil,
@@ -102,7 +102,7 @@ module Sass
102
102
 
103
103
  finish = Util.now
104
104
 
105
- stats = RenderResult::Stats.new(file.nil? ? 'data' : file, start, finish, finish - start)
105
+ stats = RenderResultStats.new(file.nil? ? 'data' : file, start, finish, finish - start)
106
106
 
107
107
  RenderResult.new(css, map, stats)
108
108
  end
@@ -138,7 +138,7 @@ module Sass
138
138
  source_map_dir = File.dirname(source_map_path)
139
139
 
140
140
  if out_file
141
- map_data['file'] = Util.relative(source_map_dir, out_file)
141
+ map_data['file'] = Util.relative_path(source_map_dir, out_file)
142
142
  elsif file
143
143
  ext = File.extname(file)
144
144
  map_data['file'] = "#{file[0..(ext.empty? ? -1 : -ext.length - 1)]}.css"
@@ -149,10 +149,10 @@ module Sass
149
149
  map_data['sourcesContent'] = [] if source_map_contents
150
150
 
151
151
  map_data['sources'].map! do |source|
152
- if source.start_with? Util::FILE_PROTOCOL
153
- path = Util.path(source)
152
+ if source.start_with? 'file://'
153
+ path = Util.path_from_file_uri(source)
154
154
  map_data['sourcesContent'].push(File.read(path)) if source_map_contents
155
- Util.relative(source_map_dir, path)
155
+ Util.relative_path(source_map_dir, path)
156
156
  else
157
157
  map_data['sourcesContent'].push(nil) if source_map_contents
158
158
  source
@@ -184,7 +184,7 @@ module Sass
184
184
  url = if source_map_embed
185
185
  "data:application/json;base64,#{Base64.strict_encode64(map)}"
186
186
  elsif out_file
187
- Util.relative(File.dirname(out_file), source_map)
187
+ Util.relative_path(File.dirname(out_file), source_map)
188
188
  else
189
189
  source_map
190
190
  end
data/lib/sass/info.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sass
4
4
  # The {Observer} for {Embedded#info}.
5
- class Version
5
+ class VersionContext
6
6
  include Observer
7
7
 
8
8
  def initialize(transport, id)
data/lib/sass/observer.rb CHANGED
@@ -12,7 +12,7 @@ module Sass
12
12
  @transport.add_observer self
13
13
  end
14
14
 
15
- def message
15
+ def receive_message
16
16
  @mutex.synchronize do
17
17
  @condition_variable.wait(@mutex) if @error.nil? && @message.nil?
18
18
  end
data/lib/sass/render.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sass
4
4
  # The {Observer} for {Embedded#render}.
5
- class Render
5
+ class RenderContext
6
6
  include Observer
7
7
 
8
8
  def initialize(transport, id,
@@ -97,7 +97,7 @@ module Sass
97
97
  end
98
98
 
99
99
  def canonicalize_response(canonicalize_request)
100
- url = Util.file_uri(File.absolute_path(canonicalize_request.url, (@file.nil? ? 'stdin' : @file)))
100
+ url = Util.file_uri_from_path(File.absolute_path(canonicalize_request.url, (@file.nil? ? 'stdin' : @file)))
101
101
 
102
102
  begin
103
103
  result = @importer[canonicalize_request.importer_id].call canonicalize_request.url, @file
@@ -123,7 +123,7 @@ module Sass
123
123
  url: url
124
124
  )
125
125
  elsif result&.key? :file
126
- canonicalized_url = Util.file_uri(result[:file])
126
+ canonicalized_url = Util.file_uri_from_path(result[:file])
127
127
 
128
128
  # TODO: FileImportRequest is not supported yet.
129
129
  # Workaround by reading contents and return it when server asks
@@ -185,7 +185,7 @@ module Sass
185
185
  def url
186
186
  return if @file.nil?
187
187
 
188
- Util.file_uri @file
188
+ Util.file_uri_from_path @file
189
189
  end
190
190
 
191
191
  def string
data/lib/sass/result.rb CHANGED
@@ -12,19 +12,19 @@ module Sass
12
12
  @map = map
13
13
  @stats = stats
14
14
  end
15
+ end
15
16
 
16
- # The {Stats} of {Embedded#render}.
17
- class Stats
18
- include Struct
17
+ # The {RenderResultStats} of {Embedded#render}.
18
+ class RenderResultStats
19
+ include Struct
19
20
 
20
- attr_reader :entry, :start, :end, :duration
21
+ attr_reader :entry, :start, :end, :duration
21
22
 
22
- def initialize(entry, start, finish, duration)
23
- @entry = entry
24
- @start = start
25
- @end = finish
26
- @duration = duration
27
- end
23
+ def initialize(entry, start, finish, duration)
24
+ @entry = entry
25
+ @start = start
26
+ @end = finish
27
+ @duration = duration
28
28
  end
29
29
  end
30
30
  end
@@ -28,8 +28,12 @@ module Sass
28
28
  @observerable_mutex = Mutex.new
29
29
  @stdin_mutex = Mutex.new
30
30
  @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(DART_SASS_EMBEDDED)
31
- pipe @stderr, $stderr
32
- receive_message @stdout
31
+ poll do
32
+ $stderr.write @stderr.readline
33
+ end
34
+ poll do
35
+ receive_proto read
36
+ end
33
37
  end
34
38
 
35
39
  def add_observer(*args)
@@ -58,57 +62,60 @@ module Sass
58
62
 
59
63
  private
60
64
 
61
- def receive_message(readable)
65
+ def poll
62
66
  Thread.new do
63
67
  loop do
64
- bits = length = 0
65
- loop do
66
- byte = readable.readbyte
67
- length += (byte & 0x7f) << bits
68
- bits += 7
69
- break if byte <= 0x7f
70
- end
71
- payload = readable.read length
72
- message = EmbeddedProtocol::OutboundMessage.decode payload
73
- @observerable_mutex.synchronize do
74
- changed
75
- notify_observers nil, message[message.message.to_s]
76
- end
68
+ yield
77
69
  rescue Interrupt
78
70
  break
79
71
  rescue IOError => e
80
- notify_observers e, nil
72
+ notify_observers(e, nil)
81
73
  close
82
74
  break
83
75
  end
84
76
  end
85
77
  end
86
78
 
87
- def pipe(readable, writeable)
88
- Thread.new do
89
- loop do
90
- writeable.write readable.readline
91
- rescue Interrupt
92
- break
93
- rescue IOError => e
94
- @observerable_mutex.synchronize do
95
- notify_observers e, nil
96
- end
97
- close
98
- break
99
- end
79
+ def notify_observers(*args)
80
+ @observerable_mutex.synchronize do
81
+ changed
82
+ super(*args)
100
83
  end
101
84
  end
102
85
 
86
+ def receive_proto(proto)
87
+ message = EmbeddedProtocol::OutboundMessage.decode(proto)
88
+ notify_observers(nil, message[message.message.to_s])
89
+ end
90
+
91
+ def read
92
+ length = read_varint(@stdout)
93
+ @stdout.read(length)
94
+ end
95
+
103
96
  def write(payload)
104
97
  @stdin_mutex.synchronize do
105
- length = payload.length
106
- while length.positive?
107
- @stdin.write ((length > 0x7f ? 0x80 : 0) | (length & 0x7f)).chr
108
- length >>= 7
109
- end
98
+ write_varint(@stdin, payload.length)
110
99
  @stdin.write payload
111
100
  end
112
101
  end
102
+
103
+ def read_varint(readable)
104
+ varint = bits = 0
105
+ loop do
106
+ byte = readable.readbyte
107
+ varint += (byte & 0x7f) << bits
108
+ bits += 7
109
+ break if byte <= 0x7f
110
+ end
111
+ varint
112
+ end
113
+
114
+ def write_varint(writeable, varint)
115
+ while varint.positive?
116
+ writeable.write ((varint > 0x7f ? 0x80 : 0) | (varint & 0x7f)).chr
117
+ varint >>= 7
118
+ end
119
+ end
113
120
  end
114
121
  end
data/lib/sass/util.rb CHANGED
@@ -1,39 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
+ require 'uri'
4
5
 
5
6
  module Sass
6
7
  # The {Util} module.
7
8
  module Util
8
9
  module_function
9
10
 
10
- FILE_PROTOCOL = 'file://'
11
+ URI_PARSER = URI::Parser.new({ RESERVED: ';/?:@&=+$,' })
11
12
 
12
- def file_uri(path)
13
+ def file_uri_from_path(path)
13
14
  absolute_path = File.absolute_path(path)
14
15
 
15
- unless absolute_path.start_with? File::SEPARATOR
16
- components = absolute_path.split File::SEPARATOR
17
- components[0] = components[0][0].downcase
18
- absolute_path = components.join File::SEPARATOR
19
- end
16
+ absolute_path = File::SEPARATOR + absolute_path unless absolute_path.start_with? File::SEPARATOR
20
17
 
21
- "#{FILE_PROTOCOL}#{absolute_path}"
18
+ URI_PARSER.escape("file://#{absolute_path}")
22
19
  end
23
20
 
24
- def path(file_uri)
25
- absolute_path = file_uri[FILE_PROTOCOL.length..]
26
-
27
- unless absolute_path.start_with? File::SEPARATOR
28
- components = absolute_path.split File::SEPARATOR
29
- components[0] = "#{components[0].upcase}:"
30
- absolute_path = components.join File::SEPARATOR
31
- end
32
-
33
- absolute_path
21
+ def path_from_file_uri(file_uri)
22
+ URI_PARSER.unescape(file_uri)[7..]
34
23
  end
35
24
 
36
- def relative(from, to)
25
+ def relative_path(from, to)
37
26
  Pathname.new(File.absolute_path(to)).relative_path_from(Pathname.new(File.absolute_path(from))).to_s
38
27
  end
39
28
 
data/lib/sass/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sass
4
- VERSION = '0.7.0'
4
+ VERSION = '0.7.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass-embedded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - なつき
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-29 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -136,7 +136,8 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
- description: Use dart-sass with Ruby!
139
+ description: A Ruby library that will communicate with Embedded Dart Sass using the
140
+ Embedded Sass protocol.
140
141
  email:
141
142
  - i@ntk.me
142
143
  executables: []
@@ -144,14 +145,8 @@ extensions:
144
145
  - ext/extconf.rb
145
146
  extra_rdoc_files: []
146
147
  files:
147
- - ".github/workflows/build.yml"
148
- - ".gitignore"
149
- - ".rubocop.yml"
150
- - Gemfile
151
148
  - LICENSE
152
149
  - README.md
153
- - Rakefile
154
- - ext/.gitignore
155
150
  - ext/Makefile
156
151
  - ext/extconf.rb
157
152
  - lib/sass.rb
@@ -166,22 +161,11 @@ files:
166
161
  - lib/sass/transport.rb
167
162
  - lib/sass/util.rb
168
163
  - lib/sass/version.rb
169
- - sass-embedded.gemspec
170
- - test/concurrency_test.rb
171
- - test/functions_test.rb
172
- - test/importer_test.rb
173
- - test/include_paths_test.rb
174
- - test/indented_syntax_test.rb
175
- - test/input_test.rb
176
- - test/output_test.rb
177
- - test/render_error_test.rb
178
- - test/render_test.rb
179
- - test/source_maps_test.rb
180
- - test/test_helper.rb
181
164
  homepage: https://github.com/ntkme/sass-embedded-host-ruby
182
165
  licenses:
183
166
  - MIT
184
- metadata: {}
167
+ metadata:
168
+ source_code_uri: https://github.com/ntkme/sass-embedded-host-ruby/tree/v0.7.5
185
169
  post_install_message:
186
170
  rdoc_options: []
187
171
  require_paths:
@@ -201,15 +185,4 @@ rubygems_version: 3.2.15
201
185
  signing_key:
202
186
  specification_version: 4
203
187
  summary: Use dart-sass with Ruby!
204
- test_files:
205
- - test/concurrency_test.rb
206
- - test/functions_test.rb
207
- - test/importer_test.rb
208
- - test/include_paths_test.rb
209
- - test/indented_syntax_test.rb
210
- - test/input_test.rb
211
- - test/output_test.rb
212
- - test/render_error_test.rb
213
- - test/render_test.rb
214
- - test/source_maps_test.rb
215
- - test/test_helper.rb
188
+ test_files: []