view_component 3.22.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/view_component/preview_actions.rb +2 -9
  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 +127 -1
  7. data/lib/view_component/base.rb +41 -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/deprecation.rb +1 -1
  12. data/lib/view_component/engine.rb +3 -82
  13. data/lib/view_component/errors.rb +16 -22
  14. data/lib/view_component/inline_template.rb +2 -3
  15. data/lib/view_component/instrumentation.rb +4 -10
  16. data/lib/view_component/preview.rb +3 -10
  17. data/lib/view_component/request_details.rb +30 -0
  18. data/lib/view_component/slot.rb +2 -5
  19. data/lib/view_component/slotable.rb +31 -39
  20. data/lib/view_component/system_test_helpers.rb +1 -2
  21. data/lib/view_component/template.rb +106 -83
  22. data/lib/view_component/test_helpers.rb +22 -42
  23. data/lib/view_component/translatable.rb +24 -23
  24. data/lib/view_component/use_helpers.rb +3 -4
  25. data/lib/view_component/version.rb +3 -3
  26. data/lib/view_component.rb +0 -1
  27. metadata +73 -220
  28. data/app/assets/vendor/prism.css +0 -4
  29. data/app/assets/vendor/prism.min.js +0 -12
  30. data/app/helpers/preview_helper.rb +0 -85
  31. data/app/views/view_components/_preview_source.html.erb +0 -17
  32. data/lib/rails/generators/abstract_generator.rb +0 -56
  33. data/lib/rails/generators/component/USAGE +0 -13
  34. data/lib/rails/generators/component/component_generator.rb +0 -67
  35. data/lib/rails/generators/component/templates/component.rb.tt +0 -16
  36. data/lib/rails/generators/erb/component_generator.rb +0 -33
  37. data/lib/rails/generators/erb/templates/component.html.erb.tt +0 -1
  38. data/lib/rails/generators/haml/component_generator.rb +0 -22
  39. data/lib/rails/generators/haml/templates/component.html.haml.tt +0 -1
  40. data/lib/rails/generators/locale/component_generator.rb +0 -46
  41. data/lib/rails/generators/preview/component_generator.rb +0 -39
  42. data/lib/rails/generators/preview/templates/component_preview.rb.tt +0 -9
  43. data/lib/rails/generators/rspec/component_generator.rb +0 -31
  44. data/lib/rails/generators/rspec/templates/component_spec.rb.tt +0 -15
  45. data/lib/rails/generators/slim/component_generator.rb +0 -22
  46. data/lib/rails/generators/slim/templates/component.html.slim.tt +0 -1
  47. data/lib/rails/generators/stimulus/component_generator.rb +0 -44
  48. data/lib/rails/generators/stimulus/templates/component_controller.js.tt +0 -7
  49. data/lib/rails/generators/stimulus/templates/component_controller.ts.tt +0 -9
  50. data/lib/rails/generators/tailwindcss/component_generator.rb +0 -11
  51. data/lib/rails/generators/tailwindcss/templates/component.html.erb.tt +0 -1
  52. data/lib/rails/generators/test_unit/component_generator.rb +0 -20
  53. data/lib/rails/generators/test_unit/templates/component_test.rb.tt +0 -12
  54. data/lib/view_component/component_error.rb +0 -6
  55. data/lib/view_component/docs_builder_component.html.erb +0 -22
  56. data/lib/view_component/docs_builder_component.rb +0 -96
  57. data/lib/view_component/rails/tasks/view_component.rake +0 -20
  58. data/lib/view_component/render_component_helper.rb +0 -10
  59. data/lib/view_component/render_component_to_string_helper.rb +0 -9
  60. data/lib/view_component/render_monkey_patch.rb +0 -13
  61. data/lib/view_component/render_to_string_monkey_patch.rb +0 -13
  62. data/lib/view_component/rendering_component_helper.rb +0 -9
  63. data/lib/view_component/rendering_monkey_patch.rb +0 -13
  64. data/lib/yard/mattr_accessor_handler.rb +0 -19
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "erb"
4
- require "set"
5
4
  require "i18n"
6
5
  require "active_support/concern"
7
6
 
@@ -10,19 +9,22 @@ module ViewComponent
10
9
  extend ActiveSupport::Concern
11
10
 
12
11
  HTML_SAFE_TRANSLATION_KEY = /(?:_|\b)html\z/
12
+ private_constant :HTML_SAFE_TRANSLATION_KEY
13
+
13
14
  TRANSLATION_EXTENSIONS = %w[yml yaml].freeze
15
+ private_constant :TRANSLATION_EXTENSIONS
14
16
 
15
17
  included do
16
- class_attribute :i18n_backend, instance_writer: false, instance_predicate: false
18
+ class_attribute :__vc_i18n_backend, instance_writer: false, instance_predicate: false
17
19
  end
18
20
 
19
21
  class_methods do
20
- def i18n_scope
21
- @i18n_scope ||= virtual_path.sub(%r{^/}, "").gsub(%r{/_?}, ".")
22
+ def __vc_i18n_scope
23
+ @__vc_i18n_scope ||= virtual_path.sub(%r{^/}, "").gsub(%r{/_?}, ".")
22
24
  end
23
25
 
24
- def build_i18n_backend
25
- return if compiled?
26
+ def __vc_build_i18n_backend
27
+ return if __vc_compiled?
26
28
 
27
29
  # We need to load the translations files from the ancestors so a component
28
30
  # can inherit translations from its parent and is able to overwrite them.
@@ -33,31 +35,31 @@ module ViewComponent
33
35
  end
34
36
 
35
37
  # In development it will become nil if the translations file is removed
