suspenders 1.50.0 → 1.51.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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +2 -3
  4. data/NEWS.md +9 -0
  5. data/README.md +2 -0
  6. data/lib/suspenders.rb +3 -0
  7. data/lib/suspenders/adapters/heroku.rb +0 -4
  8. data/lib/suspenders/app_builder.rb +0 -19
  9. data/lib/suspenders/generators/analytics_generator.rb +2 -7
  10. data/lib/suspenders/generators/app_generator.rb +2 -7
  11. data/lib/suspenders/generators/base.rb +20 -0
  12. data/lib/suspenders/generators/ci_generator.rb +2 -6
  13. data/lib/suspenders/generators/db_optimizations_generator.rb +2 -2
  14. data/lib/suspenders/generators/factories_generator.rb +2 -7
  15. data/lib/suspenders/generators/forms_generator.rb +2 -2
  16. data/lib/suspenders/generators/jobs_generator.rb +2 -12
  17. data/lib/suspenders/generators/js_driver_generator.rb +2 -7
  18. data/lib/suspenders/generators/json_generator.rb +2 -2
  19. data/lib/suspenders/generators/lint_generator.rb +2 -7
  20. data/lib/suspenders/generators/production/deployment_generator.rb +27 -0
  21. data/lib/suspenders/generators/production/email_generator.rb +2 -10
  22. data/lib/suspenders/generators/production/force_tls_generator.rb +2 -5
  23. data/lib/suspenders/generators/production/manifest_generator.rb +24 -0
  24. data/lib/suspenders/generators/production/timeout_generator.rb +2 -2
  25. data/lib/suspenders/generators/staging/pull_requests_generator.rb +2 -16
  26. data/lib/suspenders/generators/static_generator.rb +2 -2
  27. data/lib/suspenders/generators/stylelint_generator.rb +70 -0
  28. data/lib/suspenders/generators/stylesheet_base_generator.rb +4 -8
  29. data/lib/suspenders/generators/testing_generator.rb +2 -7
  30. data/lib/suspenders/generators/views_generator.rb +2 -7
  31. data/lib/suspenders/version.rb +1 -1
  32. data/spec/features/heroku_spec.rb +1 -1
  33. data/spec/features/json_spec.rb +1 -1
  34. data/spec/features/new_project_spec.rb +9 -5
  35. data/spec/features/production/deployment_spec.rb +22 -0
  36. data/spec/features/production/email_spec.rb +1 -1
  37. data/spec/features/production/manifest_spec.rb +35 -0
  38. data/spec/features/staging/pull_requests_spec.rb +1 -1
  39. data/spec/features/stylelint_spec.rb +60 -0
  40. data/spec/spec_helper.rb +1 -0
  41. data/spec/support/be_executable_matcher.rb +7 -0
  42. data/spec/support/generators.rb +5 -0
  43. data/spec/support/project_files.rb +13 -0
  44. data/templates/Gemfile.erb +3 -1
  45. data/templates/hound.yml +3 -1
  46. data/templates/stylelintrc.json +3 -0
  47. metadata +40 -7
  48. data/templates/app.json.erb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8da6287b8db00f55d3055a907f8c8e38b449ef15d3f98c1e898770594a8b9134
4
- data.tar.gz: 54e3a53194b0b996d5971681d44269122bbf181c8d34f1638e2255592dcbf497
3
+ metadata.gz: 8e1d2489344013411f6af7910de4365d8216d3da045e184d399b7f72824194b2
4
+ data.tar.gz: 14b71a11bfed6786699ad314eeefe413b7c9d18da5b4330b44cdb88ff1985be2
5
5
  SHA512:
6
- metadata.gz: 407d7b2087c72518a79276894c1b7c4c7d8ebd9d0d6d5cbbb2f5b068935d1543a976f86bba1314bcf698e4cf1cb54ac279a6c21f0dd5ee485c0f8357f82133f5
7
- data.tar.gz: b1bdb1c214097d96bb793614c822ddc20e090fe4cffc11b71841534c20d0108d03bb9fafaebc905b5b5923a26a5e364a2b6de21c03d41f9e2e523f4be6a4eeab
6
+ metadata.gz: 80ed93205b0fe4c881c4fef3848526a479a062d3c4decde4b52e152bcba74155c57d9625b487d62c77318c3044943dfd4cbee82650869a8295f389cdef0855e4
7
+ data.tar.gz: 12cb587caae5b9ac79b4b0e2f4f647331e93af7e27918031e1271edb9104433da07c2b4452ebab46c9cf07de2ff618eea031c36be459c0eb0db480709d71879f
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.5.3
1
+ 2.6.3
data/.travis.yml CHANGED
@@ -1,13 +1,12 @@
1
1
  language: ruby
