boring_generators 0.13.0 → 0.14.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -49
  3. data/Gemfile.lock +2 -2
  4. data/README.md +13 -0
  5. data/lib/boring_generators/generator_helper.rb +34 -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/devise/doorkeeper/install/install_generator.rb +190 -0
  13. data/lib/generators/boring/devise/install/install_generator.rb +11 -0
  14. data/lib/generators/boring/dotenv/install/install_generator.rb +51 -0
  15. data/lib/generators/boring/dotenv/install/templates/.env +3 -0
  16. data/lib/generators/boring/factory_bot/install/install_generator.rb +1 -1
  17. data/lib/generators/boring/faker/install/install_generator.rb +1 -1
  18. data/lib/generators/boring/favicon/build/build_generator.rb +1 -1
  19. data/lib/generators/boring/figjam/install/install_generator.rb +33 -0
  20. data/lib/generators/boring/honeybadger/install/install_generator.rb +47 -0
  21. data/lib/generators/boring/honeybadger/install/templates/README +6 -0
  22. data/lib/generators/boring/honeybadger/install/templates/honeybadger.yml.tt +26 -0
  23. data/lib/generators/boring/letter_opener/install/install_generator.rb +8 -9
  24. data/lib/generators/boring/oauth/google/install/install_generator.rb +2 -2
  25. data/lib/generators/boring/pronto/base_generator.rb +78 -0
  26. data/lib/generators/boring/pronto/github_action/install/install_generator.rb +27 -0
  27. data/lib/generators/boring/pronto/github_action/install/templates/pronto.yml.tt +53 -0
  28. data/lib/generators/boring/pronto/gitlab_ci/install/install_generator.rb +112 -0
  29. data/lib/generators/boring/pronto/gitlab_ci/install/templates/.gitlab-ci.yml.tt +22 -0
  30. data/lib/generators/boring/pronto/gitlab_ci/install/templates/README +7 -0
  31. data/lib/generators/boring/rack_mini_profiler/install/install_generator.rb +38 -0
  32. data/lib/generators/boring/rails_erd/install/install_generator.rb +35 -0
  33. data/lib/generators/boring/rspec/install/install_generator.rb +1 -1
  34. data/lib/generators/boring/sentry/install/install_generator.rb +48 -0
  35. data/lib/generators/boring/sentry/install/templates/sentry.rb +7 -0
  36. data/lib/generators/boring/vcr/install/install_generator.rb +125 -0
  37. data/lib/generators/boring/vcr/install/templates/rspec/vcr.rb.tt +8 -0
  38. data/lib/generators/boring/webmock/install/install_generator.rb +6 -5
  39. metadata +25 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3e2cf89c148c10914b919c1f9be41275681aa3ba8eaed7a22df5beb6adbef55
4
- data.tar.gz: '083314c373aeb284b779aba16629fa36cbbeb9f60521161d0f1de081b7c1f99a'
3
+ metadata.gz: d1c4e7578120facf94b1e17cadcb9e62f008ffec728658d650842d19ee931b82
4
+ data.tar.gz: 7a026a5987aec9f8e3ee38dd1218e48908e0df5891fcb0d8e9f91a904f9985f9
5
5
  SHA512:
6
- metadata.gz: a2f943d1a4fdda23f2a1905a3491f11e5aa8adde05371b24f91c20daa3dc7355a4d1a51e9d82243b642c2ddb5e738a5885369b034c79e87f801078186cf645b5
7
- data.tar.gz: 4b1f672d170a27bd8782e423b228a45974ad5c6a2e8262adbfe91a109cc29b10f449d20176c8113201db119363fa3b035ce7707a71365ecfb391ee1a18a77cb8
6
+ metadata.gz: aae856dd9081e7ab70e7d750f585474de515baf8a09c79d0ffef180162aeb1bb5317703ffc0f392ca6bc997ee36775ac1fe5f12e442339a73b5d50ac1df1fa5d
7
+ data.tar.gz: d4cce2e4bf333a907e7ace4fdb56c0218c4832f047aa644f019246fa3504ab6d21c2c49713d95df289d6507c76e9772a80dec965eb2657445d641833a3e69a00
data/CHANGELOG.md CHANGED
@@ -2,81 +2,109 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 0.14.0 (Aug 4th, 2024)
6
+
7
+ - Adds Figjam generator. ([@mausamp][])
8
+ - Adds Pronto Generator with Gitlab CI ([@coolprobn][])
9
+ - Adds Rack Mini Profiler generator. ([@mausamp][])
10
+ - Adds VCR generator. ([@TheZero0-ctrl][])
11
+ - Adds Pronto Generator with Gihub Action. ([@TheZero0-ctrl][])
12
+ - Adds Doorkeeper Generator with Devise. ([@TheZero0-ctrl][])
13
+ - Adds Avo generator. ([@mausamp][])
14
+ - Adds Sentry generator. ([@mausamp][])
15
+ - Adds Dotenv generator. ([@mausamp][])
16
+ - Adds Honeybadger generator. ([@mausamp][])
17
+ - Adds Rails ERD generator. ([@mausamp][])
18
+ - Adds Annotate Generator. ([@TheZero0-ctrl][])
19
+ - Adds CanCanCan generator. ([@TheZero0-ctrl][])
20
+
5
21
  ## 0.13.0 (March 26th, 2024)
6
- * Adds Letter Opener generator. ([@coolprobn][])
7
- * Adds Whenever generator. ([@aadil][])
8
- * Adds Rswag generator. ([@coolprobn][])
9
- * Adds Webmock generator. ([@aadil][])
22
+
23
+ - Adds Letter Opener generator. ([@coolprobn][])
24
+ - Adds Whenever generator. ([@aadil][])
25
+ - Adds Rswag generator. ([@coolprobn][])
26
+ - Adds Webmock generator. ([@aadil][])
10
27
 
11
28
  ## 0.12.0 (May 8th, 2023)
12
- * Adds Flipper generator. ([@abhaynikam][])
13
- * Adds FactoryBot generator. ([@abhaynikam][])
14
- * Adds Faker generator. ([@abhaynikam][])
15
- * Adds RSpec generator. ([@abhaynikam][])
16
- * Update default node-version for GitHub Action generator and fixes PG setup issues. ([@abhaynikam][])
17
- * Updates Bootstrap generator for supporting Bootstrap 5 with popper.js. ([@abhaynikam][])
18
- * Adds Overcommit generator for RuboCop. ([@coolprobn][])
19
- * Updates RuboCop generator to add rubocop-rake extension and support test frameworks ([@coolprobn][])
29
+
30
+ - Adds Flipper generator. ([@abhaynikam][])
31
+ - Adds FactoryBot generator. ([@abhaynikam][])
32
+ - Adds Faker generator. ([@abhaynikam][])
33
+ - Adds RSpec generator. ([@abhaynikam][])
34
+ - Update default node-version for GitHub Action generator and fixes PG setup issues. ([@abhaynikam][])
35
+ - Updates Bootstrap generator for supporting Bootstrap 5 with popper.js. ([@abhaynikam][])
36
+ - Adds Overcommit generator for RuboCop. ([@coolprobn][])
37
+ - Updates RuboCop generator to add rubocop-rake extension and support test frameworks ([@coolprobn][])
20
38
 
21
39
  ## 0.11.0 (June 23rd, 2021)
22
- * Adds Stimulus generator. ([@abhaynikam][])
23
- * Adds Rails Admin generator. ([@abhaynikam][])
24
- * Adds Paper Trail generator. ([@abhaynikam][])
40
+
41
+ - Adds Stimulus generator. ([@abhaynikam][])
42
+ - Adds Rails Admin generator. ([@abhaynikam][])
43
+ - Adds Paper Trail generator. ([@abhaynikam][])
25
44
 
26
45
  ## 0.10.0 (May 26th, 2021)
27
- * Updates Stripe payment generator. ([@abhaynikam][])
28
- * Fixes many generators which install ruby gems to not hardcode gem version. ([@abhaynikam][])
46
+
47
+ - Updates Stripe payment generator. ([@abhaynikam][])
48
+ - Fixes many generators which install ruby gems to not hardcode gem version. ([@abhaynikam][])
29
49
 
