suspenders 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b45dd44edca5abdb998e4f4125948865647cf12c
4
- data.tar.gz: 7b3357990de3de5de40a6b9129e4c12f6dcfbbaa
3
+ metadata.gz: 5d6e0976e91ec4917e8119de4459892b4c11f6e8
4
+ data.tar.gz: f94cb991a1498ca9337f6c5b06c5445cd7ab9a47
5
5
  SHA512:
6
- metadata.gz: e2e317030fcb84a99761ddbcad59747cddc75c8c543934912001c167169269b96d4a172dd1242eb5022b2efb115b95b91eea6d16eeef72a72805f627b2894c7d
7
- data.tar.gz: 8d64ca336c16609af68560ab0b84289a2db6d0e6af7d48a0a9f70b58fc879de4a70966a5f8d53e6708aa885bd2faea7a80f21b3a97dab6587449b4764081c6ce
6
+ metadata.gz: 83fae0c577a776372fce11421f90f7e30a2f6dec55302638f54af395ae23a777a521b4717f6fafbfb561df229162a19d6373ec998db33c0c4e074feac858838d
7
+ data.tar.gz: dc25306dcd657edbc7d300ce384fe50a97060a8b4d0848da6e09489462c39d9a9cad3bd1f27f4d14dd7576110fba3703c6653920e9ea1d29314b5252abf54f80
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.3
1
+ 2.3.0
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
- rvm: 2.2.3
2
+ rvm: 2.3.0
3
3
  cache: bundler
4
4
  sudo: false
5
5
  before_install:
data/NEWS.md CHANGED
@@ -1,17 +1,27 @@
1
- 1.34.0 (unreleased)
1
+ 1.35.0 (December 30, 2015)
2
+
3
+ * Introduce Heroku Pipelines support
4
+ * Update to Ruby 2.3.0
5
+ * Heroku commands run on staging by default
6
+ * Git ignore `.env.local` instead of `.env`
7
+ * Add ability to use byebug navigation commands inside of Pry using the
8
+ `pry-byebug` gem
9
+ * Remove `i18n-tasks` from generated Gemfile
10
+ * Accessibility: Add `lang` attribute to `html` element in layout
11
+
12
+ 1.34.0 (November 15, 2015)
2
13
 
3
14
  * Fix `block_unknown_urls` deprecation warning with capybara_webkit when running
4
15
  Javascript tests
5
16
  * Inherit staging's `action_mailer_host` config from production
6
17
  * Suspenders command line responds to `-v` and `--version` options
7
18
  * Clean up `bin/rake`
8
- * Remove email_validator gem from generated Gemfile
19
+ * Remove `email_validator` gem from generated Gemfile
9
20
  * Fix Circle deploys by removing redundant remote
10
- * Add bullet as development dependency
21
+ * Add `bullet` as development dependency
11
22
  * Use Heroku Local (Forego) instead of Foreman
12
23
  * Raise on missing Sprockets assets in test environment
13
24
 
14
-
15
25
  1.33.0 (October 23, 2015)
16
26
 
