view_component 2.75.0 → 2.77.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0856bb7b57478e7604bb8f129a36448c937907308536649c59dc62a324fb8645'
4
- data.tar.gz: 2211a54534c91373217a438c504d737054e538bb0f019d574eadd705b02b47ae
3
+ metadata.gz: fb24cfba68b7323e80beee43cfb7a676ddc833bc87d63201d953d16301defe5d
4
+ data.tar.gz: 40599c33c49d1dcaa29ae1ec0b6b9e93f191735c2e28207d88717f3f9c77a561
5
5
  SHA512:
6
- metadata.gz: 21585851a66d7a087e33a43a24c53284d5dd633703f636d202bf583f19d6c25b31830ebf47e7757ef38fa36ff981144ee16d4fe9d5dbc87eb7c2baddbddd039c
7
- data.tar.gz: f16688c10f6c3fe6928573b199b2313436a8462e7fbb8d94b12aff9a36cde5cbbb090f8f9a2f3561c6dfa2b264192df746bc329bcb899905ca27046e60349d6e
6
+ metadata.gz: b6dd24af9a10eae0a9fc81c18570fe410686bad3db5cbb9840ee0f52038185eff956c64d260b9231d75226ae7e06a7fcdcafcbc4c37214917bf7155b64d2dc59
7
+ data.tar.gz: 863f21e3be9102ddc02b6a20a7c804b4b1490c7714fbbf2ea848b79a3b5da6cec960afa28fe7bb752e882da6cb4df89a4db67a7d462dfaaf40261b8b2bbf64d1
data/docs/CHANGELOG.md CHANGED
@@ -10,15 +10,57 @@ nav_order: 5
10
10
 
11
11
  ## main
12
12
 
13
+ ## 2.77.0
14
+
15
+ * Support variants with dashes in their names.
16
+
17
+ *Javi Martín*
18
+
19
+ ## 2.76.0
20
+
21
+ * `Component.with_collection` supports components that accept splatted keyword arguments.
22
+
23
+ *Zee Spencer*
24
+
25
+ * Remove `config.view_component.use_consistent_rendering_lifecycle` since it is no longer planned for 3.0.
26
+
27
+ *Blake Williams*
28
+
29
+ * Prevent polymorphic slots from calculating `content` when setting a slot.
30
+
31
+ *Blake Williams*
32
+
33
+ * Add ability to pass in the preview class to `render_preview`.
34
+
35
+ *Jon Rohan*
36
+
37
+ * Fix issue causing PVC tests to fail in CI.
38
+
39
+ *Cameron Dutro*
40
+
41
+ * Fix YARD docs build task.
42
+
43
+ *Hans Lemuet*
44
+
45
+ * Add Startup Jobs to list of companies using ViewComponent.
46
+
47
+ *Marc Köhlbrugge*
48
+
49
+ * Run PVC's accessibility tests in a single process to avoid resource contention in CI.
50
+
51
+ *Cameron Dutro*
52
+
13
53
  ## 2.75.0
14
54
 
15
55
  * Avoid loading ActionView::Base during Rails initialization.
16
56
 
17
57
  *Jonathan del Strother*
18
58
 
59
+ <!-- vale off -->
19
60
  * Mention lambda slots rendering returned values lazily in the guide.
20
61
 
21
62
  *Graham Rogers*
63
+ <!-- vale on -->
22
64
 
23
65
  * Add "ViewComponent In The Wild" articles to resources.
24
66
 
@@ -287,7 +329,7 @@ nav_order: 5
287
329
 
288
330
  * 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.
289
331
 
290
- *Joel Hawksley*, *Blake Williams*
332
+ *Joel Hawksley, Blake Williams*
291
333
 
292
334
  * Revert change making content evaluation consistent.
293
335
 
@@ -370,7 +412,7 @@ nav_order: 5
370
412
 
371
413
  * Add @boardfish and @spone as maintainers.
372
414
 
373
- *Joel Hawksley*, *Cameron Dutro*, *Blake Williams*
415
+ *Joel Hawksley, Cameron Dutro, Blake Williams*
374
416
 
375
417
  * Re-compile updated, inherited templates when class caching is disabled.
376
418
 
@@ -430,13 +472,13 @@ nav_order: 5
430
472
 
431
473
  * Restore removed `rendered_component`, marking it for deprecation in v3.0.0.
432
474
 
433
- *Tyson Gach*, *Richard Macklin*, *Joel Hawksley*
475
+ *Tyson Gach, Richard Macklin, Joel Hawksley*
434
476
 
435
477
  ## 2.56.1
436
478
 
