suspenders 1.49.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 +6 -4
- data/CONTRIBUTING.md +15 -15
- data/GOALS.md +65 -0
- data/NEWS.md +60 -0
- data/README.md +8 -7
- data/docs/heroku_deploy.md +19 -0
- data/lib/suspenders.rb +12 -0
- data/lib/suspenders/actions.rb +2 -2
- data/lib/suspenders/adapters/heroku.rb +14 -14
- data/lib/suspenders/app_builder.rb +3 -97
- data/lib/suspenders/generators/advisories_generator.rb +19 -0
- data/lib/suspenders/generators/analytics_generator.rb +2 -7
- data/lib/suspenders/generators/app_generator.rb +18 -44
- data/lib/suspenders/generators/base.rb +59 -0
- data/lib/suspenders/generators/ci_generator.rb +20 -14
- data/lib/suspenders/generators/db_optimizations_generator.rb +5 -17
- data/lib/suspenders/generators/factories_generator.rb +2 -7
- data/lib/suspenders/generators/forms_generator.rb +2 -2
- data/lib/suspenders/generators/inline_svg_generator.rb +14 -0
- data/lib/suspenders/generators/jobs_generator.rb +2 -12
- data/lib/suspenders/generators/js_driver_generator.rb +8 -10
- data/lib/suspenders/generators/json_generator.rb +10 -0
- data/lib/suspenders/generators/lint_generator.rb +2 -7
- 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 +16 -0
- data/lib/suspenders/generators/production/email_generator.rb +7 -18
- data/lib/suspenders/generators/production/force_tls_generator.rb +2 -5
- data/lib/suspenders/generators/production/manifest_generator.rb +25 -0
- data/lib/suspenders/generators/production/single_redirect.rb +15 -0
- data/lib/suspenders/generators/production/timeout_generator.rb +3 -2
- 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 +25 -0
- data/lib/suspenders/generators/static_generator.rb +6 -2
- data/lib/suspenders/generators/stylelint_generator.rb +70 -0
- data/lib/suspenders/generators/stylesheet_base_generator.rb +7 -12
- data/lib/suspenders/generators/testing_generator.rb +5 -21
- data/lib/suspenders/generators/views_generator.rb +2 -7
- data/lib/suspenders/version.rb +2 -2
- 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 +7 -14
- data/spec/features/inline_svg_spec.rb +10 -0
- data/spec/features/json_spec.rb +15 -0
- data/spec/features/new_project_spec.rb +18 -35
- data/spec/features/preloader_spec.rb +25 -0
- data/spec/features/production/compression_spec.rb +23 -0
- data/spec/features/production/deployment_spec.rb +22 -0
- data/spec/features/production/email_spec.rb +1 -1
- data/spec/features/production/manifest_spec.rb +37 -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/staging/pull_requests_spec.rb +22 -0
- data/spec/features/static_spec.rb +17 -0
- data/spec/features/stylelint_spec.rb +60 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/be_executable_matcher.rb +7 -0
- data/spec/support/contain_json_matcher.rb +16 -10
- data/spec/support/generators.rb +5 -0
- data/spec/support/project_files.rb +25 -0
- data/spec/support/rails_template.rb +1 -0
- data/spec/support/suspenders.rb +16 -13
- data/suspenders.gemspec +1 -1
- data/templates/Gemfile.erb +6 -12
- data/templates/_javascript.html.erb +1 -8
- 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/capybara_silence_puma.rb +1 -0
- data/templates/chromedriver.rb +14 -4
- 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/factory_bot_rspec.rb +2 -0
- data/templates/hound.yml +3 -1
- data/templates/inline_svg.rb +3 -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 +7 -4
- data/templates/{dotfiles/.env → sample_env} +0 -2
- data/templates/spec_helper.rb +4 -7
- data/templates/spring.rb +6 -0
- data/templates/stylelintrc.json +3 -0
- data/templates/suspenders_gitignore +1 -1
- metadata +106 -16
- data/templates/app.json.erb +0 -27
- data/templates/browserslist +0 -3
- 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.
|
1
|
+
2.6.6
|
data/.travis.yml
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
language: ruby
|
2
|
-
rvm: 2.
|
2
|
+
rvm: 2.6.6
|
3
3
|
cache: bundler
|
4
|
-
sudo: false
|
5
4
|
before_install:
|
6
|
-
-
|
5
|
+
- nvm install 13.12.0
|
7
6
|
- git config --global user.name 'Travis CI'
|
8
7
|
- git config --global user.email 'travis-ci@example.com'
|
9
|
-
- gem install bundler
|
10
8
|
- gem update --system
|
9
|
+
- gem install bundler
|
10
|
+
- bundler config --global disable_platform_warnings true
|
11
11
|
install: bundle install
|
12
12
|
notifications:
|
13
13
|
email: false
|
14
|
+
services:
|
15
|
+
- postgresql
|
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,63 @@
|
|
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
|
+
|
30
|
+
1.53.0 (August 23, 2019)
|
31
|
+
* Upgraded: Rails 6.0.
|
32
|
+
* New generator: `suspenders:inline_svg` for setting up the inline_svg gem.
|
33
|
+
* Changed: silence Puma's startup messages in JS specs.
|
34
|
+
* Changed: improve chromedriver configuration.
|
35
|
+
* Added: documentation for deploying to Heroku.
|
36
|
+
* Fixed: indentation in production config file.
|
37
|
+
|
38
|
+
1.52.0 (June 7, 2019)
|
39
|
+
* Changed: Setup system tests instead of feature specs
|
40
|
+
* Upgraded: Rails 5.2.3
|
41
|
+
|
42
|
+
1.51.0 (April 26, 2019)
|
43
|
+
|
44
|
+
* Changed: from sass-rails to sassc-rails.
|
45
|
+
* Upgraded: Ruby 2.6.3.
|
46
|
+
* Fixed: Avoid installing autoprefixer-rails in api mode
|
47
|
+
* New generator: `suspenders:stylelint` for setting up stylelint.
|
48
|
+
* New generator: `suspenders:production:manifest` for app.json.
|
49
|
+
* New generator: `suspenders:production:deployment` for bin/deploy script.
|
50
|
+
|
51
|
+
1.50.0 (December 28, 2018)
|
52
|
+
|
53
|
+
* Removed: jquery-rails.
|
54
|
+
* Changed: default FactoryBot to `use_parent_strategy = true`.
|
55
|
+
* Upgraded: Ruby 2.5.3.
|
56
|
+
* Fixed: set `ASSET_HOST` and `APPLICATION_HOST` at top of `production.rb`.
|
57
|
+
* Fixed: `tzinfo-data` gem for Windows.
|
58
|
+
* New generator: `suspenders:json` for JSON parsing.
|
59
|
+
* New generator: `suspenders:staging:pull_requests` for Heroku app per PR.
|
60
|
+
|
1
61
|
1.49.0 (October 19, 2018)
|
2
62
|
|
3
63
|
* Removed: NOODP robots meta tags
|
data/README.md
CHANGED
@@ -36,13 +36,10 @@ It includes application gems like:
|
|
36
36
|
* [Bitters](https://github.com/thoughtbot/bitters) for scaffold application styles
|
37
37
|
* [Delayed Job](https://github.com/collectiveidea/delayed_job) for background
|
38
38
|
processing
|
39
|
-
* [Flutie](https://github.com/thoughtbot/flutie) for `page_title` and `body_class` view
|
40
|
-
helpers
|
41
39
|
* [High Voltage](https://github.com/thoughtbot/high_voltage) for static pages
|
42
|
-
* [Honeybadger](https://honeybadger.io) for exception notification
|
43
|
-
* [jQuery Rails](https://github.com/rails/jquery-rails) for jQuery
|
44
|
-
* [Neat](https://github.com/thoughtbot/neat) for semantic grids
|
40
|
+
* [Honeybadger](https://www.honeybadger.io/?affiliate=A43uwl) for exception notification
|
45
41
|
* [Normalize](https://necolas.github.io/normalize.css/) for resetting browser styles
|
42
|
+
* [Oj](http://www.ohler.com/oj/)
|
46
43
|
* [Postgres](https://github.com/ged/ruby-pg) for access to the Postgres database
|
47
44
|
* [Rack Canonical Host](https://github.com/tylerhunt/rack-canonical-host) to
|
48
45
|
ensure all requests are served from the same domain
|
@@ -55,7 +52,6 @@ It includes application gems like:
|
|
55
52
|
* [Skylight](https://www.skylight.io/) for monitoring performance
|
56
53
|
* [Title](https://github.com/calebthompson/title) for storing titles in
|
57
54
|
translations
|
58
|
-
* [Puma](https://github.com/puma/puma) to serve HTTP requests
|
59
55
|
|
60
56
|
And development gems like:
|
61
57
|
|
@@ -103,6 +99,7 @@ Suspenders also comes with:
|
|
103
99
|
environments
|
104
100
|
* Configuration for [CircleCI][circle] Continuous Integration (tests)
|
105
101
|
* Configuration for [Hound][hound] Continuous Integration (style)
|
102
|
+
* Configuration for [stylelint][stylelint]
|
106
103
|
* The analytics adapter [Segment][segment] (and therefore config for Google
|
107
104
|
Analytics, Intercom, Facebook Ads, Twitter Ads, etc.)
|
108
105
|
|
@@ -113,10 +110,13 @@ Suspenders also comes with:
|
|
113
110
|
[i18n]: https://github.com/thoughtbot/suspenders/pull/304
|
114
111
|
[circle]: https://circleci.com/docs
|
115
112
|
[hound]: https://houndci.com
|
113
|
+
[stylelint]: https://stylelint.io/
|
116
114
|
[segment]: https://segment.com
|
117
115
|
|
118
116
|
## Heroku
|
119
117
|
|
118
|
+
Read the documentation on [deploying to Heroku][heroku deploy]
|
119
|
+
|
120
120
|
You can optionally create Heroku staging and production apps:
|
121
121
|
|
122
122
|
suspenders app --heroku true
|
@@ -131,6 +131,7 @@ This:
|
|
131
131
|
* Schedules automated backups for 10AM UTC for both `staging` and `production`
|
132
132
|
|
133
133
|
[Heroku Pipeline]: https://devcenter.heroku.com/articles/pipelines
|
134
|
+
[heroku deploy]: https://github.com/thoughtbot/suspenders/blob/master/docs/heroku_deploy.md
|
134
135
|
|
135
136
|
You can optionally specify alternate Heroku flags:
|
136
137
|
|
@@ -222,6 +223,6 @@ See [our other projects][community].
|
|
222
223
|
We are [available for hire][hire].
|
223
224
|
|
224
225
|
[thoughtbot]: https://thoughtbot.com?utm_source=github
|
225
|
-
[thoughtbot-logo]:
|
226
|
+
[thoughtbot-logo]: https://thoughtbot.com/brand_assets/93:44.svg
|
226
227
|
[community]: https://thoughtbot.com/community?utm_source=github
|
227
228
|
[hire]: https://thoughtbot.com?utm_source=github
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Deploying to Heroku
|
2
|
+
|
3
|
+
## Setup
|
4
|
+
|
5
|
+
Deploying to Heroku requires two additional steps:
|
6
|
+
|
7
|
+
1. Set the following environment variables:
|
8
|
+
|
9
|
+
- `ASSET_HOST`: `siteURL.herokuapp.com`
|
10
|
+
- `APPLICATION_HOST`: `siteURL.herokuapp.com`
|
11
|
+
- `SMTP_ADDRESS`: `smtp.example.com`
|
12
|
+
- `SMTP_DOMAIN`: `example.com`
|
13
|
+
- `SMTP_USERNAME`: `username`
|
14
|
+
- `SMTP_PASSWORD`: `password`
|
15
|
+
- `AUTO_MIGRATE_DB`: `true`
|
16
|
+
|
17
|
+
## Execution
|
18
|
+
|
19
|
+
- Use the `./bin/deploy` convention for deploying to Heroku
|
data/lib/suspenders.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
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"
|
6
|
+
require "suspenders/generators/stylelint_generator"
|
5
7
|
require "suspenders/generators/forms_generator"
|
6
8
|
require "suspenders/generators/ci_generator"
|
7
9
|
require "suspenders/generators/db_optimizations_generator"
|
@@ -11,10 +13,20 @@ require "suspenders/generators/jobs_generator"
|
|
11
13
|
require "suspenders/generators/analytics_generator"
|
12
14
|
require "suspenders/generators/views_generator"
|
13
15
|
require "suspenders/generators/js_driver_generator"
|
16
|
+
require "suspenders/generators/json_generator"
|
14
17
|
require "suspenders/generators/testing_generator"
|
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"
|
15
22
|
require "suspenders/generators/production/force_tls_generator"
|
23
|
+
require "suspenders/generators/production/compression_generator"
|
16
24
|
require "suspenders/generators/production/email_generator"
|
17
25
|
require "suspenders/generators/production/timeout_generator"
|
26
|
+
require "suspenders/generators/production/deployment_generator"
|
27
|
+
require "suspenders/generators/production/manifest_generator"
|
28
|
+
require "suspenders/generators/production/single_redirect"
|
29
|
+
require "suspenders/generators/staging/pull_requests_generator"
|
18
30
|
require "suspenders/actions"
|
19
31
|
require "suspenders/adapters/heroku"
|
20
32
|
require "suspenders/app_builder"
|
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
|
@@ -55,19 +55,6 @@ module Suspenders
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def create_review_apps_setup_script
|
59
|
-
app_builder.template(
|
60
|
-
"bin_setup_review_app.erb",
|
61
|
-
"bin/setup_review_app",
|
62
|
-
force: true,
|
63
|
-
)
|
64
|
-
app_builder.run "chmod a+x bin/setup_review_app"
|
65
|
-
end
|
66
|
-
|
67
|
-
def create_heroku_application_manifest_file
|
68
|
-
app_builder.template "app.json.erb", "app.json"
|
69
|
-
end
|
70
|
-
|
71
58
|
def create_heroku_pipeline
|
72
59
|
pipelines_plugin = `heroku help | grep pipelines`
|
73
60
|
if pipelines_plugin.empty?
|
@@ -97,6 +84,19 @@ module Suspenders
|
|
97
84
|
end
|
98
85
|
end
|
99
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
|
+
|
100
100
|
private
|
101
101
|
|
102
102
|
attr_reader :app_builder
|
@@ -105,7 +105,7 @@ module Suspenders
|
|
105
105
|
heroku_app_name = heroku_app_name_for(environment)
|
106
106
|
<<~SHELL
|
107
107
|
|
108
|
-
if heroku
|
108
|
+
if heroku apps:info --app #{heroku_app_name} > /dev/null 2>&1; then
|
109
109
|
git remote add #{environment} git@heroku.com:#{heroku_app_name}.git || true
|
110
110
|
printf 'You are a collaborator on the "#{heroku_app_name}" Heroku app\n'
|
111
111
|
else
|
@@ -7,16 +7,15 @@ module Suspenders
|
|
7
7
|
|
8
8
|
def_delegators(
|
9
9
|
:heroku_adapter,
|
10
|
-
:create_heroku_application_manifest_file,
|
11
10
|
:create_heroku_pipeline,
|
12
11
|
:create_production_heroku_app,
|
13
|
-
:create_review_apps_setup_script,
|
14
12
|
:create_staging_heroku_app,
|
15
13
|
:set_heroku_application_host,
|
16
14
|
:set_heroku_backup_schedule,
|
17
15
|
:set_heroku_honeybadger_env,
|
18
16
|
:set_heroku_rails_secrets,
|
19
17
|
:set_heroku_remotes,
|
18
|
+
:set_heroku_buildpacks,
|
20
19
|
)
|
21
20
|
|
22
21
|
def readme
|
@@ -98,23 +97,6 @@ module Suspenders
|
|
98
97
|
copy_file "email.rb", "config/initializers/email.rb"
|
99
98
|
end
|
100
99
|
|
101
|
-
def enable_rack_canonical_host
|
102
|
-
config = <<-RUBY
|
103
|
-
|
104
|
-
if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
|
105
|
-
ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
|
106
|
-
end
|
107
|
-
|
108
|
-
config.middleware.use Rack::CanonicalHost, ENV.fetch("APPLICATION_HOST")
|
109
|
-
RUBY
|
110
|
-
|
111
|
-
configure_environment "production", config
|
112
|
-
end
|
113
|
-
|
114
|
-
def enable_rack_deflater
|
115
|
-
configure_environment "production", "config.middleware.use Rack::Deflater"
|
116
|
-
end
|
117
|
-
|
118
100
|
def setup_asset_host
|
119
101
|
replace_in_file 'config/environments/production.rb',
|
120
102
|
"# config.action_controller.asset_host = 'http://assets.example.com'",
|
@@ -192,101 +174,25 @@ config.public_file_server.headers = {
|
|
192
174
|
)
|
193
175
|
end
|
194
176
|
|
195
|
-
def replace_default_puma_configuration
|
196
|
-
copy_file "puma.rb", "config/puma.rb", force: true
|
197
|
-
end
|
198
|
-
|
199
|
-
def set_up_forego
|
200
|
-
copy_file "Procfile", "Procfile"
|
201
|
-
end
|
202
|
-
|
203
|
-
def setup_default_directories
|
204
|
-
[
|
205
|
-
'app/views/pages',
|
206
|
-
'spec/lib',
|
207
|
-
'spec/controllers',
|
208
|
-
'spec/helpers',
|
209
|
-
'spec/support/matchers',
|
210
|
-
'spec/support/mixins',
|
211
|
-
'spec/support/shared_examples'
|
212
|
-
].each do |dir|
|
213
|
-
empty_directory_with_keep_file dir
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
def copy_dotfiles
|
218
|
-
directory("dotfiles", ".")
|
219
|
-
end
|
220
|
-
|
221
177
|
def create_heroku_apps(flags)
|
222
178
|
create_staging_heroku_app(flags)
|
223
179
|
create_production_heroku_app(flags)
|
224
180
|
end
|
225
181
|
|
226
|
-
def create_deploy_script
|
227
|
-
copy_file "bin_deploy", "bin/deploy"
|
228
|
-
|
229
|
-
instructions = <<-MARKDOWN
|
230
|
-
|
231
|
-
## Deploying
|
232
|
-
|
233
|
-
If you have previously run the `./bin/setup` script,
|
234
|
-
you can deploy to staging and production with:
|
235
|
-
|
236
|
-
% ./bin/deploy staging
|
237
|
-
% ./bin/deploy production
|
238
|
-
MARKDOWN
|
239
|
-
|
240
|
-
append_file "README.md", instructions
|
241
|
-
run "chmod a+x bin/deploy"
|
242
|
-
end
|
243
|
-
|
244
182
|
def configure_automatic_deployment
|
245
|
-
|
246
|
-
|
247
|
-
staging:
|
248
|
-
branch: master
|
249
|
-
commands:
|
250
|
-
- bin/deploy staging
|
251
|
-
YML
|
252
|
-
|
253
|
-
append_file "circle.yml", deploy_command
|
183
|
+
append_file "Procfile", "release: bin/auto_migrate\n"
|
184
|
+
copy_file "bin_auto_migrate", "bin/auto_migrate"
|
254
185
|
end
|
255
186
|
|
256
187
|
def create_github_repo(repo_name)
|
257
188
|
run "hub create #{repo_name}"
|
258
189
|
end
|
259
190
|
|
260
|
-
def setup_bundler_audit
|
261
|
-
copy_file "bundler_audit.rake", "lib/tasks/bundler_audit.rake"
|
262
|
-
append_file "Rakefile", %{\ntask default: "bundle:audit"\n}
|
263
|
-
end
|
264
|
-
|
265
|
-
def setup_spring
|
266
|
-
bundle_command "exec spring binstub --all"
|
267
|
-
end
|
268
|
-
|
269
191
|
def copy_miscellaneous_files
|
270
|
-
copy_file "browserslist", "browserslist"
|
271
192
|
copy_file "errors.rb", "config/initializers/errors.rb"
|
272
193
|
copy_file "json_encoding.rb", "config/initializers/json_encoding.rb"
|
273
194
|
end
|
274
195
|
|
275
|
-
def customize_error_pages
|
276
|
-
meta_tags =<<-EOS
|
277
|
-
<meta charset="utf-8" />
|
278
|
-
<meta name="viewport" content="initial-scale=1" />
|
279
|
-
EOS
|
280
|
-
|
281
|
-
%w(500 404 422).each do |page|
|
282
|
-
path = "public/#{page}.html"
|
283
|
-
if File.exist?(path)
|
284
|
-
inject_into_file path, meta_tags, after: "<head>\n"
|
285
|
-
replace_in_file path, /<!--.+-->\n/, ''
|
286
|
-
end
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
196
|
def remove_config_comment_lines
|
291
197
|
config_files = [
|
292
198
|
"application.rb",
|