36
- self.i18n_backend = if translation_files.any?
38
+ self.__vc_i18n_backend = if translation_files.any?
37
39
  I18nBackend.new(
38
- i18n_scope: i18n_scope,
40
+ scope: __vc_i18n_scope,
39
41
  load_paths: translation_files
40
42
  )
41
43
  end
42
44
  end
43
45
 
44
- def i18n_key(key, scope = nil)
46
+ def __vc_i18n_key(key, scope = nil)
45
47
  scope = scope.join(".") if scope.is_a? Array
46
48
  key = key&.to_s unless key.is_a?(String)
47
49
  key = "#{scope}.#{key}" if scope
48
- key = "#{i18n_scope}#{key}" if key.start_with?(".")
50
+ key = "#{__vc_i18n_scope}#{key}" if key.start_with?(".")
49
51
  key
50
52
  end
51
53
 
52
54
  def translate(key = nil, **options)
53
55
  return key.map { |k| translate(k, **options) } if key.is_a?(Array)
54
56
 
55
- ensure_compiled
57
+ __vc_ensure_compiled
56
58
 
57
59
  locale = options.delete(:locale) || ::I18n.locale
58
- key = i18n_key(key, options.delete(:scope))
60
+ key = __vc_i18n_key(key, options.delete(:scope))
59
61
 
60
- i18n_backend.translate(locale, key, options)
62
+ __vc_i18n_backend.translate(locale, key, options)
61
63
  end
62
64
 
63
65
  alias_method :t, :translate
@@ -66,8 +68,8 @@ module ViewComponent
66
68
  class I18nBackend < ::I18n::Backend::Simple
67
69
  EMPTY_HASH = {}.freeze
68
70
 
69
- def initialize(i18n_scope:, load_paths:)
70
- @i18n_scope = i18n_scope.split(".").map(&:to_sym)
71
+ def initialize(scope:, load_paths:)
72
+ @__vc_i18n_scope = scope.split(".").map(&:to_sym)
71
73
  @load_paths = load_paths
72
74
  end
73
75
 
@@ -77,7 +79,7 @@ module ViewComponent
77
79
  end
78
80
 
79
81
  def scope_data(data)
80
- @i18n_scope.reverse_each do |part|
82
+ @__vc_i18n_scope.reverse_each do |part|
81
83
  data = {part => data}
82
84
  end
83
85
  data
@@ -91,19 +93,19 @@ module ViewComponent
91
93
  def translate(key = nil, **options)
92
94
  raise ViewComponent::TranslateCalledBeforeRenderError if view_context.nil?
93
95
 
94
- return super unless i18n_backend
96
+ return super unless __vc_i18n_backend
95
97
  return key.map { |k| translate(k, **options) } if key.is_a?(Array)
96
98
 
97
99
  locale = options.delete(:locale) || ::I18n.locale
98
- key = self.class.i18n_key(key, options.delete(:scope))
100
+ key = self.class.__vc_i18n_key(key, options.delete(:scope))
99
101
  as_html = HTML_SAFE_TRANSLATION_KEY.match?(key)
100
102
 
101
103
  html_escape_translation_options!(options) if as_html
102
104
 
103
- if key.start_with?(i18n_scope + ".")
105
+ if key.start_with?(__vc_i18n_scope + ".")
104
106
  translated =
105
107
  catch(:exception) do
106
- i18n_backend.translate(locale, key, options)
108
+ __vc_i18n_backend.translate(locale, key, options)
107
109
  end
108
110
 
109
111
  # Fallback to the global translations
@@ -119,9 +121,8 @@ module ViewComponent
119
121
  end
120
122
  alias_method :t, :translate
121
123
 
122
- # Exposes .i18n_scope as an instance method
123
- def i18n_scope
124
- self.class.i18n_scope
124
+ def __vc_i18n_scope
125
+ self.class.__vc_i18n_scope
125
126
  end
126
127
 
127
128
  private
@@ -12,13 +12,12 @@ module ViewComponent::UseHelpers
12
12
  helper_method_name = full_helper_method_name(helper_method, prefix: prefix, source: from)
13
13
 
14
14
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
15
- def #{helper_method_name}(*args, &block)
15
+ def #{helper_method_name}(...)
16
16
  raise HelpersCalledBeforeRenderError if view_context.nil?
17
17
 
18
18
  #{define_helper(helper_method: helper_method, source: from)}
19
19
  end
20
20
  RUBY
21
- ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
22
21
  end
23
22
 
24
23
  private
@@ -34,9 +33,9 @@ module ViewComponent::UseHelpers
34
33
  end
35
34
 
36
35
  def define_helper(helper_method:, source:)
37
- return "__vc_original_view_context.#{helper_method}(*args, &block)" unless source.present?
36
+ return "__vc_original_view_context.#{helper_method}(...)" unless source.present?
38
37
 
39
- "#{source}.instance_method(:#{helper_method}).bind(self).call(*args, &block)"
38
+ "#{source}.instance_method(:#{helper_method}).bind(self).call(...)"
40
39
  end
41
40
  end
42
41
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module ViewComponent
4
4
  module VERSION
5
- MAJOR = 3
6
- MINOR = 22
5
+ MAJOR = 4
6
+ MINOR = 0
7
7
  PATCH = 0
8
- PRE = nil
8
+ PRE = "alpha1"
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
11
11
  end
@@ -10,7 +10,6 @@ module ViewComponent
10
10
  autoload :CaptureCompatibility
11
11
  autoload :Compiler
12
12
  autoload :CompileCache
13
- autoload :ComponentError
14
13
  autoload :Config
15
14
  autoload :Deprecation
16
15
  autoload :InlineTemplate