suspenders 1.52.0 → 1.55.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.standard.yml +2 -0
  4. data/.travis.yml +6 -3
  5. data/CONTRIBUTING.md +15 -15
  6. data/GOALS.md +65 -0
  7. data/Gemfile +1 -1
  8. data/NEWS.md +52 -0
  9. data/README.md +6 -5
  10. data/Rakefile +6 -5
  11. data/docs/heroku_deploy.md +19 -0
  12. data/lib/suspenders.rb +7 -0
  13. data/lib/suspenders/actions.rb +2 -2
  14. data/lib/suspenders/adapters/heroku.rb +27 -14
  15. data/lib/suspenders/app_builder.rb +42 -111
  16. data/lib/suspenders/generators/advisories_generator.rb +15 -0
  17. data/lib/suspenders/generators/analytics_generator.rb +1 -1
  18. data/lib/suspenders/generators/app_generator.rb +36 -58
  19. data/lib/suspenders/generators/base.rb +40 -1
  20. data/lib/suspenders/generators/ci_generator.rb +19 -9
  21. data/lib/suspenders/generators/db_optimizations_generator.rb +5 -17
  22. data/lib/suspenders/generators/factories_generator.rb +2 -2
  23. data/lib/suspenders/generators/forms_generator.rb +1 -1
  24. data/lib/suspenders/generators/inline_svg_generator.rb +14 -0
  25. data/lib/suspenders/generators/jobs_generator.rb +4 -4
  26. data/lib/suspenders/generators/js_driver_generator.rb +7 -4
  27. data/lib/suspenders/generators/json_generator.rb +1 -1
  28. data/lib/suspenders/generators/lint_generator.rb +5 -0
  29. data/lib/suspenders/generators/preloader_generator.rb +122 -0
  30. data/lib/suspenders/generators/production/compression_generator.rb +14 -0
  31. data/lib/suspenders/generators/production/deployment_generator.rb +1 -12
  32. data/lib/suspenders/generators/production/email_generator.rb +9 -12
  33. data/lib/suspenders/generators/production/manifest_generator.rb +8 -7
  34. data/lib/suspenders/generators/production/single_redirect.rb +15 -0
  35. data/lib/suspenders/generators/production/timeout_generator.rb +3 -2
  36. data/lib/suspenders/generators/profiler_generator.rb +35 -0
  37. data/lib/suspenders/generators/runner_generator.rb +48 -0
  38. data/lib/suspenders/generators/staging/pull_requests_generator.rb +4 -12
  39. data/lib/suspenders/generators/static_generator.rb +5 -1
  40. data/lib/suspenders/generators/stylelint_generator.rb +2 -1
  41. data/lib/suspenders/generators/stylesheet_base_generator.rb +7 -8
  42. data/lib/suspenders/generators/testing_generator.rb +3 -14
  43. data/lib/suspenders/version.rb +6 -6
  44. data/spec/adapters/heroku_spec.rb +36 -10
  45. data/spec/expand_json_spec.rb +89 -0
  46. data/spec/fakes/bin/heroku +1 -1
  47. data/spec/fakes/bin/hub +1 -1
  48. data/spec/features/advisories_spec.rb +24 -0
  49. data/spec/features/api_spec.rb +1 -1
  50. data/spec/features/ci_spec.rb +31 -0
  51. data/spec/features/cli_help_spec.rb +4 -4
  52. data/spec/features/db_optimizations_spec.rb +19 -0
  53. data/spec/features/heroku_spec.rb +9 -16
  54. data/spec/features/inline_svg_spec.rb +10 -0
  55. data/spec/features/lint_spec.rb +26 -0
  56. data/spec/features/new_project_spec.rb +40 -60
  57. data/spec/features/preloader_spec.rb +25 -0
  58. data/spec/features/production/compression_spec.rb +23 -0
  59. data/spec/features/production/email_spec.rb +10 -10
  60. data/spec/features/production/manifest_spec.rb +16 -14
  61. data/spec/features/production/single_redirect_spec.rb +25 -0
  62. data/spec/features/profiler_spec.rb +20 -0
  63. data/spec/features/runner_spec.rb +30 -0
  64. data/spec/features/staging/pull_requests_spec.rb +1 -1
  65. data/spec/features/static_spec.rb +17 -0
  66. data/spec/features/stylelint_spec.rb +7 -7
  67. data/spec/spec_helper.rb +3 -3
  68. data/spec/support/contain_json_matcher.rb +16 -10
  69. data/spec/support/fake_github.rb +3 -3
  70. data/spec/support/fake_heroku.rb +8 -8
  71. data/spec/support/project_files.rb +12 -0
  72. data/spec/support/rails_template.rb +1 -0
  73. data/spec/support/suspenders.rb +21 -19
  74. data/suspenders.gemspec +20 -20
  75. data/templates/Gemfile.erb +2 -10
  76. data/templates/_javascript.html.erb +1 -1
  77. data/templates/application.scss +0 -1
  78. data/templates/bin_auto_migrate +5 -0
  79. data/templates/bin_deploy +0 -2
  80. data/templates/bin_setup +2 -2
  81. data/templates/bin_setup_review_app.erb +0 -1
  82. data/templates/capybara_silence_puma.rb +1 -0
  83. data/templates/chromedriver.rb +14 -4
  84. data/templates/descriptions/advisories.md +5 -0
  85. data/templates/descriptions/analytics.md +4 -0
  86. data/templates/descriptions/ci.md +4 -0
  87. data/templates/descriptions/compression.md +4 -0
  88. data/templates/descriptions/db_optimizations.md +2 -0
  89. data/templates/descriptions/deployment.md +5 -0
  90. data/templates/descriptions/email.md +9 -0
  91. data/templates/descriptions/factories.md +12 -0
  92. data/templates/descriptions/force_tls.md +1 -0
  93. data/templates/descriptions/forms.md +1 -0
  94. data/templates/descriptions/inline_svg.md +2 -0
  95. data/templates/descriptions/jobs.md +3 -0
  96. data/templates/descriptions/js_driver.md +4 -0
  97. data/templates/descriptions/json.md +1 -0
  98. data/templates/descriptions/lint.md +3 -0
  99. data/templates/descriptions/manifest.md +2 -0
  100. data/templates/descriptions/preloader.md +3 -0
  101. data/templates/descriptions/profiler.md +7 -0
  102. data/templates/descriptions/pull_requests.md +4 -0
  103. data/templates/descriptions/runner.md +10 -0
  104. data/templates/descriptions/single_redirect.md +1 -0
  105. data/templates/descriptions/static.md +5 -0
  106. data/templates/descriptions/stylelint.md +3 -0
  107. data/templates/descriptions/stylesheet_base.md +4 -0
  108. data/templates/descriptions/testing.md +9 -0
  109. data/templates/descriptions/timeout.md +4 -0
  110. data/templates/descriptions/views.md +8 -0
  111. data/templates/errors.rb +3 -3
  112. data/templates/hound.yml +1 -2
  113. data/templates/inline_svg.rb +3 -0
  114. data/templates/partials/ci_simplecov.rb +14 -0
  115. data/templates/partials/db_optimizations_configuration.rb +7 -0
  116. data/templates/partials/deployment_readme.md +8 -0
  117. data/templates/partials/email_smtp.rb +2 -0
  118. data/templates/partials/profiler_readme.md +8 -0
  119. data/templates/partials/pull_requests_config.rb +4 -0
  120. data/templates/partials/runner_readme.md +31 -0
  121. data/templates/partials/runner_setup.rb +2 -0
  122. data/templates/rack_mini_profiler.rb +2 -0
  123. data/templates/rails_helper.rb +4 -1
  124. data/templates/{dotfiles/.env → sample_env} +0 -2
  125. data/templates/spec_helper.rb +4 -7
  126. data/templates/spring.rb +6 -0
  127. data/templates/suspenders_gitignore +1 -1
  128. metadata +103 -17
  129. data/templates/browserslist +0 -3
  130. data/templates/dotfiles/.ctags +0 -2
  131. data/templates/puma.rb +0 -28
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:production:compression", type: :generator do
4
+ context "generate" do
5
+ it "adds Rack::Deflater to the middleware" do
6
+ with_app { generate("suspenders:production:compression") }
7
+
8
+ expect("config/environments/production.rb").to match_contents(
9
+ %r{config.middleware.use Rack::Deflater}
10
+ )
11
+ end
12
+ end
13
+
14
+ context "destroy" do
15
+ it "removes Rack::Deflater to the middleware" do
16
+ with_app { destroy("suspenders:production:compression") }
17
+
18
+ expect("config/environments/production.rb").not_to match_contents(
19
+ %r{Rack::Deflater}
20
+ )
21
+ end
22
+ end
23
+ end
@@ -15,11 +15,11 @@ RSpec.describe "suspenders:production:email", type: :generator do
15
15
 
