actionview-component 1.5.1 → 1.6.2

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: 84c85d88f1ceefc7d3a0c97affcaa2465120a4513f0f445863a068715cb55f88
4
- data.tar.gz: ad3ae8d04886ee3c22f79b73998e6d3d0156f9ef8e84cd64468139a6bd9b282a
3
+ metadata.gz: 57dd1d0375f05f3a5849670716be000a0c8074f4ae63b1d422278006b07e5b32
4
+ data.tar.gz: 42309cc4774f3405e338cd48a84bc6ee6619ffa3306d98ab8432e8a196d6cb5f
5
5
  SHA512:
6
- metadata.gz: fd41865d44d1b450f9772ff3da1dac80b5873c809bb4cc598c93be37e15c074fb5fdbf5186350af13a8da65d7c8502dcccfd069e7e71ef86e4b87b19891f4bcd
7
- data.tar.gz: c44f9d1129c3597553abf20510ec50a9f490b707bc121fd0bee8f7046ae257a6cf0a6517e91bdfa14391e1028b88565f14eda017224c79577700741ef85560c1
6
+ metadata.gz: fdaad351b7db8bb6aab8e94294c221c50993cdd851fac8d43f64c3628627b5652be8fd3bb93f450467f74401433d4d3fffea560ca9ddc8c78fe645fbe0596056
7
+ data.tar.gz: f75561cba609fd4eecf3ac958a0cf9ef9ee9300772c3016749cf3ab5bea5e5ac5f4c2005f47623587e5a80fb9c9d71a18aeaad33fc9d89ba8c1123191dc0345b
@@ -0,0 +1,30 @@
1
+ <!-- **** Filing a Feature Request? Include these sections. **** -->
2
+
3
+ ### Feature request
4
+ <!-- Provide a summary of the behavior. -->
5
+
6
+ ### Motivation
7
+
8
+ <!-- What would you like to do with this feature? Can you provide
9
+ context or references to similar behavior in other libraries. -->
10
+
11
+
12
+
13
+
14
+
15
+ <!-- **** Filing a Bug Report? Include these sections. **** -->
16
+
17
+ ### Steps to reproduce
18
+ <!-- Provide an series of steps or, better yet, a link to a repo to
19
+ demonstrate the bug you've identified. -->
20
+
21
+ ### Expected behavior
22
+ <!-- Tell us what should happen -->
23
+
24
+ ### Actual behavior
25
+ <!-- Tell us what happens instead -->
26
+
27
+ ### System configuration
28
+ **Rails version**:
29
+
30
+ **Ruby version**:
@@ -0,0 +1,19 @@
1
+ <!-- https://github.com/github/actionview-component/blob/master/CONTRIBUTING.md#submitting-a-pull-request -->
2
+
3
+ ### Summary
4
+
5
+ <!-- Provide a general description of the code changes in your pull
6
+ request... were there any bugs you had fixed? If so, mention them. If
7
+ these bugs have open GitHub issues, be sure to tag them here as well,
8
+ to keep the conversation linked together. -->
9
+
10
+ ### Other Information
11
+
12
+ <!-- If there's anything else that's important and relevant to your pull
13
+ request, mention that information here. This could include
14
+ benchmarks, or other information.
15
+
16
+ If you are updating any of the CHANGELOG files or are asked to update the
17
+ CHANGELOG files by reviewers, please add the CHANGELOG entry at the top of the file.
18
+
19
+ Thanks for contributing to actionview-component! -->
data/.gitignore CHANGED
@@ -10,6 +10,7 @@
10
10
  /test/version_tmp/
11
11
  /tmp/
