view_component 3.0.0.rc5 → 3.0.0.rc6
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.
- checksums.yaml +4 -4
- data/app/controllers/view_components_system_test_controller.rb +2 -2
- data/app/helpers/preview_helper.rb +2 -4
- data/docs/CHANGELOG.md +53 -3
- data/lib/view_component/base.rb +11 -39
- data/lib/view_component/collection.rb +1 -4
- data/lib/view_component/compiler.rb +1 -9
- data/lib/view_component/docs_builder_component.html.erb +5 -1
- data/lib/view_component/docs_builder_component.rb +28 -9
- data/lib/view_component/errors.rb +213 -0
- data/lib/view_component/inline_template.rb +1 -1
- data/lib/view_component/preview.rb +1 -7
- data/lib/view_component/slot.rb +27 -12
- data/lib/view_component/slotable.rb +49 -40
- data/lib/view_component/test_helpers.rb +1 -1
- data/lib/view_component/translatable.rb +2 -0
- data/lib/view_component/version.rb +1 -1
- data/lib/view_component/with_content_helper.rb +3 -8
- data/lib/view_component.rb +0 -2
- metadata +25 -12
- data/lib/view_component/preview_template_error.rb +0 -6
- data/lib/view_component/template_error.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d82093cc048c5af21538ee6ec01aa2ef474b71b97d2cae0fd02413f036b97616
|
4
|
+
data.tar.gz: 376d3bf8597d3eccd871ab9f8f1fa71a55f9564e44f7fcf920115c50e89b6224
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e410d228fd97a8007d50f7a4bfc262c20481ac3e1279f7e2cfada131fb475ca65991e99a2af6ee059c16dea38913974c72aca62d1d4c1d4530dcce8c13159721
|
7
|
+
data.tar.gz: 1d7bccb010f977dde4435af3aab5c4df57af2157684b924dea54b43b788d3624d1a914e15602f138184d9c222e9a43c80c2088c95b34269a8d994ec6eb5058c7
|
@@ -15,7 +15,7 @@ class ViewComponentsSystemTestController < ActionController::Base # :nodoc:
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def validate_test_env
|
18
|
-
raise
|
18
|
+
raise ViewComponent::SystemTestControllerOnlyAllowedInTestError unless Rails.env.test?
|
19
19
|
end
|
20
20
|
|
21
21
|
# Ensure that the file path is valid and doesn't target files outside
|
@@ -24,7 +24,7 @@ class ViewComponentsSystemTestController < ActionController::Base # :nodoc:
|
|
24
24
|
base_path = ::File.realpath(self.class.temp_dir)
|
25
25
|
@path = ::File.realpath(params.permit(:file)[:file], base_path)
|
26
26
|
unless @path.start_with?(base_path)
|
27
|
-
raise
|
27
|
+
raise ViewComponent::SystemTestControllerNefariousPathError
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -31,10 +31,8 @@ module PreviewHelper
|
|
31
31
|
path =~ /#{template_identifier}*.(html)/
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
raise "found 0 matches for templates for #{template_identifier}." if matching_templates.empty?
|
37
|
-
raise "found multiple templates for #{template_identifier}." if matching_templates.size > 1
|
34
|
+
raise ViewComponent::NoMatchingTemplatesForPreviewError.new(template_identifier) if matching_templates.empty?
|
35
|
+
raise ViewComponent::MultipleMatchingTemplatesForPreviewError.new(template_identifier) if matching_templates.size > 1
|
38
36
|
|
39
37
|
template_file_path = matching_templates.first
|
40
38
|
template_source = File.read(template_file_path)
|
data/docs/CHANGELOG.md
CHANGED
@@ -10,13 +10,63 @@ nav_order: 5
|
|
10
10
|
|
11
11
|
## main
|
12
12
|
|
13
|
+
### v3.0.0.rc6
|
14
|
+
|
15
|
+
Run into an issue with this release candidate? [Let us know](https://github.com/ViewComponent/view_component/issues/1629). We hope to release v3.0.0 in the near future!
|
16
|
+
|
17
|
+
* BREAKING: `#SLOT_NAME` getter no longer accepts arguments. This change was missed as part of the earlier deprecation in `3.0.0.rc1`.
|
18
|
+
|
19
|
+
*Joel Hawksley*
|
20
|
+
|
21
|
+
* BREAKING: Raise `TranslateCalledBeforeRenderError`, `ControllerCalledBeforeRenderError`, or `HelpersCalledBeforeRenderError` instead of `ViewContextCalledBeforeRenderError`.
|
22
|
+
|
23
|
+
*Joel Hawksley*
|
24
|
+
|
25
|
+
* BREAKING: Raise `SlotPredicateNameError`, `RedefinedSlotError`, `ReservedSingularSlotNameError`, `ContentSlotNameError`, `InvalidSlotDefinitionError`, `ReservedPluralSlotNameError`, `ContentAlreadySetForPolymorphicSlotErrror`, `SystemTestControllerOnlyAllowedInTestError`, `SystemTestControllerNefariousPathError`, `NoMatchingTemplatesForPreviewError`, `MultipleMatchingTemplatesForPreviewError`, `DuplicateContentError`, `EmptyOrInvalidInitializerError`, `MissingCollectionArgumentError`, `ReservedParameterError`, `InvalidCollectionArgumentError`, `MultipleInlineTemplatesError`, `MissingPreviewTemplateError`, `DuplicateSlotContentError` or `NilWithContentError` instead of generic error classes.
|
26
|
+
|
27
|
+
*Joel Hawksley*
|
28
|
+
|
29
|
+
* Fix bug where `content?` and `with_content` didn't work reliably with slots.
|
30
|
+
|
31
|
+
*Derek Kniffin, Joel Hawksley*
|
32
|
+
|
33
|
+
* Add `with_SLOT_NAME_content` helper.
|
34
|
+
|
35
|
+
*Will Cosgrove*
|
36
|
+
|
37
|
+
* Allow ActiveRecord objects to be passed to `renders_many`.
|
38
|
+
|
39
|
+
*Leigh Halliday*
|
40
|
+
|
41
|
+
* Fix broken links in documentation.
|
42
|
+
|
43
|
+
*Ellen Keal*
|
44
|
+
|
45
|
+
* Run `standardrb` against markdown in docs.
|
46
|
+
|
47
|
+
*Joel Hawksley*
|
48
|
+
|
49
|
+
* Allow `.with_content` to be redefined by components.
|
50
|
+
|
51
|
+
*Joel Hawksley*
|
52
|
+
|
53
|
+
* Run `standardrb` against markdown in docs.
|
54
|
+
|
55
|
+
*Joel Hawksley*
|
56
|
+
|
57
|
+
* Raise error if translations are used in initializer.
|
58
|
+
|
59
|
+
*Joel Hawksley*
|
60
|
+
|
13
61
|
## v3.0.0.rc5
|
14
62
|
|
63
|
+
Run into an issue with this release candidate? [Let us know](https://github.com/ViewComponent/view_component/issues/1629).
|
64
|
+
|
15
65
|
* Fix bug where `mkdir_p` failed due to incorrect permissions.
|
16
66
|
|
17
67
|
*Joel Hawksley*
|
18
68
|
|
19
|
-
* Check for inline `erb_template` calls when deciding whether
|
69
|
+
* Check for inline `erb_template` calls when deciding whether to compile a component's superclass.
|
20
70
|
|
21
71
|
*Justin Kenyon*
|
22
72
|
|
@@ -72,7 +122,7 @@ Run into an issue with this release? [Let us know](https://github.com/ViewCompon
|
|
72
122
|
|
73
123
|
*Joel Hawksley*
|
74
124
|
|
75
|
-
* BREAKING: Rename private TestHelpers#controller, #build_controller, #request, and #preview_class to avoid conflicts. Note: While these methods were undocumented and marked as private, they
|
125
|
+
* BREAKING: Rename private TestHelpers#controller, #build_controller, #request, and #preview_class to avoid conflicts. Note: While these methods were undocumented and marked as private, they were accessible in tests. As such, we're considering this to be a breaking change.
|
76
126
|
|
77
127
|
*Joel Hawksley*
|
78
128
|
|
@@ -112,7 +162,7 @@ Run into an issue with this release? [Let us know](https://github.com/ViewCompon
|
|
112
162
|
|
113
163
|
1,000+ days and 100+ releases later, the 200+ contributors to ViewComponent are proud to ship v3.0.0!
|
114
164
|
|
115
|
-
We're so grateful for all
|
165
|
+
We're so grateful for all the work of community members to get us to this release. Whether it’s filing bug reports, designing APIs in long-winded discussion threads, or writing code itself, ViewComponent is built by the community, for the community. We couldn’t be more proud of what we’re building together :heart:
|
116
166
|
|
117
167
|
This release makes the following breaking changes, many of which have long been deprecated:
|
118
168
|
|
data/lib/view_component/base.rb
CHANGED
@@ -6,6 +6,7 @@ require "view_component/collection"
|
|
6
6
|
require "view_component/compile_cache"
|
7
7
|
require "view_component/compiler"
|
8
8
|
require "view_component/config"
|
9
|
+
require "view_component/errors"
|
9
10
|
require "view_component/preview"
|
10
11
|
require "view_component/slotable"
|
11
12
|
require "view_component/translatable"
|
@@ -32,8 +33,6 @@ module ViewComponent
|
|
32
33
|
include ViewComponent::Translatable
|
33
34
|
include ViewComponent::WithContentHelper
|
34
35
|
|
35
|
-
ViewContextCalledBeforeRenderError = Class.new(StandardError)
|
36
|
-
|
37
36
|
RESERVED_PARAMETER = :content
|
38
37
|
|
39
38
|
# For CSRF authenticity tokens in forms
|
@@ -94,9 +93,7 @@ module ViewComponent
|
|
94
93
|
@current_template = self
|
95
94
|
|
96
95
|
if block && defined?(@__vc_content_set_by_with_content)
|
97
|
-
raise
|
98
|
-
"which means that ViewComponent doesn't know which content to use.\n\n" \
|
99
|
-
"To fix this issue, use either `with_content` or a block."
|
96
|
+
raise DuplicateContentError.new(self.class.name)
|
100
97
|
end
|
101
98
|
|
102
99
|
@__vc_content_evaluated = false
|
@@ -175,16 +172,7 @@ module ViewComponent
|
|
175
172
|
#
|
176
173
|
# @return [ActionController::Base]
|
177
174
|
def controller
|
178
|
-
if view_context.nil?
|
179
|
-
raise(
|
180
|
-
ViewContextCalledBeforeRenderError,
|
181
|
-
"`#controller` can't be used during initialization, as it depends " \
|
182
|
-
"on the view context that only exists once a ViewComponent is passed to " \
|
183
|
-
"the Rails render pipeline.\n\n" \
|
184
|
-
"It's sometimes possible to fix this issue by moving code dependent on " \
|
185
|
-
"`#controller` to a `#before_render` method: https://viewcomponent.org/api.html#before_render--void."
|
186
|
-
)
|
187
|
-
end
|
175
|
+
raise ControllerCalledBeforeRenderError if view_context.nil?
|
188
176
|
|
189
177
|
@__vc_controller ||= view_context.controller
|
190
178
|
end
|
@@ -194,16 +182,7 @@ module ViewComponent
|
|
194
182
|
#
|
195
183
|
# @return [ActionView::Base]
|
196
184
|
def helpers
|
197
|
-
if view_context.nil?
|
198
|
-
raise(
|
199
|
-
ViewContextCalledBeforeRenderError,
|
200
|
-
"`#helpers` can't be used during initialization, as it depends " \
|
201
|
-
"on the view context that only exists once a ViewComponent is passed to " \
|
202
|
-
"the Rails render pipeline.\n\n" \
|
203
|
-
"It's sometimes possible to fix this issue by moving code dependent on " \
|
204
|
-
"`#helpers` to a `#before_render` method: https://viewcomponent.org/api.html#before_render--void."
|
205
|
-
)
|
206
|
-
end
|
185
|
+
raise HelpersCalledBeforeRenderError if view_context.nil?
|
207
186
|
|
208
187
|
# Attempt to re-use the original view_context passed to the first
|
209
188
|
# component rendered in the rendering pipeline. This prevents the
|
@@ -270,7 +249,7 @@ module ViewComponent
|
|
270
249
|
attr_reader :view_context
|
271
250
|
|
272
251
|
def __vc_render_in_block_provided?
|
273
|
-
@view_context && @__vc_render_in_block
|
252
|
+
defined?(@view_context) && @view_context && @__vc_render_in_block
|
274
253
|
end
|
275
254
|
|
276
255
|
def __vc_content_set_by_with_content_defined?
|
@@ -278,7 +257,7 @@ module ViewComponent
|
|
278
257
|
end
|
279
258
|
|
280
259
|
def content_evaluated?
|
281
|
-
@__vc_content_evaluated
|
260
|
+
defined?(@__vc_content_evaluated) && @__vc_content_evaluated
|
282
261
|
end
|
283
262
|
|
284
263
|
# Set the controller used for testing components:
|
@@ -535,7 +514,7 @@ module ViewComponent
|
|
535
514
|
# end
|
536
515
|
# ```
|
537
516
|
#
|
538
|
-
# @param value [Boolean] Whether
|
517
|
+
# @param value [Boolean] Whether to strip newlines.
|
539
518
|
def strip_trailing_whitespace(value = true)
|
540
519
|
self.__vc_strip_trailing_whitespace = value
|
541
520
|
end
|
@@ -559,20 +538,14 @@ module ViewComponent
|
|
559
538
|
return unless parameter
|
560
539
|
return if initialize_parameter_names.include?(parameter) || splatted_keyword_argument_present?
|
561
540
|
|
562
|
-
# If Ruby can't parse the component class, then the
|
541
|
+
# If Ruby can't parse the component class, then the initialize
|
563
542
|
# parameters will be empty and ViewComponent will not be able to render
|
564
543
|
# the component.
|
565
544
|
if initialize_parameters.empty?
|
566
|
-
raise
|
567
|
-
"It must accept the parameter `#{parameter}` to render it as a collection.\n\n" \
|
568
|
-
"To fix this issue, update the initializer to accept `#{parameter}`.\n\n" \
|
569
|
-
"See https://viewcomponent.org/guide/collections.html for more information on rendering collections."
|
545
|
+
raise EmptyOrInvalidInitializerError.new(name, parameter)
|
570
546
|
end
|
571
547
|
|
572
|
-
raise
|
573
|
-
"which is required in order to render it as a collection.\n\n" \
|
574
|
-
"To fix this issue, update the initializer to accept `#{parameter}`.\n\n" \
|
575
|
-
"See https://viewcomponent.org/guide/collections.html for more information on rendering collections."
|
548
|
+
raise MissingCollectionArgumentError.new(name, parameter)
|
576
549
|
end
|
577
550
|
|
578
551
|
# Ensure the component initializer doesn't define
|
@@ -582,8 +555,7 @@ module ViewComponent
|
|
582
555
|
def validate_initialization_parameters!
|
583
556
|
return unless initialize_parameter_names.include?(RESERVED_PARAMETER)
|
584
557
|
|
585
|
-
raise
|
586
|
-
"public ViewComponent method. To fix this issue, rename the parameter."
|
558
|
+
raise ReservedParameterError.new(name, RESERVED_PARAMETER)
|
587
559
|
end
|
588
560
|
|
589
561
|
# @private
|
@@ -53,10 +53,7 @@ module ViewComponent
|
|
53
53
|
if object.respond_to?(:to_ary)
|
54
54
|
object.to_ary
|
55
55
|
else
|
56
|
-
raise
|
57
|
-
"The value of the first argument passed to `with_collection` isn't a valid collection. " \
|
58
|
-
"Make sure it responds to `to_ary`."
|
59
|
-
)
|
56
|
+
raise InvalidCollectionArgumentError
|
60
57
|
end
|
61
58
|
end
|
62
59
|
|
@@ -31,17 +31,9 @@ module ViewComponent
|
|
31
31
|
return if component_class == ViewComponent::Base
|
32
32
|
|
33
33
|
component_class.superclass.compile(raise_errors: raise_errors) if should_compile_superclass?
|
34
|
-
subclass_instance_methods = component_class.instance_methods(false)
|
35
|
-
|
36
|
-
if subclass_instance_methods.include?(:with_content) && raise_errors
|
37
|
-
raise ViewComponent::ComponentError.new(
|
38
|
-
"#{component_class} implements a reserved method, `#with_content`.\n\n" \
|
39
|
-
"To fix this issue, change the name of the method."
|
40
|
-
)
|
41
|
-
end
|
42
34
|
|
43
35
|
if template_errors.present?
|
44
|
-
raise
|
36
|
+
raise TemplateError.new(template_errors) if raise_errors
|
45
37
|
|
46
38
|
return false
|
47
39
|
end
|
@@ -12,7 +12,11 @@ nav_order: 3
|
|
12
12
|
## <%= section.heading %>
|
13
13
|
|
14
14
|
<% section.methods.each do |method| %>
|
15
|
-
### <%== render ViewComponent::DocsBuilderComponent::MethodDoc.new(method) %>
|
15
|
+
### <%== render ViewComponent::DocsBuilderComponent::MethodDoc.new(method, section.show_types) %>
|
16
|
+
|
17
|
+
<% end %>
|
18
|
+
<% section.error_klasses.each do |error_klass| %>
|
19
|
+
### <%== render ViewComponent::DocsBuilderComponent::ErrorKlassDoc.new(error_klass, section.show_types) %>
|
16
20
|
|
17
21
|
<% end %>
|
18
22
|
<% end %>
|
@@ -2,21 +2,40 @@
|
|
2
2
|
|
3
3
|
module ViewComponent
|
4
4
|
class DocsBuilderComponent < Base
|
5
|
-
class Section < Struct.new(:heading, :methods, :show_types, keyword_init: true)
|
6
|
-
def initialize(heading: nil, methods: [], show_types: true)
|
5
|
+
class Section < Struct.new(:heading, :methods, :error_klasses, :show_types, keyword_init: true)
|
6
|
+
def initialize(heading: nil, methods: [], error_klasses: [], show_types: true)
|
7
7
|
methods.sort_by! { |method| method[:name] }
|
8
|
+
error_klasses.sort!
|
8
9
|
super
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
class
|
13
|
-
def initialize(
|
14
|
-
@
|
15
|
-
|
13
|
+
class ErrorKlassDoc < ViewComponent::Base
|
14
|
+
def initialize(error_klass, _show_types)
|
15
|
+
@error_klass = error_klass
|
16
|
+
end
|
17
|
+
|
18
|
+
def klass_name
|
19
|
+
@error_klass.gsub("ViewComponent::", "").gsub("::MESSAGE", "")
|
16
20
|
end
|
17
21
|
|
18
|
-
def
|
19
|
-
@
|
22
|
+
def error_message
|
23
|
+
ViewComponent.const_get(@error_klass)
|
24
|
+
end
|
25
|
+
|
26
|
+
def call
|
27
|
+
<<~DOCS.chomp
|
28
|
+
`#{klass_name}`
|
29
|
+
|
30
|
+
#{error_message}
|
31
|
+
DOCS
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class MethodDoc < ViewComponent::Base
|
36
|
+
def initialize(method, show_types = true)
|
37
|
+
@method = method
|
38
|
+
@show_types = show_types
|
20
39
|
end
|
21
40
|
|
22
41
|
def deprecated?
|
@@ -28,7 +47,7 @@ module ViewComponent
|
|
28
47
|
end
|
29
48
|
|
30
49
|
def types
|
31
|
-
" → [#{@method.tag(:return).types.join(",")}]" if @method.tag(:return)&.types && show_types
|
50
|
+
" → [#{@method.tag(:return).types.join(",")}]" if @method.tag(:return)&.types && @show_types
|
32
51
|
end
|
33
52
|
|
34
53
|
def signature_or_name
|
@@ -0,0 +1,213 @@
|
|
1
|
+
module ViewComponent
|
2
|
+
class BaseError < StandardError
|
3
|
+
def initialize
|
4
|
+
super(self.class::MESSAGE)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class DuplicateSlotContentError < StandardError
|
9
|
+
MESSAGE =
|
10
|
+
"It looks like a block was provided after calling `with_content` on COMPONENT, " \
|
11
|
+
"which means that ViewComponent doesn't know which content to use.\n\n" \
|
12
|
+
"To fix this issue, use either `with_content` or a block."
|
13
|
+
|
14
|
+
def initialize(klass_name)
|
15
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TemplateError < StandardError
|
20
|
+
def initialize(errors)
|
21
|
+
super(errors.join(", "))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class MultipleInlineTemplatesError < BaseError
|
26
|
+
MESSAGE = "Inline templates can only be defined once per-component."
|
27
|
+
end
|
28
|
+
|
29
|
+
class MissingPreviewTemplateError < StandardError
|
30
|
+
MESSAGE =
|
31
|
+
"A preview template for example EXAMPLE doesn't exist.\n\n" \
|
32
|
+
"To fix this issue, create a template for the example."
|
33
|
+
|
34
|
+
def initialize(example)
|
35
|
+
super(MESSAGE.gsub("EXAMPLE", example))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class DuplicateContentError < StandardError
|
40
|
+
MESSAGE =
|
41
|
+
"It looks like a block was provided after calling `with_content` on COMPONENT, " \
|
42
|
+
"which means that ViewComponent doesn't know which content to use.\n\n" \
|
43
|
+
"To fix this issue, use either `with_content` or a block."
|
44
|
+
|
45
|
+
def initialize(klass_name)
|
46
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class EmptyOrInvalidInitializerError < StandardError
|
51
|
+
MESSAGE =
|
52
|
+
"The COMPONENT initializer is empty or invalid. " \
|
53
|
+
"It must accept the parameter `PARAMETER` to render it as a collection.\n\n" \
|
54
|
+
"To fix this issue, update the initializer to accept `PARAMETER`.\n\n" \
|
55
|
+
"See [the collections docs](https://viewcomponent.org/guide/collections.html) for more information on rendering collections."
|
56
|
+
|
57
|
+
def initialize(klass_name, parameter)
|
58
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("PARAMETER", parameter.to_s))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class MissingCollectionArgumentError < StandardError
|
63
|
+
MESSAGE =
|
64
|
+
"The initializer for COMPONENT doesn't accept the parameter `PARAMETER`, " \
|
65
|
+
"which is required to render it as a collection.\n\n" \
|
66
|
+
"To fix this issue, update the initializer to accept `PARAMETER`.\n\n" \
|
67
|
+
"See [the collections docs](https://viewcomponent.org/guide/collections.html) for more information on rendering collections."
|
68
|
+
|
69
|
+
def initialize(klass_name, parameter)
|
70
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("PARAMETER", parameter.to_s))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class ReservedParameterError < StandardError
|
75
|
+
MESSAGE =
|
76
|
+
"COMPONENT initializer can't accept the parameter `PARAMETER`, as it will override a " \
|
77
|
+
"public ViewComponent method. To fix this issue, rename the parameter."
|
78
|
+
|
79
|
+
def initialize(klass_name, parameter)
|
80
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("PARAMETER", parameter.to_s))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class InvalidCollectionArgumentError < BaseError
|
85
|
+
MESSAGE =
|
86
|
+
"The value of the first argument passed to `with_collection` isn't a valid collection. " \
|
87
|
+
"Make sure it responds to `to_ary`."
|
88
|
+
end
|
89
|
+
|
90
|
+
class ContentSlotNameError < StandardError
|
91
|
+
MESSAGE =
|
92
|
+
"COMPONENT declares a slot named content, which is a reserved word in ViewComponent.\n\n" \
|
93
|
+
"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" \
|
94
|
+
"To fix this issue, either use the `content` accessor directly or choose a different slot name."
|
95
|
+
|
96
|
+
def initialize(klass_name)
|
97
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class InvalidSlotDefinitionError < BaseError
|
102
|
+
MESSAGE =
|
103
|
+
"Invalid slot definition. Please pass a class, " \
|
104
|
+
"string, or callable (that is proc, lambda, etc)"
|
105
|
+
end
|
106
|
+
|
107
|
+
class SlotPredicateNameError < StandardError
|
108
|
+
MESSAGE =
|
109
|
+
"COMPONENT declares a slot named SLOT_NAME, which ends with a question mark.\n\n" \
|
110
|
+
"This isn't allowed because the ViewComponent framework already provides predicate " \
|
111
|
+
"methods ending in `?`.\n\n" \
|
112
|
+
"To fix this issue, choose a different name."
|
113
|
+
|
114
|
+
def initialize(klass_name, slot_name)
|
115
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("SLOT_NAME", slot_name.to_s))
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class RedefinedSlotError < StandardError
|
120
|
+
MESSAGE =
|
121
|
+
"COMPONENT declares the SLOT_NAME slot multiple times.\n\n" \
|
122
|
+
"To fix this issue, choose a different slot name."
|
123
|
+
|
124
|
+
def initialize(klass_name, slot_name)
|
125
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("SLOT_NAME", slot_name.to_s))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class ReservedSingularSlotNameError < StandardError
|
130
|
+
MESSAGE =
|
131
|
+
"COMPONENT declares a slot named SLOT_NAME, which is a reserved word in the ViewComponent framework.\n\n" \
|
132
|
+
"To fix this issue, choose a different name."
|
133
|
+
|
134
|
+
def initialize(klass_name, slot_name)
|
135
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("SLOT_NAME", slot_name.to_s))
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class ReservedPluralSlotNameError < StandardError
|
140
|
+
MESSAGE =
|
141
|
+
"COMPONENT declares a slot named SLOT_NAME, which is a reserved word in the ViewComponent framework.\n\n" \
|
142
|
+
"To fix this issue, choose a different name."
|
143
|
+
|
144
|
+
def initialize(klass_name, slot_name)
|
145
|
+
super(MESSAGE.gsub("COMPONENT", klass_name.to_s).gsub("SLOT_NAME", slot_name.to_s))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class ContentAlreadySetForPolymorphicSlotError < StandardError
|
150
|
+
MESSAGE = "Content for slot SLOT_NAME has already been provided."
|
151
|
+
|
152
|
+
def initialize(slot_name)
|
153
|
+
super(MESSAGE.gsub("SLOT_NAME", slot_name.to_s))
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class NilWithContentError < BaseError
|
158
|
+
MESSAGE =
|
159
|
+
"No content provided to `#with_content` for #{self}.\n\n" \
|
160
|
+
"To fix this issue, pass a value."
|
161
|
+
end
|
162
|
+
|
163
|
+
class TranslateCalledBeforeRenderError < BaseError
|
164
|
+
MESSAGE =
|
165
|
+
"`#translate` can't be used during initialization as it depends " \
|
166
|
+
"on the view context that only exists once a ViewComponent is passed to " \
|
167
|
+
"the Rails render pipeline.\n\n" \
|
168
|
+
"It's sometimes possible to fix this issue by moving code dependent on " \
|
169
|
+
"`#translate` to a [`#before_render` method](https://viewcomponent.org/api.html#before_render--void)."
|
170
|
+
end
|
171
|
+
|
172
|
+
class HelpersCalledBeforeRenderError < BaseError
|
173
|
+
MESSAGE =
|
174
|
+
"`#helpers` can't be used during initialization as it depends " \
|
175
|
+
"on the view context that only exists once a ViewComponent is passed to " \
|
176
|
+
"the Rails render pipeline.\n\n" \
|
177
|
+
"It's sometimes possible to fix this issue by moving code dependent on " \
|
178
|
+
"`#helpers` to a [`#before_render` method](https://viewcomponent.org/api.html#before_render--void)."
|
179
|
+
end
|
180
|
+
|
181
|
+
class ControllerCalledBeforeRenderError < BaseError
|
182
|
+
MESSAGE =
|
183
|
+
"`#controller` can't be used during initialization, as it depends " \
|
184
|
+
"on the view context that only exists once a ViewComponent is passed to " \
|
185
|
+
"the Rails render pipeline.\n\n" \
|
186
|
+
"It's sometimes possible to fix this issue by moving code dependent on " \
|
187
|
+
"`#controller` to a [`#before_render` method](https://viewcomponent.org/api.html#before_render--void)."
|
188
|
+
end
|
189
|
+
|
190
|
+
class NoMatchingTemplatesForPreviewError < StandardError
|
191
|
+
MESSAGE = "Found 0 matches for templates for TEMPLATE_IDENTIFIER."
|
192
|
+
|
193
|
+
def initialize(template_identifier)
|
194
|
+
super(MESSAGE.gsub("TEMPLATE_IDENTIFIER", template_identifier))
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class MultipleMatchingTemplatesForPreviewError < StandardError
|
199
|
+
MESSAGE = "Found multiple templates for TEMPLATE_IDENTIFIER."
|
200
|
+
|
201
|
+
def initialize(template_identifier)
|
202
|
+
super(MESSAGE.gsub("TEMPLATE_IDENTIFIER", template_identifier))
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class SystemTestControllerOnlyAllowedInTestError < BaseError
|
207
|
+
MESSAGE = "ViewComponent SystemTest controller must only be called in a test environment for security reasons."
|
208
|
+
end
|
209
|
+
|
210
|
+
class SystemTestControllerNefariousPathError < BaseError
|
211
|
+
MESSAGE = "ViewComponent SystemTest controller attempted to load a file outside of the expected directory."
|
212
|
+
end
|
213
|
+
end
|
@@ -10,7 +10,7 @@ module ViewComponent # :nodoc:
|
|
10
10
|
return super if !method.end_with?("_template")
|
11
11
|
|
12
12
|
if defined?(@__vc_inline_template_defined) && @__vc_inline_template_defined
|
13
|
-
raise
|
13
|
+
raise MultipleInlineTemplatesError
|
14
14
|
end
|
15
15
|
|
16
16
|
if args.size != 1
|
@@ -80,13 +80,7 @@ module ViewComponent # :nodoc:
|
|
80
80
|
Dir["#{path}/#{preview_name}_preview/#{example}.html.*"].first
|
81
81
|
end
|
82
82
|
|
83
|
-
if preview_path.nil?
|
84
|
-
raise(
|
85
|
-
PreviewTemplateError,
|
86
|
-
"A preview template for example #{example} doesn't exist.\n\n" \
|
87
|
-
"To fix this issue, create a template for the example."
|
88
|
-
)
|
89
|
-
end
|
83
|
+
raise MissingPreviewTemplateError.new(example) if preview_path.nil?
|
90
84
|
|
91
85
|
path = Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
|
92
86
|
Pathname.new(path)
|
data/lib/view_component/slot.rb
CHANGED
@@ -12,6 +12,23 @@ module ViewComponent
|
|
12
12
|
@parent = parent
|
13
13
|
end
|
14
14
|
|
15
|
+
def content?
|
16
|
+
return true if defined?(@__vc_content) && @__vc_content.present?
|
17
|
+
return true if defined?(@__vc_content_set_by_with_content) && @__vc_content_set_by_with_content.present?
|
18
|
+
return true if defined?(@__vc_content_block) && @__vc_content_block.present?
|
19
|
+
return false if !__vc_component_instance?
|
20
|
+
|
21
|
+
@__vc_component_instance.content?
|
22
|
+
end
|
23
|
+
|
24
|
+
def with_content(args)
|
25
|
+
if __vc_component_instance?
|
26
|
+
@__vc_component_instance.with_content(args)
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
15
32
|
# Used to render the slot content in the template
|
16
33
|
#
|
17
34
|
# There's currently 3 different values that may be set, that we can render.
|
@@ -31,22 +48,14 @@ module ViewComponent
|
|
31
48
|
view_context = @parent.send(:view_context)
|
32
49
|
|
33
50
|
if defined?(@__vc_content_block) && defined?(@__vc_content_set_by_with_content)
|
34
|
-
raise
|
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
|
-
)
|
51
|
+
raise DuplicateSlotContentError.new(self.class.name)
|
39
52
|
end
|
40
53
|
|
41
54
|
@content =
|
42
|
-
if
|
55
|
+
if __vc_component_instance?
|
43
56
|
@__vc_component_instance.__vc_original_view_context = @parent.__vc_original_view_context
|
44
57
|
|
45
|
-
if defined?(@
|
46
|
-
@__vc_component_instance.with_content(@__vc_content_set_by_with_content)
|
47
|
-
|
48
|
-
@__vc_component_instance.render_in(view_context)
|
49
|
-
elsif defined?(@__vc_content_block)
|
58
|
+
if defined?(@__vc_content_block)
|
50
59
|
# render_in is faster than `parent.render`
|
51
60
|
@__vc_component_instance.render_in(view_context, &@__vc_content_block)
|
52
61
|
else
|
@@ -92,7 +101,13 @@ module ViewComponent
|
|
92
101
|
end
|
93
102
|
|
94
103
|
def respond_to_missing?(symbol, include_all = false)
|
95
|
-
|
104
|
+
__vc_component_instance? && @__vc_component_instance.respond_to?(symbol, include_all)
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def __vc_component_instance?
|
110
|
+
defined?(@__vc_component_instance)
|
96
111
|
end
|
97
112
|
end
|
98
113
|
end
|
@@ -68,6 +68,11 @@ module ViewComponent
|
|
68
68
|
# <p>Bar</p>
|
69
69
|
# <% end %>
|
70
70
|
# <% end %>
|
71
|
+
#
|
72
|
+
# Additionally, content can be set by calling `with_SLOT_NAME_content`
|
73
|
+
# on the component instance.
|
74
|
+
#
|
75
|
+
# <%= render_inline(MyComponent.new.with_header_content("Foo")) %>
|
71
76
|
def renders_one(slot_name, callable = nil)
|
72
77
|
validate_singular_slot_name(slot_name)
|
73
78
|
|
@@ -76,20 +81,27 @@ module ViewComponent
|
|
76
81
|
else
|
77
82
|
validate_plural_slot_name(ActiveSupport::Inflector.pluralize(slot_name).to_sym)
|
78
83
|
|
79
|
-
|
84
|
+
setter_method_name = :"with_#{slot_name}"
|
85
|
+
|
86
|
+
define_method setter_method_name do |*args, &block|
|
80
87
|
set_slot(slot_name, nil, *args, &block)
|
81
88
|
end
|
82
|
-
ruby2_keywords(
|
89
|
+
ruby2_keywords(setter_method_name) if respond_to?(:ruby2_keywords, true)
|
83
90
|
|
84
|
-
define_method slot_name do
|
91
|
+
define_method slot_name do
|
85
92
|
get_slot(slot_name)
|
86
93
|
end
|
87
|
-
ruby2_keywords(slot_name.to_sym) if respond_to?(:ruby2_keywords, true)
|
88
94
|
|
89
95
|
define_method "#{slot_name}?" do
|
90
96
|
get_slot(slot_name).present?
|
91
97
|
end
|
92
98
|
|
99
|
+
define_method "with_#{slot_name}_content" do |content|
|
100
|
+
send(setter_method_name) { content.to_s }
|
101
|
+
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
93
105
|
register_slot(slot_name, collection: false, callable: callable)
|
94
106
|
end
|
95
107
|
end
|
@@ -140,18 +152,30 @@ module ViewComponent
|
|
140
152
|
singular_name = ActiveSupport::Inflector.singularize(slot_name)
|
141
153
|
validate_singular_slot_name(ActiveSupport::Inflector.singularize(slot_name).to_sym)
|
142
154
|
|
143
|
-
|
155
|
+
setter_method_name = :"with_#{singular_name}"
|
156
|
+
|
157
|
+
define_method setter_method_name do |*args, &block|
|
144
158
|
set_slot(slot_name, nil, *args, &block)
|
145
159
|
end
|
146
|
-
ruby2_keywords(
|
160
|
+
ruby2_keywords(setter_method_name) if respond_to?(:ruby2_keywords, true)
|
161
|
+
|
162
|
+
define_method "with_#{singular_name}_content" do |content|
|
163
|
+
send(setter_method_name) { content.to_s }
|
164
|
+
|
165
|
+
self
|
166
|
+
end
|
147
167
|
|
148
168
|
define_method :"with_#{slot_name}" do |collection_args = nil, &block|
|
149
169
|
collection_args.map do |args|
|
150
|
-
|
170
|
+
if args.respond_to?(:to_hash)
|
171
|
+
set_slot(slot_name, nil, **args, &block)
|
172
|
+
else
|
173
|
+
set_slot(slot_name, nil, *args, &block)
|
174
|
+
end
|
151
175
|
end
|
152
176
|
end
|
153
177
|
|
154
|
-
define_method slot_name do
|
178
|
+
define_method slot_name do
|
155
179
|
get_slot(slot_name)
|
156
180
|
end
|
157
181
|
|
@@ -206,10 +230,18 @@ module ViewComponent
|
|
206
230
|
"#{slot_name}_#{poly_type}"
|
207
231
|
end
|
208
232
|
|
209
|
-
|
233
|
+
setter_method_name = :"with_#{setter_name}"
|
234
|
+
|
235
|
+
define_method(setter_method_name) do |*args, &block|
|
210
236
|
set_polymorphic_slot(slot_name, poly_type, *args, &block)
|
211
237
|
end
|
212
|
-
ruby2_keywords(
|
238
|
+
ruby2_keywords(setter_method_name) if respond_to?(:ruby2_keywords, true)
|
239
|
+
|
240
|
+
define_method "with_#{setter_name}_content" do |content|
|
241
|
+
send(setter_method_name) { content.to_s }
|
242
|
+
|
243
|
+
self
|
244
|
+
end
|
213
245
|
end
|
214
246
|
|
215
247
|
registered_slots[slot_name] = {
|
@@ -244,10 +276,7 @@ module ViewComponent
|
|
244
276
|
define_method method_name, &callable
|
245
277
|
slot[:renderable_function] = instance_method(method_name)
|
246
278
|
else
|
247
|
-
raise(
|
248
|
-
ArgumentError,
|
249
|
-
"invalid slot definition. Please pass a class, string, or callable (i.e. proc, lambda, etc)"
|
250
|
-
)
|
279
|
+
raise(InvalidSlotDefinitionError)
|
251
280
|
end
|
252
281
|
|
253
282
|
slot
|
@@ -255,10 +284,7 @@ module ViewComponent
|
|
255
284
|
|
256
285
|
def validate_plural_slot_name(slot_name)
|
257
286
|
if RESERVED_NAMES[:plural].include?(slot_name.to_sym)
|
258
|
-
raise
|
259
|
-
"#{self} declares a slot named #{slot_name}, which is a reserved word in the ViewComponent framework.\n\n" \
|
260
|
-
"To fix this issue, choose a different name."
|
261
|
-
)
|
287
|
+
raise ReservedPluralSlotNameError.new(name, slot_name)
|
262
288
|
end
|
263
289
|
|
264
290
|
raise_if_slot_ends_with_question_mark(slot_name)
|
@@ -267,18 +293,11 @@ module ViewComponent
|
|
267
293
|
|
268
294
|
def validate_singular_slot_name(slot_name)
|
269
295
|
if slot_name.to_sym == :content
|
270
|
-
raise
|
271
|
-
"#{self} declares a slot named content, which is a reserved word in ViewComponent.\n\n" \
|
272
|
-
"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" \
|
273
|
-
"To fix this issue, either use the `content` accessor directly or choose a different slot name."
|
274
|
-
)
|
296
|
+
raise ContentSlotNameError.new(name)
|
275
297
|
end
|
276
298
|
|
277
299
|
if RESERVED_NAMES[:singular].include?(slot_name.to_sym)
|
278
|
-
raise
|
279
|
-
"#{self} declares a slot named #{slot_name}, which is a reserved word in the ViewComponent framework.\n\n" \
|
280
|
-
"To fix this issue, choose a different name."
|
281
|
-
)
|
300
|
+
raise ReservedSingularSlotNameError.new(name, slot_name)
|
282
301
|
end
|
283
302
|
|
284
303
|
raise_if_slot_ends_with_question_mark(slot_name)
|
@@ -288,22 +307,12 @@ module ViewComponent
|
|
288
307
|
def raise_if_slot_registered(slot_name)
|
289
308
|
if registered_slots.key?(slot_name)
|
290
309
|
# TODO remove? This breaks overriding slots when slots are inherited
|
291
|
-
raise
|
292
|
-
"#{self} declares the #{slot_name} slot multiple times.\n\n" \
|
293
|
-
"To fix this issue, choose a different slot name."
|
294
|
-
)
|
310
|
+
raise RedefinedSlotError.new(name, slot_name)
|
295
311
|
end
|
296
312
|
end
|
297
313
|
|
298
314
|
def raise_if_slot_ends_with_question_mark(slot_name)
|
299
|
-
if slot_name.to_s.ends_with?("?")
|
300
|
-
raise ArgumentError.new(
|
301
|
-
"#{self} declares a slot named #{slot_name}, which ends with a question mark.\n\n" \
|
302
|
-
"This is not allowed because the ViewComponent framework already provides predicate " \
|
303
|
-
"methods ending in `?`.\n\n" \
|
304
|
-
"To fix this issue, choose a different name."
|
305
|
-
)
|
306
|
-
end
|
315
|
+
raise SlotPredicateNameError.new(name, slot_name) if slot_name.to_s.ends_with?("?")
|
307
316
|
end
|
308
317
|
end
|
309
318
|
|
@@ -384,7 +393,7 @@ module ViewComponent
|
|
384
393
|
slot_definition = self.class.registered_slots[slot_name]
|
385
394
|
|
386
395
|
if !slot_definition[:collection] && (defined?(@__vc_set_slots) && @__vc_set_slots[slot_name])
|
387
|
-
raise
|
396
|
+
raise ContentAlreadySetForPolymorphicSlotError.new(slot_name)
|
388
397
|
end
|
389
398
|
|
390
399
|
poly_def = slot_definition[:renderable_hash][poly_type]
|
@@ -97,7 +97,7 @@ module ViewComponent
|
|
97
97
|
# Capybara assertions to be used. All arguments are forwarded to the block.
|
98
98
|
#
|
99
99
|
# ```ruby
|
100
|
-
# render_in_view_context(arg1, arg2:) do |arg1, arg2:|
|
100
|
+
# render_in_view_context(arg1, arg2: nil) do |arg1, arg2:|
|
101
101
|
# render(MyComponent.new(arg1, arg2))
|
102
102
|
# end
|
103
103
|
#
|
@@ -3,14 +3,9 @@
|
|
3
3
|
module ViewComponent
|
4
4
|
module WithContentHelper
|
5
5
|
def with_content(value)
|
6
|
-
if value.nil?
|
7
|
-
|
8
|
-
|
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
|
data/lib/view_component.rb
CHANGED
@@ -16,12 +16,10 @@ module ViewComponent
|
|
16
16
|
autoload :InlineTemplate
|
17
17
|
autoload :Instrumentation
|
18
18
|
autoload :Preview
|
19
|
-
autoload :PreviewTemplateError
|
20
19
|
autoload :TestHelpers
|
21
20
|
autoload :SystemTestHelpers
|
22
21
|
autoload :TestCase
|
23
22
|
autoload :SystemTestCase
|
24
|
-
autoload :TemplateError
|
25
23
|
autoload :Translatable
|
26
24
|
end
|
27
25
|
|
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: 3.0.0.
|
4
|
+
version: 3.0.0.rc6
|
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-
|
11
|
+
date: 2023-04-12 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: '
|
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: '
|
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
|
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
|
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
|
@@ -363,10 +377,10 @@ files:
|
|
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
|
366
381
|
- lib/view_component/inline_template.rb
|
367
382
|
- lib/view_component/instrumentation.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
|
@@ -378,7 +392,6 @@ files:
|
|
378
392
|
- lib/view_component/slotable.rb
|
379
393
|
- lib/view_component/system_test_case.rb
|
380
394
|
- lib/view_component/system_test_helpers.rb
|
381
|
-
- lib/view_component/template_error.rb
|
382
395
|
- lib/view_component/test_case.rb
|
383
396
|
- lib/view_component/test_helpers.rb
|
384
397
|
- lib/view_component/translatable.rb
|