From ee505b438afc59b2ed9e365040804b977e7aaf66 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Tue, 13 Jun 2023 12:06:56 +0900 Subject: [PATCH 01/17] change ActiveSupport::Notification event name so it is included in Rails Server-Timings headers --- lib/view_component/instrumentation.rb | 2 +- test/sandbox/test/instrumentation_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/view_component/instrumentation.rb b/lib/view_component/instrumentation.rb index b82eaabf6..7840e6600 100644 --- a/lib/view_component/instrumentation.rb +++ b/lib/view_component/instrumentation.rb @@ -10,7 +10,7 @@ def self.included(mod) def render_in(view_context, &block) ActiveSupport::Notifications.instrument( - "!render.view_component", + "render.view_component", { name: self.class.name, identifier: self.class.identifier diff --git a/test/sandbox/test/instrumentation_test.rb b/test/sandbox/test/instrumentation_test.rb index 7c1b4e71b..65ad22103 100644 --- a/test/sandbox/test/instrumentation_test.rb +++ b/test/sandbox/test/instrumentation_test.rb @@ -5,14 +5,14 @@ class InstrumentationTest < ViewComponent::TestCase def test_instrumentation events = [] - ActiveSupport::Notifications.subscribe("!render.view_component") do |*args| + ActiveSupport::Notifications.subscribe("render.view_component") do |*args| events << ActiveSupport::Notifications::Event.new(*args) end render_inline(InstrumentationComponent.new) assert_selector("div", text: "hello,world!") assert_equal(events.size, 1) - assert_equal(events[0].name, "!render.view_component") + assert_equal("render.view_component", events[0].name) assert_equal(events[0].payload[:name], "InstrumentationComponent") assert_match("app/components/instrumentation_component.rb", events[0].payload[:identifier]) end From fa874f55d42067a21137b08937cf6e769d5823ae Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Tue, 13 Jun 2023 16:36:20 +0900 Subject: [PATCH 02/17] Changelog update for instrumentation --- docs/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 77521fe91..3fcfce5a5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,9 @@ nav_order: 5 ## main +* BREAKING: Allow Instrumentation to be automatically included in Server-Timing headers generated by Rails. If you are currently subscribing to ActiveSupport::Notifications for `!render.view_component` please update your subscriptions to `render.view_component`. + + *Travis Gaff* ## 3.3.0 * Include InlineTemplate by default in Base. **Note:** It's no longer necessary to include `ViewComponent::InlineTemplate` to use inline templates. From 62e02a979ae58251a796ac97277580402bdb26b5 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Tue, 13 Jun 2023 17:09:54 +0900 Subject: [PATCH 03/17] update docs for instrumentation change --- docs/guide/instrumentation.md | 8 +++++--- docs/index.md | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 712164adf..8fda8b552 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -17,12 +17,14 @@ To enable ActiveSupport notifications, use the `instrumentation_enabled` option: config.view_component.instrumentation_enabled = true ``` -Then subscribe to the `!render.view_component` event: +Then subscribe to the `render.view_component` event: ```ruby -ActiveSupport::Notifications.subscribe("!render.view_component") do |*args| +ActiveSupport::Notifications.subscribe("render.view_component") do |*args| event = ActiveSupport::Notifications::Event.new(*args) - event.name # => "!render.view_component" + event.name # => "render.view_component" event.payload # => { name: "MyComponent", identifier: "/Users/mona/project/app/components/my_component.rb" } end ``` + +On Rails 7 in the development environment or when `config.server_timing = true` is set, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 40e3c7a70..26b568441 100644 --- a/docs/index.md +++ b/docs/index.md @@ -195,6 +195,7 @@ ViewComponent is built by over a hundred members of the community, including: tbroad-ramsey tclem tenderlove +tgaff thutterer tonkpils traels From 1468c16427b5d900d5fd8075b4c2f3e2c7690bf8 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Tue, 13 Jun 2023 17:39:09 +0900 Subject: [PATCH 04/17] add trailing whitespace per PR linter --- docs/guide/instrumentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 8fda8b552..77c9f57c7 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -27,4 +27,4 @@ ActiveSupport::Notifications.subscribe("render.view_component") do |*args| end ``` -On Rails 7 in the development environment or when `config.server_timing = true` is set, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. \ No newline at end of file +On Rails 7 in the development environment or when `config.server_timing = true` is set, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. From f2a8a910be055b2b19f937995a4e4a2ac0a6c2c1 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Wed, 28 Jun 2023 16:55:47 +0900 Subject: [PATCH 05/17] Instrumentation key with '!' deprecated and usage can be configured --- lib/view_component/config.rb | 8 ++++++++ lib/view_component/instrumentation.rb | 10 +++++++++- test/sandbox/test/config_test.rb | 1 + test/sandbox/test/instrumentation_test.rb | 23 ++++++++++++++++++----- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/view_component/config.rb b/lib/view_component/config.rb index 9efa61cf2..0d7615d28 100644 --- a/lib/view_component/config.rb +++ b/lib/view_component/config.rb @@ -17,6 +17,7 @@ def defaults preview_route: "/rails/view_components", show_previews_source: false, instrumentation_enabled: false, + instrumentation_use_deprecated_name: true, render_monkey_patch_enabled: true, view_component_path: "app/components", component_parent_class: nil, @@ -99,6 +100,13 @@ def defaults # Whether ActiveSupport notifications are enabled. # Defaults to `false`. + # @!attribute instrumentation_use_deprecated_name + # @return [Boolean] + # Whether ActiveSupport Notifications use the private name "!render.view_component" + # or are made more publicly available via "render.view_component". + # Will default to false in next major version. + # Defaults to `true`. + # @!attribute render_monkey_patch_enabled # @return [Boolean] Whether the #render method should be monkey patched. # If this is disabled, use `#render_component` or diff --git a/lib/view_component/instrumentation.rb b/lib/view_component/instrumentation.rb index 7840e6600..9e877ce65 100644 --- a/lib/view_component/instrumentation.rb +++ b/lib/view_component/instrumentation.rb @@ -10,7 +10,7 @@ def self.included(mod) def render_in(view_context, &block) ActiveSupport::Notifications.instrument( - "render.view_component", + notification_name, { name: self.class.name, identifier: self.class.identifier @@ -19,5 +19,13 @@ def render_in(view_context, &block) super(view_context, &block) end end + + private + + def notification_name + return "!render.view_component" if ViewComponent::Base.config.instrumentation_use_deprecated_name + + "render.view_component" + end end end diff --git a/test/sandbox/test/config_test.rb b/test/sandbox/test/config_test.rb index 62fc9dd5d..771568472 100644 --- a/test/sandbox/test/config_test.rb +++ b/test/sandbox/test/config_test.rb @@ -14,6 +14,7 @@ def test_defaults_are_correct assert_equal @config.preview_route, "/rails/view_components" assert_equal @config.show_previews_source, false assert_equal @config.instrumentation_enabled, false + assert_equal @config.instrumentation_use_deprecated_name, true assert_equal @config.render_monkey_patch_enabled, true assert_equal @config.show_previews, true assert_equal @config.preview_paths, ["#{Rails.root}/test/components/previews"] diff --git a/test/sandbox/test/instrumentation_test.rb b/test/sandbox/test/instrumentation_test.rb index 65ad22103..9fc2d349a 100644 --- a/test/sandbox/test/instrumentation_test.rb +++ b/test/sandbox/test/instrumentation_test.rb @@ -4,16 +4,29 @@ class InstrumentationTest < ViewComponent::TestCase def test_instrumentation + with_config_option(:instrumentation_use_deprecated_name, false) do + events = [] + ActiveSupport::Notifications.subscribe("render.view_component") do |*args| + events << ActiveSupport::Notifications::Event.new(*args) + end + render_inline(InstrumentationComponent.new) + + assert_selector("div", text: "hello,world!") + assert_equal(events.size, 1) + assert_equal("render.view_component", events[0].name) + assert_equal(events[0].payload[:name], "InstrumentationComponent") + assert_match("app/components/instrumentation_component.rb", events[0].payload[:identifier]) + end + end + + def test_instrumentation_with_deprecated_name events = [] - ActiveSupport::Notifications.subscribe("render.view_component") do |*args| + ActiveSupport::Notifications.subscribe("!render.view_component") do |*args| events << ActiveSupport::Notifications::Event.new(*args) end render_inline(InstrumentationComponent.new) - assert_selector("div", text: "hello,world!") assert_equal(events.size, 1) - assert_equal("render.view_component", events[0].name) - assert_equal(events[0].payload[:name], "InstrumentationComponent") - assert_match("app/components/instrumentation_component.rb", events[0].payload[:identifier]) + assert_equal("!render.view_component", events[0].name) end end From 4d9a5c2d544a39883b385bb3b25f060fb2709050 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Thu, 29 Jun 2023 12:22:29 +0900 Subject: [PATCH 06/17] update CHANGELOG to mention new config for instrumentation and deprecation --- docs/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3fcfce5a5..e1acdd11b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,9 +10,10 @@ nav_order: 5 ## main -* BREAKING: Allow Instrumentation to be automatically included in Server-Timing headers generated by Rails. If you are currently subscribing to ActiveSupport::Notifications for `!render.view_component` please update your subscriptions to `render.view_component`. +* Allow instrumentation to be automatically included in Server-Timing headers generated by Rails. To enable this set the config `config.instrumentation_use_deprecated_name = false`. The old key `!render.view_component` is deprecated, please update your ActiveSupport::Notification subscriptions to `render.view_component`. *Travis Gaff* + ## 3.3.0 * Include InlineTemplate by default in Base. **Note:** It's no longer necessary to include `ViewComponent::InlineTemplate` to use inline templates. From 107b61074329f1c74f57709f6780215affe34589 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Thu, 29 Jun 2023 12:36:42 +0900 Subject: [PATCH 07/17] update documentation for instrumentation --- docs/guide/instrumentation.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 77c9f57c7..7cd0a9359 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -15,16 +15,19 @@ To enable ActiveSupport notifications, use the `instrumentation_enabled` option: # config/application.rb # Enable ActiveSupport notifications for all ViewComponents config.view_component.instrumentation_enabled = true +config.view_component.instrumentation_use_deprecated_name = false ``` -Then subscribe to the `render.view_component` event: +Setting `instrumentation_use_deprecated_name` configures the event name used. If `false` the name `"render.view_component"` is used. If `true` (default) it will use the deprecated name `"!render.view_component"`. + +You can then subscribe to the event: ```ruby -ActiveSupport::Notifications.subscribe("render.view_component") do |*args| +ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or !render.view_component event = ActiveSupport::Notifications::Event.new(*args) event.name # => "render.view_component" event.payload # => { name: "MyComponent", identifier: "/Users/mona/project/app/components/my_component.rb" } end ``` -On Rails 7 in the development environment or when `config.server_timing = true` is set, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. +If you're using the non-deprecated key & have `config.server_timing = true` (default in development) set in Rails 7, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. From 875f6bdf6e2f964bbe0bffacf9d2d52e7edf780b Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Thu, 29 Jun 2023 13:50:29 +0900 Subject: [PATCH 08/17] send deprecation notice once, rather than on each render --- lib/view_component/engine.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/view_component/engine.rb b/lib/view_component/engine.rb index 2a06142b7..c08d21020 100644 --- a/lib/view_component/engine.rb +++ b/lib/view_component/engine.rb @@ -2,6 +2,7 @@ require "rails" require "view_component/config" +require "view_component/deprecation" module ViewComponent class Engine < Rails::Engine # :nodoc: @@ -42,6 +43,12 @@ class Engine < Rails::Engine # :nodoc: # :nocov: ViewComponent::Base.prepend(ViewComponent::Instrumentation) # :nocov: + if app.config.view_component.instrumentation_use_deprecated_name + ViewComponent::Deprecation.deprecation_warning( + "!render.view_component", + "Use the new instrumentation key `render.view_component` instead. See https://viewcomponent.org/guide/instrumentation.html" + ) + end end end end From 5ea279ff81d5976d5c0bd7e47a26393129c23135 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Thu, 29 Jun 2023 17:59:57 +0900 Subject: [PATCH 09/17] remove double-spaces --- docs/guide/instrumentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 7cd0a9359..f989e7027 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -18,7 +18,7 @@ config.view_component.instrumentation_enabled = true config.view_component.instrumentation_use_deprecated_name = false ``` -Setting `instrumentation_use_deprecated_name` configures the event name used. If `false` the name `"render.view_component"` is used. If `true` (default) it will use the deprecated name `"!render.view_component"`. +Setting `instrumentation_use_deprecated_name` configures the event name used. If `false` the name `"render.view_component"` is used. If `true` (default) it will use the deprecated name `"!render.view_component"`. You can then subscribe to the event: From 2158ad35d087d519de11f3d44b9b46fc1bc972aa Mon Sep 17 00:00:00 2001 From: Joel Hawksley Date: Mon, 3 Jul 2023 17:13:44 -0600 Subject: [PATCH 10/17] Apply suggestions from code review --- docs/CHANGELOG.md | 2 +- docs/guide/instrumentation.md | 8 ++++---- lib/view_component/config.rb | 4 ++-- lib/view_component/instrumentation.rb | 2 +- test/sandbox/test/config_test.rb | 2 +- test/sandbox/test/instrumentation_test.rb | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e1acdd11b..72598c85b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,7 +10,7 @@ nav_order: 5 ## main -* Allow instrumentation to be automatically included in Server-Timing headers generated by Rails. To enable this set the config `config.instrumentation_use_deprecated_name = false`. The old key `!render.view_component` is deprecated, please update your ActiveSupport::Notification subscriptions to `render.view_component`. +* Allow instrumentation to be automatically included in Server-Timing headers generated by Rails. To enable this set the config `config.use_deprecated_instrumentation_name = false`. The old key `!render.view_component` is deprecated: update ActiveSupport::Notification subscriptions to `render.view_component`. *Travis Gaff* diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index f989e7027..66a50bb5f 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -15,12 +15,12 @@ To enable ActiveSupport notifications, use the `instrumentation_enabled` option: # config/application.rb # Enable ActiveSupport notifications for all ViewComponents config.view_component.instrumentation_enabled = true -config.view_component.instrumentation_use_deprecated_name = false +config.view_component.use_deprecated_instrumentation_name = false ``` -Setting `instrumentation_use_deprecated_name` configures the event name used. If `false` the name `"render.view_component"` is used. If `true` (default) it will use the deprecated name `"!render.view_component"`. +Setting `use_deprecated_instrumentation_name` configures the event name. If `false` the name is `"render.view_component"`. If `true` (default) the deprecated `"!render.view_component"` will be used. -You can then subscribe to the event: +Subscribe to the event: ```ruby ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or !render.view_component @@ -30,4 +30,4 @@ ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or end ``` -If you're using the non-deprecated key & have `config.server_timing = true` (default in development) set in Rails 7, you can see sum total timing information in your browser's developer-tools. Find the request on the Network tab and view it's "timing" sub-tab. On most browsers server results are shown beneath the client-side data. Look for the key `render.view_component`. +When using `render.view_component` with `config.server_timing = true` (default in development) in Rails 7, the Chrome developer tools display the sum total timing information in Network > Timing under the key `render.view_component`. diff --git a/lib/view_component/config.rb b/lib/view_component/config.rb index 0d7615d28..3c7df6fc8 100644 --- a/lib/view_component/config.rb +++ b/lib/view_component/config.rb @@ -17,7 +17,7 @@ def defaults preview_route: "/rails/view_components", show_previews_source: false, instrumentation_enabled: false, - instrumentation_use_deprecated_name: true, + use_deprecated_instrumentation_name: true, render_monkey_patch_enabled: true, view_component_path: "app/components", component_parent_class: nil, @@ -100,7 +100,7 @@ def defaults # Whether ActiveSupport notifications are enabled. # Defaults to `false`. - # @!attribute instrumentation_use_deprecated_name + # @!attribute use_deprecated_instrumentation_name # @return [Boolean] # Whether ActiveSupport Notifications use the private name "!render.view_component" # or are made more publicly available via "render.view_component". diff --git a/lib/view_component/instrumentation.rb b/lib/view_component/instrumentation.rb index 9e877ce65..380dea016 100644 --- a/lib/view_component/instrumentation.rb +++ b/lib/view_component/instrumentation.rb @@ -23,7 +23,7 @@ def render_in(view_context, &block) private def notification_name - return "!render.view_component" if ViewComponent::Base.config.instrumentation_use_deprecated_name + return "!render.view_component" if ViewComponent::Base.config.use_deprecated_instrumentation_name "render.view_component" end diff --git a/test/sandbox/test/config_test.rb b/test/sandbox/test/config_test.rb index 771568472..9c741ed12 100644 --- a/test/sandbox/test/config_test.rb +++ b/test/sandbox/test/config_test.rb @@ -14,7 +14,7 @@ def test_defaults_are_correct assert_equal @config.preview_route, "/rails/view_components" assert_equal @config.show_previews_source, false assert_equal @config.instrumentation_enabled, false - assert_equal @config.instrumentation_use_deprecated_name, true + assert_equal @config.use_deprecated_instrumentation_name, true assert_equal @config.render_monkey_patch_enabled, true assert_equal @config.show_previews, true assert_equal @config.preview_paths, ["#{Rails.root}/test/components/previews"] diff --git a/test/sandbox/test/instrumentation_test.rb b/test/sandbox/test/instrumentation_test.rb index 9fc2d349a..b2d4d0490 100644 --- a/test/sandbox/test/instrumentation_test.rb +++ b/test/sandbox/test/instrumentation_test.rb @@ -4,7 +4,7 @@ class InstrumentationTest < ViewComponent::TestCase def test_instrumentation - with_config_option(:instrumentation_use_deprecated_name, false) do + with_config_option(:use_deprecated_instrumentation_name, false) do events = [] ActiveSupport::Notifications.subscribe("render.view_component") do |*args| events << ActiveSupport::Notifications::Event.new(*args) From 7bce027c54a69f03becad9bcb9bee194abc8a35f Mon Sep 17 00:00:00 2001 From: Joel Hawksley Date: Wed, 5 Jul 2023 07:27:09 -0600 Subject: [PATCH 11/17] Update docs/guide/instrumentation.md --- docs/guide/instrumentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 66a50bb5f..925efe3b5 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -30,4 +30,4 @@ ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or end ``` -When using `render.view_component` with `config.server_timing = true` (default in development) in Rails 7, the Chrome developer tools display the sum total timing information in Network > Timing under the key `render.view_component`. +When using `render.view_component` with `config.server_timing = true` (default in development) in Rails 7, the browser developer tools display the sum total timing information in Network > Timing under the key `render.view_component`. From 9fe8dd3bbdaa16bb1cdbbe6b660f5d793119f894 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Thu, 6 Jul 2023 17:32:46 +0900 Subject: [PATCH 12/17] rename instrumentation config key to match other renames * this has no test coverage :-( --- lib/view_component/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/view_component/engine.rb b/lib/view_component/engine.rb index c08d21020..0d94f8e06 100644 --- a/lib/view_component/engine.rb +++ b/lib/view_component/engine.rb @@ -43,7 +43,7 @@ class Engine < Rails::Engine # :nodoc: # :nocov: ViewComponent::Base.prepend(ViewComponent::Instrumentation) # :nocov: - if app.config.view_component.instrumentation_use_deprecated_name + if app.config.view_component.use_deprecated_instrumentation_name ViewComponent::Deprecation.deprecation_warning( "!render.view_component", "Use the new instrumentation key `render.view_component` instead. See https://viewcomponent.org/guide/instrumentation.html" From 1ad2f0d9d26948e316a64aaae115114aca70e278 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Fri, 7 Jul 2023 11:49:36 +0900 Subject: [PATCH 13/17] nocov initializer code: re-executing it in tests causes order-dependent failures Example: instrumentation notices are doubled --- lib/view_component/engine.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/view_component/engine.rb b/lib/view_component/engine.rb index 0d94f8e06..4490fe343 100644 --- a/lib/view_component/engine.rb +++ b/lib/view_component/engine.rb @@ -40,15 +40,15 @@ class Engine < Rails::Engine # :nodoc: Base.config = app.config.view_component if app.config.view_component.instrumentation_enabled.present? - # :nocov: + # :nocov: Re-executing the below in a test duplicates initializers and causes order-dependent failures. ViewComponent::Base.prepend(ViewComponent::Instrumentation) - # :nocov: if app.config.view_component.use_deprecated_instrumentation_name ViewComponent::Deprecation.deprecation_warning( "!render.view_component", "Use the new instrumentation key `render.view_component` instead. See https://viewcomponent.org/guide/instrumentation.html" ) end + # :nocov: end end end From dd05dc8bb646f801509020fe9215d5ae8a265dad Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Fri, 7 Jul 2023 12:27:35 +0900 Subject: [PATCH 14/17] lint --- lib/view_component/engine.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/view_component/engine.rb b/lib/view_component/engine.rb index 4490fe343..4569678fb 100644 --- a/lib/view_component/engine.rb +++ b/lib/view_component/engine.rb @@ -40,7 +40,7 @@ class Engine < Rails::Engine # :nodoc: Base.config = app.config.view_component if app.config.view_component.instrumentation_enabled.present? - # :nocov: Re-executing the below in a test duplicates initializers and causes order-dependent failures. + # :nocov: Re-executing the below in tests duplicates initializers and causes order-dependent failures. ViewComponent::Base.prepend(ViewComponent::Instrumentation) if app.config.view_component.use_deprecated_instrumentation_name ViewComponent::Deprecation.deprecation_warning( @@ -48,7 +48,7 @@ class Engine < Rails::Engine # :nodoc: "Use the new instrumentation key `render.view_component` instead. See https://viewcomponent.org/guide/instrumentation.html" ) end - # :nocov: + # :nocov: end end end From e4b59938bc85f3ee87c84893016812bd64d1491b Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Fri, 7 Jul 2023 15:03:53 +0900 Subject: [PATCH 15/17] docs: Add browser dev tools image to aid explanation --- docs/guide/instrumentation.md | 4 ++++ ...nstrumentation_sums_in_browser_dev_tools.png | Bin 0 -> 26283 bytes 2 files changed, 4 insertions(+) create mode 100644 docs/images/viewing_instrumentation_sums_in_browser_dev_tools.png diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 925efe3b5..b84b8fd3d 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -30,4 +30,8 @@ ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or end ``` +### Viewing instrumentation sums in the browser developer tools + When using `render.view_component` with `config.server_timing = true` (default in development) in Rails 7, the browser developer tools display the sum total timing information in Network > Timing under the key `render.view_component`. + +![Browser showing the Server Timing data in the browser dev tools](../images/viewing_instrumentation_sums_in_browser_dev_tools.png "Server Timing data in the browser dev tools") \ No newline at end of file diff --git a/docs/images/viewing_instrumentation_sums_in_browser_dev_tools.png b/docs/images/viewing_instrumentation_sums_in_browser_dev_tools.png new file mode 100644 index 0000000000000000000000000000000000000000..e48906b7b851c3e28e1f5681a0568225f64087a2 GIT binary patch literal 26283 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 Lo>V`68To$zj%YR% literal 0 HcmV?d00001 From e570a639b80a44c81481d92c2bb4734466d29b16 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Fri, 7 Jul 2023 15:13:31 +0900 Subject: [PATCH 16/17] docs: code back-ticks to make Vale happier --- docs/api.md | 21 +++++++++++++-------- lib/view_component/config.rb | 6 +++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/api.md b/docs/api.md index f557e2506..fc3c916ef 100644 --- a/docs/api.md +++ b/docs/api.md @@ -244,6 +244,13 @@ The controller used for testing components. Can also be configured on a per-test basis using `#with_controller_class`. Defaults to `ApplicationController`. +### `.use_deprecated_instrumentation_name` + +Whether ActiveSupport Notifications use the private name `"!render.view_component"` +or are made more publicly available via `"render.view_component"`. +Will default to `false` in next major version. +Defaults to `true`. + ### `.view_component_path` The path in which components, their templates, and their sidecars should @@ -342,14 +349,6 @@ with_request_url("/users/42") do end ``` -To use a specific host, pass the host param: - -```ruby -with_request_url("/users/42", host: "app.example.com") do - render_inline(MyComponent.new) -end -``` - ### `#with_variant(variant)` Set the Action Pack request variant for the given block: @@ -362,6 +361,12 @@ end ## Errors +### `AlreadyDefinedPolymorphicSlotSetterError` + +A method called 'SETTER_METHOD_NAME' already exists and would be overwritten by the 'SETTER_NAME' polymorphic slot setter. + +Please choose a different setter name. + ### `ContentAlreadySetForPolymorphicSlotError` Content for slot SLOT_NAME has already been provided. diff --git a/lib/view_component/config.rb b/lib/view_component/config.rb index 3c7df6fc8..ce444dca4 100644 --- a/lib/view_component/config.rb +++ b/lib/view_component/config.rb @@ -102,9 +102,9 @@ def defaults # @!attribute use_deprecated_instrumentation_name # @return [Boolean] - # Whether ActiveSupport Notifications use the private name "!render.view_component" - # or are made more publicly available via "render.view_component". - # Will default to false in next major version. + # Whether ActiveSupport Notifications use the private name `"!render.view_component"` + # or are made more publicly available via `"render.view_component"`. + # Will default to `false` in next major version. # Defaults to `true`. # @!attribute render_monkey_patch_enabled From 22afad045d51177bbf4d15a29d6bea262312ed61 Mon Sep 17 00:00:00 2001 From: Travis Gaff Date: Fri, 7 Jul 2023 15:18:28 +0900 Subject: [PATCH 17/17] md linting --- docs/guide/instrumentation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index b84b8fd3d..a802d9e35 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -30,8 +30,8 @@ ActiveSupport::Notifications.subscribe("render.view_component") do |*args| # or end ``` -### Viewing instrumentation sums in the browser developer tools +## Viewing instrumentation sums in the browser developer tools When using `render.view_component` with `config.server_timing = true` (default in development) in Rails 7, the browser developer tools display the sum total timing information in Network > Timing under the key `render.view_component`. -![Browser showing the Server Timing data in the browser dev tools](../images/viewing_instrumentation_sums_in_browser_dev_tools.png "Server Timing data in the browser dev tools") \ No newline at end of file +![Browser showing the Server Timing data in the browser dev tools](../images/viewing_instrumentation_sums_in_browser_dev_tools.png "Server Timing data in the browser dev tools")