suspenders 1.38.1 → 1.39.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 +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/CONTRIBUTING.md +3 -0
- data/NEWS.md +14 -0
- data/README.md +2 -2
- data/USAGE +13 -0
- data/lib/suspenders/adapters/heroku.rb +16 -12
- data/lib/suspenders/app_builder.rb +22 -45
- data/lib/suspenders/generators/app_generator.rb +34 -10
- data/lib/suspenders/generators/static_generator.rb +9 -0
- data/lib/suspenders/version.rb +6 -3
- data/lib/suspenders.rb +1 -0
- data/spec/adapters/heroku_spec.rb +14 -9
- data/spec/features/cli_help_spec.rb +36 -0
- data/spec/features/heroku_spec.rb +8 -28
- data/spec/features/new_project_spec.rb +45 -8
- data/spec/support/suspenders.rb +15 -0
- data/templates/Gemfile.erb +4 -3
- data/templates/suspenders_layout.html.erb.erb +1 -1
- metadata +8 -6
- data/templates/disable_xml_params.rb +0 -1
- data/templates/newrelic.yml.erb +0 -34
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 97fa9283f4c4c9b3af17953372b07bce23918a61
|
|
4
|
+
data.tar.gz: 44a7c216b659711cc01faf8d3db39187d8e92c25
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 81d78836d28a922cf77072c974de05fa6756ce219bfb6a4dceebd1b89431b407127e765f170ee5b50247614d30884167b33b7e0075f5349098c92807a1ed0080
|
|
7
|
+
data.tar.gz: d0c526b0a77295e7839f1c951f189cd759cee325b26c96ae549181fc3315b29bc0ba5d7a68c006d8bbcd17511659a42fd0628a592deeb5f6d0e2e6eb302eec79
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.3.
|
|
1
|
+
2.3.1
|
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
CHANGED
data/NEWS.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
master
|
|
2
|
+
|
|
3
|
+
1.39.0 (May 25, 2016)
|
|
4
|
+
|
|
5
|
+
* Update to Ruby 2.3.1
|
|
6
|
+
* Make new apps "deployable to Heroku" by default.
|
|
7
|
+
* Make the help text returned when running `suspenders -h` Suspenders specific
|
|
8
|
+
* Bugfix: Configure `static_cache_control` in production environment
|
|
9
|
+
* Replace NewRelic with Skylight
|
|
10
|
+
* Drop initializer for disabling XML parser
|
|
11
|
+
* Start moving suspenders features into different Rails Generators
|
|
12
|
+
* Set default `application_host` in Heroku
|
|
13
|
+
* Update the viewport meta tag
|
|
14
|
+
|
|
1
15
|
1.38.1 (April 20, 2016)
|
|
2
16
|
|
|
3
17
|
* Bugfix: add bitters as suspenders’ dependency back.
|
data/README.md
CHANGED
|
@@ -42,7 +42,6 @@ It includes application gems like:
|
|
|
42
42
|
* [Honeybadger](https://honeybadger.io) for exception notification
|
|
43
43
|
* [jQuery Rails](https://github.com/rails/jquery-rails) for jQuery
|
|
44
44
|
* [Neat](https://github.com/thoughtbot/neat) for semantic grids
|
|
45
|
-
* [New Relic RPM](https://github.com/newrelic/rpm) for monitoring performance
|
|
46
45
|
* [Normalize](https://necolas.github.io/normalize.css/) for resetting browser styles
|
|
47
46
|
* [Postgres](https://github.com/ged/ruby-pg) for access to the Postgres database
|
|
48
47
|
* [Rack Canonical Host](https://github.com/tylerhunt/rack-canonical-host) to
|
|
@@ -55,6 +54,7 @@ It includes application gems like:
|
|
|
55
54
|
and patterns based on Bourbon, Neat and Bitters
|
|
56
55
|
* [Simple Form](https://github.com/plataformatec/simple_form) for form markup
|
|
57
56
|
and style
|
|
57
|
+
* [Skylight](https://www.skylight.io/) for monitoring performance
|
|
58
58
|
* [Title](https://github.com/calebthompson/title) for storing titles in
|
|
59
59
|
translations
|
|
60
60
|
* [Puma](https://github.com/puma/puma) to serve HTTP requests
|
|
@@ -144,7 +144,7 @@ You can optionally specify alternate Heroku flags:
|
|
|
144
144
|
|
|
145
145
|
suspenders app \
|
|
146
146
|
--heroku true \
|
|
147
|
-
--heroku-flags "--region eu --addons
|
|
147
|
+
--heroku-flags "--region eu --addons sendgrid,ssl"
|
|
148
148
|
|
|
149
149
|
See all possible Heroku flags:
|
|
150
150
|
|
data/USAGE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Suspenders is a Rails template with thoughtbot standard
|
|
3
|
+
defaults, ready to deploy to Heroku.
|
|
4
|
+
|
|
5
|
+
For full details on the changes we've made compared to
|
|
6
|
+
a vanilla Rails app, check our GitHub project:
|
|
7
|
+
https://github.com/thoughtbot/suspenders
|
|
8
|
+
|
|
9
|
+
Example:
|
|
10
|
+
suspenders ~/Code/weblog
|
|
11
|
+
|
|
12
|
+
This generates a Rails installation in ~/Code/weblog configured
|
|
13
|
+
with our preferred defaults.
|
|
@@ -16,14 +16,6 @@ module Suspenders
|
|
|
16
16
|
app_builder.append_file "bin/setup", remotes
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def set_up_heroku_specific_gems
|
|
20
|
-
app_builder.inject_into_file(
|
|
21
|
-
"Gemfile",
|
|
22
|
-
%{\n\s\sgem "rails_stdout_logging"},
|
|
23
|
-
after: /group :staging, :production do/,
|
|
24
|
-
)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
19
|
def create_staging_heroku_app(flags)
|
|
28
20
|
app_name = heroku_app_name_for("staging")
|
|
29
21
|
|
|
@@ -45,7 +37,7 @@ module Suspenders
|
|
|
45
37
|
end
|
|
46
38
|
end
|
|
47
39
|
|
|
48
|
-
def
|
|
40
|
+
def create_review_apps_setup_script
|
|
49
41
|
app_builder.template(
|
|
50
42
|
"bin_setup_review_app.erb",
|
|
51
43
|
"bin/setup_review_app",
|
|
@@ -54,7 +46,7 @@ module Suspenders
|
|
|
54
46
|
app_builder.run "chmod a+x bin/setup_review_app"
|
|
55
47
|
end
|
|
56
48
|
|
|
57
|
-
def
|
|
49
|
+
def create_heroku_application_manifest_file
|
|
58
50
|
app_builder.template "app.json.erb", "app.json"
|
|
59
51
|
end
|
|
60
52
|
|
|
@@ -65,7 +57,6 @@ module Suspenders
|
|
|
65
57
|
exit 1
|
|
66
58
|
end
|
|
67
59
|
|
|
68
|
-
heroku_app_name = app_builder.app_name.dasherize
|
|
69
60
|
run_toolbelt_command(
|
|
70
61
|
"pipelines:create #{heroku_app_name} \
|
|
71
62
|
-a #{heroku_app_name}-staging --stage staging",
|
|
@@ -88,6 +79,15 @@ module Suspenders
|
|
|
88
79
|
end
|
|
89
80
|
end
|
|
90
81
|
|
|
82
|
+
def set_heroku_application_host
|
|
83
|
+
%w(staging production).each do |environment|
|
|
84
|
+
run_toolbelt_command(
|
|
85
|
+
"config:add APPLICATION_HOST=#{heroku_app_name}-#{environment}.herokuapp.com",
|
|
86
|
+
environment,
|
|
87
|
+
)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
91
|
private
|
|
92
92
|
|
|
93
93
|
attr_reader :app_builder
|
|
@@ -105,8 +105,12 @@ fi
|
|
|
105
105
|
SHELL
|
|
106
106
|
end
|
|
107
107
|
|
|
108
|
+
def heroku_app_name
|
|
109
|
+
app_builder.app_name.dasherize
|
|
110
|
+
end
|
|
111
|
+
|
|
108
112
|
def heroku_app_name_for(environment)
|
|
109
|
-
"#{
|
|
113
|
+
"#{heroku_app_name}-#{environment}"
|
|
110
114
|
end
|
|
111
115
|
|
|
112
116
|
def generate_secret
|
|
@@ -6,15 +6,15 @@ module Suspenders
|
|
|
6
6
|
extend Forwardable
|
|
7
7
|
|
|
8
8
|
def_delegators :heroku_adapter,
|
|
9
|
-
:
|
|
9
|
+
:create_heroku_application_manifest_file,
|
|
10
10
|
:create_heroku_pipeline,
|
|
11
11
|
:create_production_heroku_app,
|
|
12
12
|
:create_staging_heroku_app,
|
|
13
|
-
:
|
|
13
|
+
:create_review_apps_setup_script,
|
|
14
14
|
:set_heroku_rails_secrets,
|
|
15
15
|
:set_heroku_remotes,
|
|
16
|
-
:
|
|
17
|
-
:
|
|
16
|
+
:set_heroku_application_host,
|
|
17
|
+
:set_heroku_serve_static_files
|
|
18
18
|
|
|
19
19
|
def readme
|
|
20
20
|
template 'README.md.erb', 'README.md'
|
|
@@ -36,11 +36,7 @@ module Suspenders
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def raise_on_missing_assets_in_test
|
|
39
|
-
|
|
40
|
-
"config/environments/test.rb",
|
|
41
|
-
"\n config.assets.raise_runtime_errors = true",
|
|
42
|
-
after: "Rails.application.configure do",
|
|
43
|
-
)
|
|
39
|
+
configure_environment "test", "config.assets.raise_runtime_errors = true"
|
|
44
40
|
end
|
|
45
41
|
|
|
46
42
|
def raise_on_delivery_errors
|
|
@@ -128,10 +124,6 @@ module Suspenders
|
|
|
128
124
|
copy_file "hound.yml", ".hound.yml"
|
|
129
125
|
end
|
|
130
126
|
|
|
131
|
-
def configure_newrelic
|
|
132
|
-
template 'newrelic.yml.erb', 'config/newrelic.yml'
|
|
133
|
-
end
|
|
134
|
-
|
|
135
127
|
def configure_smtp
|
|
136
128
|
copy_file 'smtp.rb', 'config/smtp.rb'
|
|
137
129
|
|
|
@@ -150,34 +142,18 @@ module Suspenders
|
|
|
150
142
|
|
|
151
143
|
def enable_rack_canonical_host
|
|
152
144
|
config = <<-RUBY
|
|
153
|
-
|
|
154
|
-
if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
|
|
145
|
+
if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
|
|
155
146
|
ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
|
|
156
147
|
end
|
|
157
148
|
|
|
158
|
-
# Ensure requests are only served from one, canonical host name
|
|
159
149
|
config.middleware.use Rack::CanonicalHost, ENV.fetch("APPLICATION_HOST")
|
|
160
150
|
RUBY
|
|
161
151
|
|
|
162
|
-
|
|
163
|
-
"config/environments/production.rb",
|
|
164
|
-
config,
|
|
165
|
-
after: "Rails.application.configure do",
|
|
166
|
-
)
|
|
152
|
+
configure_environment "production", config
|
|
167
153
|
end
|
|
168
154
|
|
|
169
155
|
def enable_rack_deflater
|
|
170
|
-
config
|
|
171
|
-
|
|
172
|
-
# Enable deflate / gzip compression of controller-generated responses
|
|
173
|
-
config.middleware.use Rack::Deflater
|
|
174
|
-
RUBY
|
|
175
|
-
|
|
176
|
-
inject_into_file(
|
|
177
|
-
"config/environments/production.rb",
|
|
178
|
-
config,
|
|
179
|
-
after: serve_static_files_line
|
|
180
|
-
)
|
|
156
|
+
configure_environment "production", "config.middleware.use Rack::Deflater"
|
|
181
157
|
end
|
|
182
158
|
|
|
183
159
|
def setup_asset_host
|
|
@@ -189,10 +165,9 @@ module Suspenders
|
|
|
189
165
|
"config.assets.version = '1.0'",
|
|
190
166
|
'config.assets.version = (ENV["ASSETS_VERSION"] || "1.0")'
|
|
191
167
|
|
|
192
|
-
|
|
193
|
-
"
|
|
194
|
-
'
|
|
195
|
-
after: serve_static_files_line
|
|
168
|
+
configure_environment(
|
|
169
|
+
"production",
|
|
170
|
+
'config.static_cache_control = "public, max-age=31557600"',
|
|
196
171
|
)
|
|
197
172
|
end
|
|
198
173
|
|
|
@@ -239,6 +214,16 @@ module Suspenders
|
|
|
239
214
|
bundle_command 'exec rake db:create db:migrate'
|
|
240
215
|
end
|
|
241
216
|
|
|
217
|
+
def replace_gemfile(path)
|
|
218
|
+
template 'Gemfile.erb', 'Gemfile', force: true do |content|
|
|
219
|
+
if path
|
|
220
|
+
content.gsub(%r{gem .suspenders.}) { |s| %{#{s}, path: "#{path}"} }
|
|
221
|
+
else
|
|
222
|
+
content
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
242
227
|
def set_ruby_to_version_being_used
|
|
243
228
|
create_file '.ruby-version', "#{Suspenders::RUBY_VERSION}\n"
|
|
244
229
|
end
|
|
@@ -375,7 +360,7 @@ Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i
|
|
|
375
360
|
create_production_heroku_app(flags)
|
|
376
361
|
end
|
|
377
362
|
|
|
378
|
-
def
|
|
363
|
+
def create_deploy_script
|
|
379
364
|
copy_file "bin_deploy", "bin/deploy"
|
|
380
365
|
|
|
381
366
|
instructions = <<-MARKDOWN
|
|
@@ -470,10 +455,6 @@ you can deploy to staging and production with:
|
|
|
470
455
|
"Rails.application.routes.draw do\nend"
|
|
471
456
|
end
|
|
472
457
|
|
|
473
|
-
def disable_xml_params
|
|
474
|
-
copy_file 'disable_xml_params.rb', 'config/initializers/disable_xml_params.rb'
|
|
475
|
-
end
|
|
476
|
-
|
|
477
458
|
def setup_default_rake_task
|
|
478
459
|
append_file 'Rakefile' do
|
|
479
460
|
<<-EOS
|
|
@@ -501,9 +482,5 @@ end
|
|
|
501
482
|
def heroku_adapter
|
|
502
483
|
@heroku_adapter ||= Adapters::Heroku.new(self)
|
|
503
484
|
end
|
|
504
|
-
|
|
505
|
-
def serve_static_files_line
|
|
506
|
-
"config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?\n"
|
|
507
|
-
end
|
|
508
485
|
end
|
|
509
486
|
end
|
|
@@ -3,6 +3,8 @@ require 'rails/generators/rails/app/app_generator'
|
|
|
3
3
|
|
|
4
4
|
module Suspenders
|
|
5
5
|
class AppGenerator < Rails::Generators::AppGenerator
|
|
6
|
+
hide!
|
|
7
|
+
|
|
6
8
|
class_option :database, type: :string, aliases: "-d", default: "postgresql",
|
|
7
9
|
desc: "Configure for selected database (options: #{DATABASES.join("/")})"
|
|
8
10
|
|
|
@@ -24,6 +26,15 @@ module Suspenders
|
|
|
24
26
|
class_option :skip_bundle, type: :boolean, aliases: "-B", default: true,
|
|
25
27
|
desc: "Don't run bundle install"
|
|
26
28
|
|
|
29
|
+
class_option :version, type: :boolean, aliases: "-v", group: :suspenders,
|
|
30
|
+
desc: "Show Suspenders version number and quit"
|
|
31
|
+
|
|
32
|
+
class_option :help, type: :boolean, aliases: '-h', group: :suspenders,
|
|
33
|
+
desc: "Show this help message and quit"
|
|
34
|
+
|
|
35
|
+
class_option :path, type: :string, default: nil,
|
|
36
|
+
desc: "Path to the gem"
|
|
37
|
+
|
|
27
38
|
def finish_template
|
|
28
39
|
invoke :suspenders_customization
|
|
29
40
|
super
|
|
@@ -47,21 +58,19 @@ module Suspenders
|
|
|
47
58
|
invoke :setup_dotfiles
|
|
48
59
|
invoke :setup_git
|
|
49
60
|
invoke :setup_database
|
|
61
|
+
invoke :create_local_heroku_setup
|
|
50
62
|
invoke :create_heroku_apps
|
|
51
63
|
invoke :create_github_repo
|
|
52
64
|
invoke :setup_segment
|
|
53
65
|
invoke :setup_bundler_audit
|
|
54
66
|
invoke :setup_spring
|
|
67
|
+
invoke :generate_default
|
|
55
68
|
invoke :outro
|
|
56
69
|
end
|
|
57
70
|
|
|
58
71
|
def customize_gemfile
|
|
72
|
+
build :replace_gemfile, options[:path]
|
|
59
73
|
build :set_ruby_to_version_being_used
|
|
60
|
-
|
|
61
|
-
if options[:heroku]
|
|
62
|
-
build :set_up_heroku_specific_gems
|
|
63
|
-
end
|
|
64
|
-
|
|
65
74
|
bundle_command 'install'
|
|
66
75
|
build :configure_simple_form
|
|
67
76
|
end
|
|
@@ -109,7 +118,6 @@ module Suspenders
|
|
|
109
118
|
|
|
110
119
|
def setup_production_environment
|
|
111
120
|
say 'Setting up the production environment'
|
|
112
|
-
build :configure_newrelic
|
|
113
121
|
build :configure_smtp
|
|
114
122
|
build :configure_rack_timeout
|
|
115
123
|
build :enable_rack_canonical_host
|
|
@@ -136,7 +144,6 @@ module Suspenders
|
|
|
136
144
|
build :configure_action_mailer
|
|
137
145
|
build :configure_active_job
|
|
138
146
|
build :configure_time_formats
|
|
139
|
-
build :disable_xml_params
|
|
140
147
|
build :setup_default_rake_task
|
|
141
148
|
build :configure_puma
|
|
142
149
|
build :set_up_forego
|
|
@@ -166,17 +173,22 @@ module Suspenders
|
|
|
166
173
|
end
|
|
167
174
|
end
|
|
168
175
|
|
|
176
|
+
def create_local_heroku_setup
|
|
177
|
+
say "Creating local Heroku setup"
|
|
178
|
+
build :create_review_apps_setup_script
|
|
179
|
+
build :create_deploy_script
|
|
180
|
+
build :create_heroku_application_manifest_file
|
|
181
|
+
end
|
|
182
|
+
|
|
169
183
|
def create_heroku_apps
|
|
170
184
|
if options[:heroku]
|
|
171
185
|
say "Creating Heroku apps"
|
|
172
186
|
build :create_heroku_apps, options[:heroku_flags]
|
|
173
|
-
build :provide_review_apps_setup_script
|
|
174
187
|
build :set_heroku_serve_static_files
|
|
175
188
|
build :set_heroku_remotes
|
|
176
189
|
build :set_heroku_rails_secrets
|
|
177
|
-
build :
|
|
190
|
+
build :set_heroku_application_host
|
|
178
191
|
build :create_heroku_pipeline
|
|
179
|
-
build :provide_deploy_script
|
|
180
192
|
build :configure_automatic_deployment
|
|
181
193
|
end
|
|
182
194
|
end
|
|
@@ -233,11 +245,23 @@ module Suspenders
|
|
|
233
245
|
build :remove_routes_comment_lines
|
|
234
246
|
end
|
|
235
247
|
|
|
248
|
+
def generate_default
|
|
249
|
+
run("spring stop")
|
|
250
|
+
|
|
251
|
+
generate("suspenders:static")
|
|
252
|
+
|
|
253
|
+
bundle_command "install"
|
|
254
|
+
end
|
|
255
|
+
|
|
236
256
|
def outro
|
|
237
257
|
say 'Congratulations! You just pulled our suspenders.'
|
|
238
258
|
say honeybadger_outro
|
|
239
259
|
end
|
|
240
260
|
|
|
261
|
+
def self.banner
|
|
262
|
+
"suspenders #{arguments.map(&:usage).join(' ')} [options]"
|
|
263
|
+
end
|
|
264
|
+
|
|
241
265
|
protected
|
|
242
266
|
|
|
243
267
|
def get_builder_class
|
data/lib/suspenders/version.rb
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
module Suspenders
|
|
2
|
-
RAILS_VERSION = "~> 4.2.0"
|
|
3
|
-
RUBY_VERSION = IO.
|
|
4
|
-
|
|
2
|
+
RAILS_VERSION = "~> 4.2.0".freeze
|
|
3
|
+
RUBY_VERSION = IO.
|
|
4
|
+
read("#{File.dirname(__FILE__)}/../../.ruby-version").
|
|
5
|
+
strip.
|
|
6
|
+
freeze
|
|
7
|
+
VERSION = "1.39.0".freeze
|
|
5
8
|
end
|
data/lib/suspenders.rb
CHANGED
|
@@ -16,27 +16,32 @@ module Suspenders
|
|
|
16
16
|
with(setup_file, /heroku join --app #{app_name.dasherize}-staging/)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
it "sets
|
|
19
|
+
it "sets the heroku rails secrets" do
|
|
20
20
|
app_builder = double(app_name: app_name)
|
|
21
|
-
allow(app_builder).to receive(:
|
|
21
|
+
allow(app_builder).to receive(:run)
|
|
22
22
|
|
|
23
|
-
Heroku.new(app_builder).
|
|
23
|
+
Heroku.new(app_builder).set_heroku_rails_secrets
|
|
24
24
|
|
|
25
|
-
expect(app_builder).to
|
|
26
|
-
|
|
25
|
+
expect(app_builder).to(
|
|
26
|
+
have_configured_var("staging", "SECRET_KEY_BASE"),
|
|
27
|
+
)
|
|
28
|
+
expect(app_builder).to(
|
|
29
|
+
have_configured_var("production", "SECRET_KEY_BASE"),
|
|
30
|
+
)
|
|
27
31
|
end
|
|
28
32
|
|
|
29
|
-
it "sets the
|
|
33
|
+
it "sets the application host" do
|
|
30
34
|
app_builder = double(app_name: app_name)
|
|
31
35
|
allow(app_builder).to receive(:run)
|
|
32
36
|
|
|
33
|
-
Heroku.new(app_builder).
|
|
37
|
+
Heroku.new(app_builder).set_heroku_application_host
|
|
34
38
|
|
|
35
39
|
expect(app_builder).to(
|
|
36
|
-
have_configured_var("staging", "
|
|
40
|
+
have_configured_var("staging", "APPLICATION_HOST"),
|
|
37
41
|
)
|
|
42
|
+
|
|
38
43
|
expect(app_builder).to(
|
|
39
|
-
have_configured_var("production", "
|
|
44
|
+
have_configured_var("production", "APPLICATION_HOST"),
|
|
40
45
|
)
|
|
41
46
|
end
|
|
42
47
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
RSpec.describe "Command line help output" do
|
|
4
|
+
let(:help_text) { suspenders_help_command }
|
|
5
|
+
|
|
6
|
+
it "does not contain the default rails usage statement" do
|
|
7
|
+
expect(help_text).not_to include("rails new APP_PATH [options]")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "provides the correct usage statement for suspenders" do
|
|
11
|
+
expect(help_text).to include <<~EOH
|
|
12
|
+
Usage:
|
|
13
|
+
suspenders APP_PATH [options]
|
|
14
|
+
EOH
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "does not contain the default rails group" do
|
|
18
|
+
expect(help_text).not_to include("Rails options:")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "provides help and version usage within the suspenders group" do
|
|
22
|
+
expect(help_text).to include <<~EOH
|
|
23
|
+
Suspenders options:
|
|
24
|
+
-h, [--help], [--no-help] # Show this help message and quit
|
|
25
|
+
-v, [--version], [--no-version] # Show Suspenders version number and quit
|
|
26
|
+
EOH
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "does not show the default extended rails help section" do
|
|
30
|
+
expect(help_text).not_to include("Create suspenders files for app generator.")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "contains the usage statement from the suspenders gem" do
|
|
34
|
+
expect(help_text).to include IO.read(usage_file)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -11,9 +11,6 @@ RSpec.describe "Heroku" do
|
|
|
11
11
|
it "suspends a project for Heroku" do
|
|
12
12
|
app_name = SuspendersTestHelpers::APP_NAME.dasherize
|
|
13
13
|
|
|
14
|
-
expect(FakeHeroku).to(
|
|
15
|
-
have_gem_included(project_path, "rails_stdout_logging"),
|
|
16
|
-
)
|
|
17
14
|
expect(FakeHeroku).to have_created_app_for("staging")
|
|
18
15
|
expect(FakeHeroku).to have_created_app_for("production")
|
|
19
16
|
expect(FakeHeroku).to have_configured_vars("staging", "SECRET_KEY_BASE")
|
|
@@ -21,6 +18,14 @@ RSpec.describe "Heroku" do
|
|
|
21
18
|
"production",
|
|
22
19
|
"SECRET_KEY_BASE",
|
|
23
20
|
)
|
|
21
|
+
expect(FakeHeroku).to have_configured_vars(
|
|
22
|
+
"staging",
|
|
23
|
+
"APPLICATION_HOST",
|
|
24
|
+
)
|
|
25
|
+
expect(FakeHeroku).to have_configured_vars(
|
|
26
|
+
"production",
|
|
27
|
+
"APPLICATION_HOST",
|
|
28
|
+
)
|
|
24
29
|
expect(FakeHeroku).to have_setup_pipeline_for(app_name)
|
|
25
30
|
|
|
26
31
|
bin_setup_path = "#{project_path}/bin/setup"
|
|
@@ -31,20 +36,6 @@ RSpec.describe "Heroku" do
|
|
|
31
36
|
expect(bin_setup).to include("git config heroku.remote staging")
|
|
32
37
|
expect(File.stat(bin_setup_path)).to be_executable
|
|
33
38
|
|
|
34
|
-
bin_setup_path = "#{project_path}/bin/setup_review_app"
|
|
35
|
-
bin_setup = IO.read(bin_setup_path)
|
|
36
|
-
|
|
37
|
-
expect(bin_setup).to include("heroku run rake db:migrate --exit-code --app #{app_name}-staging-pr-$1")
|
|
38
|
-
expect(bin_setup).to include("heroku ps:scale worker=1 --app #{app_name}-staging-pr-$1")
|
|
39
|
-
expect(bin_setup).to include("heroku restart --app #{app_name}-staging-pr-$1")
|
|
40
|
-
expect(File.stat(bin_setup_path)).to be_executable
|
|
41
|
-
|
|
42
|
-
bin_deploy_path = "#{project_path}/bin/deploy"
|
|
43
|
-
bin_deploy = IO.read(bin_deploy_path)
|
|
44
|
-
|
|
45
|
-
expect(bin_deploy).to include("heroku run rake db:migrate --exit-code")
|
|
46
|
-
expect(File.stat(bin_deploy_path)).to be_executable
|
|
47
|
-
|
|
48
39
|
readme = IO.read("#{project_path}/README.md")
|
|
49
40
|
|
|
50
41
|
expect(readme).to include("./bin/deploy staging")
|
|
@@ -61,17 +52,6 @@ RSpec.describe "Heroku" do
|
|
|
61
52
|
- bin/deploy staging
|
|
62
53
|
YML
|
|
63
54
|
end
|
|
64
|
-
|
|
65
|
-
it "adds app.json file" do
|
|
66
|
-
expect(File).to exist("#{project_path}/app.json")
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "includes application name in app.json file" do
|
|
70
|
-
app_json_file = IO.read("#{project_path}/app.json")
|
|
71
|
-
app_name = SuspendersTestHelpers::APP_NAME.dasherize
|
|
72
|
-
|
|
73
|
-
expect(app_json_file).to match(/"name":"#{app_name}"/)
|
|
74
|
-
end
|
|
75
55
|
end
|
|
76
56
|
|
|
77
57
|
context "--heroku with region flag" do
|
|
@@ -92,14 +92,6 @@ RSpec.describe "Suspend a new project with default configuration" do
|
|
|
92
92
|
to exist("#{project_path}/config/initializers/rack_mini_profiler.rb")
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
it "ensures newrelic.yml reads NewRelic license from env" do
|
|
96
|
-
newrelic_file = IO.read("#{project_path}/config/newrelic.yml")
|
|
97
|
-
|
|
98
|
-
expect(newrelic_file).to match(
|
|
99
|
-
/license_key: "<%= ENV\["NEW_RELIC_LICENSE_KEY"\] %>"/
|
|
100
|
-
)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
95
|
it "records pageviews through Segment if ENV variable set" do
|
|
104
96
|
expect(analytics_partial).
|
|
105
97
|
to include(%{<% if ENV["SEGMENT_KEY"] %>})
|
|
@@ -123,6 +115,13 @@ RSpec.describe "Suspend a new project with default configuration" do
|
|
|
123
115
|
)
|
|
124
116
|
end
|
|
125
117
|
|
|
118
|
+
it "configures static_cache_control in production" do
|
|
119
|
+
prod_env_file = IO.read("#{project_path}/config/environments/production.rb")
|
|
120
|
+
expect(prod_env_file).to match(
|
|
121
|
+
/config.static_cache_control = "public, max-age=.+"/,
|
|
122
|
+
)
|
|
123
|
+
end
|
|
124
|
+
|
|
126
125
|
it "raises on missing translations in development and test" do
|
|
127
126
|
%w[development test].each do |environment|
|
|
128
127
|
environment_file =
|
|
@@ -223,10 +222,48 @@ RSpec.describe "Suspend a new project with default configuration" do
|
|
|
223
222
|
expect(File).to exist("#{project_path}/spec/factories.rb")
|
|
224
223
|
end
|
|
225
224
|
|
|
225
|
+
it "creates review apps setup script" do
|
|
226
|
+
bin_setup_path = "#{project_path}/bin/setup_review_app"
|
|
227
|
+
bin_setup = IO.read(bin_setup_path)
|
|
228
|
+
|
|
229
|
+
expect(bin_setup).to include("heroku run rake db:migrate --exit-code "\
|
|
230
|
+
"--app #{app_name.dasherize}-staging-pr-$1")
|
|
231
|
+
expect(bin_setup).to include("heroku ps:scale worker=1 "\
|
|
232
|
+
"--app #{app_name.dasherize}-staging-pr-$1")
|
|
233
|
+
expect(bin_setup).to include("heroku restart "\
|
|
234
|
+
"--app #{app_name.dasherize}-staging-pr-$1")
|
|
235
|
+
expect(File.stat(bin_setup_path)).to be_executable
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "creates deploy script" do
|
|
239
|
+
bin_deploy_path = "#{project_path}/bin/deploy"
|
|
240
|
+
bin_deploy = IO.read(bin_deploy_path)
|
|
241
|
+
|
|
242
|
+
expect(bin_deploy).to include("heroku run rake db:migrate --exit-code")
|
|
243
|
+
expect(File.stat(bin_deploy_path)).to be_executable
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it "creates heroku application manifest file with application name in it" do
|
|
247
|
+
app_json_file = IO.read("#{project_path}/app.json")
|
|
248
|
+
|
|
249
|
+
expect(app_json_file).to match(/"name":"#{app_name.dasherize}"/)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it "sets up heroku specific gems" do
|
|
253
|
+
gemfile_file = IO.read("#{project_path}/Gemfile")
|
|
254
|
+
|
|
255
|
+
expect(gemfile_file).to include %{gem "rails_stdout_logging"}
|
|
256
|
+
end
|
|
257
|
+
|
|
226
258
|
def app_name
|
|
227
259
|
SuspendersTestHelpers::APP_NAME
|
|
228
260
|
end
|
|
229
261
|
|
|
262
|
+
it "adds high_voltage" do
|
|
263
|
+
gemfile = IO.read("#{project_path}/Gemfile")
|
|
264
|
+
expect(gemfile).to match(/high_voltage/)
|
|
265
|
+
end
|
|
266
|
+
|
|
230
267
|
def analytics_partial
|
|
231
268
|
IO.read("#{project_path}/app/views/application/_analytics.html.erb")
|
|
232
269
|
end
|
data/spec/support/suspenders.rb
CHANGED
|
@@ -10,6 +10,7 @@ module SuspendersTestHelpers
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def run_suspenders(arguments = nil)
|
|
13
|
+
arguments = "--path=#{root_path} #{arguments}"
|
|
13
14
|
Dir.chdir(tmp_path) do
|
|
14
15
|
Bundler.with_clean_env do
|
|
15
16
|
add_fakes_to_path
|
|
@@ -20,6 +21,16 @@ module SuspendersTestHelpers
|
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
24
|
+
def suspenders_help_command
|
|
25
|
+
Dir.chdir(tmp_path) do
|
|
26
|
+
Bundler.with_clean_env do
|
|
27
|
+
`
|
|
28
|
+
#{suspenders_bin} -h
|
|
29
|
+
`
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
23
34
|
def setup_app_dependencies
|
|
24
35
|
if File.exist?(project_path)
|
|
25
36
|
Dir.chdir(project_path) do
|
|
@@ -48,6 +59,10 @@ module SuspendersTestHelpers
|
|
|
48
59
|
@project_path ||= Pathname.new("#{tmp_path}/#{APP_NAME}")
|
|
49
60
|
end
|
|
50
61
|
|
|
62
|
+
def usage_file
|
|
63
|
+
@usage_path ||= File.join(root_path, "USAGE")
|
|
64
|
+
end
|
|
65
|
+
|
|
51
66
|
private
|
|
52
67
|
|
|
53
68
|
def tmp_path
|
data/templates/Gemfile.erb
CHANGED
|
@@ -6,11 +6,9 @@ gem "autoprefixer-rails"
|
|
|
6
6
|
gem "bourbon", "5.0.0.beta.5"
|
|
7
7
|
gem "delayed_job_active_record"
|
|
8
8
|
gem "flutie"
|
|
9
|
-
gem "high_voltage"
|
|
10
9
|
gem "honeybadger"
|
|
11
10
|
gem "jquery-rails"
|
|
12
11
|
gem "neat", "~> 1.7.0"
|
|
13
|
-
gem "newrelic_rpm", ">= 3.9.8"
|
|
14
12
|
gem "normalize-rails", "~> 3.0.0"
|
|
15
13
|
gem "pg"
|
|
16
14
|
gem "puma"
|
|
@@ -19,14 +17,15 @@ gem "rails", "<%= Suspenders::RAILS_VERSION %>"
|
|
|
19
17
|
gem "recipient_interceptor"
|
|
20
18
|
gem "sass-rails", "~> 5.0"
|
|
21
19
|
gem "simple_form"
|
|
20
|
+
gem "skylight"
|
|
22
21
|
gem "sprockets", ">= 3.0.0"
|
|
23
22
|
gem "sprockets-es6"
|
|
23
|
+
gem "suspenders"
|
|
24
24
|
gem "title"
|
|
25
25
|
gem "uglifier"
|
|
26
26
|
|
|
27
27
|
group :development do
|
|
28
28
|
gem "quiet_assets"
|
|
29
|
-
gem "refills"
|
|
30
29
|
gem "spring"
|
|
31
30
|
gem "spring-commands-rspec"
|
|
32
31
|
gem "web-console"
|
|
@@ -40,6 +39,7 @@ group :development, :test do
|
|
|
40
39
|
gem "factory_girl_rails"
|
|
41
40
|
gem "pry-byebug"
|
|
42
41
|
gem "pry-rails"
|
|
42
|
+
gem "refills"
|
|
43
43
|
gem "rspec-rails", "~> 3.4.0"
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -60,4 +60,5 @@ end
|
|
|
60
60
|
|
|
61
61
|
group :staging, :production do
|
|
62
62
|
gem "rack-timeout"
|
|
63
|
+
gem "rails_stdout_logging"
|
|
63
64
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="ROBOTS" content="NOODP" />
|
|
6
|
-
<meta name="viewport" content="initial-scale=1" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
|
7
7
|
<%%#
|
|
8
8
|
Configure default and controller-, and view-specific titles in
|
|
9
9
|
config/locales/en.yml. For more see:
|
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.
|
|
4
|
+
version: 1.39.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- thoughtbot
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-06-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bitters
|
|
@@ -88,6 +88,7 @@ files:
|
|
|
88
88
|
- README.md
|
|
89
89
|
- RELEASING.md
|
|
90
90
|
- Rakefile
|
|
91
|
+
- USAGE
|
|
91
92
|
- bin/rake
|
|
92
93
|
- bin/rspec
|
|
93
94
|
- bin/setup
|
|
@@ -97,10 +98,12 @@ files:
|
|
|
97
98
|
- lib/suspenders/adapters/heroku.rb
|
|
98
99
|
- lib/suspenders/app_builder.rb
|
|
99
100
|
- lib/suspenders/generators/app_generator.rb
|
|
101
|
+
- lib/suspenders/generators/static_generator.rb
|
|
100
102
|
- lib/suspenders/version.rb
|
|
101
103
|
- spec/adapters/heroku_spec.rb
|
|
102
104
|
- spec/fakes/bin/heroku
|
|
103
105
|
- spec/fakes/bin/hub
|
|
106
|
+
- spec/features/cli_help_spec.rb
|
|
104
107
|
- spec/features/github_spec.rb
|
|
105
108
|
- spec/features/heroku_spec.rb
|
|
106
109
|
- spec/features/new_project_spec.rb
|
|
@@ -129,7 +132,6 @@ files:
|
|
|
129
132
|
- templates/config_locales_en.yml.erb
|
|
130
133
|
- templates/database_cleaner_rspec.rb
|
|
131
134
|
- templates/dev.rake
|
|
132
|
-
- templates/disable_xml_params.rb
|
|
133
135
|
- templates/dotfiles/.ctags
|
|
134
136
|
- templates/dotfiles/.env
|
|
135
137
|
- templates/errors.rb
|
|
@@ -139,7 +141,6 @@ files:
|
|
|
139
141
|
- templates/hound.yml
|
|
140
142
|
- templates/i18n.rb
|
|
141
143
|
- templates/json_encoding.rb
|
|
142
|
-
- templates/newrelic.yml.erb
|
|
143
144
|
- templates/postgresql_database.yml.erb
|
|
144
145
|
- templates/puma.rb
|
|
145
146
|
- templates/rack_mini_profiler.rb
|
|
@@ -163,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
163
164
|
requirements:
|
|
164
165
|
- - ">="
|
|
165
166
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: 2.3.
|
|
167
|
+
version: 2.3.1
|
|
167
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
169
|
requirements:
|
|
169
170
|
- - ">="
|
|
@@ -171,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
171
172
|
version: '0'
|
|
172
173
|
requirements: []
|
|
173
174
|
rubyforge_project:
|
|
174
|
-
rubygems_version: 2.
|
|
175
|
+
rubygems_version: 2.5.1
|
|
175
176
|
signing_key:
|
|
176
177
|
specification_version: 4
|
|
177
178
|
summary: Generate a Rails app using thoughtbot's best practices.
|
|
@@ -179,6 +180,7 @@ test_files:
|
|
|
179
180
|
- spec/adapters/heroku_spec.rb
|
|
180
181
|
- spec/fakes/bin/heroku
|
|
181
182
|
- spec/fakes/bin/hub
|
|
183
|
+
- spec/features/cli_help_spec.rb
|
|
182
184
|
- spec/features/github_spec.rb
|
|
183
185
|
- spec/features/heroku_spec.rb
|
|
184
186
|
- spec/features/new_project_spec.rb
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::XML)
|
data/templates/newrelic.yml.erb
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
common: &default_settings
|
|
2
|
-
app_name: "<%= app_name %>"
|
|
3
|
-
audit_log:
|
|
4
|
-
enabled: false
|
|
5
|
-
browser_monitoring:
|
|
6
|
-
auto_instrument: true
|
|
7
|
-
capture_params: false
|
|
8
|
-
developer_mode: false
|
|
9
|
-
error_collector:
|
|
10
|
-
capture_source: true
|
|
11
|
-
enabled: true
|
|
12
|
-
ignore_errors: "ActionController::RoutingError,Sinatra::NotFound"
|
|
13
|
-
license_key: "<%%= ENV["NEW_RELIC_LICENSE_KEY"] %>"
|
|
14
|
-
log_level: info
|
|
15
|
-
monitor_mode: true
|
|
16
|
-
transaction_tracer:
|
|
17
|
-
enabled: true
|
|
18
|
-
record_sql: obfuscated
|
|
19
|
-
stack_trace_threshold: 0.500
|
|
20
|
-
transaction_threshold: apdex_f
|
|
21
|
-
development:
|
|
22
|
-
<<: *default_settings
|
|
23
|
-
monitor_mode: false
|
|
24
|
-
developer_mode: true
|
|
25
|
-
test:
|
|
26
|
-
<<: *default_settings
|
|
27
|
-
monitor_mode: false
|
|
28
|
-
production:
|
|
29
|
-
<<: *default_settings
|
|
30
|
-
monitor_mode: true
|
|
31
|
-
staging:
|
|
32
|
-
<<: *default_settings
|
|
33
|
-
app_name: "<%= app_name %> (Staging)"
|
|
34
|
-
monitor_mode: true
|