rage-rb 1.22.1 → 1.24.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/CONTRIBUTING.md +240 -0
  4. data/README.md +2 -1
  5. data/lib/rage/all.rb +1 -0
  6. data/lib/rage/application.rb +1 -0
  7. data/lib/rage/cable/cable.rb +20 -15
  8. data/lib/rage/cable/channel.rb +2 -1
  9. data/lib/rage/configuration.rb +229 -27
  10. data/lib/rage/controller/api.rb +17 -33
  11. data/lib/rage/controller/renderers.rb +47 -0
  12. data/lib/rage/deferred/backends/disk.rb +19 -3
  13. data/lib/rage/deferred/deferred.rb +7 -0
  14. data/lib/rage/deferred/metadata.rb +9 -1
  15. data/lib/rage/deferred/queue.rb +5 -4
  16. data/lib/rage/deferred/scheduler.rb +25 -0
  17. data/lib/rage/deferred/task.rb +90 -9
  18. data/lib/rage/errors.rb +86 -0
  19. data/lib/rage/events/subscriber.rb +6 -1
  20. data/lib/rage/internal.rb +45 -0
  21. data/lib/rage/logger/logger.rb +1 -1
  22. data/lib/rage/middleware/fiber_wrapper.rb +1 -0
  23. data/lib/rage/openapi/builder.rb +1 -1
  24. data/lib/rage/openapi/converter.rb +48 -3
  25. data/lib/rage/openapi/nodes/method.rb +2 -1
  26. data/lib/rage/openapi/nodes/root.rb +2 -1
  27. data/lib/rage/openapi/openapi.rb +12 -1
  28. data/lib/rage/openapi/parser.rb +73 -2
  29. data/lib/rage/openapi/parsers/ext/alba.rb +35 -6
  30. data/lib/rage/openapi/parsers/request.rb +2 -2
  31. data/lib/rage/openapi/parsers/response.rb +2 -2
  32. data/lib/rage/openapi/parsers/yaml.rb +27 -5
  33. data/lib/rage/params_parser.rb +2 -2
  34. data/lib/rage/{cable → pubsub}/adapters/redis.rb +43 -23
  35. data/lib/rage/pubsub/pubsub.rb +25 -0
  36. data/lib/rage/rails.rb +16 -0
  37. data/lib/rage/router/README.md +1 -1
  38. data/lib/rage/router/dsl.rb +72 -10
  39. data/lib/rage/sse/application.rb +31 -2
  40. data/lib/rage/sse/sse.rb +96 -0
  41. data/lib/rage/sse/stream.rb +78 -0
  42. data/lib/rage/telemetry/spans/broadcast_sse_stream.rb +50 -0
  43. data/lib/rage/telemetry/spans/process_sse_stream.rb +1 -0
  44. data/lib/rage/telemetry/telemetry.rb +2 -1
  45. data/lib/rage/telemetry/tracer.rb +1 -0
  46. data/lib/rage/uploaded_file.rb +3 -7
  47. data/lib/rage/version.rb +1 -1
  48. data/lib/rage-rb.rb +8 -1
  49. metadata +9 -4
  50. data/lib/rage/cable/adapters/base.rb +0 -16
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # The **sse.stream.broadcast** span wraps the process of broadcasting a message to an unbounded SSE stream.
5
+ #
6
+ # This span is started when {Rage::SSE.broadcast Rage::SSE.broadcast} is called, and ends when the broadcast operation is complete.
7
+ # See {handle handle} for the list of arguments passed to handler methods.
8
+ #
9
+ # @see Rage::Telemetry::Handler Rage::Telemetry::Handler
10
+ #
11
+ class Rage::Telemetry::Spans::BroadcastSSEStream
12
+ class << self
13
+ # @private
14
+ def id
15
+ "sse.stream.broadcast"
16
+ end
17
+
18
+ # @private
19
+ def span_parameters
20
+ %w[stream:]
21
+ end
22
+
23
+ # @private
24
+ def handler_arguments
25
+ {
26
+ name: '"Rage::SSE.broadcast"',
27
+ stream: "stream"
28
+ }
29
+ end
30
+
31
+ # @!parse [ruby]
32
+ # # @param id ["sse.stream.broadcast"] ID of the span
33
+ # # @param name ["Rage::SSE.broadcast"] human-readable name of the operation
34
+ # # @param stream [Object] the identifier of the stream to which the message is being broadcasted
35
+ # # @yieldreturn [Rage::Telemetry::SpanResult]
36
+ # #
37
+ # # @example
38
+ # # class MyTelemetryHandler < Rage::Telemetry::Handler
39
+ # # handle "sse.stream.broadcast", with: :my_handler
40
+ # #
41
+ # # def my_handler(id:, name:, stream:)
42
+ # # yield
43
+ # # end
44
+ # # end
45
+ # # @note Rage automatically detects which parameters your handler method accepts and only passes those parameters.
46
+ # # You can omit any of the parameters described here.
47
+ # def handle(id:, name:, stream:)
48
+ # end
49
+ end
50
+ end
@@ -6,6 +6,7 @@
6
6
  # This span starts when a connection is opened and ends when the stream is finished.
