rage-rb 1.19.2 → 1.20.0

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/Appraisals +19 -0
  4. data/CHANGELOG.md +15 -1
  5. data/CODE_OF_CONDUCT.md +13 -17
  6. data/Gemfile +3 -0
  7. data/README.md +60 -63
  8. data/Rakefile +14 -0
  9. data/lib/rage/all.rb +3 -0
  10. data/lib/rage/cable/cable.rb +11 -7
  11. data/lib/rage/cable/channel.rb +6 -1
  12. data/lib/rage/cable/connection.rb +4 -0
  13. data/lib/rage/cable/router.rb +14 -9
  14. data/lib/rage/configuration.rb +235 -21
  15. data/lib/rage/controller/api.rb +49 -44
  16. data/lib/rage/deferred/context.rb +30 -2
  17. data/lib/rage/deferred/deferred.rb +18 -6
  18. data/lib/rage/deferred/metadata.rb +39 -0
  19. data/lib/rage/deferred/middleware_chain.rb +67 -0
  20. data/lib/rage/deferred/task.rb +45 -17
  21. data/lib/rage/events/events.rb +3 -3
  22. data/lib/rage/events/subscriber.rb +36 -25
  23. data/lib/rage/fiber.rb +33 -31
  24. data/lib/rage/fiber_scheduler.rb +6 -2
  25. data/lib/rage/logger/logger.rb +7 -1
  26. data/lib/rage/middleware/body_finalizer.rb +14 -0
  27. data/lib/rage/response.rb +10 -5
  28. data/lib/rage/rspec.rb +17 -17
  29. data/lib/rage/setup.rb +2 -2
  30. data/lib/rage/telemetry/handler.rb +131 -0
  31. data/lib/rage/telemetry/spans/await_fiber.rb +50 -0
  32. data/lib/rage/telemetry/spans/broadcast_cable_stream.rb +50 -0
  33. data/lib/rage/telemetry/spans/create_websocket_connection.rb +50 -0
  34. data/lib/rage/telemetry/spans/dispatch_fiber.rb +48 -0
  35. data/lib/rage/telemetry/spans/enqueue_deferred_task.rb +52 -0
  36. data/lib/rage/telemetry/spans/process_cable_action.rb +56 -0
  37. data/lib/rage/telemetry/spans/process_cable_connection.rb +56 -0
  38. data/lib/rage/telemetry/spans/process_controller_action.rb +56 -0
  39. data/lib/rage/telemetry/spans/process_deferred_task.rb +54 -0
  40. data/lib/rage/telemetry/spans/process_event_subscriber.rb +54 -0
  41. data/lib/rage/telemetry/spans/publish_event.rb +54 -0
  42. data/lib/rage/telemetry/spans/spawn_fiber.rb +50 -0
  43. data/lib/rage/telemetry/telemetry.rb +121 -0
  44. data/lib/rage/telemetry/tracer.rb +97 -0
  45. data/lib/rage/version.rb +1 -1
  46. data/rage.gemspec +4 -3
  47. metadata +38 -5
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rage::Telemetry::Tracer
4
+ DEFAULT_SPAN_RESULT = Rage::Telemetry::SpanResult.new.freeze
5
+ private_constant :DEFAULT_SPAN_RESULT
6
+
7
+ # @param spans_registry [Hash{String => Rage::Telemetry::Spans}]
8
+ # @param handlers_map [Hash{String => Array<Rage::Telemetry::HandlerRef>}]
9
+ def initialize(spans_registry, handlers_map)
10
+ @spans_registry = spans_registry
11
+ @handlers_map = handlers_map
12
+
13
+ @all_handler_refs = handlers_map.values.flatten
14
+
15
+ @spans_registry.each do |_, span|
16
+ setup_noop(span)
17
+ end
18
+ end
19
+
20
+ def setup
21
+ @handlers_map.each do |span_id, handler_refs|
22
+ setup_tracer(@spans_registry[span_id], handler_refs)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ # @param span [Rage::Telemetry::Spans]
29
+ def setup_noop(span)
30
+ parameters = span.span_parameters.join(", ")
31
+
32
+ self.class.class_eval <<~RUBY, __FILE__, __LINE__ + 1
33
+ def #{tracer_name(span.id)}(#{parameters})
34
+ yield
35
+ end
36
+ RUBY
37
+ end
38
+
39
+ # @param span [Rage::Telemetry::Spans]
40
+ # @param handler_refs [Array<Rage::Telemetry::HandlerRef>]
41
+ def setup_tracer(span, handler_refs)
42
+ yield_call = <<~RUBY
43
+ yield_called = true
44
+ yield_result = yield
45
+ span_result = DEFAULT_SPAN_RESULT
46
+ rescue Exception => e
47
+ yield_error = e
48
+ span_result = Rage::Telemetry::SpanResult.new(e).freeze
49
+ RUBY
50
+
51
+ calls_chain = handler_refs.reverse.inject(yield_call) do |memo, handler_ref|
52
+ handler_index = @all_handler_refs.index(handler_ref)
53
+
54
+ handler_method = handler_ref.instance.method(handler_ref.method_name)
55
+ handler_arguments = Rage::Internal.build_arguments(
56
+ handler_method,
57
+ { **span.handler_arguments, id: "\"#{span.id}\".freeze" }
58
+ )
59
+
60
+ <<~RUBY
61
+ @all_handler_refs[#{handler_index}].instance.#{handler_ref.method_name}(#{handler_arguments}) do
62
+ #{memo}
63
+ span_result
64
+ end
65
+ RUBY
66
+ end
67
+
68
+ parameters = span.span_parameters.join(", ")
69
+
70
+ self.class.class_eval <<~RUBY, __FILE__, __LINE__ + 1
71
+ def #{tracer_name(span.id)}(#{parameters})
72
+ span_result = yield_called = yield_result = yield_error = nil
73
+
74
+ begin
75
+ #{calls_chain}
76
+ rescue Exception => e
77
+ Rage.logger.error("Telemetry handler failed with error \#{e}:\\n\#{e.backtrace.join("\\n")}")
78
+ end
79
+
80
+ unless yield_called
81
+ Rage.logger.warn("Telemetry handler didn't call `yield` when processing span '#{span.id}'\\n\#{caller.join("\\n")}")
82
+ yield_result = yield
83
+ end
84
+
85
+ if yield_error
86
+ raise yield_error
87
+ else
88
+ yield_result
89
+ end
90
+ end
91
+ RUBY
92
+ end
93
+
94
+ def tracer_name(span_id)
95
+ "span_#{span_id.gsub(".", "_")}"
96
+ end
97
+ end
data/lib/rage/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rage
4
- VERSION = "1.19.2"
4
+ VERSION = "1.20.0"
5
5
  end
data/rage.gemspec CHANGED
@@ -6,10 +6,10 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "rage-rb"
7
7
  spec.version = Rage::VERSION
8
8
  spec.authors = ["Roman Samoilov"]
9
- spec.email = ["rsamoi@icloud.com"]
9
+ spec.email = ["developers@rage-rb.dev"]
10
10
 
11
11
  spec.summary = "Fast web framework compatible with Rails."
12
- spec.homepage = "https://github.com/rage-rb/rage"
12
+ spec.homepage = "https://rage-rb.dev"
13
13
  spec.license = "MIT"
14
14
  spec.required_ruby_version = ">= 3.2.0"
15
15
 
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
21
  spec.files = Dir.chdir(__dir__) do
22
22
  `git ls-files -z`.split("\x0").reject do |f|
23
- (File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor .rubocop])
23
+ (File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ gemfiles/ test/ spec/ features/ .git .circleci appveyor .rubocop])
24
24
  end
25
25
  end
26
26
  spec.bindir = "exe"
@@ -34,4 +34,5 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "rack-test", "~> 2.1"
35
35
  spec.add_dependency "rake", ">= 12.0"
36
36
  spec.add_dependency "logger"
37
+ spec.add_dependency "irb"
37
38
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rage-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.2
4
+ version: 1.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Samoilov
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-01-06 00:00:00.000000000 Z
10
+ date: 2026-01-20 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: thor
@@ -107,8 +107,22 @@ dependencies:
107
107
  - - ">="
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: irb
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
110
124
  email:
111
- - rsamoi@icloud.com
125
+ - developers@rage-rb.dev
112
126
  executables:
113
127
  - rage
114
128
  extensions: []
@@ -117,6 +131,7 @@ files:
117
131
  - ".rspec"
118
132
  - ".yardopts"
119
133
  - ARCHITECTURE.md
134
+ - Appraisals
120
135
  - CHANGELOG.md
121
136
  - CODE_OF_CONDUCT.md
122
137
  - Gemfile
@@ -146,6 +161,8 @@ files:
146
161
  - lib/rage/deferred/backends/nil.rb
147
162
  - lib/rage/deferred/context.rb
148
163
  - lib/rage/deferred/deferred.rb
164
+ - lib/rage/deferred/metadata.rb
165
+ - lib/rage/deferred/middleware_chain.rb
149
166
  - lib/rage/deferred/proxy.rb
150
167
  - lib/rage/deferred/queue.rb
151
168
  - lib/rage/deferred/task.rb
@@ -163,6 +180,7 @@ files:
163
180
  - lib/rage/logger/json_formatter.rb
164
181
  - lib/rage/logger/logger.rb
165
182
  - lib/rage/logger/text_formatter.rb
183
+ - lib/rage/middleware/body_finalizer.rb
166
184
  - lib/rage/middleware/cors.rb
167
185
  - lib/rage/middleware/fiber_wrapper.rb
168
186
  - lib/rage/middleware/origin_validator.rb
@@ -204,6 +222,21 @@ files:
204
222
  - lib/rage/setup.rb
205
223
  - lib/rage/sidekiq_session.rb
206
224
  - lib/rage/tasks.rb
225
+ - lib/rage/telemetry/handler.rb
226
+ - lib/rage/telemetry/spans/await_fiber.rb
227
+ - lib/rage/telemetry/spans/broadcast_cable_stream.rb
228
+ - lib/rage/telemetry/spans/create_websocket_connection.rb
229
+ - lib/rage/telemetry/spans/dispatch_fiber.rb
230
+ - lib/rage/telemetry/spans/enqueue_deferred_task.rb
231
+ - lib/rage/telemetry/spans/process_cable_action.rb
232
+ - lib/rage/telemetry/spans/process_cable_connection.rb
233
+ - lib/rage/telemetry/spans/process_controller_action.rb
234
+ - lib/rage/telemetry/spans/process_deferred_task.rb
235
+ - lib/rage/telemetry/spans/process_event_subscriber.rb
236
+ - lib/rage/telemetry/spans/publish_event.rb
237
+ - lib/rage/telemetry/spans/spawn_fiber.rb
238
+ - lib/rage/telemetry/telemetry.rb
239
+ - lib/rage/telemetry/tracer.rb
207
240
  - lib/rage/templates/Gemfile
208
241
  - lib/rage/templates/Rakefile
209
242
  - lib/rage/templates/app-controllers-application_controller.rb
@@ -229,11 +262,11 @@ files:
229
262
  - lib/rage/uploaded_file.rb
230
263
  - lib/rage/version.rb
231
264
  - rage.gemspec
232
- homepage: https://github.com/rage-rb/rage
265
+ homepage: https://rage-rb.dev
233
266
  licenses:
234
267
  - MIT
235
268
  metadata:
236
- homepage_uri: https://github.com/rage-rb/rage
269
+ homepage_uri: https://rage-rb.dev
237
270
  source_code_uri: https://github.com/rage-rb/rage
238
271
  rdoc_options: []
239
272
  require_paths: