suspenders 1.51.0 → 1.55.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +6 -3
  4. data/CONTRIBUTING.md +15 -15
  5. data/GOALS.md +65 -0
  6. data/Gemfile +1 -1
  7. data/NEWS.md +52 -0
  8. data/README.md +5 -4
  9. data/Rakefile +6 -5
  10. data/docs/heroku_deploy.md +19 -0
  11. data/lib/suspenders.rb +7 -0
  12. data/lib/suspenders/actions.rb +2 -2
  13. data/lib/suspenders/adapters/heroku.rb +27 -14
  14. data/lib/suspenders/app_builder.rb +42 -111
  15. data/lib/suspenders/generators/advisories_generator.rb +15 -0
  16. data/lib/suspenders/generators/analytics_generator.rb +1 -1
  17. data/lib/suspenders/generators/app_generator.rb +36 -58
  18. data/lib/suspenders/generators/base.rb +40 -1
  19. data/lib/suspenders/generators/ci_generator.rb +19 -9
  20. data/lib/suspenders/generators/db_optimizations_generator.rb +5 -17
  21. data/lib/suspenders/generators/factories_generator.rb +2 -2
  22. data/lib/suspenders/generators/forms_generator.rb +1 -1
  23. data/lib/suspenders/generators/inline_svg_generator.rb +14 -0
  24. data/lib/suspenders/generators/jobs_generator.rb +4 -4
  25. data/lib/suspenders/generators/js_driver_generator.rb +7 -4
  26. data/lib/suspenders/generators/json_generator.rb +1 -1
  27. data/lib/suspenders/generators/lint_generator.rb +5 -0
  28. data/lib/suspenders/generators/preloader_generator.rb +122 -0
  29. data/lib/suspenders/generators/production/compression_generator.rb +14 -0
  30. data/lib/suspenders/generators/production/deployment_generator.rb +1 -12
  31. data/lib/suspenders/generators/production/email_generator.rb +9 -12
  32. data/lib/suspenders/generators/production/manifest_generator.rb +8 -7
  33. data/lib/suspenders/generators/production/single_redirect.rb +15 -0
  34. data/lib/suspenders/generators/production/timeout_generator.rb +3 -2
  35. data/lib/suspenders/generators/profiler_generator.rb +35 -0
  36. data/lib/suspenders/generators/runner_generator.rb +48 -0
  37. data/lib/suspenders/generators/staging/pull_requests_generator.rb +4 -12
  38. data/lib/suspenders/generators/static_generator.rb +5 -1
  39. data/lib/suspenders/generators/stylelint_generator.rb +2 -1
  40. data/lib/suspenders/generators/stylesheet_base_generator.rb +7 -8
  41. data/lib/suspenders/generators/testing_generator.rb +6 -17
  42. data/lib/suspenders/version.rb +6 -6
  43. data/spec/adapters/heroku_spec.rb +36 -10
  44. data/spec/expand_json_spec.rb +89 -0
  45. data/spec/fakes/bin/heroku +1 -1
  46. data/spec/fakes/bin/hub +1 -1
  47. data/spec/features/advisories_spec.rb +24 -0
  48. data/spec/features/api_spec.rb +1 -1
  49. data/spec/features/ci_spec.rb +31 -0
  50. data/spec/features/cli_help_spec.rb +4 -4
  51. data/spec/features/db_optimizations_spec.rb +19 -0
  52. data/spec/features/heroku_spec.rb +9 -16
  53. data/spec/features/inline_svg_spec.rb +10 -0
  54. data/spec/features/lint_spec.rb +26 -0
  55. data/spec/features/new_project_spec.rb +38 -60
  56. data/spec/features/preloader_spec.rb +25 -0
  57. data/spec/features/production/compression_spec.rb +23 -0
  58. data/spec/features/production/email_spec.rb +10 -10
  59. data/spec/features/production/manifest_spec.rb +16 -14
  60. data/spec/features/production/single_redirect_spec.rb +25 -0
  61. data/spec/features/profiler_spec.rb +20 -0
  62. data/spec/features/runner_spec.rb +30 -0
  63. data/spec/features/staging/pull_requests_spec.rb +1 -1
  64. data/spec/features/static_spec.rb +17 -0
  65. data/spec/features/stylelint_spec.rb +7 -7
  66. data/spec/spec_helper.rb +3 -3
  67. data/spec/support/contain_json_matcher.rb +16 -10
  68. data/spec/support/fake_github.rb +3 -3
  69. data/spec/support/fake_heroku.rb +8 -8
  70. data/spec/support/project_files.rb +12 -0
  71. data/spec/support/rails_template.rb +1 -0
  72. data/spec/support/suspenders.rb +21 -19
  73. data/suspenders.gemspec +20 -20
  74. data/templates/Gemfile.erb +2 -10
  75. data/templates/_javascript.html.erb +1 -1
  76. data/templates/application.scss +0 -1
  77. data/templates/bin_auto_migrate +5 -0
  78. data/templates/bin_deploy +0 -2
  79. data/templates/bin_setup +2 -2
  80. data/templates/bin_setup_review_app.erb +0 -1
  81. data/templates/capybara_silence_puma.rb +1 -0
  82. data/templates/chromedriver.rb +14 -4
  83. data/templates/descriptions/advisories.md +5 -0
  84. data/templates/descriptions/analytics.md +4 -0
  85. data/templates/descriptions/ci.md +4 -0
  86. data/templates/descriptions/compression.md +4 -0
  87. data/templates/descriptions/db_optimizations.md +2 -0
  88. data/templates/descriptions/deployment.md +5 -0
  89. data/templates/descriptions/email.md +9 -0
  90. data/templates/descriptions/factories.md +12 -0
  91. data/templates/descriptions/force_tls.md +1 -0
  92. data/templates/descriptions/forms.md +1 -0
  93. data/templates/descriptions/inline_svg.md +2 -0
  94. data/templates/descriptions/jobs.md +3 -0
  95. data/templates/descriptions/js_driver.md +4 -0
  96. data/templates/descriptions/json.md +1 -0
  97. data/templates/descriptions/lint.md +3 -0
  98. data/templates/descriptions/manifest.md +2 -0
  99. data/templates/descriptions/preloader.md +3 -0
  100. data/templates/descriptions/profiler.md +7 -0
  101. data/templates/descriptions/pull_requests.md +4 -0
  102. data/templates/descriptions/runner.md +10 -0
  103. data/templates/descriptions/single_redirect.md +1 -0
  104. data/templates/descriptions/static.md +5 -0
  105. data/templates/descriptions/stylelint.md +3 -0
  106. data/templates/descriptions/stylesheet_base.md +4 -0
  107. data/templates/descriptions/testing.md +9 -0
  108. data/templates/descriptions/timeout.md +4 -0
  109. data/templates/descriptions/views.md +8 -0
  110. data/templates/errors.rb +3 -3
  111. data/templates/hound.yml +1 -2
  112. data/templates/inline_svg.rb +3 -0
  113. data/templates/partials/ci_simplecov.rb +14 -0
  114. data/templates/partials/db_optimizations_configuration.rb +5 -0
  115. data/templates/partials/deployment_readme.md +8 -0
  116. data/templates/partials/email_smtp.rb +2 -0
  117. data/templates/partials/profiler_readme.md +8 -0
  118. data/templates/partials/pull_requests_config.rb +4 -0
  119. data/templates/partials/runner_readme.md +31 -0
  120. data/templates/partials/runner_setup.rb +2 -0
  121. data/templates/rack_mini_profiler.rb +2 -0
  122. data/templates/rails_helper.rb +7 -4
  123. data/templates/{dotfiles/.env → sample_env} +0 -2
  124. data/templates/spec_helper.rb +4 -7
  125. data/templates/spring.rb +6 -0
  126. data/templates/suspenders_gitignore +1 -1
  127. metadata +99 -14
  128. data/templates/browserslist +0 -3
  129. data/templates/dotfiles/.ctags +0 -2
  130. data/templates/puma.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e1d2489344013411f6af7910de4365d8216d3da045e184d399b7f72824194b2
4
- data.tar.gz: 14b71a11bfed6786699ad314eeefe413b7c9d18da5b4330b44cdb88ff1985be2
3
+ metadata.gz: 5e684d97af6b8cca59865bb7d84045625df2357214bd756f63456435160f49b3
4
+ data.tar.gz: b0ae039bf62ed232460bd9f0eb924ccce92555dda231e8fe051401ae647d65c1
5
5
  SHA512:
6
- metadata.gz: 80ed93205b0fe4c881c4fef3848526a479a062d3c4decde4b52e152bcba74155c57d9625b487d62c77318c3044943dfd4cbee82650869a8295f389cdef0855e4
7
- data.tar.gz: 12cb587caae5b9ac79b4b0e2f4f647331e93af7e27918031e1271edb9104433da07c2b4452ebab46c9cf07de2ff618eea031c36be459c0eb0db480709d71879f
6
+ metadata.gz: 653fd7de13544c3081459fa32a85814d85925fe087c027aee63477d691b30179cac09b24172da99bfdd3f6260a38812b9acd55cd483e21d3e1fba91a4ef88ec2
7
+ data.tar.gz: 69d4f55ea43380c41e4cee01ace5c15aebcb1840b7ac1310c34299b799fc82bc1673ab0b4deb2c5441289648e493fd0ee2f393a1218fd641d03d3a3406089efb
@@ -1 +1 @@
1
- 2.6.3
1
+ 2.6.6
@@ -1,12 +1,15 @@
1
1
  language: ruby
