itsi 0.1.14 → 0.1.19

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +126 -272
  3. data/Cargo.toml +6 -0
  4. data/crates/itsi_error/Cargo.toml +1 -0
  5. data/crates/itsi_error/src/lib.rs +100 -10
  6. data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
  7. data/crates/itsi_server/Cargo.toml +12 -11
  8. data/crates/itsi_server/src/default_responses/html/401.html +68 -0
  9. data/crates/itsi_server/src/default_responses/html/403.html +68 -0
  10. data/crates/itsi_server/src/default_responses/html/404.html +68 -0
  11. data/crates/itsi_server/src/default_responses/html/413.html +71 -0
  12. data/crates/itsi_server/src/default_responses/html/429.html +68 -0
  13. data/crates/itsi_server/src/default_responses/html/500.html +71 -0
  14. data/crates/itsi_server/src/default_responses/html/502.html +71 -0
  15. data/crates/itsi_server/src/default_responses/html/503.html +68 -0
  16. data/crates/itsi_server/src/default_responses/html/504.html +69 -0
  17. data/crates/itsi_server/src/default_responses/html/index.html +238 -0
  18. data/crates/itsi_server/src/default_responses/json/401.json +6 -0
  19. data/crates/itsi_server/src/default_responses/json/403.json +6 -0
  20. data/crates/itsi_server/src/default_responses/json/404.json +6 -0
  21. data/crates/itsi_server/src/default_responses/json/413.json +6 -0
  22. data/crates/itsi_server/src/default_responses/json/429.json +6 -0
  23. data/crates/itsi_server/src/default_responses/json/500.json +6 -0
  24. data/crates/itsi_server/src/default_responses/json/502.json +6 -0
  25. data/crates/itsi_server/src/default_responses/json/503.json +6 -0
  26. data/crates/itsi_server/src/default_responses/json/504.json +6 -0
  27. data/crates/itsi_server/src/default_responses/mod.rs +11 -0
  28. data/crates/itsi_server/src/lib.rs +58 -26
  29. data/crates/itsi_server/src/prelude.rs +2 -0
  30. data/crates/itsi_server/src/ruby_types/README.md +21 -0
  31. data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
  32. data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  33. data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
  34. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
  35. data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
  36. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
  37. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
  38. data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
  39. data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
  40. data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
  41. data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
  42. data/crates/itsi_server/src/server/binds/mod.rs +4 -0
  43. data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
  44. data/crates/itsi_server/src/server/http_message_types.rs +97 -0
  45. data/crates/itsi_server/src/server/io_stream.rs +2 -1
  46. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
  70. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  71. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
  72. data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
  73. data/crates/itsi_server/src/server/mod.rs +3 -9
  74. data/crates/itsi_server/src/server/process_worker.rs +21 -3
  75. data/crates/itsi_server/src/server/request_job.rs +2 -2
  76. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
  77. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
  78. data/crates/itsi_server/src/server/signal.rs +24 -41
  79. data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
  80. data/crates/itsi_server/src/server/thread_worker.rs +59 -28
  81. data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
  82. data/crates/itsi_server/src/services/mime_types.rs +1416 -0
  83. data/crates/itsi_server/src/services/mod.rs +6 -0
  84. data/crates/itsi_server/src/services/password_hasher.rs +83 -0
  85. data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
  86. data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
  87. data/crates/itsi_tracing/src/lib.rs +145 -55
  88. data/{Itsi.rb → foo/Itsi.rb} +6 -9
  89. data/gems/scheduler/Cargo.lock +7 -0
  90. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  91. data/gems/scheduler/test/helpers/test_helper.rb +0 -1
  92. data/gems/scheduler/test/test_address_resolve.rb +0 -1
  93. data/gems/scheduler/test/test_network_io.rb +1 -1
  94. data/gems/scheduler/test/test_process_wait.rb +0 -1
  95. data/gems/server/Cargo.lock +126 -272
  96. data/gems/server/exe/itsi +65 -19
  97. data/gems/server/itsi-server.gemspec +4 -3
  98. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
  99. data/gems/server/lib/itsi/http_request.rb +117 -17
  100. data/gems/server/lib/itsi/http_response.rb +2 -0
  101. data/gems/server/lib/itsi/passfile.rb +109 -0
  102. data/gems/server/lib/itsi/server/config/dsl.rb +171 -99
  103. data/gems/server/lib/itsi/server/config.rb +58 -23
  104. data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
  105. data/gems/server/lib/itsi/server/default_app/index.html +113 -89
  106. data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
  107. data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
  108. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
  109. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
  110. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
  111. data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
  112. data/gems/server/lib/itsi/server/route_tester.rb +107 -0
  113. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
  114. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
  115. data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
  116. data/gems/server/lib/itsi/server/version.rb +1 -1
  117. data/gems/server/lib/itsi/server.rb +82 -12
  118. data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
  119. data/gems/server/lib/shell_completions/completions.rb +26 -0
  120. data/gems/server/test/helpers/test_helper.rb +2 -1
  121. data/lib/itsi/version.rb +1 -1
  122. data/sandbox/README.md +5 -0
  123. data/sandbox/itsi_file/Gemfile +4 -2
  124. data/sandbox/itsi_file/Gemfile.lock +48 -6
  125. data/sandbox/itsi_file/Itsi.rb +327 -129
  126. data/sandbox/itsi_file/call.json +1 -0
  127. data/sandbox/itsi_file/echo_client/Gemfile +10 -0
  128. data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
  129. data/sandbox/itsi_file/echo_client/README.md +95 -0
  130. data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
  131. data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
  132. data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
  133. data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
  134. data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
  135. data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
  136. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
  137. data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
  138. data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
  139. data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
  140. data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
  141. data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
  142. data/sandbox/itsi_sandbox_async/config.ru +0 -1
  143. data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
  144. data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
  145. data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
  146. data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
  147. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
  148. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
  149. data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
  150. data/sandbox/itsi_sinatra/app.rb +0 -1
  151. data/sandbox/static_files/.env +1 -0
  152. data/sandbox/static_files/404.html +25 -0
  153. data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
  154. data/sandbox/static_files/about.html +68 -0
  155. data/sandbox/static_files/tiny.html +1 -0
  156. data/sandbox/static_files/writebook.zip +0 -0
  157. data/tasks.txt +28 -33
  158. metadata +87 -26
  159. data/crates/itsi_error/src/from.rs +0 -68
  160. data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
  161. data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
  162. data/crates/itsi_server/src/server/itsi_service.rs +0 -172
  163. data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
  164. data/crates/itsi_server/src/server/types.rs +0 -43
  165. data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
  166. data/sandbox/itsi_file/public/assets/index.html +0 -1
  167. /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
  168. /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
  169. /data/crates/itsi_server/src/{server → services}/cache_store.rs +0 -0