30
50
  ## 0.9.0 (April 14th, 2021)
31
- * Adds Ahoy generator. ([@abhaynikam][])
32
- * Adds Stripe payment generator. ([@abhaynikam][])
51
+
52
+ - Adds Ahoy generator. ([@abhaynikam][])
53
+ - Adds Stripe payment generator. ([@abhaynikam][])
33
54
 
34
55
  ## 0.8.0 (February 28th, 2021)
35
- * Adds Devise Google Omniauth generator. ([@abhaynikam][])
36
- * Adds Devise Twitter Omniauth generator. ([@abhaynikam][])
37
- * Adds Twilio generator. ([@abhaynikam][])
56
+
57
+ - Adds Devise Google Omniauth generator. ([@abhaynikam][])
58
+ - Adds Devise Twitter Omniauth generator. ([@abhaynikam][])
59
+ - Adds Twilio generator. ([@abhaynikam][])
38
60
 
39
61
  ## 0.7.0 (January 30th, 2021)
40
- * Upgrade the Tailwind CSS generator to support Tailwind V2.0. ([@abhaynikam][])
41
- * Adds Devise GitHub Omniauth generator. ([@abhaynikam][])
62
+
63
+ - Upgrade the Tailwind CSS generator to support Tailwind V2.0. ([@abhaynikam][])
64
+ - Adds Devise GitHub Omniauth generator. ([@abhaynikam][])
42
65
 
43
66
  ## 0.6.0 (January 10th, 2021)
44
- * Updates default ruby version of GitHub Actions install generator. ([@jamesglover][])
45
- * Simplify generated GitHub Actions install ([@jamesglover][])
46
- * Adds boring generator CLI ([@luathn][])
47
- * Adds Devise Facebook Omniauth generator. ([@abhaynikam][])
67
+
68
+ - Updates default ruby version of GitHub Actions install generator. ([@jamesglover][])
69
+ - Simplify generated GitHub Actions install ([@jamesglover][])
70
+ - Adds boring generator CLI ([@luathn][])
71
+ - Adds Devise Facebook Omniauth generator. ([@abhaynikam][])
48
72
 
49
73
  ## 0.5.0 (December 20th, 2020)
50
- * Adds favicon build generator. ([@abhaynikam][])
51
- * Adds Pundit install generator. ([@CiTroNaK][])
52
- * Adds GraphQL generator. ([@abhaynikam][])
53
- * Adds SimpleForm generator. ([@abhaynikam][])
54
- * Adds Devise generator. ([@abhaynikam][])
74
+
75
+ - Adds favicon build generator. ([@abhaynikam][])
76
+ - Adds Pundit install generator. ([@CiTroNaK][])
77
+ - Adds GraphQL generator. ([@abhaynikam][])
78
+ - Adds SimpleForm generator. ([@abhaynikam][])
79
+ - Adds Devise generator. ([@abhaynikam][])
55
80
 
56
81
  ## 0.4.0 (October 23rd, 2020)
57
- * Adds CircleCI install generator. ([@abhaynikam][])
58
- * Adds GitHub Actions install generator. ([@abhaynikam][])
59
- * Adds Travis CI install generator. ([@abhaynikam][])
60
- * Adds Rubocop install generator. ([@abhaynikam][])
82
+
83
+ - Adds CircleCI install generator. ([@abhaynikam][])
84
+ - Adds GitHub Actions install generator. ([@abhaynikam][])
85
+ - Adds Travis CI install generator. ([@abhaynikam][])
86
+ - Adds Rubocop install generator. ([@abhaynikam][])
61
87
 
62
88
  ## 0.3.0 (September 19th, 2020)