2
- rvm: 2.5.3
2
+ rvm: 2.6.3
3
3
  cache: bundler
4
4
  sudo: false
5
5
  before_install:
6
- - "echo '--colour' > ~/.rspec"
7
6
  - git config --global user.name 'Travis CI'
8
7
  - git config --global user.email 'travis-ci@example.com'
9
- - gem install bundler
10
8
  - gem update --system
9
+ - gem install bundler -v '< 2'
11
10
  install: bundle install
12
11
  notifications:
13
12
  email: false
data/NEWS.md CHANGED
@@ -1,3 +1,12 @@
1
+ 1.51.0 (April 26, 2019)
2
+
3
+ * Changed: from sass-rails to sassc-rails.
4
+ * Upgraded: Ruby 2.6.3.
5
+ * Fixed: Avoid installing autoprefixer-rails in api mode
6
+ * New generator: `suspenders:stylelint` for setting up stylelint.
7
+ * New generator: `suspenders:production:manifest` for app.json.
8
+ * New generator: `suspenders:production:deployment` for bin/deploy script.
9
+
1
10
  1.50.0 (December 28, 2018)
2
11
 
3
12
  * Removed: jquery-rails.
data/README.md CHANGED
@@ -101,6 +101,7 @@ Suspenders also comes with:
101
101
  environments
102
102
  * Configuration for [CircleCI][circle] Continuous Integration (tests)
103
103
  * Configuration for [Hound][hound] Continuous Integration (style)
104
+ * Configuration for [stylelint][stylelint]
104
105
  * The analytics adapter [Segment][segment] (and therefore config for Google
105
106
  Analytics, Intercom, Facebook Ads, Twitter Ads, etc.)
106
107
 
@@ -111,6 +112,7 @@ Suspenders also comes with:
111
112
  [i18n]: https://github.com/thoughtbot/suspenders/pull/304
112
113
  [circle]: https://circleci.com/docs
113
114
  [hound]: https://houndci.com
115
+ [stylelint]: https://stylelint.io/
114
116
  [segment]: https://segment.com
115
117
 
116
118
  ## Heroku
data/lib/suspenders.rb CHANGED
@@ -2,6 +2,7 @@ require "suspenders/version"
2
2
  require "suspenders/generators/app_generator"
3
3
  require "suspenders/generators/static_generator"
4
4
  require "suspenders/generators/stylesheet_base_generator"
5
+ require "suspenders/generators/stylelint_generator"
5
6
  require "suspenders/generators/forms_generator"
6
7
  require "suspenders/generators/ci_generator"
7
8
  require "suspenders/generators/db_optimizations_generator"
@@ -16,6 +17,8 @@ require "suspenders/generators/testing_generator"
16
17
  require "suspenders/generators/production/force_tls_generator"
17
18
  require "suspenders/generators/production/email_generator"
18
19
  require "suspenders/generators/production/timeout_generator"
20
+ require "suspenders/generators/production/deployment_generator"
21
+ require "suspenders/generators/production/manifest_generator"
19
22
  require "suspenders/generators/staging/pull_requests_generator"
20
23
  require "suspenders/actions"
21
24
  require "suspenders/adapters/heroku"
@@ -55,10 +55,6 @@ module Suspenders
55
55
  end
56
56
  end
57
57
 
58
- def create_heroku_application_manifest_file
59
- app_builder.template "app.json.erb", "app.json"
60
- end
61
-
62
58
  def create_heroku_pipeline
63
59
  pipelines_plugin = `heroku help | grep pipelines`
64
60
  if pipelines_plugin.empty?
@@ -7,7 +7,6 @@ module Suspenders
7
7
 
