view_component 2.35.0 → 2.36.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aecf7b0c1b767aefa852ac1c72ad9a8f9f579289136c15743e24124e240e3f36
4
- data.tar.gz: 9fd3b0e4a7d2411626e4853c4d8bf59d0de2ebf1c09830aa3a8dde78222bcf04
3
+ metadata.gz: 74a9bb65a4c364b86c92249805629eb7dc5d7dad010e6743a461cd668d6897f3
4
+ data.tar.gz: ab5bf1fa266b729faebf8bed8b8884300a8fca4462d4ab8a0c6a0dce32153a26
5
5
  SHA512:
6
- metadata.gz: 7a6954671a016ccc031bc4a1076640ddc6442a6a4de3f6366b8ef485a3e7cb8977afdca103660a67e5c81d510b9539d7a1d804cf27c750cad2c75945e5a33324
7
- data.tar.gz: b0ce60068522b0f9fa45e8325d79bfde1534d81edcf690c43709f34f5196f48b1c1e70e0303a49d4b9063c6b366fdd2c1e60890e983af3bfa98a678b8529a4c6
6
+ metadata.gz: eae497c864c6005b6ec9cea9073d2659b5378e0f0ebde82397a7e8a09e834525293f6b1a25a615198a28ae9ccfc077505c0bdb35def7cbea69aeaa3472dba7a3
7
+ data.tar.gz: b11a86583fb7886828690d0d9d57ec9db3bf0f99b40f5cc0de5bb8fb6ca54ffd8e6fb65e150cdd2865c8cd71d46e13e9d7adbd3bd846d5ba5996a0a3c4ebf7d0
@@ -56,7 +56,7 @@ class ViewComponentsController < Rails::ApplicationController # :nodoc:
56
56
  if preview
57
57
  @preview = ViewComponent::Preview.find(preview)
58
58
  else
59
- raise AbstractController::ActionNotFound, "Component preview '#{params[:path]}' not found"
59
+ raise AbstractController::ActionNotFound, "Component preview '#{params[:path]}' not found."
60
60
  end
61
61
  end
62
62
 
data/docs/CHANGELOG.md CHANGED
@@ -7,6 +7,36 @@ title: Changelog
7
7
 
8
8
  ## main
9
9
 
10
+ ## 2.36.0
11
+
12
+ * Add `slot_type` helper method.
13
+
14
+ *Jon Palmer*
15
+
16
+ * Add test case for rendering a ViewComponent with slots in a controller.
17
+
18
+ *Simon Fish*
19
+
20
+ * Add example ViewComponent to documentation landing page.
21
+
22
+ *Joel Hawksley*
23
+
24
+ * Set maximum line length to 120.
25
+
26
+ *Joel Hawksley*
27
+
28
+ * Setting a collection slot with the plural setter (`component.items(array)` for `renders_many :items`) returns the array of slots.
29
+
30
+ *Jon Palmer*
31
+
32
+ * Update error messages to be more descriptive and helpful.
33
+
34
+ *Joel Hawksley*
35
+
36
+ * Raise an error if the slot name for renders_many is :contents
37
+
38
+ *Simon Fish*
39
+
10
40
  ## 2.35.0
11
41
 
12
42
  * Only load assets for Preview source highlighting if previews are enabled.
@@ -86,7 +86,11 @@ module ViewComponent
86
86
  @current_template = self
87
87
 
88
88
  if block && defined?(@__vc_content_set_by_with_content)
89
- raise ArgumentError.new("Block provided after calling `with_content`. Use one or the other.")
89
+ raise ArgumentError.new(
90
+ "It looks like a block was provided after calling `with_content` on #{self.class.name}, " \
91
+ "which means that ViewComponent doesn't know which content to use.\n\n" \
92
+ "To fix this issue, use either `with_content` or a block."
93
+ )
90
94
  end
91
95
 
92
96
  @__vc_content_evaluated = false
@@ -110,7 +114,8 @@ module ViewComponent
110
114
  ""
111
115
  end
112
116
 
113
- # Called before rendering the component. Override to perform operations that depend on having access to the view context, such as helpers.
117
+ # Called before rendering the component. Override to perform operations that
118
+ # depend on having access to the view context, such as helpers.
114
119
  #
115
120
  # @return [void]
116
121
  def before_render
@@ -150,20 +155,40 @@ module ViewComponent
150
155
  end
151
156
  end
152
157
 
153
- # The current controller. Use sparingly as doing so introduces coupling that inhibits encapsulation & reuse, often making testing difficult.
158
+ # The current controller. Use sparingly as doing so introduces coupling
159
+ # that inhibits encapsulation & reuse, often making testing difficult.
154
160
  #
155
161
  # @return [ActionController::Base]
156
162
  def controller
157
- raise ViewContextCalledBeforeRenderError, "`controller` can only be called at render time." if view_context.nil?
163
+ if view_context.nil?
164
+ raise(
165
+ ViewContextCalledBeforeRenderError,
166
+ "`#controller` cannot be used during initialization, as it depends " \
167
+ "on the view context that only exists once a ViewComponent is passed to " \
168
+ "the Rails render pipeline.\n\n" \
169
+ "It's sometimes possible to fix this issue by moving code dependent on " \
170
+ "`#controller` to a `#before_render` method: https://viewcomponent.org/api.html#before_render--void."
171
+ )
172
+ end
158
173
 
159
174
  @__vc_controller ||= view_context.controller
160
175
  end
161
176
 
162
- # A proxy through which to access helpers. Use sparingly as doing so introduces coupling that inhibits encapsulation & reuse, often making testing difficult.
177
+ # A proxy through which to access helpers. Use sparingly as doing so introduces
178
+ # coupling that inhibits encapsulation & reuse, often making testing difficult.
163
179
  #
164
180
  # @return [ActionView::Base]
165
181
  def helpers
166
- raise ViewContextCalledBeforeRenderError, "`helpers` can only be called at render time." if view_context.nil?
182
+ if view_context.nil?
183
+ raise(
184
+ ViewContextCalledBeforeRenderError,
185
+ "`#helpers` cannot be used during initialization, as it depends " \
186
+ "on the view context that only exists once a ViewComponent is passed to " \
187
+ "the Rails render pipeline.\n\n" \
188
+ "It's sometimes possible to fix this issue by moving code dependent on " \
189
+ "`#helpers` to a `#before_render` method: https://viewcomponent.org/api.html#before_render--void."
190
+ )
191
+ end
167
192
 
168
193
  @__vc_helpers ||= controller.view_context
169
194
  end
@@ -201,7 +226,8 @@ module ViewComponent
201
226
  self
202
227
  end
203
228
 
204
- # The current request. Use sparingly as doing so introduces coupling that inhibits encapsulation & reuse, often making testing difficult.
229
+ # The current request. Use sparingly as doing so introduces coupling that
230
+ # inhibits encapsulation & reuse, often making testing difficult.
205
231
  #
206
232
  # @return [ActionDispatch::Request]
207
233
  def request
@@ -409,13 +435,18 @@ module ViewComponent
409
435
  # the component.
410
436
  if initialize_parameters.empty?
411
437
  raise ArgumentError.new(
412
- "#{self} initializer is empty or invalid."
438
+ "The #{self} initializer is empty or invalid." \
439
+ "It must accept the parameter `#{parameter}` to render it as a collection.\n\n" \
440
+ "To fix this issue, update the initializer to accept `#{parameter}`.\n\n" \
441
+ "See https://viewcomponent.org/guide/collections.html for more information on rendering collections."
413
442
  )
414
443
  end
415
444
 
416
445
  raise ArgumentError.new(
417
- "#{self} initializer must accept " \
418
- "`#{parameter}` collection parameter."
446
+ "The initializer for #{self} does not accept the parameter `#{parameter}`, " \
447
+ "which is required in order to render it as a collection.\n\n" \
448
+ "To fix this issue, update the initializer to accept `#{parameter}`.\n\n" \
449
+ "See https://viewcomponent.org/guide/collections.html for more information on rendering collections."
419
450
  )
420
451
  end
421
452
 
@@ -427,9 +458,8 @@ module ViewComponent
427
458
  return unless initialize_parameter_names.include?(RESERVED_PARAMETER)