63
- * Adds Bullet install generator. ([@abhaynikam][])
64
- * Adds Audit gems(bundler-audit, ruby_audit) install generator. ([@abhaynikam][])
65
- * Adds Pry install generator. ([@abhaynikam][])
66
- * Adds Active Storage Google install generator. ([@abhaynikam][])
67
- * Adds Active Storage AWS install generator. ([@abhaynikam][])
68
- * Adds Active Storage Microsoft Azure install generator. ([@abhaynikam][])
89
+
90
+ - Adds Bullet install generator. ([@abhaynikam][])
91
+ - Adds Audit gems(bundler-audit, ruby_audit) install generator. ([@abhaynikam][])
92
+ - Adds Pry install generator. ([@abhaynikam][])
93
+ - Adds Active Storage Google install generator. ([@abhaynikam][])
94
+ - Adds Active Storage AWS install generator. ([@abhaynikam][])
95
+ - Adds Active Storage Microsoft Azure install generator. ([@abhaynikam][])
69
96
 
70
97
  ## 0.2.0 (September 16th, 2020)
71
- * Adds JQuery install generator. ([@abhaynikam][])
72
- * Adds Bootstrap install generator. ([@abhaynikam][])
73
- * Adds FontAwesome install generator via Yarn. ([@abhaynikam][])
74
- * Adds FontAwesome install generator via RubyGems. ([@abhaynikam][])
98
+
99
+ - Adds JQuery install generator. ([@abhaynikam][])
100
+ - Adds Bootstrap install generator. ([@abhaynikam][])
101
+ - Adds FontAwesome install generator via Yarn. ([@abhaynikam][])
102
+ - Adds FontAwesome install generator via RubyGems. ([@abhaynikam][])
75
103
 
76
104
  ## 0.1.0 (September 5th, 2020)
77
105
 
78
- * Adds Tailwind CSS install generator. ([@abhaynikam][])
79
- * Initial release. ([@abhaynikam][])
106
+ - Adds Tailwind CSS install generator. ([@abhaynikam][])
107
+ - Initial release. ([@abhaynikam][])
80
108
 
81
109
  [@abhaynikam]: https://github.com/abhaynikam
82
110
  [@CiTroNaK]: https://github.com/CiTroNaK
@@ -84,3 +112,5 @@
84
112
  [@luathn]: https://github.com/luathn
85
113
  [@coolprobn]: https://github.com/coolprobn
86
114
  [@aadil]: https://github.com/AdilRT
115
+ [@mausamp]: https://github.com/mausamp
116
+ [@TheZero0-ctrl]: https://github.com/TheZero0-ctrl
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- boring_generators (0.12.0)
4
+ boring_generators (0.13.0)
5
5
  railties
6
6
 
7
7
  GEM
@@ -143,4 +143,4 @@ DEPENDENCIES
143
143
  sqlite3 (~> 1.4)
144
144
 
145
145
  BUNDLED WITH
146
- 2.1.4
146
+ 2.2.33
data/README.md CHANGED
@@ -84,6 +84,19 @@ The boring generator introduces following generators:
84
84
  - Install Whenever: `rails generate boring:whenever:install`
85
85
  - Install Rswag: `rails generate boring:rswag:install --rails_port=<rails_app_port> --authentication_type=<api_authentication_type> --skip_api_authentication=<skip_api_authentication> --api_authentication_options=<api_authentication_options> --enable_swagger_ui_authentication=<enable_swagger_ui_authentication>`
86
86
  - Install Webmock: `rails generate boring:webmock:install --app_test_framework=<test_framework>`
87
+ - Install Figjam: `rails generate boring:figjam:install`
88
+ - Install Pronto with Gitlab CI: `rails generate boring:pronto:gitlab_ci:install`
89
+ - Install Pronto with Github Action: `rails generate boring:pronto:github_action:install`
90
+ - Install Rack Mini Profiler: `rails generate boring:rack_mini_profiler:install`
91
+ - Install VCR: `rails generate boring:vcr:install --testing_framework=<testing_framework> --stubbing_libraries=<stubbing_libraries>`
92
+ - Install Avo: `rails generate boring:avo:install`
93
+ - Install Doorkeeper with devise: `rails generate boring:devise:doorkeeper:install`
94
+ - Install Sentry: `rails generate boring:sentry:install --use_env_variable --breadcrumbs_logger=<breadcrumbs_logger_options>`
95
+ - Install Dotenv: `rails generate boring:dotenv:install`
96
+ - Install Honeybadger: `rails generate boring:honeybadger:install`
97
+ - Install Rails ERD: `rails generate boring:rails_erd:install`
98
+ - Install Annotate: `rails generate boring:annotate:install`
99
+ - Install CanCanCan: `rails generate boring:cancancan:install`
87
100
 
88
101
  ## Screencasts
89
102
 
@@ -0,0 +1,34 @@
1
+ module BoringGenerators
2
+ module GeneratorHelper
3
+ include Rails::Generators::Actions
4
+
5
+ def app_ruby_version
6
+ with_ruby_string = `grep "^ruby.*$" Gemfile` || `cat .ruby-version`
7
+
8
+ # only keep 3.3.0
9
+ with_ruby_string.gsub(/[^\d\.]/, "").squish
10
+ end
11
+
12
+ def gem_installed?(gem_name)
13
+ gem_regex = /^\s*gem\s*['"]#{gem_name}['"]/
14
+
15
+ File.read("Gemfile").match?(gem_regex)
16
+ end
17
+
18
+ def bundle_install
19
+ Bundler.with_unbundled_env { run "bundle install" }
20
+ end
21
+
22
+ def check_and_install_gem(*args)
23
+ gem_name, = args
24
+
25
+ if gem_installed?(gem_name)
26
+ say "#{gem_name} is already in the Gemfile, skipping it...", :yellow
27
+ else
28
+ gem *args unless gem_installed?(gem_name)
29
+ end
30
+
31
+ bundle_install
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module BoringGenerators
2
- VERSION = "0.13.0"
2
+ VERSION = "0.14.0"
3
3
  end
@@ -2,7 +2,7 @@ module Boring
2
2
  module ActiveStorage
3
3
  module Azure
4
4
  class InstallGenerator < Rails::Generators::Base
5
- desc "Adds ActiveStorage Mircosoft Azure the application"
5
+ desc "Adds ActiveStorage Microsoft Azure the application"
6
6
 
7
7
  class_option :skip_active_storage, type: :boolean, aliases: "-s",
8
8
  desc: "Skips running ActiveStorage installer"
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
5
+ module Boring
6
+ module Annotate
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc "Adds Annotate gem to the application"
11
+
12
+ class_option :skip_on_db_migrate,
13
+ type: :boolean,
14
+ alias: "-sm",
15
+ default: false,
16
+ desc: "Skip annotate on db:migrate. Defaults to false"
17
+
18
+ def add_annotate_gem
19
+ if gem_installed?("annotate")
20
+ say "annotate is already in the Gemfile, skipping it ...", :yellow
21
+ else
22
+ say "Adding annotate gem", :green
23
+ gem_content = <<~RUBY
24
+ \n
25
+ \tgem "annotate"
26
+ RUBY
27
+ insert_into_file "Gemfile", gem_content, after: /group :development do/
28
+ bundle_install
29
+ end
30
+ end
31
+
32
+ def configure_annotate
33
+ say "Configuring annotate", :green
34
+
35
+ Bundler.with_unbundled_env do
36
+ run "bundle exec rails g annotate:install"
37
+ end
38
+ end
39
+
40
+ def update_auto_annotate_models_rake
41
+ return unless options[:skip_on_db_migrate]
42
+
43
+ say "Setting skip_on_db_migrate to false on file 'lib/tasks/auto_annotate_models.rake'",
44
+ :green
45
+
46
+ gsub_file "lib/tasks/auto_annotate_models.rake",
47
+ "'skip_on_db_migrate' => 'false'",
48
+ "'skip_on_db_migrate' => 'true'"
49
+ end
50
+ end
51
+ end
52
+ end
@@ -13,7 +13,7 @@ module Boring
13
13
  \n
14
14
  \t# Patch-level verification for Bundler. https://github.com/rubysec/bundler-audit
15
15
  \tgem "bundler-audit", require: false
16
- \t# vulnerabity checker for Ruby itself. https://github.com/civisanalytics/ruby_audit
16
+ \t# vulnerability checker for Ruby itself. https://github.com/civisanalytics/ruby_audit
17
17
  \tgem "ruby_audit", require: false
18
18
  RUBY
19
19
  insert_into_file "Gemfile", audit_gems_content, after: /group :development do/
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Boring
4
+ module Avo
5
+ class InstallGenerator < Rails::Generators::Base
6
+ desc 'Adds Avo to the application'
7
+
8
+ def add_avo_gem
9
+ say 'Adding Avo gem', :green
10
+
11
+ Bundler.with_unbundled_env do
12
+ run 'bundle add avo'
13
+ end
14
+ end
15
+
16
+ def configure_avo
17
+ say 'Setting up Avo', :green
18
+
19
+ Bundler.with_unbundled_env do
20
+ run 'bundle exec rails generate avo:install'
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
5
+ module Boring
6
+ module Cancancan
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc "Adds cancancan gem to the application"
11
+
12
+ class_option :skip_config,
13
+ type: :boolean,
14
+ default: false,
15
+ desc: "Skip adding cancancan configuration. Default to false"
16
+
17
+ def add_cancancan_gem
18
+ say "Adding cancancan gem", :green
19
+ check_and_install_gem("cancancan")
20
+ bundle_install
21
+ end
22
+
23
+ def configure_cancancan
24
+ return if options[:skip_config]
25
+
26
+ say "Configuring cancancan", :green
27
+
28
+ Bundler.with_unbundled_env do
29
+ run "bundle exec rails g cancan:ability"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'boring_generators/generator_helper'
4
+
5
+ module Boring
6
+ module Devise
7
+ module Doorkeeper
8
+ class InstallGenerator < Rails::Generators::Base
9
+ include BoringGenerators::GeneratorHelper
10
+
11
+ desc "Adds doorkeeper with devise to the application"
12
+
13
+ class_option :model_name, type: :string, aliases: "-m", default: "User",
14
+ desc: "Tell us the user model name which will be used for authentication. Defaults to User"
15
+ class_option :grant_flows, type: :array, aliases: "-gf", default: %w[authorization_code client_credentials],
16
+ enum: %w[authorization_code client_credentials password],
17
+ desc: "Tell us the grant flows you want to use separated by space. Defaults to authorization_code and client_credentials"
18
+ class_option :api_only, type: :boolean, aliases: "-a", default: false,
19
+ desc: "Tell us if you want to setup doorkeeper for API only application. Defaults to false"
20
+ class_option :skip_applications_routes, type: :boolean, aliases: "-sr", default: false,
21
+ desc: "Tell us if you want to skip adding doorkeeper routes to manage applications. Defaults to false"
22
+ class_option :use_refresh_token, type: :boolean, aliases: "-rt", default: false,
23
+ desc: "Keep user logged in with refresh tokens. Defaults to false"
24
+
25
+ def verify_presence_of_devise_gem
26
+ return if gem_installed?("devise")
27
+
28
+ say "We couldn't find devise gem. Please configure devise gem and rerun the generator. Consider running `rails generate boring:devise:install` to set up Devise.",
29
+ :red
30
+
31
+ abort
32
+ end
33
+
34
+ def verify_presence_of_devise_model
35
+ return if File.exist?("app/models/#{options[:model_name].underscore}.rb")
36
+
37
+ say "We couldn't find the #{options[:model_name]} model. Maybe there is a typo? Please provide the correct model name and run the generator again.",
38
+ :red
39
+
40
+ abort
41
+ end
42
+
43
+ def add_doorkeeper_gem
44
+ say "Adding doorkeeper gem", :green
45
+
46
+ check_and_install_gem "doorkeeper"
47
+ end
48
+
49
+ def run_doorkeeper_generators
50
+ say "Running doorkeeper generators", :green
51
+
52
+ Bundler.with_unbundled_env do
53
+ run "bundle exec rails generate doorkeeper:install"
54
+ run "bundle exec rails generate doorkeeper:migration"
55
+ end
56
+ end
57
+
58
+ def add_doorkeeper_related_association_to_model
59
+ model_name = options[:model_name].underscore
60
+ say "Adding doorkeeper related associations to the model file app/models/#{model_name}.rb",
61
+ :green
62
+ model_content = <<~RUBY
63
+ has_many :access_grants,
64
+ class_name: 'Doorkeeper::AccessGrant',
65
+ foreign_key: :resource_owner_id,
66
+ dependent: :delete_all # or :destroy if you need callbacks
67
+
68
+ has_many :access_tokens,
69
+ class_name: 'Doorkeeper::AccessToken',
70
+ foreign_key: :resource_owner_id,
71
+ dependent: :delete_all # or :destroy if you need callbacks
72
+ RUBY
73
+
74
+ inject_into_file "app/models/#{model_name}.rb",
75
+ optimize_indentation(model_content, 2),
76
+ after: "ApplicationRecord\n"
77
+ end
78
+
79
+ def update_doorkeeper_initializer
80
+ say "Updating doorkeeper initializer", :green
81
+
82
+ configure_resource_owner_authenticator if options[:grant_flows].include?("authorization_code")
83
+ configure_admin_authenticator unless options[:api_only] || options[:skip_applications_routes]
84
+ configure_resource_owner_from_credentials if options[:grant_flows].include?("password")
85
+
86
+ gsub_file "config/initializers/doorkeeper.rb",
87
+ /# grant_flows %w\[authorization_code client_credentials\]/,
88
+ "grant_flows %w[#{options[:grant_flows].uniq.join(' ')}]"
89
+
90
+ if options[:api_only]
91
+ gsub_file "config/initializers/doorkeeper.rb",
92
+ /# api_only/,
93
+ "api_only"
94
+ end
95
+
96
+ if options[:skip_applications_routes]
97
+ doorkeeper_routes_content = <<~RUBY
98
+ use_doorkeeper do
99
+ skip_controllers :applications, :authorized_applications
100
+ end
101
+ RUBY
102
+
103
+ gsub_file "config/routes.rb",
104
+ /.*use_doorkeeper/,
105
+ optimize_indentation(doorkeeper_routes_content, 2)
106
+ end
107
+
108
+ if options[:use_refresh_token]
109
+ uncomment_lines "config/initializers/doorkeeper.rb",
110
+ /use_refresh_token/
111
+ end
112
+ end
113
+
114
+ def update_doorkeeper_migration
115
+ say "Updating doorkeeper migration", :green
116
+ model_name = options[:model_name].underscore
117
+
118
+ uncomment_lines Dir["db/migrate/*_create_doorkeeper_tables.rb"].first,
119
+ /add_foreign_key :oauth/
120
+
121
+ gsub_file Dir["db/migrate/*_create_doorkeeper_tables.rb"].first,
122
+ /<model>/,
123
+ ":#{model_name.pluralize}"
124
+
125
+ return unless (%w[password client_credentials] & options[:grant_flows]).any?
126
+
127
+ gsub_file Dir["db/migrate/*_create_doorkeeper_tables.rb"].first,
128
+ /t.text :redirect_uri, null: false/,
129
+ "t.text :redirect_uri"
130
+ end
131
+
132
+ def show_message
133
+ return if options[:api_only] || options[:skip_applications_routes]
134
+
135
+ model_name = options[:model_name].underscore
136
+ admin_authenticator_content = "current_#{model_name} || warden.authenticate!(scope: :#{model_name})"
137
+
138
+ say "\nWe've implemented `#{admin_authenticator_content}` in the admin_authenticator block of config/initializers/doorkeeper.rb to manage access to application routes. Please adjust it as necessary to suit your requirements.",
139
+ :yellow
140
+ end
141
+
142
+ private
143
+
144
+ def configure_resource_owner_authenticator
145
+ model_name = options[:model_name].underscore
146
+ resource_owner_authenticator_content = <<~RUBY
147
+ resource_owner_authenticator do
148
+ current_#{model_name} || warden.authenticate!(scope: :#{model_name})
149
+ end
150
+ RUBY
151
+
152
+ gsub_file "config/initializers/doorkeeper.rb",
153
+ /.*resource_owner_authenticator do\n(?:\s|.)*?end/,
154
+ optimize_indentation(resource_owner_authenticator_content, 2)
155
+ end
156
+
157
+ def configure_admin_authenticator
158
+ model_name = options[:model_name].underscore
159
+ gsub_file "config/initializers/doorkeeper.rb",
160
+ /(?:# admin_authenticator do\n*)((?:\s|.)*?)(?:# end)/,
161
+ "admin_authenticator do\n" + "\\1" + "end"
162
+
163
+ admin_authenticator_content = "current_#{model_name} || warden.authenticate!(scope: :#{model_name})"
164
+ inject_into_file "config/initializers/doorkeeper.rb",
165
+ optimize_indentation(admin_authenticator_content, 4),
166
+ after: /admin_authenticator do\n/,
167
+ force: true
168
+
169
+ end
170
+
171
+ def configure_resource_owner_from_credentials
172
+ model_name = options[:model_name].underscore
173
+ resource_owner_for_credentials_content = <<~RUBY
174
+ resource_owner_from_credentials do |routes|
175
+ #{model_name} = #{options[:model_name]}.find_for_database_authentication(email: params[:email])
176
+ if #{model_name}&.valid_for_authentication? { #{model_name}.valid_password?(params[:password]) } && #{model_name}&.active_for_authentication?
177
+ request.env['warden'].set_user(#{model_name}, scope: :#{model_name}, store: false)
178
+ #{model_name}
179
+ end
180
+ end
181
+ RUBY
182
+
183
+ inject_into_file "config/initializers/doorkeeper.rb",
184
+ optimize_indentation(resource_owner_for_credentials_content, 2),
185
+ after: /resource_owner_authenticator do\n(?:\s|.)*?end\n/
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -13,6 +13,9 @@ module Boring
13
13
  desc: "Skip generating devise views"
14
14
  class_option :skip_devise_model, type: :boolean, aliases: "-sm",
15
15
  desc: "Skip generating devise model"
16
+ class_option :run_db_migrate, type: :boolean, aliases: "-rdm",
17
+ desc: "Run migrations after generating user table",
18
+ default: false
16
19
 
17
20
  def add_devise_gem
18
21
  say "Adding devise gem", :green
@@ -64,6 +67,14 @@ module Boring
64
67
  run "DISABLE_SPRING=1 bundle exec rails generate devise:views #{model_name.pluralize}"
65
68
  end
66
69
  end
70
+
71
+ def run_db_migrate
72
+ return unless options[:run_db_migrate]
73
+
74
+ Bundler.with_unbundled_env do
75
+ rails_command "db:migrate"
76
+ end
77
+ end
67
78
  end
68
79
  end
69
80
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "boring_generators/generator_helper"
4
+
5
+ module Boring
6
+ module Dotenv
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include BoringGenerators::GeneratorHelper
9
+
10
+ desc "Adds dotenv gem to the application"
11
+ source_root File.expand_path("templates", __dir__)
12
+
13
+ def add_dotenv_gem
14
+ return if gem_installed?("dotenv-rails")
15
+
16
+ say "Adding dotenv gem", :green
17
+
18
+ check_and_install_gem "dotenv-rails", group: :development
19
+ end
20
+
21
+ def configure_dotenv_gem
22
+ say "Configuring dotenv gem", :green
23
+
24
+ template ".env", ".env"
25
+
26
+ create_file ".gitignore" unless File.exist?(".gitignore")
27
+
28
+ FileUtils.cp(".env", ".env.sample")
29
+
30
+ add_env_files_to_gitignore
31
+ end
32
+
33
+ private
34
+
35
+ def add_env_files_to_gitignore
36
+ if File.readlines(".gitignore").any? { |line| line.include?(".env") }
37
+ return
38
+ end
39
+
40
+ ignore_content = <<~ENV_FILE_NAMES
41
+ \n
42
+ # Ignore all environment files (except templates).
43
+ /.env
44
+ !/.env.*
45
+ ENV_FILE_NAMES
46
+
47
+ insert_into_file(".gitignore", ignore_content)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ # Add your environment variables here
2
+ # Example:
3
+ # SECRET_KEY_BASE=your_secret_key