8
8
  def_delegators(
9
9
  :heroku_adapter,
10
- :create_heroku_application_manifest_file,
11
10
  :create_heroku_pipeline,
12
11
  :create_production_heroku_app,
13
12
  :create_staging_heroku_app,
@@ -217,24 +216,6 @@ config.public_file_server.headers = {
217
216
  create_production_heroku_app(flags)
218
217
  end
219
218
 
220
- def create_deploy_script
221
- copy_file "bin_deploy", "bin/deploy"
222
-
223
- instructions = <<-MARKDOWN
224
-
225
- ## Deploying
226
-
227
- If you have previously run the `./bin/setup` script,
228
- you can deploy to staging and production with:
229
-
230
- % ./bin/deploy staging
231
- % ./bin/deploy production
232
- MARKDOWN
233
-
234
- append_file "README.md", instructions
235
- run "chmod a+x bin/deploy"
236
- end
237
-
238
219
  def configure_automatic_deployment
239
220
  deploy_command = <<-YML.strip_heredoc
240
221
  deployment:
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class AnalyticsGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class AnalyticsGenerator < Generators::Base
10
5
  def install_partial
11
6
  copy_file "_analytics.html.erb",
12
7
  "app/views/application/_analytics.html.erb"
@@ -55,7 +55,6 @@ module Suspenders
55
55
  invoke :setup_spring
56
56
  invoke :generate_default
57
57
  invoke :setup_default_directories
58
- invoke :create_local_heroku_setup
59
58
  invoke :create_heroku_apps
60
59
  invoke :generate_deployment_default
61
60
  invoke :remove_config_comment_lines
@@ -113,12 +112,6 @@ module Suspenders
113
112
  build :setup_rack_mini_profiler
114
113
  end
115
114
 
116
- def create_local_heroku_setup
117
- say "Creating local Heroku setup"
118
- build :create_deploy_script
119
- build :create_heroku_application_manifest_file
120
- end
121
-
122
115
  def create_heroku_apps
123
116
  if options[:heroku]
124
117
  say "Creating Heroku apps"
@@ -200,6 +193,8 @@ module Suspenders
200
193
  generate("suspenders:production:force_tls")
201
194
  generate("suspenders:production:email")
202
195
  generate("suspenders:production:timeout")
196
+ generate("suspenders:production:deployment")
197
+ generate("suspenders:production:manifest")
203
198
  end
204
199
 
205
200
  def outro
@@ -0,0 +1,20 @@
1
+ require "rails/generators"
2
+ require_relative "../actions"
3
+
4
+ module Suspenders
5
+ module Generators
6
+ class Base < Rails::Generators::Base
7
+ include Suspenders::Actions
8
+
9
+ def self.default_source_root
10
+ File.expand_path(File.join("..", "..", "..", "templates"), __dir__)
11
+ end
12
+
13
+ private
14
+
15
+ def app_name
16
+ Rails.app_class.parent_name.demodulize.underscore.dasherize
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,11 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class CiGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__))
8
-
4
+ class CiGenerator < Generators::Base
9
5
  def simplecov_test_integration
10
6
  inject_into_file "spec/spec_helper.rb", before: 'SimpleCov.start "rails"' do
11
7
  <<-RUBY
@@ -1,7 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class DbOptimizationsGenerator < Rails::Generators::Base
4
+ class DbOptimizationsGenerator < Generators::Base
5
5
  def add_bullet
6
6
  gem "bullet", group: %i(development test)
7
7
  Bundler.with_clean_env { run "bundle install" }
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class FactoriesGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class FactoriesGenerator < Generators::Base
10
5
  def add_factory_bot
11
6
  gem "factory_bot_rails", group: %i(development test)
12
7
  Bundler.with_clean_env { run "bundle install" }
@@ -1,7 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class FormsGenerator < Rails::Generators::Base
4
+ class FormsGenerator < Generators::Base
5
5
  def add_simple_form
6
6
  gem "simple_form"
7
7
  Bundler.with_clean_env { run "bundle install" }
@@ -1,17 +1,7 @@
1
- require "rails/generators"
2
- require_relative "../actions"
1
+ require_relative "base"
3
2
 
4
3
  module Suspenders
5
- class JobsGenerator < Rails::Generators::Base
6
- include Suspenders::Actions
7
-
8
- source_root(
9
- File.expand_path(
10
- File.join("..", "..", "..", "templates"),
11
- File.dirname(__FILE__),
12
- ),
13
- )
14
-
4
+ class JobsGenerator < Generators::Base
15
5
  def add_jobs_gem
16
6
  gem "delayed_job_active_record"
17
7
  Bundler.with_clean_env { run "bundle install" }
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class JsDriverGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class JsDriverGenerator < Generators::Base
10
5
  def add_gems
11
6
  gem "capybara-selenium", group: :test
12
7
  gem "chromedriver-helper", group: :test
@@ -1,7 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class JsonGenerator < Rails::Generators::Base
4
+ class JsonGenerator < Generators::Base
5
5
  def add_oj
6
6
  gem "oj"
7
7
  Bundler.with_clean_env { run "bundle install" }
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class LintGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class LintGenerator < Generators::Base
10
5
  def set_up_hound
11
6
  copy_file "hound.yml", ".hound.yml"
12
7
  end