2
- rvm: 2.6.3
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 -v '< 2'
9
+ - gem install bundler
10
+ - bundler config --global disable_platform_warnings true
10
11
  install: bundle install
11
12
  notifications:
12
13
  email: false
14
+ services:
15
+ - postgresql
@@ -1,7 +1,7 @@
1
1
  # Contributing
2
2
 
3
- We love pull requests from everyone. By participating in this project, you agree
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
- Write tests.
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 the
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 try to at least comment on pull requests within one business day.
46
- We may suggest changes.
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
 
@@ -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/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
data/NEWS.md CHANGED
@@ -1,3 +1,55 @@
1
+ Unreleased
2
+
3
+ 1.55.0 (July 15, 2020)
4
+
5
+ * Changed: lint generator to install standard instead of RuboCop
6
+ * Changed: profile generator and timeout generator to write to `.sample.env`
7
+ instead of `.env`
8
+
9
+ 1.54.1 (June 30, 2020)
10
+
11
+ * Fixed: invalid Gemfile entry for bundler-audit
12
+ * Fixed: Deprecation warning for `Bundler.with_clean_env`
13
+
14
+ 1.54.0 (June 24, 2020)
15
+
16
+ * New generator: `suspenders:single_redirect` for setting up `Rack::CanonicalHost`
17
+ * New generator: `suspenders:production:compression` for setting up `Rack::Deflater`
18
+ * New generator: `suspenders:preloader` for managing spring
19
+ * New generator: `suspenders:advisories` for installing bundler-audit
20
+ * New generator: `suspenders:profiler` for setting up rack\_mini\_profiler
21
+ * New generator: `suspenders:runner` for making an app runnable locally
22
+ * Added: generator descriptions
23
+ * Added: Heroku release phase for running database migrations
24
+ * Added: automatic buildpack configuration for Heroku
25
+ * Added: system test configuration to opt into JavaScript as needed
26
+ * Added: spring-watcher-listen gem
27
+ * Changed: from `chromedriver-helper` to `webdrivers`
28
+ * Changed: replace `heroku join` calls with `heroku apps:info` in `bin/setup`
29
+ * Changed: check environment instead of `DATABASE\_URL` in test helper
30
+ * Fixed: `ExpandJson` merging
31
+ * Fixed: spacing in the generated config file
32
+ * Upgraded: bitters to version 2.x
33
+ * Upgraded: bourbon to version 6.x
34
+ * Upgraded: Ruby to version 2.6.6
35
+ * Removed: neat gem
36
+ * Removed: ctags configuration
37
+ * Removed: custom placeholder directories
38
+ * Removed: customization for error pages
39
+ * Removed: custom Puma config
40
+
41
+ 1.53.0 (August 23, 2019)
42
+ * Upgraded: Rails 6.0.
43
+ * New generator: `suspenders:inline_svg` for setting up the inline_svg gem.
44
+ * Changed: silence Puma's startup messages in JS specs.
45
+ * Changed: improve chromedriver configuration.
46
+ * Added: documentation for deploying to Heroku.
47
+ * Fixed: indentation in production config file.
48
+
49
+ 1.52.0 (June 7, 2019)
50
+ * Changed: Setup system tests instead of feature specs
51
+ * Upgraded: Rails 5.2.3
52
+
1
53
  1.51.0 (April 26, 2019)
2
54
 
3
55
  * Changed: from sass-rails to sassc-rails.
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
 
@@ -117,6 +115,8 @@ Suspenders also comes with:
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]: http://presskit.thoughtbot.com/images/thoughtbot-logo-for-readmes.svg
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
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
- require 'bundler/setup'
2
- require 'bundler/gem_tasks'
3
- require 'rspec/core/rake_task'
1
+ require "bundler/setup"
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+ require "standard/rake"
4
5
 