@@ -3,45 +3,62 @@
3
3
  require_relative "server/version"
4
4
  require_relative "server/itsi_server"
5
5
  require_relative "server/rack_interface"
6
- require_relative "server/grpc_interface"
6
+ require_relative "server/grpc/grpc_interface"
7
+ require_relative "server/grpc/grpc_call"
7
8
  require_relative "server/scheduler_interface"
8
9
  require_relative "server/signal_trap"
10
+ require_relative "server/route_tester"
9
11
  require_relative "server/rack/handler/itsi"
10
12
  require_relative "server/config"
13
+ require_relative "server/typed_handlers"
11
14
  require_relative "standard_headers"
12
15
  require_relative "http_request"
13
16
  require_relative "http_response"
17
+ require_relative "passfile"
18
+ require_relative "../shell_completions/completions"
14
19
 
15
20
  module Itsi
16
21
  class Server
17
22
  extend RackInterface
18
23
  extend SchedulerInterface
24
+ extend RouteTester
19
25
 
20
26
  class << self
27
+
21
28
  def running?
22
29
  !!@running
23
30
  end
24
31
 
25
- def start_in_background_thread(cli_params={}, itsi_file = Itsi::Server::Config.config_file_path, &blk)
26
- @background_thread = start(cli_params, itsi_file, background: true, &blk)
32
+ def start_in_background_thread(cli_params = {}, &blk)
33
+ @background_thread = start(cli_params, background: true, &blk)
27
34
  end
28
35
 
29
- def start(cli_params, itsi_file = Itsi::Server::Config.config_file_path, background: false, &blk)
36
+ def start(cli_params, background: false, &blk)
37
+ itsi_file = Itsi::Server::Config.config_file_path(cli_params[:config_file])
30
38
  server = new(cli_params, itsi_file, blk)
31
39
  previous_handler = Signal.trap(:INT, :DEFAULT)
32
40
  run = lambda do
33
41
  write_pid
34
42
  @running = server
35
43
  server.start
44
+ @running = false
36
45
  Signal.trap(:INT, previous_handler)
37
46
  server
38
47
  end
39
48
  background ? Thread.new(&run) : run[]
40
49
  end
41
50
 
51
+ def static(cli_params)
52
+ start(cli_params.merge(static: true))
53
+ end
54
+
55
+ def stop
56
+ return unless pid = get_pid
57
+ Process.kill(:INT, pid)
58
+ end
59
+
42
60
  def stop_background_thread
43
61
  @running&.stop
44
- @running = nil
45
62
  @background_thread&.join
46
63
  end
47
64
 
@@ -54,16 +71,22 @@ module Itsi
54
71
  if Process.kill(0, pid)
55
72
  pid
56
73
  else
74
+ puts "No server running"
57
75
  nil
58
76
  end
59
77
  rescue StandardError
78
+ puts "No server running"
60
79
  nil
61
80
  end
62
81
 
82
+ def init
83
+ Config.write_default
84
+ end
85
+
63
86
  def reload
64
87
  return unless pid = get_pid
65
88
 
66
- Process.kill(:USR2, pid)
89
+ Process.kill(:HUP, pid)
67
90
  end
68
91
 
69
92
  def restart
@@ -72,12 +95,29 @@ module Itsi
72
95
  Process.kill(:USR1, pid)
73
96
  end
74
97
 
75
- def down
76
- puts :down
77
- end
98
+ def passfile(options, subcmd)
99
+ filename = options[:passfile]
100
+ unless filename
101
+ puts "Error: passfile not set. Use --passfile option to provide a path to a file containing hashed credentials."
102
+ puts "This file contains hashed credentials and should not be included in source control without additional protection."
103
+ exit(1)
104
+ end
105
+ algorithm = options.fetch(:algorithm, 'sha256')
78
106
 
79
- def up
80
- puts :up
107
+ unless %w[sha256 sha512 bcrypt argon2 none].include?(algorithm)
108
+ puts "Invalid algorithm"
109
+ exit(1)
110
+ end
111
+
112
+ case subcmd
113
+ when 'add', 'echo'
114
+ Passfile.send(subcmd, filename, algorithm)
115
+ when 'remove', 'list'
116
+ Passfile.send(subcmd, filename)
117
+ else
118
+ puts "Valid subcommands are: add | remove | list"
119
+ exit(0)
120
+ end
81
121
  end
82
122
 
83
123
  def add_worker
@@ -95,8 +135,38 @@ module Itsi
95
135
  def status
96
136
  return unless pid = get_pid
97
137
 
98
- Process.kill(:INFO, pid)
138
+ Process.kill(:USR2, pid)
139
+ end
140
+
141
+ def load_route_middleware_stack(cli_params)
142
+ Config.build_config(cli_params, Itsi::Server::Config.config_file_path(cli_params[:config_file_path]))[
143
+ "middleware_loader"
144
+ ][]
145
+ end
146
+
147
+ def test_route(cli_params = {}, route_str)
148
+ matched_route = load_route_middleware_stack(cli_params).find do |route|
149
+ route["route"] =~ route_str
150
+ end
151
+ if matched_route
152
+ print_route(route_str, matched_route)
153
+ else
154
+ puts "No matching route found"
155
+ end
156
+ end
157
+
158
+ def routes(cli_params = {})
159
+ load_route_middleware_stack(cli_params).each do |stack|
160
+ routes = explode_route_pattern(stack["route"].source)
161
+ routes.each do |route|
162
+ print_route(route, stack)
163
+ end
164
+ end
165
+ puts "─" * 76
99
166
  end
167
+
168
+ alias serve start
169
+
100
170
  end
101
171
  end
102
172
  end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ruby_lsp/addon"
