sass-embedded 0.8.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/sass/struct.rb DELETED
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sass
4
- # The {Struct} module.
5
- module Struct
6
- def [](key)
7
- instance_variable_get("@#{key}".to_sym)
8
- end
9
-
10
- def to_h
11
- instance_variables.map do |variable|
12
- [variable[1..].to_sym, instance_variable_get(variable)]
13
- end.to_h
14
- end
15
-
16
- def to_s
17
- to_h.to_s
18
- end
19
- end
20
- end
@@ -1,127 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'open3'
4
- require 'observer'
5
- require_relative '../../ext/sass/embedded_sass_pb'
6
-
7
- module Sass
8
- # The {::Observable} {Transport} for low level communication with
9
- # `dart-sass-embedded` using protocol buffers via stdio. Received messages
10
- # can be observed by an {Observer}.
11
- class Transport
12
- include Observable
13
-
14
- ONEOF_MESSAGE = EmbeddedProtocol::InboundMessage
15
- .descriptor
16
- .lookup_oneof('message')
17
- .collect do |field_descriptor|
18
- [field_descriptor.subtype, field_descriptor.name]
19
- end.to_h
20
-
21
- private_constant :ONEOF_MESSAGE
22
-
23
- def initialize
24
- @observerable_mutex = Mutex.new
25
- @stdin_mutex = Mutex.new
26
- @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(Compiler::DART_SASS_EMBEDDED)
27
-
28
- [@stdin, @stdout].each(&:binmode)
29
-
30
- poll do
31
- warn(@stderr.readline, uplevel: 1)
32
- end
33
- poll do
34
- receive_proto read
35
- end
36
- end
37
-
38
- def add_observer(*args)
39
- @observerable_mutex.synchronize do
40
- super(*args)
41
- end
42
- end
43
-
44
- def send_message(message)
45
- write EmbeddedProtocol::InboundMessage.new(
46
- ONEOF_MESSAGE[message.class.descriptor] => message
47
- ).to_proto
48
- end
49
-
50
- def close
51
- delete_observers
52
- @stdin.close unless @stdin.closed?
53
- @stdout.close unless @stdout.closed?
54
- @stderr.close unless @stderr.closed?
55
- nil
56
- end
57
-
58
- def closed?
59
- @stdin.closed?
60
- end
61
-
62
- private
63
-
64
- def poll
65
- Thread.new do
66
- loop do
67
- yield
68
- rescue StandardError => e
69
- notify_observers(e, nil)
70
- close
71
- break
72
- end
73
- end
74
- end
75
-
76
- def notify_observers(*args)
77
- @observerable_mutex.synchronize do
78
- changed
79
- super(*args)
80
- end
81
- end
82
-
83
- def receive_proto(proto)
84
- payload = EmbeddedProtocol::OutboundMessage.decode(proto)
85
- message = payload[payload.message.to_s]
86
- case message
87
- when EmbeddedProtocol::ProtocolError
88
- raise ProtocolError, message.message
89
- else
90
- notify_observers(nil, message)
91
- end
92
- end
93
-
94
- def read
95
- length = read_varint(@stdout)
96
- @stdout.read(length)
97
- end
98
-
99
- def write(payload)
100
- @stdin_mutex.synchronize do
101
- write_varint(@stdin, payload.length)
102
- @stdin.write payload
103
- end
104
- end
105
-
106
- def read_varint(readable)
107
- value = bits = 0
108
- loop do
109
- byte = readable.readbyte
110
- value |= (byte & 0x7f) << bits
111
- bits += 7
112
- break if byte < 0x80
113
- end
114
- value
115
- end
116
-
117
- def write_varint(writeable, value)
118
- bytes = []
119
- until value < 0x80
120
- bytes << (0x80 | (value & 0x7f))
121
- value >>= 7
122
- end
123
- bytes << value
124
- writeable.write bytes.pack('C*')
125
- end
126
- end
127
- end
data/lib/sass/util.rb DELETED
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'pathname'
4
- require 'uri'
5
-
6
- module Sass
7
- # The {Util} module.
8
- module Util
9
- module_function
10
-
11
- URI_PARSER = URI::Parser.new({ RESERVED: ';/?:@&=+$,' })
12
-
13
- private_constant :URI_PARSER
14
-
15
- def file_uri_from_path(path)
16
- "file://#{Platform::OS == 'windows' ? File::SEPARATOR : ''}#{URI_PARSER.escape(path)}"
17
- end
18
-
19
- def path_from_file_uri(file_uri)
20
- URI_PARSER.unescape(file_uri[(Platform::OS == 'windows' ? 8 : 7)..])
21
- end
22
-
23
- def relative_path(from, to)
24
- Pathname.new(File.absolute_path(to)).relative_path_from(Pathname.new(File.absolute_path(from))).to_s
25
- end
26
-
27
- def now
28
- (Time.now.to_f * 1000).to_i
29
- end
30
- end
31
- end