5
6
  RSpec::Core::RakeTask.new(:rspec)
6
7
 
7
- desc 'Run the test suite'
8
- task :default => :rspec
8
+ desc "Run the test suite"
9
+ task default: [:rspec, :standard]
@@ -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
@@ -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"
@@ -14,11 +15,17 @@ require "suspenders/generators/views_generator"
14
15
  require "suspenders/generators/js_driver_generator"
15
16
  require "suspenders/generators/json_generator"
16
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"
17
22
  require "suspenders/generators/production/force_tls_generator"
23
+ require "suspenders/generators/production/compression_generator"
18
24
  require "suspenders/generators/production/email_generator"
19
25
  require "suspenders/generators/production/timeout_generator"
20
26
  require "suspenders/generators/production/deployment_generator"
21
27
  require "suspenders/generators/production/manifest_generator"
28
+ require "suspenders/generators/production/single_redirect"
22
29
  require "suspenders/generators/staging/pull_requests_generator"
23
30
  require "suspenders/actions"
24
31
  require "suspenders/adapters/heroku"
@@ -39,7 +39,7 @@ module Suspenders
39
39
  end
40
40
 
41
41
  def invoke!
42
- write_out { |existing_json| existing_json.merge(data) }
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
@@ -7,8 +7,8 @@ module Suspenders
7
7
 
8
8
  def set_heroku_remotes
9
9
  remotes = <<~SHELL
10
- #{command_to_join_heroku_app('staging')}
11
- #{command_to_join_heroku_app('production')}
10
+ #{command_to_join_heroku_app("staging")}
11
+ #{command_to_join_heroku_app("production")}
12
12
 
13
13
  git config heroku.remote staging
14
14
  SHELL
@@ -29,28 +29,28 @@ module Suspenders
29
29
  end
30
30
 
31
31
  def set_heroku_rails_secrets
32
- %w(staging production).each do |environment|
32
+ %w[staging production].each do |environment|
33
33
  run_toolbelt_command(
34
34
  "config:add SECRET_KEY_BASE=#{generate_secret}",
35
- environment,
35
+ environment
36
36
  )
37
37
  end
38
38
  end
39
39
 
40
40
  def set_heroku_honeybadger_env
41
- %w(staging production).each do |environment|
41
+ %w[staging production].each do |environment|
42
42
  run_toolbelt_command(
43
43
  "config:add HONEYBADGER_ENV=#{environment}",
44
- environment,
44
+ environment
45
45
  )
46
46
  end
47
47
  end
48
48
 
49
49
  def set_heroku_backup_schedule
50
- %w(staging production).each do |environment|
50
+ %w[staging production].each do |environment|
51
51
  run_toolbelt_command(
52
52
  "pg:backups:schedule DATABASE_URL --at '10:00 UTC'",
53
- environment,
53
+ environment
54
54
  )
55
55
  end
56
56
  end
@@ -65,21 +65,34 @@ module Suspenders
65
65
  run_toolbelt_command(
66
66
  "pipelines:create #{heroku_app_name} \
67
67
  -a #{heroku_app_name}-staging --stage staging",
68
- "staging",
68
+ "staging"
69
69
  )
70
70
 
71
71
  run_toolbelt_command(
72
72
  "pipelines:add #{heroku_app_name} \
73
73
  -a #{heroku_app_name}-production --stage production",
74
- "production",
74
+ "production"
75
75
  )
76
76
  end
77
77
 
78
78
  def set_heroku_application_host
79
- %w(staging production).each do |environment|
79
+ %w[staging production].each do |environment|
80
80
  run_toolbelt_command(
81
81
  "config:add APPLICATION_HOST=#{heroku_app_name}-#{environment}.herokuapp.com",
82
- environment,
82
+ environment
83
+ )
84
+ end
85
+ end
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
83
96
  )
84
97
  end
85
98
  end
@@ -92,7 +105,7 @@ module Suspenders
92
105
  heroku_app_name = heroku_app_name_for(environment)
93
106
  <<~SHELL
94
107
 
95
- if heroku join --app #{heroku_app_name} > /dev/null 2>&1; then
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
@@ -115,7 +128,7 @@ module Suspenders
115
128
 
116
129
  def run_toolbelt_command(command, environment)
117
130
  app_builder.run(
118
- "heroku #{command} --remote #{environment}",
131
+ "heroku #{command} --remote #{environment}"
119
132
  )
