view_component 3.17.0 → 3.18.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: 5f95cb571165fe8ad9d61f6236c5104ca6b9becec9c45e1f5bbb93f2e8bad487
4
- data.tar.gz: 2f547097278242f1b1c945341b0cbcefd455ce93d2ed61145209f92a7acd5c2b
3
+ metadata.gz: 0be77c737ede73cbe4b576fe19f6d4afd6f1c1cc61cea7a1f61f1a18e98f83a3
4
+ data.tar.gz: 1b97ac4a9b78e0784e9258f8104cea39b25e12533cb9037c451cacb545da85ea
5
5
  SHA512:
6
- metadata.gz: 51f0cbc8e8794c383cc2bbb97736e7be0da272c340c94ef9cf3927dd4526b58f73566aec5e1e37f0ee2a302fb99f0fec9a7f058620e6c051339db83426c8c852
7
- data.tar.gz: 8484fa046329adf95fd78946ad5ce4b1ab647d9f6e7546da4bee02fe56fb74f25b8ad35cffee4afdae726d99832ebbcfae47a056603c6cfa1c9df7ef1e6476f4
6
+ metadata.gz: 504c9c261f6921980feae7a7d2ec2cfb7676fca87800113d33eac5a2bdf4c4e12e82002144880270118f77eb30853a7d328a171a37ffdcf0efb706eda554bf33
7
+ data.tar.gz: 751f433ec0bf34e9737b70a6e3394d5e24e869781c5aa104921d4635467281d3ac33bcfeb8c40280a19873f897fda6a074a8842edfb4798a926fbe4a2e00851b
data/docs/CHANGELOG.md CHANGED
@@ -10,6 +10,32 @@ nav_order: 5
10
10
 
11
11
  ## main
12
12
 
13
+ ## 3.18.0
14
+
15
+ * Enable components to use `@request` and `request` methods/ivars.
16
+
17
+ *Blake Williams*
18
+
19
+ * Fix bug where implicit locales in component filenames threw a `NameError`.
20
+
21
+ *Chloe Fons*
22
+
23
+ * Register ViewComponent tests directory for `rails stats`.
24
+
25
+ *Javier Aranda*
26
+
27
+ * Wrap entire compile step in a mutex to make it more resilient to race conditions.
28
+
29
+ *Blake Williams*
30
+
31
+ * Add [Niva]([niva.co](https://www.niva.co/)) to companies who use `ViewComponent`.
32
+
33
+ *Daniel Vu Dao*
34
+
35
+ * Fix `preview_paths` in docs.
36
+
37
+ *Javier Aranda*
38
+
13
39
  ## 3.17.0
14
40
 
15
41
  * Use struct instead openstruct in lib code.
@@ -28,12 +54,12 @@ nav_order: 5
28
54
 
29
55
  *Alberto Rocha*
30
56
 
31
- ## 3.16.0
32
-
33
57
  * Fix development mode race condition that caused an invalid duplicate template error.
34
58
 
35
59
  *Blake Williams*
36
60
 
61
+ ## 3.16.0
62
+
37
63
  * Add template information to multiple template error messages.
38
64
 
39
65
  *Joel Hawksley*
@@ -109,10 +109,10 @@ module ViewComponent
109
109
 
110
110
  if render?
111
111
  rendered_template =
112
- if compiler.renders_template_for?(@__vc_variant, request&.format&.to_sym)
113
- render_template_for(@__vc_variant, request&.format&.to_sym)
112
+ if compiler.renders_template_for?(@__vc_variant, __vc_request&.format&.to_sym)
113
+ render_template_for(@__vc_variant, __vc_request&.format&.to_sym)
114
114
  else
115
- maybe_escape_html(render_template_for(@__vc_variant, request&.format&.to_sym)) do
115
+ maybe_escape_html(render_template_for(@__vc_variant, __vc_request&.format&.to_sym)) do
116
116
  Kernel.warn("WARNING: The #{self.class} component rendered HTML-unsafe output. The output will be automatically escaped, but you may want to investigate.")
117
117
  end
118
118
  end.to_s
@@ -286,7 +286,14 @@ module ViewComponent
286
286
  #
287
287
  # @return [ActionDispatch::Request]
288
288
  def request
289
- @request ||= controller.request if controller.respond_to?(:request)
289
+ __vc_request
290
+ end
291
+
292
+ # Enables consumers to override request/@request
293
+ #
294
+ # @private
295
+ def __vc_request
296
+ @__vc_request ||= controller.request if controller.respond_to?(:request)
290
297
  end
291
298
 
292
299
  # The content passed to the component instance as a block.
@@ -328,7 +335,7 @@ module ViewComponent
328
335
  end
329
336
 
330
337
  def maybe_escape_html(text)
331
- return text if request && !request.format.html?
338
+ return text if __vc_request && !__vc_request.format.html?
332
339
  return text if text.blank?
333
340
 
334
341
  if text.html_safe?
@@ -12,7 +12,7 @@ module ViewComponent
12
12
 
13
13
  def initialize(component)
14
14
  @component = component
15
- @redefinition_lock = Mutex.new
15
+ @lock = Mutex.new
16
16
  @rendered_templates = Set.new
17
17
  end
18
18
 
@@ -24,30 +24,36 @@ module ViewComponent
24
24
  return if compiled? && !force
25
25
  return if @component == ViewComponent::Base
26
26
 
27
- gather_templates
27
+ @lock.synchronize do
28
+ # this check is duplicated so that concurrent compile calls can still
29
+ # early exit
30
+ return if compiled? && !force
28
31
 
29
- if self.class.development_mode && @templates.any?(&:requires_compiled_superclass?)
30
- @component.superclass.compile(raise_errors: raise_errors)
31
- end
32
+ gather_templates
32
33
 
33
- if template_errors.present?
34
- raise TemplateError.new(template_errors) if raise_errors
34
+ if self.class.development_mode && @templates.any?(&:requires_compiled_superclass?)
35
+ @component.superclass.compile(raise_errors: raise_errors)
36
+ end
35
37
 
36
- # this return is load bearing, and prevents the component from being considered "compiled?"
37
- return false
38
- end
38
+ if template_errors.present?
39
+ raise TemplateError.new(template_errors) if raise_errors
39
40
 
40
- if raise_errors
41
- @component.validate_initialization_parameters!
42
- @component.validate_collection_parameter!
43
- end
41
+ # this return is load bearing, and prevents the component from being considered "compiled?"
42
+ return false
43
+ end
44
44
 
45
- define_render_template_for
45
+ if raise_errors
46
+ @component.validate_initialization_parameters!
47
+ @component.validate_collection_parameter!
48
+ end
49
+
50
+ define_render_template_for
46
51
 
47
- @component.register_default_slots
48
- @component.build_i18n_backend
52
+ @component.register_default_slots
53
+ @component.build_i18n_backend
49
54
 
50
- CompileCache.register(@component)
55
+ CompileCache.register(@component)
56
+ end
51
57
  end
52
58
 
53
59
  def renders_template_for?(variant, format)
@@ -60,9 +66,7 @@ module ViewComponent
60
66
 
61
67
  def define_render_template_for
62
68
  @templates.each do |template|
63
- @redefinition_lock.synchronize do
64
- template.compile_to_component
65
- end
69
+ template.compile_to_component
66
70
  end
67
71
 
68
72
  method_body =
@@ -93,14 +97,12 @@ module ViewComponent
93
97
  out << "else\n #{templates.find { _1.variant.nil? && _1.default_format? }.safe_method_name}\nend"
94
98
  end
95
99
 
96
- @redefinition_lock.synchronize do
97
- @component.silence_redefinition_of_method(:render_template_for)
98
- @component.class_eval <<-RUBY, __FILE__, __LINE__ + 1
99
- def render_template_for(variant = nil, format = nil)
100
- #{method_body}
101
- end
102
- RUBY
100
+ @component.silence_redefinition_of_method(:render_template_for)
101
+ @component.class_eval <<-RUBY, __FILE__, __LINE__ + 1
102
+ def render_template_for(variant = nil, format = nil)
103
+ #{method_body}
103
104
  end
105
+ RUBY
104
106
  end
105
107
 
106
108
  def template_errors
@@ -190,7 +192,7 @@ module ViewComponent
190
192
  path: path,
191
193
  lineno: 0,
192
194
  extension: path.split(".").last,
193
- this_format: this_format,
195
+ this_format: this_format.to_s.split(".").last&.to_sym, # strip locale from this_format, see #2113
194
196
  variant: variant
195
197
  )
196
198
 
@@ -152,7 +152,7 @@ module ViewComponent
152
152
  # @!attribute preview_paths
153
153
  # @return [Array<String>]
154
154
  # The locations in which component previews will be looked up.
155
- # Defaults to `['test/component/previews']` relative to your Rails root.
155
+ # Defaults to `['test/components/previews']` relative to your Rails root.
156
156
 
157
157
  # @!attribute test_controller
158
158
  # @return [String]
@@ -15,8 +15,14 @@ module ViewComponent
15
15
  else
16
16
  initializer "view_component.stats_directories" do |app|
17
17
  require "rails/code_statistics"
18
- dir = ViewComponent::Base.view_component_path
19
- Rails::CodeStatistics.register_directory("ViewComponents", dir)
18
+
19
+ if Rails.root.join(ViewComponent::Base.view_component_path).directory?
20
+ Rails::CodeStatistics.register_directory("ViewComponents", ViewComponent::Base.view_component_path)
21
+ end
22
+
23
+ if Rails.root.join("test/components").directory?
24
+ Rails::CodeStatistics.register_directory("ViewComponent tests", "test/components", test_directory: true)
25
+ end
20
26
  end
21
27
  end
22
28
 
@@ -7,8 +7,14 @@ namespace :view_component do
7
7
  # :nocov:
8
8
  require "rails/code_statistics"
9
9
 
10
- dir = ViewComponent::Base.view_component_path
11
- ::STATS_DIRECTORIES << ["ViewComponents", dir] if File.directory?(Rails.root + dir)
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
12
18
  # :nocov:
13
19
  end
14
20
  end
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 3
6
- MINOR = 17
6
+ MINOR = 18
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.17.0
4
+ version: 3.18.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-10-08 00:00:00.000000000 Z
11
+ date: 2024-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport