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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.build.yml +3 -3
  3. data/CHANGELOG.md +17 -1
  4. data/README.rdoc +39 -0
  5. data/Rakefile +5 -0
  6. data/exe/rider-server +3 -3
  7. data/lib/rider_server/config.rb +76 -0
  8. data/lib/rider_server/core_ext/array.rb +3 -1
  9. data/lib/rider_server/core_ext/class.rb +5 -0
  10. data/lib/rider_server/core_ext/env.rb +14 -0
  11. data/lib/rider_server/core_ext/hash.rb +3 -1
  12. data/lib/rider_server/core_ext/kernel.rb +5 -0
  13. data/lib/rider_server/core_ext/module.rb +18 -0
  14. data/lib/rider_server/core_ext/object.rb +7 -1
  15. data/lib/rider_server/core_ext/string.rb +3 -1
  16. data/lib/rider_server/core_ext/symbol.rb +3 -1
  17. data/lib/rider_server/exception_extension.rb +2 -0
  18. data/lib/rider_server/inspect.rb +108 -32
  19. data/lib/rider_server/logger.rb +11 -4
  20. data/lib/rider_server/operation.rb +39 -20
  21. data/lib/rider_server/{ops → operations}/clone.rb +3 -2
  22. data/lib/rider_server/{ops → operations}/close.rb +3 -2
  23. data/lib/rider_server/operations/completions.rb +146 -0
  24. data/lib/rider_server/operations/lookup.rb +102 -0
  25. data/lib/rider_server/operations/ls_sessions.rb +51 -0
  26. data/lib/rider_server/operations/toggle_catch_all_exceptions.rb +24 -0
  27. data/lib/rider_server/operations.rb +42 -68
  28. data/lib/rider_server/request.rb +61 -0
  29. data/lib/rider_server/response.rb +10 -2
  30. data/lib/rider_server/server.rb +28 -16
  31. data/lib/rider_server/services/capture_exceptions.rb +1 -1
  32. data/lib/rider_server/services/rails.rb +1 -1
  33. data/lib/rider_server/session.rb +75 -44
  34. data/lib/rider_server/session_operation.rb +17 -0
  35. data/lib/rider_server/session_operations/eval.rb +61 -0
  36. data/lib/rider_server/session_operations/inspect.rb +123 -0
  37. data/lib/rider_server/session_operations/inspect_exception.rb +46 -0
  38. data/lib/rider_server/session_operations/interrupt.rb +29 -0
  39. data/lib/rider_server/session_operations/load_path.rb +19 -0
  40. data/lib/rider_server/session_operations/ls_exceptions.rb +28 -0
  41. data/lib/rider_server/session_operations/ls_services.rb +18 -0
  42. data/lib/rider_server/session_operations/service.rb +42 -0
  43. data/lib/rider_server/session_operations/set_namespace.rb +82 -0
  44. data/lib/rider_server/session_operations/set_namespace_variable.rb +81 -0
  45. data/lib/rider_server/session_operations/stdin.rb +19 -0
  46. data/lib/rider_server/utils.rb +7 -7
  47. data/lib/rider_server/validate/array.rb +32 -0
  48. data/lib/rider_server/validate/base.rb +28 -0
  49. data/lib/rider_server/validate/boolean.rb +47 -0
  50. data/lib/rider_server/validate/hash.rb +32 -0
  51. data/lib/rider_server/validate/integer.rb +56 -0
  52. data/lib/rider_server/validate/predicates.rb +30 -0
  53. data/lib/rider_server/validate/string.rb +60 -0
  54. data/lib/rider_server/validate/symbol.rb +90 -0
  55. data/lib/rider_server/validate.rb +15 -0
  56. data/lib/rider_server/version.rb +1 -1
  57. data/lib/rider_server/workspace.rb +1 -1
  58. data/lib/rider_server.rb +3 -1
  59. metadata +54 -24
  60. data/README.md +0 -46
  61. data/lib/rider_server/ops/completions.rb +0 -145
  62. data/lib/rider_server/ops/eval.rb +0 -62
  63. data/lib/rider_server/ops/inspect.rb +0 -121
  64. data/lib/rider_server/ops/inspect_exception.rb +0 -47
  65. data/lib/rider_server/ops/interrupt.rb +0 -30
  66. data/lib/rider_server/ops/load_path.rb +0 -20
  67. data/lib/rider_server/ops/lookup.rb +0 -104
  68. data/lib/rider_server/ops/ls_exceptions.rb +0 -29
  69. data/lib/rider_server/ops/ls_services.rb +0 -19
  70. data/lib/rider_server/ops/ls_sessions.rb +0 -52
  71. data/lib/rider_server/ops/service.rb +0 -43
  72. data/lib/rider_server/ops/set_namespace.rb +0 -79
  73. data/lib/rider_server/ops/set_namespace_variable.rb +0 -80
  74. data/lib/rider_server/ops/stdin.rb +0 -20
  75. 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