120
133
  end
121
134
  end
@@ -15,10 +15,11 @@ 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
21
- template 'README.md.erb', 'README.md'
22
+ template "README.md.erb", "README.md"
22
23
  end
23
24
 
24
25
  def gitignore
@@ -32,7 +33,7 @@ module Suspenders
32
33
  def setup_rack_mini_profiler
33
34
  copy_file(
34
35
  "rack_mini_profiler.rb",
35
- "config/initializers/rack_mini_profiler.rb",
36
+ "config/initializers/rack_mini_profiler.rb"
36
37
  )
37
38
  end
38
39
 
@@ -41,15 +42,15 @@ module Suspenders
41
42
  end
42
43
 
43
44
  def raise_on_delivery_errors
44
- replace_in_file 'config/environments/development.rb',
45
- 'raise_delivery_errors = false', 'raise_delivery_errors = true'
45
+ replace_in_file "config/environments/development.rb",
46
+ "raise_delivery_errors = false", "raise_delivery_errors = true"
46
47
  end
47
48
 
48
49
  def set_test_delivery_method
49
50
  inject_into_file(
50
51
  "config/environments/development.rb",
51
52
  "\n config.action_mailer.delivery_method = :file",
52
- after: "config.action_mailer.raise_delivery_errors = true",
53
+ after: "config.action_mailer.raise_delivery_errors = true"
53
54
  )
54
55
  end
55
56
 
@@ -89,47 +90,35 @@ module Suspenders
89
90
 
90
91
  RUBY
91
92
 
92
- inject_into_class 'config/application.rb', 'Application', config
93
+ inject_into_class "config/application.rb", "Application", config
93
94
  end
94
95
 
95
96
  def configure_local_mail
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
- replace_in_file 'config/environments/production.rb',
101
+ replace_in_file "config/environments/production.rb",
113
102
  "# config.action_controller.asset_host = 'http://assets.example.com'",
114
103
  'config.action_controller.asset_host = ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST"))'
115
104
 
116
105
  if File.exist?("config/initializers/assets.rb")
117
- replace_in_file 'config/initializers/assets.rb',
106
+ replace_in_file "config/initializers/assets.rb",
118
107
  "config.assets.version = '1.0'",
119
108
  'config.assets.version = (ENV["ASSETS_VERSION"] || "1.0")'
120
109
  end
121
110
 
122
- config = <<-EOD
123
- config.public_file_server.headers = {
124
- "Cache-Control" => "public, max-age=31557600",
125
- }
111
+ config = <<~EOD
112
+ config.public_file_server.headers = {
113
+ "Cache-Control" => "public, max-age=31557600",
114
+ }
126
115
  EOD
127
116
 
128
117
  configure_environment("production", config)
129
118
  end
130
119
 
131
120
  def setup_secret_token
132
- template 'secrets.yml', 'config/secrets.yml', force: true
121
+ template "secrets.yml", "config/secrets.yml", force: true
133
122
  end
134
123
 
135
124
  def disallow_wrapping_parameters
