view_component 2.82.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of view_component might be problematic. Click here for more details.

@@ -28,17 +28,10 @@ module ViewComponent
28
28
  # :nocov:
29
29
  end
30
30
 
31
- # @private
32
- attr_reader :rendered_content
33
-
34
31
  # Returns the result of a render_inline call.
35
32
  #
36
- # @return [String]
37
- def rendered_component
38
- ViewComponent::Deprecation.deprecation_warning("`rendered_component`", :"`page`")
39
-
40
- rendered_content
41
- end
33
+ # @return [ActionView::OutputBuffer]
34
+ attr_reader :rendered_content
42
35
 
43
36
  # Render a component inline. Internally sets `page` to be a `Capybara::Node::Simple`,
44
37
  # allowing for Capybara assertions to be used:
@@ -54,9 +47,9 @@ module ViewComponent
54
47
  @page = nil
55
48
  @rendered_content =
56
49
  if Rails.version.to_f >= 6.1
57
- controller.view_context.render(component, args, &block)
50
+ vc_test_controller.view_context.render(component, args, &block)
58
51
  else
59
- controller.view_context.render_component(component, &block)
52
+ vc_test_controller.view_context.render_component(component, &block)
60
53
  end
61
54
 
62
55
  Nokogiri::HTML.fragment(@rendered_content)
@@ -81,8 +74,8 @@ module ViewComponent
81
74
  # @param from [ViewComponent::Preview] The class of the preview to be rendered.
82
75
  # @param params [Hash] Parameters to be passed to the preview.
83
76
  # @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)
77
+ def render_preview(name, from: __vc_test_helpers_preview_class, params: {})
78
+ previews_controller = __vc_test_helpers_build_controller(Rails.application.config.view_component.preview_controller.constantize)
86
79
 
87
80
  # From what I can tell, it's not possible to overwrite all request parameters
88
81
  # at once, so we set them individually here.
@@ -104,7 +97,7 @@ module ViewComponent
104
97
  # Capybara assertions to be used. All arguments are forwarded to the block.
105
98
  #
106
99
  # ```ruby
107
- # render_in_view_context(arg1, arg2:) do |arg1, arg2:|
100
+ # render_in_view_context(arg1, arg2: nil) do |arg1, arg2:|
108
101
  # render(MyComponent.new(arg1, arg2))
109
102
  # end
110
103
  #
@@ -112,26 +105,11 @@ module ViewComponent
112
105
  # ```
113
106
  def render_in_view_context(*args, &block)
114
107
  @page = nil
115
- @rendered_content = controller.view_context.instance_exec(*args, &block)
108
+ @rendered_content = vc_test_controller.view_context.instance_exec(*args, &block)
116
109
  Nokogiri::HTML.fragment(@rendered_content)
117
110
  end
118
111
  ruby2_keywords(:render_in_view_context) if respond_to?(:ruby2_keywords, true)
119
112
 
120
- # @private
121
- def controller
122
- @controller ||= build_controller(Base.test_controller.constantize)
123
- end
124
-
125
- # @private
126
- def request
127
- @request ||=
128
- begin
129
- request = ActionDispatch::TestRequest.create
130
- request.session = ActionController::TestSession.new
131
- request
132
- end
133
- end
134
-
135
113
  # Set the Action Pack request variant for the given block:
136
114
  #
137
115
  # ```ruby
@@ -142,12 +120,12 @@ module ViewComponent
142
120
  #
143
121
  # @param variant [Symbol] The variant to be set for the provided block.
144
122
  def with_variant(variant)
145
- old_variants = controller.view_context.lookup_context.variants
123
+ old_variants = vc_test_controller.view_context.lookup_context.variants
146
124
 
147
- controller.view_context.lookup_context.variants = variant
125
+ vc_test_controller.view_context.lookup_context.variants = variant
148
126
  yield
149
127
  ensure
150
- controller.view_context.lookup_context.variants = old_variants
128
+ vc_test_controller.view_context.lookup_context.variants = old_variants
151
129
  end
