Skip to content

Commit 392a8fc

Browse files
Add support for explicit preview_path when generating component (#1598)
* Add support for explicit preview_path when generating component * Update docs/CHANGELOG.md Co-authored-by: Joel Hawksley <[email protected]> Co-authored-by: Joel Hawksley <[email protected]>
1 parent 93a67c3 commit 392a8fc

File tree

5 files changed

+54
-4
lines changed

5 files changed

+54
-4
lines changed

docs/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ nav_order: 5
1010

1111
## main
1212

13+
* Add ability to pass explicit `preview_path` to preview generator.
14+
15+
*Erinna Chen*
16+
1317
* Add `with_rendered_component_path` helper for writing component system tests.
1418

1519
*Edwin Mak*

lib/rails/generators/preview/component_generator.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,22 @@ module Preview
44
module Generators
55
class ComponentGenerator < ::Rails::Generators::NamedBase
66
source_root File.expand_path("templates", __dir__)
7+
class_option :preview_path, type: :string, desc: "Path for previews, required when multiple preview paths are configured", default: ViewComponent::Base.config.generate.preview_path
78

89
argument :attributes, type: :array, default: [], banner: "attribute"
910
check_class_collision suffix: "ComponentPreview"
1011

1112
def create_preview_file
1213
preview_paths = ViewComponent::Base.config.preview_paths
13-
return if preview_paths.count > 1
14+
optional_path = options[:preview_path]
15+
return if preview_paths.count > 1 && optional_path.blank?
16+
17+
path_prefix = if optional_path.present?
18+
optional_path
19+
else
20+
preview_paths.one? ? preview_paths.first : "test/components/previews"
21+
end
1422

15-
path_prefix = preview_paths.one? ? preview_paths.first : "test/components/previews"
1623
template "component_preview.rb", File.join(path_prefix, class_path, "#{file_name}_component_preview.rb")
1724
end
1825

lib/view_component/config.rb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class << self
1212

1313
def defaults
1414
ActiveSupport::OrderedOptions.new.merge!({
15-
generate: ActiveSupport::OrderedOptions.new(false),
15+
generate: default_generate_options,
1616
preview_controller: "ViewComponentsController",
1717
preview_route: "/rails/view_components",
1818
show_previews_source: false,
@@ -66,6 +66,17 @@ def defaults
6666
# Always generate a preview alongside the component:
6767
#
6868
# config.view_component.generate.preview = true
69+
#
70+
# #### #preview_path
71+
#
72+
# Path to generate preview:
73+
#
74+
# config.view_component.generate.preview_path = "test/components/previews"
75+
#
76+
# Required when there is more than one path defined in preview_paths.
77+
# Defaults to `""`. If this is blank, the generator will use
78+
# `ViewComponent.config.preview_paths` if defined,
79+
# `"test/components/previews"` otherwise
6980

7081
# @!attribute preview_controller
7182
# @return [String]
@@ -135,6 +146,12 @@ def default_preview_paths
135146

136147
["#{Rails.root}/test/components/previews"]
137148
end
149+
150+
def default_generate_options
151+
options = ActiveSupport::OrderedOptions.new(false)
152+
options.preview_path = ""
153+
options
154+
end
138155
end
139156

140157
def initialize

test/sandbox/test/config_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def setup
99
end
1010

1111
def test_defaults_are_correct
12-
assert_equal @config.generate, {}
12+
assert_equal @config.generate, {preview_path: ""}
1313
assert_equal @config.preview_controller, "ViewComponentsController"
1414
assert_equal @config.preview_route, "/rails/view_components"
1515
assert_equal @config.show_previews_source, false

test/sandbox/test/generators/preview_generator_test.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ def test_component_preview
2121
end
2222
end
2323

24+
def test_component_preview_with_preview_path_option
25+
with_preview_paths([]) do
26+
run_generator %w[user --preview --preview-path other/test/components/previews]
27+
28+
assert_file "other/test/components/previews/user_component_preview.rb" do |component|
29+
assert_match(/class UserComponentPreview < /, component)
30+
assert_match(/render\(UserComponent.new\)/, component)
31+
end
32+
end
33+
end
34+
2435
def test_component_preview_with_one_overridden_preview_path
2536
with_preview_paths(%w[spec/components/previews]) do
2637
run_generator %w[user --preview]
@@ -42,6 +53,17 @@ def test_component_preview_with_two_overridden_preview_paths
4253
end
4354
end
4455

56+
def test_component_preview_with_two_overridden_preview_paths_and_preview_path_option
57+
with_preview_paths(%w[spec/components/previews some/other/directory]) do
58+
run_generator %w[user --preview --preview-path other/test/components/previews]
59+
60+
assert_file "other/test/components/previews/user_component_preview.rb" do |component|
61+
assert_match(/class UserComponentPreview < /, component)
62+
assert_match(/render\(UserComponent.new\)/, component)
63+
end
64+
end
65+
end
66+
4567
def test_component_preview_with_namespace
4668
with_preview_paths([]) do
4769
run_generator %w[admins/user --preview]

0 commit comments

Comments
 (0)