rails_band 0.6.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33531dca2bfc581e2d892bfa6962bb31d41e1fef075917a8cb4427ed6b65c2e5
4
- data.tar.gz: a4f5af5171bf836e9071cddffe9b06654eba3538c58b0bf7c5bbde93587e0686
3
+ metadata.gz: a25f05dedb0e797005029c002702b3f54d08f9be39b2f66fb3ca24de6a256b19
4
+ data.tar.gz: 24648cbe75b62df3f919e9809b40e93f30c985971c9fe8bc38fac6cfe41746fb
5
5
  SHA512:
6
- metadata.gz: fc3c5c8628d6e8a0bb963e257d6eaa1c2cd8278b71f477034d33ea715c2563efe8854b466daa3aa9dadce94da15840ca2f4e65ee49fdfb0a30fa9880d20365ed
7
- data.tar.gz: bc5f016c6b62c01b5081a9bc75a882edbcb51e7be37b65fa24ba17ef570855de37e6fdce6c86a1cccbb8d78aa77b2e5f47e077e086e8f138513fd87230e34a1f
6
+ metadata.gz: f60fd033f93bc2c1716a8e3f950e2b0dc5e38d109f7bcefdff93d4bbf132cb29b4dacfc0b2387eab46f8c9879bc75673938003d9b2401dfb99b11a6c0ef1ffc1
7
+ data.tar.gz: 3fec1674cea01cfa0e1031b7bd7759fde79e9b43367e12484737b1110240e9c9557345827ed4811c974a2bcf3cf285d6d5c78f4c236637132731a489d7cf2352
data/README.md CHANGED
@@ -73,7 +73,8 @@ These are Rails Instrumentation API hooks supported by this gem so far.
73
73
 
74
74
  | Event name | Supported |
75
75
  | --------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
76
- | [`process_middleware.action_dispatch`](https://guides.rubyonrails.org/active_support_instrumentation.html#process-middleware-action-dispatch) | |
76
+ | [`process_middleware.action_dispatch`](https://guides.rubyonrails.org/active_support_instrumentation.html#process-middleware-action-dispatch) ||
77
+ | [`redirect.action_dispatch`](https://edgeguides.rubyonrails.org/active_support_instrumentation.html#redirect-action-dispatch) | ✅ |
77
78
 
78
79
  ### Action View
79
80
 
@@ -82,7 +83,7 @@ These are Rails Instrumentation API hooks supported by this gem so far.
82
83
  | [`render_template.action_view`](https://guides.rubyonrails.org/active_support_instrumentation.html#render-template-action-view) | ✅ |
83
84
  | [`render_partial.action_view`](https://guides.rubyonrails.org/active_support_instrumentation.html#render-partial-action-view) | ✅ |
84
85
  | [`render_collection.action_view`](https://guides.rubyonrails.org/active_support_instrumentation.html#render-collection-action-view) | ✅ |
85
- | [`render_layout.action_view`](https://edgeguides.rubyonrails.org/active_support_instrumentation.html#render-layout-action-view) | |
86
+ | [`render_layout.action_view`](https://edgeguides.rubyonrails.org/active_support_instrumentation.html#render-layout-action-view) ||
86
87
 
87
88
  ### Active Record
88
89
 
@@ -162,7 +163,7 @@ These are Rails Instrumentation API hooks supported by this gem so far.
162
163
 
163
164
  | Event name | Supported |
164
165
  | ----------------------------------------------------------------------------------------------------------- | --------- |
165
- | [`deprecation.rails`](https://guides.rubyonrails.org/active_support_instrumentation.html#deprecation-rails) | |
166
+ | [`deprecation.rails`](https://guides.rubyonrails.org/active_support_instrumentation.html#deprecation-rails) ||
166
167
 
167
168
  ## Contributing
168
169
 
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsBand
4
+ module ActionDispatch
5
+ module Event
6
+ # A wrapper for the event that is passed to `process_middleware.action_dispatch`.
7
+ class ProcessMiddleware < BaseEvent
8
+ def middleware
9
+ @middleware ||= @event.payload.fetch(:middleware)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsBand
4
+ module ActionDispatch
5
+ module Event
6
+ # A wrapper for the event that is passed to `redirect.action_dispatch`.
7
+ class Redirect < BaseEvent
8
+ def status
9
+ @status ||= @event.payload.fetch(:status)
10
+ end
11
+
12
+ def location
13
+ @location ||= @event.payload.fetch(:location)
14
+ end
15
+
16
+ def request
17
+ @request ||= @event.payload.fetch(:request)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_band/action_dispatch/event/process_middleware'
4
+ require 'rails_band/action_dispatch/event/redirect'
5
+
6
+ module RailsBand
7
+ module ActionDispatch
8
+ # The custom LogSubscriber for ActionDispatch.
9
+ class LogSubscriber < ::ActiveSupport::LogSubscriber
10
+ mattr_accessor :consumers
11
+
12
+ def process_middleware(event)
13
+ consumer_of(__method__)&.call(Event::ProcessMiddleware.new(event))
14
+ end
15
+
16
+ def redirect(event)
17
+ consumer_of(__method__)&.call(Event::Redirect.new(event))
18
+ end
19
+
20
+ private
21
+
22
+ def consumer_of(sub_event)
23
+ consumers[:"#{sub_event}.action_dispatch"] || consumers[:action_dispatch] || consumers[:default]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -16,7 +16,7 @@ module RailsBand
16
16
  def layout
17
17
  return @layout if defined? @layout
18
18
 
19
- @layout = @event.payload[:layout]&.yield_self { |layout| from_views(layout) }
19
+ @layout = @event.payload[:layout]&.then { |layout| from_views(layout) }
20
20
  end
21
21
 
22
22
  def count
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_band/action_view/from_views'
4
+
5
+ module RailsBand
6
+ module ActionView
7
+ module Event
8
+ # A wrapper for the event that is passed to `render_layout.action_view`.
9
+ class RenderLayout < BaseEvent
10
+ include FromViews
11
+
12
+ def identifier
13
+ @identifier ||= from_views(@event.payload.fetch(:identifier))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -16,12 +16,18 @@ module RailsBand
16
16
  def layout
17
17
  return @layout if defined? @layout
18
18
 
19
- @layout = @event.payload[:layout]&.yield_self { |layout| from_views(layout) }
19
+ @layout = @event.payload[:layout]&.then { |layout| from_views(layout) }
20
20
  end
21
21
 
22
22
  def cache_hit
23
23
  @cache_hit ||= @event.payload.fetch(:cache_hit)
24
24
  end
25
+
26
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.alpha')
27
+ define_method(:locals) do
28
+ @locals ||= @event.payload[:locals]
29
+ end
30
+ end
25
31
  end
26
32
  end
27
33
  end
@@ -16,7 +16,13 @@ module RailsBand
16
16
  def layout
17
17
  return @layout if defined? @layout
18
18
 
19
- @layout = @event.payload[:layout]&.yield_self { |layout| from_views(layout) }
19
+ @layout = @event.payload[:layout]&.then { |layout| from_views(layout) }
20
+ end
21
+
22
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.alpha')
23
+ define_method(:locals) do
24
+ @locals ||= @event.payload[:locals]
25
+ end
20
26
  end
21
27
  end
22
28
  end
@@ -3,6 +3,7 @@
3
3
  require 'rails_band/action_view/event/render_template'
4
4
  require 'rails_band/action_view/event/render_partial'
5
5
  require 'rails_band/action_view/event/render_collection'
6
+ require 'rails_band/action_view/event/render_layout'
6
7
 
7
8
  module RailsBand
8
9
  module ActionView
@@ -22,6 +23,10 @@ module RailsBand
22
23
  consumer_of(__method__)&.call(Event::RenderCollection.new(event))
23
24
  end
24
25
 
26
+ def render_layout(event)
27
+ consumer_of(__method__)&.call(Event::RenderLayout.new(event))
28
+ end
29
+
25
30
  private
26
31
 
27
32
  def consumer_of(sub_event)
@@ -12,6 +12,14 @@ module RailsBand
12
12
  def job
13
13
  @job ||= @event.payload.fetch(:job)
14
14
  end
15
+
16
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.alpha')
17
+ define_method(:aborted) do
18
+ return @aborted if defined?(@aborted)
19
+
20
+ @aborted = @event.payload[:aborted]
21
+ end
22
+ end
15
23
  end
16
24
  end
17
25
  end
@@ -12,6 +12,14 @@ module RailsBand
12
12
  def job
13
13
  @job ||= @event.payload.fetch(:job)
14
14
  end
15
+
16
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.alpha')
17
+ define_method(:aborted) do
18
+ return @aborted if defined?(@aborted)
19
+
20
+ @aborted = @event.payload[:aborted]
21
+ end
22
+ end
15
23
  end
16
24
  end
17
25
  end
@@ -12,6 +12,18 @@ module RailsBand
12
12
  def job
13
13
  @job ||= @event.payload.fetch(:job)
14
14
  end
15
+
16
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.alpha')
17
+ define_method(:aborted) do
18
+ return @aborted if defined?(@aborted)
19
+
20
+ @aborted = @event.payload[:aborted]
21
+ end
22
+
23
+ define_method(:db_runtime) do
24
+ @db_runtime ||= @event.payload[:db_runtime]
25
+ end
26
+ end
15
27
  end
16
28
  end
17
29
  end
@@ -3,7 +3,7 @@
3
3
  module RailsBand
4
4
  # The base class of each Event class.
5
5
  class BaseEvent
6
- attr_reader :name, :time, :end, :transaction_id, :children,
6
+ attr_reader :name, :time, :end, :transaction_id,
7
7
  :cpu_time, :idle_time, :allocations, :duration
8
8
 
9
9
  # @param event [ActiveSupport::Notifications::Event]
@@ -13,7 +13,6 @@ module RailsBand
13
13
  @time = event.time
14
14
  @end = event.end
15
15
  @transaction_id = event.transaction_id
16
- @children = event.children
17
16
  @cpu_time = event.cpu_time
18
17
  @idle_time = event.idle_time
19
18
  @allocations = event.allocations
@@ -22,7 +21,7 @@ module RailsBand
22
21
 
23
22
  def to_h
24
23
  @to_h ||= {
25
- name: @name, time: @time, end: @end, transaction_id: @transaction_id, children: @children,
24
+ name: @name, time: @time, end: @end, transaction_id: @transaction_id,
26
25
  cpu_time: @cpu_time, idle_time: @idle_time, allocations: @allocations, duration: @duration
27
26
  }.merge!(
28
27
  public_methods(false).reject { |meth| non_hash_keys.include?(meth) }.each_with_object({}) do |meth, h|
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsBand
4
+ # DeprecationSubscriber is responsible for logging deprecation warnings.
5
+ class DeprecationSubscriber < ::ActiveSupport::LogSubscriber
6
+ # DeprecationEvent is a wrapper around a deprecation notification event.
7
+ class DeprecationEvent < BaseEvent
8
+ def message
9
+ @message ||= @event.payload.fetch(:message)
10
+ end
11
+
12
+ def callstack
13
+ @callstack ||= @event.payload.fetch(:callstack)
14
+ end
15
+
16
+ def gem_name
17
+ @gem_name ||= @event.payload.fetch(:gem_name)
18
+ end
19
+
20
+ def deprecation_horizon
21
+ @deprecation_horizon ||= @event.payload.fetch(:deprecation_horizon)
22
+ end
23
+ end
24
+
25
+ mattr_accessor :consumers
26
+
27
+ def deprecation(event)
28
+ consumer&.call(DeprecationEvent.new(event))
29
+ end
30
+
31
+ private
32
+
33
+ def consumer
34
+ # HACK: ActiveSupport::Subscriber has the instance variable @namespace, but it's not documented.
35
+ # This hack might possibly break in the future.
36
+ namespace = self.class.instance_variable_get(:@namespace)
37
+ consumers[:"deprecation.#{namespace}"] || consumers[:deprecation] || consumers[:default]
38
+ end
39
+ end
40
+ end
@@ -8,6 +8,14 @@ module RailsBand
8
8
  class Railtie < ::Rails::Railtie
9
9
  config.rails_band = Configuration.new
10
10
 
11
+ config.before_initialize do
12
+ # NOTE: `ActionDispatch::MiddlewareStack::InstrumentationProxy` will be called
13
+ # only when `ActionDispatch::MiddlewareStack#build` detects `process_middleware.action_dispatch`
14
+ # is listened to. So, `attach_to` must be called before Rack middlewares will be loaded.
15
+ ::ActionDispatch::LogSubscriber.detach_from :action_dispatch if defined?(::ActionDispatch::LogSubscriber)
16
+ RailsBand::ActionDispatch::LogSubscriber.attach_to :action_dispatch
17
+ end
18
+
11
19
  config.after_initialize do |app|
12
20
  consumers = app.config.rails_band.consumers
13
21
 
@@ -40,9 +48,14 @@ module RailsBand
40
48
  RailsBand::ActiveStorage::LogSubscriber.attach_to :active_storage
41
49
  end
42
50
 
51
+ RailsBand::ActionDispatch::LogSubscriber.consumers = consumers
52
+
43
53
  RailsBand::ActiveSupport::LogSubscriber.consumers = consumers
44
54
  RailsBand::ActiveSupport::LogSubscriber.attach_to :active_support
45
55
 
56
+ RailsBand::DeprecationSubscriber.consumers = consumers
57
+ RailsBand::DeprecationSubscriber.attach_to :rails
58
+
46
59
  if defined?(::ActiveJob)
47
60
  require 'active_job/logging'
48
61
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsBand
4
- VERSION = '0.6.1'
4
+ VERSION = '0.8.0'
5
5
  end
data/lib/rails_band.rb CHANGED
@@ -3,39 +3,53 @@
3
3
  require 'rails_band/version'
4
4
  require 'rails_band/configuration'
5
5
  require 'rails_band/base_event'
6
+ require 'rails_band/deprecation_subscriber'
6
7
  require 'rails_band/railtie'
7
8
 
8
9
  # Rails::Band unsubscribes all default LogSubscribers from Rails Instrumentation API,
9
10
  # and it subscribes our own custom LogSubscribers to make it easy to access Rails Instrumentation API.
10
11
  module RailsBand
12
+ # RailsBand::ActionController is responsible for subscribing notifications from ActionController.
11
13
  module ActionController
12
14
  autoload :LogSubscriber, 'rails_band/action_controller/log_subscriber'
13
15
  end
14
16
 
17
+ # RailsBand::ActionView is responsible for subscribing notifications from ActionView.
15
18
  module ActionView
16
19
  autoload :LogSubscriber, 'rails_band/action_view/log_subscriber'
17
20
  end
18
21
 
22
+ # RailsBand::ActiveRecord is responsible for subscribing notifications from ActiveRecord.
19
23
  module ActiveRecord
20
24
  autoload :LogSubscriber, 'rails_band/active_record/log_subscriber'
21
25
  end
22
26
 
27
+ # RailsBand::ActionMailer is responsible for subscribing notifications from ActionMailer.
23
28
  module ActionMailer
24
29
  autoload :LogSubscriber, 'rails_band/action_mailer/log_subscriber'
25
30
  end
26
31
 
32
+ # RailsBand::ActionDispatch is responsible for subscribing notifications from ActionDispatch.
33
+ module ActionDispatch
34
+ autoload :LogSubscriber, 'rails_band/action_dispatch/log_subscriber'
35
+ end
36
+
37
+ # RailsBand::ActiveSupport is responsible for subscribing notifications from ActiveSupport.
27
38
  module ActiveSupport
28
39
  autoload :LogSubscriber, 'rails_band/active_support/log_subscriber'
29
40
  end
30
41
 
42
+ # RailsBand::ActiveJob is responsible for subscribing notifications from ActiveJob.
31
43
  module ActiveJob
32
44
  autoload :LogSubscriber, 'rails_band/active_job/log_subscriber'
33
45
  end
34
46
 
47
+ # RailsBand::ActionCable is responsible for subscribing notifications from ActionCable.
35
48
  module ActionCable
36
49
  autoload :LogSubscriber, 'rails_band/action_cable/log_subscriber'
37
50
  end
38
51
 
52
+ # RailsBand::ActiveStorage is responsible for subscribing notifications from ActiveStorage.
39
53
  module ActiveStorage
40
54
  autoload :LogSubscriber, 'rails_band/active_storage/log_subscriber'
41
55
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_band
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yutaka Kamei
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-01 00:00:00.000000000 Z
11
+ date: 2023-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -59,10 +59,14 @@ files:
59
59
  - lib/rails_band/action_controller/event/unpermitted_parameters.rb
60
60
  - lib/rails_band/action_controller/event/write_fragment.rb
61
61
  - lib/rails_band/action_controller/log_subscriber.rb
62
+ - lib/rails_band/action_dispatch/event/process_middleware.rb
63
+ - lib/rails_band/action_dispatch/event/redirect.rb
64
+ - lib/rails_band/action_dispatch/log_subscriber.rb
62
65
  - lib/rails_band/action_mailer/event/deliver.rb
63
66
  - lib/rails_band/action_mailer/event/process.rb
64
67
  - lib/rails_band/action_mailer/log_subscriber.rb
65
68
  - lib/rails_band/action_view/event/render_collection.rb
69
+ - lib/rails_band/action_view/event/render_layout.rb
66
70
  - lib/rails_band/action_view/event/render_partial.rb
67
71
  - lib/rails_band/action_view/event/render_template.rb
68
72
  - lib/rails_band/action_view/from_views.rb
@@ -104,6 +108,7 @@ files:
104
108
  - lib/rails_band/active_support/log_subscriber.rb
105
109
  - lib/rails_band/base_event.rb
106
110
  - lib/rails_band/configuration.rb
111
+ - lib/rails_band/deprecation_subscriber.rb
107
112
  - lib/rails_band/railtie.rb
108
113
  - lib/rails_band/version.rb
109
114
  homepage: https://github.com/yykamei/rails_band
@@ -129,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
134
  - !ruby/object:Gem::Version
130
135
  version: '0'
131
136
  requirements: []
132
- rubygems_version: 3.3.7
137
+ rubygems_version: 3.4.1
133
138
  signing_key:
134
139
  specification_version: 4
135
140
  summary: Easy-to-use Rails Instrumentation API