view_component 2.74.1 → 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/app/controllers/view_components_system_test_controller.rb +7 -0
- data/docs/CHANGELOG.md +139 -21
- data/lib/rails/generators/preview/component_generator.rb +9 -2
- data/lib/view_component/base.rb +14 -19
- data/lib/view_component/compiler.rb +22 -10
- data/lib/view_component/config.rb +24 -7
- 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 +13 -3
- data/lib/view_component/polymorphic_slots.rb +4 -4
- data/lib/view_component/slotable.rb +2 -3
- data/lib/view_component/slotable_v2.rb +11 -9
- 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 +28 -26
- data/lib/view_component/version.rb +2 -2
- data/lib/view_component.rb +5 -3
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bb20706245c43b9c5fa4d11087a2e98332bda53d659f7065874a3c0b8545547
|
4
|
+
data.tar.gz: 13821a1e91da8a8dce8270962b99aa3b84fddb9731f99c2e2acfd143ad017836
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b0ebf7ac54fc2c82374b29f9cceadfe55af73516ad2e4c65dad69cd65a7c63de3e00ef9cdba8b359c1061309f9a0d2f90344374feec2b37211fbfb36282c96b
|
7
|
+
data.tar.gz: 48e156dcc5fa1ac9a6cff64e4cb585d528103452938a515d1e3598b505b03188e89362c393c86c0a05437f9a8c28f22e937e3d706f3da17ae03a7c1371728505
|
data/docs/CHANGELOG.md
CHANGED
@@ -10,6 +10,124 @@ nav_order: 5
|
|
10
10
|
|
11
11
|
## main
|
12
12
|
|
13
|
+
## 2.82.0
|
14
|
+
|
15
|
+
* Revert "Avoid loading ActionView::Base during initialization (#1528)"
|
16
|
+
|
17
|
+
*Jon Rohan*
|
18
|
+
|
19
|
+
* Fix tests using `with_rendered_component_path` with custom layouts.
|
20
|
+
|
21
|
+
*Ian Hollander*
|
22
|
+
|
23
|
+
## 2.81.0
|
24
|
+
|
25
|
+
* Adjust the way response objects are set on the preview controller to work around a recent change in Rails main.
|
26
|
+
|
27
|
+
*Cameron Dutro*
|
28
|
+
|
29
|
+
* Fix typo in "Generate a Stimulus controller" documentation.
|
30
|
+
|
31
|
+
*Ben Trewern*
|
32
|
+
|
33
|
+
* Modify the `render_in_view_context` test helper to forward its args to the block.
|
34
|
+
|
35
|
+
*Cameron Dutro*
|
36
|
+
|
37
|
+
## 2.80.0
|
38
|
+
|
39
|
+
* Move system test endpoint out of the unrelated previews controller.
|
40
|
+
|
41
|
+
*Edwin Mak*
|
42
|
+
|
43
|
+
* Display Ruby 2.7 deprecation notice only once, when starting the application.
|
44
|
+
|
45
|
+
*Henrik Hauge Bjørnskov*
|
46
|
+
|
47
|
+
* Require Rails 5.2+ in gemspec and update documentation.
|
48
|
+
|
49
|
+
*Drew Bragg*
|
50
|
+
|
51
|
+
* Add documentation for using `with_rendered_component_path` with RSpec.
|
52
|
+
|
53
|
+
*Edwin Mak*
|
54
|
+
|
55
|
+
## 2.79.0
|
56
|
+
|
57
|
+
* Add ability to pass explicit `preview_path` to preview generator.
|
58
|
+
|
59
|
+
*Erinna Chen*
|
60
|
+
|
61
|
+
* Add `with_rendered_component_path` helper for writing component system tests.
|
62
|
+
|
63
|
+
*Edwin Mak*
|
64
|
+
|
65
|
+
* Include gem name and deprecation horizon in every deprecation message.
|
66
|
+
|
67
|
+
*Jan Klimo*
|
68
|
+
|
69
|
+
## 2.78.0
|
70
|
+
|
71
|
+
* Support variants with dots in their names.
|
72
|
+
|
73
|
+
*Javi Martín*
|
74
|
+
|
75
|
+
## 2.77.0
|
76
|
+
|
77
|
+
* Support variants with dashes in their names.
|
78
|
+
|
79
|
+
*Javi Martín*
|
80
|
+
|
81
|
+
## 2.76.0
|
82
|
+
|
83
|
+
* `Component.with_collection` supports components that accept splatted keyword arguments.
|
84
|
+
|
85
|
+
*Zee Spencer*
|
86
|
+
|
87
|
+
* Remove `config.view_component.use_consistent_rendering_lifecycle` since it is no longer planned for 3.0.
|
88
|
+
|
89
|
+
*Blake Williams*
|
90
|
+
|
91
|
+
* Prevent polymorphic slots from calculating `content` when setting a slot.
|
92
|
+
|
93
|
+
*Blake Williams*
|
94
|
+
|
95
|
+
* Add ability to pass in the preview class to `render_preview`.
|
96
|
+
|
97
|
+
*Jon Rohan*
|
98
|
+
|
99
|
+
* Fix issue causing PVC tests to fail in CI.
|
100
|
+
|
101
|
+
*Cameron Dutro*
|
102
|
+
|
103
|
+
* Fix YARD docs build task.
|
104
|
+
|
105
|
+
*Hans Lemuet*
|
106
|
+
|
107
|
+
* Add Startup Jobs to list of companies using ViewComponent.
|
108
|
+
|
109
|
+
*Marc Köhlbrugge*
|
110
|
+
|
111
|
+
* Run PVC's accessibility tests in a single process to avoid resource contention in CI.
|
112
|
+
|
113
|
+
*Cameron Dutro*
|
114
|
+
|
115
|
+
## 2.75.0
|
116
|
+
|
117
|
+
* Avoid loading ActionView::Base during Rails initialization.
|
118
|
+
|
119
|
+
*Jonathan del Strother*
|
120
|
+
|
121
|
+
<!-- vale off -->
|
122
|
+
* Mention lambda slots rendering returned values lazily in the guide.
|
123
|
+
|
124
|
+
*Graham Rogers*
|
125
|
+
<!-- vale on -->
|
126
|
+
|
127
|
+
* Add "ViewComponent In The Wild" articles to resources.
|
128
|
+
|
129
|
+
*Alexander Baygeldin*
|
130
|
+
|
13
131
|
## 2.74.1
|
14
132
|
|
15
133
|
* Add more users of ViewComponent to docs.
|
@@ -273,7 +391,7 @@ nav_order: 5
|
|
273
391
|
|
274
392
|
* Revert `Expose Capybara DSL methods directly inside tests.` This change unintentionally broke other Capybara methods and thus introduced a regression. We aren't confident that we can fail forward so we have decided to revert this change.
|
275
393
|
|
276
|
-
*Joel Hawksley
|
394
|
+
*Joel Hawksley, Blake Williams*
|
277
395
|
|
278
396
|
* Revert change making content evaluation consistent.
|
279
397
|
|
@@ -356,7 +474,7 @@ nav_order: 5
|
|
356
474
|
|
357
475
|
* Add @boardfish and @spone as maintainers.
|
358
476
|
|
359
|
-
*Joel Hawksley
|
477
|
+
*Joel Hawksley, Cameron Dutro, Blake Williams*
|
360
478
|
|
361
479
|
* Re-compile updated, inherited templates when class caching is disabled.
|
362
480
|
|
@@ -416,13 +534,13 @@ nav_order: 5
|
|
416
534
|
|
417
535
|
* Restore removed `rendered_component`, marking it for deprecation in v3.0.0.
|
418
536
|
|
419
|
-
*Tyson Gach
|
537
|
+
*Tyson Gach, Richard Macklin, Joel Hawksley*
|
420
538
|
|
421
539
|
## 2.56.1
|
422
540
|
|
423
541
|
* Rename private accessor `rendered_component` to `rendered_content`.
|
424
542
|
|
425
|
-
*Yoshiyuki Hirano
|
543
|
+
*Yoshiyuki Hirano, Simon Dawson*
|
426
544
|
|
427
545
|
## 2.56.0
|
428
546
|
|
@@ -513,7 +631,7 @@ nav_order: 5
|
|
513
631
|
|
514
632
|
* Skip Rails 5.2 in local test environment if using incompatible Ruby version.
|
515
633
|
|
516
|
-
*Cameron Dutro
|
634
|
+
*Cameron Dutro, Blake Williams, Joel Hawksley*
|
517
635
|
|
518
636
|
* Improve landing page documentation.
|
519
637
|
|
@@ -539,7 +657,7 @@ nav_order: 5
|
|
539
657
|
|
540
658
|
* Add the option to use a "global" output buffer so `form_for` and friends can be used with view components.
|
541
659
|
|
542
|
-
*Cameron Dutro
|
660
|
+
*Cameron Dutro, Blake Williams*
|
543
661
|
|
544
662
|
* Fix fragment caching in partials when global output buffer is enabled.
|
545
663
|
* Fix template inheritance when eager loading is disabled.
|
@@ -676,7 +794,7 @@ nav_order: 5
|
|
676
794
|
|
677
795
|
* Add generators to support `tailwindcss-rails`.
|
678
796
|
|
679
|
-
*Dino Maric
|
797
|
+
*Dino Maric, Hans Lemuet*
|
680
798
|
|
681
799
|
* Add a namespaced component example to docs.
|
682
800
|
|
@@ -857,7 +975,7 @@ nav_order: 5
|
|
857
975
|
|
858
976
|
* Rename internal accessor to use private naming.
|
859
977
|
|
860
|
-
*Joel Hawksley
|
978
|
+
*Joel Hawksley, Blake Williams, Cameron Dutro*
|
861
979
|
|
862
980
|
* Add Github repo link to docs website header.
|
863
981
|
|
@@ -925,7 +1043,7 @@ nav_order: 5
|
|
925
1043
|
|
926
1044
|
* Add support for `image_path` helper in previews.
|
927
1045
|
|
928
|
-
*Tobias Ahlin
|
1046
|
+
*Tobias Ahlin, Joel Hawksley*
|
929
1047
|
|
930
1048
|
* Add section to docs listing users of ViewComponent. Please submit a PR to add your team to the list!
|
931
1049
|
|
@@ -963,7 +1081,7 @@ nav_order: 5
|
|
963
1081
|
|
964
1082
|
* Fix bug where `helpers` would instantiate and use a new `view_context` in each component.
|
965
1083
|
|
966
|
-
*Blake Williams
|
1084
|
+
*Blake Williams, Ian C. Anderson*
|
967
1085
|
|
968
1086
|
* Implement polymorphic slots as experimental feature. See the Slots documentation to learn more.
|
969
1087
|
|
@@ -990,7 +1108,7 @@ nav_order: 5
|
|
990
1108
|
|
991
1109
|
* Fix bug where `with_collection_parameter` didn't inherit from parent component.
|
992
1110
|
|
993
|
-
*Will Drexler
|
1111
|
+
*Will Drexler, Christian Campoli*
|
994
1112
|
|
995
1113
|
* Allow query parameters in `with_request_url` test helper.
|
996
1114
|
|
@@ -1030,7 +1148,7 @@ nav_order: 5
|
|
1030
1148
|
|
1031
1149
|
* Clarify documentation of `with_variant` as an override of Action Pack.
|
1032
1150
|
|
1033
|
-
*Blake Williams
|
1151
|
+
*Blake Williams, Cameron Dutro, Joel Hawksley*
|
1034
1152
|
|
1035
1153
|
* Update docs page to be called Javascript and CSS, rename Building ViewComponents to Guide.
|
1036
1154
|
|
@@ -1055,7 +1173,7 @@ nav_order: 5
|
|
1055
1173
|
|
1056
1174
|
* Clarify slots example in docs to reduce naming confusion.
|
1057
1175
|
|
1058
|
-
*Joel Hawksley
|
1176
|
+
*Joel Hawksley, Blake Williams*
|
1059
1177
|
|
1060
1178
|
* Fix error in documentation for `render_many` passthrough slots.
|
1061
1179
|
|
@@ -1517,7 +1635,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
|
|
1517
1635
|
|
1518
1636
|
* Add support for templates as ViewComponent::Preview examples.
|
1519
1637
|
|
1520
|
-
*Juan Manuel Ramallo
|
1638
|
+
*Juan Manuel Ramallo*
|
1521
1639
|
|
1522
1640
|
## 2.14.1
|
1523
1641
|
|
@@ -1894,11 +2012,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
|
|
1894
2012
|
|
1895
2013
|
*Rainer Borene*
|
1896
2014
|
|
2015
|
+
<!-- vale off -->
|
1897
2016
|
* Fix edge case issue with extracting variants from less conventional source_locations.
|
1898
2017
|
|
1899
|
-
<!-- vale proselint.GenderBias = NO -->
|
1900
2018
|
*Ryan Workman*
|
1901
|
-
<!-- vale
|
2019
|
+
<!-- vale on -->
|
1902
2020
|
|
1903
2021
|
## v1.6.0
|
1904
2022
|
|
@@ -1916,7 +2034,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
|
|
1916
2034
|
|
1917
2035
|
* Template-less variants fall back to default template.
|
1918
2036
|
|
1919
|
-
*Asger Behncke Jacobsen
|
2037
|
+
*Asger Behncke Jacobsen, Cesario Uy*
|
1920
2038
|
|
1921
2039
|
* Generated tests use new naming convention.
|
1922
2040
|
|
@@ -1932,11 +2050,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
|
|
1932
2050
|
|
1933
2051
|
## v1.5.3
|
1934
2052
|
|
2053
|
+
<!-- vale off -->
|
1935
2054
|
* Add support for RSpec to generators.
|
1936
2055
|
|
1937
|
-
<!-- vale proselint.GenderBias = NO -->
|
1938
2056
|
*Dylan Clark, Ryan Workman*
|
1939
|
-
<!-- vale
|
2057
|
+
<!-- vale on -->
|
1940
2058
|
|
1941
2059
|
* Require controllers as part of setting autoload paths.
|
1942
2060
|
|
@@ -1958,11 +2076,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
|
|
1958
2076
|
|
1959
2077
|
Note: `actionview-component` is now loaded by requiring `actionview/component`, not `actionview/component/base`.
|
1960
2078
|
|
2079
|
+
<!-- vale off -->
|
1961
2080
|
* Fix issue with generating component method signatures.
|
1962
2081
|
|
1963
|
-
<!-- vale proselint.GenderBias = NO -->
|
1964
2082
|
*Ryan Workman, Dylan Clark*
|
1965
|
-
<!-- vale
|
2083
|
+
<!-- vale off -->
|
1966
2084
|
|
1967
2085
|
* Create component generator.
|
1968
2086
|
|
@@ -4,15 +4,22 @@ module Preview
|
|
4
4
|
module Generators
|
5
5
|
class ComponentGenerator < ::Rails::Generators::NamedBase
|
6
6
|
source_root File.expand_path("templates", __dir__)
|
7
|
+
class_option :preview_path, type: :string, desc: "Path for previews, required when multiple preview paths are configured", default: ViewComponent::Base.config.generate.preview_path
|
7
8
|
|
8
9
|
argument :attributes, type: :array, default: [], banner: "attribute"
|
9
10
|
check_class_collision suffix: "ComponentPreview"
|
10
11
|
|
11
12
|
def create_preview_file
|
12
13
|
preview_paths = ViewComponent::Base.config.preview_paths
|
13
|
-
|
14
|
+
optional_path = options[:preview_path]
|
15
|
+
return if preview_paths.count > 1 && optional_path.blank?
|
16
|
+
|
17
|
+
path_prefix = if optional_path.present?
|
18
|
+
optional_path
|
19
|
+
else
|
20
|
+
preview_paths.one? ? preview_paths.first : "test/components/previews"
|
21
|
+
end
|
14
22
|
|
15
|
-
path_prefix = preview_paths.one? ? preview_paths.first : "test/components/previews"
|
16
23
|
template "component_preview.rb", File.join(path_prefix, class_path, "#{file_name}_component_preview.rb")
|
17
24
|
end
|
18
25
|
|
data/lib/view_component/base.rb
CHANGED
@@ -19,9 +19,16 @@ module ViewComponent
|
|
19
19
|
class << self
|
20
20
|
delegate(*ViewComponent::Config.defaults.keys, to: :config)
|
21
21
|
|
22
|
+
# Returns the current config.
|
23
|
+
#
|
24
|
+
# @return [ViewComponent::Config]
|
22
25
|
def config
|
23
26
|
@config ||= ViewComponent::Config.defaults
|
24
27
|
end
|
28
|
+
|
29
|
+
# Replaces the entire config. You shouldn't need to use this directly
|
30
|
+
# unless you're building a `ViewComponent::Config` elsewhere.
|
31
|
+
attr_writer :config
|
25
32
|
end
|
26
33
|
|
27
34
|
include ViewComponent::ContentAreas
|
@@ -123,11 +130,6 @@ module ViewComponent
|
|
123
130
|
before_render
|
124
131
|
|
125
132
|
if render?
|
126
|
-
# Ensure `content` is evaluated before rendering the template, this is
|
127
|
-
# needed so slots and other side-effects are performed before the
|
128
|
-
# component template is evaluated.
|
129
|
-
content if self.class.use_consistent_rendering_lifecycle
|
130
|
-
|
131
133
|
render_template_for(@__vc_variant).to_s + output_postamble
|
132
134
|
else
|
133
135
|
""
|
@@ -333,18 +335,6 @@ module ViewComponent
|
|
333
335
|
# Defaults to `nil`. If this is falsy, `app/components` is used.
|
334
336
|
#
|
335
337
|
|
336
|
-
# Evaluate `#content` before `#call` to ensure side-effects are present
|
337
|
-
# during component renders. This will be the default behavior in a future
|
338
|
-
# release.
|
339
|
-
#
|
340
|
-
# ```ruby
|
341
|
-
# config.view_component.use_consistent_rendering_lifecycle = true
|
342
|
-
# ```
|
343
|
-
#
|
344
|
-
# Defaults to `false`
|
345
|
-
#
|
346
|
-
mattr_accessor :use_consistent_rendering_lifecycle, instance_writer: false, default: false
|
347
|
-
|
348
338
|
# Parent class for generated components
|
349
339
|
#
|
350
340
|
# ```ruby
|
@@ -412,7 +402,7 @@ module ViewComponent
|
|
412
402
|
# Find sidecar files for the given extensions.
|
413
403
|
#
|
414
404
|
# The provided array of extensions is expected to contain
|
415
|
-
# strings starting without the
|
405
|
+
# strings starting without the dot, example: `["erb", "haml"]`.
|
416
406
|
#
|
417
407
|
# For example, one might collect sidecar CSS files that need to be compiled.
|
418
408
|
# @param extensions [Array<String>] Extensions of which to return matching sidecar files.
|
@@ -590,7 +580,7 @@ module ViewComponent
|
|
590
580
|
parameter = validate_default ? collection_parameter : provided_collection_parameter
|
591
581
|
|
592
582
|
return unless parameter
|
593
|
-
return if initialize_parameter_names.include?(parameter)
|
583
|
+
return if initialize_parameter_names.include?(parameter) || splatted_keyword_argument_present?
|
594
584
|
|
595
585
|
# If Ruby can't parse the component class, then the initalize
|
596
586
|
# parameters will be empty and ViewComponent will not be able to render
|
@@ -646,6 +636,11 @@ module ViewComponent
|
|
646
636
|
|
647
637
|
private
|
648
638
|
|
639
|
+
def splatted_keyword_argument_present?
|
640
|
+
initialize_parameters.flatten.include?(:keyrest) &&
|
641
|
+
!initialize_parameters.include?([:keyrest, :**]) # Un-named splatted keyword args don't count!
|
642
|
+
end
|
643
|
+
|
649
644
|
def initialize_parameter_names
|
650
645
|
return attribute_names.map(&:to_sym) if respond_to?(:attribute_names)
|
651
646
|
|
@@ -30,10 +30,6 @@ module ViewComponent
|
|
30
30
|
return if compiled? && !force
|
31
31
|
return if component_class == ViewComponent::Base
|
32
32
|
|
33
|
-
if RUBY_VERSION < "2.7.0"
|
34
|
-
ViewComponent::Deprecation.warn("Support for Ruby versions < 2.7.0 will be removed in v3.0.0.")
|
35
|
-
end
|
36
|
-
|
37
33
|
component_class.superclass.compile(raise_errors: raise_errors) if should_compile_superclass?
|
38
34
|
subclass_instance_methods = component_class.instance_methods(false)
|
39
35
|
|
@@ -51,9 +47,8 @@ module ViewComponent
|
|
51
47
|
end
|
52
48
|
|
53
49
|
if subclass_instance_methods.include?(:before_render_check)
|
54
|
-
ViewComponent::Deprecation.
|
55
|
-
"
|
56
|
-
"To fix this issue, use `#before_render` instead."
|
50
|
+
ViewComponent::Deprecation.deprecation_warning(
|
51
|
+
"`before_render_check`", :"`before_render`"
|
57
52
|
)
|
58
53
|
end
|
59
54
|
|
@@ -92,7 +87,7 @@ module ViewComponent
|
|
92
87
|
|
93
88
|
def define_render_template_for
|
94
89
|
variant_elsifs = variants.compact.uniq.map do |variant|
|
95
|
-
"elsif variant.to_sym ==
|
90
|
+
"elsif variant.to_sym == :'#{variant}'\n #{call_method_name(variant)}"
|
96
91
|
end.join("\n")
|
97
92
|
|
98
93
|
body = <<-RUBY
|
@@ -163,6 +158,19 @@ module ViewComponent
|
|
163
158
|
"There can only be a template file or inline render method per variant."
|
164
159
|
end
|
165
160
|
|
161
|
+
uniq_variants = variants.compact.uniq
|
162
|
+
normalized_variants = uniq_variants.map { |variant| normalized_variant_name(variant) }
|
163
|
+
|
164
|
+
colliding_variants = uniq_variants.select do |variant|
|
165
|
+
normalized_variants.count(normalized_variant_name(variant)) > 1
|
166
|
+
end
|
167
|
+
|
168
|
+
unless colliding_variants.empty?
|
169
|
+
errors <<
|
170
|
+
"Colliding templates #{colliding_variants.sort.map { |v| "'#{v}'" }.to_sentence} " \
|
171
|
+
"found in #{component_class}."
|
172
|
+
end
|
173
|
+
|
166
174
|
errors
|
167
175
|
end
|
168
176
|
end
|
@@ -176,7 +184,7 @@ module ViewComponent
|
|
176
184
|
pieces = File.basename(path).split(".")
|
177
185
|
memo << {
|
178
186
|
path: path,
|
179
|
-
variant: pieces.
|
187
|
+
variant: pieces[1..-2].join(".").split("+").second&.to_sym,
|
180
188
|
handler: pieces.last
|
181
189
|
}
|
182
190
|
end
|
@@ -234,12 +242,16 @@ module ViewComponent
|
|
234
242
|
|
235
243
|
def call_method_name(variant)
|
236
244
|
if variant.present? && variants.include?(variant)
|
237
|
-
"call_#{variant}"
|
245
|
+
"call_#{normalized_variant_name(variant)}"
|
238
246
|
else
|
239
247
|
"call"
|
240
248
|
end
|
241
249
|
end
|
242
250
|
|
251
|
+
def normalized_variant_name(variant)
|
252
|
+
variant.to_s.gsub("-", "__").gsub(".", "___")
|
253
|
+
end
|
254
|
+
|
243
255
|
def should_compile_superclass?
|
244
256
|
development? &&
|
245
257
|
templates.empty? &&
|
@@ -12,7 +12,7 @@ module ViewComponent
|
|
12
12
|
|
13
13
|
def defaults
|
14
14
|
ActiveSupport::OrderedOptions.new.merge!({
|
15
|
-
generate:
|
15
|
+
generate: default_generate_options,
|
16
16
|
preview_controller: "ViewComponentsController",
|
17
17
|
preview_route: "/rails/view_components",
|
18
18
|
show_previews_source: false,
|
@@ -34,25 +34,25 @@ module ViewComponent
|
|
34
34
|
# All options under this namespace default to `false` unless otherwise
|
35
35
|
# stated.
|
36
36
|
#
|
37
|
-
# ####
|
37
|
+
# #### `#sidecar`
|
38
38
|
#
|
39
39
|
# Always generate a component with a sidecar directory:
|
40
40
|
#
|
41
41
|
# config.view_component.generate.sidecar = true
|
42
42
|
#
|
43
|
-
# ####
|
43
|
+
# #### `#stimulus_controller`
|
44
44
|
#
|
45
45
|
# Always generate a Stimulus controller alongside the component:
|
46
46
|
#
|
47
47
|
# config.view_component.generate.stimulus_controller = true
|
48
48
|
#
|
49
|
-
# ####
|
49
|
+
# #### `#locale`
|
50
50
|
#
|
51
51
|
# Always generate translations file alongside the component:
|
52
52
|
#
|
53
53
|
# config.view_component.generate.locale = true
|
54
54
|
#
|
55
|
-
# ####
|
55
|
+
# #### `#distinct_locale_files`
|
56
56
|
#
|
57
57
|
# Always generate as many translations files as available locales:
|
58
58
|
#
|
@@ -61,11 +61,22 @@ module ViewComponent
|
|
61
61
|
# One file will be generated for each configured `I18n.available_locales`,
|
62
62
|
# falling back to `[:en]` when no `available_locales` is defined.
|
63
63
|
#
|
64
|
-
# ####
|
64
|
+
# #### `#preview`
|
65
65
|
#
|
66
66
|
# Always generate a preview alongside the component:
|
67
67
|
#
|
68
68
|
# config.view_component.generate.preview = true
|
69
|
+
#
|
70
|
+
# #### #preview_path
|
71
|
+
#
|
72
|
+
# Path to generate preview:
|
73
|
+
#
|
74
|
+
# config.view_component.generate.preview_path = "test/components/previews"
|
75
|
+
#
|
76
|
+
# Required when there is more than one path defined in preview_paths.
|
77
|
+
# Defaults to `""`. If this is blank, the generator will use
|
78
|
+
# `ViewComponent.config.preview_paths` if defined,
|
79
|
+
# `"test/components/previews"` otherwise
|
69
80
|
|
70
81
|
# @!attribute preview_controller
|
71
82
|
# @return [String]
|
@@ -135,6 +146,12 @@ module ViewComponent
|
|
135
146
|
|
136
147
|
["#{Rails.root}/test/components/previews"]
|
137
148
|
end
|
149
|
+
|
150
|
+
def default_generate_options
|
151
|
+
options = ActiveSupport::OrderedOptions.new(false)
|
152
|
+
options.preview_path = ""
|
153
|
+
options
|
154
|
+
end
|
138
155
|
end
|
139
156
|
|
140
157
|
def initialize
|
@@ -146,7 +163,7 @@ module ViewComponent
|
|
146
163
|
end
|
147
164
|
|
148
165
|
def preview_path=(new_value)
|
149
|
-
ViewComponent::Deprecation.
|
166
|
+
ViewComponent::Deprecation.deprecation_warning("`preview_path`", :"`preview_paths`")
|
150
167
|
self.preview_paths = Array.wrap(new_value)
|
151
168
|
end
|
152
169
|
|
@@ -31,9 +31,8 @@ module ViewComponent
|
|
31
31
|
|
32
32
|
class_methods do
|
33
33
|
def with_content_areas(*areas)
|
34
|
-
ViewComponent::Deprecation.
|
35
|
-
"`with_content_areas`
|
36
|
-
"Use slots (https://viewcomponent.org/guide/slots.html) instead."
|
34
|
+
ViewComponent::Deprecation.deprecation_warning(
|
35
|
+
"`with_content_areas`", "use slots (https://viewcomponent.org/guide/slots.html) instead"
|
37
36
|
)
|
38
37
|
|
39
38
|
if areas.include?(:content)
|
@@ -3,6 +3,6 @@
|
|
3
3
|
require "active_support/deprecation"
|
4
4
|
|
5
5
|
module ViewComponent
|
6
|
-
DEPRECATION_HORIZON = 3
|
7
|
-
Deprecation = ActiveSupport::Deprecation.new(DEPRECATION_HORIZON
|
6
|
+
DEPRECATION_HORIZON = "3.0.0"
|
7
|
+
Deprecation = ActiveSupport::Deprecation.new(DEPRECATION_HORIZON, "ViewComponent")
|
8
8
|
end
|
@@ -131,6 +131,12 @@ module ViewComponent
|
|
131
131
|
end
|
132
132
|
end
|
133
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
|
+
|
134
140
|
app.executor.to_run :before do
|
135
141
|
CompileCache.invalidate! unless ActionView::Base.cache_template_loading
|
136
142
|
end
|
@@ -138,13 +144,17 @@ module ViewComponent
|
|
138
144
|
end
|
139
145
|
end
|
140
146
|
|
147
|
+
if RUBY_VERSION < "2.7.0"
|
148
|
+
ViewComponent::Deprecation.deprecation_warning("Support for Ruby versions < 2.7.0")
|
149
|
+
end
|
150
|
+
|
141
151
|
# :nocov:
|
142
152
|
unless defined?(ViewComponent::Base)
|
143
153
|
require "view_component/deprecation"
|
144
154
|
|
145
|
-
ViewComponent::Deprecation.
|
146
|
-
"
|
147
|
-
|
155
|
+
ViewComponent::Deprecation.deprecation_warning(
|
156
|
+
"Manually loading the engine",
|
157
|
+
"remove `require \"view_component/engine\"`"
|
148
158
|
)
|
149
159
|
|
150
160
|
require "view_component"
|
@@ -62,9 +62,9 @@ module ViewComponent
|
|
62
62
|
|
63
63
|
define_method(setter_name) do |*args, &block|
|
64
64
|
if _warn_on_deprecated_slot_setter
|
65
|
-
ViewComponent::Deprecation.
|
66
|
-
"polymorphic slot setters like `#{setter_name}`
|
67
|
-
"
|
65
|
+
ViewComponent::Deprecation.deprecation_warning(
|
66
|
+
"Using polymorphic slot setters like `#{setter_name}`",
|
67
|
+
:"`with_#{setter_name}`"
|
68
68
|
)
|
69
69
|
end
|
70
70
|
|
@@ -89,7 +89,7 @@ module ViewComponent
|
|
89
89
|
def set_polymorphic_slot(slot_name, poly_type = nil, *args, &block)
|
90
90
|
slot_definition = self.class.registered_slots[slot_name]
|
91
91
|
|
92
|
-
if !slot_definition[:collection] &&
|
92
|
+
if !slot_definition[:collection] && (defined?(@__vc_set_slots) && @__vc_set_slots[slot_name])
|
93
93
|
raise ArgumentError, "content for slot '#{slot_name}' has already been provided"
|
94
94
|
end
|
95
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|
|
@@ -93,10 +93,12 @@ module ViewComponent
|
|
93
93
|
else
|
94
94
|
if _warn_on_deprecated_slot_setter
|
95
95
|
stack = caller_locations(3)
|
96
|
-
msg = "Setting a slot with `##{slot_name}` is deprecated and will be removed in ViewComponent v3.0.0. " \
|
97
|
-
"Use `#with_#{slot_name}` to set the slot instead."
|
98
96
|
|
99
|
-
ViewComponent::Deprecation.
|
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
|
+
)
|
100
102
|
end
|
101
103
|
|
102
104
|
set_slot(slot_name, nil, *args, &block)
|
@@ -159,9 +161,9 @@ module ViewComponent
|
|
159
161
|
|
160
162
|
define_method singular_name do |*args, &block|
|
161
163
|
if _warn_on_deprecated_slot_setter
|
162
|
-
ViewComponent::Deprecation.
|
163
|
-
"Setting a slot with `##{singular_name}`
|
164
|
-
"
|
164
|
+
ViewComponent::Deprecation.deprecation_warning(
|
165
|
+
"Setting a slot with `##{singular_name}`",
|
166
|
+
"use `#with_#{singular_name}` to set the slot instead"
|
165
167
|
)
|
166
168
|
end
|
167
169
|
|
@@ -187,9 +189,9 @@ module ViewComponent
|
|
187
189
|
get_slot(slot_name)
|
188
190
|
else
|
189
191
|
if _warn_on_deprecated_slot_setter
|
190
|
-
ViewComponent::Deprecation.
|
191
|
-
"Setting a slot with `##{slot_name}`
|
192
|
-
"
|
192
|
+
ViewComponent::Deprecation.deprecation_warning(
|
193
|
+
"Setting a slot with `##{slot_name}`",
|
194
|
+
"use `#with_#{slot_name}` to set the slot instead"
|
193
195
|
)
|
194
196
|
end
|
195
197
|
|
@@ -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
|
@@ -35,10 +35,7 @@ module ViewComponent
|
|
35
35
|
#
|
36
36
|
# @return [String]
|
37
37
|
def rendered_component
|
38
|
-
ViewComponent::Deprecation.
|
39
|
-
"`rendered_component` is deprecated and will be removed in v3.0.0. " \
|
40
|
-
"Use `page` instead."
|
41
|
-
)
|
38
|
+
ViewComponent::Deprecation.deprecation_warning("`rendered_component`", :"`page`")
|
42
39
|
|
43
40
|
rendered_content
|
44
41
|
end
|
@@ -81,22 +78,10 @@ module ViewComponent
|
|
81
78
|
# In RSpec, `Preview` is appended to `described_class`.
|
82
79
|
#
|
83
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.
|
84
82
|
# @param params [Hash] Parameters to be passed to the preview.
|
85
83
|
# @return [Nokogiri::HTML]
|
86
|
-
def render_preview(name, params: {})
|
87
|
-
begin
|
88
|
-
preview_klass = if respond_to?(:described_class)
|
89
|
-
raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
|
90
|
-
|
91
|
-
"#{described_class}Preview"
|
92
|
-
else
|
93
|
-
self.class.name.gsub("Test", "Preview")
|
94
|
-
end
|
95
|
-
preview_klass = preview_klass.constantize
|
96
|
-
rescue NameError
|
97
|
-
raise NameError, "`render_preview` expected to find #{preview_klass}, but it does not exist."
|
98
|
-
end
|
99
|
-
|
84
|
+
def render_preview(name, from: preview_class, params: {})
|
100
85
|
previews_controller = build_controller(Rails.application.config.view_component.preview_controller.constantize)
|
101
86
|
|
102
87
|
# From what I can tell, it's not possible to overwrite all request parameters
|
@@ -105,8 +90,8 @@ module ViewComponent
|
|
105
90
|
previews_controller.request.params[k] = v
|
106
91
|
end
|
107
92
|
|
108
|
-
previews_controller.request.params[:path] = "#{
|
109
|
-
previews_controller.
|
93
|
+
previews_controller.request.params[:path] = "#{from.preview_name}/#{name}"
|
94
|
+
previews_controller.set_response!(ActionDispatch::Response.new)
|
110
95
|
result = previews_controller.previews
|
111
96
|
|
112
97
|
@rendered_content = result
|
@@ -114,21 +99,23 @@ module ViewComponent
|
|
114
99
|
Nokogiri::HTML.fragment(@rendered_content)
|
115
100
|
end
|
116
101
|
|
117
|
-
# Execute the given block in the view context
|
118
|
-
# `Capybara::Node::Simple`, allowing for
|
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.
|
119
105
|
#
|
120
106
|
# ```ruby
|
121
|
-
# render_in_view_context do
|
122
|
-
# render(MyComponent.new)
|
107
|
+
# render_in_view_context(arg1, arg2:) do |arg1, arg2:|
|
108
|
+
# render(MyComponent.new(arg1, arg2))
|
123
109
|
# end
|
124
110
|
#
|
125
111
|
# assert_text("Hello, World!")
|
126
112
|
# ```
|
127
|
-
def render_in_view_context(&block)
|
113
|
+
def render_in_view_context(*args, &block)
|
128
114
|
@page = nil
|
129
|
-
@rendered_content = controller.view_context.instance_exec(&block)
|
115
|
+
@rendered_content = controller.view_context.instance_exec(*args, &block)
|
130
116
|
Nokogiri::HTML.fragment(@rendered_content)
|
131
117
|
end
|
118
|
+
ruby2_keywords(:render_in_view_context) if respond_to?(:ruby2_keywords, true)
|
132
119
|
|
133
120
|
# @private
|
134
121
|
def controller
|
@@ -216,5 +203,20 @@ module ViewComponent
|
|
216
203
|
def build_controller(klass)
|
217
204
|
klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
|
218
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
|
219
221
|
end
|
220
222
|
end
|
data/lib/view_component.rb
CHANGED
@@ -16,16 +16,18 @@ module ViewComponent
|
|
16
16
|
autoload :Preview
|
17
17
|
autoload :PreviewTemplateError
|
18
18
|
autoload :TestHelpers
|
19
|
+
autoload :SystemTestHelpers
|
19
20
|
autoload :TestCase
|
21
|
+
autoload :SystemTestCase
|
20
22
|
autoload :TemplateError
|
21
23
|
autoload :Translatable
|
22
24
|
end
|
23
25
|
|
24
26
|
# :nocov:
|
25
27
|
if defined?(ViewComponent::Engine)
|
26
|
-
ViewComponent::Deprecation.
|
27
|
-
"Manually loading the engine
|
28
|
-
"
|
28
|
+
ViewComponent::Deprecation.deprecation_warning(
|
29
|
+
"Manually loading the engine",
|
30
|
+
"remove `require \"view_component/engine\"`"
|
29
31
|
)
|
30
32
|
elsif defined?(Rails::Engine)
|
31
33
|
require "view_component/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.
|
4
|
+
version: 2.82.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:
|
11
|
+
date: 2023-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.
|
19
|
+
version: 5.2.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '8.0'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 5.
|
29
|
+
version: 5.2.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '8.0'
|
@@ -322,6 +322,7 @@ files:
|
|
322
322
|
- app/assets/vendor/prism.min.js
|
323
323
|
- app/controllers/concerns/view_component/preview_actions.rb
|
324
324
|
- app/controllers/view_components_controller.rb
|
325
|
+
- app/controllers/view_components_system_test_controller.rb
|
325
326
|
- app/helpers/preview_helper.rb
|
326
327
|
- app/views/test_mailer/test_email.html.erb
|
327
328
|
- app/views/view_components/_preview_source.html.erb
|
@@ -377,6 +378,8 @@ files:
|
|
377
378
|
- lib/view_component/slot_v2.rb
|
378
379
|
- lib/view_component/slotable.rb
|
379
380
|
- lib/view_component/slotable_v2.rb
|
381
|
+
- lib/view_component/system_test_case.rb
|
382
|
+
- lib/view_component/system_test_helpers.rb
|
380
383
|
- lib/view_component/template_error.rb
|
381
384
|
- lib/view_component/test_case.rb
|
382
385
|
- lib/view_component/test_helpers.rb
|