sass-embedded 0.1.1 → 0.2.3
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 +4 -4
- data/.github/workflows/build.yml +1 -4
- data/Gemfile +2 -0
- data/README.md +2 -0
- data/Rakefile +6 -2
- data/ext/sass_embedded/Makefile +13 -20
- data/ext/sass_embedded/extconf.rb +112 -114
- data/lib/sass.rb +23 -18
- data/lib/sass/embedded.rb +237 -0
- data/lib/sass/error.rb +5 -2
- data/lib/sass/platform.rb +17 -20
- data/lib/sass/transport.rb +139 -0
- data/lib/sass/util.rb +4 -4
- data/lib/sass/version.rb +1 -2
- data/sass-embedded.gemspec +18 -19
- data/test/compiler_test.rb +169 -171
- data/test/custom_importer_test.rb +100 -98
- data/test/error_test.rb +14 -16
- data/test/functions_test.rb +197 -181
- data/test/output_style_test.rb +52 -52
- data/test/sass_test.rb +22 -0
- data/test/test_helper.rb +5 -5
- metadata +20 -4
- data/lib/sass/embedded/compiler.rb +0 -250
- data/lib/sass/embedded/transport.rb +0 -147
@@ -1,147 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "open3"
|
4
|
-
require "observer"
|
5
|
-
require_relative "../../../ext/sass_embedded/embedded_sass_pb.rb"
|
6
|
-
|
7
|
-
module Sass
|
8
|
-
module Embedded
|
9
|
-
class Transport
|
10
|
-
|
11
|
-
include Observable
|
12
|
-
|
13
|
-
DART_SASS_EMBEDDED = File.absolute_path("../../../ext/sass_embedded/sass_embedded/dart-sass-embedded#{Sass::Platform::OS == 'windows' ? '.bat' : ''}", __dir__)
|
14
|
-
|
15
|
-
PROTOCOL_ERROR_ID = 4294967295
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@stdin, @stdout, @stderr, @wait_thread = Open3.popen3(DART_SASS_EMBEDDED)
|
19
|
-
@stdin_semaphore = Mutex.new
|
20
|
-
@observerable_semaphore = Mutex.new
|
21
|
-
|
22
|
-
Thread.new do
|
23
|
-
loop do
|
24
|
-
begin
|
25
|
-
bits = length = 0
|
26
|
-
loop do
|
27
|
-
byte = @stdout.readbyte
|
28
|
-
length += (byte & 0x7f) << bits
|
29
|
-
bits += 7
|
30
|
-
break if byte <= 0x7f
|
31
|
-
end
|
32
|
-
changed
|
33
|
-
payload = @stdout.read length
|
34
|
-
@observerable_semaphore.synchronize {
|
35
|
-
notify_observers nil, Sass::EmbeddedProtocol::OutboundMessage.decode(payload)
|
36
|
-
}
|
37
|
-
rescue Interrupt
|
38
|
-
break
|
39
|
-
rescue IOError, EOFError => error
|
40
|
-
notify_observers error, nil
|
41
|
-
close
|
42
|
-
break
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
Thread.new do
|
48
|
-
loop do
|
49
|
-
begin
|
50
|
-
$stderr.puts @stderr.read
|
51
|
-
rescue Interrupt
|
52
|
-
break
|
53
|
-
rescue IOError, EOFErrorr => error
|
54
|
-
@observerable_semaphore.synchronize {
|
55
|
-
notify_observers error, nil
|
56
|
-
}
|
57
|
-
close
|
58
|
-
break
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def send req, id
|
65
|
-
mutex = Mutex.new
|
66
|
-
resource = ConditionVariable.new
|
67
|
-
|
68
|
-
req_name = req.class.name.split('::').last.gsub(/\B(?=[A-Z])/, "_").downcase
|
69
|
-
|
70
|
-
message = Sass::EmbeddedProtocol::InboundMessage.new(req_name.to_sym => req)
|
71
|
-
|
72
|
-
error = nil
|
73
|
-
res = nil
|
74
|
-
|
75
|
-
@observerable_semaphore.synchronize {
|
76
|
-
MessageObserver.new self, id do |_error, _res|
|
77
|
-
mutex.synchronize {
|
78
|
-
error = _error
|
79
|
-
res = _res
|
80
|
-
|
81
|
-
resource.signal
|
82
|
-
}
|
83
|
-
end
|
84
|
-
}
|
85
|
-
|
86
|
-
mutex.synchronize {
|
87
|
-
write message.to_proto
|
88
|
-
|
89
|
-
resource.wait(mutex)
|
90
|
-
}
|
91
|
-
|
92
|
-
raise error if error
|
93
|
-
res
|
94
|
-
end
|
95
|
-
|
96
|
-
def close
|
97
|
-
begin
|
98
|
-
delete_observers
|
99
|
-
@stdin.close
|
100
|
-
@stdout.close
|
101
|
-
@stderr.close
|
102
|
-
rescue
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def write proto
|
109
|
-
@stdin_semaphore.synchronize {
|
110
|
-
length = proto.length
|
111
|
-
while length > 0
|
112
|
-
@stdin.write ((length > 0x7f ? 0x80 : 0) | (length & 0x7f)).chr
|
113
|
-
length >>= 7
|
114
|
-
end
|
115
|
-
@stdin.write proto
|
116
|
-
}
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
private
|
121
|
-
|
122
|
-
class MessageObserver
|
123
|
-
def initialize obs, id, &block
|
124
|
-
@obs = obs
|
125
|
-
@id = id
|
126
|
-
@block = block
|
127
|
-
@obs.add_observer self
|
128
|
-
end
|
129
|
-
|
130
|
-
def update error, message
|
131
|
-
if error
|
132
|
-
@obs.delete_observer self
|
133
|
-
@block.call error, nil
|
134
|
-
elsif message.error&.id == Sass::Embedded::Transport::PROTOCOL_ERROR_ID
|
135
|
-
@obs.delete_observer self
|
136
|
-
@block.call Sass::ProtocolError.new(message.error.message), nil
|
137
|
-
else
|
138
|
-
res = message[message.message.to_s]
|
139
|
-
if (res['compilation_id'] == @id || res['id'] == @id)
|
140
|
-
@obs.delete_observer self
|
141
|
-
@block.call error, res
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|