437
479
  * Rename private accessor `rendered_component` to `rendered_content`.
438
480
 
439
- *Yoshiyuki Hirano*, *Simon Dawson*
481
+ *Yoshiyuki Hirano, Simon Dawson*
440
482
 
441
483
  ## 2.56.0
442
484
 
@@ -527,7 +569,7 @@ nav_order: 5
527
569
 
528
570
  * Skip Rails 5.2 in local test environment if using incompatible Ruby version.
529
571
 
530
- *Cameron Dutro*, *Blake Williams*, *Joel Hawksley*
572
+ *Cameron Dutro, Blake Williams, Joel Hawksley*
531
573
 
532
574
  * Improve landing page documentation.
533
575
 
@@ -553,7 +595,7 @@ nav_order: 5
553
595
 
554
596
  * Add the option to use a "global" output buffer so `form_for` and friends can be used with view components.
555
597
 
556
- *Cameron Dutro*, *Blake Williams*
598
+ *Cameron Dutro, Blake Williams*
557
599
 
558
600
  * Fix fragment caching in partials when global output buffer is enabled.
559
601
  * Fix template inheritance when eager loading is disabled.
@@ -690,7 +732,7 @@ nav_order: 5
690
732
 
691
733
  * Add generators to support `tailwindcss-rails`.
692
734
 
693
- *Dino Maric*, *Hans Lemuet*
735
+ *Dino Maric, Hans Lemuet*
694
736
 
695
737
  * Add a namespaced component example to docs.
696
738
 
@@ -871,7 +913,7 @@ nav_order: 5
871
913
 
872
914
  * Rename internal accessor to use private naming.
873
915
 
874
- *Joel Hawksley*, *Blake Williams*, *Cameron Dutro*
916
+ *Joel Hawksley, Blake Williams, Cameron Dutro*
875
917
 
876
918
  * Add Github repo link to docs website header.
877
919
 
@@ -939,7 +981,7 @@ nav_order: 5
939
981
 
940
982
  * Add support for `image_path` helper in previews.
941
983
 
942
- *Tobias Ahlin*, *Joel Hawksley*
984
+ *Tobias Ahlin, Joel Hawksley*
943
985
 
944
986
  * Add section to docs listing users of ViewComponent. Please submit a PR to add your team to the list!
945
987
 
@@ -977,7 +1019,7 @@ nav_order: 5
977
1019
 
978
1020
  * Fix bug where `helpers` would instantiate and use a new `view_context` in each component.
979
1021
 
980
- *Blake Williams*, *Ian C. Anderson*
1022
+ *Blake Williams, Ian C. Anderson*
981
1023
 
982
1024
  * Implement polymorphic slots as experimental feature. See the Slots documentation to learn more.
983
1025
 
@@ -1004,7 +1046,7 @@ nav_order: 5
1004
1046
 
1005
1047
  * Fix bug where `with_collection_parameter` didn't inherit from parent component.
1006
1048
 
1007
- *Will Drexler*, *Christian Campoli*
1049
+ *Will Drexler, Christian Campoli*
1008
1050
 
1009
1051
  * Allow query parameters in `with_request_url` test helper.
1010
1052
 
@@ -1044,7 +1086,7 @@ nav_order: 5
1044
1086
 
1045
1087
  * Clarify documentation of `with_variant` as an override of Action Pack.
1046
1088
 
1047
- *Blake Williams*, *Cameron Dutro*, *Joel Hawksley*
1089
+ *Blake Williams, Cameron Dutro, Joel Hawksley*
1048
1090
 
1049
1091
  * Update docs page to be called Javascript and CSS, rename Building ViewComponents to Guide.
1050
1092
 
@@ -1069,7 +1111,7 @@ nav_order: 5
1069
1111
 
1070
1112
  * Clarify slots example in docs to reduce naming confusion.
1071
1113
 
1072
- *Joel Hawksley*, *Blake Williams*
1114
+ *Joel Hawksley, Blake Williams*
1073
1115
 
1074
1116
  * Fix error in documentation for `render_many` passthrough slots.
1075
1117
 
@@ -1531,7 +1573,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
1531
1573
 
1532
1574
  * Add support for templates as ViewComponent::Preview examples.
1533
1575
 
1534
- *Juan Manuel Ramallo
1576
+ *Juan Manuel Ramallo*
1535
1577
 
1536
1578
  ## 2.14.1
1537
1579
 
@@ -1908,11 +1950,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
1908
1950
 
1909
1951
  *Rainer Borene*
1910
1952
 
1953
+ <!-- vale off -->
1911
1954
  * Fix edge case issue with extracting variants from less conventional source_locations.