@@ -0,0 +1,27 @@
1
+ require_relative "../base"
2
+
3
+ module Suspenders
4
+ module Production
5
+ class DeploymentGenerator < Generators::Base
6
+ def copy_script
7
+ copy_file "bin_deploy", "bin/deploy"
8
+ chmod "bin/deploy", 0o755
9
+ end
10
+
11
+ def inform_user
12
+ instructions = <<~MARKDOWN
13
+
14
+ ## Deploying
15
+
16
+ If you have previously run the `./bin/setup` script,
17
+ you can deploy to staging and production with:
18
+
19
+ % ./bin/deploy staging
20
+ % ./bin/deploy production
21
+ MARKDOWN
22
+
23
+ append_file "README.md", instructions
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,16 +1,8 @@
1
- require "rails/generators"
2
- require_relative "../../actions"
1
+ require_relative "../base"
3
2
 
4
3
  module Suspenders
5
4
  module Production
6
- class EmailGenerator < Rails::Generators::Base
7
- include Suspenders::Actions
8
-
9
- source_root File.expand_path(
10
- File.join("..", "..", "..", "..", "templates"),
11
- File.dirname(__FILE__),
12
- )
13
-
5
+ class EmailGenerator < Generators::Base
14
6
  def smtp_configuration
15
7
  copy_file "smtp.rb", "config/smtp.rb"
16
8
 
@@ -1,11 +1,8 @@
1
- require "rails/generators"
2
- require_relative "../../actions"
1
+ require_relative "../base"
3
2
 
4
3
  module Suspenders
5
4
  module Production
6
- class ForceTlsGenerator < Rails::Generators::Base
7
- include Suspenders::Actions
8
-
5
+ class ForceTlsGenerator < Generators::Base
9
6
  def config_enforce_ssl
10
7
  configure_environment "production", "config.force_ssl = true"
11
8
  end
@@ -0,0 +1,24 @@
1
+ require_relative "../base"
2
+
3
+ module Suspenders
4
+ module Production
5
+ class ManifestGenerator < Generators::Base
6
+ def render_manifest
7
+ expand_json(
8
+ "app.json",
9
+ name: app_name.dasherize,
10
+ scripts: {},
11
+ env: {
12
+ APPLICATION_HOST: { required: true },
13
+ EMAIL_RECIPIENTS: { required: true },
14
+ HEROKU_APP_NAME: { required: true },
15
+ HEROKU_PARENT_APP_NAME: { required: true },
16
+ RACK_ENV: { required: true },
17
+ SECRET_KEY_BASE: { generator: "secret" },
18
+ },
19
+ addons: ["heroku-postgresql"],
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,8 @@
1
- require "rails/generators"
1
+ require_relative "../base"
2
2
 
3
3
  module Suspenders
4
4
  module Production
5
- class TimeoutGenerator < Rails::Generators::Base
5
+ class TimeoutGenerator < Generators::Base
6
6
  def add_gem
7
7
  gem "rack-timeout", group: :production
8
8
  end
@@ -1,16 +1,8 @@
1
- require "rails/generators"
2
- require_relative "../../actions"
1
+ require_relative "../base"
3
2
 
4
3
  module Suspenders
5
4
  module Staging
6
- class PullRequestsGenerator < Rails::Generators::Base
7
- include Suspenders::Actions
8
-
9
- source_root File.expand_path(
10
- File.join("..", "..", "..", "..", "templates"),
11
- File.dirname(__FILE__),
12
- )
13
-
5
+ class PullRequestsGenerator < Generators::Base
14
6
  def configure_heroku_staging_pr_pipeline_host
15
7
  config = <<-RUBY
16
8
 
@@ -36,12 +28,6 @@ module Suspenders
36
28
 
37
29
  run "chmod a+x bin/setup_review_app"
38
30
  end
39
-
40
- private
41
-
42
- def app_name
43
- Rails.application.class.parent_name.demodulize.underscore.dasherize
44
- end
45
31
  end
46
32
  end
47
33
  end
@@ -1,7 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class StaticGenerator < Rails::Generators::Base
4
+ class StaticGenerator < Generators::Base
5
5
  def add_high_voltage
6
6
  gem "high_voltage"
7
7
  Bundler.with_clean_env { run "bundle install" }
@@ -0,0 +1,70 @@
1
+ require_relative "base"
2
+
3
+ module Suspenders
4
+ class StylelintGenerator < Generators::Base
5
+ def setup_hound
6
+ action InvokeGenerator.new(self, "suspenders:lint")
7
+ action ToggleComments.new(self, ".hound.yml", /stylelintrc/)
8
+ end
9
+
10
+ def install_stylelint
11
+ dependencies = ["stylelint", "@thoughtbot/stylelint-config"]
12
+ action YarnInstall.new(self, dependencies, "--dev")
13
+ end
14
+
15
+ def copy_stylelint_config
16
+ copy_file "stylelintrc.json", ".stylelintrc.json"
17
+ end
18
+
19
+ class InvokeGenerator
20
+ def initialize(base, generator)
21
+ @base = base
22
+ @generator = generator
23
+ end
24
+
25
+ def invoke!
26
+ @base.invoke @generator
27
+ end
28
+
29
+ def revoke!; end
30
+ end
31
+
32
+ class ToggleComments
33
+ def initialize(base, filename, pattern)
34
+ @base = base
35
+ @filename = filename
36
+ @pattern = pattern
37
+ end
38
+
39
+ def invoke!
40
+ @base.uncomment_lines(@filename, @pattern)
41
+ end
42
+
43
+ def revoke!
44
+ @base.behavior = :invoke
45
+ @base.comment_lines(@filename, @pattern)
46
+ ensure
47
+ @base.behavior = :revoke
48
+ end
49
+ end
50
+
51
+ class YarnInstall
52
+ def initialize(base, dependencies, flags)
53
+ @base = base
54
+ @dependencies = dependencies.join(" ")
55
+ @flags = flags
56
+ end
57
+
58
+ def invoke!
59
+ @base.run "bin/yarn add #{@dependencies} #{@flags}"
60
+ end
61
+
62
+ def revoke!
63
+ @base.behavior = :invoke
64
+ @base.run "bin/yarn remove #{@dependencies}"
65
+ ensure
66
+ @base.behavior = :revoke
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,14 +1,10 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class StylesheetBaseGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__))
8
-
4
+ class StylesheetBaseGenerator < Generators::Base
9
5
  def add_stylesheet_gems
10
- gem "bourbon", "~> 5.0"
11
- gem "neat", "~> 2.1"
6
+ gem "bourbon", ">= 5.0.1"
7
+ gem "neat", ">= 3.0.1"
12
8
  Bundler.with_clean_env { run "bundle install" }
13
9
  end
14
10
 
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class TestingGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class TestingGenerator < Generators::Base
10
5
  def add_testing_gems
11
6
  gem "spring-commands-rspec", group: :development
12
7
  gem "rspec-rails", "~> 3.6", group: %i(development test)
@@ -1,12 +1,7 @@
1
- require "rails/generators"
1
+ require_relative "base"
2
2
 
3
3
  module Suspenders
4
- class ViewsGenerator < Rails::Generators::Base
5
- source_root File.expand_path(
6
- File.join("..", "..", "..", "templates"),
7
- File.dirname(__FILE__),
8
- )
9
-
4
+ class ViewsGenerator < Generators::Base
10
5
  def create_partials_directory
11
6
  empty_directory "app/views/application"
12
7
  end
@@ -4,5 +4,5 @@ module Suspenders
4
4
  read("#{File.dirname(__FILE__)}/../../.ruby-version").
5
5
  strip.
6
6
  freeze
7
- VERSION = "1.50.0".freeze
7
+ VERSION = "1.51.0".freeze
8
8
  end
@@ -30,7 +30,7 @@ RSpec.describe "Heroku" do
30
30
  expect(bin_setup).to match(/^if heroku join --app #{app_name}-production/)
31
31
  expect(bin_setup).to match(/^if heroku join --app #{app_name}-staging/)
32
32
  expect(bin_setup).to match(/^git config heroku.remote staging/)
33
- expect(File.stat(bin_setup_path)).to be_executable
33
+ expect("bin/setup").to be_executable
34
34
 
35
35
  readme = IO.read("#{project_path}/README.md")
36
36
 
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe "suspenders:json" do
3
+ RSpec.describe "suspenders:json", type: :generator do
4
4
  it "generates the Gemfile for JSON parsing" do
5
5
  with_app { generate("suspenders:json") }
6
6
 
@@ -65,9 +65,7 @@ RSpec.describe "Suspend a new project with default configuration" do
65
65
  end
66
66
 
67
67
  it "makes bin/setup executable" do
68
- bin_setup_path = "#{project_path}/bin/setup"
69
-
70
- expect(File.stat(bin_setup_path)).to be_executable
68
+ expect("bin/setup").to be_executable
71
69
  end
72
70
 
73
71
  it "adds support file for action mailer" do
@@ -263,7 +261,7 @@ RSpec.describe "Suspend a new project with default configuration" do
263
261
  expect(bin_setup).to include("heroku ps:scale worker=1 --app $APP_NAME")
264
262
  expect(bin_setup).to include("heroku restart --app $APP_NAME")
265
263
 
266
- expect(File.stat(bin_setup_path)).to be_executable
264
+ expect("bin/setup_review_app").to be_executable
267
265
  end
268
266
 
269
267
  it "creates deploy script" do
@@ -271,7 +269,7 @@ RSpec.describe "Suspend a new project with default configuration" do
271
269
  bin_deploy = IO.read(bin_deploy_path)
272
270
 
273
271
  expect(bin_deploy).to include("heroku run rails db:migrate --exit-code")
274
- expect(File.stat(bin_deploy_path)).to be_executable
272
+ expect("bin/deploy").to be_executable
275
273
  end
276
274
 
277
275
  it "creates heroku application manifest file with application name in it" do
@@ -289,6 +287,12 @@ RSpec.describe "Suspend a new project with default configuration" do
289
287
  expect(gemfile).to match(/high_voltage/)
290
288
  end
291
289
 
290
+ it "adds sassc-rails" do
291
+ gemfile = read_project_file("Gemfile")
292
+
293
+ expect(gemfile).to match(/sassc-rails/)
294
+ end
295
+
292
296
  it "adds and configures bourbon and neat" do
293
297
  gemfile = read_project_file("Gemfile")
294
298
 
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:production:deployment", type: :generator do
4
+ it "generates the configuration for a production deployment" do
5
+ rm "bin/deploy"
6
+
7
+ with_app { generate("suspenders:production:deployment") }
8
+
9
+ expect("bin/deploy").to exist_as_a_file
10
+ expect("bin/deploy").to be_executable
11
+ expect("README.md").to match_contents(%r{bin/deploy})
12
+ end
13
+
14
+ it "destroys the configuration for a production deployment" do
15
+ touch "bin/deploy"
16
+
17
+ with_app { destroy("suspenders:production:deployment") }
18
+
19
+ expect("bin/deploy").not_to exist_as_a_file
20
+ expect("README.md").not_to match_contents(%r{bin/deploy})
21
+ end
22
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe "suspenders:production:email" do
3
+ RSpec.describe "suspenders:production:email", type: :generator do
4
4
  it "generates the configuration for a production email deployment" do
5
5
  with_app { generate("suspenders:production:email") }
6
6
 
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:production:manifest", type: :generator do
4
+ it "generates the manifest for a production build" do
5
+ with_app { generate("suspenders:production:manifest") }
6
+
7
+ expect("app.json").to contain_json(
8
+ name: SuspendersTestHelpers::APP_NAME.dasherize,
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
+ },
17
+ )
18
+ end
19
+
20
+ it "destroys the manifest for a production build" do
21
+ with_app { destroy("suspenders:production:manifest") }
22
+
23
+ expect("app.json").not_to contain_json(
24
+ name: SuspendersTestHelpers::APP_NAME.dasherize,
25
+ 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
+ },
33
+ )
34
+ end
35
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe "suspenders:staging:pull_requests" do
3
+ RSpec.describe "suspenders:staging:pull_requests", type: :generators 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,60 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "suspenders:stylelint", type: :generator do
4
+ context "generate" do
5
+ it "creates .stylelintrc.json" do
6
+ with_app { generate("suspenders:stylelint") }
7
+
8
+ expect(".stylelintrc.json").
9
+ to match_contents(%r{"extends": "@thoughtbot/stylelint-config"})
10
+ end
11
+
12
+ it "adds stylelint and @thoughtbot/stylelint-config to the package.json" do
13
+ with_app { generate("suspenders:stylelint") }
14
+
15
+ expect("package.json").to match_contents(/devDependencies/)
16
+ expect("package.json").to match_contents(/stylelint/)
17
+ expect("package.json").to match_contents(%r{@thoughtbot/stylelint-config})
18
+ end
19
+
20
+ it "uncomments the hound config_file option" do
21
+ with_app { generate("suspenders:stylelint") }
22
+
23
+ expect(".hound.yml").to(
24
+ match_contents(/^ config_file: \.stylelintrc\.json/),
25
+ )
26
+ end
27
+ end
28
+
29
+ context "destroy" do
30
+ it "removes .stylelintrc.json" do
31
+ with_app do
32
+ generate("suspenders:stylelint")
33
+ destroy("suspenders:stylelint")
34
+ end
35
+
36
+ expect(".stylelintrc.json").not_to exist_as_a_file
37
+ end
38
+
39
+ it "removes stylelint and @thoughtbot/stylelint-config from package.json" do
40
+ with_app do
41
+ generate("suspenders:stylelint")
42
+ destroy("suspenders:stylelint")
43
+ end
44
+
45
+ expect("package.json").not_to match_contents(/stylelint/)
46
+ expect("package.json").
47
+ not_to match_contents(%r{@thoughtbot/stylelint-config})
48
+ end
49
+
50
+ it "comments in the hound config_file option" do
51
+ with_app do
52
+ generate("suspenders:stylelint")
53
+ destroy("suspenders:stylelint")
54
+ end
55
+
56
+ expect(".hound.yml").
57
+ to match_contents(/^ # config_file: \.stylelintrc\.json/)
58
+ end
59
+ end
60
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,6 +8,7 @@ Dir['./spec/support/**/*.rb'].each { |file| require file }
8
8
 
9
9
  RSpec.configure do |config|
10
10
  config.include SuspendersTestHelpers
11
+ config.include ProjectFiles
11
12
 
12
13
  config.before(:all) do
13
14
  add_fakes_to_path
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :be_executable do
4
+ match do |filename|
5
+ File.stat(File.join(project_path, filename)).executable?
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ RSpec.configure do |config|
2
+ config.before(:each, type: :generator) do
3
+ remove_project_directory
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module ProjectFiles
2
+ def touch(filename)
3
+ path = File.join(project_path, filename)
4
+ dirname = File.dirname(path)
5
+ FileUtils.mkdir_p(dirname)
6
+ FileUtils.touch(path)
7
+ end
8
+
9
+ def rm(filename)
10
+ path = File.join(project_path, filename)
11
+ FileUtils.rm_rf(path)
12
+ end
13
+ end
@@ -7,14 +7,16 @@ end
7
7
 
8
8
  ruby "<%= Suspenders::RUBY_VERSION %>"
9
9
 
10
+ <% unless options[:api] %>
10
11
  gem "autoprefixer-rails"
12
+ <% end %>
11
13
  gem "honeybadger"
12
14
  gem "pg"
13
15
  gem "puma"
14
16
  gem "rack-canonical-host"
15
17
  gem "rails", "<%= Suspenders::RAILS_VERSION %>"
16
18
  gem "recipient_interceptor"
17
- gem "sass-rails", "~> 5.0"
19
+ gem "sassc-rails"
18
20
  gem "skylight"
19
21
  gem "sprockets", ">= 3.0.0"
20
22
  gem "title"
data/templates/hound.yml CHANGED
@@ -10,5 +10,7 @@ ruby:
10
10
  # config_file: .ruby-style.yml
11
11
  enabled: true
12
12
  scss:
13
- # config_file: .scss-style.yml
13
+ enabled: false
14
+ stylelint:
15
+ # config_file: .stylelintrc.json
14
16
  enabled: true
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "@thoughtbot/stylelint-config"
3
+ }
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.50.0
4
+ version: 1.51.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-28 00:00:00.000000000 Z
11
+ date: 2019-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitters
@@ -85,6 +85,7 @@ files:
85
85
  - lib/suspenders/app_builder.rb
86
86
  - lib/suspenders/generators/analytics_generator.rb
87
87
  - lib/suspenders/generators/app_generator.rb
88
+ - lib/suspenders/generators/base.rb
88
89
  - lib/suspenders/generators/ci_generator.rb
89
90
  - lib/suspenders/generators/db_optimizations_generator.rb
90
91
  - lib/suspenders/generators/factories_generator.rb
@@ -93,11 +94,14 @@ files:
93
94
  - lib/suspenders/generators/js_driver_generator.rb
94
95
  - lib/suspenders/generators/json_generator.rb
95
96
  - lib/suspenders/generators/lint_generator.rb
97
+ - lib/suspenders/generators/production/deployment_generator.rb
96
98
  - lib/suspenders/generators/production/email_generator.rb
97
99
  - lib/suspenders/generators/production/force_tls_generator.rb
100
+ - lib/suspenders/generators/production/manifest_generator.rb
98
101
  - lib/suspenders/generators/production/timeout_generator.rb
99
102
  - lib/suspenders/generators/staging/pull_requests_generator.rb
100
103
  - lib/suspenders/generators/static_generator.rb
104
+ - lib/suspenders/generators/stylelint_generator.rb
101
105
  - lib/suspenders/generators/stylesheet_base_generator.rb
102
106
  - lib/suspenders/generators/testing_generator.rb
103
107
  - lib/suspenders/generators/views_generator.rb
@@ -111,14 +115,20 @@ files:
111
115
  - spec/features/heroku_spec.rb
112
116
  - spec/features/json_spec.rb
113
117
  - spec/features/new_project_spec.rb
118
+ - spec/features/production/deployment_spec.rb
114
119
  - spec/features/production/email_spec.rb
120
+ - spec/features/production/manifest_spec.rb
115
121
  - spec/features/staging/pull_requests_spec.rb
122
+ - spec/features/stylelint_spec.rb
116
123
  - spec/spec_helper.rb
124
+ - spec/support/be_executable_matcher.rb
117
125
  - spec/support/contain_json_matcher.rb
118
126
  - spec/support/exist_as_a_file_matcher.rb
119
127
  - spec/support/fake_github.rb
120
128
  - spec/support/fake_heroku.rb
129
+ - spec/support/generators.rb
121
130
  - spec/support/match_contents_matcher.rb
131
+ - spec/support/project_files.rb
122
132
  - spec/support/suspenders.rb
123
133
  - suspenders.gemspec
124
134
  - templates/Gemfile.erb
@@ -130,7 +140,6 @@ files:
130
140
  - templates/_javascript.html.erb
131
141
  - templates/action_mailer.rb
132
142
  - templates/active_job.rb
133
- - templates/app.json.erb
134
143
  - templates/application.scss
135
144
  - templates/bin_deploy
136
145
  - templates/bin_setup
@@ -159,6 +168,7 @@ files:
159
168
  - templates/shoulda_matchers_config_rspec.rb
160
169
  - templates/smtp.rb
161
170
  - templates/spec_helper.rb
171
+ - templates/stylelintrc.json
162
172
  - templates/suspenders_gitignore
163
173
  - templates/suspenders_layout.html.erb.erb
164
174
  homepage: http://github.com/thoughtbot/suspenders
@@ -174,16 +184,39 @@ required_ruby_version: !ruby/object:Gem::Requirement
174
184
  requirements:
175
185
  - - ">="
176
186
  - !ruby/object:Gem::Version
177
- version: 2.5.3
187
+ version: 2.6.3
178
188
  required_rubygems_version: !ruby/object:Gem::Requirement
179
189
  requirements:
180
190
  - - ">="
181
191
  - !ruby/object:Gem::Version
182
192
  version: 2.7.4
183
193
  requirements: []
184
- rubyforge_project:
185
- rubygems_version: 2.7.6
194
+ rubygems_version: 3.0.3
186
195
  signing_key:
187
196
  specification_version: 4
188
197
  summary: Generate a Rails app using thoughtbot's best practices.
189
- test_files: []
198
+ test_files:
199
+ - spec/adapters/heroku_spec.rb
200
+ - spec/fakes/bin/heroku
201
+ - spec/fakes/bin/hub
202
+ - spec/features/api_spec.rb
203
+ - spec/features/cli_help_spec.rb
204
+ - spec/features/github_spec.rb
205
+ - spec/features/heroku_spec.rb
206
+ - spec/features/json_spec.rb
207
+ - spec/features/new_project_spec.rb
208
+ - spec/features/production/deployment_spec.rb
209
+ - spec/features/production/email_spec.rb
210
+ - spec/features/production/manifest_spec.rb
211
+ - spec/features/staging/pull_requests_spec.rb
212
+ - spec/features/stylelint_spec.rb
213
+ - spec/spec_helper.rb
214
+ - spec/support/be_executable_matcher.rb
215
+ - spec/support/contain_json_matcher.rb
216
+ - spec/support/exist_as_a_file_matcher.rb
217
+ - spec/support/fake_github.rb
218
+ - spec/support/fake_heroku.rb
219
+ - spec/support/generators.rb
220
+ - spec/support/match_contents_matcher.rb
221
+ - spec/support/project_files.rb
222
+ - spec/support/suspenders.rb
@@ -1,27 +0,0 @@
1
- {
2
- "name":"<%= app_name.dasherize %>",
3
- "scripts":{},
4
- "env":{
5
- "APPLICATION_HOST":{
6
- "required":true
7
- },
8
- "EMAIL_RECIPIENTS":{
9
- "required":true
10
- },
11
- "HEROKU_APP_NAME": {
12
- "required":true
13
- },
14
- "HEROKU_PARENT_APP_NAME": {
15
- "required":true
16
- },
17
- "RACK_ENV":{
18
- "required":true
19
- },
20
- "SECRET_KEY_BASE":{
21
- "generator":"secret"
22
- }
23
- },
24
- "addons":[
25
- "heroku-postgresql"
26
- ]
27
- }