16
16
  expect("app.json").to contain_json(
17
17
  env: {
18
- SMTP_ADDRESS: { required: true },
19
- SMTP_DOMAIN: { required: true },
20
- SMTP_PASSWORD: { required: true },
21
- SMTP_USERNAME: { required: true },
22
- },
18
+ SMTP_ADDRESS: {required: true},
19
+ SMTP_DOMAIN: {required: true},
20
+ SMTP_PASSWORD: {required: true},
21
+ SMTP_USERNAME: {required: true}
22
+ }
23
23
  )
24
24
  end
25
25
 
@@ -37,11 +37,11 @@ RSpec.describe "suspenders:production:email", type: :generator do
37
37
 
38
38
  expect("app.json").not_to contain_json(
39
39
  env: {
40
- SMTP_ADDRESS: { required: true },
41
- SMTP_DOMAIN: { required: true },
42
- SMTP_PASSWORD: { required: true },
43
- SMTP_USERNAME: { required: true },
44
- },
40
+ SMTP_ADDRESS: {required: true},
41
+ SMTP_DOMAIN: {required: true},
42
+ SMTP_PASSWORD: {required: true},
43
+ SMTP_USERNAME: {required: true}
44
+ }
45
45
  )
46
46
  end
47
47
  end
@@ -7,13 +7,14 @@ RSpec.describe "suspenders:production:manifest", type: :generator do
7
7
  expect("app.json").to contain_json(
8
8
  name: SuspendersTestHelpers::APP_NAME.dasherize,
9
9
  env: {
10
- APPLICATION_HOST: { required: true },
11
- EMAIL_RECIPIENTS: { required: true },
12
- HEROKU_APP_NAME: { required: true },
13
- HEROKU_PARENT_APP_NAME: { required: true },
14
- RACK_ENV: { required: true },
15
- SECRET_KEY_BASE: { generator: "secret" },
16
- },
10
+ APPLICATION_HOST: {required: true},
11
+ AUTO_MIGRATE_DB: {value: true},
12
+ EMAIL_RECIPIENTS: {required: true},
13
+ HEROKU_APP_NAME: {required: true},
14
+ HEROKU_PARENT_APP_NAME: {required: true},
15
+ RACK_ENV: {required: true},
16
+ SECRET_KEY_BASE: {generator: "secret"}
17
+ }
17
18
  )
