checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
---
2
2
SHA256:
3
- metadata.gz: 59f02a9bdd999da01d26a2f7a9c80d0ec6cd1cf96d0195f8d2aa983f504d9908
4
- data.tar.gz: ea36b326f6c565cf64acc827449dc11372a2bf10c49a77b5e994d9597234e926
3
+ metadata.gz: 7670fc77a362e27fd4b9d666c20c2042bb077a3a7c3211bca3271074af4ea913
4
+ data.tar.gz: 7fbd76e8c88ea4e44386e329dd187573dfc7553e371088053e8ec2645c0bad3f
5
5
SHA512:
6
- metadata.gz: e87095b78618384e60884166c0a6eb9d024c94afe0f5e4d44b1295dd5fbdf8a84000e304d8c4b56e51e8c6112f6416718fe04667b9e13bca4b2a5283c6346b49
7
- data.tar.gz: '08dc5a1408d730948c08239a90edea25cfde9cc144a7e4b24ecfd4ee6817f7a49c19df7acec9fdfd58b26545c8fe182080dc436f3ac9aa14b17479365a40166b'
6
+ metadata.gz: be88328b943bc8aa3d4d1a05e845b53c77e3a6737e8e863b94c349ec3049d47bf25c4610ebbc812e2f2ecb84568ec787eb2e86cae622d5c3a2d81a7bce000655
7
+ data.tar.gz: a489fc157813dc6ac67bc8bd047b487234768c4584449128bd9290582507da75d68fb429a5ed9bfd9e75b80b29e21549a793de76a00f784a07a63657f12f6ad5
data/.github/workflows/ruby_on_rails.yml CHANGED
@@ -1,14 +1,23 @@
1
1
name: Ruby on Rails
2
2
3
- on: [push]
3
+ on: [push, pull_request]
4
4
5
5
jobs:
6
6
build:
7
7
runs-on: ubuntu-latest
8
8
strategy:
9
9
matrix:
10
- rails_version: ["5.2.3", "6.0.0", "master"]
11
- ruby_version: ["2.5.x", "2.6.x"]
10
+ rails_version: [5.0.0, 5.2.3, 6.0.0, master]
11
+ ruby_version: [2.3.x, 2.4.x, 2.5.x, 2.6.x]
12
+ exclude:
13
+ - rails_version: master
14
+ ruby_version: 2.4.x
15
+ - rails_version: master
16
+ ruby_version: 2.3.x
17
+ - rails_version: 6.0.0
18
+ ruby_version: 2.4.x
19
+ - rails_version: 6.0.0
20
+ ruby_version: 2.3.x
12
21
steps:
13
22
- uses: actions/checkout@master
14
23
- name: Setup Ruby
@@ -17,7 +26,7 @@ jobs:
17
26
version: ${{ matrix.ruby_version }}
18
27
- name: Build and test with Rake
19
28
run: |
20
- gem install bundler
29
+ gem install bundler:1.14.0
21
30
bundle update
22
31
bundle install --jobs 4 --retry 3
23
32
bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,7 +1,49 @@
1
- * Components now inherit from ActionView::Component::base
1
+ # v1.3.2
2
+
3
+ * Support rendering views from inside component templates.
4
+
5
+ *Patrick Sinclair*
6
+
7
+ # v1.3.1
8
+
9
+ * Fix bug where rendering nested content caused an error.
10
+
11
+ *Joel Hawksley, Aaron Patterson*
12
+
13
+ # v1.3.0
14
+
15
+ * Components are rendered with enough controller context to support rendering of partials and forms.
16
+
17
+ *Patrick Sinclair, Joel Hawksley, Aaron Patterson*
18
+
19
+ # v1.2.1
20
+
21
+ * `actionview-component` is now tested against Ruby 2.3/2.4 and Rails 5.0.0.
22
+
23
+ # v1.2.0
24
+
25
+ * The `render_component` test helper has been renamed to `render_inline`. `render_component` has been deprecated and will be removed in v2.0.0.
2
26
3
27
*Joel Hawksley*
4
28
29
+ * Components are now rendered with `render MyComponent, foo: :bar` syntax. The existing `render MyComponent.new(foo: :bar)` syntax has been deprecated and will be removed in v2.0.0.
30
+
31
+ *Joel Hawksley*
32
+
33
+ # v1.1.0
34
+
35
+ * Components now inherit from ActionView::Component::Base
36
+
37
+ *Joel Hawksley*
38
+
39
+ # v1.0.1
40
+
5
41
* Always recompile component templates outside production.
6
42
7
43
*Joel Hawksley, John Hawthorn*
44
+
45
+ # v1.0.0
46
+
47
+ This release extracts the `ActionView::Component` library from the GitHub application.
48
+
49
+ It will be published on RubyGems under the existing `actionview-component` gem name, as @chancancode has passed us ownership of the gem.
data/CONTRIBUTING.md CHANGED
@@ -32,6 +32,7 @@ Here are a few things you can do that will increase the likelihood of your pull
32
32
If you are the current maintainer of this gem:
33
33
34
34
1. Create a branch for the release: `git checkout -b release-vxx.xx.xx`
35
+ 1. Bump gem version in `actionview-component.gemspec`.
35
36
1. Make sure your local dependencies are up to date: `bundle`
36
37
1. Ensure that tests are green: `bundle exec rake`
37
38
1. Build a test gem `GEM_VERSION=$(git describe --tags 2>/dev/null | sed 's/-/./g' | sed 's/v//') gem build actionview-component.gemspec`
@@ -39,7 +40,6 @@ If you are the current maintainer of this gem:
39
40
1. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
40
41
1. Install the new gem locally
41
42
1. Test behavior locally, branch deploy, whatever needs to happen
42
- 1. Bump gem version in `actionview-component.gemspec`.
43
43
1. Make a PR to github/actionview-component.
44
44
1. Build a local gem: `gem build actionview-component.gemspec`
45
45
1. Merge github/actionview-component PR
data/Gemfile CHANGED
@@ -3,6 +3,6 @@
3
3
source "https://rubygems.org"
4
4
gemspec
5
5
6
- rails_version = "#{ENV['RAILS_VERSION'] || '5.2.3'}"
6
+ rails_version = "#{ENV['RAILS_VERSION'] || '6.0.0'}"
7
7
8
8
gem "rails", rails_version == "master" ? { github: "rails/rails" } : rails_version
data/Gemfile.lock CHANGED
@@ -1,53 +1,66 @@
1
1
PATH
2
2
remote: .
3
3
specs:
4
- actionview-component (1.0.1)
4
+ actionview-component (1.3.2)
5
5
6
6
GEM
7
7
remote: https://rubygems.org/
8
8
specs:
9
- actioncable (5.2.3)
10
- actionpack (= 5.2.3)
9
+ actioncable (6.0.0)
10
+ actionpack (= 6.0.0)
11
11
nio4r (~> 2.0)
12
12
websocket-driver (>= 0.6.1)
13
- actionmailer (5.2.3)
14
- actionpack (= 5.2.3)
15
- actionview (= 5.2.3)
16
- activejob (= 5.2.3)
13
+ actionmailbox (6.0.0)
14
+ actionpack (= 6.0.0)
15
+ activejob (= 6.0.0)
16
+ activerecord (= 6.0.0)
17
+ activestorage (= 6.0.0)
18
+ activesupport (= 6.0.0)
19
+ mail (>= 2.7.1)
20
+ actionmailer (6.0.0)
21
+ actionpack (= 6.0.0)
22
+ actionview (= 6.0.0)
23
+ activejob (= 6.0.0)
17
24
mail (~> 2.5, >= 2.5.4)
18
25
rails-dom-testing (~> 2.0)
19
- actionpack (5.2.3)
20
- actionview (= 5.2.3)
21
- activesupport (= 5.2.3)
26
+ actionpack (6.0.0)
27
+ actionview (= 6.0.0)
28
+ activesupport (= 6.0.0)
22
29
rack (~> 2.0)
23
30
rack-test (>= 0.6.3)
24
31
rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
26
- actionview (5.2.3)
27
- activesupport (= 5.2.3)
32
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
33
+ actiontext (6.0.0)
34
+ actionpack (= 6.0.0)
35
+ activerecord (= 6.0.0)
36
+ activestorage (= 6.0.0)
37
+ activesupport (= 6.0.0)
38
+ nokogiri (>= 1.8.5)
39
+ actionview (6.0.0)
40
+ activesupport (= 6.0.0)
28
41
builder (~> 3.1)
29
42
erubi (~> 1.4)
30
43
rails-dom-testing (~> 2.0)
31
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
32
- activejob (5.2.3)
33
- activesupport (= 5.2.3)
44
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
45
+ activejob (6.0.0)
46
+ activesupport (= 6.0.0)
34
47
globalid (>= 0.3.6)
35
- activemodel (5.2.3)
36
- activesupport (= 5.2.3)
37
- activerecord (5.2.3)
38
- activemodel (= 5.2.3)
39
- activesupport (= 5.2.3)
40
- arel (>= 9.0)
41
- activestorage (5.2.3)
42
- actionpack (= 5.2.3)
43
- activerecord (= 5.2.3)
48
+ activemodel (6.0.0)
49
+ activesupport (= 6.0.0)
50
+ activerecord (6.0.0)
51
+ activemodel (= 6.0.0)
52
+ activesupport (= 6.0.0)
53
+ activestorage (6.0.0)
54
+ actionpack (= 6.0.0)
55
+ activejob (= 6.0.0)
56
+ activerecord (= 6.0.0)
44
57
marcel (~> 0.3.1)
45
- activesupport (5.2.3)
58
+ activesupport (6.0.0)
46
59
concurrent-ruby (~> 1.0, >= 1.0.2)
47
60
i18n (>= 0.7, < 2)
48
61
minitest (~> 5.1)
49
62
tzinfo (~> 1.1)
50
- arel (9.0.0)
63
+ zeitwerk (~> 2.1, >= 2.1.8)
51
64
ast (2.4.0)
52
65
builder (3.2.3)
53
66
concurrent-ruby (1.1.5)
@@ -72,8 +85,8 @@ GEM
72
85
mimemagic (0.3.3)
73
86
mini_mime (1.0.2)
74
87
mini_portile2 (2.4.0)
75
- minitest (5.11.3)
76
- nio4r (2.4.0)
88
+ minitest (5.1.0)
89
+ nio4r (2.5.2)
77
90
nokogiri (1.10.4)
78
91
mini_portile2 (~> 2.4.0)
79
92
parallel (1.17.0)
@@ -82,30 +95,32 @@ GEM
82
95
rack (2.0.7)
83
96
rack-test (1.1.0)
84
97
rack (>= 1.0, < 3)
85
- rails (5.2.3)
86
- actioncable (= 5.2.3)
87
- actionmailer (= 5.2.3)
88
- actionpack (= 5.2.3)
89
- actionview (= 5.2.3)
90
- activejob (= 5.2.3)
91
- activemodel (= 5.2.3)
92
- activerecord (= 5.2.3)
93
- activestorage (= 5.2.3)
94
- activesupport (= 5.2.3)
98
+ rails (6.0.0)
99
+ actioncable (= 6.0.0)
100
+ actionmailbox (= 6.0.0)
101
+ actionmailer (= 6.0.0)
102
+ actionpack (= 6.0.0)
103
+ actiontext (= 6.0.0)
104
+ actionview (= 6.0.0)
105
+ activejob (= 6.0.0)
106
+ activemodel (= 6.0.0)
107
+ activerecord (= 6.0.0)
108
+ activestorage (= 6.0.0)
109
+ activesupport (= 6.0.0)
95
110
bundler (>= 1.3.0)
96
- railties (= 5.2.3)
111
+ railties (= 6.0.0)
97
112
sprockets-rails (>= 2.0.0)
98
113
rails-dom-testing (2.0.3)
99
114
activesupport (>= 4.2.0)
100
115
nokogiri (>= 1.6)
101
116
rails-html-sanitizer (1.2.0)
102
117
loofah (~> 2.2, >= 2.2.2)
103
- railties (5.2.3)
104
- actionpack (= 5.2.3)
105
- activesupport (= 5.2.3)
118
+ railties (6.0.0)
119
+ actionpack (= 6.0.0)
120
+ activesupport (= 6.0.0)
106
121
method_source
107
122
rake (>= 0.8.7)
108
- thor (>= 0.19.0, < 2.0)
123
+ thor (>= 0.20.3, < 2.0)
109
124
rainbow (3.0.0)
110
125
rake (10.5.0)
111
126
rubocop (0.74.0)
@@ -141,6 +156,7 @@ GEM
141
156
websocket-driver (0.7.1)
142
157
websocket-extensions (>= 0.1.0)
143
158
websocket-extensions (0.1.4)
159
+ zeitwerk (2.1.10)
144
160
145
161
PLATFORMS
146
162
ruby
@@ -149,12 +165,12 @@ DEPENDENCIES
149
165
actionview-component!
150
166
bundler (>= 1.14)
151
167
haml (~> 5)
152
- minitest (~> 5.0)
153
- rails (= 5.2.3)
168
+ minitest (= 5.1.0)
169
+ rails (= 6.0.0)
154
170
rake (~> 10.0)
155
171
rubocop (~> 0.59)
156
172
rubocop-github (~> 0.13.0)
157
173
slim (~> 4.0)
158
174
159
175
BUNDLED WITH
160
- 2.0.2
176
+ 1.17.3
data/README.md CHANGED
@@ -9,9 +9,13 @@ This gem is meant to serve as a precursor to upstreaming the `ActionView::Compon
9
9
10
10
Preliminary support for rendering components was merged into Rails `6.1.0.alpha` in https://github.com/rails/rails/pull/36388. Assuming `ActionView::Component` makes it into Rails `6.1`, this gem will then exist to serve as a backport.
11
11
12
+ ## Design philosophy
13
+
14
+ As the goal of this gem is to be upstreamed into Rails, it is designed to integrate as seamlessly as possible, with the [least surprise](https://www.artima.com/intv/ruby4.html).
15
+
12
16
## Compatibility
13
17
14
- `actionview-component` is tested for compatibility with all combinations of Ruby `2.5`/`2.6` and Rails `5.2.3`/`6.0.0`/`6.1.0.alpha`.
18
+ `actionview-component` is tested for compatibility with combinations of Ruby `2.3`/`2.4`/`2.5`/`2.6` and Rails `5.0.0`/`5.2.3`/`6.0.0`/`6.1.0.alpha`.
15
19
16
20
## Installation
17
21
Add this line to your application's Gemfile:
@@ -124,7 +128,7 @@ end
124
128
We can render it in a view as:
125
129
126
130
```erb
127
- <%= render(TestComponent.new(title: "my title")) do %>
131
+ <%= render(TestComponent, title: "my title") do %>
128
132
Hello, World!
129
133
<% end %>
130
134
```
@@ -135,12 +139,24 @@ Which returns:
135
139
<span title="my title">Hello, World!</span>
136
140
```
137
141
142
+ ##### Supported `render` syntaxes
143
+
144
+ Components can be rendered via:
145
+
146
+ `render(TestComponent, foo: :bar)`
147
+
148
+ `render(component: TestComponent, locals: { foo: :bar })`
149
+
150
+ The following syntax has been deprecated and will be removed in v2.0.0:
151
+
152
+ `render(TestComponent.new(foo: :bar)`
153
+
138
154
#### Error case
139
155
140
156
If the component is rendered with a blank title:
141
157
142
158
```erb
143
- <%= render(TestComponent.new(title: "")) do %>
159
+ <%= render(TestComponent, title: "") do %>
144
160
Hello, World!
145
161
<% end %>
146
162
```
@@ -151,7 +167,7 @@ An error will be raised:
151
167
152
168
### Testing
153
169
154
- Components are unit tested directly. The `render_component` test helper renders a component and wraps the result in `Nokogiri.HTML`, allowing us to test the component above as:
170
+ Components are unit tested directly. The `render_inline` test helper wraps the result in `Nokogiri.HTML`, allowing us to test the component above as:
155
171
156
172
```ruby
157
173
require "action_view/component/test_helpers"
@@ -162,7 +178,7 @@ class MyComponentTest < Minitest::Test
162
178
def test_render_component
163
179
assert_equal(
164
180
%(<span title="my title">Hello, World!</span>),
165
- render_component(TestComponent.new(title: "my title")) { "Hello, World!" }.css("span").to_html
181
+ render_inline(TestComponent, title: "my title") { "Hello, World!" }.css("span").to_html
166
182
)
167
183
end
168
184
end
data/actionview-component.gemspec CHANGED
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
7
7
Gem::Specification.new do |spec|
8
8
spec.name = "actionview-component"
9
- spec.version = "1.1.0"
9
+ spec.version = "1.3.2"
10
10
spec.authors = ["GitHub Open Source"]
11
11
spec.email = ["opensource+actionview-component@github.com"]
12
12
@@ -31,11 +31,11 @@ Gem::Specification.new do |spec|
31
31
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
spec.require_paths = ["lib"]
33
33
34
- spec.required_ruby_version = ">= 2.5.0"
34
+ spec.required_ruby_version = ">= 2.3.0"
35
35
36
36
spec.add_development_dependency "bundler", ">= 1.14"
37
37
spec.add_development_dependency "rake", "~> 10.0"
38
- spec.add_development_dependency "minitest", "~> 5.0"
38
+ spec.add_development_dependency "minitest", "= 5.1.0"
39
39
spec.add_development_dependency "haml", "~> 5"
40
40
spec.add_development_dependency "slim", "~> 4.0"
41
41
spec.add_development_dependency "rubocop", "~> 0.59"
data/lib/action_view/component/base.rb CHANGED
@@ -2,24 +2,36 @@
2
2
3
3
# Monkey patch ActionView::Base#render to support ActionView::Component
4
4
#
5
- # Upstreamed in https://github.com/rails/rails/pull/36388
6
- # Necessary for Rails versions < 6.1.0.alpha
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
7
class ActionView::Base
8
8
module RenderMonkeyPatch
9
- def render(component, _ = nil, &block)
10
- return super unless component.respond_to?(:render_in)
11
-
12
- component.render_in(self, &block)
9
+ def render(options = {}, args = {}, &block)
10
+ if options.respond_to?(:render_in)
11
+ ActiveSupport::Deprecation.warn(
12
+ "passing component instances to `render` has been deprecated and will be removed in v2.0.0. Use `render MyComponent, foo: :bar` instead."
13
+ )
14
+
15
+ options.render_in(self, &block)
16
+ elsif options.is_a?(Class) && options < ActionView::Component::Base
17
+ options.new(args).render_in(self, &block)
18
+ elsif options.is_a?(Hash) && options.has_key?(:component)
19
+ options[:component].new(options[:locals]).render_in(self, &block)
20
+ else
21
+ super
22
+ end
13
23
end
14
24
end
15
25
16
- prepend RenderMonkeyPatch unless Rails::VERSION::MINOR > 0 && Rails::VERSION::MAJOR == 6
26
+ prepend RenderMonkeyPatch
17
27
end
18
28
19
29
module ActionView
20
30
module Component
21
31
class Base < ActionView::Base
22
32
include ActiveModel::Validations
33
+ include ActiveSupport::Configurable
34
+ include ActionController::RequestForgeryProtection
23
35
24
36
# Entrypoint for rendering components. Called by ActionView::Base#render.
25
37
#
@@ -42,12 +54,18 @@ module ActionView
42
54
# <span title="<%= @title %>">Hello, <%= content %>!</span>
43
55
#
44
56
# In use:
45
- # <%= render MyComponent.new(title: "greeting") do %>world<% end %>
57
+ # <%= render MyComponent, title: "greeting" do %>world<% end %>
46
58
# returns:
47
59
# <span title="greeting">Hello, world!</span>
48
60
#
49
61
def render_in(view_context, *args, &block)
50
62
self.class.compile
63
+ self.controller = view_context.controller
64
+ @view_context = view_context
65
+ @view_renderer ||= view_context.view_renderer
66
+ @lookup_context ||= view_context.lookup_context
67
+ @view_flow ||= view_context.view_flow
68
+
51
69
@content = view_context.capture(&block) if block_given?
52
70
validate!
53
71
call
@@ -55,6 +73,14 @@ module ActionView
55
73
56
74
def initialize(*); end
57
75
76
+ def render(options = {}, args = {}, &block)
77
+ if options.is_a?(String) || (options.is_a?(Hash) && options.has_key?(:partial))
78
+ view_context.render(options, args, &block)
79
+ else
80
+ super
81
+ end
82
+ end
83
+
58
84
class << self
59
85
def inherited(child)
60
86
child.include Rails.application.routes.url_helpers unless child < Rails.application.routes.url_helpers
@@ -126,7 +152,7 @@ module ActionView
126
152
127
153
private
128
154
129
- attr_reader :content
155
+ attr_reader :content, :view_context
130
156
end
131
157
end
132
158
end
data/lib/action_view/component/test_helpers.rb CHANGED
@@ -3,8 +3,20 @@
3
3
module ActionView
4
4
module Component
5
5
module TestHelpers
6
- def render_component(component, &block)
7
- Nokogiri::HTML(component.render_in(ApplicationController.new.view_context, &block))
6
+ def render_inline(component, **args, &block)
7
+ Nokogiri::HTML(controller.view_context.render(component, args, &block))
8
+ end
9
+
10
+ def controller
11
+ @controller ||= ApplicationController.new.tap { |c| c.request = ActionDispatch::TestRequest.create }
12
+ end
13
+
14
+ def render_component(component, **args, &block)
15
+ ActiveSupport::Deprecation.warn(
16
+ "`render_component` has been deprecated in favor of `render_inline`, and will be removed in v2.0.0."
17
+ )
18
+
19
+ render_inline(component, args, &block)
8
20
end
9
21
end
10
22
end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
--- !ruby/object:Gem::Specification
2
2
name: actionview-component
3
3
version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.2
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: 2019-08-27 00:00:00.000000000 Z
11
+ date: 2019-10-02 00:00:00.000000000 Z
12
12
dependencies:
13
13
- !ruby/object:Gem::Dependency
14
14
name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
name: minitest
43
43
requirement: !ruby/object:Gem::Requirement
44
44
requirements:
45
- - - "~>"
45
+ - - '='
46
46
- !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: 5.1.0
48
48
type: :development
49
49
prerelease: false
50
50
version_requirements: !ruby/object:Gem::Requirement
51
51
requirements:
52
- - - "~>"
52
+ - - '='
53
53
- !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: 5.1.0
55
55
- !ruby/object:Gem::Dependency
56
56
name: haml
57
57
requirement: !ruby/object:Gem::Requirement
@@ -147,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
147
requirements:
148
148
- - ">="
149
149
- !ruby/object:Gem::Version
150
- version: 2.5.0
150
+ version: 2.3.0
151
151
required_rubygems_version: !ruby/object:Gem::Requirement
152
152
requirements:
153
153
- - ">="