@@ -137,7 +126,7 @@ config.public_file_server.headers = {
137
126
  end
138
127
 
139
128
  def use_postgres_config_template
140
- template 'postgresql_database.yml.erb', 'config/database.yml',
129
+ template "postgresql_database.yml.erb", "config/database.yml",
141
130
  force: true
142
131
  end
143
132
 
@@ -146,9 +135,9 @@ config.public_file_server.headers = {
146
135
  end
147
136
 
148
137
  def replace_gemfile(path)
149
- template 'Gemfile.erb', 'Gemfile', force: true do |content|
138
+ template "Gemfile.erb", "Gemfile", force: true do |content|
150
139
  if path
151
- content.gsub(%r{gem .suspenders.}) { |s| %{#{s}, path: "#{path}"} }
140
+ content.gsub(%r{gem .suspenders.}) { |s| %(#{s}, path: "#{path}") }
152
141
  else
153
142
  content
154
143
  end
@@ -156,7 +145,7 @@ config.public_file_server.headers = {
156
145
  end
157
146
 
158
147
  def ruby_version
159
- create_file '.ruby-version', "#{Suspenders::RUBY_VERSION}\n"
148
+ create_file ".ruby-version", "#{Suspenders::RUBY_VERSION}\n"
160
149
  end
161
150
 
162
151
  def configure_i18n_for_missing_translations
@@ -165,7 +154,7 @@ config.public_file_server.headers = {
165
154
  end
166
155
 
167
156
  def configure_action_mailer_in_specs
168
- copy_file 'action_mailer.rb', 'spec/support/action_mailer.rb'
157
+ copy_file "action_mailer.rb", "spec/support/action_mailer.rb"
169
158
  end
170
159
 
171
160
  def configure_time_formats
@@ -174,109 +163,51 @@ config.public_file_server.headers = {
174
163
  end
175
164
 
176
165
  def configure_action_mailer
177
- action_mailer_host "development", %{"localhost:3000"}
178
- action_mailer_asset_host "development", %{"http://localhost:3000"}
179
- action_mailer_host "test", %{"www.example.com"}
180
- action_mailer_asset_host "test", %{"http://www.example.com"}
166
+ action_mailer_host "development", %("localhost:3000")
167
+ action_mailer_asset_host "development", %("http://localhost:3000")
168
+ action_mailer_host "test", %("www.example.com")
169
+ action_mailer_asset_host "test", %("http://www.example.com")
181
170
  action_mailer_host "production", %{ENV.fetch("APPLICATION_HOST")}
182
171
  action_mailer_asset_host(
183
172
  "production",
184
- %{ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST"))},
173
+ %{ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST"))}
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
- deploy_command = <<-YML.strip_heredoc
221
- deployment:
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
- copy_file "browserslist", "browserslist"
246
192
  copy_file "errors.rb", "config/initializers/errors.rb"
247
193
  copy_file "json_encoding.rb", "config/initializers/json_encoding.rb"
248
194
  end
249
195
 
250
- def customize_error_pages
251
- meta_tags =<<-EOS
252
- <meta charset="utf-8" />
253
- <meta name="viewport" content="initial-scale=1" />
254
- EOS
255
-
256
- %w(500 404 422).each do |page|
257
- path = "public/#{page}.html"
258
- if File.exist?(path)
259
- inject_into_file path, meta_tags, after: "<head>\n"
260
- replace_in_file path, /<!--.+-->\n/, ''
261
- end
262
- end
263
- end
264
-
265
196
  def remove_config_comment_lines
266
197
  config_files = [
267
198
  "application.rb",
268
199
  "environment.rb",
269
200
  "environments/development.rb",
270
201
  "environments/production.rb",
271
- "environments/test.rb",
202
+ "environments/test.rb"
272
203
  ]
273
204
 
274
205
  config_files.each do |config_file|
275
206
  path = File.join(destination_root, "config/#{config_file}")
276
207
 
277
- accepted_content = File.readlines(path).reject do |line|
208
+ accepted_content = File.readlines(path).reject { |line|
278
209
  line =~ /^.*#.*$/ || line =~ /^$\n/
279
- end
210
+ }
280
211
 
281
212
  File.open(path, "w") do |file|
282
213
  accepted_content.each { |line| file.puts line }
@@ -285,23 +216,23 @@ config.public_file_server.headers = {
285
216
  end
286
217
 
287
218
  def remove_routes_comment_lines
288
- replace_in_file 'config/routes.rb',
219
+ replace_in_file "config/routes.rb",
289
220
  /Rails\.application\.routes\.draw do.*end/m,
290
221
  "Rails.application.routes.draw do\nend"
291
222
  end
292
223
 
293
224
  def setup_default_rake_task
294
- append_file 'Rakefile' do
295
- <<-EOS
296
- task(:default).clear
297
- task default: [:spec]
298
-
299
- if defined? RSpec
300
- task(:spec).clear
301
- RSpec::Core::RakeTask.new(:spec) do |t|
302
- t.verbose = false
303
- end
304
- end
225
+ append_file "Rakefile" do
226
+ <<~EOS
227
+ task(:default).clear
228
+ task default: [:spec]
229
+
230
+ if defined? RSpec
231
+ task(:spec).clear
232
+ RSpec::Core::RakeTask.new(:spec) do |t|
233
+ t.verbose = false
234
+ end
235
+ end
305
236
  EOS
306
237
  end
307
238
  end
@@ -309,7 +240,7 @@ end
309
240
  private
310
241
 
311
242
  def raise_on_missing_translations_in(environment)
312
- config = 'config.action_view.raise_on_missing_translations = true'
243
+ config = "config.action_view.raise_on_missing_translations = true"
313
244
 
314
245
  uncomment_lines("config/environments/#{environment}.rb", config)
315
246
  end