18
19
  end
19
20
 
@@ -23,13 +24,14 @@ RSpec.describe "suspenders:production:manifest", type: :generator do
23
24
  expect("app.json").not_to contain_json(
24
25
  name: SuspendersTestHelpers::APP_NAME.dasherize,
25
26
  env: {
26
- APPLICATION_HOST: { required: true },
27
- EMAIL_RECIPIENTS: { required: true },
28
- HEROKU_APP_NAME: { required: true },
29
- HEROKU_PARENT_APP_NAME: { required: true },
30
- RACK_ENV: { required: true },
31
- SECRET_KEY_BASE: { generator: "secret" },
32
- },
27
+ APPLICATION_HOST: {required: true},
28
+ AUTO_MIGRATE_DB: {value: true},
29
+ EMAIL_RECIPIENTS: {required: true},
30
+ HEROKU_APP_NAME: {required: true},
31
+ HEROKU_PARENT_APP_NAME: {required: true},
32
+ RACK_ENV: {required: true},
33
+ SECRET_KEY_BASE: {generator: "secret"}
34
+ }
33
35
  )
34
36
  end
35
37
  end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:production:single_redirect", type: :generator do
4
+ context "generate" do
5
+ it "adds Rack::CanonicalHost to the production middleware" do
6
+ with_app { generate("suspenders:production:single_redirect") }
7
+ middleware_canonical_host = %r{config.middleware.use Rack::CanonicalHost, ENV.fetch\("APPLICATION_HOST"\)}
8
+
9
+ expect("config/environments/production.rb").to match_contents(
10
+ middleware_canonical_host
11
+ )
12
+ end
13
+ end
14
+
15
+ context "destroy" do
16
+ it "removes Rack::CanonicalHost from the production middleware" do
17
+ with_app { destroy("suspenders:production:single_redirect") }
18
+ middleware_canonical_host = %r{config.middleware.use Rack::CanonicalHost, ENV.fetch\("APPLICATION_HOST"\)}
19
+
20
+ expect("config/environments/production.rb").not_to match_contents(
21
+ middleware_canonical_host
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:profiler", type: :generator do
4
+ it "sets up rack-min-profiler" do
5
+ with_app { generate("suspenders:profiler") }
6
+
7
+ expect("config/initializers/rack_mini_profiler.rb").to \
8
+ match_contents(/Rack::MiniProfilerRails.initialize/)
9
+ expect("Gemfile").to match_contents(/rack-mini-profiler/)
10
+ expect(".sample.env").to match_contents(/RACK_MINI_PROFILER=0/)
11
+ end
12
+
13
+ it "removes rack-min-profiler" do
14
+ with_app { destroy("suspenders:profiler") }
15
+
16
+ expect("config/initializers/rack_mini_profiler.rb").not_to exist_as_a_file
17
+ expect("Gemfile").not_to match_contents(/rack-mini-profiler/)
18
+ expect(".sample.env").not_to exist_as_a_file
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:runner", type: :generator do
4
+ it "configures the app for running" do
5
+ with_app { generate("suspenders:runner") }
6
+
7
+ expect("Procfile").to exist_as_a_file
8
+ expect(".sample.env").to exist_as_a_file
9
+ expect("bin/setup").to match_contents(/\.sample\.env/)
10
+ expect("README.md").to match_contents(/\.sample\.env/)
11
+ end
12
+
13
+ it "removes custom app running configuration" do
14
+ with_app { destroy("suspenders:runner") }
15
+
16
+ expect("README.md").not_to match_contents(/\.sample\.env/)
17
+ expect("bin/setup").not_to match_contents(/\.sample\.env/)
18
+ expect(".sample.env").not_to exist_as_a_file
19
+ expect("Procfile").not_to exist_as_a_file
20
+ end
21
+
22
+ it "configures the app with a shell script bin/setup" do
23
+ with_app do
24
+ copy_file "bin_setup", "bin/setup"
25
+ generate("suspenders:runner")
26
+ end
27
+
28
+ expect("bin/setup").to match_contents(/\.sample\.env/)
29
+ end
30
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe "suspenders:staging:pull_requests", type: :generators do
3
+ RSpec.describe "suspenders:staging:pull_requests", type: :generator do
4
4
  it "generates the configuration for Heroku pipeline review apps" do
5
5
  with_app { generate("suspenders:staging:pull_requests") }
6
6
 
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:static", type: :generator do
4
+ it "adds the gem and pages directory" do
5
+ with_app { generate("suspenders:static") }
6
+
7
+ expect("Gemfile").to match_contents(/high_voltage/)
8
+ expect("app/views/pages/.keep").to exist_as_a_file
9
+ end
10
+
11
+ it "removes the gem and pages directory" do
12
+ with_app { destroy("suspenders:static") }
13
+
14
+ expect("app/views/pages/.keep").not_to exist_as_a_file
15
+ expect("Gemfile").not_to match_contents(/high_voltage/)
16
+ end
17
+ end
@@ -5,8 +5,8 @@ RSpec.describe "suspenders:stylelint", type: :generator do
5
5
  it "creates .stylelintrc.json" do
6
6
  with_app { generate("suspenders:stylelint") }
7
7
 
8
- expect(".stylelintrc.json").
9
- to match_contents(%r{"extends": "@thoughtbot/stylelint-config"})
8
+ expect(".stylelintrc.json")
9
+ .to match_contents(%r{"extends": "@thoughtbot/stylelint-config"})
10
10
  end
11
11
 
12
12
  it "adds stylelint and @thoughtbot/stylelint-config to the package.json" do
@@ -21,7 +21,7 @@ RSpec.describe "suspenders:stylelint", type: :generator do
21
21
  with_app { generate("suspenders:stylelint") }
22
22
 
23
23
  expect(".hound.yml").to(
24
- match_contents(/^ config_file: \.stylelintrc\.json/),
24
+ match_contents(/^ config_file: \.stylelintrc\.json/)
25
25
  )
26
26
  end
27
27
  end
@@ -43,8 +43,8 @@ RSpec.describe "suspenders:stylelint", type: :generator do
43
43
  end
44
44
 
45
45
  expect("package.json").not_to match_contents(/stylelint/)
46
- expect("package.json").
47
- not_to match_contents(%r{@thoughtbot/stylelint-config})
46
+ expect("package.json")
47
+ .not_to match_contents(%r{@thoughtbot/stylelint-config})
48
48
  end
49
49
 
50
50
  it "comments in the hound config_file option" do
@@ -53,8 +53,8 @@ RSpec.describe "suspenders:stylelint", type: :generator do
53
53
  destroy("suspenders:stylelint")
54
54
  end
55
55
 
56
- expect(".hound.yml").
57
- to match_contents(/^ # config_file: \.stylelintrc\.json/)
56
+ expect(".hound.yml")
57
+ .to match_contents(/^ # config_file: \.stylelintrc\.json/)
58
58
  end
59
59
  end
60
60
  end
@@ -1,10 +1,10 @@
1
- require 'bundler/setup'
1
+ require "bundler/setup"
2
2
 
3
3
  Bundler.require(:default, :test)
4
4
 
5
- require (Pathname.new(__FILE__).dirname + '../lib/suspenders').expand_path
5
+ require (Pathname.new(__FILE__).dirname + "../lib/suspenders").expand_path
6
6
 
7
- Dir['./spec/support/**/*.rb'].each { |file| require file }
7
+ Dir["./spec/support/**/*.rb"].sort.each { |file| require file }
8
8
 
9
9
  RSpec.configure do |config|
10
10
  config.include SuspendersTestHelpers
@@ -4,21 +4,27 @@ require "json"
4
4
 
5
5
  RSpec::Matchers.define :contain_json do
6
6
  match do
7
- sub_json = expected
8
- filename = actual
7
+ @sub_json = expected
8
+ @filename = actual
9
9
 
10
- filepath = File.join(project_path, filename)
11
- json = JSON.parse(IO.read(filepath), symbolize_names: true)
12
- sub_json <= json
10
+ @filepath = File.join(project_path, @filename)
11
+ @json = JSON.parse(IO.read(@filepath), symbolize_names: true)
12
+
13
+ subhash?(@sub_json, @json)
13
14
  end
14
15
 
15
16
  failure_message do
16
- sub_json = expected
17
- filename = actual
17
+ "in #{@filename}, expected to find\n#{@sub_json.inspect}\n" \
18
+ "in\n#{@json.inspect}"
19
+ end
18
20
 
19
- filepath = File.join(project_path, filename)
20
- json = JSON.parse(IO.read(filepath), symbolize_names: true)
21
+ private
21
22
 
22
- "in #{filename}, expected to find\n#{sub_json.inspect}\nin\n#{json.inspect}"
23
+ def subhash?(inner, outer)
24
+ if inner.is_a?(Hash) && outer.is_a?(Hash)
25
+ inner.all? { |key, value| subhash?(value, outer[key]) }
26
+ else
27
+ inner == outer
28
+ end
23
29
  end
24
30
  end
@@ -1,13 +1,13 @@
1
1
  class FakeGithub
2
- RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'hub_commands'), File.dirname(__FILE__))
2
+ RECORDER = File.expand_path(File.join("..", "..", "tmp", "hub_commands"), File.dirname(__FILE__))
3
3
 
4
4
  def initialize(args)
5
5
  @args = args
6
6
  end
7
7
 
8
8
  def run!
9
- File.open(RECORDER, 'a') do |file|
10
- file.write @args.join(' ')
9
+ File.open(RECORDER, "a") do |file|
10
+ file.write @args.join(" ")
11
11
  end
12
12
  end
13
13
 
@@ -1,5 +1,5 @@
1
1
  class FakeHeroku
2
- RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'heroku_commands'), File.dirname(__FILE__))
2
+ RECORDER = File.expand_path(File.join("..", "..", "tmp", "heroku_commands"), File.dirname(__FILE__))
3
3
 