152
130
 
153
131
  # Set the controller to be used while executing the given block,
@@ -161,12 +139,12 @@ module ViewComponent
161
139
  #
162
140
  # @param klass [ActionController::Base] The controller to be used.
163
141
  def with_controller_class(klass)
164
- old_controller = defined?(@controller) && @controller
142
+ old_controller = defined?(@vc_test_controller) && @vc_test_controller
165
143
 
166
- @controller = build_controller(klass)
144
+ @vc_test_controller = __vc_test_helpers_build_controller(klass)
167
145
  yield
168
146
  ensure
169
- @controller = old_controller
147
+ @vc_test_controller = old_controller
170
148
  end
171
149
 
172
150
  # Set the URL of the current request (such as when using request-dependent path helpers):
@@ -179,34 +157,69 @@ module ViewComponent
179
157
  #
180
158
  # @param path [String] The path to set for the current request.
181
159
  def with_request_url(path)
182
- old_request_path_info = request.path_info
183
- old_request_path_parameters = request.path_parameters
184
- old_request_query_parameters = request.query_parameters
185
- old_request_query_string = request.query_string
186
- old_controller = defined?(@controller) && @controller
160
+ old_request_path_info = vc_test_request.path_info
161
+ old_request_path_parameters = vc_test_request.path_parameters
162
+ old_request_query_parameters = vc_test_request.query_parameters
163
+ old_request_query_string = vc_test_request.query_string
164
+ old_controller = defined?(@vc_test_controller) && @vc_test_controller
187
165
 
188
166
  path, query = path.split("?", 2)
189
- request.path_info = path
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)
167
+ vc_test_request.path_info = path
168
+ vc_test_request.path_parameters = Rails.application.routes.recognize_path_with_request(vc_test_request, path, {})
169
+ vc_test_request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(query))
170
+ vc_test_request.set_header(Rack::QUERY_STRING, query)
193
171
  yield
194
172
  ensure
195
- request.path_info = old_request_path_info
196
- request.path_parameters = old_request_path_parameters
197
- request.set_header("action_dispatch.request.query_parameters", old_request_query_parameters)
198
- request.set_header(Rack::QUERY_STRING, old_request_query_string)
199
- @controller = old_controller
173
+ vc_test_request.path_info = old_request_path_info
174
+ vc_test_request.path_parameters = old_request_path_parameters
175
+ vc_test_request.set_header("action_dispatch.request.query_parameters", old_request_query_parameters)
176
+ vc_test_request.set_header(Rack::QUERY_STRING, old_request_query_string)
177
+ @vc_test_controller = old_controller
200
178
  end
201
179
 
202
- # @private
203
- def build_controller(klass)
204
- klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
180
+ # Access the controller used by `render_inline`:
181
+ #
182
+ # ```ruby
183
+ # test "logged out user sees login link" do
184
+ # vc_test_controller.expects(:logged_in?).at_least_once.returns(false)
185
+ # render_inline(LoginComponent.new)
186
+ # assert_selector("[aria-label='You must be signed in']")
187
+ # end
188
+ # ```
189
+ #
190
+ # @return [ActionController::Base]
191
+ def vc_test_controller
192
+ @vc_test_controller ||= __vc_test_helpers_build_controller(Base.test_controller.constantize)
205
193
  end
206
194
 
195
+ # Access the request used by `render_inline`:
196
+ #
197
+ # ```ruby
198
+ # test "component does not render in Firefox" do
199
+ # request.env["HTTP_USER_AGENT"] = "Mozilla/5.0"
200
+ # render_inline(NoFirefoxComponent.new)
201
+ # refute_component_rendered
202
+ # end
203
+ # ```
204
+ #
205
+ # @return [ActionDispatch::TestRequest]
206
+ def vc_test_request
207
+ @vc_test_request ||=
208
+ begin
209
+ out = ActionDispatch::TestRequest.create
210
+ out.session = ActionController::TestSession.new
211
+ out
212
+ end
213
+ end
214
+
215
+ # Note: We prefix private methods here to prevent collisions in consumer's tests.
207
216
  private