428
459
 
429
460
  raise ViewComponent::ComponentError.new(
430
- "#{self} initializer cannot contain " \
431
- "`#{RESERVED_PARAMETER}` since it will override a " \
432
- "public ViewComponent method."
461
+ "#{self} initializer cannot accept the parameter `#{RESERVED_PARAMETER}`, as it will override a " \
462
+ "public ViewComponent method. To fix this issue, rename the parameter."
433
463
  )
434
464
  end
435
465
 
@@ -32,7 +32,10 @@ module ViewComponent
32
32
  if object.respond_to?(:to_ary)
33
33
  object.to_ary
34
34
  else
35
- raise ArgumentError.new("The value of the argument isn't a valid collection. Make sure it responds to to_ary: #{object.inspect}")
35
+ raise ArgumentError.new(
36
+ "The value of the first argument passed to `with_collection` isn't a valid collection. " \
37
+ "Make sure it responds to `to_ary`."
38
+ )
36
39
  end
37
40
  end
38
41
 
@@ -16,7 +16,10 @@ module ViewComponent
16
16
  subclass_instance_methods = component_class.instance_methods(false)
17
17
 
18
18
  if subclass_instance_methods.include?(:with_content) && raise_errors
19
- raise ViewComponent::ComponentError.new("#{component_class} implements a reserved method, `with_content`.")
19
+ raise ViewComponent::ComponentError.new(
20
+ "#{component_class} implements a reserved method, `#with_content`.\n\n" \
21
+ "To fix this issue, change the name of the method."
22
+ )
20
23
  end
21
24
 
22
25
  if template_errors.present?
@@ -27,7 +30,8 @@ module ViewComponent
27
30
 
28
31
  if subclass_instance_methods.include?(:before_render_check)
29
32
  ActiveSupport::Deprecation.warn(
30
- "`before_render_check` will be removed in v3.0.0. Use `#before_render` instead."
33
+ "`#before_render_check` will be removed in v3.0.0.\n\n" \
34
+ "To fix this issue, use `#before_render` instead."
31
35
  )
32
36
  end
33
37
 
@@ -40,7 +44,10 @@ module ViewComponent
40
44
  # Remove existing compiled template methods,
41
45
  # as Ruby warns when redefining a method.
42
46
  method_name = call_method_name(template[:variant])
43
- component_class.send(:undef_method, method_name.to_sym) if component_class.instance_methods.include?(method_name.to_sym)
47
+
48
+ if component_class.instance_methods.include?(method_name.to_sym)
49
+ component_class.send(:undef_method, method_name.to_sym)
50
+ end
44
51
 
45
52
  component_class.class_eval <<-RUBY, template[:path], -1
46
53
  def #{method_name}
@@ -62,7 +69,9 @@ module ViewComponent
62
69
  attr_reader :component_class
63
70
 
64
71
  def define_render_template_for
65
- component_class.send(:undef_method, :render_template_for) if component_class.instance_methods.include?(:render_template_for)
72
+ if component_class.instance_methods.include?(:render_template_for)
73
+ component_class.send(:undef_method, :render_template_for)
74
+ end
66
75
 
67
76
  variant_elsifs = variants.compact.uniq.map do |variant|
68
77
  "elsif variant.to_sym == :#{variant}\n #{call_method_name(variant)}"
@@ -90,7 +99,9 @@ module ViewComponent
90
99
  end
91
100
 
92
101
  if templates.count { |template| template[:variant].nil? } > 1
93
- errors << "More than one template found for #{component_class}. There can only be one default template file per component."
102
+ errors <<
103
+ "More than one template found for #{component_class}. " \
104
+ "There can only be one default template file per component."
94
105
  end
95
106
 
96
107
  invalid_variants =
@@ -101,11 +112,16 @@ module ViewComponent
101
112
  sort
102
113
 
103
114
  unless invalid_variants.empty?
104
- errors << "More than one template found for #{'variant'.pluralize(invalid_variants.count)} #{invalid_variants.map { |v| "'#{v}'" }.to_sentence} in #{component_class}. There can only be one template file per variant."
115
+ errors <<
116
+ "More than one template found for #{'variant'.pluralize(invalid_variants.count)} " \
117
+ "#{invalid_variants.map { |v| "'#{v}'" }.to_sentence} in #{component_class}. " \
118
+ "There can only be one template file per variant."
105
119
  end
