Skip to content

Commit c14c681

Browse files
authored
Merge pull request #314 from rails/164-flavorjones-override-erb-templates
Allow users to override scaffold generator templates
2 parents 17f18a5 + 85c2c4a commit c14c681

File tree

8 files changed

+114
-15
lines changed

8 files changed

+114
-15
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Update to [Tailwind CSS v3.4.1](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.1) from v3.4.0 by @flavorjones
44
* Fix `password` form field styling in generated scaffold forms. (#304, #307) @flavorjones
55
* Fix namespaced mailer generation. (#272, #308) @flavorjones
6+
* Allow overriding the generator templates by placing application templates in either `lib/templates/tailwindcss/{scaffold,mailer,controller}` or `lib/templates/erb/{scaffold,mailer,controller}`. (#164, #314) @flavorjones
67

78

89
## v2.2.0 / 2023-01-04

Diff for: lib/generators/tailwindcss/controller/controller_generator.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
module Tailwindcss
44
module Generators
55
class ControllerGenerator < Erb::Generators::ControllerGenerator
6-
source_root File.expand_path("../templates", __FILE__)
6+
source_root File.expand_path("templates", __dir__)
7+
source_paths << "lib/templates/erb/controller"
78
end
89
end
910
end

Diff for: lib/generators/tailwindcss/mailer/mailer_generator.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
module Tailwindcss
44
module Generators
55
class MailerGenerator < Erb::Generators::MailerGenerator
6-
source_root File.expand_path("../templates", __FILE__)
6+
source_root File.expand_path("templates", __dir__)
7+
source_paths << "lib/templates/erb/mailer"
78
end
89
end
910
end

Diff for: lib/generators/tailwindcss/scaffold/scaffold_generator.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ module Generators
66
class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
77
include Rails::Generators::ResourceHelpers
88

9-
source_root File.expand_path("../templates", __FILE__)
9+
source_root File.expand_path("templates", __dir__)
10+
source_paths << "lib/templates/erb/scaffold"
1011

1112
argument :attributes, type: :array, default: [], banner: "field:type field:type"
1213

Diff for: test/lib/generators/tailwindcss/controller_generator_test.rb

+35-4
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,45 @@
33

44
class Tailwindcss::Generators::ControllerGeneratorTest < Rails::Generators::TestCase
55
tests Tailwindcss::Generators::ControllerGenerator
6-
destination Dir.mktmpdir
6+
destination TAILWINDCSS_TEST_APP_ROOT
77

88
arguments %w(Messages index show)
99

1010
test "generates correct view templates" do
1111
run_generator
12-
assert_file "app/views/messages/index.html.erb"
13-
assert_file "app/views/messages/show.html.erb"
12+
13+
["index", "show"].each do |view|
14+
assert_file "app/views/messages/#{view}.html.erb"
15+
end
16+
end
17+
18+
test "generates correct view templates when namespaced" do
19+
run_generator ["admin/messages", "index", "show"]
20+
21+
["index", "show"].each do |view|
22+
assert_file "app/views/admin/messages/#{view}.html.erb"
23+
end
1424
end
15-
end
1625

26+
[
27+
"lib/templates/erb/controller",
28+
"lib/templates/tailwindcss/controller",
29+
].each do |templates_path|
30+
test "overriding generator templates in #{templates_path}" do
31+
override_dir = File.join(destination_root, templates_path)
32+
FileUtils.mkdir_p override_dir
33+
File.open(File.join(override_dir, "view.html.erb"), "w") { |f| f.puts "This is a custom template" }
34+
35+
# change directory because the generator adds a relative path to source_paths
36+
Dir.chdir(destination_root) do
37+
run_generator
38+
end
39+
40+
["index", "show"].each do |view|
41+
assert_file "app/views/messages/#{view}.html.erb" do |body|
42+
assert_match("This is a custom template", body, "index custom template should be used")
43+
end
44+
end
45+
end
46+
end
47+
end

Diff for: test/lib/generators/tailwindcss/mailer_generator_test.rb

+26-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase
66
tests Tailwindcss::Generators::MailerGenerator
7-
destination Dir.mktmpdir
7+
destination TAILWINDCSS_TEST_APP_ROOT
88

99
arguments %w(Notifications invoice)
1010

@@ -51,5 +51,29 @@ class Tailwindcss::Generators::MailerGeneratorTest < Rails::Generators::TestCase
5151
assert_match("<%= yield %>", view)
5252
end
5353
end
54-
end
5554

55+
[
56+
"lib/templates/erb/mailer",
57+
"lib/templates/tailwindcss/mailer",
58+
].each do |templates_path|
59+
test "overriding generator templates in #{templates_path}" do
60+
override_dir = File.join(destination_root, templates_path)
61+
FileUtils.mkdir_p override_dir
62+
File.open(File.join(override_dir, "view.html.erb"), "w") { |f| f.puts "This is a custom template" }
63+
File.open(File.join(override_dir, "layout.html.erb"), "w") { |f| f.puts "This is a custom layout" }
64+
65+
# change directory because the generator adds a relative path to source_paths
66+
Dir.chdir(destination_root) do
67+
run_generator
68+
end
69+
70+
assert_file "app/views/notifications_mailer/invoice.html.erb" do |view|
71+
assert_match("This is a custom template", view)
72+
end
73+
74+
assert_file "app/views/layouts/mailer.html.erb" do |view|
75+
assert_match("This is a custom layout", view)
76+
end
77+
end
78+
end
79+
end

Diff for: test/lib/generators/tailwindcss/scaffold_generator_test.rb

+33-5
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,47 @@
33

44
class Tailwindcss::Generators::ScaffoldGeneratorTest < Rails::Generators::TestCase
55
tests Tailwindcss::Generators::ScaffoldGenerator
6-
destination Dir.mktmpdir
6+
destination TAILWINDCSS_TEST_APP_ROOT
77

88
arguments %w(message title:string content:text)
99

10-
test "generates correct view templates" do
10+
test "generates view templates" do
1111
run_generator
1212

13-
%w(index edit new show _form _message).each { |view| assert_file "app/views/messages/#{view}.html.erb" }
13+
%w(index edit new show _form _message).each do |view|
14+
assert_file "app/views/messages/#{view}.html.erb"
15+
end
1416
end
1517

16-
test "with namespace invoked" do
18+
test "generates view templates with namespace" do
1719
run_generator [ "admin/role", "name:string", "description:string" ]
1820

19-
%w(index edit new show _form _role).each { |view| assert_file "app/views/admin/roles/#{view}.html.erb" }
21+
%w(index edit new show _form _role).each do |view|
22+
assert_file "app/views/admin/roles/#{view}.html.erb"
23+
end
24+
end
25+
26+
[
27+
"lib/templates/tailwindcss/scaffold",
28+
"lib/templates/erb/scaffold",
29+
].each do |templates_path|
30+
test "overriding generator templates in #{templates_path}" do
31+
override_dir = File.join(destination_root, templates_path)
32+
FileUtils.mkdir_p override_dir
33+
File.open(File.join(override_dir, "index.html.erb"), "w") { |f| f.puts "This is a custom template" }
34+
35+
# change directory because the generator adds a relative path to source_paths
36+
Dir.chdir(destination_root) do
37+
run_generator
38+
end
39+
40+
%w(edit new show _form _message).each do |view|
41+
assert_file "app/views/messages/#{view}.html.erb"
42+
end
43+
44+
assert_file "app/views/messages/index.html.erb" do |body|
45+
assert_match("This is a custom template", body, "index custom template should be used")
46+
end
47+
end
2048
end
2149
end

Diff for: test/test_helper.rb

+13-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,22 @@
44
require "rails"
55
require "rails/test_help"
66
require "debug"
7-
require_relative "../lib/tailwindcss-rails"
87

98
require "rails/test_unit/reporter"
109
Rails::TestUnitReporter.executable = "bin/test"
1110

11+
TAILWINDCSS_TEST_APP_ROOT = Dir.mktmpdir
12+
Rails::Generators.templates_path << File.join(TAILWINDCSS_TEST_APP_ROOT, "lib/templates")
13+
1214
class ActiveSupport::TestCase
15+
def setup
16+
FileUtils.rm_rf(TAILWINDCSS_TEST_APP_ROOT)
17+
FileUtils.mkdir_p(TAILWINDCSS_TEST_APP_ROOT)
18+
end
19+
20+
def teardown
21+
FileUtils.rm_rf(TAILWINDCSS_TEST_APP_ROOT)
22+
end
1323
end
24+
25+
require_relative "../lib/tailwindcss-rails"

0 commit comments

Comments
 (0)