view_component 2.82.0 → 3.0.0.rc2
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/docs/CHANGELOG.md +102 -0
- data/lib/view_component/base.rb +26 -54
- data/lib/view_component/capture_compatibility.rb +42 -0
- data/lib/view_component/collection.rb +1 -1
- data/lib/view_component/compiler.rb +0 -6
- data/lib/view_component/config.rb +9 -13
- data/lib/view_component/deprecation.rb +1 -1
- data/lib/view_component/engine.rb +12 -22
- data/lib/view_component/rails/tasks/view_component.rake +1 -1
- data/lib/view_component/slot.rb +92 -1
- data/lib/view_component/slotable.rb +348 -97
- data/lib/view_component/system_test_helpers.rb +1 -1
- data/lib/view_component/test_helpers.rb +45 -54
- data/lib/view_component/version.rb +4 -3
- data/lib/view_component.rb +2 -10
- metadata +6 -9
- data/lib/view_component/content_areas.rb +0 -56
- data/lib/view_component/polymorphic_slots.rb +0 -103
- data/lib/view_component/slot_v2.rb +0 -98
- data/lib/view_component/slotable_v2.rb +0 -391
data/lib/view_component.rb
CHANGED
@@ -7,6 +7,7 @@ module ViewComponent
|
|
7
7
|
extend ActiveSupport::Autoload
|
8
8
|
|
9
9
|
autoload :Base
|
10
|
+
autoload :CaptureCompatibility
|
10
11
|
autoload :Compiler
|
11
12
|
autoload :CompileCache
|
12
13
|
autoload :ComponentError
|
@@ -23,13 +24,4 @@ module ViewComponent
|
|
23
24
|
autoload :Translatable
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
if defined?(ViewComponent::Engine)
|
28
|
-
ViewComponent::Deprecation.deprecation_warning(
|
29
|
-
"Manually loading the engine",
|
30
|
-
"remove `require \"view_component/engine\"`"
|
31
|
-
)
|
32
|
-
elsif defined?(Rails::Engine)
|
33
|
-
require "view_component/engine"
|
34
|
-
end
|
35
|
-
# :nocov:
|
27
|
+
require "view_component/engine" if defined?(Rails::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:
|
4
|
+
version: 3.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ViewComponent Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -353,18 +353,17 @@ files:
|
|
353
353
|
- lib/rails/generators/test_unit/templates/component_test.rb.tt
|
354
354
|
- lib/view_component.rb
|
355
355
|
- lib/view_component/base.rb
|
356
|
+
- lib/view_component/capture_compatibility.rb
|
356
357
|
- lib/view_component/collection.rb
|
357
358
|
- lib/view_component/compile_cache.rb
|
358
359
|
- lib/view_component/compiler.rb
|
359
360
|
- lib/view_component/component_error.rb
|
360
361
|
- lib/view_component/config.rb
|
361
|
-
- lib/view_component/content_areas.rb
|
362
362
|
- lib/view_component/deprecation.rb
|
363
363
|
- lib/view_component/docs_builder_component.html.erb
|
364
364
|
- lib/view_component/docs_builder_component.rb
|
365
365
|
- lib/view_component/engine.rb
|
366
366
|
- lib/view_component/instrumentation.rb
|
367
|
-
- lib/view_component/polymorphic_slots.rb
|
368
367
|
- lib/view_component/preview.rb
|
369
368
|
- lib/view_component/preview_template_error.rb
|
370
369
|
- lib/view_component/rails/tasks/view_component.rake
|
@@ -375,9 +374,7 @@ files:
|
|
375
374
|
- lib/view_component/rendering_component_helper.rb
|
376
375
|
- lib/view_component/rendering_monkey_patch.rb
|
377
376
|
- lib/view_component/slot.rb
|
378
|
-
- lib/view_component/slot_v2.rb
|
379
377
|
- lib/view_component/slotable.rb
|
380
|
-
- lib/view_component/slotable_v2.rb
|
381
378
|
- lib/view_component/system_test_case.rb
|
382
379
|
- lib/view_component/system_test_helpers.rb
|
383
380
|
- lib/view_component/template_error.rb
|
@@ -402,12 +399,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
402
399
|
requirements:
|
403
400
|
- - ">="
|
404
401
|
- !ruby/object:Gem::Version
|
405
|
-
version: 2.
|
402
|
+
version: 2.7.0
|
406
403
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
407
404
|
requirements:
|
408
|
-
- - "
|
405
|
+
- - ">"
|
409
406
|
- !ruby/object:Gem::Version
|
410
|
-
version:
|
407
|
+
version: 1.3.1
|
411
408
|
requirements: []
|
412
409
|
rubygems_version: 3.2.32
|
413
410
|
signing_key:
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "active_support/concern"
|
4
|
-
|
5
|
-
require "view_component/slot"
|
6
|
-
|
7
|
-
# DEPRECATED - ContentAreas is deprecated and will be removed in v3.0.0
|
8
|
-
module ViewComponent
|
9
|
-
module ContentAreas
|
10
|
-
extend ActiveSupport::Concern
|
11
|
-
|
12
|
-
# Assign the provided content to the content area accessor
|
13
|
-
#
|
14
|
-
# @private
|
15
|
-
def with(area, content = nil, &block)
|
16
|
-
unless content_areas.include?(area)
|
17
|
-
raise ArgumentError.new(
|
18
|
-
"Unknown content_area '#{area}' for #{self} - expected one of '#{content_areas}'.\n\n" \
|
19
|
-
"To fix this issue, add `with_content_area :#{area}` to #{self} or reference " \
|
20
|
-
"a valid content area."
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
if block
|
25
|
-
content = view_context.capture(&block)
|
26
|
-
end
|
27
|
-
|
28
|
-
instance_variable_set("@#{area}".to_sym, content)
|
29
|
-
nil
|
30
|
-
end
|
31
|
-
|
32
|
-
class_methods do
|
33
|
-
def with_content_areas(*areas)
|
34
|
-
ViewComponent::Deprecation.deprecation_warning(
|
35
|
-
"`with_content_areas`", "use slots (https://viewcomponent.org/guide/slots.html) instead"
|
36
|
-
)
|
37
|
-
|
38
|
-
if areas.include?(:content)
|
39
|
-
raise ArgumentError.new(
|
40
|
-
"#{self} defines a content area called :content, which is a reserved name. \n\n" \
|
41
|
-
"To fix this issue, use another name, such as `:body`."
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
areas.each do |area|
|
46
|
-
define_method area.to_sym do
|
47
|
-
content unless content_evaluated? # ensure content is loaded so content_areas will be defined
|
48
|
-
instance_variable_get(:"@#{area}") if instance_variable_defined?(:"@#{area}")
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
self.content_areas = areas
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ViewComponent
|
4
|
-
module PolymorphicSlots
|
5
|
-
# In older rails versions, using a concern isn't a good idea here because they appear to not work with
|
6
|
-
# Module#prepend and class methods.
|
7
|
-
def self.included(base)
|
8
|
-
if base != ViewComponent::Base
|
9
|
-
# :nocov:
|
10
|
-
location = Kernel.caller_locations(1, 1)[0]
|
11
|
-
|
12
|
-
warn(
|
13
|
-
"warning: ViewComponent::PolymorphicSlots is now included in ViewComponent::Base by default " \
|
14
|
-
"and can be removed from #{location.path}:#{location.lineno}"
|
15
|
-
)
|
16
|
-
# :nocov:
|
17
|
-
end
|
18
|
-
|
19
|
-
base.singleton_class.prepend(ClassMethods)
|
20
|
-
base.include(InstanceMethods)
|
21
|
-
end
|
22
|
-
|
23
|
-
module ClassMethods
|
24
|
-
def renders_one(slot_name, callable = nil)
|
25
|
-
return super unless callable.is_a?(Hash) && callable.key?(:types)
|
26
|
-
|
27
|
-
validate_singular_slot_name(slot_name)
|
28
|
-
register_polymorphic_slot(slot_name, callable[:types], collection: false)
|
29
|
-
end
|
30
|
-
|
31
|
-
def renders_many(slot_name, callable = nil)
|
32
|
-
return super unless callable.is_a?(Hash) && callable.key?(:types)
|
33
|
-
|
34
|
-
validate_plural_slot_name(slot_name)
|
35
|
-
register_polymorphic_slot(slot_name, callable[:types], collection: true)
|
36
|
-
end
|
37
|
-
|
38
|
-
def register_polymorphic_slot(slot_name, types, collection:)
|
39
|
-
unless types.empty?
|
40
|
-
getter_name = slot_name
|
41
|
-
|
42
|
-
define_method(getter_name) do
|
43
|
-
get_slot(slot_name)
|
44
|
-
end
|
45
|
-
|
46
|
-
define_method("#{getter_name}?") do
|
47
|
-
get_slot(slot_name).present?
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
renderable_hash = types.each_with_object({}) do |(poly_type, poly_callable), memo|
|
52
|
-
memo[poly_type] = define_slot(
|
53
|
-
"#{slot_name}_#{poly_type}", collection: collection, callable: poly_callable
|
54
|
-
)
|
55
|
-
|
56
|
-
setter_name =
|
57
|
-
if collection
|
58
|
-
"#{ActiveSupport::Inflector.singularize(slot_name)}_#{poly_type}"
|
59
|
-
else
|
60
|
-
"#{slot_name}_#{poly_type}"
|
61
|
-
end
|
62
|
-
|
63
|
-
define_method(setter_name) do |*args, &block|
|
64
|
-
if _warn_on_deprecated_slot_setter
|
65
|
-
ViewComponent::Deprecation.deprecation_warning(
|
66
|
-
"Using polymorphic slot setters like `#{setter_name}`",
|
67
|
-
:"`with_#{setter_name}`"
|
68
|
-
)
|
69
|
-
end
|
70
|
-
|
71
|
-
set_polymorphic_slot(slot_name, poly_type, *args, &block)
|
72
|
-
end
|
73
|
-
ruby2_keywords(setter_name.to_sym) if respond_to?(:ruby2_keywords, true)
|
74
|
-
|
75
|
-
define_method("with_#{setter_name}") do |*args, &block|
|
76
|
-
set_polymorphic_slot(slot_name, poly_type, *args, &block)
|
77
|
-
end
|
78
|
-
ruby2_keywords(:"with_#{setter_name}") if respond_to?(:ruby2_keywords, true)
|
79
|
-
end
|
80
|
-
|
81
|
-
registered_slots[slot_name] = {
|
82
|
-
collection: collection,
|
83
|
-
renderable_hash: renderable_hash
|
84
|
-
}
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
module InstanceMethods
|
89
|
-
def set_polymorphic_slot(slot_name, poly_type = nil, *args, &block)
|
90
|
-
slot_definition = self.class.registered_slots[slot_name]
|
91
|
-
|
92
|
-
if !slot_definition[:collection] && (defined?(@__vc_set_slots) && @__vc_set_slots[slot_name])
|
93
|
-
raise ArgumentError, "content for slot '#{slot_name}' has already been provided"
|
94
|
-
end
|
95
|
-
|
96
|
-
poly_def = slot_definition[:renderable_hash][poly_type]
|
97
|
-
|
98
|
-
set_slot(slot_name, poly_def, *args, &block)
|
99
|
-
end
|
100
|
-
ruby2_keywords(:set_polymorphic_slot) if respond_to?(:ruby2_keywords, true)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,98 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "view_component/with_content_helper"
|
4
|
-
|
5
|
-
module ViewComponent
|
6
|
-
class SlotV2
|
7
|
-
include ViewComponent::WithContentHelper
|
8
|
-
|
9
|
-
attr_writer :__vc_component_instance, :__vc_content_block, :__vc_content
|
10
|
-
|
11
|
-
def initialize(parent)
|
12
|
-
@parent = parent
|
13
|
-
end
|
14
|
-
|
15
|
-
# Used to render the slot content in the template
|
16
|
-
#
|
17
|
-
# There's currently 3 different values that may be set, that we can render.
|
18
|
-
#
|
19
|
-
# If the slot renderable is a component, the string class name of a
|
20
|
-
# component, or a function that returns a component, we render that
|
21
|
-
# component instance, returning the string.
|
22
|
-
#
|
23
|
-
# If the slot renderable is a function and returns a string, it's
|
24
|
-
# set as `@__vc_content` and is returned directly.
|
25
|
-
#
|
26
|
-
# If there is no slot renderable, we evaluate the block passed to
|
27
|
-
# the slot and return it.
|
28
|
-
def to_s
|
29
|
-
return @content if defined?(@content)
|
30
|
-
|
31
|
-
view_context = @parent.send(:view_context)
|
32
|
-
|
33
|
-
if defined?(@__vc_content_block) && defined?(@__vc_content_set_by_with_content)
|
34
|
-
raise ArgumentError.new(
|
35
|
-
"It looks like a block was provided after calling `with_content` on #{self.class.name}, " \
|
36
|
-
"which means that ViewComponent doesn't know which content to use.\n\n" \
|
37
|
-
"To fix this issue, use either `with_content` or a block."
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
@content =
|
42
|
-
if defined?(@__vc_component_instance)
|
43
|
-
@__vc_component_instance.__vc_original_view_context = @parent.__vc_original_view_context
|
44
|
-
|
45
|
-
if defined?(@__vc_content_set_by_with_content)
|
46
|
-
@__vc_component_instance.with_content(@__vc_content_set_by_with_content)
|
47
|
-
|
48
|
-
@__vc_component_instance.render_in(view_context)
|
49
|
-
elsif defined?(@__vc_content_block)
|
50
|
-
# render_in is faster than `parent.render`
|
51
|
-
@__vc_component_instance.render_in(view_context, &@__vc_content_block)
|
52
|
-
else
|
53
|
-
@__vc_component_instance.render_in(view_context)
|
54
|
-
end
|
55
|
-
elsif defined?(@__vc_content)
|
56
|
-
@__vc_content
|
57
|
-
elsif defined?(@__vc_content_block)
|
58
|
-
view_context.capture(&@__vc_content_block)
|
59
|
-
elsif defined?(@__vc_content_set_by_with_content)
|
60
|
-
@__vc_content_set_by_with_content
|
61
|
-
end
|
62
|
-
|
63
|
-
@content = @content.to_s
|
64
|
-
end
|
65
|
-
|
66
|
-
# Allow access to public component methods via the wrapper
|
67
|
-
#
|
68
|
-
# for example
|
69
|
-
#
|
70
|
-
# calling `header.name` (where `header` is a slot) will call `name`
|
71
|
-
# on the `HeaderComponent` instance.
|
72
|
-
#
|
73
|
-
# Where the component may look like:
|
74
|
-
#
|
75
|
-
# class MyComponent < ViewComponent::Base
|
76
|
-
# has_one :header, HeaderComponent
|
77
|
-
#
|
78
|
-
# class HeaderComponent < ViewComponent::Base
|
79
|
-
# def name
|
80
|
-
# @name
|
81
|
-
# end
|
82
|
-
# end
|
83
|
-
# end
|
84
|
-
#
|
85
|
-
def method_missing(symbol, *args, &block)
|
86
|
-
@__vc_component_instance.public_send(symbol, *args, &block)
|
87
|
-
end
|
88
|
-
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
89
|
-
|
90
|
-
def html_safe?
|
91
|
-
to_s.html_safe?
|
92
|
-
end
|
93
|
-
|
94
|
-
def respond_to_missing?(symbol, include_all = false)
|
95
|
-
defined?(@__vc_component_instance) && @__vc_component_instance.respond_to?(symbol, include_all)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|