106
120
 
107
121
  if templates.find { |template| template[:variant].nil? } && inline_calls_defined_on_self.include?(:call)
108
- errors << "Template file and inline render method found for #{component_class}. There can only be a template file or inline render method per component."
122
+ errors <<
123
+ "Template file and inline render method found for #{component_class}. " \
124
+ "There can only be a template file or inline render method per component."
109
125
  end
110
126
 
111
127
  duplicate_template_file_and_inline_variant_calls =
@@ -114,7 +130,12 @@ module ViewComponent
114
130
  unless duplicate_template_file_and_inline_variant_calls.empty?
115
131
  count = duplicate_template_file_and_inline_variant_calls.count
116
132
 
117
- errors << "Template #{'file'.pluralize(count)} and inline render #{'method'.pluralize(count)} found for #{'variant'.pluralize(count)} #{duplicate_template_file_and_inline_variant_calls.map { |v| "'#{v}'" }.to_sentence} in #{component_class}. There can only be a template file or inline render method per variant."
133
+ errors <<
134
+ "Template #{'file'.pluralize(count)} and inline render #{'method'.pluralize(count)} " \
135
+ "found for #{'variant'.pluralize(count)} " \
136
+ "#{duplicate_template_file_and_inline_variant_calls.map { |v| "'#{v}'" }.to_sentence} " \
137
+ "in #{component_class}. " \
138
+ "There can only be a template file or inline render method per variant."
118
139
  end
119
140
 
120
141
  errors
@@ -143,7 +164,10 @@ module ViewComponent
143
164
  # Fetch only ViewComponent ancestor classes to limit the scope of
144
165
  # finding inline calls
145
166
  view_component_ancestors =
146
- component_class.ancestors.take_while { |ancestor| ancestor != ViewComponent::Base } - component_class.included_modules
167
+ (
168
+ component_class.ancestors.take_while { |ancestor| ancestor != ViewComponent::Base } -
169
+ component_class.included_modules
170
+ )
147
171
 
148
172
  view_component_ancestors.flat_map { |ancestor| ancestor.instance_methods(false).grep(/^call/) }.uniq
149
173
  end
@@ -172,7 +196,13 @@ module ViewComponent
172
196
  if handler.method(:call).parameters.length > 1
173
197
  handler.call(component_class, template)
174
198
  else
175
- handler.call(OpenStruct.new(source: template, identifier: component_class.identifier, type: component_class.type))
199
+ handler.call(
200
+ OpenStruct.new(
201
+ source: template,
202
+ identifier: component_class.identifier,
203
+ type: component_class.type
204
+ )
205
+ )
176
206
  end
177
207
  end
178
208
 
@@ -14,7 +14,11 @@ module ViewComponent
14
14
  # @private
15
15
  def with(area, content = nil, &block)
16
16
  unless content_areas.include?(area)
17
- raise ArgumentError.new "Unknown content_area '#{area}' - expected one of '#{content_areas}'"
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
+ )
18
22
  end
19
23
 
20
24
  if block_given?
@@ -28,12 +32,15 @@ module ViewComponent
28
32
  class_methods do
29
33
  def with_content_areas(*areas)
30
34
  ActiveSupport::Deprecation.warn(
31
- "`with_content_areas` is deprecated and will be removed in ViewComponent v3.0.0.\n" \
35
+ "`with_content_areas` is deprecated and will be removed in ViewComponent v3.0.0.\n\n" \
32
36
  "Use slots (https://viewcomponent.org/guide/slots.html) instead."
33
37
  )
34
38
 
35
39
  if areas.include?(:content)
36
- raise ArgumentError.new ":content is a reserved content area name. Please use another name, such as ':body'"
40
+ raise ArgumentError.new(
41
+ "#{self} defines a content area called :content, which is a reserved name. \n\n" \
42
+ "To fix this issue, use another name, such as `:body`."
43
+ )
37
44
  end
38
45
 
