rider-server 0.1.0 → 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 +23 -1
- data/COPYING +20 -0
- 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 +115 -43
- 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 +43 -69
- data/lib/rider_server/request.rb +61 -0
- data/lib/rider_server/response.rb +10 -2
- data/lib/rider_server/server.rb +29 -17
- data/lib/rider_server/services/capture_exceptions.rb +18 -2
- data/lib/rider_server/services/rails.rb +1 -1
- data/lib/rider_server/session.rb +77 -34
- 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 +55 -24
- data/README.md +0 -44
- data/lib/rider_server/ops/completions.rb +0 -100
- 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 -83
- 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
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rider-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Russell Sim
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bencode
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: binding_of_caller
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: parser
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.3.1.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.3.1.0
|
41
55
|
description: ''
|
42
56
|
email:
|
43
57
|
- rsl@simopolis.xyz
|
@@ -50,12 +64,18 @@ files:
|
|
50
64
|
- ".ruby-version"
|
51
65
|
- ".standard.yml"
|
52
66
|
- CHANGELOG.md
|
53
|
-
-
|
67
|
+
- COPYING
|
68
|
+
- README.rdoc
|
54
69
|
- Rakefile
|
55
70
|
- exe/rider-server
|
56
71
|
- lib/rider_server.rb
|
72
|
+
- lib/rider_server/config.rb
|
57
73
|
- lib/rider_server/core_ext/array.rb
|
74
|
+
- lib/rider_server/core_ext/class.rb
|
75
|
+
- lib/rider_server/core_ext/env.rb
|
58
76
|
- lib/rider_server/core_ext/hash.rb
|
77
|
+
- lib/rider_server/core_ext/kernel.rb
|
78
|
+
- lib/rider_server/core_ext/module.rb
|
59
79
|
- lib/rider_server/core_ext/object.rb
|
60
80
|
- lib/rider_server/core_ext/string.rb
|
61
81
|
- lib/rider_server/core_ext/symbol.rb
|
@@ -65,23 +85,13 @@ files:
|
|
65
85
|
- lib/rider_server/logger.rb
|
66
86
|
- lib/rider_server/operation.rb
|
67
87
|
- lib/rider_server/operations.rb
|
68
|
-
- lib/rider_server/
|
69
|
-
- lib/rider_server/
|
70
|
-
- lib/rider_server/
|
71
|
-
- lib/rider_server/
|
72
|
-
- lib/rider_server/
|
73
|
-
- lib/rider_server/
|
74
|
-
- lib/rider_server/
|
75
|
-
- lib/rider_server/ops/load_path.rb
|
76
|
-
- lib/rider_server/ops/lookup.rb
|
77
|
-
- lib/rider_server/ops/ls_exceptions.rb
|
78
|
-
- lib/rider_server/ops/ls_services.rb
|
79
|
-
- lib/rider_server/ops/ls_sessions.rb
|
80
|
-
- lib/rider_server/ops/service.rb
|
81
|
-
- lib/rider_server/ops/set_namespace.rb
|
82
|
-
- lib/rider_server/ops/set_namespace_variable.rb
|
83
|
-
- lib/rider_server/ops/stdin.rb
|
84
|
-
- lib/rider_server/ops/toggle_catch_all_exceptions.rb
|
88
|
+
- lib/rider_server/operations/clone.rb
|
89
|
+
- lib/rider_server/operations/close.rb
|
90
|
+
- lib/rider_server/operations/completions.rb
|
91
|
+
- lib/rider_server/operations/lookup.rb
|
92
|
+
- lib/rider_server/operations/ls_sessions.rb
|
93
|
+
- lib/rider_server/operations/toggle_catch_all_exceptions.rb
|
94
|
+
- lib/rider_server/request.rb
|
85
95
|
- lib/rider_server/response.rb
|
86
96
|
- lib/rider_server/server.rb
|
87
97
|
- lib/rider_server/service.rb
|
@@ -89,8 +99,29 @@ files:
|
|
89
99
|
- lib/rider_server/services/capture_io.rb
|
90
100
|
- lib/rider_server/services/rails.rb
|
91
101
|
- lib/rider_server/session.rb
|
102
|
+
- lib/rider_server/session_operation.rb
|
103
|
+
- lib/rider_server/session_operations/eval.rb
|
104
|
+
- lib/rider_server/session_operations/inspect.rb
|
105
|
+
- lib/rider_server/session_operations/inspect_exception.rb
|
106
|
+
- lib/rider_server/session_operations/interrupt.rb
|
107
|
+
- lib/rider_server/session_operations/load_path.rb
|
108
|
+
- lib/rider_server/session_operations/ls_exceptions.rb
|
109
|
+
- lib/rider_server/session_operations/ls_services.rb
|
110
|
+
- lib/rider_server/session_operations/service.rb
|
111
|
+
- lib/rider_server/session_operations/set_namespace.rb
|
112
|
+
- lib/rider_server/session_operations/set_namespace_variable.rb
|
113
|
+
- lib/rider_server/session_operations/stdin.rb
|
92
114
|
- lib/rider_server/transports/bencode.rb
|
93
115
|
- lib/rider_server/utils.rb
|
116
|
+
- lib/rider_server/validate.rb
|
117
|
+
- lib/rider_server/validate/array.rb
|
118
|
+
- lib/rider_server/validate/base.rb
|
119
|
+
- lib/rider_server/validate/boolean.rb
|
120
|
+
- lib/rider_server/validate/hash.rb
|
121
|
+
- lib/rider_server/validate/integer.rb
|
122
|
+
- lib/rider_server/validate/predicates.rb
|
123
|
+
- lib/rider_server/validate/string.rb
|
124
|
+
- lib/rider_server/validate/symbol.rb
|
94
125
|
- lib/rider_server/version.rb
|
95
126
|
- lib/rider_server/workspace.rb
|
96
127
|
homepage: https://sr.ht/~rsl/rider-server/
|
@@ -106,9 +137,9 @@ require_paths:
|
|
106
137
|
- lib
|
107
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
139
|
requirements:
|
109
|
-
- - "
|
140
|
+
- - ">="
|
110
141
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
142
|
+
version: '0'
|
112
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
144
|
requirements:
|
114
145
|
- - ">="
|
data/README.md
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# RIDER -- RIDER Interactive Development Environment for Ruby
|
2
|
-
|
3
|
-
RIDER Server is the server component of the RIDER development
|
4
|
-
environment.
|
5
|
-
|
6
|
-
## Installation
|
7
|
-
|
8
|
-
TODO: Replace
|
9
|
-
`UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG`
|
10
|
-
with your gem name right after releasing it to RubyGems.org. Please do
|
11
|
-
not do it earlier due to security reasons. Alternatively, replace this
|
12
|
-
section with instructions to install your gem from git if you don't
|
13
|
-
plan to release to RubyGems.org.
|
14
|
-
|
15
|
-
Install the gem and add to the application's Gemfile by executing:
|
16
|
-
|
17
|
-
$ bundle add rider-server
|
18
|
-
|
19
|
-
If bundler is not being used to manage dependencies, install the gem by executing:
|
20
|
-
|
21
|
-
$ gem install rider-server
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
TODO: Write usage instructions here
|
26
|
-
|
27
|
-
## Development
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install
|
30
|
-
dependencies. Then, run `rake test` to run the tests. You can also run
|
31
|
-
`bin/console` for an interactive prompt that will allow you to
|
32
|
-
experiment.
|
33
|
-
|
34
|
-
To install this gem onto your local machine, run `bundle exec rake
|
35
|
-
install`. To release a new version, update the version number in
|
36
|
-
`version.rb`, and then run `bundle exec rake release`, which will
|
37
|
-
create a git tag for the version, push git commits and the created
|
38
|
-
tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
39
|
-
|
40
|
-
## Contributing
|
41
|
-
|
42
|
-
Bug reports https://todo.sr.ht/~rsl/rider
|
43
|
-
|
44
|
-
Support or discussion https://lists.sr.ht/~rsl/rider-devel
|
@@ -1,100 +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 Completions < Operation
|
8
|
-
documentation "Get completions for a given prefix"
|
9
|
-
|
10
|
-
argument :id, :string, "The request id", required: true
|
11
|
-
argument :prefix, :string, "The prefix to complete", required: true
|
12
|
-
argument :ns, :string, "The namespace to search for completions"
|
13
|
-
|
14
|
-
def initialize(*args)
|
15
|
-
@workspace = Workspace.new
|
16
|
-
super
|
17
|
-
end
|
18
|
-
|
19
|
-
def handle(session, operation)
|
20
|
-
response = Response.new(operation)
|
21
|
-
|
22
|
-
prefix = operation["prefix"]
|
23
|
-
log.info "prefix: #{prefix}"
|
24
|
-
ns = operation["ns"]
|
25
|
-
# options = operation["options"]
|
26
|
-
|
27
|
-
log.info "prefix: #{prefix}"
|
28
|
-
ns_object = @workspace.lookup_module(ns)
|
29
|
-
log.info "ns_object: #{ns_object}"
|
30
|
-
|
31
|
-
response.set("completions", lookup_module(prefix, ns_object))
|
32
|
-
log.info "completions: #{response["completions"]}"
|
33
|
-
|
34
|
-
response.status("done")
|
35
|
-
response
|
36
|
-
rescue ScriptError, StandardError => e
|
37
|
-
log.error "Error in completions: #{e}"
|
38
|
-
log.error e.backtrace.join("\n")
|
39
|
-
raise e
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def lookup_module(module_name, klass = ::Object)
|
45
|
-
node = parse_string(module_name)
|
46
|
-
case node.type
|
47
|
-
when :const
|
48
|
-
ns = lookup_module_ast(node.children.first, klass)
|
49
|
-
prefix = node.children.last
|
50
|
-
all_constants(ns, prefix) + all_methods(ns, prefix)
|
51
|
-
when :send
|
52
|
-
ns = lookup_module_ast(node.children.first, klass)
|
53
|
-
prefix = node.children.last
|
54
|
-
all_methods(ns, prefix)
|
55
|
-
else
|
56
|
-
[]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def parse_string(string)
|
61
|
-
buffer = Parser::Source::Buffer.new("(string)")
|
62
|
-
buffer.source = string
|
63
|
-
Parser::CurrentRuby.new.parse(buffer)
|
64
|
-
end
|
65
|
-
|
66
|
-
def lookup_module_ast(node, klass = ::Object)
|
67
|
-
case node.type
|
68
|
-
when :cbase
|
69
|
-
::Object
|
70
|
-
when :const
|
71
|
-
if node.children.first.nil?
|
72
|
-
klass.const_get(node.children.last)
|
73
|
-
else
|
74
|
-
lookup_module_ast(node.children.first, klass).const_get(node.children.last)
|
75
|
-
end
|
76
|
-
else
|
77
|
-
raise ModuleLookupError, "Unknown node type #{node.type}"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def all_constants(ns_object, prefix)
|
82
|
-
ns_object.constants.grep(/^#{prefix}/).map do |constant|
|
83
|
-
{
|
84
|
-
"candidate" => constant.to_s,
|
85
|
-
"type" => "constant"
|
86
|
-
}
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def all_methods(ns_object, prefix)
|
91
|
-
ns_object.methods.grep(/^#{prefix}/).map do |method|
|
92
|
-
{
|
93
|
-
"candidate" => method.to_s,
|
94
|
-
"type" => "method"
|
95
|
-
}
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
require "rider_server/utils"
|
4
|
-
|
5
|
-
module RiderServer
|
6
|
-
module Ops
|
7
|
-
class Eval < Operation
|
8
|
-
documentation "Evaluate a string of code"
|
9
|
-
|
10
|
-
argument :id, :string, "The request id", required: true
|
11
|
-
argument :code, :string, "The code to evaluate"
|
12
|
-
argument :ns, :string, "The namespace to evaluate the code in"
|
13
|
-
argument :file, :string, "The file the code is from"
|
14
|
-
argument :line, :integer, "The line number the code is from"
|
15
|
-
|
16
|
-
def handle(session, operation)
|
17
|
-
# TODO should do something if the session is nil
|
18
|
-
|
19
|
-
response = Response.new(operation)
|
20
|
-
|
21
|
-
# Abort if there is an evaluation with the same id
|
22
|
-
if session.running_evaluation?(operation["id"])
|
23
|
-
msg = "Evaluation already in progress for #{operation["id"]}"
|
24
|
-
log.warn(msg)
|
25
|
-
response.set("value", msg)
|
26
|
-
response.status("eval-error", "done")
|
27
|
-
send_response(response)
|
28
|
-
return
|
29
|
-
end
|
30
|
-
|
31
|
-
session.push_history(operation)
|
32
|
-
code = operation["code"]
|
33
|
-
ns = operation["ns"]
|
34
|
-
file = operation["file"] || ""
|
35
|
-
line = operation["line"] || 0
|
36
|
-
|
37
|
-
eval_thread = Thread.new do
|
38
|
-
begin
|
39
|
-
value = session.workspace.evaluate(code, ns, file, line)
|
40
|
-
response.set("value", Utils.rider_inspect(value))
|
41
|
-
response.set("ns", session.workspace.evaluate("inspect"))
|
42
|
-
response.status("done")
|
43
|
-
session.add_result(operation["id"], value)
|
44
|
-
send_response(response)
|
45
|
-
rescue EvalInterrupt, ScriptError, StandardError => e
|
46
|
-
response.set("ex", e.inspect)
|
47
|
-
response.set("ns", session.workspace.evaluate("inspect"))
|
48
|
-
response.status("eval-error", "done")
|
49
|
-
exception_id = session.add_exception(operation["id"], e)
|
50
|
-
response.set("rider/exception-id", exception_id)
|
51
|
-
send_response(response)
|
52
|
-
end
|
53
|
-
|
54
|
-
session.remove_evaluation(operation["id"])
|
55
|
-
end
|
56
|
-
|
57
|
-
session.add_evaluation(operation["id"], eval_thread)
|
58
|
-
nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,121 +0,0 @@
|
|
1
|
-
require "rider_server/inspect"
|
2
|
-
require "rider_server/operation"
|
3
|
-
require "rider_server/response"
|
4
|
-
require "rider_server/utils"
|
5
|
-
|
6
|
-
module RiderServer
|
7
|
-
module Ops
|
8
|
-
class Inspect < Operation
|
9
|
-
documentation "Inspect an object"
|
10
|
-
|
11
|
-
argument :id, :string, "The request id", required: true
|
12
|
-
argument :location, :array, "The location of the object to inspect"
|
13
|
-
|
14
|
-
def handle(session, operation)
|
15
|
-
response = Response.new(operation)
|
16
|
-
location = operation["location"]
|
17
|
-
raise "Location is required" if location.nil? || location.empty?
|
18
|
-
|
19
|
-
value = traverse_location(location, nil, session)
|
20
|
-
response.set("name", Utils.rider_inspect(value))
|
21
|
-
|
22
|
-
if value.is_a?(Array)
|
23
|
-
value = value.map.with_index do |item, index|
|
24
|
-
{
|
25
|
-
"name" => item.to_s,
|
26
|
-
"value" => Utils.rider_inspect(item),
|
27
|
-
"inspect-location" => "rider_array_item:#{index}"
|
28
|
-
}
|
29
|
-
end
|
30
|
-
response.set("value-array", value)
|
31
|
-
elsif value.is_a?(Hash)
|
32
|
-
value = value.map do |key, value|
|
33
|
-
[
|
34
|
-
{
|
35
|
-
"name" => key.to_s,
|
36
|
-
"value" => Utils.rider_inspect(key),
|
37
|
-
"inspect-location" => "rider_hash_key:#{key.hash}"
|
38
|
-
},
|
39
|
-
{
|
40
|
-
"name" => value.to_s,
|
41
|
-
"value" => Utils.rider_inspect(value),
|
42
|
-
"inspect-location" => "rider_hash_value:#{key.hash}"
|
43
|
-
}
|
44
|
-
]
|
45
|
-
end
|
46
|
-
response.set("value-hash", value)
|
47
|
-
elsif value.is_a?(String)
|
48
|
-
response.set("value", value.inspect)
|
49
|
-
elsif value.is_a?(Numeric)
|
50
|
-
response.set("value", value.to_s)
|
51
|
-
end
|
52
|
-
|
53
|
-
response.set("inspect-location", location)
|
54
|
-
|
55
|
-
response.set("class", RiderServer::Inspect.class(value))
|
56
|
-
response.set("ancestors", RiderServer::Inspect.ancestors(value))
|
57
|
-
response.set("constants", RiderServer::Inspect.constants(value))
|
58
|
-
response.set("methods", RiderServer::Inspect.methods(value))
|
59
|
-
response.set("instance-variables", RiderServer::Inspect.instance_variables(value))
|
60
|
-
response.set("instance-methods", RiderServer::Inspect.instance_methods(value))
|
61
|
-
response.set("class-variables", RiderServer::Inspect.class_variables(value))
|
62
|
-
response.status("done")
|
63
|
-
response
|
64
|
-
end
|
65
|
-
|
66
|
-
def traverse_location(location, ctx, session)
|
67
|
-
loc = location.first
|
68
|
-
locs = location.drop(1)
|
69
|
-
|
70
|
-
if locs.empty?
|
71
|
-
lookup_object(loc, ctx, session)
|
72
|
-
else
|
73
|
-
traverse_location(locs, lookup_object(loc, ctx, session), session)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def lookup_object(loc, ctx, session)
|
78
|
-
lookup, identifier = loc.split(":", 2)
|
79
|
-
|
80
|
-
case lookup
|
81
|
-
when "rider_main"
|
82
|
-
"main"
|
83
|
-
when "rider_history"
|
84
|
-
rider_history(identifier, nil, session)
|
85
|
-
when "rider_exception"
|
86
|
-
rider_exception(identifier, nil, session)
|
87
|
-
when "rider_stackframe_variable"
|
88
|
-
frame_id, local_var = identifier.split(":", 2)
|
89
|
-
ctx.__rider_bindings_stack[frame_id.to_i].local_variable_get(local_var)
|
90
|
-
when "rider_array_item"
|
91
|
-
ctx[identifier.to_i]
|
92
|
-
when "rider_hash_key"
|
93
|
-
hash = identifier.to_i
|
94
|
-
ctx.keys.find { |key| key.hash == hash }
|
95
|
-
when "rider_hash_value"
|
96
|
-
hash = identifier.to_i
|
97
|
-
key = ctx.keys.find { |key| key.hash == hash }
|
98
|
-
ctx.fetch(key)
|
99
|
-
when "toplevel_const_get"
|
100
|
-
Object.const_get(identifier)
|
101
|
-
when "instance_variable_get"
|
102
|
-
ctx.instance_variable_get(identifier)
|
103
|
-
when "const_get"
|
104
|
-
ctx.const_get(identifier)
|
105
|
-
when "ancestor_find"
|
106
|
-
ctx.class.ancestors.find { |item| item.to_s == identifier }
|
107
|
-
else
|
108
|
-
raise "Unknown inspect function: #{lookup}"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def rider_history(id, ctx, session)
|
113
|
-
session.get_result(id)
|
114
|
-
end
|
115
|
-
|
116
|
-
def rider_exception(id, ctx, session)
|
117
|
-
session.get_exception(id)["exception"]
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class InspectException < Operation
|
7
|
-
documentation "Inspect an exception."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :"exception-id", :string, "The exception id"
|
11
|
-
|
12
|
-
def handle(session, operation)
|
13
|
-
response = Response.new(operation)
|
14
|
-
exception_id = operation["exception-id"]
|
15
|
-
|
16
|
-
value = session.get_exception(exception_id)
|
17
|
-
response.set("inspect-location", value["id"])
|
18
|
-
response.set("exception-id", value["id"])
|
19
|
-
response.set("source-operation-id", value["operation_id"])
|
20
|
-
response.set("created-at", value["created_at"].to_s)
|
21
|
-
|
22
|
-
exception = value["exception"]
|
23
|
-
response.set("value", exception.inspect)
|
24
|
-
response.set("stacktrace", encode_stacktrace(exception, exception_id))
|
25
|
-
|
26
|
-
response.status("done")
|
27
|
-
response
|
28
|
-
end
|
29
|
-
|
30
|
-
def encode_stacktrace(exception, exception_id)
|
31
|
-
exception.backtrace.zip(exception.__rider_bindings_stack).map.with_index do |(line, frame), frame_id|
|
32
|
-
{
|
33
|
-
"line" => line,
|
34
|
-
"inspect-location" => ["rider_exception:#{exception_id}", "rider_stackframe:#{frame_id}"],
|
35
|
-
"frame" => (frame&.local_variables || []).map do |var|
|
36
|
-
{
|
37
|
-
"name" => var.to_s,
|
38
|
-
"value" => Utils.rider_inspect(frame.local_variable_get(var)),
|
39
|
-
"inspect-location" => ["rider_exception:#{exception_id}", "rider_stackframe_variable:#{frame_id}:#{var}"]
|
40
|
-
}
|
41
|
-
end
|
42
|
-
}
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class Interrupt < Operation
|
7
|
-
documentation "Interrupts the evaluation of a session."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
argument :"interrupt-id", :string, "The ID of the evaluation to interrupt.", required: true
|
11
|
-
|
12
|
-
def handle(session, operation)
|
13
|
-
# TODO should do something if the session is nil
|
14
|
-
|
15
|
-
if operation["interrupt-id"].nil? || operation["interrupt-id"].empty?
|
16
|
-
if session.evaluations.empty?
|
17
|
-
raise ArgumentError, "No evaluations to interrupt"
|
18
|
-
end
|
19
|
-
session.interrupt_evaluation(session.evaluations.keys.max)
|
20
|
-
else
|
21
|
-
session.interrupt_evaluation(operation["interrupt-id"])
|
22
|
-
end
|
23
|
-
|
24
|
-
response = Response.new(operation)
|
25
|
-
response.status("interrupted", "done")
|
26
|
-
response
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require "rider_server/operation"
|
2
|
-
require "rider_server/response"
|
3
|
-
|
4
|
-
module RiderServer
|
5
|
-
module Ops
|
6
|
-
class LoadPath < Operation
|
7
|
-
documentation "Return the current load path."
|
8
|
-
|
9
|
-
argument :id, :string, "The request id", required: true
|
10
|
-
|
11
|
-
def handle(session, operation)
|
12
|
-
response = Response.new(operation)
|
13
|
-
load_path = session.workspace.evaluate("$LOAD_PATH", "main")
|
14
|
-
response.set("load-path", load_path)
|
15
|
-
response.status("done")
|
16
|
-
response
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,83 +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 completions for a given string"
|
9
|
-
|
10
|
-
argument :id, :string, "The request id", required: true
|
11
|
-
argument :sym, :string, "The symbol to lookup", required: true
|
12
|
-
argument :ns, :string, "The namespace to search for completions"
|
13
|
-
|
14
|
-
def initialize(*args)
|
15
|
-
@workspace = Workspace.new
|
16
|
-
super
|
17
|
-
end
|
18
|
-
|
19
|
-
def handle(session, operation)
|
20
|
-
response = Response.new(operation)
|
21
|
-
ns = operation["ns"]
|
22
|
-
sym = operation["sym"]
|
23
|
-
|
24
|
-
ns_object = @workspace.lookup_module(ns)
|
25
|
-
|
26
|
-
method_type = nil
|
27
|
-
if sym.include?("#")
|
28
|
-
sym, method = sym.split("#")
|
29
|
-
method_type = :instance
|
30
|
-
method = method.to_sym
|
31
|
-
elsif sym.start_with?("self.class")
|
32
|
-
method = sym.split(".").last
|
33
|
-
method_type = :class
|
34
|
-
method = method.to_sym
|
35
|
-
elsif sym.include?(".")
|
36
|
-
sym, method = sym.split(".")
|
37
|
-
method_type = :class
|
38
|
-
method = method.to_sym
|
39
|
-
end
|
40
|
-
|
41
|
-
if sym.include?("::")
|
42
|
-
ns_object = lookup_ns(sym.split("::"), ns_object)
|
43
|
-
end
|
44
|
-
constant = ns_object
|
45
|
-
|
46
|
-
info = if sym.start_with?("@")
|
47
|
-
constant = ns_object.instance_variable_get(sym)
|
48
|
-
elsif method_type == :instance
|
49
|
-
RiderServer::Inspect.describe_method(constant.instance_method(method))
|
50
|
-
elsif method_type == :class
|
51
|
-
RiderServer::Inspect.describe_method(constant.method(method))
|
52
|
-
elsif constant.respond_to?(:instance_methods) && constant.instance_methods.include?(sym.to_sym)
|
53
|
-
RiderServer::Inspect.describe_method(constant.instance_method(sym))
|
54
|
-
elsif constant.respond_to?(:methods) && constant.methods.include?(sym.to_sym)
|
55
|
-
RiderServer::Inspect.describe_method(constant.method(sym))
|
56
|
-
else
|
57
|
-
{}
|
58
|
-
end
|
59
|
-
|
60
|
-
response.set("info", info)
|
61
|
-
response.status("done")
|
62
|
-
response
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def lookup_ns(module_name, klass = Object)
|
68
|
-
if module_name.start_with?("::")
|
69
|
-
klass = Module
|
70
|
-
module_name = module_name.delete_prefix("::")
|
71
|
-
end
|
72
|
-
|
73
|
-
path = module_name.split("::")
|
74
|
-
|
75
|
-
path.inject(klass) do |acc, elem|
|
76
|
-
acc.const_get(elem)
|
77
|
-
end
|
78
|
-
rescue NameError
|
79
|
-
nil
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
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 have occurred in the session."
|
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
|