Skip to content

Commit e0f4c00

Browse files
Introduce suspenders:install:web generator and application template
Create generator to invoke all necessary generators. We add it to the `install` namespace to provide flexibility should we add other installation options, such as ones for API Only applications. Introduces [template][] as a means to invoke `suspenders:install:web` when creating a new application. This serves as an alternative to the system executable that was removed. We call `db:prepare` in the template to ensure `bin/setup` works as expected. This is because we overrode that file to use `dev:prime`, which assume the database has been created. [template]: https://guides.rubyonrails.org/rails_application_templates.html
1 parent c694b2a commit e0f4c00

File tree

5 files changed

+153
-1
lines changed

5 files changed

+153
-1
lines changed

NEWS.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Unreleased
2121
* Introduce `suspenders:environments:production` generator
2222
* Introduce `suspenders:environments:test` generator
2323
* Introduce `suspenders:environments:development` generator
24+
* Introduce `suspenders:install:web` generator
2425

2526
20230113.0 (January, 13, 2023)
2627

README.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,24 @@ if you like missing deadlines.
99

1010
## Usage
1111

12+
### Existing Rails Applications
13+
1214
```
1315
group :development, :test do
1416
gem "suspenders"
1517
end
1618
```
1719

1820
```
19-
bin/rails g suspenders:all
21+
bin/rails g suspenders:install:web
22+
```
23+
24+
### New Rails Applications
25+
26+
```
27+
rails new my_app \
28+
-d=postgresql \
29+
-m=https://raw.githubusercontent.com/thoughtbot/suspenders/lib/install/web.rb
2030
```
2131

2232
## Generators
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
module Suspenders
2+
module Generators
3+
module Install
4+
class WebGenerator < Rails::Generators::Base
5+
include Suspenders::Generators::APIAppUnsupported
6+
include Suspenders::Generators::DatabaseUnsupported
7+
8+
desc <<~MARKDOWN
9+
Invokes all necessary generators for new Rails applications generated with Suspenders.
10+
11+
This generatator is intended to be invoked as part of an [application template][].
12+
13+
```
14+
rails new suspenders_qa \
15+
--skip-test \
16+
-d=postgresql \
17+
-m=https://raw.githubusercontent.com/thoughtbot/suspenders/main/lib/install/web.rb
18+
```
19+
20+
[application template]: https://guides.rubyonrails.org/rails_application_templates.html
21+
MARKDOWN
22+
23+
def invoke_generators
24+
# This needs to go first, since it configures `.node-version`
25+
generate "suspenders:prerequisites"
26+
27+
generate "suspenders:accessibility"
28+
generate "suspenders:advisories"
29+
generate "suspenders:email"
30+
generate "suspenders:factories"
31+
generate "suspenders:inline_svg"
32+
generate "suspenders:lint"
33+
generate "suspenders:rake"
34+
generate "suspenders:setup"
35+
generate "suspenders:tasks"
36+
generate "suspenders:testing"
37+
generate "suspenders:views"
38+
39+
# suspenders:jobs needs to be invoked before suspenders:styles, since
40+
# suspenders:styles generator creates Procfile.dev
41+
generate "suspenders:styles"
42+
generate "suspenders:jobs"
43+
44+
# Needs to run after other generators, since some touch the
45+
# configuration files.
46+
generate "suspenders:environments:test"
47+
generate "suspenders:environments:development"
48+
generate "suspenders:environments:production"
49+
50+
# Needs to be run last since it depends on lint, testing, and
51+
# advisories
52+
generate "suspenders:ci"
53+
end
54+
55+
def cleanup
56+
rake "suspenders:cleanup:organize_gemfile"
57+
rake "suspenders:cleanup:generate_readme"
58+
end
59+
60+
def lint
61+
run "yarn run fix:prettier"
62+
run "bundle exec rake standard:fix_unsafely"
63+
end
64+
end
65+
end
66+
end
67+
end

lib/install/web.rb

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
def apply_template!
2+
if options[:database] == "postgresql" && options[:skip_test]
3+
after_bundle do
4+
gem_group :development, :test do
5+
gem "suspenders", github: "thoughtbot/suspenders", branch: "suspenders-3-0-0-web-generator"
6+
end
7+
8+
run "bundle install"
9+
10+
generate "suspenders:install:web"
11+
rails_command "db:prepare"
12+
13+
say "\nCongratulations! You just pulled our suspenders."
14+
end
15+
else
16+
message = <<~ERROR
17+
18+
19+
=== Please use the correct options ===
20+
21+
rails new <app_name> \\
22+
--skip-test \\
23+
-d=postgresql \\
24+
-m=https://raw.githubusercontent.com/thoughtbot/suspenders/main/lib/install/web.rb
25+
ERROR
26+
27+
fail Rails::Generators::Error, message
28+
end
29+
end
30+
31+
apply_template!
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
require "test_helper"
2+
require "generators/suspenders/install/web_generator"
3+
4+
module Suspenders
5+
module Generators
6+
module Install
7+
class WebGeneratorTest < Rails::Generators::TestCase
8+
include Suspenders::TestHelpers
9+
10+
tests Suspenders::Generators::Install::WebGenerator
11+
destination Rails.root
12+
setup :prepare_destination
13+
teardown :restore_destination
14+
15+
test "raises if API only application" do
16+
within_api_only_app do
17+
assert_raises Suspenders::Generators::APIAppUnsupported::Error do
18+
run_generator
19+
end
20+
end
21+
end
22+
23+
test "raises if PostgreSQL is not the adapter" do
24+
with_database "unsupported" do
25+
assert_raises Suspenders::Generators::DatabaseUnsupported::Error do
26+
run_generator
27+
end
28+
end
29+
end
30+
31+
private
32+
33+
def prepare_destination
34+
touch "Gemfile"
35+
end
36+
37+
def restore_destination
38+
remove_file_if_exists "Gemfile"
39+
end
40+
end
41+
end
42+
end
43+
end

0 commit comments

Comments
 (0)