nrepl-lazuli 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrepl-lazuli/connection.rb +55 -7
- data/lib/nrepl-lazuli/server.rb +23 -10
- data/lib/nrepl-lazuli.rb +1 -1
- metadata +6 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c38f3cd330d07e579fff5971c656a12c4ee9f9a1488aba33d8183dd80b1236c
|
4
|
+
data.tar.gz: a63be29edddccc449e4a5bbdd9f80a05e2fb2fa0b3ca0b271ee50830da521118
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d75413ea25c513b6107daacd4f4128649c7696fc170f8536d8f636a166ce5fcb9ba675a4c218de9b9ec906f488c7cc9dfbdd48afbce0e828677d08c0bc96283
|
7
|
+
data.tar.gz: a3bb98a1bc7d9ba46d9bbc0cd1ea3b30dfa186da9444a80acf03015c427430962d4bf3f14dfc0d695b7050fe8caf632b14c1bac0a92edbe65ee9fd0f04a803c5
|
@@ -16,10 +16,11 @@ module NREPL
|
|
16
16
|
@binding = binding
|
17
17
|
@bindings = bindings
|
18
18
|
@bindings_by_id = bindings_by_id
|
19
|
+
@retries = 0
|
19
20
|
end
|
20
21
|
|
21
22
|
def treat_messages!
|
22
|
-
bencode = BEncode
|
23
|
+
bencode = BEncode.new(@in)
|
23
24
|
loop do
|
24
25
|
break if @in.eof?
|
25
26
|
msg = bencode.parse!
|
@@ -30,6 +31,8 @@ module NREPL
|
|
30
31
|
@pending_evals.each { |(i, _)| clear_eval!(i) }
|
31
32
|
rescue Errno::ECONNRESET
|
32
33
|
@pending_evals.each { |(i, _)| clear_eval!(i) }
|
34
|
+
rescue => e
|
35
|
+
STDOUT.puts "CRASH! #{e}"
|
33
36
|
end
|
34
37
|
|
35
38
|
def treat_msg(msg)
|
@@ -87,13 +90,42 @@ module NREPL
|
|
87
90
|
'status' => ['done', 'interrupted'],
|
88
91
|
'op' => msg['op']
|
89
92
|
}))
|
90
|
-
|
91
93
|
else
|
92
94
|
send_msg(response_for(msg, {
|
93
95
|
'status' => ['done'],
|
94
96
|
'op' => msg['op']
|
95
97
|
}))
|
96
98
|
end
|
99
|
+
when 'update_watch_lines'
|
100
|
+
msg['id'] ||= "eval_#{@counter += 1}"
|
101
|
+
file = msg['file']
|
102
|
+
initial_line = msg['line']
|
103
|
+
delta = msg['delta']
|
104
|
+
rows_bindings = @bindings[file] || {}
|
105
|
+
rows_bindings.keys.each do |row|
|
106
|
+
if row > initial_line
|
107
|
+
watch = rows_bindings.delete(row)
|
108
|
+
new_row = row + delta
|
109
|
+
old_id = "#{file}:#{row+1}"
|
110
|
+
new_id = "#{file}:#{new_row+1}"
|
111
|
+
|
112
|
+
watch.keys.each do |id|
|
113
|
+
if id == old_id
|
114
|
+
watch_per_id = @bindings_by_id.delete(id)
|
115
|
+
@bindings_by_id[new_id] = watch_per_id.update(row: new_row)
|
116
|
+
else
|
117
|
+
@bindings_by_id[id][:row] = new_row
|
118
|
+
end
|
119
|
+
end
|
120
|
+
rows_bindings[new_row] = watch
|
121
|
+
old_binding = watch.delete(old_id)
|
122
|
+
watch[new_id] = old_binding if(old_binding)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
get_watches(msg)
|
127
|
+
when 'get_watches'
|
128
|
+
get_watches(msg)
|
97
129
|
when 'watches_for_file'
|
98
130
|
msg['id'] ||= "eval_#{@counter += 1}"
|
99
131
|
file = msg['file']
|
@@ -112,6 +144,22 @@ module NREPL
|
|
112
144
|
end
|
113
145
|
end
|
114
146
|
|
147
|
+
private def get_watches(msg)
|
148
|
+
msg['id'] ||= "eval_#{@counter += 1}"
|
149
|
+
file = msg['file']
|
150
|
+
rows_bindings = @bindings[file] || {}
|
151
|
+
watches = rows_bindings.flat_map do |row, watch|
|
152
|
+
watch.map do |id, _|
|
153
|
+
{ 'file' => file, 'line' => row, 'id' => id }
|
154
|
+
end
|
155
|
+
end
|
156
|
+
send_msg(response_for(msg, {
|
157
|
+
'status' => ['done'],
|
158
|
+
'watches' => watches.sort_by { |w| w['line'] },
|
159
|
+
'op' => msg['op']
|
160
|
+
}))
|
161
|
+
end
|
162
|
+
|
115
163
|
private def eval_op(msg, stop)
|
116
164
|
msg['id'] ||= "eval_#{@counter += 1}"
|
117
165
|
id = msg['id']
|
@@ -174,7 +222,7 @@ module NREPL
|
|
174
222
|
end
|
175
223
|
|
176
224
|
private def evaluate_code(code, file, line, bind)
|
177
|
-
bind ||=
|
225
|
+
bind ||= TOPLEVEL_BINDING.dup
|
178
226
|
line = line ? line + 1 : 1
|
179
227
|
eval(code, bind, file || "EVAL", line).inspect
|
180
228
|
end
|
@@ -251,11 +299,11 @@ module NREPL
|
|
251
299
|
|
252
300
|
def send_msg(msg)
|
253
301
|
debug "Sending", msg
|
254
|
-
@out.
|
302
|
+
@out.write_nonblock(BEncode.encode(msg))
|
255
303
|
@out.flush
|
304
|
+
rescue IO::EAGAINWaitWritable
|
305
|
+
@retries += 1
|
306
|
+
@out.close if @retries > 50
|
256
307
|
end
|
257
308
|
end
|
258
309
|
end
|
259
|
-
|
260
|
-
# To avoid locally binding with the NREPL::Connection module
|
261
|
-
NREPL::Connection.class_variable_set(:@@binding, binding)
|
data/lib/nrepl-lazuli/server.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
# A Ruby port of ogion https://gitlab.com/technomancy/ogion &
|
4
4
|
# https://github.com/borkdude/nrepl-server/blob/master/src/borkdude/nrepl_server.clj
|
5
5
|
|
6
|
-
require 'bencode'
|
7
6
|
require 'socket'
|
7
|
+
require_relative 'bencode'
|
8
8
|
require_relative 'connection'
|
9
9
|
require_relative 'fake_stdout'
|
10
10
|
|
@@ -43,8 +43,18 @@ module NREPL
|
|
43
43
|
@debug = debug
|
44
44
|
@connections = Set.new
|
45
45
|
@binding = binding
|
46
|
-
|
47
|
-
|
46
|
+
loc = caller_locations.reject { |x| x.absolute_path =~ /nrepl\-lazuli/ }[0]
|
47
|
+
loc = caller_locations[0] if(!loc)
|
48
|
+
path = loc.absolute_path
|
49
|
+
line = loc.lineno - 1
|
50
|
+
@bindings = {path => {line => {"NREPL::Server.start" => binding}}}
|
51
|
+
@bindings_by_id = {
|
52
|
+
"NREPL::Server.start" => {
|
53
|
+
binding: binding,
|
54
|
+
file: path,
|
55
|
+
row: line
|
56
|
+
}
|
57
|
+
}
|
48
58
|
@tracing = tracing
|
49
59
|
Thread.current[:nrepl_server] = self
|
50
60
|
NREPL.class_variable_set(:@@connections, @connections)
|
@@ -96,17 +106,20 @@ module NREPL
|
|
96
106
|
def auto_create_bindings!
|
97
107
|
dir_regex = Regexp.new("^#{Regexp.escape(@pwd)}")
|
98
108
|
@call_trace = TracePoint.new(:class, :call) do |tp|
|
99
|
-
|
109
|
+
path = tp.path
|
110
|
+
next if tp.path =~ /^(\<|.eval)/
|
111
|
+
path = File.join(@pwd, path) if File.dirname(path) == '.'
|
112
|
+
id = "#{path}:#{tp.lineno}"
|
100
113
|
b = tp.binding
|
101
|
-
@bindings_by_id[id] = {binding: b, file:
|
102
|
-
@bindings[
|
103
|
-
@bindings[
|
104
|
-
@bindings[
|
105
|
-
if
|
114
|
+
@bindings_by_id[id] = {binding: b, file: path, row: tp.lineno-1}
|
115
|
+
@bindings[path] ||= {}
|
116
|
+
@bindings[path][tp.lineno-1] ||= {}
|
117
|
+
@bindings[path][tp.lineno-1][id] = b
|
118
|
+
if path =~ dir_regex
|
106
119
|
@connections.each do |connection|
|
107
120
|
connection.send_msg(
|
108
121
|
'op' => 'hit_auto_watch',
|
109
|
-
'file' =>
|
122
|
+
'file' => path,
|
110
123
|
'line' => tp.lineno-1,
|
111
124
|
'status' => ['done']
|
112
125
|
)
|
data/lib/nrepl-lazuli.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nrepl-lazuli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maurício Szabo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bencode
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.2
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.2
|
11
|
+
date: 2024-11-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
27
13
|
description: A Ruby nREPL server, made to be used with Lazuli plug-in (but can be
|
28
14
|
used with any nREPL client too)
|
29
15
|
email: mauricio@szabo.link
|
@@ -38,7 +24,8 @@ files:
|
|
38
24
|
homepage: https://gitlab.com/clj-editors/nrepl-lazuli
|
39
25
|
licenses:
|
40
26
|
- MIT
|
41
|
-
metadata:
|
27
|
+
metadata:
|
28
|
+
source_code_uri: https://gitlab.com/clj-editors/nrepl-lazuli
|
42
29
|
post_install_message:
|
43
30
|
rdoc_options: []
|
44
31
|
require_paths:
|
@@ -54,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
41
|
- !ruby/object:Gem::Version
|
55
42
|
version: '0'
|
56
43
|
requirements: []
|
57
|
-
rubygems_version: 3.5.
|
44
|
+
rubygems_version: 3.5.11
|
58
45
|
signing_key:
|
59
46
|
specification_version: 4
|
60
47
|
summary: A Ruby nREPL server
|