actionview-component 1.13.0 → 1.14.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/README.md +43 -55
- data/actionview-component.gemspec +2 -2
- data/app/controllers/rails/components_controller.rb +4 -4
- data/lib/action_view/component.rb +1 -21
- data/lib/action_view/component/base.rb +1 -262
- data/lib/action_view/component/preview.rb +1 -72
- data/lib/action_view/component/railtie.rb +1 -1
- data/lib/action_view/component/test_case.rb +1 -4
- data/lib/rails/generators/component/component_generator.rb +1 -1
- data/lib/rails/generators/test_unit/templates/component_test.rb.tt +1 -1
- data/lib/view_component.rb +29 -0
- data/lib/view_component/base.rb +273 -0
- data/lib/view_component/conversion.rb +9 -0
- data/lib/view_component/engine.rb +65 -0
- data/lib/view_component/preview.rb +77 -0
- data/lib/view_component/previewable.rb +25 -0
- data/lib/view_component/render_monkey_patch.rb +31 -0
- data/lib/view_component/rendering_monkey_patch.rb +13 -0
- data/lib/view_component/template_error.rb +9 -0
- data/lib/view_component/test_case.rb +9 -0
- data/lib/view_component/test_helpers.rb +43 -0
- data/lib/view_component/version.rb +11 -0
- data/script/console +1 -1
- metadata +14 -10
- data/lib/action_view/component/conversion.rb +0 -11
- data/lib/action_view/component/engine.rb +0 -67
- data/lib/action_view/component/previewable.rb +0 -27
- data/lib/action_view/component/render_monkey_patch.rb +0 -34
- data/lib/action_view/component/rendering_monkey_patch.rb +0 -15
- data/lib/action_view/component/template_error.rb +0 -11
- data/lib/action_view/component/test_helpers.rb +0 -45
- data/lib/action_view/component/version.rb +0 -13
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/descendants_tracker"
|
4
|
+
|
5
|
+
module ViewComponent # :nodoc:
|
6
|
+
class Preview
|
7
|
+
extend ActiveSupport::DescendantsTracker
|
8
|
+
|
9
|
+
def render(component, **args, &block)
|
10
|
+
{ component: component, args: args, block: block }
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
# Returns all component preview classes.
|
15
|
+
def all
|
16
|
+
load_previews if descendants.empty?
|
17
|
+
descendants
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the arguments for rendering of the component in its layout
|
21
|
+
def render_args(example)
|
22
|
+
new.public_send(example).merge(layout: @layout)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the component object class associated to the preview.
|
26
|
+
def component
|
27
|
+
name.chomp("Preview").constantize
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns all of the available examples for the component preview.
|
31
|
+
def examples
|
32
|
+
public_instance_methods(false).map(&:to_s).sort
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns +true+ if the example of the component preview exists.
|
36
|
+
def example_exists?(example)
|
37
|
+
examples.include?(example)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns +true+ if the preview exists.
|
41
|
+
def exists?(preview)
|
42
|
+
all.any? { |p| p.preview_name == preview }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Find a component preview by its underscored class name.
|
46
|
+
def find(preview)
|
47
|
+
all.find { |p| p.preview_name == preview }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the underscored name of the component preview without the suffix.
|
51
|
+
def preview_name
|
52
|
+
name.chomp("Preview").underscore
|
53
|
+
end
|
54
|
+
|
55
|
+
# Setter for layout name.
|
56
|
+
def layout(layout_name)
|
57
|
+
@layout = layout_name
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def load_previews
|
63
|
+
if preview_path
|
64
|
+
Dir["#{preview_path}/**/*_preview.rb"].sort.each { |file| require_dependency file }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def preview_path
|
69
|
+
Base.preview_path
|
70
|
+
end
|
71
|
+
|
72
|
+
def show_previews
|
73
|
+
Base.show_previews
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module ViewComponent # :nodoc:
|
6
|
+
module Previewable
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
# Set the location of component previews through app configuration:
|
11
|
+
#
|
12
|
+
# config.action_view_component.preview_path = "#{Rails.root}/lib/component_previews"
|
13
|
+
#
|
14
|
+
mattr_accessor :preview_path, instance_writer: false
|
15
|
+
|
16
|
+
# Enable or disable component previews through app configuration:
|
17
|
+
#
|
18
|
+
# config.action_view_component.show_previews = true
|
19
|
+
#
|
20
|
+
# Defaults to +true+ for development environment
|
21
|
+
#
|
22
|
+
mattr_accessor :show_previews, instance_writer: false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewComponent
|
4
|
+
module RenderMonkeyPatch # :nodoc:
|
5
|
+
def render(options = {}, args = {}, &block)
|
6
|
+
if options.respond_to?(:render_in)
|
7
|
+
options.render_in(self, &block)
|
8
|
+
elsif options.is_a?(Class) && options < ActionView::Component::Base
|
9
|
+
ActiveSupport::Deprecation.warn(
|
10
|
+
"`render MyComponent, foo: :bar` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
11
|
+
)
|
12
|
+
|
13
|
+
options.new(args).render_in(self, &block)
|
14
|
+
elsif options.is_a?(Hash) && options.has_key?(:component) && options[:component] < ActionView::Component::Base
|
15
|
+
ActiveSupport::Deprecation.warn(
|
16
|
+
"`render component: MyComponent, locals: { foo: :bar }` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
17
|
+
)
|
18
|
+
|
19
|
+
options[:component].new(options[:locals]).render_in(self, &block)
|
20
|
+
elsif options.respond_to?(:to_component_class) && !options.to_component_class.nil? && options.to_component_class < ActionView::Component::Base
|
21
|
+
ActiveSupport::Deprecation.warn(
|
22
|
+
"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."
|
23
|
+
)
|
24
|
+
|
25
|
+
options.to_component_class.new(options).render_in(self, &block)
|
26
|
+
else
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewComponent
|
4
|
+
module RenderingMonkeyPatch # :nodoc:
|
5
|
+
def render(options = {}, args = {})
|
6
|
+
if options.respond_to?(:render_in)
|
7
|
+
self.response_body = options.render_in(self.view_context)
|
8
|
+
else
|
9
|
+
super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "capybara/minitest"
|
4
|
+
|
5
|
+
module ViewComponent
|
6
|
+
module TestHelpers
|
7
|
+
include Capybara::Minitest::Assertions
|
8
|
+
|
9
|
+
def page
|
10
|
+
Capybara::Node::Simple.new(@raw)
|
11
|
+
end
|
12
|
+
|
13
|
+
def render_inline(component, **args, &block)
|
14
|
+
@raw = controller.view_context.render(component, args, &block)
|
15
|
+
|
16
|
+
Nokogiri::HTML.fragment(@raw)
|
17
|
+
end
|
18
|
+
|
19
|
+
def controller
|
20
|
+
@controller ||= Base.test_controller.constantize.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
|
21
|
+
end
|
22
|
+
|
23
|
+
def request
|
24
|
+
@request ||= ActionDispatch::TestRequest.create
|
25
|
+
end
|
26
|
+
|
27
|
+
def render_component(component, **args, &block)
|
28
|
+
ActiveSupport::Deprecation.warn(
|
29
|
+
"`render_component` has been deprecated in favor of `render_inline`, and will be removed in v2.0.0."
|
30
|
+
)
|
31
|
+
|
32
|
+
render_inline(component, args, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def with_variant(variant)
|
36
|
+
old_variants = controller.view_context.lookup_context.variants
|
37
|
+
|
38
|
+
controller.view_context.lookup_context.variants = variant
|
39
|
+
yield
|
40
|
+
controller.view_context.lookup_context.variants = old_variants
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/script/console
CHANGED
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.
|
4
|
+
version: 1.14.0
|
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-03-
|
11
|
+
date: 2020-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -160,17 +160,9 @@ files:
|
|
160
160
|
- app/controllers/rails/components_controller.rb
|
161
161
|
- lib/action_view/component.rb
|
162
162
|
- lib/action_view/component/base.rb
|
163
|
-
- lib/action_view/component/conversion.rb
|
164
|
-
- lib/action_view/component/engine.rb
|
165
163
|
- lib/action_view/component/preview.rb
|
166
|
-
- lib/action_view/component/previewable.rb
|
167
164
|
- lib/action_view/component/railtie.rb
|
168
|
-
- lib/action_view/component/render_monkey_patch.rb
|
169
|
-
- lib/action_view/component/rendering_monkey_patch.rb
|
170
|
-
- lib/action_view/component/template_error.rb
|
171
165
|
- lib/action_view/component/test_case.rb
|
172
|
-
- lib/action_view/component/test_helpers.rb
|
173
|
-
- lib/action_view/component/version.rb
|
174
166
|
- lib/rails/generators/component/USAGE
|
175
167
|
- lib/rails/generators/component/component_generator.rb
|
176
168
|
- lib/rails/generators/component/templates/component.rb.tt
|
@@ -188,6 +180,18 @@ files:
|
|
188
180
|
- lib/railties/lib/rails/templates/rails/components/index.html.erb
|
189
181
|
- lib/railties/lib/rails/templates/rails/components/preview.html.erb
|
190
182
|
- lib/railties/lib/rails/templates/rails/components/previews.html.erb
|
183
|
+
- lib/view_component.rb
|
184
|
+
- lib/view_component/base.rb
|
185
|
+
- lib/view_component/conversion.rb
|
186
|
+
- lib/view_component/engine.rb
|
187
|
+
- lib/view_component/preview.rb
|
188
|
+
- lib/view_component/previewable.rb
|
189
|
+
- lib/view_component/render_monkey_patch.rb
|
190
|
+
- lib/view_component/rendering_monkey_patch.rb
|
191
|
+
- lib/view_component/template_error.rb
|
192
|
+
- lib/view_component/test_case.rb
|
193
|
+
- lib/view_component/test_helpers.rb
|
194
|
+
- lib/view_component/version.rb
|
191
195
|
- script/bootstrap
|
192
196
|
- script/console
|
193
197
|
- script/install
|
@@ -1,67 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rails"
|
4
|
-
require "action_view/component"
|
5
|
-
|
6
|
-
module ActionView
|
7
|
-
module Component
|
8
|
-
class Engine < Rails::Engine # :nodoc:
|
9
|
-
config.action_view_component = ActiveSupport::OrderedOptions.new
|
10
|
-
|
11
|
-
initializer "action_view_component.set_configs" do |app|
|
12
|
-
options = app.config.action_view_component
|
13
|
-
|
14
|
-
options.show_previews = Rails.env.development? if options.show_previews.nil?
|
15
|
-
|
16
|
-
if options.show_previews
|
17
|
-
options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/components/previews" : nil
|
18
|
-
end
|
19
|
-
|
20
|
-
ActiveSupport.on_load(:action_view_component) do
|
21
|
-
options.each { |k, v| send("#{k}=", v) }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
initializer "action_view_component.set_autoload_paths" do |app|
|
26
|
-
options = app.config.action_view_component
|
27
|
-
|
28
|
-
if options.show_previews && options.preview_path
|
29
|
-
ActiveSupport::Dependencies.autoload_paths << options.preview_path
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
initializer "action_view_component.eager_load_actions" do
|
34
|
-
ActiveSupport.on_load(:after_initialize) do
|
35
|
-
ActionView::Component::Base.descendants.each(&:compile)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
initializer "action_view_component.compile_config_methods" do
|
40
|
-
ActiveSupport.on_load(:action_view_component) do
|
41
|
-
config.compile_methods! if config.respond_to?(:compile_methods!)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
initializer "action_view_component.monkey_patch_render" do
|
46
|
-
ActiveSupport.on_load(:action_view) do
|
47
|
-
ActionView::Base.prepend ActionView::Component::RenderMonkeyPatch
|
48
|
-
end
|
49
|
-
|
50
|
-
ActiveSupport.on_load(:action_controller) do
|
51
|
-
ActionController::Base.prepend ActionView::Component::RenderingMonkeyPatch
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
config.after_initialize do |app|
|
56
|
-
options = app.config.action_view_component
|
57
|
-
|
58
|
-
if options.show_previews
|
59
|
-
app.routes.prepend do
|
60
|
-
get "/rails/components" => "rails/components#index", :internal => true
|
61
|
-
get "/rails/components/*path" => "rails/components#previews", :internal => true
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,27 +0,0 @@
|
|
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,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Monkey patch ActionView::Base#render to support ActionView::Component
|
4
|
-
module ActionView
|
5
|
-
module Component
|
6
|
-
module RenderMonkeyPatch # :nodoc:
|
7
|
-
def render(options = {}, args = {}, &block)
|
8
|
-
if options.respond_to?(:render_in)
|
9
|
-
options.render_in(self, &block)
|
10
|
-
elsif options.is_a?(Class) && options < ActionView::Component::Base
|
11
|
-
ActiveSupport::Deprecation.warn(
|
12
|
-
"`render MyComponent, foo: :bar` has been deprecated and will be removed in v2.0.0. Use `render MyComponent.new(foo: :bar)` instead."
|
13
|
-
)
|
14
|
-
|
15
|
-
options.new(args).render_in(self, &block)
|
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
|
-
|
21
|
-
options[:component].new(options[:locals]).render_in(self, &block)
|
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
|
-
|
27
|
-
options.to_component_class.new(options).render_in(self, &block)
|
28
|
-
else
|
29
|
-
super
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActionView
|
4
|
-
module Component
|
5
|
-
module RenderingMonkeyPatch # :nodoc:
|
6
|
-
def render(options = {}, args = {})
|
7
|
-
if options.respond_to?(:render_in)
|
8
|
-
self.response_body = options.render_in(self.view_context)
|
9
|
-
else
|
10
|
-
super
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|