boring_generators 0.13.0 → 0.15.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/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