view_component 2.43.0 → 2.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3213b43fb64df68370b007c5e90029923c1b35d5893bfb1c57fad904d2df99fc
4
- data.tar.gz: d13ad45c178645ba3c639cd889ec9f645defe96579f0a94d305b0ce940405bb1
3
+ metadata.gz: b9b1ca38d53b64e55ff434c43f11839cf122d82d17768c2f064e2622ef88dc88
4
+ data.tar.gz: 7bc10806de04abbe6c7458305592d09ea6f4dfe9d86aff5d0cf0b9b9cfa9a620
5
5
  SHA512:
6
- metadata.gz: 159ff39bb666465d3ae385b9abed08c977c748d4c4c2d2112c1dd87b7c2823a819d253af78a9b14ead1519bbd15c79de4c92518266ebe2fd88fd9de4850bf887
7
- data.tar.gz: 7a62698b2449485ac139b89706c785f1466b49e98551df4a70897a347f8cc64619a072b860ebdd09869728978699e7926e3a09649abe083b954d4e18c746cc18
6
+ metadata.gz: 5c100fe77483f4b5f7227a47188f63428cbde65ebddf75cd0accf881d2140536150ea1d52f5c68b66126dd5087d9ac7fd7725f4c829a82d58c5cf86ef8abff2e
7
+ data.tar.gz: 19e3230c2b894651462dd6dbae44b4579267cc662c962e2bf9208e28cea299e01286427ae3c949d5622e8302cad4ba2b8f5e58a6aa6dabd3e872de367affb8bb
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- <img src="/docs/logo/viewcomponent-color-logo.svg" alt="ViewComponent logo" width="500">
1
+ ![ViewComponent logo](/docs/logo/readme-light.svg#gh-light-mode-only)
2
+ ![ViewComponent logo](/docs/logo/readme-dark.svg#gh-dark-mode-only)
2
3
 
3
4
  A framework for building reusable, testable & encapsulated view components in Ruby on Rails.
4
5
 
data/docs/CHANGELOG.md CHANGED
@@ -7,6 +7,118 @@ title: Changelog
7
7
 
8
8
  ## main
9
9
 
10
+ ## 2.46.0
11
+
12
+ * Add thread safety to the compiler.
13
+
14
+ *Horia Radu*
15
+
16
+ * Add theme-specific logo images to readme.
17
+
18
+ *Dylan Smith*
19
+
20
+ * Add Orbit to users list.
21
+
22
+ *Nicolas Goutay*
23
+
24
+ * Increase clarity around purpose and use of slots.
25
+
26
+ *Simon Fish*
27
+
28
+ ## 2.45.0
29
+
30
+ * Remove internal APIs from API documentation, fix link to license.
31
+
32
+ *Joel Hawksley*
33
+
34
+ * Add @yhirano55 to triage team.
35
+
36
+ *Joel Hawksley*
37
+
38
+ * Correct a typo in the sample slots code.
39
+
40
+ *Simon Fish*
41
+
42
+ * Add note about `allowed_queries`.
43
+
44
+ *Joel Hawksley*
45
+
46
+ * Add `vale` content linter.
47
+
48
+ *Joel Hawksley*
49
+
50
+ * Remove `require "rails/generators/test_case"` in generator tests.
51
+
52
+ *Yoshiyuki Hirano*
53
+
54
+ * Suppress zeitwerk warning about circular require.
55
+
56
+ *Yoshiyuki Hirano*
57
+
58
+ * Move `test_unit_generator_test.rb` from `test/view_component/` to `test/generators/`.
59
+
60
+ *Yoshiyuki Hirano*
61
+
62
+ * Unify test code of `TestUnitGeneratorTest` with the other generators tests.
63
+
64
+ *Yoshiyuki Hirano*
65
+
66
+ * Deprecate engine loading manually.
67
+
68
+ *Yoshiyuki Hirano*
69
+
70
+ ## 2.44.0
71
+
72
+ * Rename internal accessor to use private naming.
73
+
74
+ *Joel Hawksley*, *Blake Williams*, *Cameron Dutro*
75
+
76
+ * Add Github repo link to docs website header.
77
+
78
+ *Hans Lemuet*
79
+
80
+ * Change logo in README for dark theme readability.
81
+
82
+ *Dylan Smith*
83
+
84
+ * Add Litmus to users list.
85
+
86
+ *Dylan Smith*
87
+
88
+ * Add @dylanatsmith as codeowner of the ViewComponent logo and member of committers team.
89
+
90
+ *Joel Hawksley*
91
+
92
+ * Autoload `CompileCache`, which is optionally called in `engine.rb`.
93
+
94
+ *Gregory Igelmund*
95
+
96
+ * Move frequently asked questions to other pages, add History page.
97
+
98
+ *Joel Hawksley*
99
+
100
+ * Fix typo.
101
+
102
+ *James Hart*
103
+
104
+ * Add `require "method_source"` if it options.show_previews_source is enabled.
105
+
106
+ *Yoshiyuki Hirano*
107
+
108
+ * Move show_previews_source definition to Previewable.
109
+
110
+ *Yoshiyuki Hirano*
111
+
112
+ * Clear cache in MethodSource to apply the change odf preview code without app server restart.
113
+
114
+ *Yoshiyuki Hirano*
115
+
116
+ ## 2.43.1
117
+
118
+ * Remove unnecessary call to `ruby2_keywords` for polymorphic slot getters.
119
+
120
+ *Cameron Dutro*
121
+
10
122
  ## 2.43.0
11
123
 
12
124
  * Add note about tests and instance methods.
@@ -90,7 +202,7 @@ title: Changelog
90
202
 
91
203
  *Matthew Rider*
92
204
 
93
- * Fix bug where `with_collection_parameter` did not inherit from parent component.
205
+ * Fix bug where `with_collection_parameter` didn't inherit from parent component.
94
206
 
95
207
  *Will Drexler*, *Christian Campoli*
96
208
 
@@ -294,7 +406,7 @@ title: Changelog
294
406
 
295
407
  *Hans Lemuet*
296
408
 
297
- * Fix bug where ViewComponents did not work in ActionMailers.
409
+ * Fix bug where ViewComponents didn't work in ActionMailers.
298
410
 
299
411
  *dark-panda*
300
412
 
@@ -342,7 +454,7 @@ title: Changelog
342
454
 
343
455
  ## 2.31.0
344
456
 
345
- _Note: This release includes an underlying change to Slots that may affect incorrect usage of the API, where Slots were set on a line prefixed by `<%=`. The result of setting a Slot should not be returned. (`<%`)_
457
+ _Note: This release includes an underlying change to Slots that may affect incorrect usage of the API, where Slots were set on a line prefixed by `<%=`. The result of setting a Slot shouldn't be returned. (`<%`)_
346
458
 
347
459
  * Add `#with_content` to allow setting content without a block.
348
460
 
@@ -353,7 +465,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
353
465
  *Mario Schüttel*
354
466
 
355
467
  * Improve feature parity with Rails translations
356
- * Don't create a translation backend if the component has no translation file
468
+ * Don't create a translation back end if the component has no translation file
357
469
  * Mark translation keys ending with `html` as HTML-safe
358
470
  * Always convert keys to String
359
471
  * Support multiple keys
@@ -395,7 +507,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
395
507
 
396
508
  *Alex Robbin, Blake Williams*
397
509
 
398
- * Experimental: call `._sidecar_files` to fetch the sidecar files for a given list of extensions, e.g. passing `["yml", "yaml"]`.
510
+ * Experimental: call `._sidecar_files` to fetch the sidecar files for a given list of extensions, for example passing `["yml", "yaml"]`.
399
511
 
400
512
  *Elia Schito*
401
513
 
@@ -435,11 +547,11 @@ _Note: This release includes an underlying change to Slots that may affect incor
435
547
 
436
548
  ## 2.26.0
437
549
 
438
- * Lazily evaluate component `content` in `render?`, preventing the `content` block from being evaluated when `render?` returns false.
550
+ * Delay evaluating component `content` in `render?`, preventing the `content` block from being evaluated when `render?` returns false.
439
551
 
440
552
  *Blake Williams*
441
553
 
442
- * Do not generate template when using `--inline` flag.
554
+ * Don't generate template when using `--inline` flag.
443
555
 
444
556
  *Hans Lemuet*
445
557
 
@@ -500,7 +612,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
500
612
  * `with_slot collection: true` becomes `renders_many`.
501
613
  * Slot definitions now accept either a component class, component class name, or a lambda instead of a `class_name:` keyword argument.
502
614
  * Slots now support positional arguments.
503
- * Slots no longer use the `content` attribute to render content, instead relying on `to_s`. e.g. `<%= my_slot %>`.
615
+ * Slots no longer use the `content` attribute to render content, instead relying on `to_s`. for example `<%= my_slot %>`.
504
616
  * Slot values are no longer set via the `slot` method, and instead use the name of the slot.
505
617
 
506
618
  *Blake Williams*
@@ -563,7 +675,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
563
675
 
564
676
  ## 2.18.2
565
677
 
566
- * Raise an error if controller or view context is accessed during initialize as they are only available in render.
678
+ * Raise an error if controller or view context is accessed during initialize as they're only available in render.
567
679
 
568
680
  *Julian Nadeau*
569
681
 
@@ -579,7 +691,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
579
691
 
580
692
  ## 2.18.0
581
693
 
582
- * Fix auto-loading of previews (changes no longer require a server restart)
694
+ * Fix auto loading of previews (changes no longer require a server restart)
583
695
 
584
696
  *Matt Brictson*
585
697
 
@@ -672,7 +784,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
672
784
 
673
785
  ## 2.10.0
674
786
 
675
- * Raise an `ArgumentError` with a helpful message when Ruby cannot parse a component class.
787
+ * Raise an `ArgumentError` with a helpful message when Ruby can't parse a component class.
676
788
 
677
789
  *Max Beizer*
678
790
 
@@ -764,7 +876,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
764
876
 
765
877
  ## v2.2.1
766
878
 
767
- * Fix bug where template could not be found if `inherited` was redefined.
879
+ * Fix bug where template couldn't be found if `inherited` was redefined.
768
880
 
769
881
  *Joel Hawksley*
770
882
 
@@ -780,7 +892,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
780
892
 
781
893
  ## v2.1.0
782
894
 
783
- * Support rendering collections (e.g., `render(MyComponent.with_collection(@items))`).
895
+ * Support rendering collections (for example, `render(MyComponent.with_collection(@items))`).
784
896
 
785
897
  *Tim Clem*
786
898
 
@@ -802,7 +914,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
802
914
 
803
915
  *Andrew Mason*
804
916
 
805
- * ViewComponent generators do not not prompt for content requirement.
917
+ * ViewComponent generators don't not prompt for content requirement.
806
918
 
807
919
  *Joel Hawksley*
808
920
 
@@ -924,7 +1036,7 @@ _Note: This release includes an underlying change to Slots that may affect incor
924
1036
 
925
1037
  *Jon Palmer*
926
1038
 
927
- * Add `#render?` hook to easily allow components to be no-ops.
1039
+ * Add `#render?` hook to allow components to be no-ops.
928
1040
 
929
1041
  *Kyle Fox*
930
1042
 
@@ -992,7 +1104,9 @@ _Note: This release includes an underlying change to Slots that may affect incor
992
1104
 
993
1105
  * Fix edge case issue with extracting variants from less conventional source_locations.
994
1106
 
1107
+ <!-- vale proselint.GenderBias = NO -->
995
1108
  *Ryan Workman*
1109
+ <!-- vale proselint.GenderBias = YES -->
996
1110
 
997
1111
  ## v1.6.0
998
1112
 
@@ -1028,7 +1142,9 @@ _Note: This release includes an underlying change to Slots that may affect incor
1028
1142
 
1029
1143
  * Add support for RSpec to generators.
1030
1144
 
1145
+ <!-- vale proselint.GenderBias = NO -->
1031
1146
  *Dylan Clark, Ryan Workman*
1147
+ <!-- vale proselint.GenderBias = YES -->
1032
1148
 
1033
1149
  * Require controllers as part of setting autoload paths.
1034
1150
 
@@ -1052,7 +1168,9 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
1052
1168
 
1053
1169
  * Fix issue with generating component method signatures.
1054
1170
 
1171
+ <!-- vale proselint.GenderBias = NO -->
1055
1172
  *Ryan Workman, Dylan Clark*
1173
+ <!-- vale proselint.GenderBias = YES -->
1056
1174
 
1057
1175
  * Create component generator.
1058
1176
 
@@ -1124,7 +1242,7 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
1124
1242
 
1125
1243
  ## v1.3.3
1126
1244
 
1127
- * Do not raise error when sidecar files that are not templates exist.
1245
+ * Don't raise error when sidecar files that aren't templates exist.
1128
1246
 
1129
1247
  *Joel Hawksley*
1130
1248
 
@@ -29,7 +29,7 @@ module ViewComponent
29
29
  class_attribute :content_areas
30
30
  self.content_areas = [] # class_attribute:default doesn't work until Rails 5.2
31
31
 
32
- attr_accessor :original_view_context
32
+ attr_accessor :__vc_original_view_context
33
33
 
34
34
  # EXPERIMENTAL: This API is experimental and may be removed at any time.
35
35
  # Hook for allowing components to do work as part of the compilation process.
@@ -52,7 +52,7 @@ module ViewComponent
52
52
  self.class.compile(raise_errors: true)
53
53
 
54
54
  @view_context = view_context
55
- self.original_view_context ||= view_context
55
+ self.__vc_original_view_context ||= view_context
56
56
 
57
57
  @lookup_context ||= view_context.lookup_context
58
58
 
@@ -137,10 +137,10 @@ module ViewComponent
137
137
  # @private
138
138
  def render(options = {}, args = {}, &block)
139
139
  if options.is_a? ViewComponent::Base
140
- options.original_view_context = original_view_context
140
+ options.__vc_original_view_context = __vc_original_view_context
141
141
  super
142
142
  else
143
- original_view_context.render(options, args, &block)
143
+ __vc_original_view_context.render(options, args, &block)
144
144
  end
145
145
  end
146
146
 
@@ -152,7 +152,7 @@ module ViewComponent
152
152
  if view_context.nil?
153
153
  raise(
154
154
  ViewContextCalledBeforeRenderError,
155
- "`#controller` cannot be used during initialization, as it depends " \
155
+ "`#controller` can't be used during initialization, as it depends " \
156
156
  "on the view context that only exists once a ViewComponent is passed to " \
157
157
  "the Rails render pipeline.\n\n" \
158
158
  "It's sometimes possible to fix this issue by moving code dependent on " \
@@ -171,7 +171,7 @@ module ViewComponent
171
171
  if view_context.nil?
172
172
  raise(
173
173
  ViewContextCalledBeforeRenderError,
174
- "`#helpers` cannot be used during initialization, as it depends " \
174
+ "`#helpers` can't be used during initialization, as it depends " \
175
175
  "on the view context that only exists once a ViewComponent is passed to " \
176
176
  "the Rails render pipeline.\n\n" \
177
177
  "It's sometimes possible to fix this issue by moving code dependent on " \
@@ -186,7 +186,7 @@ module ViewComponent
186
186
  #
187
187
  # This allows ivars to remain persisted when using the same helper via
188
188
  # `helpers` across multiple components and partials.
189
- @__vc_helpers ||= original_view_context || controller.view_context
189
+ @__vc_helpers ||= __vc_original_view_context || controller.view_context
190
190
  end
191
191
 
192
192
  # Exposes .virtual_path as an instance method
@@ -206,7 +206,7 @@ module ViewComponent
206
206
  #
207
207
  # @private
208
208
  def format
209
- # Ruby 2.6 throws a warning without checking `defined?`, 2.7 does not
209
+ # Ruby 2.6 throws a warning without checking `defined?`, 2.7 doesn't
210
210
  if defined?(@__vc_variant)
211
211
  @__vc_variant
212
212
  end
@@ -271,14 +271,6 @@ module ViewComponent
271
271
  #
272
272
  mattr_accessor :render_monkey_patch_enabled, instance_writer: false, default: true
273
273
 
274
- # Enable or disable source code previews in component previews:
275
- #
276
- # config.view_component.show_previews_source = true
277
- #
278
- # Defaults to `false`.
279
- #
280
- mattr_accessor :show_previews_source, instance_writer: false, default: false
281
-
282
274
  # Always generate a Stimulus controller alongside the component:
283
275
  #
284
276
  # config.view_component.generate_stimulus_controller = true
@@ -291,7 +283,7 @@ module ViewComponent
291
283
  #
292
284
  # config.view_component.view_component_path = "app/my_components"
293
285
  #
294
- # Defaults to "app/components".
286
+ # Defaults to `app/components`.
295
287
  mattr_accessor :view_component_path, instance_writer: false, default: "app/components"
296
288
 
297
289
  # Parent class for generated components
@@ -326,7 +318,7 @@ module ViewComponent
326
318
 
327
319
  # Add support for nested components defined in the same file.
328
320
  #
329
- # e.g.
321
+ # for example
330
322
  #
331
323
  # class MyComponent < ViewComponent::Base
332
324
  # class MyOtherComponent < ViewComponent::Base
@@ -439,7 +431,7 @@ module ViewComponent
439
431
  end
440
432
 
441
433
  # Ensure the component initializer accepts the
442
- # collection parameter. By default, we do not
434
+ # collection parameter. By default, we don't
443
435
  # validate that the default parameter name
444
436
  # is accepted, as support for collection
445
437
  # rendering is optional.
@@ -450,7 +442,7 @@ module ViewComponent
450
442
  return unless parameter
451
443
  return if initialize_parameter_names.include?(parameter)
452
444
 
453
- # If Ruby cannot parse the component class, then the initalize
445
+ # If Ruby can't parse the component class, then the initalize
454
446
  # parameters will be empty and ViewComponent will not be able to render
455
447
  # the component.
456
448
  if initialize_parameters.empty?
@@ -463,14 +455,14 @@ module ViewComponent
463
455
  end
464
456
 
465
457
  raise ArgumentError.new(
466
- "The initializer for #{self} does not accept the parameter `#{parameter}`, " \
458
+ "The initializer for #{self} doesn't accept the parameter `#{parameter}`, " \
467
459
  "which is required in order to render it as a collection.\n\n" \
468
460
  "To fix this issue, update the initializer to accept `#{parameter}`.\n\n" \
469
461
  "See https://viewcomponent.org/guide/collections.html for more information on rendering collections."
470
462
  )
471
463
  end
472
464
 
473
- # Ensure the component initializer does not define
465
+ # Ensure the component initializer doesn't define
474
466
  # invalid parameters that could override the framework's
475
467
  # methods.
476
468
  # @private TODO: add documentation
@@ -478,7 +470,7 @@ module ViewComponent
478
470
  return unless initialize_parameter_names.include?(RESERVED_PARAMETER)
479
471
 
480
472
  raise ViewComponent::ComponentError.new(
481
- "#{self} initializer cannot accept the parameter `#{RESERVED_PARAMETER}`, as it will override a " \
473
+ "#{self} initializer can't accept the parameter `#{RESERVED_PARAMETER}`, as it will override a " \
482
474
  "public ViewComponent method. To fix this issue, rename the parameter."
483
475
  )
484
476
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ViewComponent
4
4
  # Keeps track of which templates have already been compiled
5
- # This is not part of the public API
5
+ # This isn't part of the public API
6
6
  module CompileCache
7
7
  mattr_accessor :cache, instance_reader: false, instance_accessor: false do
8
8
  Set.new
@@ -18,6 +18,10 @@ module ViewComponent
18
18
  cache.include? klass
19
19
  end
20
20
 
21
+ def invalidate_class!(klass)
22
+ cache.delete(klass)
23
+ end
24
+
21
25
  def invalidate!
22
26
  cache.clear
23
27
  end
@@ -2,8 +2,12 @@
2
2
 
3
3
  module ViewComponent
4
4
  class Compiler
5
+ # Lock required to be obtained before compiling the component
6
+ attr_reader :__vc_compiler_lock
7
+
5
8
  def initialize(component_class)
6
9
  @component_class = component_class
10
+ @__vc_compiler_lock = Monitor.new
7
11
  end
8
12
 
9
13
  def compiled?
@@ -13,55 +17,59 @@ module ViewComponent
13
17
  def compile(raise_errors: false)
14
18
  return if compiled?
15
19
 
16
- subclass_instance_methods = component_class.instance_methods(false)
20
+ __vc_compiler_lock.synchronize do
21
+ CompileCache.invalidate_class!(component_class)
17
22
 
18
- if subclass_instance_methods.include?(:with_content) && raise_errors
19
- raise ViewComponent::ComponentError.new(
20
- "#{component_class} implements a reserved method, `#with_content`.\n\n" \
21
- "To fix this issue, change the name of the method."
22
- )
23
- end
23
+ subclass_instance_methods = component_class.instance_methods(false)
24
24
 
25
- if template_errors.present?
26
- raise ViewComponent::TemplateError.new(template_errors) if raise_errors
27
-
28
- return false
29
- end
25
+ if subclass_instance_methods.include?(:with_content) && raise_errors
26
+ raise ViewComponent::ComponentError.new(
27
+ "#{component_class} implements a reserved method, `#with_content`.\n\n" \
28
+ "To fix this issue, change the name of the method."
29
+ )
30
+ end
30
31
 
31
- if subclass_instance_methods.include?(:before_render_check)
32
- ActiveSupport::Deprecation.warn(
33
- "`#before_render_check` will be removed in v3.0.0.\n\n" \
34
- "To fix this issue, use `#before_render` instead."
35
- )
36
- end
32
+ if template_errors.present?
33
+ raise ViewComponent::TemplateError.new(template_errors) if raise_errors
37
34
 
38
- if raise_errors
39
- component_class.validate_initialization_parameters!
40
- component_class.validate_collection_parameter!
41
- end
35
+ return false
36
+ end
42
37
 
43
- templates.each do |template|
44
- # Remove existing compiled template methods,
45
- # as Ruby warns when redefining a method.
46
- method_name = call_method_name(template[:variant])
38
+ if subclass_instance_methods.include?(:before_render_check)
39
+ ActiveSupport::Deprecation.warn(
40
+ "`#before_render_check` will be removed in v3.0.0.\n\n" \
41
+ "To fix this issue, use `#before_render` instead."
42
+ )
43
+ end
47
44
 
48
- if component_class.instance_methods.include?(method_name.to_sym)
49
- component_class.send(:undef_method, method_name.to_sym)
45
+ if raise_errors
46
+ component_class.validate_initialization_parameters!
47
+ component_class.validate_collection_parameter!
50
48
  end
51
49
 
52
- component_class.class_eval <<-RUBY, template[:path], -1
53
- def #{method_name}
54
- @output_buffer = ActionView::OutputBuffer.new
55
- #{compiled_template(template[:path])}
50
+ templates.each do |template|
51
+ # Remove existing compiled template methods,
52
+ # as Ruby warns when redefining a method.
53
+ method_name = call_method_name(template[:variant])
54
+
55
+ if component_class.instance_methods.include?(method_name.to_sym)
56
+ component_class.send(:undef_method, method_name.to_sym)
56
57
  end
57
- RUBY
58
- end
59
58
 
60
- define_render_template_for
59
+ component_class.class_eval <<-RUBY, template[:path], -1
60
+ def #{method_name}
61
+ @output_buffer = ActionView::OutputBuffer.new
62
+ #{compiled_template(template[:path])}
63
+ end
64
+ RUBY
65
+ end
66
+
67
+ define_render_template_for
61
68
 
62
- component_class._after_compile
69
+ component_class._after_compile
63
70
 
64
- CompileCache.register(component_class)
71
+ CompileCache.register(component_class)
72
+ end
65
73
  end
66
74
 
67
75
  private
@@ -95,7 +103,7 @@ module ViewComponent
95
103
  errors = []
96
104
 
97
105
  if (templates + inline_calls).empty?
98
- errors << "Could not find a template file or inline render method for #{component_class}."
106
+ errors << "Couldn't find a template file or inline render method for #{component_class}."
99
107
  end
100
108
 
101
109
  if templates.count { |template| template[:variant].nil? } > 1
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails"
4
- require "view_component"
5
4
 
6
5
  module ViewComponent
7
6
  class Engine < Rails::Engine # :nodoc:
@@ -17,6 +16,7 @@ module ViewComponent
17
16
 
18
17
  options.render_monkey_patch_enabled = true if options.render_monkey_patch_enabled.nil?
19
18
  options.show_previews = Rails.env.development? || Rails.env.test? if options.show_previews.nil?
19
+ options.show_previews_source ||= ViewComponent::Base.show_previews_source
20
20
  options.instrumentation_enabled = false if options.instrumentation_enabled.nil?
21
21
  options.preview_route ||= ViewComponent::Base.preview_route
22
22
  options.preview_controller ||= ViewComponent::Base.preview_controller
@@ -32,6 +32,14 @@ module ViewComponent
32
32
  )
33
33
  options.preview_paths << options.preview_path
34
34
  end
35
+
36
+ if options.show_previews_source
37
+ require "method_source"
38
+
39
+ app.config.to_prepare do
40
+ MethodSource.instance_variable_set(:@lines_for_file, {})
41
+ end
42
+ end
35
43
  end
36
44
 
37
45
  ActiveSupport.on_load(:view_component) do
@@ -136,3 +144,14 @@ module ViewComponent
136
144
  end
137
145
  end
138
146
  end
147
+
148
+ # :nocov:
149
+ unless defined?(ViewComponent::Base)
150
+ ActiveSupport::Deprecation.warn(
151
+ "This manually engine loading is deprecated and will be removed in v3.0.0. " \
152
+ "Remove `require \"view_component/engine\"`."
153
+ )
154
+
155
+ require "view_component"
156
+ end
157
+ # :nocov:
@@ -41,7 +41,6 @@ module ViewComponent
41
41
  define_method(getter_name) do
42
42
  get_slot(slot_name)
43
43
  end
44
- ruby2_keywords(getter_name.to_sym) if respond_to?(:ruby2_keywords, true)
45
44
 
46
45
  define_method(setter_name) do |*args, &block|
47
46
  set_polymorphic_slot(slot_name, poly_type, *args, &block)
@@ -80,7 +80,7 @@ module ViewComponent # :nodoc:
80
80
  if preview_path.nil?
81
81
  raise(
82
82
  PreviewTemplateError,
83
- "A preview template for example #{example} does not exist.\n\n" \
83
+ "A preview template for example #{example} doesn't exist.\n\n" \
84
84
  "To fix this issue, create a template for the example."
85
85
  )
86
86
  end
@@ -15,6 +15,14 @@ module ViewComponent
15
15
  #
16
16
  mattr_accessor :show_previews, instance_writer: false
17
17
 
18
+ # Enable or disable source code previews in component previews:
19
+ #
20
+ # config.view_component.show_previews_source = true
21
+ #
22
+ # Defaults to `false`.
23
+ #
24
+ mattr_accessor :show_previews_source, instance_writer: false, default: false
25
+
18
26
  # Set a custom default layout used for preview index and individual previews:
19
27
  #
20
28
  # config.view_component.default_preview_layout = "component_preview"
@@ -20,7 +20,7 @@ module ViewComponent
20
20
  # component, or a function that returns a component, we render that
21
21
  # component instance, returning the string.
22
22
  #
23
- # If the slot renderable is a function and returns a string, it is
23
+ # If the slot renderable is a function and returns a string, it's
24
24
  # set as `@__vc_content` and is returned directly.
25
25
  #
26
26
  # If there is no slot renderable, we evaluate the block passed to
@@ -69,7 +69,7 @@ module ViewComponent
69
69
 
70
70
  # Allow access to public component methods via the wrapper
71
71
  #
72
- # e.g.
72
+ # for example
73
73
  #
74
74
  # calling `header.name` (where `header` is a slot) will call `name`
75
75
  # on the `HeaderComponent` instance.
@@ -29,12 +29,12 @@ module ViewComponent
29
29
  )
30
30
 
31
31
  slot_names.each do |slot_name|
32
- # Ensure slot_name is not already declared
32
+ # Ensure slot_name isn't already declared
33
33
  if self.slots.key?(slot_name)
34
34
  raise ArgumentError.new("#{slot_name} slot declared multiple times")
35
35
  end
36
36
 
37
- # Ensure slot name is not :content
37
+ # Ensure slot name isn't :content
38
38
  if slot_name == :content
39
39
  raise ArgumentError.new ":content is a reserved slot name. Please use another name, such as ':body'"
40
40
  end
@@ -105,7 +105,7 @@ module ViewComponent
105
105
  # <% end %>
106
106
  #
107
107
  def slot(slot_name, **args, &block)
108
- # Raise ArgumentError if `slot` does not exist
108
+ # Raise ArgumentError if `slot` doesn't exist
109
109
  unless slots.keys.include?(slot_name)
110
110
  raise ArgumentError.new "Unknown slot '#{slot_name}' - expected one of '#{slots.keys}'"
111
111
  end
@@ -140,7 +140,7 @@ module ViewComponent
140
140
  instance_variable_set(slot[:instance_variable_name], slot_instance)
141
141
  end
142
142
 
143
- # Return nil, as this method should not output anything to the view itself.
143
+ # Return nil, as this method shouldn't output anything to the view itself.
144
144
  nil
145
145
  end
146
146
  end
@@ -121,7 +121,7 @@ module ViewComponent
121
121
  singular_name = ActiveSupport::Inflector.singularize(slot_name)
122
122
 
123
123
  # Define setter for singular names
124
- # e.g. `renders_many :items` allows fetching all tabs with
124
+ # for example `renders_many :items` allows fetching all tabs with
125
125
  # `component.tabs` and setting a tab with `component.tab`
126
126
  define_method singular_name do |*args, &block|
127
127
  set_slot(slot_name, nil, *args, &block)
@@ -181,7 +181,7 @@ module ViewComponent
181
181
  # If callable is a string, we assume it's referencing an internal class
182
182
  slot[:renderable_class_name] = callable
183
183
  elsif callable.respond_to?(:call)
184
- # If slot does not respond to `render_in`, we assume it's a proc,
184
+ # If slot doesn't respond to `render_in`, we assume it's a proc,
185
185
  # define a method, and save a reference to it to call when setting
186
186
  method_name = :"_call_#{slot_name}"
187
187
  define_method method_name, &callable
@@ -256,7 +256,7 @@ module ViewComponent
256
256
  # 1. If this is a `content_area` style sub-component, we will render the
257
257
  # block via the `slot`
258
258
  #
259
- # 2. Since we have to pass block content to components when calling
259
+ # 2. Since we've to pass block content to components when calling
260
260
  # `render`, evaluating the block here would require us to call
261
261
  # `view_context.capture` twice, which is slower
262
262
  slot.__vc_content_block = block if block_given?
@@ -103,7 +103,7 @@ module ViewComponent
103
103
  @controller = old_controller
104
104
  end
105
105
 
106
- # Set the URL for the current request (such as when using request-dependent path helpers):
106
+ # Set the URL of the current request (such as when using request-dependent path helpers):
107
107
  #
108
108
  # ```ruby
109
109
  # with_request_url("/users/42") do
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 43
6
+ MINOR = 46
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
@@ -8,6 +8,7 @@ module ViewComponent
8
8
 
9
9
  autoload :Base
10
10
  autoload :Compiler
11
+ autoload :CompileCache
11
12
  autoload :ComponentError
12
13
  autoload :Instrumentation
13
14
  autoload :Preview
@@ -18,4 +19,13 @@ module ViewComponent
18
19
  autoload :Translatable
19
20
  end
20
21
 
21
- require "view_component/engine" if defined?(Rails::Engine)
22
+ # :nocov:
23
+ if defined?(ViewComponent::Engine)
24
+ ActiveSupport::Deprecation.warn(
25
+ "This manually engine loading is deprecated and will be removed in v3.0.0. " \
26
+ "Remove `require \"view_component/engine\"`."
27
+ )
28
+ elsif defined?(Rails::Engine)
29
+ require "view_component/engine"
30
+ end
31
+ # :nocov:
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.43.0
4
+ version: 2.46.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-07 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -76,16 +76,16 @@ dependencies:
76
76
  name: bundler
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: '2.2'
81
+ version: 1.15.0
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - "~>"
86
+ - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: '2.2'
88
+ version: 1.15.0
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: erb_lint
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -268,7 +268,7 @@ dependencies:
268
268
  - - ">="
269
269
  - !ruby/object:Gem::Version
270
270
  version: '0'
271
- description:
271
+ description:
272
272
  email:
273
273
  - opensource+view_component@github.com
274
274
  executables: []
@@ -341,7 +341,7 @@ licenses:
341
341
  - MIT
342
342
  metadata:
343
343
  allowed_push_host: https://rubygems.org
344
- post_install_message:
344
+ post_install_message:
345
345
  rdoc_options: []
346
346
  require_paths:
347
347
  - lib
@@ -356,8 +356,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
356
356
  - !ruby/object:Gem::Version
357
357
  version: '0'
358
358
  requirements: []
359
- rubygems_version: 3.1.4
360
- signing_key:
359
+ rubygems_version: 3.1.2
360
+ signing_key:
361
361
  specification_version: 4
362
362
  summary: View components for Rails
363
363
  test_files: []