4
+ puts "Here we go"
5
+ module RubyLsp
6
+ module Itsi
7
+ class Addon < ::RubyLsp::Addon
8
+
9
+ def name
10
+ "Ruby LSP Itsi"
11
+ end
12
+
13
+ def version
14
+ "0.1.0"
15
+ end
16
+
17
+ def create_completion_listener(response_builder, node_context, dispatcher, uri)
18
+ return unless uri.to_s.end_with?("Itsi.rb")
19
+ @in_itsi_file = true
20
+ CompletionListener.new(response_builder, node_context, dispatcher, uri)
21
+ end
22
+
23
+ def create_hover_listener(response_builder, node_context, dispatcher)
24
+ hl = dispatcher.listeners[:on_call_node_enter].find{|c| c.kind_of?(RubyLsp::Listeners::Hover)}
25
+
26
+ return unless hl.instance_variable_get("@path").to_s.end_with?("Itsi.rb")
27
+ HoverListener.new(response_builder, node_context, dispatcher)
28
+ end
29
+ end
30
+
31
+ class HoverListener
32
+ def initialize(response_builder, node_context, dispatcher)
33
+ @response_builder = response_builder
34
+ @node_context = node_context
35
+ @dispatcher = dispatcher
36
+
37
+ # Register for call nodes (you could also use other events if more appropriate)
38
+ dispatcher.register(self, :on_call_node_enter)
39
+ end
40
+
41
+ def on_call_node_enter(node)
42
+ # Check if this is the call for foo_bar; you might add additional logic if needed.
43
+ case node.message
44
+ when "log_level"
45
+ # Push a simple hover response.
46
+ @response_builder.push(
47
+ "Method **log_level**: A method that takes a single parameter `a`.",
48
+ category: :documentation
49
+ )
50
+ when "shutdown_timeout"
51
+ # Push a simple hover response.
52
+ @response_builder.push(
53
+ "Method **shutdown_timeout**: Number of seconds to wait for a graceful shutdown before forcefully shutting down.",
54
+ category: :documentation
55
+ )
56
+ when "log"
57
+ # Push a simple hover response.
58
+ @response_builder.push(
59
+ "Method **log**: A method that takes a single parameter `a`.",
60
+ category: :documentation
61
+ )
62
+ end
63
+ end
64
+ end
65
+
66
+ class CompletionListener
67
+ def initialize(response_builder, node_context, dispatcher, uri)
68
+ @response_builder = response_builder
69
+ @node_context = node_context
70
+ @uri = uri
71
+ @dispatcher = dispatcher
72
+
73
+ # Register for call nodes to handle method completions
74
+ dispatcher.register(self, :on_call_node_enter)
75
+ end
76
+
77
+ def on_call_node_enter(node)
78
+ # Only handle method calls that are being typed (no arguments yet)
79
+ return unless node.arguments.nil?
80
+ puts "Adding log level completion"
81
+ # Add our completion item
82
+ @response_builder << Interface::CompletionItem.new(
83
+ label: "log_level",
84
+ kind: Constant::CompletionItemKind::METHOD,
85
+ detail: "log_level a ",
86
+ documentation: "A method that takes a single parameter 'a'",
87
+ insert_text: "log_level ${1|:info,:debug,:warn,:error|}",
88
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
89
+ )
90
+
91
+ @response_builder << Interface::CompletionItem.new(
92
+ label: "bind",
93
+ kind: Constant::CompletionItemKind::METHOD,
94
+ detail: "Bind to an interface",
95
+ documentation: "A method that takes a single parameter 'a'",
96
+ insert_text: "bind ${1|'https://0.0.0.0','http://0.0.0.0','http://0.0.0.0:3000','https://0.0.0.0:3000','http://127.0.0.1','https://127.0.0.1'|}",
97
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
98
+ )
99
+
100
+ @response_builder << Interface::CompletionItem.new(
101
+ label: "log_format",
102
+ kind: Constant::CompletionItemKind::METHOD,
103
+ detail: "log_format",
104
+ documentation: "A method that takes a single parameter 'a'",
105
+ insert_text: "log_format ${1|:plain,:json,:auto|}",
106
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
107
+ )
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if ARGV.include?('--install-completions')
4
+ # Try to get the next argument as the shell name.
5
+ shell = ARGV[ARGV.index('--install-completions') + 1] rescue nil
6
+ # Fallback: use the basename of the SHELL environment variable
7
+ shell ||= File.basename(ENV['SHELL'] || '')
8
+
9
+ case shell.downcase
10
+ when 'bash'
11
+ # Bash completion script
12
+ puts 'complete -W "$(itsi --completion)" itsi'
13
+ when 'zsh'
14
+ puts <<~ZSH
15
+ _itsi() {
16
+ local completions
17
+ completions=("${(@f)$(itsi --completion)}")
18
+ compadd -- $completions
19
+ }
20
+ compdef _itsi itsi
21
+ ZSH
22
+ else
23
+ warn "Unsupported shell: #{shell}. Please specify 'bash' or 'zsh'."
24
+ end
25
+ exit
26
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ ENV["ITSI_LOG"] = "off"
2
3
 
3
4
  require "minitest/reporters"
4
5
  require "itsi/server"
@@ -20,7 +21,7 @@ def run_app(app, protocol: "http", bind: free_bind(protocol), scheduler_class: n
20
21
  workers 1
21
22
  threads 1
22
23
  fiber_scheduler scheduler_class
23
- log_level :error
24
+ log_level :warn
24
25
  run app
25
26
  end
26
27
 
data/lib/itsi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itsi
2
- VERSION = '0.1.14'
2
+ VERSION = "0.1.19"
3
3
  end
data/sandbox/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Sandbox
2
+
3
+ This directory contains a sandbox of loose files and dummy projects for testing and experimenting with Itsi.
4
+
5
+ Everything within is potentially subject to change or removal without notice.
@@ -4,8 +4,10 @@ source 'https://rubygems.org'
4
4
 
5
5
  # gem "rails"
6
6
 
7
+ # gem 'debug'
8
+ gem 'grpc'
7
9
  gem 'itsi-scheduler', path: '../../gems/scheduler'
8
10
  gem 'itsi-server', path: '../../gems/server'
9
-
11
+ gem 'rubocop'
12
+ gem 'ruby-lsp'
10
13
  gem 'debug'
11
- gem 'grpc'
@@ -1,19 +1,21 @@
1
1
  PATH
2
2
  remote: ../../gems/scheduler
3
3
  specs:
4
- itsi-scheduler (0.1.11)
4
+ itsi-scheduler (0.1.18)
5
5
  rb_sys (~> 0.9.91)
6
6
 
7
7
  PATH
8
8
  remote: ../../gems/server
9
9
  specs:
10
- itsi-server (0.1.11)
10
+ itsi-server (0.1.18)
11
+ json (~> 2)
11
12
  rack (>= 1.6)
12
13
  rb_sys (~> 0.9.91)
13
14
 
14
15
  GEM
15
16
  remote: https://rubygems.org/
16
17
  specs:
18
+ ast (2.4.3)
17
19
  bigdecimal (3.1.9)
18
20
  date (3.4.1)
19
21
  debug (1.10.0)
@@ -34,26 +36,64 @@ GEM
34
36
  google-protobuf (>= 3.25, < 5.0)
35
37
  googleapis-common-protos-types (~> 1.0)
36
38
  io-console (0.8.0)
37
- irb (1.15.1)
39
+ irb (1.15.2)
38
40
  pp (>= 0.6.0)
39
41
  rdoc (>= 4.0.0)
40
42
  reline (>= 0.4.2)
43
+ json (2.10.2)
44
+ language_server-protocol (3.17.0.4)
45
+ lint_roller (1.1.0)
46
+ logger (1.7.0)
47
+ parallel (1.26.3)
48
+ parser (3.3.7.4)
49
+ ast (~> 2.4.1)
50
+ racc
41
51
  pp (0.6.2)
42
52
  prettyprint
43
53
  prettyprint (0.2.0)
54
+ prism (1.4.0)
44
55
  psych (5.2.3)
45
56
  date
46
57
  stringio
58
+ racc (1.8.1)
47
59
  rack (3.1.12)
60
+ rainbow (3.1.1)
48
61
  rake (13.2.1)
49
62
  rake-compiler-dock (1.9.1)
50
63
  rb_sys (0.9.111)
51
64
  rake-compiler-dock (= 1.9.1)
52
- rdoc (6.12.0)
65
+ rbs (3.9.2)
66
+ logger
67
+ rdoc (6.13.1)
53
68
  psych (>= 4.0.0)
54
- reline (0.6.0)
69
+ regexp_parser (2.10.0)
70
+ reline (0.6.1)
55
71
  io-console (~> 0.5)
56
- stringio (3.1.5)
72
+ rubocop (1.75.1)
73
+ json (~> 2.3)
74
+ language_server-protocol (~> 3.17.0.2)
75
+ lint_roller (~> 1.1.0)
76
+ parallel (~> 1.10)
77
+ parser (>= 3.3.0.2)
78
+ rainbow (>= 2.2.2, < 4.0)
79
+ regexp_parser (>= 2.9.3, < 3.0)
80
+ rubocop-ast (>= 1.43.0, < 2.0)
81
+ ruby-progressbar (~> 1.7)
82
+ unicode-display_width (>= 2.4.0, < 4.0)
83
+ rubocop-ast (1.43.0)
84
+ parser (>= 3.3.7.2)
85
+ prism (~> 1.4)
86
+ ruby-lsp (0.23.13)
87
+ language_server-protocol (~> 3.17.0)
88
+ prism (>= 1.2, < 2.0)
89
+ rbs (>= 3, < 4)
90
+ sorbet-runtime (>= 0.5.10782)
91
+ ruby-progressbar (1.13.0)
92
+ sorbet-runtime (0.5.11971)
93
+ stringio (3.1.6)
94
+ unicode-display_width (3.1.4)
95
+ unicode-emoji (~> 4.0, >= 4.0.4)
96
+ unicode-emoji (4.0.4)
57
97
 
58
98
  PLATFORMS
59
99
  arm64-darwin-23
@@ -64,6 +104,8 @@ DEPENDENCIES
64
104
  grpc
65
105
  itsi-scheduler!
66
106
  itsi-server!
107
+ rubocop
108
+ ruby-lsp
67
109
 
68
110
  BUNDLED WITH
69
111
  2.6.3