view_component 2.62.0 → 2.82.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.
Potentially problematic release.
This version of view_component might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/app/assets/vendor/prism.css +3 -195
- data/app/assets/vendor/prism.min.js +11 -11
- data/app/controllers/concerns/view_component/preview_actions.rb +6 -10
- data/app/controllers/view_components_system_test_controller.rb +7 -0
- data/app/helpers/preview_helper.rb +2 -2
- data/app/views/view_components/preview.html.erb +2 -2
- data/docs/CHANGELOG.md +383 -21
- data/lib/rails/generators/abstract_generator.rb +3 -5
- data/lib/rails/generators/component/component_generator.rb +5 -4
- data/lib/rails/generators/locale/component_generator.rb +1 -1
- data/lib/rails/generators/preview/component_generator.rb +10 -3
- data/lib/view_component/base.rb +41 -47
- data/lib/view_component/compiler.rb +57 -68
- data/lib/view_component/config.rb +176 -0
- data/lib/view_component/content_areas.rb +2 -3
- data/lib/view_component/deprecation.rb +2 -2
- data/lib/view_component/docs_builder_component.html.erb +1 -1
- data/lib/view_component/docs_builder_component.rb +1 -1
- data/lib/view_component/engine.rb +23 -29
- data/lib/view_component/polymorphic_slots.rb +11 -5
- data/lib/view_component/render_component_helper.rb +1 -0
- data/lib/view_component/slotable.rb +2 -3
- data/lib/view_component/slotable_v2.rb +48 -8
- data/lib/view_component/system_test_case.rb +13 -0
- data/lib/view_component/system_test_helpers.rb +27 -0
- data/lib/view_component/test_helpers.rb +65 -15
- data/lib/view_component/translatable.rb +1 -1
- data/lib/view_component/version.rb +1 -1
- data/lib/view_component.rb +6 -3
- metadata +50 -18
- data/lib/view_component/previewable.rb +0 -62
- data/lib/view_component/render_preview_helper.rb +0 -50
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rails"
|
4
|
+
require "view_component/base"
|
4
5
|
|
5
6
|
module ViewComponent
|
6
7
|
class Engine < Rails::Engine # :nodoc:
|
7
|
-
config.view_component =
|
8
|
-
config.view_component.preview_paths ||= []
|
8
|
+
config.view_component = ViewComponent::Base.config
|
9
9
|
|
10
10
|
rake_tasks do
|
11
11
|
load "view_component/rails/tasks/view_component.rake"
|
@@ -14,25 +14,19 @@ module ViewComponent
|
|
14
14
|
initializer "view_component.set_configs" do |app|
|
15
15
|
options = app.config.view_component
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
%i[generate preview_controller preview_route show_previews_source].each do |config_option|
|
18
|
+
options[config_option] ||= ViewComponent::Base.public_send(config_option)
|
19
|
+
end
|
20
20
|
options.instrumentation_enabled = false if options.instrumentation_enabled.nil?
|
21
|
-
options.
|
22
|
-
options.
|
21
|
+
options.render_monkey_patch_enabled = true if options.render_monkey_patch_enabled.nil?
|
22
|
+
options.show_previews = (Rails.env.development? || Rails.env.test?) if options.show_previews.nil?
|
23
23
|
|
24
24
|
if options.show_previews
|
25
|
+
# This is still necessary because when `config.view_component` is declared, `Rails.root` is unspecified.
|
25
26
|
options.preview_paths << "#{Rails.root}/test/components/previews" if defined?(Rails.root) && Dir.exist?(
|
26
27
|
"#{Rails.root}/test/components/previews"
|
27
28
|
)
|
28
29
|
|
29
|
-
if options.preview_path.present?
|
30
|
-
ViewComponent::Deprecation.warn(
|
31
|
-
"`preview_path` will be removed in v3.0.0. Use `preview_paths` instead."
|
32
|
-
)
|
33
|
-
options.preview_paths << options.preview_path
|
34
|
-
end
|
35
|
-
|
36
30
|
if options.show_previews_source
|
37
31
|
require "method_source"
|
38
32
|
|
@@ -41,10 +35,6 @@ module ViewComponent
|
|
41
35
|
end
|
42
36
|
end
|
43
37
|
end
|
44
|
-
|
45
|
-
ActiveSupport.on_load(:view_component) do
|
46
|
-
options.each { |k, v| send("#{k}=", v) if respond_to?("#{k}=") }
|
47
|
-
end
|
48
38
|
end
|
49
39
|
|
50
40
|
initializer "view_component.enable_instrumentation" do |app|
|
@@ -72,12 +62,6 @@ module ViewComponent
|
|
72
62
|
end
|
73
63
|
end
|
74
64
|
|
75
|
-
initializer "view_component.compile_config_methods" do
|
76
|
-
ActiveSupport.on_load(:view_component) do
|
77
|
-
config.compile_methods! if config.respond_to?(:compile_methods!)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
65
|
initializer "view_component.monkey_patch_render" do |app|
|
82
66
|
next if Rails.version.to_f >= 6.1 || !app.config.view_component.render_monkey_patch_enabled
|
83
67
|
|
@@ -94,7 +78,7 @@ module ViewComponent
|
|
94
78
|
end
|
95
79
|
end
|
96
80
|
|
97
|
-
initializer "view_component.include_render_component" do |
|
81
|
+
initializer "view_component.include_render_component" do |_app|
|
98
82
|
next if Rails.version.to_f >= 6.1
|
99
83
|
|
100
84
|
ActiveSupport.on_load(:action_view) do
|
@@ -116,7 +100,7 @@ module ViewComponent
|
|
116
100
|
end
|
117
101
|
end
|
118
102
|
|
119
|
-
initializer "compiler mode" do |
|
103
|
+
initializer "compiler mode" do |_app|
|
120
104
|
ViewComponent::Compiler.mode = if Rails.env.development? || Rails.env.test?
|
121
105
|
ViewComponent::Compiler::DEVELOPMENT_MODE
|
122
106
|
else
|
@@ -147,6 +131,12 @@ module ViewComponent
|
|
147
131
|
end
|
148
132
|
end
|
149
133
|
|
134
|
+
if Rails.env.test?
|
135
|
+
app.routes.prepend do
|
136
|
+
get("_system_test_entrypoint", to: "view_components_system_test#system_test_entrypoint")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
150
140
|
app.executor.to_run :before do
|
151
141
|
CompileCache.invalidate! unless ActionView::Base.cache_template_loading
|
152
142
|
end
|
@@ -154,13 +144,17 @@ module ViewComponent
|
|
154
144
|
end
|
155
145
|
end
|
156
146
|
|
147
|
+
if RUBY_VERSION < "2.7.0"
|
148
|
+
ViewComponent::Deprecation.deprecation_warning("Support for Ruby versions < 2.7.0")
|
149
|
+
end
|
150
|
+
|
157
151
|
# :nocov:
|
158
152
|
unless defined?(ViewComponent::Base)
|
159
153
|
require "view_component/deprecation"
|
160
154
|
|
161
|
-
ViewComponent::Deprecation.
|
162
|
-
"
|
163
|
-
"
|
155
|
+
ViewComponent::Deprecation.deprecation_warning(
|
156
|
+
"Manually loading the engine",
|
157
|
+
"remove `require \"view_component/engine\"`"
|
164
158
|
)
|
165
159
|
|
166
160
|
require "view_component"
|
@@ -42,6 +42,10 @@ module ViewComponent
|
|
42
42
|
define_method(getter_name) do
|
43
43
|
get_slot(slot_name)
|
44
44
|
end
|
45
|
+
|
46
|
+
define_method("#{getter_name}?") do
|
47
|
+
get_slot(slot_name).present?
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
renderable_hash = types.each_with_object({}) do |(poly_type, poly_callable), memo|
|
@@ -57,10 +61,12 @@ module ViewComponent
|
|
57
61
|
end
|
58
62
|
|
59
63
|
define_method(setter_name) do |*args, &block|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
+
if _warn_on_deprecated_slot_setter
|
65
|
+
ViewComponent::Deprecation.deprecation_warning(
|
66
|
+
"Using polymorphic slot setters like `#{setter_name}`",
|
67
|
+
:"`with_#{setter_name}`"
|
68
|
+
)
|
69
|
+
end
|
64
70
|
|
65
71
|
set_polymorphic_slot(slot_name, poly_type, *args, &block)
|
66
72
|
end
|
@@ -83,7 +89,7 @@ module ViewComponent
|
|
83
89
|
def set_polymorphic_slot(slot_name, poly_type = nil, *args, &block)
|
84
90
|
slot_definition = self.class.registered_slots[slot_name]
|
85
91
|
|
86
|
-
if !slot_definition[:collection] &&
|
92
|
+
if !slot_definition[:collection] && (defined?(@__vc_set_slots) && @__vc_set_slots[slot_name])
|
87
93
|
raise ArgumentError, "content for slot '#{slot_name}' has already been provided"
|
88
94
|
end
|
89
95
|
|
@@ -23,9 +23,8 @@ module ViewComponent
|
|
23
23
|
# class_name: "Header" # class name string, used to instantiate Slot
|
24
24
|
# )
|
25
25
|
def with_slot(*slot_names, collection: false, class_name: nil)
|
26
|
-
ViewComponent::Deprecation.
|
27
|
-
"`with_slot`
|
28
|
-
"Use the new slots API (https://viewcomponent.org/guide/slots.html) instead."
|
26
|
+
ViewComponent::Deprecation.deprecation_warning(
|
27
|
+
"`with_slot`", "use the new slots API (https://viewcomponent.org/guide/slots.html) instead"
|
29
28
|
)
|
30
29
|
|
31
30
|
slot_names.each do |slot_name|
|
@@ -17,9 +17,19 @@ module ViewComponent
|
|
17
17
|
# Hash of registered Slots
|
18
18
|
class_attribute :registered_slots
|
19
19
|
self.registered_slots = {}
|
20
|
+
|
21
|
+
class_attribute :_warn_on_deprecated_slot_setter
|
22
|
+
self._warn_on_deprecated_slot_setter = false
|
20
23
|
end
|
21
24
|
|
22
25
|
class_methods do
|
26
|
+
##
|
27
|
+
# Enables deprecations coming to the Slots API in ViewComponent v3
|
28
|
+
#
|
29
|
+
def warn_on_deprecated_slot_setter
|
30
|
+
self._warn_on_deprecated_slot_setter = true
|
31
|
+
end
|
32
|
+
|
23
33
|
##
|
24
34
|
# Registers a sub-component
|
25
35
|
#
|
@@ -70,6 +80,7 @@ module ViewComponent
|
|
70
80
|
# <% end %>
|
71
81
|
def renders_one(slot_name, callable = nil)
|
72
82
|
validate_singular_slot_name(slot_name)
|
83
|
+
validate_plural_slot_name(ActiveSupport::Inflector.pluralize(slot_name).to_sym)
|
73
84
|
|
74
85
|
define_method :"with_#{slot_name}" do |*args, &block|
|
75
86
|
set_slot(slot_name, nil, *args, &block)
|
@@ -80,7 +91,16 @@ module ViewComponent
|
|
80
91
|
if args.empty? && block.nil?
|
81
92
|
get_slot(slot_name)
|
82
93
|
else
|
83
|
-
|
94
|
+
if _warn_on_deprecated_slot_setter
|
95
|
+
stack = caller_locations(3)
|
96
|
+
|
97
|
+
ViewComponent::Deprecation.deprecation_warning(
|
98
|
+
"Setting a slot with `##{slot_name}`",
|
99
|
+
"use `#with_#{slot_name}` to set the slot instead",
|
100
|
+
stack
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
84
104
|
set_slot(slot_name, nil, *args, &block)
|
85
105
|
end
|
86
106
|
end
|
@@ -98,11 +118,11 @@ module ViewComponent
|
|
98
118
|
#
|
99
119
|
# = Example
|
100
120
|
#
|
101
|
-
#
|
121
|
+
# renders_many :items, -> (name:) { ItemComponent.new(name: name }
|
102
122
|
#
|
103
123
|
# # OR
|
104
124
|
#
|
105
|
-
#
|
125
|
+
# renders_many :items, ItemComponent
|
106
126
|
#
|
107
127
|
# = Rendering sub-components
|
108
128
|
#
|
@@ -131,16 +151,22 @@ module ViewComponent
|
|
131
151
|
# <% end %>
|
132
152
|
# <% end %>
|
133
153
|
def renders_many(slot_name, callable = nil)
|
134
|
-
validate_plural_slot_name(slot_name)
|
135
|
-
|
136
154
|
singular_name = ActiveSupport::Inflector.singularize(slot_name)
|
155
|
+
validate_plural_slot_name(slot_name)
|
156
|
+
validate_singular_slot_name(ActiveSupport::Inflector.singularize(slot_name).to_sym)
|
137
157
|
|
138
158
|
# Define setter for singular names
|
139
159
|
# for example `renders_many :items` allows fetching all tabs with
|
140
160
|
# `component.tabs` and setting a tab with `component.tab`
|
141
|
-
|
142
|
-
# Deprecated: Will remove in 3.0
|
161
|
+
|
143
162
|
define_method singular_name do |*args, &block|
|
163
|
+
if _warn_on_deprecated_slot_setter
|
164
|
+
ViewComponent::Deprecation.deprecation_warning(
|
165
|
+
"Setting a slot with `##{singular_name}`",
|
166
|
+
"use `#with_#{singular_name}` to set the slot instead"
|
167
|
+
)
|
168
|
+
end
|
169
|
+
|
144
170
|
set_slot(slot_name, nil, *args, &block)
|
145
171
|
end
|
146
172
|
ruby2_keywords(singular_name.to_sym) if respond_to?(:ruby2_keywords, true)
|
@@ -162,7 +188,13 @@ module ViewComponent
|
|
162
188
|
if collection_args.nil? && block.nil?
|
163
189
|
get_slot(slot_name)
|
164
190
|
else
|
165
|
-
|
191
|
+
if _warn_on_deprecated_slot_setter
|
192
|
+
ViewComponent::Deprecation.deprecation_warning(
|
193
|
+
"Setting a slot with `##{slot_name}`",
|
194
|
+
"use `#with_#{slot_name}` to set the slot instead"
|
195
|
+
)
|
196
|
+
end
|
197
|
+
|
166
198
|
collection_args.map do |args|
|
167
199
|
set_slot(slot_name, nil, **args, &block)
|
168
200
|
end
|
@@ -242,6 +274,14 @@ module ViewComponent
|
|
242
274
|
end
|
243
275
|
|
244
276
|
def validate_singular_slot_name(slot_name)
|
277
|
+
if slot_name.to_sym == :content
|
278
|
+
raise ArgumentError.new(
|
279
|
+
"#{self} declares a slot named content, which is a reserved word in ViewComponent.\n\n" \
|
280
|
+
"Content passed to a ViewComponent as a block is captured and assigned to the `content` accessor without having to create an explicit slot.\n\n" \
|
281
|
+
"To fix this issue, either use the `content` accessor directly or choose a different slot name."
|
282
|
+
)
|
283
|
+
end
|
284
|
+
|
245
285
|
if RESERVED_NAMES[:singular].include?(slot_name.to_sym)
|
246
286
|
raise ArgumentError.new(
|
247
287
|
"#{self} declares a slot named #{slot_name}, which is a reserved word in the ViewComponent framework.\n\n" \
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewComponent
|
4
|
+
module SystemTestHelpers
|
5
|
+
include TestHelpers
|
6
|
+
|
7
|
+
#
|
8
|
+
# Returns a block that can be used to visit the path of the inline rendered component.
|
9
|
+
# @param fragment [Nokogiri::Fragment] The fragment returned from `render_inline`.
|
10
|
+
# @param layout [String] The (optional) layout to use.
|
11
|
+
# @return [Proc] A block that can be used to visit the path of the inline rendered component.
|
12
|
+
def with_rendered_component_path(fragment, layout: false, &block)
|
13
|
+
# Add './tmp/view_components/' directory if it doesn't exist to store the rendered component HTML
|
14
|
+
FileUtils.mkdir_p("./tmp/view_components/") unless Dir.exist?("./tmp/view_components/")
|
15
|
+
|
16
|
+
file = Tempfile.new(["rendered_#{fragment.class.name}", ".html"], "tmp/view_components/")
|
17
|
+
begin
|
18
|
+
file.write(controller.render_to_string(html: fragment.to_html.html_safe, layout: layout))
|
19
|
+
file.rewind
|
20
|
+
|
21
|
+
block.call("/_system_test_entrypoint?file=#{file.path.split("/").last}")
|
22
|
+
ensure
|
23
|
+
file.unlink
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "view_component/render_preview_helper"
|
4
|
-
|
5
3
|
module ViewComponent
|
6
4
|
module TestHelpers
|
7
5
|
begin
|
@@ -37,10 +35,7 @@ module ViewComponent
|
|
37
35
|
#
|
38
36
|
# @return [String]
|
39
37
|
def rendered_component
|
40
|
-
ViewComponent::Deprecation.
|
41
|
-
"`rendered_component` is deprecated and will be removed in v3.0.0. " \
|
42
|
-
"Use `page` instead."
|
43
|
-
)
|
38
|
+
ViewComponent::Deprecation.deprecation_warning("`rendered_component`", :"`page`")
|
44
39
|
|
45
40
|
rendered_content
|
46
41
|
end
|
@@ -67,21 +62,60 @@ module ViewComponent
|
|
67
62
|
Nokogiri::HTML.fragment(@rendered_content)
|
68
63
|
end
|
69
64
|
|
70
|
-
#
|
71
|
-
#
|
65
|
+
# Render a preview inline. Internally sets `page` to be a `Capybara::Node::Simple`,
|
66
|
+
# allowing for Capybara assertions to be used:
|
67
|
+
#
|
68
|
+
# ```ruby
|
69
|
+
# render_preview(:default)
|
70
|
+
# assert_text("Hello, World!")
|
71
|
+
# ```
|
72
|
+
#
|
73
|
+
# Note: `#rendered_preview` expects a preview to be defined with the same class
|
74
|
+
# name as the calling test, but with `Test` replaced with `Preview`:
|
75
|
+
#
|
76
|
+
# MyComponentTest -> MyComponentPreview etc.
|
77
|
+
#
|
78
|
+
# In RSpec, `Preview` is appended to `described_class`.
|
79
|
+
#
|
80
|
+
# @param name [String] The name of the preview to be rendered.
|
81
|
+
# @param from [ViewComponent::Preview] The class of the preview to be rendered.
|
82
|
+
# @param params [Hash] Parameters to be passed to the preview.
|
83
|
+
# @return [Nokogiri::HTML]
|
84
|
+
def render_preview(name, from: preview_class, params: {})
|
85
|
+
previews_controller = build_controller(Rails.application.config.view_component.preview_controller.constantize)
|
86
|
+
|
87
|
+
# From what I can tell, it's not possible to overwrite all request parameters
|
88
|
+
# at once, so we set them individually here.
|
89
|
+
params.each do |k, v|
|
90
|
+
previews_controller.request.params[k] = v
|
91
|
+
end
|
92
|
+
|
93
|
+
previews_controller.request.params[:path] = "#{from.preview_name}/#{name}"
|
94
|
+
previews_controller.set_response!(ActionDispatch::Response.new)
|
95
|
+
result = previews_controller.previews
|
96
|
+
|
97
|
+
@rendered_content = result
|
98
|
+
|
99
|
+
Nokogiri::HTML.fragment(@rendered_content)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Execute the given block in the view context (using `instance_exec`).
|
103
|
+
# Internally sets `page` to be a `Capybara::Node::Simple`, allowing for
|
104
|
+
# Capybara assertions to be used. All arguments are forwarded to the block.
|
72
105
|
#
|
73
106
|
# ```ruby
|
74
|
-
# render_in_view_context do
|
75
|
-
# render(MyComponent.new)
|
107
|
+
# render_in_view_context(arg1, arg2:) do |arg1, arg2:|
|
108
|
+
# render(MyComponent.new(arg1, arg2))
|
76
109
|
# end
|
77
110
|
#
|
78
111
|
# assert_text("Hello, World!")
|
79
112
|
# ```
|
80
|
-
def render_in_view_context(&block)
|
113
|
+
def render_in_view_context(*args, &block)
|
81
114
|
@page = nil
|
82
|
-
@rendered_content = controller.view_context.instance_exec(&block)
|
115
|
+
@rendered_content = controller.view_context.instance_exec(*args, &block)
|
83
116
|
Nokogiri::HTML.fragment(@rendered_content)
|
84
117
|
end
|
118
|
+
ruby2_keywords(:render_in_view_context) if respond_to?(:ruby2_keywords, true)
|
85
119
|
|
86
120
|
# @private
|
87
121
|
def controller
|
@@ -151,10 +185,11 @@ module ViewComponent
|
|
151
185
|
old_request_query_string = request.query_string
|
152
186
|
old_controller = defined?(@controller) && @controller
|
153
187
|
|
188
|
+
path, query = path.split("?", 2)
|
154
189
|
request.path_info = path
|
155
|
-
request.path_parameters = Rails.application.routes.
|
156
|
-
request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(
|
157
|
-
request.set_header(Rack::QUERY_STRING,
|
190
|
+
request.path_parameters = Rails.application.routes.recognize_path_with_request(request, path, {})
|
191
|
+
request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(query))
|
192
|
+
request.set_header(Rack::QUERY_STRING, query)
|
158
193
|
yield
|
159
194
|
ensure
|
160
195
|
request.path_info = old_request_path_info
|
@@ -168,5 +203,20 @@ module ViewComponent
|
|
168
203
|
def build_controller(klass)
|
169
204
|
klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
|
170
205
|
end
|
206
|
+
|
207
|
+
private
|
208
|
+
|
209
|
+
def preview_class
|
210
|
+
result = if respond_to?(:described_class)
|
211
|
+
raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
|
212
|
+
|
213
|
+
"#{described_class}Preview"
|
214
|
+
else
|
215
|
+
self.class.name.gsub("Test", "Preview")
|
216
|
+
end
|
217
|
+
result = result.constantize
|
218
|
+
rescue NameError
|
219
|
+
raise NameError, "`render_preview` expected to find #{result}, but it does not exist."
|
220
|
+
end
|
171
221
|
end
|
172
222
|
end
|
@@ -23,7 +23,7 @@ module ViewComponent
|
|
23
23
|
def build_i18n_backend
|
24
24
|
return if CompileCache.compiled? self
|
25
25
|
|
26
|
-
self.i18n_backend = if (translation_files =
|
26
|
+
self.i18n_backend = if (translation_files = sidecar_files(%w[yml yaml])).any?
|
27
27
|
# Returning nil cleans up if translations file has been removed since the last compilation
|
28
28
|
|
29
29
|
I18nBackend.new(
|
data/lib/view_component.rb
CHANGED
@@ -10,21 +10,24 @@ module ViewComponent
|
|
10
10
|
autoload :Compiler
|
11
11
|
autoload :CompileCache
|
12
12
|
autoload :ComponentError
|
13
|
+
autoload :Config
|
13
14
|
autoload :Deprecation
|
14
15
|
autoload :Instrumentation
|
15
16
|
autoload :Preview
|
16
17
|
autoload :PreviewTemplateError
|
17
18
|
autoload :TestHelpers
|
19
|
+
autoload :SystemTestHelpers
|
18
20
|
autoload :TestCase
|
21
|
+
autoload :SystemTestCase
|
19
22
|
autoload :TemplateError
|
20
23
|
autoload :Translatable
|
21
24
|
end
|
22
25
|
|
23
26
|
# :nocov:
|
24
27
|
if defined?(ViewComponent::Engine)
|
25
|
-
ViewComponent::Deprecation.
|
26
|
-
"Manually loading the engine
|
27
|
-
"
|
28
|
+
ViewComponent::Deprecation.deprecation_warning(
|
29
|
+
"Manually loading the engine",
|
30
|
+
"remove `require \"view_component/engine\"`"
|
28
31
|
)
|
29
32
|
elsif defined?(Rails::Engine)
|
30
33
|
require "view_component/engine"
|