view_component 2.31.0 → 2.35.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.

Potentially problematic release.


This version of view_component might be problematic. Click here for more details.

Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/vendor/prism.css +196 -0
  4. data/app/assets/vendor/prism.min.js +12 -0
  5. data/app/helpers/preview_helper.rb +19 -0
  6. data/app/views/test_mailer/test_email.html.erb +1 -0
  7. data/app/views/view_components/_preview_source.html.erb +17 -0
  8. data/app/views/view_components/preview.html.erb +6 -2
  9. data/{CHANGELOG.md → docs/CHANGELOG.md} +131 -1
  10. data/lib/rails/generators/abstract_generator.rb +29 -0
  11. data/lib/rails/generators/component/component_generator.rb +5 -5
  12. data/lib/rails/generators/erb/component_generator.rb +7 -16
  13. data/lib/rails/generators/haml/component_generator.rb +6 -16
  14. data/lib/rails/generators/slim/component_generator.rb +6 -16
  15. data/lib/view_component.rb +2 -0
  16. data/lib/view_component/base.rb +142 -74
  17. data/lib/view_component/collection.rb +3 -1
  18. data/lib/view_component/compile_cache.rb +1 -0
  19. data/lib/view_component/compiler.rb +58 -54
  20. data/lib/view_component/content_areas.rb +50 -0
  21. data/lib/view_component/engine.rb +19 -2
  22. data/lib/view_component/instrumentation.rb +17 -0
  23. data/lib/view_component/preview.rb +14 -7
  24. data/lib/view_component/previewable.rb +16 -18
  25. data/lib/view_component/slot_v2.rb +28 -27
  26. data/lib/view_component/slotable.rb +2 -1
  27. data/lib/view_component/slotable_v2.rb +23 -22
  28. data/lib/view_component/test_helpers.rb +6 -1
  29. data/lib/view_component/translatable.rb +6 -5
  30. data/lib/view_component/version.rb +1 -1
  31. data/lib/view_component/with_content_helper.rb +1 -1
  32. data/lib/yard/mattr_accessor_handler.rb +19 -0
  33. metadata +94 -43
@@ -123,6 +123,7 @@ module ViewComponent
123
123
  slot_instance = args.present? ? slot_class.new(**args) : slot_class.new
124
124
 
125
125
  # Capture block and assign to slot_instance#content
126
+ # rubocop:disable Rails/OutputSafety
126
127
  slot_instance.content = view_context.capture(&block).to_s.strip.html_safe if block_given?
127
128
 
128
129
  if slot[:collection]
@@ -135,7 +136,7 @@ module ViewComponent
135
136
  # Append Slot instance to collection accessor Array
136
137
  instance_variable_get(slot[:instance_variable_name]) << slot_instance
137
138
  else
138
- # Assign the Slot instance to the slot accessor
139
+ # Assign the Slot instance to the slot accessor
139
140
  instance_variable_set(slot[:instance_variable_name], slot_instance)
140
141
  end
141
142
 
@@ -60,7 +60,7 @@ module ViewComponent
60
60
  # helper method with the same name as the slot.
61
61
  #
62
62
  # <%= render_inline(MyComponent.new) do |component| %>
63
- # <%= component.header(classes: "Foo") do %>
63
+ # <% component.header(classes: "Foo") do %>
64
64
  # <p>Bar</p>
65
65
  # <% end %>
66
66
  # <% end %>
@@ -95,7 +95,7 @@ module ViewComponent
95
95
  # helper method with the same name as the slot.
96
96
  #
97
97
  # <h1>
98
- # <%= items.each do |item| %>
98
+ # <% items.each do |item| %>
99
99
  # <%= item %>
100
100
  # <% end %>
101
101
  # </h1>
@@ -107,11 +107,11 @@ module ViewComponent
107
107
  # called multiple times to append to the slot.
108
108
  #
109
109
  # <%= render_inline(MyComponent.new) do |component| %>
110
- # <%= component.item(name: "Foo") do %>
110
+ # <% component.item(name: "Foo") do %>
111
111
  # <p>One</p>
112
112
  # <% end %>
113
113
  #
114
- # <%= component.item(name: "Bar") do %>
114
+ # <% component.item(name: "Bar") do %>
115
115
  # <p>two</p>
116
116
  # <% end %>
117
117
  # <% end %>
@@ -190,10 +190,10 @@ module ViewComponent
190
190
  content unless content_evaluated? # ensure content is loaded so slots will be defined
191
191
 
192
192
  slot = self.class.registered_slots[slot_name]
193
- @_set_slots ||= {}
193
+ @__vc_set_slots ||= {}
194
194
 
195
- if @_set_slots[slot_name]
196
- return @_set_slots[slot_name]
195
+ if @__vc_set_slots[slot_name]
196
+ return @__vc_set_slots[slot_name]
197
197
  end
198
198
 
199
199
  if slot[:collection]
@@ -217,42 +217,43 @@ module ViewComponent
217
217
  # 2. Since we have to pass block content to components when calling
218
218
  # `render`, evaluating the block here would require us to call
219
219
  # `view_context.capture` twice, which is slower
220
- slot._content_block = block if block_given?
220
+ slot.__vc_content_block = block if block_given?
221
221
 
222
222
  # If class
223
223
  if slot_definition[:renderable]
224
- slot._component_instance = slot_definition[:renderable].new(*args, **kwargs)
224
+ slot.__vc_component_instance = slot_definition[:renderable].new(*args, **kwargs)
225
225
  # If class name as a string
226
226
  elsif slot_definition[:renderable_class_name]
227
- slot._component_instance = self.class.const_get(slot_definition[:renderable_class_name]).new(*args, **kwargs)
227
+ slot.__vc_component_instance = self.class.const_get(slot_definition[:renderable_class_name]).new(*args, **kwargs)
228
228
  # If passed a lambda
229
229
  elsif slot_definition[:renderable_function]
230
230
  # Use `bind(self)` to ensure lambda is executed in the context of the
231
231
  # current component. This is necessary to allow the lambda to access helper
232
232
  # methods like `content_tag` as well as parent component state.
233
- renderable_value = if block_given?
234
- slot_definition[:renderable_function].bind(self).call(*args, **kwargs) do |*args, **kwargs|
235
- view_context.capture(*args, **kwargs, &block)
233
+ renderable_value =
234
+ if block_given?
235
+ slot_definition[:renderable_function].bind(self).call(*args, **kwargs) do |*args, **kwargs|
236
+ view_context.capture(*args, **kwargs, &block)
237
+ end
238
+ else
239
+ slot_definition[:renderable_function].bind(self).call(*args, **kwargs)
236
240
  end
237
- else
238
- slot_definition[:renderable_function].bind(self).call(*args, **kwargs)
239
- end
240
241
 
241
242
  # Function calls can return components, so if it's a component handle it specially
242
243
  if renderable_value.respond_to?(:render_in)
243
- slot._component_instance = renderable_value
244
+ slot.__vc_component_instance = renderable_value
244
245
  else
245
- slot._content = renderable_value
246
+ slot.__vc_content = renderable_value
246
247
  end
247
248
  end
248
249
 
249
- @_set_slots ||= {}
250
+ @__vc_set_slots ||= {}
250
251
 
251
252
  if slot_definition[:collection]
252
- @_set_slots[slot_name] ||= []
253
- @_set_slots[slot_name].push(slot)
253
+ @__vc_set_slots[slot_name] ||= []
254
+ @__vc_set_slots[slot_name].push(slot)
254
255
  else
255
- @_set_slots[slot_name] = slot
256
+ @__vc_set_slots[slot_name] = slot
256
257
  end
257
258
 
258
259
  slot
@@ -39,7 +39,12 @@ module ViewComponent
39
39
  end
40
40
 
41
41
  def request
42
- @request ||= ActionDispatch::TestRequest.create
42
+ @request ||=
43
+ begin
44
+ request = ActionDispatch::TestRequest.create
45
+ request.session = ActionController::TestSession.new
46
+ request
47
+ end
43
48
  end
44
49
 
45
50
  def with_variant(variant)
@@ -52,7 +52,7 @@ module ViewComponent
52
52
 
53
53
  def scope_data(data)
54
54
  @i18n_scope.reverse_each do |part|
55
- data = { part => data}
55
+ data = { part => data }
56
56
  end
57
57
  data
58
58
  end
@@ -70,9 +70,10 @@ module ViewComponent
70
70
  key = key&.to_s unless key.is_a?(String)
71
71
  key = "#{i18n_scope}#{key}" if key.start_with?(".")
72
72
 
73
- translated = catch(:exception) do
74
- i18n_backend.translate(locale, key, options)
75
- end
73
+ translated =
74
+ catch(:exception) do
75
+ i18n_backend.translate(locale, key, options)
76
+ end
76
77
 
77
78
  # Fallback to the global translations
78
79
  if translated.is_a? ::I18n::MissingTranslation
@@ -80,7 +81,7 @@ module ViewComponent
80
81
  end
81
82
 
82
83
  if HTML_SAFE_TRANSLATION_KEY.match?(key)
83
- translated = translated.html_safe
84
+ translated = translated.html_safe # rubocop:disable Rails/OutputSafety
84
85
  end
85
86
 
86
87
  translated
@@ -3,7 +3,7 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 31
6
+ MINOR = 35
7
7
  PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
@@ -6,7 +6,7 @@ module ViewComponent
6
6
  if value.nil?
7
7
  raise ArgumentError.new("No content provided.")
8
8
  else
9
- @_content_set_by_with_content = value
9
+ @__vc_content_set_by_with_content = value
10
10
  end
11
11
 
12
12
  self
@@ -0,0 +1,19 @@
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
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: 2.31.0
4
+ version: 2.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-26 00:00:00.000000000 Z
11
+ date: 2021-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 5.0.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '7.0'
22
+ version: '8.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,21 @@ dependencies:
29
29
  version: 5.0.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '7.0'
32
+ version: '8.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: method_source
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.0'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: benchmark-ips
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -45,47 +59,47 @@ dependencies:
45
59
  - !ruby/object:Gem::Version
46
60
  version: 2.8.2
47
61
  - !ruby/object:Gem::Dependency
48
- name: bundler
62
+ name: better_html
49
63
  requirement: !ruby/object:Gem::Requirement
50
64
  requirements:
51
65
  - - "~>"
52
66
  - !ruby/object:Gem::Version
53
- version: '1.14'
67
+ version: '1'
54
68
  type: :development
55
69
  prerelease: false
56
70
  version_requirements: !ruby/object:Gem::Requirement
57
71
  requirements:
58
72
  - - "~>"
59
73
  - !ruby/object:Gem::Version
60
- version: '1.14'
74
+ version: '1'
61
75
  - !ruby/object:Gem::Dependency
62
- name: rake
76
+ name: bundler
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: '13.0'
81
+ version: '2.2'
68
82
  type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '13.0'
88
+ version: '2.2'
75
89
  - !ruby/object:Gem::Dependency
76
- name: minitest
90
+ name: erb_lint
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
- - - '='
93
+ - - "~>"
80
94
  - !ruby/object:Gem::Version
81
- version: 5.6.0
95
+ version: 0.0.37
82
96
  type: :development
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - '='
100
+ - - "~>"
87
101
  - !ruby/object:Gem::Version
88
- version: 5.6.0
102
+ version: 0.0.37
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: haml
91
105
  requirement: !ruby/object:Gem::Requirement
@@ -101,75 +115,75 @@ dependencies:
101
115
  - !ruby/object:Gem::Version
102
116
  version: '5'
103
117
  - !ruby/object:Gem::Dependency
104
- name: slim
118
+ name: jbuilder
105
119
  requirement: !ruby/object:Gem::Requirement
106
120
  requirements:
107
121
  - - "~>"
108
122
  - !ruby/object:Gem::Version
109
- version: '4.0'
123
+ version: '2'
110
124
  type: :development
111
125
  prerelease: false
112
126
  version_requirements: !ruby/object:Gem::Requirement
113
127
  requirements:
114
128
  - - "~>"
115
129
  - !ruby/object:Gem::Version
116
- version: '4.0'
130
+ version: '2'
117
131
  - !ruby/object:Gem::Dependency
118
- name: better_html
132
+ name: minitest
119
133
  requirement: !ruby/object:Gem::Requirement
120
134
  requirements:
121
- - - "~>"
135
+ - - '='
122
136
  - !ruby/object:Gem::Version
123
- version: '1'
137
+ version: 5.6.0
124
138
  type: :development
125
139
  prerelease: false
126
140
  version_requirements: !ruby/object:Gem::Requirement
127
141
  requirements:
128
- - - "~>"
142
+ - - '='
129
143
  - !ruby/object:Gem::Version
130
- version: '1'
144
+ version: 5.6.0
131
145
  - !ruby/object:Gem::Dependency
132
- name: jbuilder
146
+ name: pry
133
147
  requirement: !ruby/object:Gem::Requirement
134
148
  requirements:
135
149
  - - "~>"
136
150
  - !ruby/object:Gem::Version
137
- version: '2'
151
+ version: '0.13'
138
152
  type: :development
139
153
  prerelease: false
140
154
  version_requirements: !ruby/object:Gem::Requirement
141
155
  requirements:
142
156
  - - "~>"
143
157
  - !ruby/object:Gem::Version
144
- version: '2'
158
+ version: '0.13'
145
159
  - !ruby/object:Gem::Dependency
146
- name: rubocop
160
+ name: rake
147
161
  requirement: !ruby/object:Gem::Requirement
148
162
  requirements:
149
- - - '='
163
+ - - "~>"
150
164
  - !ruby/object:Gem::Version
151
- version: '0.74'
165
+ version: '13.0'
152
166
  type: :development
153
167
  prerelease: false
154
168
  version_requirements: !ruby/object:Gem::Requirement
155
169
  requirements:
156
- - - '='
170
+ - - "~>"
157
171
  - !ruby/object:Gem::Version
158
- version: '0.74'
172
+ version: '13.0'
159
173
  - !ruby/object:Gem::Dependency
160
174
  name: rubocop-github
161
175
  requirement: !ruby/object:Gem::Requirement
162
176
  requirements:
163
177
  - - "~>"
164
178
  - !ruby/object:Gem::Version
165
- version: 0.13.0
179
+ version: 0.16.1
166
180
  type: :development
167
181
  prerelease: false
168
182
  version_requirements: !ruby/object:Gem::Requirement
169
183
  requirements:
170
184
  - - "~>"
171
185
  - !ruby/object:Gem::Version
172
- version: 0.13.0
186
+ version: 0.16.1
173
187
  - !ruby/object:Gem::Dependency
174
188
  name: simplecov
175
189
  requirement: !ruby/object:Gem::Requirement
@@ -199,33 +213,67 @@ dependencies:
199
213
  - !ruby/object:Gem::Version
200
214
  version: 0.7.2
201
215
  - !ruby/object:Gem::Dependency
202
- name: pry
216
+ name: slim
203
217
  requirement: !ruby/object:Gem::Requirement
204
218
  requirements:
205
219
  - - "~>"
206
220
  - !ruby/object:Gem::Version
207
- version: '0.13'
221
+ version: '4.0'
208
222
  type: :development
209
223
  prerelease: false
210
224
  version_requirements: !ruby/object:Gem::Requirement
211
225
  requirements:
212
226
  - - "~>"
213
227
  - !ruby/object:Gem::Version
214
- version: '0.13'
215
- description:
228
+ version: '4.0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: yard
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: 0.9.25
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: 0.9.25
243
+ - !ruby/object:Gem::Dependency
244
+ name: yard-activesupport-concern
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ description:
216
258
  email:
217
259
  - opensource+view_component@github.com
218
260
  executables: []
219
261
  extensions: []
220
262
  extra_rdoc_files: []
221
263
  files:
222
- - CHANGELOG.md
223
264
  - LICENSE.txt
224
265
  - README.md
266
+ - app/assets/vendor/prism.css
267
+ - app/assets/vendor/prism.min.js
225
268
  - app/controllers/view_components_controller.rb
269
+ - app/helpers/preview_helper.rb
270
+ - app/views/test_mailer/test_email.html.erb
271
+ - app/views/view_components/_preview_source.html.erb
226
272
  - app/views/view_components/index.html.erb
227
273
  - app/views/view_components/preview.html.erb
228
274
  - app/views/view_components/previews.html.erb
275
+ - docs/CHANGELOG.md
276
+ - lib/rails/generators/abstract_generator.rb
229
277
  - lib/rails/generators/component/USAGE
230
278
  - lib/rails/generators/component/component_generator.rb
231
279
  - lib/rails/generators/component/templates/component.rb.tt
@@ -247,7 +295,9 @@ files:
247
295
  - lib/view_component/compile_cache.rb
248
296
  - lib/view_component/compiler.rb
249
297
  - lib/view_component/component_error.rb
298
+ - lib/view_component/content_areas.rb
250
299
  - lib/view_component/engine.rb
300
+ - lib/view_component/instrumentation.rb
251
301
  - lib/view_component/preview.rb
252
302
  - lib/view_component/preview_template_error.rb
253
303
  - lib/view_component/previewable.rb
@@ -267,12 +317,13 @@ files:
267
317
  - lib/view_component/translatable.rb
268
318
  - lib/view_component/version.rb
269
319
  - lib/view_component/with_content_helper.rb
320
+ - lib/yard/mattr_accessor_handler.rb
270
321
  homepage: https://github.com/github/view_component
271
322
  licenses:
272
323
  - MIT
273
324
  metadata:
274
325
  allowed_push_host: https://rubygems.org
275
- post_install_message:
326
+ post_install_message:
276
327
  rdoc_options: []
277
328
  require_paths:
278
329
  - lib
@@ -280,15 +331,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
280
331
  requirements:
281
332
  - - ">="
282
333
  - !ruby/object:Gem::Version
283
- version: 2.3.0
334
+ version: 2.4.0
284
335
  required_rubygems_version: !ruby/object:Gem::Requirement
285
336
  requirements:
286
337
  - - ">="
287
338
  - !ruby/object:Gem::Version
288
339
  version: '0'
289
340
  requirements: []
290
- rubygems_version: 3.1.2
291
- signing_key:
341
+ rubygems_version: 3.1.4
342
+ signing_key:
292
343
  specification_version: 4
293
344
  summary: View components for Rails
294
345
  test_files: []