view_component 3.21.0 → 4.0.0.alpha1

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/view_component/preview_actions.rb +1 -1
  3. data/app/controllers/view_components_system_test_controller.rb +17 -20
  4. data/app/views/test_mailer/test_asset_email.html.erb +1 -0
  5. data/app/views/view_components/preview.html.erb +1 -9
  6. data/docs/CHANGELOG.md +171 -1
  7. data/lib/view_component/base.rb +45 -61
  8. data/lib/view_component/collection.rb +11 -17
  9. data/lib/view_component/compiler.rb +50 -74
  10. data/lib/view_component/config.rb +0 -21
  11. data/lib/view_component/configurable.rb +17 -0
  12. data/lib/view_component/deprecation.rb +1 -1
  13. data/lib/view_component/engine.rb +3 -82
  14. data/lib/view_component/errors.rb +19 -25
  15. data/lib/view_component/inline_template.rb +2 -3
  16. data/lib/view_component/instrumentation.rb +4 -10
  17. data/lib/view_component/preview.rb +3 -10
  18. data/lib/view_component/request_details.rb +30 -0
  19. data/lib/view_component/slot.rb +2 -5
  20. data/lib/view_component/slotable.rb +31 -39
  21. data/lib/view_component/system_test_helpers.rb +1 -2
  22. data/lib/view_component/template.rb +106 -83
  23. data/lib/view_component/test_helpers.rb +22 -42
  24. data/lib/view_component/translatable.rb +24 -23
  25. data/lib/view_component/use_helpers.rb +3 -4
  26. data/lib/view_component/version.rb +3 -3
  27. data/lib/view_component.rb +0 -1
  28. metadata +76 -213
  29. data/app/assets/vendor/prism.css +0 -4
  30. data/app/assets/vendor/prism.min.js +0 -12
  31. data/app/helpers/preview_helper.rb +0 -85
  32. data/app/views/view_components/_preview_source.html.erb +0 -17
  33. data/lib/rails/generators/abstract_generator.rb +0 -56
  34. data/lib/rails/generators/component/USAGE +0 -13
  35. data/lib/rails/generators/component/component_generator.rb +0 -67
  36. data/lib/rails/generators/component/templates/component.rb.tt +0 -16
  37. data/lib/rails/generators/erb/component_generator.rb +0 -33
  38. data/lib/rails/generators/erb/templates/component.html.erb.tt +0 -1
  39. data/lib/rails/generators/haml/component_generator.rb +0 -22
  40. data/lib/rails/generators/haml/templates/component.html.haml.tt +0 -1
  41. data/lib/rails/generators/locale/component_generator.rb +0 -46
  42. data/lib/rails/generators/preview/component_generator.rb +0 -39
  43. data/lib/rails/generators/preview/templates/component_preview.rb.tt +0 -9
  44. data/lib/rails/generators/rspec/component_generator.rb +0 -31
  45. data/lib/rails/generators/rspec/templates/component_spec.rb.tt +0 -15
  46. data/lib/rails/generators/slim/component_generator.rb +0 -22
  47. data/lib/rails/generators/slim/templates/component.html.slim.tt +0 -1
  48. data/lib/rails/generators/stimulus/component_generator.rb +0 -44
  49. data/lib/rails/generators/stimulus/templates/component_controller.js.tt +0 -7
  50. data/lib/rails/generators/stimulus/templates/component_controller.ts.tt +0 -9
  51. data/lib/rails/generators/tailwindcss/component_generator.rb +0 -11
  52. data/lib/rails/generators/tailwindcss/templates/component.html.erb.tt +0 -1
  53. data/lib/rails/generators/test_unit/component_generator.rb +0 -20
  54. data/lib/rails/generators/test_unit/templates/component_test.rb.tt +0 -12
  55. data/lib/view_component/component_error.rb +0 -6
  56. data/lib/view_component/docs_builder_component.html.erb +0 -22
  57. data/lib/view_component/docs_builder_component.rb +0 -96
  58. data/lib/view_component/rails/tasks/view_component.rake +0 -20
  59. data/lib/view_component/render_component_helper.rb +0 -10
  60. data/lib/view_component/render_component_to_string_helper.rb +0 -9
  61. data/lib/view_component/render_monkey_patch.rb +0 -13
  62. data/lib/view_component/render_to_string_monkey_patch.rb +0 -13
  63. data/lib/view_component/rendering_component_helper.rb +0 -9
  64. data/lib/view_component/rendering_monkey_patch.rb +0 -13
  65. data/lib/yard/mattr_accessor_handler.rb +0 -19
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TestUnit
4
- module Generators
5
- class ComponentGenerator < ::Rails::Generators::NamedBase
6
- source_root File.expand_path("templates", __dir__)
7
- check_class_collision suffix: "ComponentTest"
8
-
9
- def create_test_file
10
- template "component_test.rb", File.join("test/components", class_path, "#{file_name}_component_test.rb")
11
- end
12
-
13
- private
14
-
15
- def file_name
16
- @_file_name ||= super.sub(/_component\z/i, "")
17
- end
18
- end
19
- end
20
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class <%= namespaced? ? "#{namespace.name}::" : '' %><%= class_name %>ComponentTest < ViewComponent::TestCase
6
- def test_component_renders_something_useful
7
- # assert_equal(
8
- # %(<span>Hello, components!</span>),
9
- # render_inline(<%= class_name %>Component.new(message: "Hello, components!")).css("span").to_html
10
- # )
11
- end
12
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- class ComponentError < StandardError
5
- end
6
- end
@@ -1,22 +0,0 @@
1
- ---
2
- layout: default
3
- title: API reference
4
- nav_order: 3
5
- ---
6
-
7
- <!-- Warning: AUTO-GENERATED file, don't edit. Add code comments to your Ruby instead <3 -->
8
-
9
- # API
10
-
11
- <% @sections.each do |section| %>
12
- ## <%= section.heading %>
13
-
14
- <% section.methods.each do |method| %>
15
- ### <%== render ViewComponent::DocsBuilderComponent::MethodDoc.new(method, section.show_types) %>
16
-
17
- <% end %>
18
- <% section.error_klasses.each do |error_klass| %>
19
- ### <%== render ViewComponent::DocsBuilderComponent::ErrorKlassDoc.new(error_klass, section.show_types) %>
20
-
21
- <% end %>
22
- <% end %>
@@ -1,96 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- class DocsBuilderComponent < Base
5
- class Section < Struct.new(:heading, :methods, :error_klasses, :show_types, keyword_init: true)
6
- def initialize(heading: nil, methods: [], error_klasses: [], show_types: true)
7
- methods.sort_by! { |method| method[:name] }
8
- error_klasses.sort!
9
- super
10
- end
11
- end
12
-
13
- class ErrorKlassDoc < ViewComponent::Base
14
- def initialize(error_klass, _show_types)
15
- @error_klass = error_klass
16
- end
17
-
18
- def klass_name
19
- @error_klass.gsub("ViewComponent::", "").gsub("::MESSAGE", "")
20
- end
21
-
22
- def error_message
23
- ViewComponent.const_get(@error_klass)
24
- end
25
-
26
- def call
27
- <<~DOCS.chomp
28
- `#{klass_name}`
29
-
30
- #{error_message}
31
- DOCS
32
- end
33
- end
34
-
35
- class MethodDoc < ViewComponent::Base
36
- def initialize(method, show_types = true)
37
- @method = method
38
- @show_types = show_types
39
- end
40
-
41
- def deprecated?
42
- @method.tag(:deprecated).present?
43
- end
44
-
45
- def suffix
46
- " (Deprecated)" if deprecated?
47
- end
48
-
49
- def types
50
- " → [#{@method.tag(:return).types.join(",")}]" if @method.tag(:return)&.types && @show_types
51
- end
52
-
53
- def signature_or_name
54
- @method.signature ? @method.signature.gsub("def ", "") : @method.name
55
- end
56
-
57
- def separator
58
- @method.sep
59
- end
60
-
61
- def docstring
62
- @method.docstring
63
- end
64
-
65
- def deprecation_text
66
- @method.tag(:deprecated)&.text
67
- end
68
-
69
- def docstring_and_deprecation_text
70
- <<~DOCS.strip
71
- #{docstring}
72
-
73
- #{"_#{deprecation_text}_" if deprecated?}
74
- DOCS
75
- end
76
-
77
- def call
78
- <<~DOCS.chomp
79
- `#{separator}#{signature_or_name}`#{types}#{suffix}
80
-
81
- #{docstring_and_deprecation_text}
82
- DOCS
83
- end
84
- end
85
-
86
- # { heading: String, public_only: Boolean, show_types: Boolean}
87
- def initialize(sections: [])
88
- @sections = sections
89
- end
90
-
91
- # deprecation
92
- # return
93
- # only public methods
94
- # sig with types or name
95
- end
96
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- task stats: "view_component:statsetup"
4
-
5
- namespace :view_component do
6
- task :statsetup do
7
- # :nocov:
8
- require "rails/code_statistics"
9
-
10
- if Rails.root.join(ViewComponent::Base.view_component_path).directory?
11
- ::STATS_DIRECTORIES << ["ViewComponents", ViewComponent::Base.view_component_path]
12
- end
13
-
14
- if Rails.root.join("test/components").directory?
15
- ::STATS_DIRECTORIES << ["ViewComponent tests", "test/components"]
16
- CodeStatistics::TEST_TYPES << "ViewComponent tests"
17
- end
18
- # :nocov:
19
- end
20
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderComponentHelper # :nodoc:
5
- def render_component(component, &block)
6
- component.set_original_view_context(__vc_original_view_context) if is_a?(ViewComponent::Base)
7
- component.render_in(self, &block)
8
- end
9
- end
10
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderComponentToStringHelper # :nodoc:
5
- def render_component_to_string(component)
6
- component.render_in(view_context)
7
- end
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderMonkeyPatch # :nodoc:
5
- def render(options = {}, args = {}, &block)
6
- if options.respond_to?(:render_in)
7
- options.render_in(self, &block)
8
- else
9
- super
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderToStringMonkeyPatch # :nodoc:
5
- def render_to_string(options = {}, args = {})
6
- if options.respond_to?(:render_in)
7
- options.render_in(view_context)
8
- else
9
- super
10
- end
11
- end
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderingComponentHelper # :nodoc:
5
- def render_component(component)
6
- self.response_body = component.render_in(view_context)
7
- end
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- module RenderingMonkeyPatch # :nodoc:
5
- def render(options = {}, args = {})
6
- if options.respond_to?(:render_in)
7
- self.response_body = options.render_in(view_context)
8
- else
9
- super
10
- end
11
- end
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module YARD
4
- # YARD Handler to parse `mattr_accessor` calls.
5
- class MattrAccessorHandler < YARD::Handlers::Ruby::Base
6
- handles method_call(:mattr_accessor)
7
- namespace_only
8
-
9
- process do
10
- name = statement.parameters.first.jump(:tstring_content, :ident).source
11
- object = YARD::CodeObjects::MethodObject.new(namespace, name)
12
- register(object)
13
- parse_block(statement.last, owner: object)
14
-
15
- object.dynamic = true
16
- object[:mattr_accessor] = true
17
- end
18
- end
19
- end