rider-server 0.1.1 → 0.1.2
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/.build.yml +3 -3
- data/CHANGELOG.md +17 -1
- data/README.rdoc +39 -0
- data/Rakefile +5 -0
- data/exe/rider-server +3 -3
- data/lib/rider_server/config.rb +76 -0
- data/lib/rider_server/core_ext/array.rb +3 -1
- data/lib/rider_server/core_ext/class.rb +5 -0
- data/lib/rider_server/core_ext/env.rb +14 -0
- data/lib/rider_server/core_ext/hash.rb +3 -1
- data/lib/rider_server/core_ext/kernel.rb +5 -0
- data/lib/rider_server/core_ext/module.rb +18 -0
- data/lib/rider_server/core_ext/object.rb +7 -1
- data/lib/rider_server/core_ext/string.rb +3 -1
- data/lib/rider_server/core_ext/symbol.rb +3 -1
- data/lib/rider_server/exception_extension.rb +2 -0
- data/lib/rider_server/inspect.rb +108 -32
- data/lib/rider_server/logger.rb +11 -4
- data/lib/rider_server/operation.rb +39 -20
- data/lib/rider_server/{ops → operations}/clone.rb +3 -2
- data/lib/rider_server/{ops → operations}/close.rb +3 -2
- data/lib/rider_server/operations/completions.rb +146 -0
- data/lib/rider_server/operations/lookup.rb +102 -0
- data/lib/rider_server/operations/ls_sessions.rb +51 -0
- data/lib/rider_server/operations/toggle_catch_all_exceptions.rb +24 -0
- data/lib/rider_server/operations.rb +42 -68
- data/lib/rider_server/request.rb +61 -0
- data/lib/rider_server/response.rb +10 -2
- data/lib/rider_server/server.rb +28 -16
- data/lib/rider_server/services/capture_exceptions.rb +1 -1
- data/lib/rider_server/services/rails.rb +1 -1
- data/lib/rider_server/session.rb +75 -44
- data/lib/rider_server/session_operation.rb +17 -0
- data/lib/rider_server/session_operations/eval.rb +61 -0
- data/lib/rider_server/session_operations/inspect.rb +123 -0
- data/lib/rider_server/session_operations/inspect_exception.rb +46 -0
- data/lib/rider_server/session_operations/interrupt.rb +29 -0
- data/lib/rider_server/session_operations/load_path.rb +19 -0
- data/lib/rider_server/session_operations/ls_exceptions.rb +28 -0
- data/lib/rider_server/session_operations/ls_services.rb +18 -0
- data/lib/rider_server/session_operations/service.rb +42 -0
- data/lib/rider_server/session_operations/set_namespace.rb +82 -0
- data/lib/rider_server/session_operations/set_namespace_variable.rb +81 -0
- data/lib/rider_server/session_operations/stdin.rb +19 -0
- data/lib/rider_server/utils.rb +7 -7
- data/lib/rider_server/validate/array.rb +32 -0
- data/lib/rider_server/validate/base.rb +28 -0
- data/lib/rider_server/validate/boolean.rb +47 -0
- data/lib/rider_server/validate/hash.rb +32 -0
- data/lib/rider_server/validate/integer.rb +56 -0
- data/lib/rider_server/validate/predicates.rb +30 -0
- data/lib/rider_server/validate/string.rb +60 -0
- data/lib/rider_server/validate/symbol.rb +90 -0
- data/lib/rider_server/validate.rb +15 -0
- data/lib/rider_server/version.rb +1 -1
- data/lib/rider_server/workspace.rb +1 -1
- data/lib/rider_server.rb +3 -1
- metadata +54 -24
- data/README.md +0 -46
- data/lib/rider_server/ops/completions.rb +0 -145
- data/lib/rider_server/ops/eval.rb +0 -62
- data/lib/rider_server/ops/inspect.rb +0 -121
- data/lib/rider_server/ops/inspect_exception.rb +0 -47
- data/lib/rider_server/ops/interrupt.rb +0 -30
- data/lib/rider_server/ops/load_path.rb +0 -20
- data/lib/rider_server/ops/lookup.rb +0 -104
- data/lib/rider_server/ops/ls_exceptions.rb +0 -29
- data/lib/rider_server/ops/ls_services.rb +0 -19
- data/lib/rider_server/ops/ls_sessions.rb +0 -52
- data/lib/rider_server/ops/service.rb +0 -43
- data/lib/rider_server/ops/set_namespace.rb +0 -79
- data/lib/rider_server/ops/set_namespace_variable.rb +0 -80
- data/lib/rider_server/ops/stdin.rb +0 -20
- data/lib/rider_server/ops/toggle_catch_all_exceptions.rb +0 -27
@@ -1,104 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
require "rider_server/inspect"
|
4
|
-
|
5
|
-
module RiderServer
|
6
|
-
module Ops
|
7
|
-
class Lookup < Operation
|
8
|
-
documentation "Get info about a symbol."
|
9
|
-
|
10
|
-
argument :id, :string, "The request id", required: true
|
11
|
-
argument :sym, :string, "The symbol to lookup", required: true
|
12
|
-
argument :lookup_fn, :string, "What lookup function to use, top-level, module, method or singleton-method"
|
13
|
-
argument :ns, :string, "The namespace to search for completions"
|
14
|
-
|
15
|
-
def initialize(*args)
|
16
|
-
@workspace = Workspace.new
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def handle(session, operation)
|
21
|
-
response = Response.new(operation)
|
22
|
-
ns = operation["ns"]
|
23
|
-
sym = operation["sym"]
|
24
|
-
lookup_fn = operation.fetch("lookup-fn", "top-level")
|
25
|
-
|
26
|
-
if sym.nil? || parse_string(sym).nil?
|
27
|
-
response.set("info", {})
|
28
|
-
else
|
29
|
-
ns_object = if ns.empty?
|
30
|
-
::Object
|
31
|
-
else
|
32
|
-
@workspace.lookup_module(ns)
|
33
|
-
end
|
34
|
-
|
35
|
-
# If the prefix isn't parseable, return an empty list
|
36
|
-
response.set("info", lookup_module(sym, klass: ns_object, lookup_fn: lookup_fn))
|
37
|
-
end
|
38
|
-
response.status("done")
|
39
|
-
response
|
40
|
-
end
|
41
|
-
|
42
|
-
def lookup_module(module_name, klass: ::Object, lookup_fn: "top-level")
|
43
|
-
node = parse_string(module_name)
|
44
|
-
case node.type
|
45
|
-
when :const
|
46
|
-
ns = lookup_module_ast(node.children.first, klass)
|
47
|
-
name = node.children.last
|
48
|
-
encode_const(ns, name)
|
49
|
-
when :send
|
50
|
-
ns = lookup_module_ast(node.children.first, klass)
|
51
|
-
prefix = node.children.last
|
52
|
-
if lookup_fn == "method"
|
53
|
-
encode_method(ns.instance_method(prefix))
|
54
|
-
else
|
55
|
-
encode_method(ns.method(prefix))
|
56
|
-
end
|
57
|
-
else
|
58
|
-
[]
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def parse_string(string)
|
63
|
-
buffer = Parser::Source::Buffer.new("(string)")
|
64
|
-
buffer.source = string
|
65
|
-
Parser::CurrentRuby.new.parse(buffer)
|
66
|
-
end
|
67
|
-
|
68
|
-
def lookup_module_ast(node, klass = ::Object)
|
69
|
-
return klass if node.nil?
|
70
|
-
|
71
|
-
case node.type
|
72
|
-
when :cbase
|
73
|
-
::Object
|
74
|
-
when :const
|
75
|
-
if node.children.first.nil?
|
76
|
-
klass.const_get(node.children.last)
|
77
|
-
else
|
78
|
-
lookup_module_ast(node.children.first, klass).const_get(node.children.last)
|
79
|
-
end
|
80
|
-
else
|
81
|
-
raise ModuleLookupError, "Unknown node type #{node.type}"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def encode_const(ns, const_name)
|
86
|
-
if ns.const_defined? const_name
|
87
|
-
{
|
88
|
-
"name" => "#{ns}::#{const_name}",
|
89
|
-
"source_location" => ns.const_source_location(const_name)
|
90
|
-
}
|
91
|
-
else
|
92
|
-
{}
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def encode_method(thing)
|
97
|
-
{
|
98
|
-
"name" => thing.name.to_s,
|
99
|
-
"source_location" => thing.source_location
|
100
|
-
}
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class LsExceptions < Operation
|
7
|
-
documentation "List all exceptions that exist in the sessions cache."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
|
11
|
-
def handle(session, operation)
|
12
|
-
response = Response.new(operation)
|
13
|
-
|
14
|
-
exceptions = session.exceptions.map do |item|
|
15
|
-
{
|
16
|
-
"id" => item["id"],
|
17
|
-
"operation-id" => item["operation_id"],
|
18
|
-
"created-at" => item["created_at"].iso8601,
|
19
|
-
"exception" => item["exception"].inspect
|
20
|
-
}
|
21
|
-
end
|
22
|
-
|
23
|
-
response.set("exceptions", exceptions)
|
24
|
-
response.status("done")
|
25
|
-
response
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class LsServices < Operation
|
7
|
-
documentation "List all services."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
|
11
|
-
def handle(session, operation)
|
12
|
-
response = Response.new(operation)
|
13
|
-
response.set("services", session.list_services)
|
14
|
-
response.status("done")
|
15
|
-
response
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class LsSessions < Operation
|
7
|
-
documentation "List all sessions"
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
|
11
|
-
def handle(session, operation)
|
12
|
-
response = Response.new(operation)
|
13
|
-
response.set("sessions", controller.sessions.map { |k, v| k })
|
14
|
-
response.set("rider/session-headings",
|
15
|
-
[
|
16
|
-
{
|
17
|
-
"id" => "id",
|
18
|
-
"name" => "ID",
|
19
|
-
"length" => 36
|
20
|
-
},
|
21
|
-
{
|
22
|
-
"id" => "namespace_name",
|
23
|
-
"name" => "Namespace",
|
24
|
-
"length" => 25
|
25
|
-
},
|
26
|
-
{
|
27
|
-
"id" => "history_items",
|
28
|
-
"name" => "History Items",
|
29
|
-
"length" => 5
|
30
|
-
},
|
31
|
-
{
|
32
|
-
"id" => "exceptions",
|
33
|
-
"name" => "Exceptions",
|
34
|
-
"length" => 5
|
35
|
-
}
|
36
|
-
])
|
37
|
-
response.set("rider/sessions", controller.sessions.map { |k, v| session_summary(v) })
|
38
|
-
response.status("done")
|
39
|
-
response
|
40
|
-
end
|
41
|
-
|
42
|
-
def session_summary(session)
|
43
|
-
{
|
44
|
-
"id" => session.id,
|
45
|
-
"namespace_name" => session.workspace.namespace_name,
|
46
|
-
"history_items" => session.history.length.to_s,
|
47
|
-
"exceptions" => session.exceptions.length.to_s
|
48
|
-
}
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class Service < Operation
|
7
|
-
documentation "Control a Ruby service integration"
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :service, :string, "The name of the Ruby service to control", required: true
|
11
|
-
argument :state, :string, "The desired state of the service", required: true
|
12
|
-
|
13
|
-
def handle(session, operation)
|
14
|
-
response = Response.new(operation)
|
15
|
-
|
16
|
-
service = operation["service"]
|
17
|
-
state = operation["state"]
|
18
|
-
|
19
|
-
current_state = session.service_state(service)
|
20
|
-
|
21
|
-
case state
|
22
|
-
when "start"
|
23
|
-
raise "Service already running" if current_state == "running"
|
24
|
-
session.start_service(service, response.id)
|
25
|
-
response.set("rider/stream", "true")
|
26
|
-
when "stop"
|
27
|
-
raise "Can't stop service #{service}. It's not running." if current_state == "stopped"
|
28
|
-
session.stop_service(service)
|
29
|
-
response.status("done")
|
30
|
-
else
|
31
|
-
# TODO: throwing this exception will caues a "done" response
|
32
|
-
# to be sent, which will implicitly close the stream. It
|
33
|
-
# might make sense to handle this more gracefully here.
|
34
|
-
raise "Unknown state #{state}"
|
35
|
-
end
|
36
|
-
|
37
|
-
response.set("service", service)
|
38
|
-
response.set("state", session.service_state(service).to_s)
|
39
|
-
response
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class SetNamespace < Operation
|
7
|
-
documentation "Set the namespace to the given location."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :location, :array, "The location to set the namespace to", required: true
|
11
|
-
|
12
|
-
def handle(session, operation)
|
13
|
-
response = Response.new(operation)
|
14
|
-
location = operation["location"]
|
15
|
-
|
16
|
-
value = traverse_location(location, nil, session)
|
17
|
-
session.workspace.set_namespace(value)
|
18
|
-
response.set("ns", session.workspace.namespace_name)
|
19
|
-
response.set("location", location)
|
20
|
-
response.status("done")
|
21
|
-
response
|
22
|
-
end
|
23
|
-
|
24
|
-
def traverse_location(location, ctx, session)
|
25
|
-
loc = location.first
|
26
|
-
locs = location.drop(1)
|
27
|
-
|
28
|
-
if locs.empty?
|
29
|
-
lookup_object(loc, ctx, session)
|
30
|
-
else
|
31
|
-
traverse_location(locs, lookup_object(loc, ctx, session), session)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def lookup_object(loc, ctx, session)
|
36
|
-
lookup, identifier = loc.split(":", 2)
|
37
|
-
|
38
|
-
case lookup
|
39
|
-
when "rider_main"
|
40
|
-
"main"
|
41
|
-
when "rider_history"
|
42
|
-
rider_history(identifier, nil, session)
|
43
|
-
when "rider_exception"
|
44
|
-
rider_exception(identifier, nil, session)
|
45
|
-
when "rider_stackframe"
|
46
|
-
ctx.__rider_bindings_stack[identifier.to_i]
|
47
|
-
when "rider_stackframe_variable"
|
48
|
-
frame_id, local_var = identifier.split(":", 2)
|
49
|
-
ctx.__rider_bindings_stack[frame_id.to_i].local_variable_get(local_var)
|
50
|
-
when "rider_hash_key"
|
51
|
-
hash = identifier.to_i
|
52
|
-
ctx.keys.find { |key| key.hash == hash }
|
53
|
-
when "rider_hash_value"
|
54
|
-
hash = identifier.to_i
|
55
|
-
key = ctx.keys.find { |key| key.hash == hash }
|
56
|
-
ctx.fetch(key)
|
57
|
-
when "toplevel_const_get"
|
58
|
-
Object.const_get(identifier)
|
59
|
-
when "instance_variable_get"
|
60
|
-
ctx.instance_variable_get(identifier)
|
61
|
-
when "const_get"
|
62
|
-
ctx.const_get(identifier)
|
63
|
-
when "ancestor_find"
|
64
|
-
ctx.class.ancestors.find { |item| item.to_s == identifier }
|
65
|
-
else
|
66
|
-
raise "Unknown inspect function: #{lookup}"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def rider_history(value, ctx, session)
|
71
|
-
session.get_result(value)
|
72
|
-
end
|
73
|
-
|
74
|
-
def rider_exception(id, ctx, session)
|
75
|
-
session.get_exception(id)["exception"]
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class SetNamespaceVariable < Operation
|
7
|
-
documentation "Set a variable in the current REPL binding."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :name, :string, "The name of the local variable to set", required: true
|
11
|
-
argument :location, :array, "The location to set the namespace to", required: true
|
12
|
-
|
13
|
-
def handle(session, operation)
|
14
|
-
response = Response.new(operation)
|
15
|
-
name = operation["name"]
|
16
|
-
raise "Name must be a valid Ruby identifier" unless /\A[a-zA-Z_]\w*\z/.match?(name)
|
17
|
-
location = operation["location"]
|
18
|
-
|
19
|
-
value = traverse_location(location, nil, session)
|
20
|
-
session.workspace.binding_local_variable_set(name, value)
|
21
|
-
response.status("done")
|
22
|
-
response
|
23
|
-
end
|
24
|
-
|
25
|
-
def traverse_location(location, ctx, session)
|
26
|
-
loc = location.first
|
27
|
-
locs = location.drop(1)
|
28
|
-
|
29
|
-
if locs.empty?
|
30
|
-
lookup_object(loc, ctx, session)
|
31
|
-
else
|
32
|
-
traverse_location(locs, lookup_object(loc, ctx, session), session)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def lookup_object(loc, ctx, session)
|
37
|
-
lookup, identifier = loc.split(":", 2)
|
38
|
-
|
39
|
-
case lookup
|
40
|
-
when "rider_main"
|
41
|
-
"main"
|
42
|
-
when "rider_history"
|
43
|
-
rider_history(identifier, nil, session)
|
44
|
-
when "rider_exception"
|
45
|
-
rider_exception(identifier, nil, session)
|
46
|
-
when "rider_stackframe"
|
47
|
-
ctx.__rider_bindings_stack[identifier.to_i]
|
48
|
-
when "rider_stackframe_variable"
|
49
|
-
frame_id, local_var = identifier.split(":", 2)
|
50
|
-
ctx.__rider_bindings_stack[frame_id.to_i].local_variable_get(local_var)
|
51
|
-
when "rider_hash_key"
|
52
|
-
hash = identifier.to_i
|
53
|
-
ctx.keys.find { |key| key.hash == hash }
|
54
|
-
when "rider_hash_value"
|
55
|
-
hash = identifier.to_i
|
56
|
-
key = ctx.keys.find { |key| key.hash == hash }
|
57
|
-
ctx.fetch(key)
|
58
|
-
when "toplevel_const_get"
|
59
|
-
Object.const_get(identifier)
|
60
|
-
when "instance_variable_get"
|
61
|
-
ctx.instance_variable_get(identifier)
|
62
|
-
when "const_get"
|
63
|
-
ctx.const_get(identifier)
|
64
|
-
when "ancestor_find"
|
65
|
-
ctx.class.ancestors.find { |item| item.to_s == identifier }
|
66
|
-
else
|
67
|
-
raise "Unknown inspect function: #{lookup}"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def rider_history(value, ctx, session)
|
72
|
-
session.get_result(value)
|
73
|
-
end
|
74
|
-
|
75
|
-
def rider_exception(id, ctx, session)
|
76
|
-
session.get_exception(id)["exception"]
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class Stdin < Operation
|
7
|
-
documentation "List all exceptions that have occurred in the session."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :stdin, :string, "The input to write to the stdin of the process", required: true
|
11
|
-
|
12
|
-
def handle(session, operation)
|
13
|
-
controller.stdin.write(operation["stdin"])
|
14
|
-
response = Response.new(operation)
|
15
|
-
response.status("done")
|
16
|
-
response
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class ToggleCatchAllExceptions < Operation
|
7
|
-
documentation "Enable catching all exceptions. Not just the ones with a session."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
|
11
|
-
def handle(session, operation)
|
12
|
-
if @controller.sessions_catching_exceptions.member?(session.id)
|
13
|
-
@controller.sessions_catching_exceptions.delete(session.id)
|
14
|
-
value = "disabled"
|
15
|
-
else
|
16
|
-
@controller.sessions_catching_exceptions.push(session.id)
|
17
|
-
value = "enabled"
|
18
|
-
end
|
19
|
-
|
20
|
-
response = Response.new(operation)
|
21
|
-
response.status("done")
|
22
|
-
response.set("value", value)
|
23
|
-
response
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|