Skip to content

Commit bf8b814

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 f6c6f45 commit bf8b814

File tree

5 files changed

+131
-1
lines changed

5 files changed

+131
-1
lines changed

NEWS.md

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Unreleased
1818
* Introduce `suspenders:prerequisites` generator
1919
* Introduce `suspenders:ci` generator
2020
* Introduce `suspenders:cleanup:organize_gemfile` task
21+
* Introduce `suspenders:install:web` generator
2122

2223
20230113.0 (January, 13, 2023)
2324

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,45 @@
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+
def invoke_generators
9+
# This needs to go first, since it configures `.node-version`
10+
generate "suspenders:prerequisites"
11+
12+
generate "suspenders:accessibility"
13+
generate "suspenders:advisories"
14+
generate "suspenders:email"
15+
generate "suspenders:factories"
16+
generate "suspenders:inline_svg"
17+
generate "suspenders:lint"
18+
generate "suspenders:rake"
19+
generate "suspenders:setup"
20+
generate "suspenders:tasks"
21+
generate "suspenders:testing"
22+
generate "suspenders:views"
23+
24+
# jobs needs to be invoked before styles, since the syles generator
25+
# creates Procfile.dev
26+
generate "suspenders:styles"
27+
generate "suspenders:jobs"
28+
29+
# Needs to be run last since it depends on lint, testing, and
30+
# advisories
31+
generate "suspenders:ci"
32+
end
33+
34+
def cleanup
35+
rake "suspenders:cleanup:organize_gemfile"
36+
end
37+
38+
def lint
39+
run "yarn run fix:prettier"
40+
run "bundle exec rake standard:fix_unsafely"
41+
end
42+
end
43+
end
44+
end
45+
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/suspenders-3-0-0-web-generator/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)