suspenders 1.53.0 → 1.54.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +4 -3
- data/CONTRIBUTING.md +15 -15
- data/GOALS.md +65 -0
- data/NEWS.md +29 -0
- data/README.md +2 -4
- data/docs/heroku_deploy.md +2 -5
- data/lib/suspenders.rb +6 -0
- data/lib/suspenders/actions.rb +2 -2
- data/lib/suspenders/adapters/heroku.rb +14 -1
- data/lib/suspenders/app_builder.rb +3 -71
- data/lib/suspenders/generators/advisories_generator.rb +19 -0
- data/lib/suspenders/generators/app_generator.rb +7 -33
- data/lib/suspenders/generators/base.rb +39 -0
- data/lib/suspenders/generators/ci_generator.rb +19 -9
- data/lib/suspenders/generators/db_optimizations_generator.rb +3 -15
- data/lib/suspenders/generators/js_driver_generator.rb +1 -2
- data/lib/suspenders/generators/preloader_generator.rb +122 -0
- data/lib/suspenders/generators/production/compression_generator.rb +14 -0
- data/lib/suspenders/generators/production/deployment_generator.rb +1 -12
- data/lib/suspenders/generators/production/email_generator.rb +5 -8
- data/lib/suspenders/generators/production/manifest_generator.rb +1 -0
- data/lib/suspenders/generators/production/single_redirect.rb +15 -0
- data/lib/suspenders/generators/production/timeout_generator.rb +1 -0
- data/lib/suspenders/generators/profiler_generator.rb +35 -0
- data/lib/suspenders/generators/runner_generator.rb +48 -0
- data/lib/suspenders/generators/staging/pull_requests_generator.rb +2 -10
- data/lib/suspenders/generators/static_generator.rb +4 -0
- data/lib/suspenders/generators/stylesheet_base_generator.rb +5 -6
- data/lib/suspenders/generators/testing_generator.rb +0 -11
- data/lib/suspenders/version.rb +1 -1
- data/spec/adapters/heroku_spec.rb +28 -2
- data/spec/expand_json_spec.rb +89 -0
- data/spec/features/advisories_spec.rb +24 -0
- data/spec/features/ci_spec.rb +31 -0
- data/spec/features/db_optimizations_spec.rb +19 -0
- data/spec/features/heroku_spec.rb +6 -13
- data/spec/features/new_project_spec.rb +5 -27
- data/spec/features/preloader_spec.rb +25 -0
- data/spec/features/production/compression_spec.rb +23 -0
- data/spec/features/production/manifest_spec.rb +2 -0
- data/spec/features/production/single_redirect_spec.rb +25 -0
- data/spec/features/profiler_spec.rb +20 -0
- data/spec/features/runner_spec.rb +30 -0
- data/spec/features/static_spec.rb +17 -0
- data/spec/support/contain_json_matcher.rb +16 -10
- data/spec/support/project_files.rb +12 -0
- data/spec/support/rails_template.rb +1 -0
- data/spec/support/suspenders.rb +16 -13
- data/suspenders.gemspec +1 -2
- data/templates/Gemfile.erb +1 -6
- data/templates/application.scss +0 -1
- data/templates/bin_auto_migrate +5 -0
- data/templates/bin_deploy +0 -2
- data/templates/bin_setup +2 -2
- data/templates/bin_setup_review_app.erb +0 -1
- data/templates/chromedriver.rb +10 -0
- data/templates/descriptions/advisories.md +5 -0
- data/templates/descriptions/analytics.md +4 -0
- data/templates/descriptions/ci.md +4 -0
- data/templates/descriptions/compression.md +4 -0
- data/templates/descriptions/db_optimizations.md +2 -0
- data/templates/descriptions/deployment.md +5 -0
- data/templates/descriptions/email.md +9 -0
- data/templates/descriptions/factories.md +12 -0
- data/templates/descriptions/force_tls.md +1 -0
- data/templates/descriptions/forms.md +1 -0
- data/templates/descriptions/inline_svg.md +2 -0
- data/templates/descriptions/jobs.md +3 -0
- data/templates/descriptions/js_driver.md +4 -0
- data/templates/descriptions/json.md +1 -0
- data/templates/descriptions/lint.md +3 -0
- data/templates/descriptions/manifest.md +2 -0
- data/templates/descriptions/preloader.md +3 -0
- data/templates/descriptions/profiler.md +7 -0
- data/templates/descriptions/pull_requests.md +4 -0
- data/templates/descriptions/runner.md +10 -0
- data/templates/descriptions/single_redirect.md +1 -0
- data/templates/descriptions/static.md +5 -0
- data/templates/descriptions/stylelint.md +3 -0
- data/templates/descriptions/stylesheet_base.md +4 -0
- data/templates/descriptions/testing.md +9 -0
- data/templates/descriptions/timeout.md +4 -0
- data/templates/descriptions/views.md +8 -0
- data/templates/partials/ci_simplecov.rb +16 -0
- data/templates/partials/db_optimizations_configuration.rb +7 -0
- data/templates/partials/deployment_readme.md +8 -0
- data/templates/partials/email_smtp.rb +3 -0
- data/templates/partials/profiler_readme.md +8 -0
- data/templates/partials/pull_requests_config.rb +5 -0
- data/templates/partials/runner_readme.md +31 -0
- data/templates/partials/runner_setup.rb +3 -0
- data/templates/rack_mini_profiler.rb +2 -0
- data/templates/rails_helper.rb +4 -1
- data/templates/{dotfiles/.env → sample_env} +0 -1
- data/templates/spec_helper.rb +4 -7
- data/templates/spring.rb +6 -0
- data/templates/suspenders_gitignore +1 -1
- metadata +75 -25
- data/templates/dotfiles/.ctags +0 -2
- data/templates/puma.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2389cebef8ac193b9632f09376e8dd6d736a523335da8bf23a26e746fc0c208a
|
4
|
+
data.tar.gz: d2f55bd0ed92869ab361f6316c7a4da22f4dc09ace0d08a8116b8cde9cfe10fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41478b2123c847c22ce82024138a86d699985d5cb749c59caac67f5777919d05ad97f8eaca0d5054dd48afd69b3325946138102475113ec5a38c6bb7d1385220
|
7
|
+
data.tar.gz: f0f6c6f77792d2857cd47e6a004f7815a994cac4015819bc14297978e2d33992c4bd68b0a20f12f83c1fb8204038da3f13ac5abfe5cbc1f5be94b24a39729499
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.6
|
data/.travis.yml
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
language: ruby
|
2
|
-
rvm: 2.6.
|
2
|
+
rvm: 2.6.6
|
3
3
|
cache: bundler
|
4
|
-
sudo: false
|
5
4
|
before_install:
|
5
|
+
- nvm install 13.12.0
|
6
6
|
- git config --global user.name 'Travis CI'
|
7
7
|
- git config --global user.email 'travis-ci@example.com'
|
8
8
|
- gem update --system
|
9
|
-
- gem install bundler
|
9
|
+
- gem install bundler
|
10
|
+
- bundler config --global disable_platform_warnings true
|
10
11
|
install: bundle install
|
11
12
|
notifications:
|
12
13
|
email: false
|
data/CONTRIBUTING.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Contributing
|
2
2
|
|
3
|
-
We love pull requests from everyone. By participating in this project, you
|
4
|
-
to abide by the thoughtbot [code of conduct].
|
3
|
+
We love pull requests from everyone. By participating in this project, you
|
4
|
+
agree to abide by the thoughtbot [code of conduct].
|
5
5
|
|
6
6
|
[code of conduct]: https://thoughtbot.com/open-source-code-of-conduct
|
7
7
|
|
@@ -17,17 +17,15 @@ Make sure the tests pass:
|
|
17
17
|
|
18
18
|
rake
|
19
19
|
|
20
|
-
Make your change.
|
21
|
-
|
22
|
-
Follow our [style guide][style].
|
23
|
-
Make the tests pass:
|
20
|
+
Make your change. Write tests. Follow our [style guide][style]. Make the tests
|
21
|
+
pass:
|
24
22
|
|
25
23
|
[style]: https://github.com/thoughtbot/guides/tree/master/style
|
26
24
|
|
27
25
|
rake
|
28
26
|
|
29
|
-
Mention how your changes affect the project to other developers and users in
|
30
|
-
`NEWS.md` file.
|
27
|
+
Mention how your changes affect the project to other developers and users in
|
28
|
+
the `NEWS.md` file.
|
31
29
|
|
32
30
|
Write a [good commit message][commit].
|
33
31
|
Push to your fork.
|
@@ -36,19 +34,21 @@ Push to your fork.
|
|
36
34
|
[commit]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
37
35
|
[pr]: https://github.com/thoughtbot/suspenders/compare/
|
38
36
|
|
39
|
-
If [Hound] catches style violations,
|
40
|
-
fix them.
|
37
|
+
If [Hound] catches style violations, fix them.
|
41
38
|
|
42
39
|
[hound]: https://houndci.com
|
43
40
|
|
44
|
-
Wait for us.
|
45
|
-
We
|
46
|
-
|
41
|
+
Wait for us. We try to at least comment on pull requests within one business
|
42
|
+
day. We may suggest changes.
|
43
|
+
|
44
|
+
## Generators
|
45
|
+
|
46
|
+
All new contributions must be within the generator framework, as described in
|
47
|
+
[our goals](GOALS.md).
|
47
48
|
|
48
49
|
## Versions
|
49
50
|
|
50
|
-
To update the Ruby version,
|
51
|
-
change `.ruby-version` and `.travis.yml`.
|
51
|
+
To update the Ruby version, change `.ruby-version` and `.travis.yml`.
|
52
52
|
|
53
53
|
If you see this error while running tests:
|
54
54
|
|
data/GOALS.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# Goals
|
2
|
+
|
3
|
+
Suspenders is an opinionated platform for adding functionality to a Rails app.
|
4
|
+
It encodes thoughtbot's opinions and decisions in tooling and best practices.
|
5
|
+
|
6
|
+
We are transitioning to a library of generators. All new functionality must be
|
7
|
+
in the form of a well-tested, self-contained generator that fits within the
|
8
|
+
Suspenders framework.
|
9
|
+
|
10
|
+
## History and transitions
|
11
|
+
|
12
|
+
In the beginning suspenders was a git repo that we would clone then use as a
|
13
|
+
template for starting a new Rails app.
|
14
|
+
|
15
|
+
It then became a command-line tool that would generate a Rails app then modify
|
16
|
+
the files in place. Over time, and with intention, most of the modifications
|
17
|
+
were focused on modifying the Gemfile.
|
18
|
+
|
19
|
+
This was identified as unscalable and we have been slowing been moving in a new
|
20
|
+
direction: a library of generators.
|
21
|
+
|
22
|
+
## The future
|
23
|
+
|
24
|
+
The problem with a script that adds a bunch of gem requirements to the Gemfile
|
25
|
+
is: what if you don't want all those gems? Suspenders adds gem requirements and
|
26
|
+
then configures each one. On a typical project we would run Suspenders then
|
27
|
+
spend the rest of the day un-doing the parts we don't want.
|
28
|
+
|
29
|
+
In 2015, [PR #511], we discussed what we want: a gem that is a library of
|
30
|
+
generators that we can run on demand. The ideal future workflow goes like this:
|
31
|
+
|
32
|
+
[PR #511]: https://github.com/thoughtbot/suspenders/pull/511
|
33
|
+
|
34
|
+
1. `rails new my-cool-project && cd my-cool-project`
|
35
|
+
2. `echo "gem 'suspenders', group: :development" >> Gemfile && bundle`
|
36
|
+
3. `rails g suspenders:ci`
|
37
|
+
4. Repeat with other generators as needed.
|
38
|
+
|
39
|
+
In this future you would use `rails new` as normal and instead add Suspenders
|
40
|
+
as a development gem. This gives you access to opinionated generators for
|
41
|
+
adding (and removing!) whole functionality, but on demand and with your
|
42
|
+
knowledge.
|
43
|
+
|
44
|
+
The generators are all named to generically describe what functionality they
|
45
|
+
add. In this way we can change our opinions on the implementation without
|
46
|
+
needing to know new generator names. For example, `suspenders:ci` could
|
47
|
+
configure the app for CircleCI now, but down the road we may decide to switch
|
48
|
+
everything to Jenkins; we could update the implementation of the generator
|
49
|
+
without changing its name.
|
50
|
+
|
51
|
+
## From here to there
|
52
|
+
|
53
|
+
The transition looks like this:
|
54
|
+
|
55
|
+
1. Introduce a `suspenders:all` generator that runs Suspenders against an
|
56
|
+
existing Rails app.
|
57
|
+
2. Change the Suspenders program to create a Rails app, add Suspenders to the
|
58
|
+
Gemfile, and run `suspenders:all` inside of it.
|
59
|
+
3. Slowly split functionality out from the "all" generator and into smaller,
|
60
|
+
well-tested, self-contained generators. The "all" generator invokes these
|
61
|
+
generators.
|
62
|
+
4. Once that is completed -- once "all" _only_ calls other generators -- then
|
63
|
+
remove the Suspenders program and only distribute the gem.
|
64
|
+
|
65
|
+
We are on step (3), and it's a big one. Come help out!
|
data/NEWS.md
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
Unreleased
|
2
|
+
|
3
|
+
1.54.0 (June 24, 2020)
|
4
|
+
|
5
|
+
* New generator: `suspenders:single_redirect` for setting up `Rack::CanonicalHost`
|
6
|
+
* New generator: `suspenders:production:compression` for setting up `Rack::Deflater`
|
7
|
+
* New generator: `suspenders:preloader` for managing spring
|
8
|
+
* New generator: `suspenders:advisories` for installing bundler-audit
|
9
|
+
* New generator: `suspenders:profiler` for setting up rack\_mini\_profiler
|
10
|
+
* New generator: `suspenders:runner` for making an app runnable locally
|
11
|
+
* Added: generator descriptions
|
12
|
+
* Added: Heroku release phase for running database migrations
|
13
|
+
* Added: automatic buildpack configuration for Heroku
|
14
|
+
* Added: system test configuration to opt into JavaScript as needed
|
15
|
+
* Added: spring-watcher-listen gem
|
16
|
+
* Changed: from `chromedriver-helper` to `webdrivers`
|
17
|
+
* Changed: replace `heroku join` calls with `heroku apps:info` in `bin/setup`
|
18
|
+
* Changed: check environment instead of `DATABASE\_URL` in test helper
|
19
|
+
* Fixed: `ExpandJson` merging
|
20
|
+
* Fixed: spacing in the generated config file
|
21
|
+
* Upgraded: bitters to version 2.x
|
22
|
+
* Upgraded: bourbon to version 6.x
|
23
|
+
* Upgraded: Ruby to version 2.6.6
|
24
|
+
* Removed: neat gem
|
25
|
+
* Removed: ctags configuration
|
26
|
+
* Removed: custom placeholder directories
|
27
|
+
* Removed: customization for error pages
|
28
|
+
* Removed: custom Puma config
|
29
|
+
|
1
30
|
1.53.0 (August 23, 2019)
|
2
31
|
* Upgraded: Rails 6.0.
|
3
32
|
* New generator: `suspenders:inline_svg` for setting up the inline_svg gem.
|
data/README.md
CHANGED
@@ -37,8 +37,7 @@ It includes application gems like:
|
|
37
37
|
* [Delayed Job](https://github.com/collectiveidea/delayed_job) for background
|
38
38
|
processing
|
39
39
|
* [High Voltage](https://github.com/thoughtbot/high_voltage) for static pages
|
40
|
-
* [Honeybadger](https://honeybadger.io) for exception notification
|
41
|
-
* [Neat](https://github.com/thoughtbot/neat) for semantic grids
|
40
|
+
* [Honeybadger](https://www.honeybadger.io/?affiliate=A43uwl) for exception notification
|
42
41
|
* [Normalize](https://necolas.github.io/normalize.css/) for resetting browser styles
|
43
42
|
* [Oj](http://www.ohler.com/oj/)
|
44
43
|
* [Postgres](https://github.com/ged/ruby-pg) for access to the Postgres database
|
@@ -53,7 +52,6 @@ It includes application gems like:
|
|
53
52
|
* [Skylight](https://www.skylight.io/) for monitoring performance
|
54
53
|
* [Title](https://github.com/calebthompson/title) for storing titles in
|
55
54
|
translations
|
56
|
-
* [Puma](https://github.com/puma/puma) to serve HTTP requests
|
57
55
|
|
58
56
|
And development gems like:
|
59
57
|
|
@@ -225,6 +223,6 @@ See [our other projects][community].
|
|
225
223
|
We are [available for hire][hire].
|
226
224
|
|
227
225
|
[thoughtbot]: https://thoughtbot.com?utm_source=github
|
228
|
-
[thoughtbot-logo]:
|
226
|
+
[thoughtbot-logo]: https://thoughtbot.com/brand_assets/93:44.svg
|
229
227
|
[community]: https://thoughtbot.com/community?utm_source=github
|
230
228
|
[hire]: https://thoughtbot.com?utm_source=github
|
data/docs/heroku_deploy.md
CHANGED
@@ -4,11 +4,7 @@
|
|
4
4
|
|
5
5
|
Deploying to Heroku requires two additional steps:
|
6
6
|
|
7
|
-
1.
|
8
|
-
app. This is necessary because build order is important and Heroku's
|
9
|
-
auto-detection will add them in the wrong order.
|
10
|
-
|
11
|
-
2. Set the following environment variables:
|
7
|
+
1. Set the following environment variables:
|
12
8
|
|
13
9
|
- `ASSET_HOST`: `siteURL.herokuapp.com`
|
14
10
|
- `APPLICATION_HOST`: `siteURL.herokuapp.com`
|
@@ -16,6 +12,7 @@ Deploying to Heroku requires two additional steps:
|
|
16
12
|
- `SMTP_DOMAIN`: `example.com`
|
17
13
|
- `SMTP_USERNAME`: `username`
|
18
14
|
- `SMTP_PASSWORD`: `password`
|
15
|
+
- `AUTO_MIGRATE_DB`: `true`
|
19
16
|
|
20
17
|
## Execution
|
21
18
|
|
data/lib/suspenders.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "suspenders/version"
|
2
|
+
require "suspenders/generators/advisories_generator"
|
2
3
|
require "suspenders/generators/app_generator"
|
3
4
|
require "suspenders/generators/static_generator"
|
4
5
|
require "suspenders/generators/stylesheet_base_generator"
|
@@ -15,11 +16,16 @@ require "suspenders/generators/js_driver_generator"
|
|
15
16
|
require "suspenders/generators/json_generator"
|
16
17
|
require "suspenders/generators/testing_generator"
|
17
18
|
require "suspenders/generators/inline_svg_generator"
|
19
|
+
require "suspenders/generators/preloader_generator"
|
20
|
+
require "suspenders/generators/profiler_generator"
|
21
|
+
require "suspenders/generators/runner_generator"
|
18
22
|
require "suspenders/generators/production/force_tls_generator"
|
23
|
+
require "suspenders/generators/production/compression_generator"
|
19
24
|
require "suspenders/generators/production/email_generator"
|
20
25
|
require "suspenders/generators/production/timeout_generator"
|
21
26
|
require "suspenders/generators/production/deployment_generator"
|
22
27
|
require "suspenders/generators/production/manifest_generator"
|
28
|
+
require "suspenders/generators/production/single_redirect"
|
23
29
|
require "suspenders/generators/staging/pull_requests_generator"
|
24
30
|
require "suspenders/actions"
|
25
31
|
require "suspenders/adapters/heroku"
|
data/lib/suspenders/actions.rb
CHANGED
@@ -39,7 +39,7 @@ module Suspenders
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def invoke!
|
42
|
-
write_out { |existing_json| existing_json.
|
42
|
+
write_out { |existing_json| existing_json.deep_merge(data) }
|
43
43
|
end
|
44
44
|
|
45
45
|
def revoke!
|
@@ -60,7 +60,7 @@ module Suspenders
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def existing_json
|
63
|
-
JSON.parse(IO.read(destination_file))
|
63
|
+
JSON.parse(IO.read(destination_file), symbolize_names: true)
|
64
64
|
rescue Errno::ENOENT
|
65
65
|
{}
|
66
66
|
end
|
@@ -84,6 +84,19 @@ module Suspenders
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
+
def set_heroku_buildpacks
|
88
|
+
%w(staging production).each do |environment|
|
89
|
+
run_toolbelt_command(
|
90
|
+
"buildpacks:add --index 1 heroku/nodejs",
|
91
|
+
environment,
|
92
|
+
)
|
93
|
+
run_toolbelt_command(
|
94
|
+
"buildpacks:add --index 2 heroku/ruby",
|
95
|
+
environment,
|
96
|
+
)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
87
100
|
private
|
88
101
|
|
89
102
|
attr_reader :app_builder
|
@@ -92,7 +105,7 @@ module Suspenders
|
|
92
105
|
heroku_app_name = heroku_app_name_for(environment)
|
93
106
|
<<~SHELL
|
94
107
|
|
95
|
-
if heroku
|
108
|
+
if heroku apps:info --app #{heroku_app_name} > /dev/null 2>&1; then
|
96
109
|
git remote add #{environment} git@heroku.com:#{heroku_app_name}.git || true
|
97
110
|
printf 'You are a collaborator on the "#{heroku_app_name}" Heroku app\n'
|
98
111
|
else
|
@@ -15,6 +15,7 @@ module Suspenders
|
|
15
15
|
:set_heroku_honeybadger_env,
|
16
16
|
:set_heroku_rails_secrets,
|
17
17
|
:set_heroku_remotes,
|
18
|
+
:set_heroku_buildpacks,
|
18
19
|
)
|
19
20
|
|
20
21
|
def readme
|
@@ -96,18 +97,6 @@ module Suspenders
|
|
96
97
|
copy_file "email.rb", "config/initializers/email.rb"
|
97
98
|
end
|
98
99
|
|
99
|
-
def enable_rack_canonical_host
|
100
|
-
config = <<-RUBY
|
101
|
-
config.middleware.use Rack::CanonicalHost, ENV.fetch("APPLICATION_HOST")
|
102
|
-
RUBY
|
103
|
-
|
104
|
-
configure_environment "production", config
|
105
|
-
end
|
106
|
-
|
107
|
-
def enable_rack_deflater
|
108
|
-
configure_environment "production", "config.middleware.use Rack::Deflater"
|
109
|
-
end
|
110
|
-
|
111
100
|
def setup_asset_host
|
112
101
|
replace_in_file 'config/environments/production.rb',
|
113
102
|
"# config.action_controller.asset_host = 'http://assets.example.com'",
|
@@ -185,82 +174,25 @@ config.public_file_server.headers = {
|
|
185
174
|
)
|
186
175
|
end
|
187
176
|
|
188
|
-
def replace_default_puma_configuration
|
189
|
-
copy_file "puma.rb", "config/puma.rb", force: true
|
190
|
-
end
|
191
|
-
|
192
|
-
def set_up_forego
|
193
|
-
copy_file "Procfile", "Procfile"
|
194
|
-
end
|
195
|
-
|
196
|
-
def setup_default_directories
|
197
|
-
[
|
198
|
-
'app/views/pages',
|
199
|
-
'spec/lib',
|
200
|
-
'spec/controllers',
|
201
|
-
'spec/helpers',
|
202
|
-
'spec/support/matchers',
|
203
|
-
'spec/support/mixins',
|
204
|
-
'spec/support/shared_examples'
|
205
|
-
].each do |dir|
|
206
|
-
empty_directory_with_keep_file dir
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def copy_dotfiles
|
211
|
-
directory("dotfiles", ".")
|
212
|
-
end
|
213
|
-
|
214
177
|
def create_heroku_apps(flags)
|
215
178
|
create_staging_heroku_app(flags)
|
216
179
|
create_production_heroku_app(flags)
|
217
180
|
end
|
218
181
|
|
219
182
|
def configure_automatic_deployment
|
220
|
-
|
221
|
-
|
222
|
-
staging:
|
223
|
-
branch: master
|
224
|
-
commands:
|
225
|
-
- bin/deploy staging
|
226
|
-
YML
|
227
|
-
|
228
|
-
append_file "circle.yml", deploy_command
|
183
|
+
append_file "Procfile", "release: bin/auto_migrate\n"
|
184
|
+
copy_file "bin_auto_migrate", "bin/auto_migrate"
|
229
185
|
end
|
230
186
|
|
231
187
|
def create_github_repo(repo_name)
|
232
188
|
run "hub create #{repo_name}"
|
233
189
|
end
|
234
190
|
|
235
|
-
def setup_bundler_audit
|
236
|
-
copy_file "bundler_audit.rake", "lib/tasks/bundler_audit.rake"
|
237
|
-
append_file "Rakefile", %{\ntask default: "bundle:audit"\n}
|
238
|
-
end
|
239
|
-
|
240
|
-
def setup_spring
|
241
|
-
bundle_command "exec spring binstub --all"
|
242
|
-
end
|
243
|
-
|
244
191
|
def copy_miscellaneous_files
|
245
192
|
copy_file "errors.rb", "config/initializers/errors.rb"
|
246
193
|
copy_file "json_encoding.rb", "config/initializers/json_encoding.rb"
|
247
194
|
end
|
248
195
|
|
249
|
-
def customize_error_pages
|
250
|
-
meta_tags =<<-EOS
|
251
|
-
<meta charset="utf-8" />
|
252
|
-
<meta name="viewport" content="initial-scale=1" />
|
253
|
-
EOS
|
254
|
-
|
255
|
-
%w(500 404 422).each do |page|
|
256
|
-
path = "public/#{page}.html"
|
257
|
-
if File.exist?(path)
|
258
|
-
inject_into_file path, meta_tags, after: "<head>\n"
|
259
|
-
replace_in_file path, /<!--.+-->\n/, ''
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
|
-
|
264
196
|
def remove_config_comment_lines
|
265
197
|
config_files = [
|
266
198
|
"application.rb",
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Suspenders
|
4
|
+
class AdvisoriesGenerator < Generators::Base
|
5
|
+
def bundler_audit_gem
|
6
|
+
gem "bundler-audit",
|
7
|
+
require: false,
|
8
|
+
group: %i[development test],
|
9
|
+
git: "https://github.com/rubysec/bundler-audit.git",
|
10
|
+
branch: "0.7.0"
|
11
|
+
Bundler.with_clean_env { run "bundle install" }
|
12
|
+
end
|
13
|
+
|
14
|
+
def rake_task
|
15
|
+
copy_file "bundler_audit.rake", "lib/tasks/bundler_audit.rake"
|
16
|
+
append_file "Rakefile", %{\ntask default: "bundle:audit"\n}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -47,14 +47,9 @@ module Suspenders
|
|
47
47
|
invoke :setup_secret_token
|
48
48
|
invoke :configure_app
|
49
49
|
invoke :copy_miscellaneous_files
|
50
|
-
invoke :customize_error_pages
|
51
|
-
invoke :setup_dotfiles
|
52
50
|
invoke :setup_database
|
53
51
|
invoke :create_github_repo
|
54
|
-
invoke :setup_bundler_audit
|
55
|
-
invoke :setup_spring
|
56
52
|
invoke :generate_default
|
57
|
-
invoke :setup_default_directories
|
58
53
|
invoke :create_heroku_apps
|
59
54
|
invoke :generate_deployment_default
|
60
55
|
invoke :remove_config_comment_lines
|
@@ -92,8 +87,6 @@ module Suspenders
|
|
92
87
|
|
93
88
|
def setup_production_environment
|
94
89
|
say 'Setting up the production environment'
|
95
|
-
build :enable_rack_canonical_host
|
96
|
-
build :enable_rack_deflater
|
97
90
|
build :setup_asset_host
|
98
91
|
end
|
99
92
|
|
@@ -107,9 +100,6 @@ module Suspenders
|
|
107
100
|
build :configure_action_mailer
|
108
101
|
build :configure_time_formats
|
109
102
|
build :setup_default_rake_task
|
110
|
-
build :replace_default_puma_configuration
|
111
|
-
build :set_up_forego
|
112
|
-
build :setup_rack_mini_profiler
|
113
103
|
end
|
114
104
|
|
115
105
|
def create_heroku_apps
|
@@ -121,6 +111,7 @@ module Suspenders
|
|
121
111
|
build :set_heroku_application_host
|
122
112
|
build :set_heroku_honeybadger_env
|
123
113
|
build :set_heroku_backup_schedule
|
114
|
+
build :set_heroku_buildpacks
|
124
115
|
build :create_heroku_pipeline
|
125
116
|
build :configure_automatic_deployment
|
126
117
|
end
|
@@ -133,34 +124,11 @@ module Suspenders
|
|
133
124
|
end
|
134
125
|
end
|
135
126
|
|
136
|
-
def setup_dotfiles
|
137
|
-
build :copy_dotfiles
|
138
|
-
end
|
139
|
-
|
140
|
-
def setup_default_directories
|
141
|
-
build :setup_default_directories
|
142
|
-
end
|
143
|
-
|
144
|
-
def setup_bundler_audit
|
145
|
-
say "Setting up bundler-audit"
|
146
|
-
build :setup_bundler_audit
|
147
|
-
end
|
148
|
-
|
149
|
-
def setup_spring
|
150
|
-
say "Springifying binstubs"
|
151
|
-
build :setup_spring
|
152
|
-
end
|
153
|
-
|
154
127
|
def copy_miscellaneous_files
|
155
128
|
say 'Copying miscellaneous support files'
|
156
129
|
build :copy_miscellaneous_files
|
157
130
|
end
|
158
131
|
|
159
|
-
def customize_error_pages
|
160
|
-
say 'Customizing the 500/404/422 pages'
|
161
|
-
build :customize_error_pages
|
162
|
-
end
|
163
|
-
|
164
132
|
def remove_config_comment_lines
|
165
133
|
build :remove_config_comment_lines
|
166
134
|
end
|
@@ -171,6 +139,7 @@ module Suspenders
|
|
171
139
|
|
172
140
|
def generate_default
|
173
141
|
run("spring stop")
|
142
|
+
generate("suspenders:profiler")
|
174
143
|
generate("suspenders:json")
|
175
144
|
generate("suspenders:static")
|
176
145
|
generate("suspenders:stylesheet_base")
|
@@ -186,10 +155,15 @@ module Suspenders
|
|
186
155
|
generate("suspenders:jobs")
|
187
156
|
generate("suspenders:analytics")
|
188
157
|
generate("suspenders:inline_svg")
|
158
|
+
generate("suspenders:advisories")
|
159
|
+
generate("suspenders:runner")
|
160
|
+
generate("suspenders:preloader")
|
189
161
|
end
|
190
162
|
|
191
163
|
def generate_deployment_default
|
192
164
|
generate("suspenders:staging:pull_requests")
|
165
|
+
generate("suspenders:production:single_redirect")
|
166
|
+
generate("suspenders:production:compression")
|
193
167
|
generate("suspenders:production:force_tls")
|
194
168
|
generate("suspenders:production:email")
|
195
169
|
generate("suspenders:production:timeout")
|