17
27
  * Add `quiet_assets` as development dependency
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Suspenders [![Build Status](https://secure.travis-ci.org/thoughtbot/suspenders.svg?branch=master)](http://travis-ci.org/thoughtbot/suspenders)
2
2
 
3
3
  Suspenders is the base Rails application used at
4
- [thoughtbot](http://thoughtbot.com).
4
+ [thoughtbot](https://thoughtbot.com/).
5
5
 
6
6
  ![Suspenders boy](http://media.tumblr.com/1TEAMALpseh5xzf0Jt6bcwSMo1_400.png)
7
7
 
@@ -17,6 +17,12 @@ Then run:
17
17
 
18
18
  This will create a Rails app in `projectname` using the latest version of Rails.
19
19
 
20
+ ### Associated services
21
+
22
+ * Enable [Circle CI](https://circleci.com/) Continuous Integration
23
+ * Enable [GitHub auto deploys to Heroku staging and review
24
+ apps](https://dashboard.heroku.com/apps/app-name-staging/deploy/github).
25
+
20
26
  ## Gemfile
21
27
 
22
28
  To see the latest and greatest gems, look at Suspenders'
@@ -41,7 +47,7 @@ It includes application gems like:
41
47
  * [Postgres](https://github.com/ged/ruby-pg) for access to the Postgres database
42
48
  * [Rack Canonical Host](https://github.com/tylerhunt/rack-canonical-host) to
43
49
  ensure all requests are served from the same domain
44
- * [Rack Timeout](https://github.com/kch/rack-timeout) to abort requests that are
50
+ * [Rack Timeout](https://github.com/heroku/rack-timeout) to abort requests that are
45
51
  taking too long
46
52
  * [Recipient Interceptor](https://github.com/croaky/recipient_interceptor) to
47
53
  avoid accidentally sending emails to real people from staging
@@ -60,6 +66,8 @@ And development gems like:
60
66
  objects
61
67
  * [ByeBug](https://github.com/deivid-rodriguez/byebug) for interactively
62
68
  debugging behavior
69
+ * [Bullet](https://github.com/flyerhzm/bullet) for help to kill N+1 queries and
70
+ unused eager loading
63
71
  * [Bundler Audit](https://github.com/rubysec/bundler-audit) for scanning the
64
72
  Gemfile for insecure dependencies based on published CVEs
65
73
  * [Spring](https://github.com/rails/spring) for fast Rails actions via
@@ -81,7 +89,7 @@ And testing gems like:
81
89
  * [RSpec Mocks](https://github.com/rspec/rspec-mocks) for stubbing and spying
82
90
  * [Shoulda Matchers](https://github.com/thoughtbot/shoulda-matchers) for common
83
91
  RSpec matchers
84
- * [Timecop](https://github.com/jtrupiano/timecop-console) for testing time
92
+ * [Timecop](https://github.com/ferndopolis/timecop-console) for testing time
85
93
 
86
94
  ## Other goodies
87
95
 
@@ -102,8 +110,8 @@ Suspenders also comes with:
102
110
  * The analytics adapter [Segment][segment] (and therefore config for Google
103
111
  Analytics, Intercom, Facebook Ads, Twitter Ads, etc.)
104
112
 
105
- [setup]: http://robots.thoughtbot.com/bin-setup
106
- [compress]: http://robots.thoughtbot.com/content-compression-with-rack-deflater/
113
+ [setup]: https://robots.thoughtbot.com/bin-setup
114
+ [compress]: https://robots.thoughtbot.com/content-compression-with-rack-deflater
107
115
  [pool]: https://devcenter.heroku.com/articles/concurrency-and-database-connections
108
116
  [binstub]: https://github.com/thoughtbot/suspenders/pull/282
109
117
  [i18n]: https://github.com/thoughtbot/suspenders/pull/304
@@ -126,9 +134,11 @@ This:
126
134
  * Adds the [Rails Stdout Logging][logging-gem] gem
127
135
  to configure the app to log to standard out,
128
136
  which is how [Heroku's logging][heroku-logging] works.
137
+ * Creates a [Heroku Pipeline] for review apps
129
138
 
130
139
  [logging-gem]: https://github.com/heroku/rails_stdout_logging
131
140
  [heroku-logging]: https://devcenter.heroku.com/articles/logging#writing-to-your-log
141
+ [Heroku Pipeline]: https://devcenter.heroku.com/articles/pipelines
132
142
 
133
143
  You can optionally specify alternate Heroku flags:
134
144
 
@@ -200,13 +210,6 @@ Thank you, [contributors]!
200
210
 
201
211
  [contributors]: https://github.com/thoughtbot/suspenders/graphs/contributors
202
212
 
203
- ## Need Help?
204
-
205
- We offer 1-on-1 coaching. We can help you set up a new Rails application, write
206
- your first feature, and get up and running on Heroku. [Get in touch].
207
-
208
- [Get in touch]: http://coaching.thoughtbot.com/rails/?utm_source=github
209
-
210
213
  ## License
211
214
 
212
215
  Suspenders is Copyright © 2008-2015 thoughtbot.
data/bin/setup CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/bin/sh
2
2
 
3
3
  # Run this script immediately after cloning the codebase.
4
4
 
@@ -7,10 +7,10 @@ module Suspenders
7
7
 
8
8
  def set_heroku_remotes
9
9
  remotes = <<-SHELL.strip_heredoc
10
-
11
- # Set up the staging and production apps.
12
10
  #{command_to_join_heroku_app('staging')}
13
11
  #{command_to_join_heroku_app('production')}
12
+
13
+ git config heroku.remote staging
14
14
  SHELL
15
15
 
16
16
  app_builder.append_file "bin/setup", remotes
@@ -24,6 +24,20 @@ module Suspenders
24
24
  )
25
25
  end
26
26
 
27
+ def create_staging_heroku_app(flags)
28
+ rack_env = "RACK_ENV=staging RAILS_ENV=staging"
29
+ app_name = heroku_app_name_for("staging")
30
+
31
+ run_toolbelt_command "create #{app_name} #{flags}", "staging"
32
+ run_toolbelt_command "config:add #{rack_env}", "staging"
33
+ end
34
+
35
+ def create_production_heroku_app(flags)
36
+ app_name = heroku_app_name_for("production")
37
+
38
+ run_toolbelt_command "create #{app_name} #{flags}", "production"
39
+ end
40
+
27
41
  def set_heroku_rails_secrets
28
42
  %w(staging production).each do |environment|
29
43
  run_toolbelt_command(
@@ -33,6 +47,44 @@ module Suspenders
33
47
  end
34
48
  end
35
49
 
50
+ def provide_review_apps_setup_script
51
+ app_builder.template(
52
+ "bin_setup_review_app.erb",
53
+ "bin/setup_review_app",
54
+ force: true,
55
+ )
56
+ app_builder.run "chmod a+x bin/setup_review_app"
57
+ end
58
+
59
+ def create_heroku_pipelines_config_file
60
+ app_builder.template "app.json.erb", "app.json"
61
+ end
62
+
63
+ def create_heroku_pipeline
64
+ pipelines_plugin = `heroku plugins | grep pipelines`
65
+ if pipelines_plugin.empty?
66
+ puts "You need heroku pipelines plugin. Run: heroku plugins:install heroku-pipelines"
67
+ exit 1
68
+ end
69
+
70
+ heroku_app_name = app_builder.app_name.dasherize
71
+ %w(staging production).each do |environment|
72
+ run_toolbelt_command(
73
+ "pipelines:create #{heroku_app_name} -a #{heroku_app_name}-#{environment} --stage #{environment}",
74
+ environment,
75
+ )
76
+ end
77
+ end
78
+
79
+ def set_heroku_serve_static_files
80
+ %w(staging production).each do |environment|
81
+ run_toolbelt_command(
82
+ "config:add RAILS_SERVE_STATIC_FILES=true",
83
+ environment,
84
+ )
85
+ end
86
+ end
87
+
36
88
  private
37
89
 
38
90
  attr_reader :app_builder
@@ -40,6 +92,7 @@ module Suspenders
40
92
  def command_to_join_heroku_app(environment)
41
93
  heroku_app_name = heroku_app_name_for(environment)
42
94
  <<-SHELL
95
+
43
96
  if heroku join --app #{heroku_app_name} &> /dev/null; then
44
97
  git remote add #{environment} git@heroku.com:#{heroku_app_name}.git || true
45
98
  printf 'You are a collaborator on the "#{heroku_app_name}" Heroku app\n'
@@ -6,9 +6,15 @@ module Suspenders
6
6
  extend Forwardable
7
7
 
8
8
  def_delegators :heroku_adapter,
9
+ :create_heroku_pipelines_config_file,
10
+ :create_heroku_pipeline,
11
+ :create_production_heroku_app,
12
+ :create_staging_heroku_app,
13
+ :provide_review_apps_setup_script,
14
+ :set_heroku_rails_secrets,
9
15
  :set_heroku_remotes,
10
- :set_up_heroku_specific_gems,
11
- :set_heroku_rails_secrets
16
+ :set_heroku_serve_static_files,
17
+ :set_up_heroku_specific_gems
12
18
 
13
19
  def readme
14
20
  template 'README.md.erb', 'README.md'
@@ -69,7 +75,7 @@ module Suspenders
69
75
  end
70
76
 
71
77
  def provide_setup_script
72
- template "bin_setup.erb", "bin/setup", force: true
78
+ template "bin_setup", "bin/setup", force: true
73
79
  run "chmod a+x bin/setup"
74
80
  end
75
81
 
@@ -130,6 +136,10 @@ module Suspenders
130
136
  def enable_rack_canonical_host
131
137
  config = <<-RUBY
132
138
 
139
+ if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
140
+ ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
141
+ end
142
+
133
143
  # Ensure requests are only served from one, canonical host name
134
144
  config.middleware.use Rack::CanonicalHost, ENV.fetch("APPLICATION_HOST")
135
145
  RUBY
@@ -137,7 +147,7 @@ module Suspenders
137
147
  inject_into_file(
138
148
  "config/environments/production.rb",
139
149
  config,
140
- after: serve_static_files_line
150
+ after: "Rails.application.configure do",
141
151
  )
142
152
  end
143
153
 
@@ -266,11 +276,6 @@ end
266
276
  raise_on_missing_translations_in("test")
267
277
  end
268
278
 
269
- def configure_i18n_tasks
270
- run "cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/"
271
- copy_file "config_i18n_tasks.yml", "config/i18n-tasks.yml"
272
- end
273
-
274
279
  def configure_background_jobs_for_rspec
275
280
  run 'rails g delayed_job:active_record'
276
281
  end
@@ -330,8 +335,7 @@ Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i
330
335
  end
331
336
 
332
337
  def set_up_forego
333
- copy_file 'sample.env', '.sample.env'
334
- copy_file 'Procfile', 'Procfile'
338
+ copy_file "Procfile", "Procfile"
335
339
  end
336
340
 
337
341
  def setup_stylesheets
@@ -375,31 +379,11 @@ Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i
375
379
  run 'git init'
376
380
  end
377
381
 
378
- def create_staging_heroku_app(flags)
379
- rack_env = "RACK_ENV=staging RAILS_ENV=staging"
380
- app_name = heroku_app_name_for("staging")
381
-
382
- run_heroku "create #{app_name} #{flags}", "staging"
383
- run_heroku "config:add #{rack_env}", "staging"
384
- end
385
-
386
- def create_production_heroku_app(flags)
387
- app_name = heroku_app_name_for("production")
388
-
389
- run_heroku "create #{app_name} #{flags}", "production"
390
- end
391
-
392
382
  def create_heroku_apps(flags)
393
383
  create_staging_heroku_app(flags)
394
384
  create_production_heroku_app(flags)
395
385
  end
396
386
 
397
- def set_heroku_serve_static_files
398
- %w(staging production).each do |environment|
399
- run_heroku "config:add RAILS_SERVE_STATIC_FILES=true", environment
400
- end
401
- end
402
-
403
387
  def provide_deploy_script
404
388
  copy_file "bin_deploy", "bin/deploy"
405
389
 
@@ -419,7 +403,6 @@ you can deploy to staging and production with:
419
403
  end
420
404
 
421
405
  def configure_automatic_deployment
422
- staging_remote_name = heroku_app_name_for("staging")
423
406
  deploy_command = <<-YML.strip_heredoc
424
407
  deployment:
425
408
  staging:
@@ -524,10 +507,6 @@ end
524
507
  uncomment_lines("config/environments/#{environment}.rb", config)
525
508
  end
526
509
 
527
- def run_heroku(command, environment)
528
- run "heroku #{command} --remote #{environment}"
529
- end
530
-
531
510
  def heroku_adapter
532
511
  @heroku_adapter ||= Adapters::Heroku.new(self)
533
512
  end
@@ -535,9 +514,5 @@ end
535
514
  def serve_static_files_line
536
515
  "config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?\n"
537
516
  end
538
-
539
- def heroku_app_name_for(environment)
540
- "#{app_name.dasherize}-#{environment}"
541
- end
542
517
  end
543
518
  end
@@ -105,7 +105,6 @@ module Suspenders
105
105
  build :configure_spec_support_features
106
106
  build :configure_ci
107
107
  build :configure_i18n_for_test_environment
108
- build :configure_i18n_tasks
109
108
  build :configure_action_mailer_in_specs
110
109
  build :configure_capybara_webkit
111
110
  end
@@ -177,9 +176,12 @@ module Suspenders
177
176
  if options[:heroku]
178
177
  say "Creating Heroku apps"
179
178
  build :create_heroku_apps, options[:heroku_flags]
179
+ build :provide_review_apps_setup_script
180
180
  build :set_heroku_serve_static_files
181
181
  build :set_heroku_remotes
182
182
  build :set_heroku_rails_secrets
183
+ build :create_heroku_pipelines_config_file
184
+ build :create_heroku_pipeline
183
185
  build :provide_deploy_script
184
186
  build :configure_automatic_deployment
185
187
  end
@@ -1,5 +1,5 @@
1
1
  module Suspenders
2
2
  RAILS_VERSION = "~> 4.2.0"
3
3
  RUBY_VERSION = IO.read("#{File.dirname(__FILE__)}/../../.ruby-version").strip
4
- VERSION = "1.34.0"
4
+ VERSION = "1.35.0"
5
5
  end
@@ -20,12 +20,22 @@ RSpec.describe "Heroku" do
20
20
  "production",
21
21
  "SECRET_KEY_BASE",
22
22
  )
23
+ expect(FakeHeroku).to have_setup_pipeline_for(app_name)
23
24
 
24
25
  bin_setup_path = "#{project_path}/bin/setup"
25
26
  bin_setup = IO.read(bin_setup_path)
26
27
 
27
28
  expect(bin_setup).to include("heroku join --app #{app_name}-production")
28
29
  expect(bin_setup).to include("heroku join --app #{app_name}-staging")
30
+ expect(bin_setup).to include("git config heroku.remote staging")
31
+ expect(File.stat(bin_setup_path)).to be_executable
32
+
33
+ bin_setup_path = "#{project_path}/bin/setup_review_app"
34
+ bin_setup = IO.read(bin_setup_path)
35
+
36
+ expect(bin_setup).to include("heroku run rake db:migrate --app #{app_name}-staging-pr-$1")
37
+ expect(bin_setup).to include("heroku ps:scale worker=1 --app #{app_name}-staging-pr-$1")
38
+ expect(bin_setup).to include("heroku restart --app #{app_name}-staging-pr-$1")
29
39
  expect(File.stat(bin_setup_path)).to be_executable
30
40
 
31
41
  bin_deploy_path = "#{project_path}/bin/deploy"
@@ -50,6 +60,17 @@ RSpec.describe "Heroku" do
50
60
  - bin/deploy staging
51
61
  YML
52
62
  end
63
+
64
+ it "adds app.json file" do
65
+ expect(File).to exist("#{project_path}/app.json")
66
+ end
67
+
68
+ it "includes application name in app.json file" do
69
+ app_json_file = IO.read("#{project_path}/app.json")
70
+ app_name = SuspendersTestHelpers::APP_NAME.dasherize
71
+
72
+ expect(app_json_file).to match(/"name":"#{app_name}"/)
73
+ end
53
74
  end
54
75
 
55
76
  context "--heroku with region flag" do
@@ -30,7 +30,9 @@ RSpec.describe "Suspend a new project with default configuration" do
30
30
  end
31
31
 
32
32
  it "copies dotfiles" do
33
- expect(File).to exist("#{project_path}/.ctags")
33
+ %w[.ctags .env].each do |dotfile|
34
+ expect(File).to exist("#{project_path}/#{dotfile}")
35
+ end
34
36
  end
35
37
 
36
38
  it "loads secret_key_base from env" do
@@ -39,6 +41,16 @@ RSpec.describe "Suspend a new project with default configuration" do
39
41
  expect(secrets_file).to match(/secret_key_base: <%= ENV\["SECRET_KEY_BASE"\] %>/)
40
42
  end
41
43
 
44
+ it "adds bin/setup file" do
45
+ expect(File).to exist("#{project_path}/bin/setup")
46
+ end
47
+
48
+ it "makes bin/setup executable" do
49
+ bin_setup_path = "#{project_path}/bin/setup"
50
+
51
+ expect(File.stat(bin_setup_path)).to be_executable
52
+ end
53
+
42
54
  it "adds support file for action mailer" do
43
55
  expect(File).to exist("#{project_path}/spec/support/action_mailer.rb")
44
56
  end
@@ -98,17 +110,8 @@ RSpec.describe "Suspend a new project with default configuration" do
98
110
  end
99
111
  end
100
112
 
101
- it "adds specs for missing or unused translations" do
102
- expect(File).to exist("#{project_path}/spec/i18n_spec.rb")
103
- end
104
-
105
- it "configs i18n-tasks" do
106
- expect(File).to exist("#{project_path}/config/i18n-tasks.yml")
107
- end
108
-
109
113
  it "evaluates en.yml.erb" do
110
114
  locales_en_file = IO.read("#{project_path}/config/locales/en.yml")
111
- app_name = SuspendersTestHelpers::APP_NAME
112
115
 
113
116
  expect(locales_en_file).to match(/application: #{app_name.humanize}/)
114
117
  end
@@ -129,6 +132,12 @@ RSpec.describe "Suspend a new project with default configuration" do
129
132
  expect(prod_env_file).not_to match(/"HOST"/)
130
133
  end
131
134
 
135
+ it "configures language in html element" do
136
+ layout_path = "/app/views/layouts/application.html.erb"
137
+ layout_file = IO.read("#{project_path}#{layout_path}")
138
+ expect(layout_file).to match(/<html lang="en">/)
139
+ end
140
+
132
141
  it "configs active job queue adapter" do
133
142
  application_config = IO.read("#{project_path}/config/application.rb")
134
143
  test_config = IO.read("#{project_path}/config/environments/test.rb")
@@ -160,10 +169,9 @@ RSpec.describe "Suspend a new project with default configuration" do
160
169
  it "adds spring to binstubs" do
161
170
  expect(File).to exist("#{project_path}/bin/spring")
162
171
 
163
- spring_line = /^ +load File.expand_path\('\.\.\/spring', __FILE__\)$/
164
172
  bin_stubs = %w(rake rails rspec)
165
173
  bin_stubs.each do |bin_stub|
166
- expect(IO.read("#{project_path}/bin/#{bin_stub}")).to match(spring_line)
174
+ expect(IO.read("#{project_path}/bin/#{bin_stub}")).to match(/spring/)
167
175
  end
168
176
  end
169
177
 
@@ -186,6 +194,10 @@ RSpec.describe "Suspend a new project with default configuration" do
186
194
  expect(File).to exist("#{project_path}/spec/factories.rb")
187
195
  end
188
196
 
197
+ def app_name
198
+ SuspendersTestHelpers::APP_NAME
199
+ end
200
+
189
201
  def analytics_partial
190
202
  IO.read("#{project_path}/app/views/application/_analytics.html.erb")
191
203
  end
@@ -6,6 +6,9 @@ class FakeHeroku
6
6
  end
7
7
 
8
8
  def run!
9
+ if @args.first == "plugins"
10
+ puts "heroku-pipelines@0.29.0"
11
+ end
9
12
  File.open(RECORDER, 'a') do |file|
10
13
  file.puts @args.join(' ')
11
14
  end
@@ -39,6 +42,11 @@ class FakeHeroku
39
42
  commands_ran =~ /^config:add #{var}=.+ --remote #{remote_name}\n/
40
43
  end
41
44
 
45
+ def self.has_setup_pipeline_for?(app_name)
46
+ commands_ran =~ /^pipelines:create #{app_name} -a #{app_name}-staging --stage staging/ &&
47
+ commands_ran =~ /^pipelines:create #{app_name} -a #{app_name}-production --stage production/
48
+ end
49
+
42
50
  def self.commands_ran
43
51
  @commands_ran ||= File.read(RECORDER)
44
52
  end
@@ -35,12 +35,11 @@ group :development, :test do
35
35
  gem "awesome_print"
36
36
  gem "bullet"
37
37
  gem "bundler-audit", require: false
38
- gem "byebug"
39
38
  gem "dotenv-rails"
40
39
  gem "factory_girl_rails"
41
- gem "i18n-tasks"
40
+ gem "pry-byebug"
42
41
  gem "pry-rails"
43
- gem "rspec-rails", "~> 3.3.0"
42
+ gem "rspec-rails", "~> 3.4.0"
44
43
  end
45
44
 
46
45
  group :test do
@@ -0,0 +1,39 @@
1
+ {
2
+ "name":"<%= app_name.dasherize %>",
3
+ "scripts":{},
4
+ "env":{
5
+ "AIRBRAKE_API_KEY":{
6
+ "required":true
7
+ },
8
+ "EMAIL_RECIPIENTS":{
9
+ "required":true
10
+ },
11
+ "RACK_ENV":{
12
+ "required":true
13
+ },
14
+ "RAILS_ENV":{
15
+ "required":true
16
+ },
17
+ "SECRET_KEY_BASE":{
18
+ "generator":"secret"
19
+ },
20
+ "SMTP_ADDRESS":{
21
+ "required":true
22
+ },
23
+ "SMTP_DOMAIN":{
24
+ "required":true
25
+ },
26
+ "SMTP_PASSWORD":{
27
+ "required":true
28
+ },
29
+ "SMTP_USERNAME":{
30
+ "required":true
31
+ },
32
+ "WEB_CONCURRENCY":{
33
+ "required":true
34
+ }
35
+ },
36
+ "addons":[
37
+ "heroku-postgresql"
38
+ ]
39
+ }
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/bin/sh
2
2
 
3
3
  # Set up Rails app. Run this script immediately after cloning the codebase.
4
4
  # https://github.com/thoughtbot/guides/tree/master/protocol
@@ -10,11 +10,6 @@ set -e
10
10
  gem install bundler --conservative
11
11
  bundle check || bundle install
12
12
 
13
- # Set up configurable environment variables
14
- if [ ! -f .env ]; then
15
- cp .sample.env .env
16
- fi
17
-
18
13
  # Set up database and add any development seed data
19
14
  bin/rake dev:prime
20
15
 
@@ -0,0 +1,19 @@
1
+ #!/bin/sh
2
+
3
+ # Run this script to set up a review app's database and worker dyno
4
+
5
+ set -e
6
+
7
+ if [ -z "$1" ]; then
8
+ printf "You must provide a review app (same as the pull request) id.\n"
9
+ exit 64
10
+ fi
11
+
12
+ heroku pg:backups restore \
13
+ `heroku pg:backups public-url -a <%= app_name.dasherize %>-staging` \
14
+ DATABASE_URL \
15
+ --confirm <%= app_name.dasherize %>-staging-pr-$1 \
16
+ --app <%= app_name.dasherize %>-staging-pr-$1
17
+ heroku run rake db:migrate --app <%= app_name.dasherize %>-staging-pr-$1
18
+ heroku ps:scale worker=1 --app <%= app_name.dasherize %>-staging-pr-$1
19
+ heroku restart --app <%= app_name.dasherize %>-staging-pr-$1
@@ -1,6 +1,3 @@
1
- checkout:
2
- post:
3
- - cp .sample.env .env
4
1
  database:
5
2
  override:
6
3
  - bin/setup
@@ -1,6 +1,7 @@
1
1
  # https://github.com/ddollar/forego
2
2
  ASSET_HOST=localhost:3000
3
3
  APPLICATION_HOST=localhost:3000
4
+ PORT=3000
4
5
  RACK_ENV=development
5
6
  SECRET_KEY_BASE=development_secret
6
7
  EXECJS_RUNTIME=Node
@@ -8,3 +9,4 @@ SMTP_ADDRESS=smtp.example.com
8
9
  SMTP_DOMAIN=example.com
9
10
  SMTP_PASSWORD=password
10
11
  SMTP_USERNAME=username
12
+ WEB_CONCURRENCY=1
data/templates/errors.rb CHANGED
@@ -15,7 +15,7 @@ HTTP_ERRORS = [
15
15
  Net::HTTPBadResponse,
16
16
  Net::HTTPHeaderSyntaxError,
17
17
  Net::ProtocolError,
18
- Timeout::Error
18
+ Timeout::Error,
19
19
  ]
20
20
 
21
21
  SMTP_SERVER_ERRORS = [
@@ -23,12 +23,12 @@ SMTP_SERVER_ERRORS = [
23
23
  Net::SMTPAuthenticationError,
24
24
  Net::SMTPServerBusy,
25
25
  Net::SMTPUnknownError,
26
- TimeoutError
26
+ Timeout::Error,
27
27
  ]
28
28
 
29
29
  SMTP_CLIENT_ERRORS = [
30
30
  Net::SMTPFatalError,
31
- Net::SMTPSyntaxError
31
+ Net::SMTPSyntaxError,
32
32
  ]
33
33
 
34
34
  SMTP_ERRORS = SMTP_SERVER_ERRORS + SMTP_CLIENT_ERRORS
data/templates/i18n.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  RSpec.configure do |config|
2
- config.include AbstractController::Translation
2
+ config.include ActionView::Helpers::TranslationHelper
3
3
  end
@@ -3,7 +3,7 @@
3
3
  *.swo
4
4
  *.swp
5
5
  /.bundle
6
- /.env
6
+ /.env.local
7
7
  /coverage/*
8
8
  /db/*.sqlite3
9
9
  /log/*
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="<%= I18n.locale %>">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="ROBOTS" content="NOODP" />
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suspenders
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.34.0
4
+ version: 1.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-15 00:00:00.000000000 Z
11
+ date: 2015-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitters
@@ -116,19 +116,21 @@ files:
116
116
  - templates/_flashes.html.erb
117
117
  - templates/_javascript.html.erb
118
118
  - templates/action_mailer.rb
119
+ - templates/app.json.erb
119
120
  - templates/application.scss
120
121
  - templates/bin_deploy
121
- - templates/bin_setup.erb
122
+ - templates/bin_setup
123
+ - templates/bin_setup_review_app.erb
122
124
  - templates/browserslist
123
125
  - templates/bundler_audit.rake
124
126
  - templates/capybara_webkit.rb
125
127
  - templates/circle.yml.erb
126
- - templates/config_i18n_tasks.yml
127
128
  - templates/config_locales_en.yml.erb
128
129
  - templates/database_cleaner_rspec.rb
129
130
  - templates/dev.rake
130
131
  - templates/disable_xml_params.rb
131
132
  - templates/dotfiles/.ctags
133
+ - templates/dotfiles/.env
132
134
  - templates/errors.rb
133
135
  - templates/factories.rb
134
136
  - templates/factory_girl_rspec.rb
@@ -140,7 +142,6 @@ files:
140
142
  - templates/postgresql_database.yml.erb
141
143
  - templates/puma.rb
142
144
  - templates/rails_helper.rb
143
- - templates/sample.env
144
145
  - templates/secrets.yml
145
146
  - templates/shoulda_matchers_config_rspec.rb
146
147
  - templates/smtp.rb
@@ -161,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
162
  requirements:
162
163
  - - ">="
163
164
  - !ruby/object:Gem::Version
164
- version: 2.2.3
165
+ version: 2.3.0
165
166
  required_rubygems_version: !ruby/object:Gem::Requirement
166
167
  requirements:
167
168
  - - ">="
@@ -169,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
170
  version: '0'
170
171
  requirements: []
171
172
  rubyforge_project:
172
- rubygems_version: 2.4.5.1
173
+ rubygems_version: 2.5.1
173
174
  signing_key:
174
175
  specification_version: 4
175
176
  summary: Generate a Rails app using thoughtbot's best practices.
@@ -1,13 +0,0 @@
1
- search:
2
- paths:
3
- - "app/controllers"
4
- - "app/helpers"
5
- - "app/presenters"
6
- - "app/views"
7
-
8
- ignore_unused:
9
- - activerecord.*
10
- - date.*
11
- - simple_form.*
12
- - time.*
13
- - titles.*