4
4
  def initialize(args)
5
5
  @args = args
@@ -9,8 +9,8 @@ class FakeHeroku
9
9
  if @args.first == "help"
10
10
  puts "pipelines # manage collections of apps in pipelines"
11
11
  end
12
- File.open(RECORDER, 'a') do |file|
13
- file.puts @args.join(' ')
12
+ File.open(RECORDER, "a") do |file|
13
+ file.puts @args.join(" ")
14
14
  end
15
15
  end
16
16
 
@@ -19,7 +19,7 @@ class FakeHeroku
19
19
  end
20
20
 
21
21
  def self.has_gem_included?(project_path, gem_name)
22
- gemfile = File.open(File.join(project_path, 'Gemfile'), 'a')
22
+ gemfile = File.open(File.join(project_path, "Gemfile"), "a")
23
23
 
24
24
  File.foreach(gemfile).any? do |line|
25
25
  line.match(/#{Regexp.quote(gem_name)}/)
@@ -30,10 +30,10 @@ class FakeHeroku
30
30
  app_name = "#{SuspendersTestHelpers::APP_NAME.dasherize}-#{environment}"
31
31
 
32
32
  command = if flags
33
- "create #{app_name} #{flags} --remote #{environment}\n"
34
- else
35
- "create #{app_name} --remote #{environment}\n"
36
- end
33
+ "create #{app_name} #{flags} --remote #{environment}\n"
34
+ else
35
+ "create #{app_name} --remote #{environment}\n"
36
+ end
37
37
 
38
38
  File.foreach(RECORDER).any? { |line| line == command }
39
39
  end
@@ -10,4 +10,16 @@ module ProjectFiles
10
10
  path = File.join(project_path, filename)
11
11
  FileUtils.rm_rf(path)
12
12
  end
13
+
14
+ def copy_file(from_in_templates, to_in_project)
15
+ destination = File.join(project_path, to_in_project)
16
+ destination_dirname = File.dirname(destination)
17
+
18
+ FileUtils.mkdir_p(destination_dirname)
19
+
20
+ FileUtils.cp(
21
+ File.join(root_path, "templates", from_in_templates),
22
+ destination
23
+ )
24
+ end
13
25
  end
@@ -0,0 +1 @@
1
+ gem "suspenders", path: File.expand_path("../..", __dir__)
@@ -19,10 +19,7 @@ module SuspendersTestHelpers
19
19
  end
20
20
 
21
21
  Dir.chdir(APP_NAME) do
22
- with_env("HOME", tmp_path) do
23
- debug `git add .`
24
- debug `git commit -m 'Initial commit'`
25
- end
22
+ commit_all
26
23
  end
27
24
  end
28
25
  end
@@ -41,18 +38,11 @@ module SuspendersTestHelpers
41
38
  add_fakes_to_path
42
39
 
43
40
  with_revision_for_honeybadger do
44
- debug `#{system_rails_bin} new #{APP_NAME}`
41
+ debug `#{system_rails_bin} new #{APP_NAME} -m #{rails_template_path}`
45
42
  end
46
43
 
47
44
  Dir.chdir(APP_NAME) do
48
- File.open("Gemfile", "a") do |file|
49
- file.puts %{gem "suspenders", path: #{root_path.inspect}}
50
- end
51
-
52
- with_env("HOME", tmp_path) do
53
- debug `git add .`
54
- debug `git commit -m 'Initial commit'`
55
- end
45
+ commit_all
56
46
  end
57
47
  end
58
48
  end
@@ -98,7 +88,7 @@ module SuspendersTestHelpers
98
88
  end
99
89
 
100
90
  def add_fakes_to_path
101
- ENV["PATH"] = "#{support_bin}:#{ENV['PATH']}"
91
+ ENV["PATH"] = "#{support_bin}:#{ENV["PATH"]}"
102
92
  end
103
93
 
104
94
  def project_path
@@ -116,7 +106,7 @@ module SuspendersTestHelpers
116
106
  end
117
107
 
118
108
  def suspenders_bin
119
- File.join(root_path, 'bin', 'suspenders')
109
+ File.join(root_path, "bin", "suspenders")
120
110
  end
121
111
 
122
112
  def system_rails_bin
@@ -132,7 +122,20 @@ module SuspendersTestHelpers
132
122
  end
133
123
 
134
124
  def root_path
135
- File.expand_path('../../../', __FILE__)
125
+ File.expand_path("../../../", __FILE__)
126
+ end
127
+
128
+ def rails_template_path
129
+ File.join(root_path, "spec", "support", "rails_template.rb")
130
+ end
131
+
132
+ def commit_all
133
+ with_env("HOME", tmp_path) do
134
+ debug `git config user.email suspenders@example.com`
135
+ debug `git config user.name "Suspenders Boy"`
136
+ debug `git add .`
137
+ debug `git commit -m 'Initial commit'`
138
+ end
136
139
  end
137
140
 
138
141
  def with_env(name, new_value)
@@ -141,7 +144,6 @@ module SuspendersTestHelpers
141
144
  ENV[name] = new_value.to_s
142
145
 
143
146
  yield
144
-
145
147
  ensure
146
148
  ENV.delete(name)
147
149
 
@@ -158,7 +160,7 @@ module SuspendersTestHelpers
158
160
 
159
161
  def run_in_tmp
160
162
  Dir.chdir(tmp_path) do
161
- Bundler.with_clean_env do
163
+ Bundler.with_unbundled_env do
162
164
  yield
163
165
  end
164
166
  end
@@ -166,7 +168,7 @@ module SuspendersTestHelpers
166
168
 
167
169
  def run_in_project
168
170
  Dir.chdir(project_path) do
169
- Bundler.with_clean_env do
171
+ Bundler.with_unbundled_env do
170
172
  yield
171
173
  end
172
174
  end