view_component 3.13.0 → 3.14.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: 7355cbed890e04169fee1c12513cd045bee0e912838c9d368be9317ee801bfcc
4
- data.tar.gz: 76b95e2aab1e097356e06c4c6695a12a1fc0cc3344f3657c1bf42bcb587157cc
3
+ metadata.gz: 7ef8c603bedd61511ed3eb2da02cd7aaccc5b890ad20badac0cfc9a3e7d4af1e
4
+ data.tar.gz: f756c5bd11f44e7e8984d6cb6b29ec409dc082d83864ee4bd82c50adc784310c
5
5
  SHA512:
6
- metadata.gz: f3f7b42ee9a138203348eb6a6560e0d67f041c0d66aaf5eb8465ac6f2ef506eab543a5c408f2a879c70228ae6bef029fc3a916f36344a8835bb8e9d29c4bf89b
7
- data.tar.gz: cd8d3a36c04d72941503a255f0143d7ea6f5178364e20e1fac834a7e5ac683b0915588b14cda7c9025bc4ac4cba476c184780940606a968b5449167a9428440f
6
+ metadata.gz: 8815314944335c3b69196bf5ba8779e10ec78a3146e8cc51d4d278d5e444035c8bc50858315c45e5556337e925ab94f4afee6b3283839079db6892292bec3581
7
+ data.tar.gz: 42c9159369779c50a9904525239d5bf3daa62ed5373104cb11f80251b9481a8225290421d0d9a5663e9f7c7e0bd4d73c63a53bc44845dc4b5bc23a0419869301
data/docs/CHANGELOG.md CHANGED
@@ -10,6 +10,40 @@ nav_order: 5
10
10
 
11
11
  ## main
12
12
 
13
+ ## 3.14.0
14
+
15
+ * Defer to built-in caching for language environment setup, rather than manually using `actions/cache` in CI.
16
+
17
+ *Simon Fish*
18
+
19
+ * Add test coverage for use of `turbo_stream` helpers in components when `capture_compatibility_patch_enabled` is `true`.
20
+
21
+ *Simon Fish*
22
+
23
+ * Add experimental `SlotableDefault` module, allowing components to define a `default_SLOTNAME` method to provide a default value for slots.
24
+
25
+ *Joel Hawksley*
26
+
27
+ * Add documentation on rendering ViewComponents outside of the view context.
28
+
29
+ *Joel Hawksley*
30
+
31
+ * Look for preview files that end in `preview.rb` rather than `_preview.rb` to allow previews to exist in sidecar directory with test files.
32
+
33
+ *Seth Herr*
34
+
35
+ * Add `assert_component_rendered` test helper.
36
+
37
+ *Reegan Viljoen*
38
+
39
+ * Add `prefix:` option to `use_helpers`.
40
+
41
+ *Reegan Viljoen*
42
+
43
+ * Add support for Rails 7.2.
44
+
45
+ *Reegan Viljoen*
46
+
13
47
  ## 3.13.0
14
48
 
15
49
  * Add ruby head and YJIT to CI.
@@ -10,6 +10,7 @@ require "view_component/errors"
10
10
  require "view_component/inline_template"
11
11
  require "view_component/preview"
12
12
  require "view_component/slotable"
13
+ require "view_component/slotable_default"
13
14
  require "view_component/translatable"
14
15
  require "view_component/with_content_helper"
15
16
  require "view_component/use_helpers"
@@ -86,6 +86,12 @@ module ViewComponent
86
86
  define_render_template_for
87
87
  end
88
88
 
89
+ component_class.registered_slots.each do |slot_name, config|
90
+ config[:default_method] = component_class.instance_methods.find { |method_name| method_name == :"default_#{slot_name}" }
91
+
92
+ component_class.registered_slots[slot_name] = config
93
+ end
94
+
89
95
  component_class.build_i18n_backend
90
96
 
91
97
  CompileCache.register(component_class)
@@ -102,7 +102,7 @@ module ViewComponent # :nodoc:
102
102
 
103
103
  def load_previews
104
104
  Array(preview_paths).each do |preview_path|
105
- Dir["#{preview_path}/**/*_preview.rb"].sort.each { |file| require_dependency file }
105
+ Dir["#{preview_path}/**/*preview.rb"].sort.each { |file| require_dependency file }
106
106
  end
107
107
  end
108
108
 
@@ -266,10 +266,7 @@ module ViewComponent
266
266
  end
267
267
 
268
268
  def define_slot(slot_name, collection:, callable:)
