boring_generators 0.13.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +83 -49
  3. data/Gemfile.lock +2 -2
  4. data/README.md +14 -0
  5. data/lib/boring_generators/generator_helper.rb +46 -0
  6. data/lib/boring_generators/version.rb +1 -1
  7. data/lib/generators/boring/active_storage/azure/install/install_generator.rb +1 -1
  8. data/lib/generators/boring/annotate/install/install_generator.rb +52 -0
  9. data/lib/generators/boring/audit/install/install_generator.rb +1 -1
  10. data/lib/generators/boring/avo/install/install_generator.rb +25 -0
  11. data/lib/generators/boring/cancancan/install/install_generator.rb +34 -0
  12. data/lib/generators/boring/ci/gitlab_ci/install/install_generator.rb +120 -0
  13. data/lib/generators/boring/ci/gitlab_ci/install/templates/README +10 -0
  14. data/lib/generators/boring/ci/gitlab_ci/install/templates/capybara_helper.rb.tt +42 -0
  15. data/lib/generators/boring/ci/gitlab_ci/install/templates/ci.yml.tt +94 -0
  16. data/lib/generators/boring/ci/gitlab_ci/install/templates/database.yml.ci.tt +20 -0
  17. data/lib/generators/boring/ci/gitlab_ci/install/templates/system_sample_spec.rb.tt +14 -0
  18. data/lib/generators/boring/ci/gitlab_ci/install/templates/system_sample_test.rb.tt +13 -0
  19. data/lib/generators/boring/ci/gitlab_ci/install/templates/unit_sample_spec.rb.tt +7 -0
  20. data/lib/generators/boring/ci/gitlab_ci/install/templates/unit_sample_test.rb.tt +7 -0
  21. data/lib/generators/boring/devise/doorkeeper/install/install_generator.rb +190 -0
  22. data/lib/generators/boring/devise/install/install_generator.rb +42 -9
  23. data/lib/generators/boring/dotenv/install/install_generator.rb +51 -0
  24. data/lib/generators/boring/dotenv/install/templates/.env +3 -0
  25. data/lib/generators/boring/factory_bot/install/install_generator.rb +1 -1
  26. data/lib/generators/boring/faker/install/install_generator.rb +1 -1
  27. data/lib/generators/boring/favicon/build/build_generator.rb +1 -1
  28. data/lib/generators/boring/figjam/install/install_generator.rb +33 -0
  29. data/lib/generators/boring/honeybadger/install/install_generator.rb +47 -0
  30. data/lib/generators/boring/honeybadger/install/templates/README +6 -0
  31. data/lib/generators/boring/honeybadger/install/templates/honeybadger.yml.tt +26 -0
  32. data/lib/generators/boring/letter_opener/install/install_generator.rb +8 -9
  33. data/lib/generators/boring/oauth/google/install/install_generator.rb +2 -2
  34. data/lib/generators/boring/pronto/base_generator.rb +78 -0
  35. data/lib/generators/boring/pronto/github_action/install/install_generator.rb +27 -0
  36. data/lib/generators/boring/pronto/github_action/install/templates/pronto.yml.tt +53 -0
  37. data/lib/generators/boring/pronto/gitlab_ci/install/install_generator.rb +112 -0
  38. data/lib/generators/boring/pronto/gitlab_ci/install/templates/.gitlab-ci.yml.tt +22 -0
  39. data/lib/generators/boring/pronto/gitlab_ci/install/templates/README +7 -0
  40. data/lib/generators/boring/rack_mini_profiler/install/install_generator.rb +38 -0
  41. data/lib/generators/boring/rails_erd/install/install_generator.rb +35 -0
  42. data/lib/generators/boring/rspec/install/install_generator.rb +1 -1
  43. data/lib/generators/boring/sentry/install/install_generator.rb +48 -0
  44. data/lib/generators/boring/sentry/install/templates/sentry.rb +7 -0
  45. data/lib/generators/boring/vcr/install/install_generator.rb +126 -0
  46. data/lib/generators/boring/vcr/install/templates/rspec/vcr.rb.tt +9 -0
  47. data/lib/generators/boring/webmock/install/install_generator.rb +7 -6
  48. metadata +34 -2
@@ -8,9 +8,9 @@ module Boring
8
8
  def add_letter_opener_gem
9
9
  say "Adding letter_opener gem", :green
10
10
 
11
- gem_content = <<~RUBY
12
- \t# Preview email in the default browser instead of sending it to real mailbox
13
- \tgem "letter_opener"
11
+ gem_content = <<~RUBY.indent(2)
12
+ \n# Preview email in the default browser instead of sending it to real mailbox
13
+ gem "letter_opener"
14
14
  RUBY
15
15
 
16
16
  insert_into_file "Gemfile", gem_content, after: /group :development do/
@@ -23,16 +23,15 @@ module Boring
23
23
  def configure_letter_opener
24
24
  say "Configuring letter_opener", :green
25
25
 
26
- configuration_content = <<~RUBY.chomp
27
- \n\t# Preview email in the browser instead of sending it
28
- \tconfig.action_mailer.delivery_method = :letter_opener
29
- \tconfig.action_mailer.perform_deliveries = true
30
- end
26
+ configuration_content = <<~RUBY.chomp.indent(2)
27
+ \n# Preview email in the browser instead of sending it
28
+ config.action_mailer.delivery_method = :letter_opener
29
+ config.action_mailer.perform_deliveries = true
31
30
  RUBY
32
31
 
33
32
  gsub_file "config/environments/development.rb",
34
33
  /end\Z/,
35
- configuration_content
34
+ "#{configuration_content}\nend"
36
35
  end
37
36
  end
38
37
  end
@@ -14,8 +14,8 @@ module Boring
14
14
  desc "Adds Google OmniAuth to the application"
15
15
  source_root File.expand_path("templates", __dir__)
16
16
 
17
- def add_github_omniauth_gem
18
- say "Adding GitHub OmniAuth gem", :green
17
+ def add_google_omniauth_gem
18
+ say "Adding Google OmniAuth gem", :green
19
19
  Bundler.with_unbundled_env do
20
20
  run "bundle add omniauth-google-oauth2"
21
21
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "boring_generators/generator_helper"
4
+
5
+ module Boring
6
+ module Pronto
7
+ class BaseGenerator < Rails::Generators::Base
8
+ desc "Adds Pronto gem with various extensions"
9
+
10
+ class_option :skip_extensions,
11
+ type: :array,
12
+ aliases: "-se",
13
+ desc:
14
+ "List of extensions to skip. Available options: brakeman, flay, reek, rubocop",
15
+ enum: %w[brakeman flay reek rubocop],
16
+ default: []
17
+
18
+ include BoringGenerators::GeneratorHelper
19
+
20
+ def add_pronto_gems
21
+ say "Adding pronto gems", :green
22
+
23
+ gem_content = <<~RUBY.strip
24
+ #{pronto_gem_content}
25
+ #{pronto_brakemen_gem_content}
26
+ #{pronto_flay_gem_content}
27
+ #{pronto_reek_gem_content}
28
+ #{pronto_rubocop_gem_content}
29
+ RUBY
30
+
31
+ return if gem_content.blank?
32
+
33
+ insert_into_file "Gemfile", "\n#{gem_content}\n"
34
+
35
+ Bundler.with_unbundled_env { run "bundle install" }
36
+ end
37
+
38
+ private
39
+
40
+ def pronto_gem_content
41
+ return if gem_installed?("pronto")
42
+
43
+ <<~RUBY.strip
44
+ # Pronto is a code linter runner that can be used with git and GitHub pull requests
45
+ gem "pronto"
46
+ RUBY
47
+ end
48
+
49
+ def pronto_brakemen_gem_content
50
+ return if options[:skip_extensions].include?("brakeman")
51
+ return if gem_installed?("pronto-brakeman")
52
+
53
+ "gem \"pronto-brakeman\", require: false"
54
+ end
55
+
56
+ def pronto_flay_gem_content
57
+ return if options[:skip_extensions].include?("flay")
58
+ return if gem_installed?("pronto-flay")
59
+
60
+ "gem \"pronto-flay\", require: false"
61
+ end
62
+
63
+ def pronto_reek_gem_content
64
+ return if options[:skip_extensions].include?("reek")
65
+ return if gem_installed?("pronto-reek")
66
+
67
+ "gem \"pronto-reek\", require: false"
68
+ end
69
+
70
+ def pronto_rubocop_gem_content
71
+ return if options[:skip_extensions].include?("rubocop")
72
+ return if gem_installed?("pronto-rubocop")
73
+
74
+ "gem \"pronto-rubocop\", require: false"
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "generators/boring/pronto/base_generator"
4
+ require "boring_generators/generator_helper"
5
+
6
+ module Boring
7
+ module Pronto
8
+ module GithubAction
9
+ class InstallGenerator < Boring::Pronto::BaseGenerator
10
+ desc "Adds Pronto configurations to Github Action"
11
+ source_root File.expand_path("templates", __dir__)
12
+
13
+ class_option :ruby_version, type: :string, aliases: "-rv"
14
+
15
+ include BoringGenerators::GeneratorHelper
16
+
17
+ def add_pronto_configuration_for_github_action
18
+ say "Adding Pronto configurations to .github/workflows/pronto.yml", :green
19
+
20
+ @ruby_version = options.ruby_version || app_ruby_version
21
+
22
+ template("pronto.yml", ".github/workflows/pronto.yml")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,53 @@
1
+ on: [pull_request]
2
+
3
+ name: Pronto
4
+
5
+ jobs:
6
+ pronto:
7
+ runs-on: ubuntu-latest
8
+ permissions:
9
+ contents: read
10
+ pull-requests: write
11
+ statuses: write
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v2
15
+ with:
16
+ fetch-depth: 0
17
+
18
+ - name: Setup Ruby
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: <%= @ruby_version %>
22
+ - name: Ruby gem cache
23
+ uses: actions/cache@v1
24
+ with:
25
+ path: vendor/bundle
26
+ key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
27
+ restore-keys: |
28
+ ${{ runner.os }}-gems-
29
+ - name: Install gems
30
+ run: |
31
+ bundle config path vendor/bundle
32
+ bundle install --jobs 4 --retry 3
33
+
34
+ - name: Setup Node
35
+ uses: actions/setup-node@v1
36
+ with:
37
+ node-version: 10.13.0
38
+ - name: Find yarn cache location
39
+ id: yarn-cache
40
+ run: echo "::set-output name=dir::$(yarn cache dir)"
41
+ - name: JS package cache
42
+ uses: actions/cache@v1
43
+ with:
44
+ path: ${{ steps.yarn-cache.outputs.dir }}
45
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
46
+ restore-keys: |
47
+ ${{ runner.os }}-yarn-
48
+ - name: Install packages
49
+ run: |
50
+ yarn install --pure-lockfile
51
+ - name: Run Pronto
52
+ run: |
53
+ PRONTO_PULL_REQUEST_ID="${{ github.event.pull_request.number }}" PRONTO_GITHUB_ACCESS_TOKEN="${{ github.token }}" bundle exec pronto run -f github_status github_pr -c origin/${{ github.base_ref }}
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "generators/boring/pronto/base_generator"
4
+ require "boring_generators/generator_helper"
5
+
6
+ module Boring
7
+ module Pronto
8
+ module GitlabCi
9
+ class InstallGenerator < Boring::Pronto::BaseGenerator
10
+ desc "Adds Pronto gem with various extensions and configures it for Gitlab CI"
11
+ source_root File.expand_path("templates", __dir__)
12
+
13
+ class_option :ruby_version, type: :string, aliases: "-rv"
14
+
15
+ include BoringGenerators::GeneratorHelper
16
+
17
+ def add_configuration
18
+ @ruby_version = options.ruby_version || app_ruby_version
19
+
20
+ if File.exist?(".gitlab-ci.yml")
21
+ add_pronto_configuration
22
+ add_lint_stage
23
+ show_readme
24
+ else
25
+ create_gitlab_ci_with_pronto
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def create_gitlab_ci_with_pronto
32
+ say "Creating .gitlab-ci.yml with Pronto configurations", :yellow
33
+ template ".gitlab-ci.yml", ".gitlab-ci.yml"
34
+ end
35
+
36
+ def add_pronto_configuration
37
+ return if pronto_configuration_exists?
38
+
39
+ say "Adding Pronto configurations to .gitlab-ci.yml", :green
40
+ inject_into_file ".gitlab-ci.yml", pronto_ci_content, before: /\Z/
41
+ end
42
+
43
+ def add_lint_stage
44
+ return if lint_stage_exists?
45
+
46
+ if stages_exists?
47
+ inject_into_file ".gitlab-ci.yml",
48
+ optimize_indentation("\n- lint", 2).chomp,
49
+ after: /stages:/
50
+ else
51
+ inject_into_file ".gitlab-ci.yml",
52
+ stages_configuration,
53
+ before: /pronto:/
54
+ end
55
+ end
56
+
57
+ def show_readme
58
+ readme "README"
59
+ end
60
+
61
+ def pronto_configuration_exists?
62
+ gitlab_ci_file_content["pronto"]
63
+ end
64
+
65
+ def lint_stage_exists?
66
+ gitlab_ci_file_content["stages"] &&
67
+ gitlab_ci_file_content["stages"].include?("lint")
68
+ end
69
+
70
+ def stages_exists?
71
+ gitlab_ci_file_content["stages"]
72
+ end
73
+
74
+ def gitlab_ci_file_content
75
+ @gitlab_ci_file_content ||=
76
+ YAML.safe_load(File.open(".gitlab-ci.yml"), aliases: true) || {}
77
+ end
78
+
79
+ def pronto_ci_content
80
+ <<~RUBY
81
+ pronto:
82
+ image: ruby:#{@ruby_version}
83
+ stage: lint
84
+ only:
85
+ # run pronto on merge requests and when new changes are pushed to it
86
+ - merge_requests
87
+ variables:
88
+ PRONTO_GITLAB_API_PRIVATE_TOKEN: $PRONTO_ACCESS_TOKEN
89
+ before_script:
90
+ # Install cmake required for rugged gem (Pronto depends on it)
91
+ - apt-get update && apt-get install -y cmake
92
+ # use bundler version same as the one that bundled the Gemfile
93
+ - gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)" --no-document
94
+ - bundle install --jobs $(nproc)
95
+ script:
96
+ # Pronto fails with the error "revspec 'origin/{target_branch}' because Gitlab fetches changes with git depth set to 20 by default. You can remove this line if you update Gitlab CI setting to clone the full project.
97
+ - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
98
+ # Run pronto on branch of current merge request
99
+ - bundle exec pronto run -f gitlab_mr -c origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
100
+ RUBY
101
+ end
102
+
103
+ def stages_configuration
104
+ <<~RUBY
105
+ stages:
106
+ - lint
107
+ RUBY
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,22 @@
1
+ stages:
2
+ - lint
3
+
4
+ pronto:
5
+ image: ruby:<%= @ruby_version %>
6
+ stage: lint
7
+ only:
8
+ # run pronto on merge requests and when new changes are pushed to it
9
+ - merge_requests
10
+ variables:
11
+ PRONTO_GITLAB_API_PRIVATE_TOKEN: $PRONTO_ACCESS_TOKEN
12
+ before_script:
13
+ # Install cmake required for rugged gem (Pronto depends on it)
14
+ - apt-get update && apt-get install -y cmake
15
+ # use bundler version same as the one that bundled the Gemfile
16
+ - gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)" --no-document
17
+ - bundle install --jobs $(nproc)
18
+ script:
19
+ # Pronto fails with the error "revspec 'origin/{target_branch}' because Gitlab fetches changes with git depth set to 20 by default. You can remove this line if you update Gitlab CI setting to clone the full project.
20
+ - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
21
+ # Run pronto on branch of current merge request
22
+ - bundle exec pronto run -f gitlab_mr -c origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
@@ -0,0 +1,7 @@
1
+
2
+ ===============================================================================
3
+
4
+ ❗️❗️
5
+ Pronto needs your Private Gitlab API token for posting comments in the merge request. It is configured as "PRONTO_ACCESS_TOKEN" inside .gitlab-ci.yml, don't forget to configure this variable in your Gitlab Project settings before pushing your new changes to git.
6
+
7
+ ===============================================================================
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
5
+ module Boring
6
+ module RackMiniProfiler
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc "Adds rack-mini-profiler to the application"
11
+
12
+ def add_rack_mini_profiler_gem
13
+ say "Adding rack-mini-profiler gem", :green
14
+
15
+ return if gem_installed?("rack-mini-profiler")
16
+
17
+ rack_mini_profiler_gems_content = <<~RUBY
18
+ \t# Profiler for your Rails application
19
+ \tgem 'rack-mini-profiler', require: false\n
20
+ RUBY
21
+
22
+ insert_into_file "Gemfile",
23
+ rack_mini_profiler_gems_content,
24
+ after: /group :development do\n/
25
+
26
+ Bundler.with_unbundled_env { run "bundle install" }
27
+ end
28
+
29
+ def configure_rack_mini_profiler
30
+ say "Configuring rack mini profiler", :green
31
+
32
+ Bundler.with_unbundled_env do
33
+ run "bundle exec rails g rack_mini_profiler:install"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
5
+ module Boring
6
+ module RailsErd
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc 'Adds rails-erd gem to the app for generating ERD diagrams'
11
+
12
+ def add_rails_erd_gem
13
+ if gem_installed?("rails-erd")
14
+ say "rails-erd is already in the Gemfile, skipping it ...", :yellow
15
+ else
16
+ say "Adding rails-erd gem", :green
17
+ gem_content = <<~RUBY
18
+ \n
19
+ \tgem "rails-erd"
20
+ RUBY
21
+ insert_into_file "Gemfile", gem_content, after: /group :development do/
22
+ bundle_install
23
+ end
24
+ end
25
+
26
+ def configure_rails_erd_gem
27
+ say 'Configuring rails-erd gem', :green
28
+
29
+ Bundler.with_unbundled_env do
30
+ run 'bundle exec rails g erd:install'
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -14,7 +14,7 @@ module Boring
14
14
  def add_rspec_gem
15
15
  log :adding, "rspec-rails"
16
16
  Bundler.with_unbundled_env do
17
- run "bundle add rspec-rails --group='developement,test'"
17
+ run "bundle add rspec-rails --group='development,test'"
18
18
  end
19
19
  end
20
20
 
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Boring
4
+ module Sentry
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+ desc 'Adds Sentry to the app'
8
+
9
+ class_option :use_env_variable, type: :boolean, aliases: '-ev',
10
+ desc: 'Use ENV variable for Sentry. By default Rails credentials will be used.'
11
+ class_option :breadcrumbs_logger, type: :array, aliases: '-bl', default: [:active_support_logger, :http_logger],
12
+ desc: 'Set the breadcrumbs logger. By default [:active_support_logger, :http_logger] will be used.'
13
+
14
+ def add_sentry_gems
15
+ say 'Adding Sentry gem', :green
16
+
17
+ Bundler.with_unbundled_env do
18
+ run 'bundle add sentry-ruby sentry-rails'
19
+ end
20
+ end
21
+
22
+ def configure_sentry_gem
23
+ say 'Configuring Sentry gem', :green
24
+
25
+ @sentry_dsn_key = sentry_dsn_key
26
+ @breadcrumbs_logger_options = options[:breadcrumbs_logger].map(&:to_sym)
27
+
28
+ template 'sentry.rb', 'config/initializers/sentry.rb'
29
+
30
+ show_alert_message
31
+ end
32
+
33
+ private
34
+
35
+ def sentry_dsn_key
36
+ if options[:use_env_variable]
37
+ "ENV['SENTRY_DSN_KEY']"
38
+ else
39
+ "Rails.application.credentials.dig(:sentry, :dsn_key)"
40
+ end
41
+ end
42
+
43
+ def show_alert_message
44
+ say "❗️❗️\nThe DSN key for Sentry will be used from `#{sentry_dsn_key}`. You can change this value if it doesn't match with your app.\n", :yellow
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ Sentry.init do |config|
2
+ config.dsn = <%= @sentry_dsn_key %>
3
+ # enable performance monitoring
4
+ config.enable_tracing = true
5
+ # get breadcrumbs from logs
6
+ config.breadcrumbs_logger = <%= @breadcrumbs_logger_options %>
7
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "boring_generators/generator_helper"
4
+
5
+ module Boring
6
+ module Vcr
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc "Adds VCR to the application"
11
+ source_root File.expand_path("templates", __dir__)
12
+
13
+ class_option :testing_framework,
14
+ type: :string,
15
+ alias: "-tf",
16
+ default: "minitest",
17
+ enum: %w[rspec minitest],
18
+ desc:
19
+ "Tell us which test framework you are using. Defaults to minitest"
20
+
21
+ class_option :stubbing_libraries,
22
+ type: :array,
23
+ alias: "-sl",
24
+ default: ["webmock"],
25
+ enum: %w[webmock typhoeus faraday excon],
26
+ desc:
27
+ "Tell us stubbing library you want to use separated by space. Defaults to webmock"
28
+
29
+ def verify_presence_of_test_helper
30
+ return if rspec? || (minitest? && File.exist?("test/test_helper.rb"))
31
+
32
+ say "We couldn't find test/test_helper.rb. Please configure Minitest and rerun the generator.",
33
+ :red
34
+
35
+ abort
36
+ end
37
+
38
+ def verify_presence_of_rails_helper
39
+ return if minitest? || (rspec? && File.exist?("spec/rails_helper.rb"))
40
+
41
+ say "We couldn't find spec/rails_helper.rb. Please configure RSpec and rerun the generator. Consider running `rails generate boring:rspec:install` to set up RSpec.",
42
+ :red
43
+
44
+ abort
45
+ end
46
+
47
+ def add_vcr_gem
48
+ say "Adding VCR gems to Gemfile", :green
49
+
50
+ check_and_install_gem "vcr", group: :test
51
+ end
52
+
53
+ def add_stubbing_library_gems
54
+ say "Adding stubbing library gems to Gemfile", :green
55
+
56
+ options[:stubbing_libraries].uniq.each do |stubbing_library|
57
+ check_and_install_gem stubbing_library, group: :test
58
+ end
59
+ end
60
+
61
+ def setup_vcr_for_rspec
62
+ return unless rspec?
63
+
64
+ say "Setting up VCR for RSpec", :green
65
+
66
+ @stubbing_libraries = format_stubbing_libraries
67
+
68
+ template("rspec/vcr.rb", "spec/support/vcr.rb")
69
+
70
+ unless all_support_files_are_required?
71
+ inject_into_file "spec/rails_helper.rb",
72
+ "require 'support/vcr'\n\n",
73
+ before: /\A/
74
+ end
75
+ end
76
+
77
+ def setup_vcr_for_minitest
78
+ return unless minitest?
79
+
80
+ say "Setting up VCR for Minitest", :green
81
+
82
+ vcr_config = <<~RUBY
83
+ require "vcr"
84
+
85
+ VCR.configure do |c|
86
+ c.cassette_library_dir = "test/vcr_cassettes"
87
+ c.hook_into #{format_stubbing_libraries}
88
+ c.ignore_localhost = true
89
+ c.allow_http_connections_when_no_cassette = true
90
+ end
91
+ RUBY
92
+
93
+ inject_into_file "test/test_helper.rb", vcr_config, end: /^end\s*\Z/m
94
+ end
95
+
96
+ private
97
+
98
+ def format_stubbing_libraries
99
+ options[:stubbing_libraries]
100
+ .map { |stubbing_library| ":#{stubbing_library}" }
101
+ .join(", ")
102
+ end
103
+
104
+ def rspec?
105
+ options[:testing_framework].to_s == "rspec"
106
+ end
107
+
108
+ def minitest?
109
+ options[:testing_framework].to_s == "minitest"
110
+ end
111
+
112
+ def all_support_files_are_required?
113
+ line_to_check =
114
+ "Rails.root.glob('spec/support/**/*.rb').sort.each { |f| require f }"
115
+ rails_file_content_array = File.readlines("spec/rails_helper.rb")
116
+ rails_file_content_array.any? do |line|
117
+ line !~ /^\s*#/ &&
118
+ (
119
+ line.include?(line_to_check) ||
120
+ line.include?(line_to_check.gsub("'", '"'))
121
+ )
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,9 @@
1
+ require "vcr"
2
+
3
+ VCR.configure do |c|
4
+ c.cassette_library_dir = "spec/vcr_cassettes"
5
+ c.hook_into <%= @stubbing_libraries %>
6
+ c.configure_rspec_metadata!
7
+ c.ignore_localhost = true
8
+ c.allow_http_connections_when_no_cassette = true
9
+ end
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
2
5
  module Boring
3
6
  module Webmock
4
7
  class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
5
10
  desc "Adds webmock gem to the application"
6
11
 
7
12
  SUPPORTED_TEST_FRAMEWORKS = %w[rspec minitest]
8
13
 
9
- # can't use "test_framework" option which would be a good naming for this because it's being used by Rails::Generator::Base. It's better not to have any conflict with the base class so prefixing with "app_" here
14
+ # can't use "test_framework" option which would be a good naming for this because it's being used by Rails::Generator::Base. Rails will override this value if we use test_framework so prefixing with "app_" here
10
15
  class_option :app_test_framework,
11
16
  type: :string,
12
17
  desc: "Tell us the framework you use for writing tests in your application. Supported options are #{SUPPORTED_TEST_FRAMEWORKS}",
@@ -29,11 +34,7 @@ module Boring
29
34
  def add_webmock_gem
30
35
  say "Adding webmock gem", :green
31
36
 
32
- gem "webmock"
33
-
34
- Bundler.with_unbundled_env do
35
- run "bundle install"
36
- end
37
+ check_and_install_gem "webmock", group: :test
37
38
  end
38
39
 
39
40
  def configure_webmock