208
217
 
209
- def preview_class
218
+ def __vc_test_helpers_build_controller(klass)
219
+ klass.new.tap { |c| c.request = vc_test_request }.extend(Rails.application.routes.url_helpers)
220
+ end
221
+
222
+ def __vc_test_helpers_preview_class
210
223
  result = if respond_to?(:described_class)
211
224
  raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
212
225
 
@@ -21,7 +21,7 @@ module ViewComponent
21
21
  end
22
22
 
23
23
  def build_i18n_backend
24
- return if CompileCache.compiled? self
24
+ return if compiled?
25
25
 
26
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
@@ -32,6 +32,27 @@ module ViewComponent
32
32
  )
33
33
  end
34
34
  end
35
+
36
+ def i18n_key(key, scope = nil)
37
+ scope = scope.join(".") if scope.is_a? Array
38
+ key = key&.to_s unless key.is_a?(String)
39
+ key = "#{scope}.#{key}" if scope
40
+ key = "#{i18n_scope}#{key}" if key.start_with?(".")
41
+ key
42
+ end
43
+
44
+ def translate(key = nil, **options)
45
+ return key.map { |k| translate(k, **options) } if key.is_a?(Array)
46
+
47
+ ensure_compiled
48
+
49
+ locale = options.delete(:locale) || ::I18n.locale
50
+ key = i18n_key(key, options.delete(:scope))
51
+
52
+ i18n_backend.translate(locale, key, options)
53
+ end
54
+
55
+ alias_method :t, :translate
35
56
  end
36
57
 
37
58
  class I18nBackend < ::I18n::Backend::Simple
@@ -60,19 +81,16 @@ module ViewComponent
60
81
  end
61
82
 
62
83
  def translate(key = nil, **options)
84
+ raise ViewComponent::TranslateCalledBeforeRenderError if view_context.nil?
85
+
63
86
  return super unless i18n_backend
64
87
  return key.map { |k| translate(k, **options) } if key.is_a?(Array)
65
88
 
66
89
  locale = options.delete(:locale) || ::I18n.locale
67
- scope = options.delete(:scope)
68
- scope = scope.join(".") if scope.is_a? Array
69
- key = key&.to_s unless key.is_a?(String)
70
- key = "#{scope}.#{key}" if scope
71
- key = "#{i18n_scope}#{key}" if key.start_with?(".")
72
-
73
- if HTML_SAFE_TRANSLATION_KEY.match?(key)
74
- html_escape_translation_options!(options)
75
- end
90
+ key = self.class.i18n_key(key, options.delete(:scope))
91
+ as_html = HTML_SAFE_TRANSLATION_KEY.match?(key)
92
+
93
+ html_escape_translation_options!(options) if as_html
76
94
 
77
95
  if key.start_with?(i18n_scope + ".")
78
96
  translated =
@@ -85,10 +103,7 @@ module ViewComponent
85
103
  return super(key, locale: locale, **options)
86
104
  end
87
105
 
88
- if HTML_SAFE_TRANSLATION_KEY.match?(key)
89
- translated = html_safe_translation(translated)
90
- end
91
-
106
+ translated = html_safe_translation(translated) if as_html
92
107
  translated
93
108
  else
94
109
  super(key, locale: locale, **options)
@@ -101,6 +116,8 @@ module ViewComponent
101
116
  self.class.i18n_scope
102
117
  end
103
118
 
119
+ private
120
+
104
121
  def html_safe_translation(translation)
105
122
  if translation.respond_to?(:map)
106
123
  translation.map { |element| html_safe_translation(element) }
@@ -112,18 +129,13 @@ module ViewComponent
112
129
  end
113
130
  end
114
131
 
115
- private
116
-
117
132
  def html_escape_translation_options!(options)