39
46
  areas.each do |area|
@@ -110,8 +110,19 @@ module ViewComponent
110
110
  app.routes.prepend do
111
111
  preview_controller = options.preview_controller.sub(/Controller$/, "").underscore
112
112
 
113
- get options.preview_route, to: "#{preview_controller}#index", as: :preview_view_components, internal: true
114
- get "#{options.preview_route}/*path", to: "#{preview_controller}#previews", as: :preview_view_component, internal: true
113
+ get(
114
+ options.preview_route,
115
+ to: "#{preview_controller}#index",
116
+ as: :preview_view_components,
117
+ internal: true
118
+ )
119
+
120
+ get(
121
+ "#{options.preview_route}/*path",
122
+ to: "#{preview_controller}#previews",
123
+ as: :preview_view_component,
124
+ internal: true
125
+ )
115
126
  end
116
127
  end
117
128
 
@@ -9,7 +9,11 @@ module ViewComponent # :nodoc:
9
9
  end
10
10
 
11
11
  def render_in(view_context, &block)
12
- ActiveSupport::Notifications.instrument("!render.view_component", name: self.class.name, identifier: self.class.identifier) do
12
+ ActiveSupport::Notifications.instrument(
13
+ "!render.view_component",
14
+ name: self.class.name,
15
+ identifier: self.class.identifier
16
+ ) do
13
17
  super(view_context, &block)
14
18
  end
15
19
  end
@@ -77,7 +77,11 @@ module ViewComponent # :nodoc:
77
77
  end
78
78
 
79
79
  if preview_path.nil?
80
- raise PreviewTemplateError, "preview template for example #{example} does not exist"
80
+ raise(
81
+ PreviewTemplateError,
82
+ "A preview template for example #{example} does not exist.\n\n" \
83
+ "To fix this issue, create a template for the example."
84
+ )
81
85
  end
82
86
 
83
87
  path = Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
@@ -30,7 +30,13 @@ module ViewComponent
30
30
 
31
31
  view_context = @parent.send(:view_context)
32
32
 
33
- raise ArgumentError.new("Block provided after calling `with_content`. Use one or the other.") if defined?(@__vc_content_block) && defined?(@__vc_content_set_by_with_content)
33
+ if defined?(@__vc_content_block) && defined?(@__vc_content_set_by_with_content)
34
+ raise ArgumentError.new(
35
+ "It looks like a block was provided after calling `with_content` on #{self.class.name}, " \
36
+ "which means that ViewComponent doesn't know which content to use.\n\n" \
37
+ "To fix this issue, use either `with_content` or a block."
38
+ )
39
+ end
34
40
 
35
41
  @content =
36
42
  if defined?(@__vc_component_instance)
@@ -65,7 +65,7 @@ module ViewComponent
65
65
  # <% end %>
66
66
  # <% end %>
67
67
  def renders_one(slot_name, callable = nil)
68
- validate_slot_name(slot_name)
68
+ validate_singular_slot_name(slot_name)
69
69
 
70
70
  define_method slot_name do |*args, **kwargs, &block|
71
71
  if args.empty? && kwargs.empty? && block.nil?
@@ -116,7 +116,7 @@ module ViewComponent
116
116
  # <% end %>
117
117
  # <% end %>
118
118
  def renders_many(slot_name, callable = nil)
119
- validate_slot_name(slot_name)
119
+ validate_plural_slot_name(slot_name)
120
120
 
121
121
  singular_name = ActiveSupport::Inflector.singularize(slot_name)
122
122
 
@@ -133,7 +133,7 @@ module ViewComponent
133
133
  if collection_args.nil? && block.nil?
134
134
  get_slot(slot_name)
135
135
  else
136
- collection_args.each do |args|
136
+ collection_args.map do |args|
137
137
  set_slot(slot_name, **args, &block)
138
138
  end
139
139
  end
@@ -142,6 +142,17 @@ module ViewComponent
142
142
  register_slot(slot_name, collection: true, callable: callable)
143
143
  end
144
144
 