269
- # Setup basic slot data
270
- slot = {
271
- collection: collection
272
- }
269
+ slot = {collection: collection}
273
270
  return slot unless callable
274
271
 
275
272
  # If callable responds to `render_in`, we set it on the slot as a renderable
@@ -0,0 +1,20 @@
1
+ module ViewComponent
2
+ module SlotableDefault
3
+ def get_slot(slot_name)
4
+ @__vc_set_slots ||= {}
5
+
6
+ return super unless !@__vc_set_slots[slot_name] && (default_method = registered_slots[slot_name][:default_method])
7
+
8
+ renderable_value = send(default_method)
9
+ slot = Slot.new(self)
10
+
11
+ if renderable_value.respond_to?(:render_in)
12
+ slot.__vc_component_instance = renderable_value
13
+ else
14
+ slot.__vc_content = renderable_value
15
+ end
16
+
17
+ slot
18
+ end
19
+ end
20
+ end
@@ -14,6 +14,10 @@ module ViewComponent
14
14
  def refute_component_rendered
15
15
  assert_no_selector("body")
16
16
  end
17
+
18
+ def assert_component_rendered
19
+ assert_selector("body")
20
+ end
17
21
  rescue LoadError
18
22
  # We don't have a test case for running an application without capybara installed.
19
23
  # It's probably fine to leave this without coverage.
@@ -4,23 +4,35 @@ module ViewComponent::UseHelpers
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  class_methods do
7
- def use_helpers(*args, from: nil)
8
- args.each { |helper_method| use_helper(helper_method, from: from) }
7
+ def use_helpers(*args, from: nil, prefix: false)
8
+ args.each { |helper_method| use_helper(helper_method, from: from, prefix: prefix) }
9
9
  end
10
10
 
11
- def use_helper(helper_method, from: nil)
11
+ def use_helper(helper_method, from: nil, prefix: false)
12
+ helper_method_name = full_helper_method_name(helper_method, prefix: prefix, source: from)
13
+
12
14
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
13
- def #{helper_method}(*args, &block)
15
+ def #{helper_method_name}(*args, &block)
14
16
  raise HelpersCalledBeforeRenderError if view_context.nil?
15
17
 
16
18
  #{define_helper(helper_method: helper_method, source: from)}
17
19
  end
18
20
  RUBY
19
- ruby2_keywords(helper_method) if respond_to?(:ruby2_keywords, true)
21
+ ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
20
22
  end
21
23
 
22
24
  private
23
25
 
26
+ def full_helper_method_name(helper_method, prefix: false, source: nil)
27
+ return helper_method unless prefix.present?
28
+
29
+ if !!prefix == prefix
30
+ "#{source.to_s.underscore}_#{helper_method}"
31
+ else
32
+ "#{prefix}_#{helper_method}"
33
+ end
34
+ end
35
+
24
36
  def define_helper(helper_method:, source:)
25
37
  return "__vc_original_view_context.#{helper_method}(*args, &block)" unless source.present?
26
38
 
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 3
6
- MINOR = 13
6
+ MINOR = 14
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
 
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.13.0
4
+ version: 3.14.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: 2024-07-15 00:00:00.000000000 Z
11
+ date: 2024-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -380,6 +380,20 @@ dependencies:
380
380
  - - "~>"
381
381
  - !ruby/object:Gem::Version
382
382
  version: 3.4.2
383
+ - !ruby/object:Gem::Dependency
384
+ name: turbo-rails
385
+ requirement: !ruby/object:Gem::Requirement
386
+ requirements:
387
+ - - "~>"
388
+ - !ruby/object:Gem::Version
389
+ version: '1'
390
+ type: :development
391
+ prerelease: false
392
+ version_requirements: !ruby/object:Gem::Requirement
393
+ requirements:
394
+ - - "~>"
395
+ - !ruby/object:Gem::Version
396
+ version: '1'
383
397
  - !ruby/object:Gem::Dependency
384
398
  name: warning
385
399
  requirement: !ruby/object:Gem::Requirement
@@ -530,6 +544,7 @@ files:
530
544
  - lib/view_component/rendering_monkey_patch.rb
531
545
  - lib/view_component/slot.rb
532
546
  - lib/view_component/slotable.rb
547
+ - lib/view_component/slotable_default.rb
533
548
  - lib/view_component/system_test_case.rb
534
549
  - lib/view_component/system_test_helpers.rb
535
550
  - lib/view_component/test_case.rb