118
133
  options.each do |name, value|
119
- unless i18n_option?(name) || (name == :count && value.is_a?(Numeric))
120
- options[name] = ERB::Util.html_escape(value.to_s)
121
- end
122
- end
123
- end
134
+ next if ::I18n.reserved_keys_pattern.match?(name)
135
+ next if name == :count && value.is_a?(Numeric)
124
136
 
125
- def i18n_option?(name)
126
- (@i18n_option_names ||= I18n::RESERVED_KEYS.to_set).include?(name)
137
+ options[name] = ERB::Util.html_escape(value.to_s)
138
+ end
127
139
  end
128
140
  end
129
141
  end
@@ -2,11 +2,12 @@
2
2
 
3
3
  module ViewComponent
4
4
  module VERSION
5
- MAJOR = 2
6
- MINOR = 82
5
+ MAJOR = 3
6
+ MINOR = 0
7
7
  PATCH = 0
8
+ PRE = nil
8
9
 
9
- STRING = [MAJOR, MINOR, PATCH].join(".")
10
+ STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
10
11
  end
11
12
  end
12
13
 
@@ -3,14 +3,9 @@
3
3
  module ViewComponent
4
4
  module WithContentHelper
5
5
  def with_content(value)
6
- if value.nil?
7
- raise ArgumentError.new(
8
- "No content provided to `#with_content` for #{self}.\n\n" \
9
- "To fix this issue, pass a value."
10
- )
11
- else
12
- @__vc_content_set_by_with_content = value
13
- end
6
+ raise NilWithContentError if value.nil?
7
+
8
+ @__vc_content_set_by_with_content = value
14
9
 
15
10
  self
16
11
  end
@@ -7,29 +7,20 @@ module ViewComponent
7
7
  extend ActiveSupport::Autoload
8
8
 
9
9
  autoload :Base
10
+ autoload :CaptureCompatibility
10
11
  autoload :Compiler
11
12
  autoload :CompileCache
12
13
  autoload :ComponentError
13
14
  autoload :Config
14
15
  autoload :Deprecation
16
+ autoload :InlineTemplate
15
17
  autoload :Instrumentation
16
18
  autoload :Preview
17
- autoload :PreviewTemplateError
18
19
  autoload :TestHelpers
19
20
  autoload :SystemTestHelpers
20
21
  autoload :TestCase
21
22
  autoload :SystemTestCase
22
- autoload :TemplateError
23
23
  autoload :Translatable
24
24
  end
25
25
 
26
- # :nocov:
27
- if defined?(ViewComponent::Engine)
28
- ViewComponent::Deprecation.deprecation_warning(
29
- "Manually loading the engine",
30
- "remove `require \"view_component/engine\"`"
31
- )
32
- elsif defined?(Rails::Engine)
33
- require "view_component/engine"
34
- end
35
- # :nocov:
26
+ require "view_component/engine" if defined?(Rails::Engine)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_component
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.82.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ViewComponent Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-11 00:00:00.000000000 Z
11
+ date: 2023-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,16 +90,16 @@ dependencies:
90
90
  name: better_html
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ">="
94
94
  - !ruby/object:Gem::Version
95
- version: '1'
95
+ version: '0'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - "~>"
100
+ - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: '1'
102
+ version: '0'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: bundler
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -118,16 +118,16 @@ dependencies:
118
118
  name: erb_lint
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - "~>"
121
+ - - ">="
122
122
  - !ruby/object:Gem::Version
123
- version: 0.0.37
123
+ version: '0'
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - "~>"
128
+ - - ">="
129
129
  - !ruby/object:Gem::Version
130
- version: 0.0.37
130
+ version: '0'
131
131
  - !ruby/object:Gem::Dependency
132
132
  name: haml
133
133
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +212,20 @@ dependencies:
212
212
  - - "~>"
213
213
  - !ruby/object:Gem::Version