1912
1955
 
1913
- <!-- vale proselint.GenderBias = NO -->
1914
1956
  *Ryan Workman*
1915
- <!-- vale proselint.GenderBias = YES -->
1957
+ <!-- vale on -->
1916
1958
 
1917
1959
  ## v1.6.0
1918
1960
 
@@ -1930,7 +1972,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
1930
1972
 
1931
1973
  * Template-less variants fall back to default template.
1932
1974
 
1933
- *Asger Behncke Jacobsen*, *Cesario Uy*
1975
+ *Asger Behncke Jacobsen, Cesario Uy*
1934
1976
 
1935
1977
  * Generated tests use new naming convention.
1936
1978
 
@@ -1946,11 +1988,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
1946
1988
 
1947
1989
  ## v1.5.3
1948
1990
 
1991
+ <!-- vale off -->
1949
1992
  * Add support for RSpec to generators.
1950
1993
 
1951
- <!-- vale proselint.GenderBias = NO -->
1952
1994
  *Dylan Clark, Ryan Workman*
1953
- <!-- vale proselint.GenderBias = YES -->
1995
+ <!-- vale on -->
1954
1996
 
1955
1997
  * Require controllers as part of setting autoload paths.
1956
1998
 
@@ -1972,11 +2014,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
1972
2014
 
1973
2015
  Note: `actionview-component` is now loaded by requiring `actionview/component`, not `actionview/component/base`.
1974
2016
 
2017
+ <!-- vale off -->
1975
2018
  * Fix issue with generating component method signatures.
1976
2019
 
1977
- <!-- vale proselint.GenderBias = NO -->
1978
2020
  *Ryan Workman, Dylan Clark*
1979
- <!-- vale proselint.GenderBias = YES -->
2021
+ <!-- vale off -->
1980
2022
 
1981
2023
  * Create component generator.
1982
2024
 
@@ -19,9 +19,15 @@ 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 ||= ActiveSupport::OrderedOptions.new
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.
25
31
  attr_writer :config
26
32
  end
27
33
 
@@ -124,11 +130,6 @@ module ViewComponent
124
130
  before_render
125
131
 
126
132
  if render?
127
- # Ensure `content` is evaluated before rendering the template, this is
128
- # needed so slots and other side-effects are performed before the
129
- # component template is evaluated.
130
- content if self.class.use_consistent_rendering_lifecycle
131
-
132
133
  render_template_for(@__vc_variant).to_s + output_postamble
133
134
  else
134
135
  ""
@@ -334,18 +335,6 @@ module ViewComponent
334
335
  # Defaults to `nil`. If this is falsy, `app/components` is used.
335
336
  #
336
337
 
337
- # Evaluate `#content` before `#call` to ensure side-effects are present
338
- # during component renders. This will be the default behavior in a future
339
- # release.
340
- #
341
- # ```ruby
342
- # config.view_component.use_consistent_rendering_lifecycle = true
343
- # ```
344
- #
345
- # Defaults to `false`
346
- #
347
- mattr_accessor :use_consistent_rendering_lifecycle, instance_writer: false, default: false
348
-
349
338
  # Parent class for generated components
350
339
  #
351
340
  # ```ruby
@@ -413,7 +402,7 @@ module ViewComponent
413
402
  # Find sidecar files for the given extensions.
414
403
  #
415
404
  # The provided array of extensions is expected to contain
416
- # strings starting without the "dot", example: `["erb", "haml"]`.
405
+ # strings starting without the dot, example: `["erb", "haml"]`.
417
406
  #
418
407
  # For example, one might collect sidecar CSS files that need to be compiled.
419
408
  # @param extensions [Array<String>] Extensions of which to return matching sidecar files.
@@ -591,7 +580,7 @@ module ViewComponent
591
580
  parameter = validate_default ? collection_parameter : provided_collection_parameter
592
581
 
593
582
  return unless parameter
594
- return if initialize_parameter_names.include?(parameter)
583
+ return if initialize_parameter_names.include?(parameter) || splatted_keyword_argument_present?
595
584
 
596
585
  # If Ruby can't parse the component class, then the initalize
597
586
  # parameters will be empty and ViewComponent will not be able to render
@@ -647,6 +636,11 @@ module ViewComponent
647
636
 
648
637
  private
649
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
+
650
644
  def initialize_parameter_names
651
645
  return attribute_names.map(&:to_sym) if respond_to?(:attribute_names)
652
646
 
@@ -92,7 +92,7 @@ module ViewComponent
92
92
 
93
93
  def define_render_template_for
94
94
  variant_elsifs = variants.compact.uniq.map do |variant|
95
- "elsif variant.to_sym == :#{variant}\n #{call_method_name(variant)}"
95
+ "elsif variant.to_sym == :'#{variant}'\n #{call_method_name(variant)}"
96
96
  end.join("\n")
97
97
 
98
98
  body = <<-RUBY
@@ -163,6 +163,19 @@ module ViewComponent
163
163
  "There can only be a template file or inline render method per variant."
164
164
  end
165
165
 
166
+ uniq_variants = variants.compact.uniq
167
+ normalized_variants = uniq_variants.map { |variant| normalized_variant_name(variant) }
168
+
169
+ colliding_variants = uniq_variants.select do |variant|
170
+ normalized_variants.count(normalized_variant_name(variant)) > 1
171
+ end
172
+
173
+ unless colliding_variants.empty?
174
+ errors <<
175
+ "Colliding templates #{colliding_variants.sort.map { |v| "'#{v}'" }.to_sentence} " \
176
+ "found in #{component_class}."
177
+ end
178
+
166
179
  errors
167
180
  end
168
181
  end
@@ -234,12 +247,16 @@ module ViewComponent
234
247
 
235
248
  def call_method_name(variant)
236
249
  if variant.present? && variants.include?(variant)
237
- "call_#{variant}"
250
+ "call_#{normalized_variant_name(variant)}"
238
251
  else
239
252
  "call"
240
253
  end
241
254
  end
242
255
 
256
+ def normalized_variant_name(variant)
257
+ variant.to_s.gsub("-", "__")
258
+ end
259
+
243
260
  def should_compile_superclass?
244
261
  development? &&
245
262
  templates.empty? &&
@@ -34,25 +34,25 @@ module ViewComponent
34
34
  # All options under this namespace default to `false` unless otherwise
35
35
  # stated.
36
36
  #
37
- # #### #sidecar
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
- # #### #stimulus_controller
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
- # #### #locale
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
- # #### #distinct_locale_files
55
+ # #### `#distinct_locale_files`
56
56
  #
57
57
  # Always generate as many translations files as available locales:
58
58
  #
@@ -61,7 +61,7 @@ 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
- # #### #preview
64
+ # #### `#preview`
65
65
  #
66
66
  # Always generate a preview alongside the component:
67
67
  #
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  layout: default
3
- title: API
3
+ title: API reference
4
4
  nav_order: 3
5
5
  ---
6
6
 
@@ -57,7 +57,7 @@ module ViewComponent
57
57
 
58
58
  def call
59
59
  <<~DOCS.chomp
60
- #{separator}#{signature_or_name}#{types}#{suffix}
60
+ `#{separator}#{signature_or_name}`#{types}#{suffix}
61
61
 
62
62
  #{docstring_and_deprecation_text}
63
63
  DOCS
@@ -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] && get_slot(slot_name)
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
 
@@ -81,22 +81,10 @@ module ViewComponent
81
81
  # In RSpec, `Preview` is appended to `described_class`.
82
82
  #
83
83
  # @param name [String] The name of the preview to be rendered.
84
+ # @param from [ViewComponent::Preview] The class of the preview to be rendered.
84
85
  # @param params [Hash] Parameters to be passed to the preview.
85
86
  # @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
-
87
+ def render_preview(name, from: preview_class, params: {})
100
88
  previews_controller = build_controller(Rails.application.config.view_component.preview_controller.constantize)
101
89
 
102
90
  # From what I can tell, it's not possible to overwrite all request parameters
@@ -105,7 +93,7 @@ module ViewComponent
105
93
  previews_controller.request.params[k] = v
106
94
  end
107
95
 
108
- previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
96
+ previews_controller.request.params[:path] = "#{from.preview_name}/#{name}"
109
97
  previews_controller.response = ActionDispatch::Response.new
110
98
  result = previews_controller.previews
111
99
 
@@ -216,5 +204,20 @@ module ViewComponent
216
204
  def build_controller(klass)
217
205
  klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
218
206
  end
207
+
208
+ private
209
+
210
+ def preview_class
211
+ result = if respond_to?(:described_class)
212
+ raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
213
+
214
+ "#{described_class}Preview"
215
+ else
216
+ self.class.name.gsub("Test", "Preview")
217
+ end
218
+ result = result.constantize
219
+ rescue NameError
220
+ raise NameError, "`render_preview` expected to find #{result}, but it does not exist."
221
+ end
219
222
  end
220
223
  end
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 75
6
+ MINOR = 77
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
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.75.0
4
+ version: 2.77.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: 2022-11-02 00:00:00.000000000 Z
11
+ date: 2022-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport