view_component 3.12.1 → 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 +4 -4
- data/docs/CHANGELOG.md +60 -4
- data/lib/view_component/base.rb +1 -0
- data/lib/view_component/compiler.rb +8 -2
- data/lib/view_component/instrumentation.rb +1 -1
- data/lib/view_component/preview.rb +1 -1
- data/lib/view_component/slotable.rb +1 -4
- data/lib/view_component/slotable_default.rb +20 -0
- data/lib/view_component/test_helpers.rb +4 -0
- data/lib/view_component/use_helpers.rb +32 -10
- data/lib/view_component/version.rb +2 -2
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ef8c603bedd61511ed3eb2da02cd7aaccc5b890ad20badac0cfc9a3e7d4af1e
|
4
|
+
data.tar.gz: f756c5bd11f44e7e8984d6cb6b29ec409dc082d83864ee4bd82c50adc784310c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8815314944335c3b69196bf5ba8779e10ec78a3146e8cc51d4d278d5e444035c8bc50858315c45e5556337e925ab94f4afee6b3283839079db6892292bec3581
|
7
|
+
data.tar.gz: 42c9159369779c50a9904525239d5bf3daa62ed5373104cb11f80251b9481a8225290421d0d9a5663e9f7c7e0bd4d73c63a53bc44845dc4b5bc23a0419869301
|
data/docs/CHANGELOG.md
CHANGED
@@ -10,6 +10,62 @@ 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
|
+
|
47
|
+
## 3.13.0
|
48
|
+
|
49
|
+
* Add ruby head and YJIT to CI.
|
50
|
+
|
51
|
+
*Reegan Viljoen*
|
52
|
+
|
53
|
+
* Fixed a bug where inline templates where unable to remove trailing whitespace without throwing an error.
|
54
|
+
|
55
|
+
*Reegan Viljoen*
|
56
|
+
|
57
|
+
* Fixed CI for Rails main.
|
58
|
+
|
59
|
+
*Reegan Viljoen*
|
60
|
+
|
61
|
+
* Add `from:` option to `use_helpers` to allow for more flexible helper inclusion from modules.
|
62
|
+
|
63
|
+
*Reegan Viljoen*
|
64
|
+
|
65
|
+
* Fixed ruby head matcher issue.
|
66
|
+
|
67
|
+
*Reegan Viljoen*
|
68
|
+
|
13
69
|
## 3.12.1
|
14
70
|
|
15
71
|
* Ensure content is rendered correctly for forwarded slots.
|
@@ -24,15 +80,15 @@ nav_order: 5
|
|
24
80
|
|
25
81
|
* Fix templates not being correctly populated when caller location label has a prefix.
|
26
82
|
|
27
|
-
On the upstream version of Ruby, method owners are now included in backtraces as prefixes. This caused the call stack filtering to not work as intended and thus `source_location` to be incorrect for child ViewComponents, consequently not populating templates correctly.
|
83
|
+
On the upstream version of Ruby, method owners are now included in backtraces as prefixes. This caused the call stack filtering to not work as intended and thus `source_location` to be incorrect for child ViewComponents, consequently not populating templates correctly.
|
28
84
|
|
29
85
|
*Allan Pires, Jason Kim*
|
30
86
|
|
31
87
|
* Use component path for generating RSpec files.
|
32
88
|
|
33
|
-
When generating new RSpec files for components, the generator will use the `view_component_path` value in the config to decide where to put the new spec file. For instance, if the `view_component_path` option has been changed to `app/views/components`, the generator will put the spec file in `spec/views/components`. **If the `view_component_path` doesn't start with `app/`, then the generator will fall back to `spec/components/`.**
|
89
|
+
When generating new RSpec files for components, the generator will use the `view_component_path` value in the config to decide where to put the new spec file. For instance, if the `view_component_path` option has been changed to `app/views/components`, the generator will put the spec file in `spec/views/components`. **If the `view_component_path` doesn't start with `app/`, then the generator will fall back to `spec/components/`.**
|
34
90
|
|
35
|
-
This feature is enabled via the `config.view_component.generate.use_component_path_for_rspec_tests` option, defaulting to `false`. The default will change to `true` in ViewComponent v4.
|
91
|
+
This feature is enabled via the `config.view_component.generate.use_component_path_for_rspec_tests` option, defaulting to `false`. The default will change to `true` in ViewComponent v4.
|
36
92
|
|
37
93
|
*William Mathewson*
|
38
94
|
|
@@ -56,7 +112,7 @@ This feature is enabled via the `config.view_component.generate.use_component_pa
|
|
56
112
|
|
57
113
|
* Include ViewComponent::UseHelpers by default.
|
58
114
|
|
59
|
-
|
115
|
+
*Reegan Viljoen*
|
60
116
|
|
61
117
|
* Bump `puma` in Gemfile.lock.
|
62
118
|
|
data/lib/view_component/base.rb
CHANGED
@@ -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)
|
@@ -247,9 +253,9 @@ module ViewComponent
|
|
247
253
|
|
248
254
|
def compiled_inline_template(template)
|
249
255
|
handler = ActionView::Template.handler_for_extension(template.language)
|
250
|
-
template
|
256
|
+
template = template.source.dup
|
251
257
|
|
252
|
-
compile_template(template
|
258
|
+
compile_template(template, handler)
|
253
259
|
end
|
254
260
|
|
255
261
|
def compiled_template(file_path)
|
@@ -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}/**/*
|
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
|
-
|
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,17 +4,39 @@ module ViewComponent::UseHelpers
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
class_methods do
|
7
|
-
def use_helpers(*args)
|
8
|
-
args.each
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
def use_helpers(*args, from: nil, prefix: false)
|
8
|
+
args.each { |helper_method| use_helper(helper_method, from: from, prefix: prefix) }
|
9
|
+
end
|
10
|
+
|
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
|
+
|
14
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
15
|
+
def #{helper_method_name}(*args, &block)
|
16
|
+
raise HelpersCalledBeforeRenderError if view_context.nil?
|
17
|
+
|
18
|
+
#{define_helper(helper_method: helper_method, source: from)}
|
19
|
+
end
|
20
|
+
RUBY
|
21
|
+
ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
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}"
|
17
33
|
end
|
18
34
|
end
|
35
|
+
|
36
|
+
def define_helper(helper_method:, source:)
|
37
|
+
return "__vc_original_view_context.#{helper_method}(*args, &block)" unless source.present?
|
38
|
+
|
39
|
+
"#{source}.instance_method(:#{helper_method}).bind(self).call(*args, &block)"
|
40
|
+
end
|
19
41
|
end
|
20
42
|
end
|
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.
|
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-
|
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
|
@@ -561,7 +576,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
561
576
|
- !ruby/object:Gem::Version
|
562
577
|
version: '0'
|
563
578
|
requirements: []
|
564
|
-
rubygems_version: 3.5.
|
579
|
+
rubygems_version: 3.5.3
|
565
580
|
signing_key:
|
566
581
|
specification_version: 4
|
567
582
|
summary: A framework for building reusable, testable & encapsulated view components
|