214
214
  version: '13.0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: rubocop-md
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '1'
215
229
  - !ruby/object:Gem::Dependency
216
230
  name: standard
217
231
  requirement: !ruby/object:Gem::Requirement
@@ -353,20 +367,20 @@ files:
353
367
  - lib/rails/generators/test_unit/templates/component_test.rb.tt
354
368
  - lib/view_component.rb
355
369
  - lib/view_component/base.rb
370
+ - lib/view_component/capture_compatibility.rb
356
371
  - lib/view_component/collection.rb
357
372
  - lib/view_component/compile_cache.rb
358
373
  - lib/view_component/compiler.rb
359
374
  - lib/view_component/component_error.rb
360
375
  - lib/view_component/config.rb
361
- - lib/view_component/content_areas.rb
362
376
  - lib/view_component/deprecation.rb
363
377
  - lib/view_component/docs_builder_component.html.erb
364
378
  - lib/view_component/docs_builder_component.rb
365
379
  - lib/view_component/engine.rb
380
+ - lib/view_component/errors.rb
381
+ - lib/view_component/inline_template.rb
366
382
  - lib/view_component/instrumentation.rb
367
- - lib/view_component/polymorphic_slots.rb
368
383
  - lib/view_component/preview.rb
369
- - lib/view_component/preview_template_error.rb
370
384
  - lib/view_component/rails/tasks/view_component.rake
371
385
  - lib/view_component/render_component_helper.rb
372
386
  - lib/view_component/render_component_to_string_helper.rb
@@ -375,12 +389,9 @@ files:
375
389
  - lib/view_component/rendering_component_helper.rb
376
390
  - lib/view_component/rendering_monkey_patch.rb
377
391
  - lib/view_component/slot.rb
378
- - lib/view_component/slot_v2.rb
379
392
  - lib/view_component/slotable.rb
380
- - lib/view_component/slotable_v2.rb
381
393
  - lib/view_component/system_test_case.rb
382
394
  - lib/view_component/system_test_helpers.rb
383
- - lib/view_component/template_error.rb
384
395
  - lib/view_component/test_case.rb
385
396
  - lib/view_component/test_helpers.rb
386
397
  - lib/view_component/translatable.rb
@@ -402,7 +413,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
402
413
  requirements:
403
414
  - - ">="
404
415
  - !ruby/object:Gem::Version
405
- version: 2.4.0
416
+ version: 2.7.0
406
417
  required_rubygems_version: !ruby/object:Gem::Requirement
407
418
  requirements:
408
419
  - - ">="
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/concern"
4
-
5
- require "view_component/slot"
6
-
7
- # DEPRECATED - ContentAreas is deprecated and will be removed in v3.0.0
8
- module ViewComponent
9
- module ContentAreas
10
- extend ActiveSupport::Concern
11
-
12
- # Assign the provided content to the content area accessor
13
- #
14
- # @private
15
- def with(area, content = nil, &block)
16
- unless content_areas.include?(area)
17
- raise ArgumentError.new(
18
- "Unknown content_area '#{area}' for #{self} - expected one of '#{content_areas}'.\n\n" \
19
- "To fix this issue, add `with_content_area :#{area}` to #{self} or reference " \
20
- "a valid content area."
21
- )
22
- end
23
-
24
- if block
25
- content = view_context.capture(&block)
26
- end
27
-
28
- instance_variable_set("@#{area}".to_sym, content)
29
- nil
30
- end
31
-
32
- class_methods do
33
- def with_content_areas(*areas)
34
- ViewComponent::Deprecation.deprecation_warning(
35
- "`with_content_areas`", "use slots (https://viewcomponent.org/guide/slots.html) instead"
36
- )
37
-
38
- if areas.include?(:content)
39
- raise ArgumentError.new(
40
- "#{self} defines a content area called :content, which is a reserved name. \n\n" \
41
- "To fix this issue, use another name, such as `:body`."
42
- )
43
- end
44
-
45
- areas.each do |area|
46
- define_method area.to_sym do
47
- content unless content_evaluated? # ensure content is loaded so content_areas will be defined
48
- instance_variable_get(:"@#{area}") if instance_variable_defined?(:"@#{area}")
49
- end
50
- end
51
-
52
- self.content_areas = areas
53
- end
54
- end
55
- end
56
- end
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module PolymorphicSlots
5
- # In older rails versions, using a concern isn't a good idea here because they appear to not work with
6
- # Module#prepend and class methods.
7
- def self.included(base)
8
- if base != ViewComponent::Base
9
- # :nocov:
10
- location = Kernel.caller_locations(1, 1)[0]
11
-
12
- warn(
13
- "warning: ViewComponent::PolymorphicSlots is now included in ViewComponent::Base by default " \
14
- "and can be removed from #{location.path}:#{location.lineno}"
15
- )
16
- # :nocov:
17
- end
18
-
19
- base.singleton_class.prepend(ClassMethods)
20
- base.include(InstanceMethods)
21
- end
22
-
23
- module ClassMethods
24
- def renders_one(slot_name, callable = nil)
25
- return super unless callable.is_a?(Hash) && callable.key?(:types)
26
-
27
- validate_singular_slot_name(slot_name)
28
- register_polymorphic_slot(slot_name, callable[:types], collection: false)
29
- end
30
-
31
- def renders_many(slot_name, callable = nil)
32
- return super unless callable.is_a?(Hash) && callable.key?(:types)
33
-
34
- validate_plural_slot_name(slot_name)
35
- register_polymorphic_slot(slot_name, callable[:types], collection: true)
36
- end
37
-
38
- def register_polymorphic_slot(slot_name, types, collection:)
39
- unless types.empty?
40
- getter_name = slot_name
41
-
42
- define_method(getter_name) do
43
- get_slot(slot_name)
44
- end
45
-
46
- define_method("#{getter_name}?") do
47
- get_slot(slot_name).present?
48
- end
49
- end
50
-
51
- renderable_hash = types.each_with_object({}) do |(poly_type, poly_callable), memo|
52
- memo[poly_type] = define_slot(
53
- "#{slot_name}_#{poly_type}", collection: collection, callable: poly_callable
54
- )
55
-
56
- setter_name =
57
- if collection
58
- "#{ActiveSupport::Inflector.singularize(slot_name)}_#{poly_type}"
59
- else
60
- "#{slot_name}_#{poly_type}"
61
- end
62
-
63
- define_method(setter_name) do |*args, &block|
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
70
-
71
- set_polymorphic_slot(slot_name, poly_type, *args, &block)
72
- end
73
- ruby2_keywords(setter_name.to_sym) if respond_to?(:ruby2_keywords, true)
74
-
75
- define_method("with_#{setter_name}") do |*args, &block|
76
- set_polymorphic_slot(slot_name, poly_type, *args, &block)
77
- end
78
- ruby2_keywords(:"with_#{setter_name}") if respond_to?(:ruby2_keywords, true)
79
- end
80
-
81
- registered_slots[slot_name] = {
82
- collection: collection,
83
- renderable_hash: renderable_hash
84
- }
85
- end
86
- end
87
-
88
- module InstanceMethods
89
- def set_polymorphic_slot(slot_name, poly_type = nil, *args, &block)
90
- slot_definition = self.class.registered_slots[slot_name]
91
-
92
- if !slot_definition[:collection] && (defined?(@__vc_set_slots) && @__vc_set_slots[slot_name])
93
- raise ArgumentError, "content for slot '#{slot_name}' has already been provided"
94
- end
95
-
96
- poly_def = slot_definition[:renderable_hash][poly_type]
97
-
98
- set_slot(slot_name, poly_def, *args, &block)
99
- end
100
- ruby2_keywords(:set_polymorphic_slot) if respond_to?(:ruby2_keywords, true)
101
- end
102
- end
103
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- class PreviewTemplateError < StandardError
5
- end
6
- end