7
7
  # See {handle handle} for the list of arguments passed to handler methods.
8
8
  #
9
+ # @note This span is not used for unbounded SSE streams created via {Rage::SSE.stream Rage::SSE.stream}.
9
10
  # @see Rage::Telemetry::Handler Rage::Telemetry::Handler
10
11
  #
11
12
  class Rage::Telemetry::Spans::ProcessSSEStream
@@ -70,7 +70,7 @@ module Rage::Telemetry
70
70
  #
71
71
  # | ID | Reference | Description |
72
72
  # | --- | --- |
73
- # | `core.fiber.dispatch` | {DispatchFiber} | Wraps the scheduling and processing of system-level fibers created by the framework to process requests and deferred tasks |
73
+ # | `core.fiber.dispatch` | {DispatchFiber} | Wraps the scheduling and processing of system-level fibers created by the framework to process requests, deferred tasks, or SSE streams |
74
74
  # | `core.fiber.spawn` | {SpawnFiber} | Wraps the scheduling and processing of application-level fibers created via {Fiber.schedule} |
75
75
  # | `core.fiber.await` | {AwaitFiber} | Wraps the processing of the {Fiber.await} calls |
76
76
  # | `controller.action.process` | {ProcessControllerAction} | Wraps the processing of controller actions |
@@ -83,6 +83,7 @@ module Rage::Telemetry
83
83
  # | `events.event.publish` | {PublishEvent} | Wraps the publishing of events via {Rage::Events Rage::Events} |
84
84
  # | `events.subscriber.process` | {ProcessEventSubscriber} | Wraps the processing of events by subscribers |
85
85
  # | `sse.stream.process` | {ProcessSSEStream} | Wraps the processing of an SSE stream |
86
+ # | `sse.stream.broadcast` | {BroadcastSSEStream} | Wraps the process of broadcasting a message to an unbounded SSE stream |
86
87
  #
87
88
  module Spans
88
89
  end
@@ -74,6 +74,7 @@ class Rage::Telemetry::Tracer
74
74
  #{calls_chain}
75
75
  rescue Exception => e
76
76
  Rage.logger.error("Telemetry handler failed with error \#{e}:\\n\#{e.backtrace.join("\\n")}")
77
+ Rage::Errors.report(e)
77
78
  end
78
79
 
79
80
  unless yield_called
@@ -7,6 +7,7 @@
7
7
  # of its interface is available directly for convenience.
8
8
  #
9
9
  # Rage will automatically unlink the files, so there is no need to clean them with a separate maintenance task.
10
+ #
10
11
  class Rage::UploadedFile
11
12
  # The basename of the file in the client.
12
13
  attr_reader :original_filename
@@ -29,14 +30,9 @@ class Rage::UploadedFile
29
30
  @file.read(length, buffer)
30
31
  end
31
32
 
32
- # Shortcut for `file.open`.
33
- def open
34
- @file.open
35
- end
36
-
37
33
  # Shortcut for `file.close`.
38
- def close(unlink_now = false)
39
- @file.close(unlink_now)
34
+ def close
35
+ @file.close
40
36
  end
41
37
 
42
38
  # Shortcut for `file.path`.
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.22.1"
4
+ VERSION = "1.24.0"
5
5
  end
data/lib/rage-rb.rb CHANGED
@@ -40,6 +40,12 @@ module Rage
40
40
  Rage::Events
41
41
  end
42
42
 
43
+ # Shorthand to access {Rage::Errors Rage::Errors}.
44
+ # @return [Rage::Errors]
45
+ def self.errors
46
+ Rage::Errors
47
+ end
48
+
43
49
  # Shorthand to access {Rage::SSE Rage::SSE}.
44
50
  # @return [Rage::SSE]
45
51
  def self.sse
@@ -191,10 +197,11 @@ module Rage
191
197
  autoload :OpenAPI, "rage/openapi/openapi"
192
198
  autoload :Deferred, "rage/deferred/deferred"
193
199
  autoload :Events, "rage/events/events"
194
- autoload :SSE, "rage/sse/sse"
200
+ autoload :PubSub, "rage/pubsub/pubsub"
195
201
  end
196
202
 
197
203
  module RageController
204
+ autoload :Renderers, "rage/controller/renderers"
198
205
  end
199
206
 
200
207
  require_relative "rage/env"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rage-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.22.1
4
+ version: 1.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Samoilov
@@ -134,6 +134,7 @@ files:
134
134
  - Appraisals
135
135
  - CHANGELOG.md
136
136
  - CODE_OF_CONDUCT.md
137
+ - CONTRIBUTING.md
137
138
  - Gemfile
138
139
  - LICENSE.txt
139
140
  - README.md
@@ -143,8 +144,6 @@ files:
143
144
  - lib/rage.rb
144
145
  - lib/rage/all.rb
145
146
  - lib/rage/application.rb
146
- - lib/rage/cable/adapters/base.rb
147
- - lib/rage/cable/adapters/redis.rb
148
147
  - lib/rage/cable/cable.rb
149
148
  - lib/rage/cable/channel.rb
150
149
  - lib/rage/cable/connection.rb
@@ -157,6 +156,7 @@ files:
157
156
  - lib/rage/code_loader.rb
158
157
  - lib/rage/configuration.rb
159
158
  - lib/rage/controller/api.rb
159
+ - lib/rage/controller/renderers.rb
160
160
  - lib/rage/cookies.rb
161
161
  - lib/rage/deferred/backends/disk.rb
162
162
  - lib/rage/deferred/backends/nil.rb
@@ -166,6 +166,7 @@ files:
166
166
  - lib/rage/deferred/middleware_chain.rb
167
167
  - lib/rage/deferred/proxy.rb
168
168
  - lib/rage/deferred/queue.rb
169
+ - lib/rage/deferred/scheduler.rb
169
170
  - lib/rage/deferred/task.rb
170
171
  - lib/rage/env.rb
171
172
  - lib/rage/errors.rb
@@ -203,6 +204,8 @@ files:
203
204
  - lib/rage/openapi/parsers/shared_reference.rb
204
205
  - lib/rage/openapi/parsers/yaml.rb
205
206
  - lib/rage/params_parser.rb
207
+ - lib/rage/pubsub/adapters/redis.rb
208
+ - lib/rage/pubsub/pubsub.rb
206
209
  - lib/rage/rails.rb
207
210
  - lib/rage/request.rb
208
211
  - lib/rage/response.rb
@@ -225,10 +228,12 @@ files:
225
228
  - lib/rage/sse/connection_proxy.rb
226
229
  - lib/rage/sse/message.rb
227
230
  - lib/rage/sse/sse.rb
231
+ - lib/rage/sse/stream.rb
228
232
  - lib/rage/tasks.rb
229
233
  - lib/rage/telemetry/handler.rb
230
234
  - lib/rage/telemetry/spans/await_fiber.rb
231
235
  - lib/rage/telemetry/spans/broadcast_cable_stream.rb
236
+ - lib/rage/telemetry/spans/broadcast_sse_stream.rb
232
237
  - lib/rage/telemetry/spans/create_websocket_connection.rb
233
238
  - lib/rage/telemetry/spans/dispatch_fiber.rb
234
239
  - lib/rage/telemetry/spans/enqueue_deferred_task.rb
@@ -279,7 +284,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
279
284
  requirements:
280
285
  - - ">="
281
286
  - !ruby/object:Gem::Version
282
- version: 3.2.0
287
+ version: 3.3.0
283
288
  required_rubygems_version: !ruby/object:Gem::Requirement
284
289
  requirements:
285
290
  - - ">="
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Rage::Cable::Adapters::Base
4
- def pick_a_worker(&block)
5
- _lock, lock_path = Tempfile.new.yield_self { |file| [file, file.path] }
6
-
7
- Iodine.on_state(:on_start) do
8
- if File.new(lock_path).flock(File::LOCK_EX | File::LOCK_NB)
9
- if Rage.logger.debug?
10
- puts "INFO: #{Process.pid} is managing #{self.class.name.split("::").last} subscriptions."
11
- end
12
- block.call
13
- end
14
- end
15
- end
16
- end