12
12
  /test/log/*
13
+ /test/app/tmp/*
13
14
 
14
15
  # Used by dotenv library to load environment variables.
15
16
  # .env
@@ -1,3 +1,89 @@
1
+ # v1.6.2
2
+
3
+ * Fix Uninitialized Constant error.
4
+
5
+ *Jon Palmer*
6
+
7
+ * Add basic github issue and PR templates.
8
+
9
+ *Dylan Clark*
10
+
11
+ * Update readme phrasing around previews.
12
+
13
+ *Justin Coyne*
14
+
15
+ # v1.6.1
16
+
17
+ * Allow Previews to have no layout.
18
+
19
+ *Jon Palmer*
20
+
21
+ * Bump rack from 2.0.7 to 2.0.8.
22
+
23
+ *Dependabot*
24
+
25
+ * Compile components on application boot when eager loading is enabled.
26
+
27
+ *Joel Hawksley*
28
+
29
+ * Previews support content blocks.
30
+
31
+ *Cesario Uy*
32
+
33
+ * Follow Rails conventions. (refactor)
34
+
35
+ *Rainer Borene*
36
+
37
+ * Fix edge case issue with extracting variants from less conventional source_locations.
38
+
39
+ *Ryan Workman*
40
+
41
+ # v1.6.0
42
+
43
+ * Avoid dropping elements in the render_inline test helper.
44
+
45
+ *@dark-panda*
46
+
47
+ * Add test for helpers.asset_url.
48
+
49
+ *Christopher Coleman*
50
+
51
+ * Add rudimentary compatibility with better_html.
52
+
53
+ *Joel Hawksley*
54
+
55
+ * Template-less variants fall back to default template.
56
+
57
+ *Asger Behncke Jacobsen*, *Cesario Uy*
58
+
59
+ * Generated tests use new naming convention.
60
+
61
+ *Simon Træls Ravn*
62
+
63
+ * Eliminate sqlite dependency.
64
+
65
+ *Simon Dawson*
66
+
67
+ * Add support for rendering components via #to_component_class
68
+
69
+ *Vinicius Stock*
70
+
71
+ # v1.5.3
72
+
73
+ * Add support for RSpec to generators.
74
+
75
+ *Dylan Clark, Ryan Workman*
76
+
77
+ * Require controllers as part of setting autoload paths.
78
+
79
+ *Joel Hawksley*
80
+
81
+ # v1.5.2
82
+
83
+ * Disable eager loading initializer.
84
+
85
+ *Kasper Meyer*
86
+
1
87
  # v1.5.1
2
88
 
3
89
  * Update railties class to work with Rails 6.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- actionview-component (1.5.1)
4
+ actionview-component (1.6.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -62,6 +62,14 @@ GEM
62
62
  tzinfo (~> 1.1)
63
63
  zeitwerk (~> 2.1, >= 2.1.8)
64
64
  ast (2.4.0)
65
+ better_html (1.0.14)
66
+ actionview (>= 4.0)
67
+ activesupport (>= 4.0)
68
+ ast (~> 2.0)
69
+ erubi (~> 1.4)
70
+ html_tokenizer (~> 0.0.6)
71
+ parser (>= 2.4)
72
+ smart_properties
65
73
  builder (3.2.3)
66
74
  concurrent-ruby (1.1.5)
67
75
  crass (1.0.5)
@@ -71,6 +79,7 @@ GEM
71
79
  haml (5.1.2)
72
80
  temple (>= 0.8.0)
73
81
  tilt
82
+ html_tokenizer (0.0.7)
74
83
  i18n (1.6.0)
75
84
  concurrent-ruby (~> 1.0)
76
85
  jaro_winkler (1.5.3)
@@ -92,7 +101,7 @@ GEM
92
101
  parallel (1.17.0)
93
102
  parser (2.6.3.0)
94
103
  ast (~> 2.4.0)
95
- rack (2.0.7)
104
+ rack (2.0.8)
96
105
  rack-test (1.1.0)
97
106
  rack (>= 1.0, < 3)
98
107
  rails (6.0.0)
@@ -139,6 +148,7 @@ GEM
139
148
  slim (4.0.1)
140
149
  temple (>= 0.7.6, < 0.9)
141
150
  tilt (>= 2.0.6, < 2.1)
151
+ smart_properties (1.15.0)
142
152
  sprockets (3.7.2)
143
153
  concurrent-ruby (~> 1.0)
144
154
  rack (> 1, < 3)
@@ -163,6 +173,7 @@ PLATFORMS
163
173
 
164
174
  DEPENDENCIES
165
175
  actionview-component!
176
+ better_html (~> 1)
166
177
  bundler (>= 1.14)
167
178
  haml (~> 5)
168
179
  minitest (= 5.1.0)
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  This gem is meant to serve as a precursor to upstreaming the `ActionView::Component` class into Rails. It also serves to enable the usage of `ActionView::Component` in older versions of Rails.
9
9
 
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.
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, this gem will then exist to serve as a backport.
11
11
 
12
12
  ## Design philosophy
13
13
 
@@ -32,7 +32,7 @@ $ bundle
32
32
  In `config/application.rb`, add:
33
33
 
34
34
  ```bash
35
- require "action_view/component"
35
+ require "action_view/component/railtie"
36
36
  ```
37
37
 
38
38
  ## Guide
@@ -163,6 +163,24 @@ Components can be rendered via:
163
163
 
164
164
  `render(component: TestComponent, locals: { foo: :bar })`
165
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
+
166
184
  The following syntax has been deprecated and will be removed in v2.0.0:
167
185
 
168
186
  `render(TestComponent.new(foo: :bar))`
@@ -186,12 +204,10 @@ An error will be raised:
186
204
  Components are unit tested directly. The `render_inline` test helper wraps the result in `Nokogiri.HTML`, allowing us to test the component above as:
187
205
 
188
206
  ```ruby
189
- require "action_view/component/test_helpers"
190
-
191
- class MyComponentTest < Minitest::Test
192
- include ActionView::Component::TestHelpers
207
+ require "action_view/component/test_case"
193
208
 
194
- def test_render_component
209
+ class MyComponentTest < ActionView::Component::TestCase
210
+ test "render component" do
195
211
  assert_equal(
196
212
  %(<span title="my title">Hello, World!</span>),
197
213
  render_inline(TestComponent, title: "my title") { "Hello, World!" }.to_html
@@ -207,7 +223,7 @@ In general, we’ve found it makes the most sense to test components based on th
207
223
  To test a specific variant you can wrap your test with the `with_variant` helper method as:
208
224
 
209
225
  ```ruby
210
- def test_render_component_for_tablet
226
+ test "render component for tablet" do
211
227
  with_variant :tablet do
212
228
  assert_equal(
213
229
  %(<span title="my title">Hello, tablets!</span>),
@@ -218,7 +234,7 @@ end
218
234
  ```
219
235
 
220
236
  ### Previewing Components
221
- `ActionView::Component::Preview`s provide a way to see how components look by visiting a special URL that renders them.
237
+ `ActionView::Component::Preview` provides a way to see how components look by visiting a special URL that renders them.
222
238
  In the previous example, the preview class for `TestComponent` would be called `TestComponentPreview` and located in `test/components/previews/test_component_preview.rb`.
223
239
  To see the preview of the component with a given title, implement a method that renders the component.
224
240
  You can define as many examples as you want:
@@ -260,6 +276,30 @@ For example, if you want to use `lib/component_previews`, set the following in `
260
276
  config.action_view_component.preview_path = "#{Rails.root}/lib/component_previews"
261
277
  ```
262
278
 
279
+ ### Setting up RSpec
280
+
281
+ If you're using RSpec, you can configure component specs to have access to test helpers. Add the following to
282
+ `spec/rails_helper.rb`:
283
+
284
+ ```ruby
285
+ require "action_view/component/test_helpers"
286
+
287
+ RSpec.configure do |config|
288
+ # ...
289
+
290
+ # Ensure that the test helpers are available in component specs
291
+ config.include ActionView::Component::TestHelpers, type: :component
292
+ end
293
+ ```
294
+
295
+ Specs created by the generator should now have access to test helpers like `render_inline`.
296
+
297
+ To use component previews, set the following in `config/application.rb`:
298
+
299
+ ```ruby
300
+ config.action_view_component.preview_path = "#{Rails.root}/spec/components/previews"
301
+ ```
302
+
263
303
  ## Frequently Asked Questions
264
304
 
265
305
  ### Can I use other templating languages besides ERB?
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "minitest", "= 5.1.0"
40
40
  spec.add_development_dependency "haml", "~> 5"
41
41
  spec.add_development_dependency "slim", "~> 4.0"
42
+ spec.add_development_dependency "better_html", "~> 1"
42
43
  spec.add_development_dependency "rubocop", "= 0.74"
43
44
  spec.add_development_dependency "rubocop-github", "~> 0.13.0"
44
45
  end
@@ -1,5 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "action_view/component/monkey_patch"
4
- require "action_view/component/base"
3
+ require "active_model"
4
+ require "action_view"
5
+ require "active_support/dependencies/autoload"
5
6
  require "action_view/component/railtie"
7
+
8
+ module ActionView
9
+ module Component
10
+ extend ActiveSupport::Autoload
11
+
12
+ autoload :Base
13
+ autoload :Conversion
14
+ autoload :Preview
15
+ autoload :Previewable
16
+ autoload :TestHelpers
17
+ autoload :TestCase
18
+ autoload :RenderMonkeyPatch
19
+ end
20
+ end
21
+
22
+ ActiveModel::Conversion.include ActionView::Component::Conversion
@@ -1,21 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_model"
4
- require "action_view"
5
3
  require "active_support/configurable"
6
- require_relative "preview"
7
4
 
8
5
  module ActionView
9
6
  module Component
10
7
  class Base < ActionView::Base
11
8
  include ActiveModel::Validations
12
9
  include ActiveSupport::Configurable
13
- include ActionView::Component::Previews
10
+ include ActionView::Component::Previewable
14
11
 
15
12
  delegate :form_authenticity_token, :protect_against_forgery?, to: :helpers
16
13
 
17
- validate :variant_exists
18
-
19
14
  # Entrypoint for rendering components. Called by ActionView::Base#render.
20
15
  #
21
16
  # view_context: ActionView context from calling view
@@ -94,12 +89,6 @@ module ActionView
94
89
 
95
90
  private
96
91
 
97
- def variant_exists
98
- return if self.class.variants.include?(@variant) || @variant.nil?
99
-
100
- errors.add(:variant, "'#{@variant}' has no template defined")
101
- end
102
-
103
92
  def request
104
93
  @request ||= controller.request
105
94
  end
@@ -114,13 +103,17 @@ module ActionView
114
103
  end
115
104
 
116
105
  def call_method_name(variant)
117
- if variant.present?
106
+ if variant.present? && variants.include?(variant)
118
107
  "call_#{variant}"
119
108
  else
120
109
  "call"
121
110
  end
122
111
  end
123
112
 
113
+ def has_initializer?
114
+ self.instance_method(:initialize).owner == self
115
+ end
116
+
124
117
  def source_location
125
118
  # Require #initialize to be defined so that we can use
126
119
  # method#source_location to look up the file name
@@ -129,16 +122,20 @@ module ActionView
129
122
  # If we were able to only support Ruby 2.7+,
130
123
  # We could just use Module#const_source_location,
131
124
  # rendering this unnecessary.
132
- raise NotImplementedError.new("#{self} must implement #initialize.") unless self.instance_method(:initialize).owner == self
125
+ raise NotImplementedError.new("#{self} must implement #initialize.") unless has_initializer?
133
126
 
134
127
  instance_method(:initialize).source_location[0]
135
128
  end
136
129
 
130
+ def compiled?
131
+ @compiled && ActionView::Base.cache_template_loading
132
+ end
133
+
137
134
  # Compile templates to instance methods, assuming they haven't been compiled already.
138
135
  # We could in theory do this on app boot, at least in production environments.
139
136
  # Right now this just compiles the first time the component is rendered.
140
137
  def compile
141
- return if @compiled && ActionView::Base.cache_template_loading
138
+ return if compiled?
142
139
 
143
140
  validate_templates
144
141
 
@@ -164,18 +161,24 @@ module ActionView
164
161
  end
165
162
 
166
163
  def identifier
167
- ""
164
+ source_location
168
165
  end
169
166
 
170
167
  private
171
168
 
169
+ def matching_views_in_source_location
170
+ (Dir["#{source_location.sub(/#{File.extname(source_location)}$/, '')}.*{#{ActionView::Template.template_handler_extensions.join(',')}}"] - [source_location])
171
+ end
172
+
172
173
  def templates
173
174
  @templates ||=
174
- (Dir["#{source_location.sub(/#{File.extname(source_location)}$/, '')}.*{#{ActionView::Template.template_handler_extensions.join(',')}}"] - [source_location]).each_with_object([]) do |path, memo|
175
+ matching_views_in_source_location.each_with_object([]) do |path, memo|
176
+ pieces = File.basename(path).split(".")
177
+
175
178
  memo << {
176
179
  path: path,
177
- variant: path.split(".").second.split("+")[1]&.to_sym,
178
- handler: path.split(".").last
180
+ variant: pieces.second.split("+")[1]&.to_sym,
181
+ handler: pieces.last
179
182
  }
180
183
  end
181
184
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionView
4
+ module Component # :nodoc:
5
+ module Conversion
6
+ def to_component_class
7
+ "#{self.class.name}Component".safe_constantize
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,37 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/concern"
4
3
  require "active_support/descendants_tracker"
5
- require_relative "test_helpers"
6
4
 
7
5
  module ActionView
8
- module Component #:nodoc:
9
- module Previews
10
- extend ActiveSupport::Concern
11
-
12
- included do
13
- # Set the location of component previews through app configuration:
14
- #
15
- # config.action_view_component.preview_path = "#{Rails.root}/lib/component_previews"
16
- #
17
- mattr_accessor :preview_path, instance_writer: false
18
-
19
- # Enable or disable component previews through app configuration:
20
- #
21
- # config.action_view_component.show_previews = true
22
- #
23
- # Defaults to +true+ for development environment
24
- #
25
- mattr_accessor :show_previews, instance_writer: false
26
- end
27
- end
28
-
6
+ module Component # :nodoc:
29
7
  class Preview
30
8
  extend ActiveSupport::DescendantsTracker
31
9
  include ActionView::Component::TestHelpers
32
10
 
33
- def render(component, *locals)
34
- render_inline(component, *locals)
11
+ def render(component, *locals, &block)
12
+ render_inline(component, *locals, &block)
35
13
  end
36
14
 
37
15
  class << self
@@ -42,11 +20,14 @@ module ActionView
42
20
  end
43
21
 
44
22
  # Returns the html of the component in its layout
45
- def call(example)
23
+ def call(example, layout: nil)
46
24
  example_html = new.public_send(example)
25
+ if layout.nil?
26
+ layout = @layout.nil? ? "layouts/application" : @layout
27
+ end
47
28
 
48
29
  Rails::ComponentExamplesController.render(template: "examples/show",
49
- layout: @layout || "layouts/application",
30
+ layout: layout,
50
31
  assigns: { example: example_html })
51
32
  end
52
33
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module ActionView
6
+ module Component # :nodoc:
7
+ module Previewable
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ # Set the location of component previews through app configuration:
12
+ #
13
+ # config.action_view_component.preview_path = "#{Rails.root}/lib/component_previews"
14
+ #
15
+ mattr_accessor :preview_path, instance_writer: false
16
+
17
+ # Enable or disable component previews through app configuration:
18
+ #
19
+ # config.action_view_component.show_previews = true
20
+ #
21
+ # Defaults to +true+ for development environment
22
+ #
23
+ mattr_accessor :show_previews, instance_writer: false
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,18 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "railties/lib/rails/components_controller"
4
- require "railties/lib/rails/component_examples_controller"
3
+ require "rails"
4
+ require "action_view/component"
5
5
 
6
6
  module ActionView
7
7
  module Component
8
8
  class Railtie < Rails::Railtie # :nodoc:
9
9
  config.action_view_component = ActiveSupport::OrderedOptions.new
10
10
 
11
- # Disabled due to issues with ActionView::Component::Base not defining .logger
12
- # initializer "action_view_component.logger" do
13
- # ActiveSupport.on_load(:action_view_component) { self.logger ||= Rails.logger }
14
- # end
15
-
16
11
  initializer "action_view_component.set_configs" do |app|
17
12
  options = app.config.action_view_component
18
13
 
@@ -28,6 +23,9 @@ module ActionView
28
23
  end
29
24
 
30
25
  initializer "action_view_component.set_autoload_paths" do |app|
26
+ require "railties/lib/rails/components_controller"
27
+ require "railties/lib/rails/component_examples_controller"
28
+
31
29
  options = app.config.action_view_component
32
30
 
33
31
  if options.show_previews && options.preview_path
@@ -35,15 +33,23 @@ module ActionView
35
33
  end
36
34
  end
37
35
 
36
+ initializer "action_view_component.eager_load_actions" do
37
+ ActiveSupport.on_load(:after_initialize) do
38
+ ActionView::Component::Base.descendants.each do |descendant|
39
+ descendant.compile if descendant.has_initializer? && config.eager_load
40
+ end
41
+ end
42
+ end
43
+
38
44
  initializer "action_view_component.compile_config_methods" do
39
45
  ActiveSupport.on_load(:action_view_component) do
40
46
  config.compile_methods! if config.respond_to?(:compile_methods!)
41
47
  end
42
48
  end
43
49
 
44
- initializer "action_view_component.eager_load_actions" do
45
- ActiveSupport.on_load(:after_initialize) do
46
- ActionView::Component::Base.descendants.each(&:action_methods) if config.eager_load
50
+ initializer "action_view_component.monkey_patch_render" do
51
+ ActiveSupport.on_load(:action_view) do
52
+ ActionView::Base.prepend ActionView::Component::RenderMonkeyPatch
47
53
  end
48
54
  end
49
55
 
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
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
+ module ActionView
8
+ module Component
9
+ module RenderMonkeyPatch # :nodoc:
10
+ def render(options = {}, args = {}, &block)
11
+ if options.respond_to?(:render_in)
12
+ ActiveSupport::Deprecation.warn(
13
+ "passing component instances (`render MyComponent.new(foo: :bar)`) has been deprecated and will be removed in v2.0.0. Use `render MyComponent, foo: :bar` instead."
14
+ )
15
+
16
+ options.render_in(self, &block)
17
+ elsif options.is_a?(Class) && options < ActionView::Component::Base
18
+ options.new(args).render_in(self, &block)
19
+ elsif options.is_a?(Hash) && options.has_key?(:component)
20
+ options[:component].new(options[:locals]).render_in(self, &block)
21
+ elsif options.respond_to?(:to_component_class) && !options.to_component_class.nil?
22
+ options.to_component_class.new(options).render_in(self, &block)
23
+ else
24
+ super
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/test_case"
4
+
5
+ module ActionView
6
+ module Component
7
+ class TestCase < ActiveSupport::TestCase
8
+ include ActionView::Component::TestHelpers
9
+ end
10
+ end
11
+ end
@@ -4,7 +4,7 @@ module ActionView
4
4
  module Component
5
5
  module TestHelpers
6
6
  def render_inline(component, **args, &block)
7
- Nokogiri::HTML(controller.view_context.render(component, args, &block)).css("body > *")
7
+ Nokogiri::HTML.fragment(controller.view_context.render(component, args, &block))
8
8
  end
9
9
 
10
10
  def controller
@@ -4,8 +4,8 @@ module ActionView
4
4
  module Component
5
5
  module VERSION
6
6
  MAJOR = 1
7
- MINOR = 5
8
- PATCH = 1
7
+ MINOR = 6
8
+ PATCH = 2
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Generators
5
+ class ComponentGenerator < ::Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def create_test_file
9
+ template "component_spec.rb", File.join("spec/components", "#{file_name}_component_spec.rb")
10
+ end
11
+
12
+ private
13
+
14
+ def file_name
15
+ @_file_name ||= super.sub(/_component\z/i, "")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.describe <%= class_name %>Component, type: :component do
4
+ pending "add some examples to (or delete) #{__FILE__}"
5
+
6
+ # it "renders something useful" do
7
+ # expect(
8
+ # render_inline(described_class, attr: "value") { "Hello, components!" }.css("p").to_html
9
+ # ).to include(
10
+ # "Hello, components!"
11
+ # )
12
+ # end
13
+ end
@@ -1,12 +1,10 @@
1
1
  require "test_helper"
2
2
 
3
- class <%= class_name %>ComponentTest < ActiveSupport::TestCase
4
- include ActionView::Component::TestHelpers
5
-
3
+ class <%= class_name %>ComponentTest < ActionView::Component::TestCase
6
4
  test "component renders something useful" do
7
5
  # assert_equal(
8
6
  # %(<span title="my title">Hello, components!</span>),
9
- # render_inline(<%= class_name %>, attr: "value") { "Hello, components!" }.css("span").to_html
7
+ # render_inline(<%= class_name %>Component, attr: "value") { "Hello, components!" }.css("span").to_html
10
8
  # )
11
9
  end
12
10
  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.5.1
4
+ version: 1.6.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-11-21 00:00:00.000000000 Z
11
+ date: 2020-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '4.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: better_html
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rubocop
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +129,8 @@ executables: []
115
129
  extensions: []
116
130
  extra_rdoc_files: []
117
131
  files:
132
+ - ".github/ISSUE_TEMPLATE"
133
+ - ".github/PULL_REQUEST_TEMPLATE"
118
134
  - ".github/workflows/ruby_on_rails.yml"
119
135
  - ".gitignore"
120
136
  - ".rubocop.yml"
@@ -129,15 +145,20 @@ files:
129
145
  - actionview-component.gemspec
130
146
  - lib/action_view/component.rb
131
147
  - lib/action_view/component/base.rb
132
- - lib/action_view/component/monkey_patch.rb
148
+ - lib/action_view/component/conversion.rb
133
149
  - lib/action_view/component/preview.rb
150
+ - lib/action_view/component/previewable.rb
134
151
  - lib/action_view/component/railtie.rb
152
+ - lib/action_view/component/render_monkey_patch.rb
153
+ - lib/action_view/component/test_case.rb
135
154
  - lib/action_view/component/test_helpers.rb
136
155
  - lib/action_view/component/version.rb
137
156
  - lib/rails/generators/component/USAGE
138
157
  - lib/rails/generators/component/component_generator.rb
139
158
  - lib/rails/generators/component/templates/component.html.erb.tt
140
159
  - lib/rails/generators/component/templates/component.rb.tt
160
+ - lib/rails/generators/rspec/component_generator.rb
161
+ - lib/rails/generators/rspec/templates/component_spec.rb.tt
141
162
  - lib/rails/generators/test_unit/component_generator.rb
142
163
  - lib/rails/generators/test_unit/templates/component_test.rb.tt
143
164
  - lib/railties/lib/rails.rb
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
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
- class ActionView::Base
8
- module RenderMonkeyPatch
9
- def render(options = {}, args = {}, &block)
10
- if options.respond_to?(:render_in)
11
- ActiveSupport::Deprecation.warn(
12
- "passing component instances (`render MyComponent.new(foo: :bar)`) 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
23
- end
24
- end
25
-
26
- prepend RenderMonkeyPatch
27
- end