145
+ def slot_type(slot_name)
146
+ registered_slot = registered_slots[slot_name]
147
+ if registered_slot
148
+ registered_slot[:collection] ? :collection : :single
149
+ else
150
+ plural_slot_name = ActiveSupport::Inflector.pluralize(slot_name).to_sym
151
+ plural_registered_slot = registered_slots[plural_slot_name]
152
+ plural_registered_slot&.fetch(:collection) ? :collection_item : nil
153
+ end
154
+ end
155
+
145
156
  # Clone slot configuration into child class
146
157
  # see #test_slots_pollution
147
158
  def inherited(child)
@@ -174,14 +185,35 @@ module ViewComponent
174
185
  self.registered_slots[slot_name] = slot
175
186
  end
176
187
 
177
- def validate_slot_name(slot_name)
188
+ def validate_plural_slot_name(slot_name)
189
+ if slot_name.to_sym == :contents
190
+ raise ArgumentError.new(
191
+ "#{self} declares a slot named #{slot_name}, which is a reserved word in the ViewComponent framework.\n\n" \
192
+ "To fix this issue, choose a different name."
193
+ )
194
+ end
195
+
196
+ raise_if_slot_registered(slot_name)
197
+ end
198
+
199
+ def validate_singular_slot_name(slot_name)
178
200
  if slot_name.to_sym == :content
179
- raise ArgumentError.new("#{slot_name} is not a valid slot name.")
201
+ raise ArgumentError.new(
202
+ "#{self} declares a slot named #{slot_name}, which is a reserved word in the ViewComponent framework.\n\n" \
203
+ "To fix this issue, choose a different name."
204
+ )
180
205
  end
181
206
 
207
+ raise_if_slot_registered(slot_name)
208
+ end
209
+
210
+ def raise_if_slot_registered(slot_name)
182
211
  if self.registered_slots.key?(slot_name)
183
212
  # TODO remove? This breaks overriding slots when slots are inherited
184
- raise ArgumentError.new("#{slot_name} slot declared multiple times")
213
+ raise ArgumentError.new(
214
+ "#{self} declares the #{slot_name} slot multiple times.\n\n" \
215
+ "To fix this issue, choose a different slot name."
216
+ )
185
217
  end
186
218
  end
187
219
  end
@@ -224,7 +256,8 @@ module ViewComponent
224
256
  slot.__vc_component_instance = slot_definition[:renderable].new(*args, **kwargs)
225
257
  # If class name as a string
226
258
  elsif slot_definition[:renderable_class_name]
227
- slot.__vc_component_instance = self.class.const_get(slot_definition[:renderable_class_name]).new(*args, **kwargs)
259
+ slot.__vc_component_instance =
260
+ self.class.const_get(slot_definition[:renderable_class_name]).new(*args, **kwargs)
228
261
  # If passed a lambda
229
262
  elsif slot_definition[:renderable_function]
230
263
  # Use `bind(self)` to ensure lambda is executed in the context of the
@@ -17,7 +17,13 @@ module ViewComponent
17
17
  # We don't have a test case for running an application without capybara installed.
18
18
  # It's probably fine to leave this without coverage.
19
19
  # :nocov:
20
- warn "WARNING in `ViewComponent::TestHelpers`: You must add `capybara` to your Gemfile to use Capybara assertions." if ENV["DEBUG"]
20
+ if ENV["DEBUG"]
21
+ warn(
22
+ "WARNING in `ViewComponent::TestHelpers`: You must add `capybara` " \
23
+ "to your Gemfile to use Capybara assertions."
24
+ )
25
+ end
26
+
21
27
  # :nocov:
22
28
  end
23
29
 
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 35
6
+ MINOR = 36
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
@@ -4,7 +4,10 @@ module ViewComponent
4
4
  module WithContentHelper
5
5
  def with_content(value)
6
6
  if value.nil?
7
- raise ArgumentError.new("No content provided.")
7
+ raise ArgumentError.new(
8
+ "No content provided to `#with_content` for #{self}.\n\n" \
9
+ "To fix this issue, pass a value."
10
+ )
8
11
  else
9
12
  @__vc_content_set_by_with_content = value
10
13
  end
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.35.0
4
+ version: 2.36.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-02 00:00:00.000000000 Z
11
+ date: 2021-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport