actionview-component 1.8.0 → 1.11.1
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/.github/workflows/ruby_on_rails.yml +2 -2
- data/CHANGELOG.md +34 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile.lock +16 -1
- data/README.md +43 -56
- data/actionview-component.gemspec +1 -0
- data/lib/action_view/component/base.rb +17 -12
- data/lib/action_view/component/render_monkey_patch.rb +11 -6
- data/lib/action_view/component/test_helpers.rb +11 -1
- data/lib/action_view/component/version.rb +2 -2
- data/lib/rails/generators/component/component_generator.rb +7 -3
- data/lib/rails/generators/erb/component_generator.rb +27 -0
- data/lib/rails/generators/{component → erb}/templates/component.html.erb.tt +0 -0
- data/lib/rails/generators/haml/component_generator.rb +27 -0
- data/lib/rails/generators/haml/templates/component.html.haml.tt +5 -0
- data/lib/rails/generators/slim/component_generator.rb +27 -0
- data/lib/rails/generators/slim/templates/component.html.slim +5 -0
- metadata +22 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c64114f4ba9a12fb68d0157a9f10a9fc423d09dbc181f0fd9f403671b61a047
|
4
|
+
data.tar.gz: 3c6306682e37e6f9f4d9ed66564130a225f122aaa71caffdd3ab063ad70524c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b92ca951edd213245c3d0b473fe87650e0c87f4130a89bd4f628d7df0636fab794853943c172f57c10b648b43a98d7dfcca228be05d4c8120930b0ad5fb06683
|
7
|
+
data.tar.gz: 12bac559a2d557e72bbec729ae8402fcc08a8cc2f3c38d57eea332aa32391df4018447954c0b2e644076683573b55b70f7b02868524353645eca663abae5609c
|
@@ -8,7 +8,7 @@ jobs:
|
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
10
|
rails_version: [5.0.0, 5.2.3, 6.0.0, master]
|
11
|
-
ruby_version: [2.
|
11
|
+
ruby_version: [2.5.x, 2.6.x, 2.7.x]
|
12
12
|
exclude:
|
13
13
|
- rails_version: master
|
14
14
|
ruby_version: 2.4.x
|
@@ -22,7 +22,7 @@ jobs:
|
|
22
22
|
ruby-version: ${{ matrix.ruby_version }}
|
23
23
|
- name: Build and test with Rake
|
24
24
|
run: |
|
25
|
-
gem install bundler:1.
|
25
|
+
gem install bundler:1.17.3
|
26
26
|
bundle update
|
27
27
|
bundle install --jobs 4 --retry 3
|
28
28
|
bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
# v1.11.1
|
2
|
+
|
3
|
+
* Relax Capybara requirement.
|
4
|
+
|
5
|
+
*Joel Hawksley*
|
6
|
+
|
7
|
+
# v1.11.0
|
8
|
+
|
9
|
+
* Add support for Capybara matchers.
|
10
|
+
|
11
|
+
*Joel Hawksley*
|
12
|
+
|
13
|
+
* Add erb, haml, & slim template generators
|
14
|
+
|
15
|
+
*Asger Behncke Jacobsen*
|
16
|
+
|
17
|
+
# v1.10.0
|
18
|
+
|
19
|
+
* Deprecate all `render` syntaxes except for `render(MyComponent.new(foo: :bar))`
|
20
|
+
|
21
|
+
*Joel Hawksley*
|
22
|
+
|
23
|
+
# v1.9.0
|
24
|
+
|
25
|
+
* Remove initializer requirement for Ruby 2.7+
|
26
|
+
|
27
|
+
*Dylan Clark*
|
28
|
+
|
29
|
+
# v1.8.1
|
30
|
+
|
31
|
+
* Run validation checks before calling `#render?`.
|
32
|
+
|
33
|
+
*Ash Wilson*
|
34
|
+
|
1
35
|
# v1.8.0
|
2
36
|
|
3
37
|
* Remove the unneeded ComponentExamplesController and simplify preview rendering.
|
data/CONTRIBUTING.md
CHANGED
@@ -34,7 +34,7 @@ Here are a few things you can do that will increase the likelihood of your pull
|
|
34
34
|
If you are the current maintainer of this gem:
|
35
35
|
|
36
36
|
1. Create a branch for the release: `git checkout -b release-vxx.xx.xx`
|
37
|
-
1. Bump gem version in `lib/action_view/component/version.rb`.
|
37
|
+
1. Bump gem version in `lib/action_view/component/version.rb`. Try to adhere to SemVer.
|
38
38
|
1. Add version heading/entries to `CHANGELOG.md`.
|
39
39
|
1. Make sure your local dependencies are up to date: `bundle`
|
40
40
|
1. Ensure that tests are green: `bundle exec rake`
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
actionview-component (1.
|
4
|
+
actionview-component (1.11.1)
|
5
|
+
capybara (>= 3)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
@@ -61,6 +62,8 @@ GEM
|
|
61
62
|
minitest (~> 5.1)
|
62
63
|
tzinfo (~> 1.1)
|
63
64
|
zeitwerk (~> 2.1, >= 2.1.8)
|
65
|
+
addressable (2.7.0)
|
66
|
+
public_suffix (>= 2.0.2, < 5.0)
|
64
67
|
ast (2.4.0)
|
65
68
|
better_html (1.0.14)
|
66
69
|
actionview (>= 4.0)
|
@@ -71,6 +74,14 @@ GEM
|
|
71
74
|
parser (>= 2.4)
|
72
75
|
smart_properties
|
73
76
|
builder (3.2.3)
|
77
|
+
capybara (3.31.0)
|
78
|
+
addressable
|
79
|
+
mini_mime (>= 0.1.3)
|
80
|
+
nokogiri (~> 1.8)
|
81
|
+
rack (>= 1.6.0)
|
82
|
+
rack-test (>= 0.6.3)
|
83
|
+
regexp_parser (~> 1.5)
|
84
|
+
xpath (~> 3.2)
|
74
85
|
concurrent-ruby (1.1.5)
|
75
86
|
crass (1.0.5)
|
76
87
|
erubi (1.8.0)
|
@@ -101,6 +112,7 @@ GEM
|
|
101
112
|
parallel (1.17.0)
|
102
113
|
parser (2.6.3.0)
|
103
114
|
ast (~> 2.4.0)
|
115
|
+
public_suffix (4.0.3)
|
104
116
|
rack (2.0.8)
|
105
117
|
rack-test (1.1.0)
|
106
118
|
rack (>= 1.0, < 3)
|
@@ -132,6 +144,7 @@ GEM
|
|
132
144
|
thor (>= 0.20.3, < 2.0)
|
133
145
|
rainbow (3.0.0)
|
134
146
|
rake (10.5.0)
|
147
|
+
regexp_parser (1.6.0)
|
135
148
|
rubocop (0.74.0)
|
136
149
|
jaro_winkler (~> 1.5.1)
|
137
150
|
parallel (~> 1.10)
|
@@ -166,6 +179,8 @@ GEM
|
|
166
179
|
websocket-driver (0.7.1)
|
167
180
|
websocket-extensions (>= 0.1.0)
|
168
181
|
websocket-extensions (0.1.4)
|
182
|
+
xpath (3.2.0)
|
183
|
+
nokogiri (~> 1.8)
|
169
184
|
zeitwerk (2.1.10)
|
170
185
|
|
171
186
|
PLATFORMS
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
_Note: This gem is in the process of a name / API change, see https://github.com/github/actionview-component/issues/206_
|
2
|
+
|
1
3
|
# ActionView::Component
|
2
4
|
`ActionView::Component` is a framework for building view components in Rails.
|
3
5
|
|
@@ -15,7 +17,7 @@ As the goal of this gem is to be upstreamed into Rails, it is designed to integr
|
|
15
17
|
|
16
18
|
## Compatibility
|
17
19
|
|
18
|
-
`actionview-component` is tested for compatibility with combinations of Ruby `2.
|
20
|
+
`actionview-component` is tested for compatibility with combinations of Ruby `2.5`/`2.6`/`2.7` and Rails `5.0.0`/`5.2.3`/`6.0.0`/`6.1.0.alpha`.
|
19
21
|
|
20
22
|
## Installation
|
21
23
|
Add this line to your application's Gemfile:
|
@@ -117,6 +119,18 @@ bin/rails generate component Example title content
|
|
117
119
|
create app/components/example_component.html.erb
|
118
120
|
```
|
119
121
|
|
122
|
+
`ActionView::Component` includes template generators for the `erb`, `haml`, and `slim` template engines and will use the template engine specified in your Rails config (`config.generators.template_engine`) by default.
|
123
|
+
|
124
|
+
If you want to override this behavior, you can pass the template engine as an option to the generator:
|
125
|
+
|
126
|
+
```bash
|
127
|
+
bin/rails generate component Example title content --template-engine slim
|
128
|
+
invoke test_unit
|
129
|
+
create test/components/example_component_test.rb
|
130
|
+
create app/components/example_component.rb
|
131
|
+
create app/components/example_component.html.slim
|
132
|
+
```
|
133
|
+
|
120
134
|
#### Implementation
|
121
135
|
|
122
136
|
An `ActionView::Component` is a Ruby file and corresponding template file (in any format supported by Rails) with the same base name:
|
@@ -144,7 +158,7 @@ end
|
|
144
158
|
We can render it in a view as:
|
145
159
|
|
146
160
|
```erb
|
147
|
-
<%= render(TestComponent
|
161
|
+
<%= render(TestComponent.new(title: "my title")) do %>
|
148
162
|
Hello, World!
|
149
163
|
<% end %>
|
150
164
|
```
|
@@ -155,42 +169,12 @@ Which returns:
|
|
155
169
|
<span title="my title">Hello, World!</span>
|
156
170
|
```
|
157
171
|
|
158
|
-
##### Supported `render` syntaxes
|
159
|
-
|
160
|
-
Components can be rendered via:
|
161
|
-
|
162
|
-
`render(TestComponent, foo: :bar)`
|
163
|
-
|
164
|
-
`render(component: TestComponent, locals: { foo: :bar })`
|
165
|
-
|
166
|
-
**Rendering components through models**
|
167
|
-
|
168
|
-
Passing model instances will cause `render` to look for its respective component class.
|
169
|
-
|
170
|
-
The component is instantiated with the rendered model instance.
|
171
|
-
|
172
|
-
Example for a `Post` model:
|
173
|
-
|
174
|
-
`render(@post)`
|
175
|
-
|
176
|
-
```ruby
|
177
|
-
class PostComponent < ActionView::Component::Base
|
178
|
-
def initialize(post)
|
179
|
-
@post = post
|
180
|
-
end
|
181
|
-
end
|
182
|
-
```
|
183
|
-
|
184
|
-
The following syntax has been deprecated and will be removed in v2.0.0:
|
185
|
-
|
186
|
-
`render(TestComponent.new(foo: :bar))`
|
187
|
-
|
188
172
|
#### Error case
|
189
173
|
|
190
174
|
If the component is rendered with a blank title:
|
191
175
|
|
192
176
|
```erb
|
193
|
-
<%= render(TestComponent
|
177
|
+
<%= render(TestComponent.new(title: "")) do %>
|
194
178
|
Hello, World!
|
195
179
|
<% end %>
|
196
180
|
```
|
@@ -227,7 +211,7 @@ end
|
|
227
211
|
We can render it in a view as:
|
228
212
|
|
229
213
|
```erb
|
230
|
-
<%= render(ModalComponent
|
214
|
+
<%= render(ModalComponent.new(user: {name: 'Jane'})) do |component| %>
|
231
215
|
<% component.with(:header) do %>
|
232
216
|
Hello <%= user[:name] %>
|
233
217
|
<% end %>
|
@@ -265,7 +249,7 @@ end
|
|
265
249
|
```
|
266
250
|
|
267
251
|
```erb
|
268
|
-
<%= render(ModalComponent
|
252
|
+
<%= render(ModalComponent.new(header: "Hi!")) do |component| %>
|
269
253
|
<% help_enabled? && component.with(:header) do %>
|
270
254
|
<span class="help_icon"><%= component.header %></span>
|
271
255
|
<% end %>
|
@@ -292,7 +276,7 @@ end
|
|
292
276
|
|
293
277
|
`app/views/render_arg.html.erb`:
|
294
278
|
```erb
|
295
|
-
<%= render(ModalComponent
|
279
|
+
<%= render(ModalComponent.new(header: "Hi!")) do |component| %>
|
296
280
|
<% component.with(:body) do %>
|
297
281
|
<p>Have a great day.</p>
|
298
282
|
<% end %>
|
@@ -338,7 +322,7 @@ end
|
|
338
322
|
|
339
323
|
`app/views/render_arg.html.erb`:
|
340
324
|
```erb
|
341
|
-
<%= render(ModalComponent
|
325
|
+
<%= render(ModalComponent.new(header: "Hi!")) do |component| %>
|
342
326
|
<% component.with(:body) do %>
|
343
327
|
<p>Have a great day.</p>
|
344
328
|
<% end %>
|
@@ -347,7 +331,7 @@ end
|
|
347
331
|
|
348
332
|
`app/views/with_block.html.erb`:
|
349
333
|
```erb
|
350
|
-
<%= render(ModalComponent) do |component| %>
|
334
|
+
<%= render(ModalComponent.new) do |component| %>
|
351
335
|
<% component.with(:header) do %>
|
352
336
|
<span class="help_icon">Hello</span>
|
353
337
|
<% end %>
|
@@ -359,7 +343,7 @@ end
|
|
359
343
|
|
360
344
|
`app/views/no_header.html.erb`:
|
361
345
|
```erb
|
362
|
-
<%= render(ModalComponent) do |component| %>
|
346
|
+
<%= render(ModalComponent.new) do |component| %>
|
363
347
|
<% component.with(:body) do %>
|
364
348
|
<p>Have a great day.</p>
|
365
349
|
<% end %>
|
@@ -386,7 +370,7 @@ or the view that renders the component:
|
|
386
370
|
```erb
|
387
371
|
<!-- app/views/_banners.html.erb -->
|
388
372
|
<% if current_user.requires_confirmation? %>
|
389
|
-
<%= render(ConfirmEmailComponent
|
373
|
+
<%= render(ConfirmEmailComponent.new(user: current_user)) %>
|
390
374
|
<% end %>
|
391
375
|
```
|
392
376
|
|
@@ -414,22 +398,21 @@ end
|
|
414
398
|
|
415
399
|
```erb
|
416
400
|
<!-- app/views/_banners.html.erb -->
|
417
|
-
<%= render(ConfirmEmailComponent
|
401
|
+
<%= render(ConfirmEmailComponent.new(user: current_user)) %>
|
418
402
|
```
|
419
403
|
|
420
404
|
### Testing
|
421
405
|
|
422
|
-
Components are unit tested directly. The `render_inline` test helper
|
406
|
+
Components are unit tested directly. The `render_inline` test helper is compatible with Capybara matchers, allowing us to test the component above as:
|
423
407
|
|
424
408
|
```ruby
|
425
409
|
require "action_view/component/test_case"
|
426
410
|
|
427
411
|
class MyComponentTest < ActionView::Component::TestCase
|
428
412
|
test "render component" do
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
)
|
413
|
+
render_inline(TestComponent.new(title: "my title")) { "Hello, World!" }
|
414
|
+
|
415
|
+
assert_selector("span[title='my title']", "Hello, World!")
|
433
416
|
end
|
434
417
|
end
|
435
418
|
```
|
@@ -443,10 +426,9 @@ To test a specific variant you can wrap your test with the `with_variant` helper
|
|
443
426
|
```ruby
|
444
427
|
test "render component for tablet" do
|
445
428
|
with_variant :tablet do
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
)
|
429
|
+
render_inline(TestComponent.new(title: "my title")) { "Hello, tablets!" }
|
430
|
+
|
431
|
+
assert_selector("span[title='my title']", "Hello, tablets!")
|
450
432
|
end
|
451
433
|
end
|
452
434
|
```
|
@@ -462,11 +444,11 @@ You can define as many examples as you want:
|
|
462
444
|
|
463
445
|
class TestComponentPreview < ActionView::Component::Preview
|
464
446
|
def with_default_title
|
465
|
-
render(TestComponent
|
447
|
+
render(TestComponent.new(title: "Test component default"))
|
466
448
|
end
|
467
449
|
|
468
450
|
def with_long_title
|
469
|
-
render(TestComponent
|
451
|
+
render(TestComponent.new(title: "This is a really long title to see how the component renders this"))
|
470
452
|
end
|
471
453
|
end
|
472
454
|
```
|
@@ -528,6 +510,11 @@ To use component previews, set the following in `config/application.rb`:
|
|
528
510
|
config.action_view_component.preview_path = "#{Rails.root}/spec/components/previews"
|
529
511
|
```
|
530
512
|
|
513
|
+
### Initializer requirement
|
514
|
+
|
515
|
+
In Ruby 2.6.x and below, ActionView::Component requires the presence of an `initialize` method in each component.
|
516
|
+
However, `initialize` is no longer required for projects using 2.7.x and above.
|
517
|
+
|
531
518
|
## Frequently Asked Questions
|
532
519
|
|
533
520
|
### Can I use other templating languages besides ERB?
|
@@ -583,10 +570,10 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/github
|
|
583
570
|
|@elia|@cesariouy|@spdawson|@rmacklin|@michaelem|
|
584
571
|
|Milan||United Kingdom||Berlin|
|
585
572
|
|
586
|
-
|<img src="https://avatars.githubusercontent.com/mellowfish?s=256" alt="mellowfish" width="128" />|<img src="https://avatars.githubusercontent.com/horacio?s=256" alt="horacio" width="128" />|<img src="https://avatars.githubusercontent.com/dukex?s=256" alt="dukex" width="128" />|<img src="https://avatars.githubusercontent.com/dark-panda?s=256" alt="dark-panda" width="128" />|
|
587
|
-
|
588
|
-
|@mellowfish|@horacio|@dukex|@dark-panda|
|
589
|
-
|Spring Hill, TN|Buenos Aires|São Paulo||
|
573
|
+
|<img src="https://avatars.githubusercontent.com/mellowfish?s=256" alt="mellowfish" width="128" />|<img src="https://avatars.githubusercontent.com/horacio?s=256" alt="horacio" width="128" />|<img src="https://avatars.githubusercontent.com/dukex?s=256" alt="dukex" width="128" />|<img src="https://avatars.githubusercontent.com/dark-panda?s=256" alt="dark-panda" width="128" />|<img src="https://avatars.githubusercontent.com/smashwilson?s=256" alt="smashwilson" width="128" />|
|
574
|
+
|:---:|:---:|:---:|:---:|:---:|
|
575
|
+
|@mellowfish|@horacio|@dukex|@dark-panda|@smashwilson|
|
576
|
+
|Spring Hill, TN|Buenos Aires|São Paulo||Gambrills, MD|
|
590
577
|
|
591
578
|
## License
|
592
579
|
|
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
|
35
35
|
spec.required_ruby_version = ">= 2.3.0"
|
36
36
|
|
37
|
+
spec.add_runtime_dependency "capybara", ">= 3"
|
37
38
|
spec.add_development_dependency "bundler", ">= 1.14"
|
38
39
|
spec.add_development_dependency "rake", "~> 10.0"
|
39
40
|
spec.add_development_dependency "minitest", "= 5.1.0"
|
@@ -48,8 +48,6 @@ module ActionView
|
|
48
48
|
@virtual_path ||= virtual_path
|
49
49
|
@variant = @lookup_context.variants.first
|
50
50
|
|
51
|
-
return "" unless render?
|
52
|
-
|
53
51
|
old_current_template = @current_template
|
54
52
|
@current_template = self
|
55
53
|
|
@@ -57,6 +55,8 @@ module ActionView
|
|
57
55
|
|
58
56
|
validate!
|
59
57
|
|
58
|
+
return "" unless render?
|
59
|
+
|
60
60
|
send(self.class.call_method_name(@variant))
|
61
61
|
ensure
|
62
62
|
@current_template = old_current_template
|
@@ -142,15 +142,11 @@ module ActionView
|
|
142
142
|
|
143
143
|
def source_location
|
144
144
|
@source_location ||=
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
#
|
149
|
-
#
|
150
|
-
# If we were able to only support Ruby 2.7+,
|
151
|
-
# We could just use Module#const_source_location,
|
152
|
-
# rendering this unnecessary.
|
153
|
-
#
|
145
|
+
if const_source_location_supported?
|
146
|
+
const_source_location(self.name)[0]
|
147
|
+
else
|
148
|
+
# Require `#initialize` to be defined so that we can use `method#source_location`
|
149
|
+
# to look up the filename of the component.
|
154
150
|
initialize_method = instance_method(:initialize)
|
155
151
|
initialize_method.source_location[0] if initialize_method.owner == self
|
156
152
|
end
|
@@ -210,6 +206,10 @@ module ActionView
|
|
210
206
|
|
211
207
|
private
|
212
208
|
|
209
|
+
def const_source_location_supported?
|
210
|
+
respond_to? :const_source_location # introduced in Ruby 2.7
|
211
|
+
end
|
212
|
+
|
213
213
|
def matching_views_in_source_location
|
214
214
|
return [] unless source_location
|
215
215
|
(Dir["#{source_location.chomp(File.extname(source_location))}.*{#{ActionView::Template.template_handler_extensions.join(',')}}"] - [source_location])
|
@@ -232,7 +232,12 @@ module ActionView
|
|
232
232
|
@template_errors ||=
|
233
233
|
begin
|
234
234
|
errors = []
|
235
|
-
|
235
|
+
if source_location.nil? && !const_source_location_supported?
|
236
|
+
# Require `#initialize` to be defined so that we can use `method#source_location`
|
237
|
+
# to look up the filename of the component.
|
238
|
+
errors << "#{self} must implement #initialize."
|
239
|
+
end
|
240
|
+
|
236
241
|
errors << "Could not find a template file for #{self}." if templates.empty?
|
237
242
|
|
238
243
|
if templates.count { |template| template[:variant].nil? } > 1
|
@@ -1,24 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Monkey patch ActionView::Base#render to support ActionView::Component
|
4
|
-
#
|
5
|
-
# A version of this monkey patch was upstreamed in https://github.com/rails/rails/pull/36388
|
6
|
-
# We'll need to upstream an updated version of this eventually.
|
7
4
|
module ActionView
|
8
5
|
module Component
|
9
6
|
module RenderMonkeyPatch # :nodoc:
|
10
7
|
def render(options = {}, args = {}, &block)
|
11
8
|
if options.respond_to?(:render_in)
|
9
|
+
options.render_in(self, &block)
|
10
|
+
elsif options.is_a?(Class) && options < ActionView::Component::Base
|
12
11
|
ActiveSupport::Deprecation.warn(
|
13
|
-
"
|
12
|
+
"`render MyComponent, foo: :bar` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
14
13
|
)
|
15
14
|
|
16
|
-
options.render_in(self, &block)
|
17
|
-
elsif options.is_a?(Class) && options < ActionView::Component::Base
|
18
15
|
options.new(args).render_in(self, &block)
|
19
16
|
elsif options.is_a?(Hash) && options.has_key?(:component)
|
17
|
+
ActiveSupport::Deprecation.warn(
|
18
|
+
"`render component: MyComponent, locals: { foo: :bar }` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
19
|
+
)
|
20
|
+
|
20
21
|
options[:component].new(options[:locals]).render_in(self, &block)
|
21
22
|
elsif options.respond_to?(:to_component_class) && !options.to_component_class.nil?
|
23
|
+
ActiveSupport::Deprecation.warn(
|
24
|
+
"rendering objects that respond_to `to_component_class` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
25
|
+
)
|
26
|
+
|
22
27
|
options.to_component_class.new(options).render_in(self, &block)
|
23
28
|
else
|
24
29
|
super
|
@@ -1,10 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "capybara/minitest"
|
4
|
+
|
3
5
|
module ActionView
|
4
6
|
module Component
|
5
7
|
module TestHelpers
|
8
|
+
include Capybara::Minitest::Assertions
|
9
|
+
|
10
|
+
def page
|
11
|
+
Capybara::Node::Simple.new(@raw)
|
12
|
+
end
|
13
|
+
|
6
14
|
def render_inline(component, **args, &block)
|
7
|
-
|
15
|
+
@raw = controller.view_context.render(component, args, &block)
|
16
|
+
|
17
|
+
Nokogiri::HTML.fragment(@raw)
|
8
18
|
end
|
9
19
|
|
10
20
|
def controller
|
@@ -6,15 +6,18 @@ module Rails
|
|
6
6
|
source_root File.expand_path("templates", __dir__)
|
7
7
|
|
8
8
|
argument :attributes, type: :array, default: [], banner: "attribute"
|
9
|
-
hook_for :test_framework
|
10
9
|
check_class_collision suffix: "Component"
|
11
10
|
|
11
|
+
class_option :require_content, type: :boolean, default: false
|
12
|
+
|
12
13
|
def create_component_file
|
13
14
|
template "component.rb", File.join("app/components", class_path, "#{file_name}_component.rb")
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
-
|
17
|
+
hook_for :test_framework
|
18
|
+
|
19
|
+
hook_for :template_engine do |instance, template_engine|
|
20
|
+
instance.invoke template_engine, [instance.name], require_content: instance.send(:requires_content?)
|
18
21
|
end
|
19
22
|
|
20
23
|
private
|
@@ -24,6 +27,7 @@ module Rails
|
|
24
27
|
end
|
25
28
|
|
26
29
|
def requires_content?
|
30
|
+
return if behavior == :revoke
|
27
31
|
return @requires_content if @asked
|
28
32
|
|
29
33
|
@asked = true
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/erb"
|
4
|
+
|
5
|
+
module Erb
|
6
|
+
module Generators
|
7
|
+
class ComponentGenerator < Base
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
9
|
+
|
10
|
+
class_option :require_content, type: :boolean, default: false
|
11
|
+
|
12
|
+
def copy_view_file
|
13
|
+
template "component.html.erb", File.join("app/components", class_path, "#{file_name}_component.html.erb")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def requires_content?
|
19
|
+
options["require_content"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
@_file_name ||= super.sub(/_component\z/i, "")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
File without changes
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/erb/component_generator"
|
4
|
+
|
5
|
+
module Haml
|
6
|
+
module Generators
|
7
|
+
class ComponentGenerator < Erb::Generators::ComponentGenerator
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
9
|
+
|
10
|
+
class_option :require_content, type: :boolean, default: false
|
11
|
+
|
12
|
+
def copy_view_file
|
13
|
+
template "component.html.haml", File.join("app/components", class_path, "#{file_name}_component.html.haml")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def requires_content?
|
19
|
+
options["require_content"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
@_file_name ||= super.sub(/_component\z/i, "")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/erb/component_generator"
|
4
|
+
|
5
|
+
module Slim
|
6
|
+
module Generators
|
7
|
+
class ComponentGenerator < Erb::Generators::ComponentGenerator
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
9
|
+
|
10
|
+
class_option :require_content, type: :boolean, default: false
|
11
|
+
|
12
|
+
def copy_view_file
|
13
|
+
template "component.html.slim", File.join("app/components", class_path, "#{file_name}_component.html.slim")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def requires_content?
|
19
|
+
options["require_content"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
@_file_name ||= super.sub(/_component\z/i, "")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionview-component
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Open Source
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capybara
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,10 +170,15 @@ files:
|
|
156
170
|
- lib/action_view/component/version.rb
|
157
171
|
- lib/rails/generators/component/USAGE
|
158
172
|
- lib/rails/generators/component/component_generator.rb
|
159
|
-
- lib/rails/generators/component/templates/component.html.erb.tt
|
160
173
|
- lib/rails/generators/component/templates/component.rb.tt
|
174
|
+
- lib/rails/generators/erb/component_generator.rb
|
175
|
+
- lib/rails/generators/erb/templates/component.html.erb.tt
|
176
|
+
- lib/rails/generators/haml/component_generator.rb
|
177
|
+
- lib/rails/generators/haml/templates/component.html.haml.tt
|
161
178
|
- lib/rails/generators/rspec/component_generator.rb
|
162
179
|
- lib/rails/generators/rspec/templates/component_spec.rb.tt
|
180
|
+
- lib/rails/generators/slim/component_generator.rb
|
181
|
+
- lib/rails/generators/slim/templates/component.html.slim
|
163
182
|
- lib/rails/generators/test_unit/component_generator.rb
|
164
183
|
- lib/rails/generators/test_unit/templates/component_test.rb.tt
|
165
184
|
- lib/railties/lib/rails.rb
|