boring_generators 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
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