boring_generators 0.12.0 → 0.14.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/.github/workflows/ci.yml +2 -2
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +82 -45
  5. data/CONTRIBUTING.md +17 -0
  6. data/Gemfile.lock +2 -2
  7. data/README.md +22 -0
  8. data/lib/boring_generators/generator_helper.rb +34 -0
  9. data/lib/boring_generators/version.rb +1 -1
  10. data/lib/generators/boring/active_storage/azure/install/install_generator.rb +1 -1
  11. data/lib/generators/boring/annotate/install/install_generator.rb +52 -0
  12. data/lib/generators/boring/audit/install/install_generator.rb +1 -1
  13. data/lib/generators/boring/avo/install/install_generator.rb +25 -0
  14. data/lib/generators/boring/cancancan/install/install_generator.rb +34 -0
  15. data/lib/generators/boring/devise/doorkeeper/install/install_generator.rb +190 -0
  16. data/lib/generators/boring/devise/install/install_generator.rb +11 -0
  17. data/lib/generators/boring/dotenv/install/install_generator.rb +51 -0
  18. data/lib/generators/boring/dotenv/install/templates/.env +3 -0
  19. data/lib/generators/boring/factory_bot/install/install_generator.rb +1 -1
  20. data/lib/generators/boring/faker/install/install_generator.rb +1 -1
  21. data/lib/generators/boring/favicon/build/build_generator.rb +1 -1
  22. data/lib/generators/boring/figjam/install/install_generator.rb +33 -0
  23. data/lib/generators/boring/honeybadger/install/install_generator.rb +47 -0
  24. data/lib/generators/boring/honeybadger/install/templates/README +6 -0
  25. data/lib/generators/boring/honeybadger/install/templates/honeybadger.yml.tt +26 -0
  26. data/lib/generators/boring/letter_opener/install/install_generator.rb +38 -0
  27. data/lib/generators/boring/oauth/google/install/install_generator.rb +2 -2
  28. data/lib/generators/boring/pronto/base_generator.rb +78 -0
  29. data/lib/generators/boring/pronto/github_action/install/install_generator.rb +27 -0
  30. data/lib/generators/boring/pronto/github_action/install/templates/pronto.yml.tt +53 -0
  31. data/lib/generators/boring/pronto/gitlab_ci/install/install_generator.rb +112 -0
  32. data/lib/generators/boring/pronto/gitlab_ci/install/templates/.gitlab-ci.yml.tt +22 -0
  33. data/lib/generators/boring/pronto/gitlab_ci/install/templates/README +7 -0
  34. data/lib/generators/boring/rack_mini_profiler/install/install_generator.rb +38 -0
  35. data/lib/generators/boring/rails_erd/install/install_generator.rb +35 -0
  36. data/lib/generators/boring/rspec/install/install_generator.rb +1 -1
  37. data/lib/generators/boring/rswag/install/install_generator.rb +166 -0
  38. data/lib/generators/boring/rswag/install/templates/README +10 -0
  39. data/lib/generators/boring/sentry/install/install_generator.rb +48 -0
  40. data/lib/generators/boring/sentry/install/templates/sentry.rb +7 -0
  41. data/lib/generators/boring/vcr/install/install_generator.rb +125 -0
  42. data/lib/generators/boring/vcr/install/templates/rspec/vcr.rb.tt +8 -0
  43. data/lib/generators/boring/webmock/install/install_generator.rb +87 -0
  44. data/lib/generators/boring/whenever/install/install_generator.rb +25 -0
  45. data/tmp/templates/app_template/.ruby-version +1 -1
  46. data/tmp/templates/app_template/Gemfile +1 -1
  47. data/tmp/templates/app_template/config/boot.rb +1 -1
  48. metadata +30 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 359acba051da88cd0afd42b265845dd57da2ac688e57466cfca79a87fdba8dec
4
- data.tar.gz: cf6b4543e010b57774ce160a49e02c962b4c90b1764cd6ff504725dffeced453
3
+ metadata.gz: d1c4e7578120facf94b1e17cadcb9e62f008ffec728658d650842d19ee931b82
4
+ data.tar.gz: 7a026a5987aec9f8e3ee38dd1218e48908e0df5891fcb0d8e9f91a904f9985f9
5
5
  SHA512:
6
- metadata.gz: a0895d2a677ff5c80e2249a0f5dca86f6f1ab1b74b0d53e2d08d5c2f8f437daef054511e4b6a6c15854e40721e5a21e81a41dec74267a072031628ecb86332fa
7
- data.tar.gz: 5e31f9a9804338af68046deb67f081e5754a9a09b2b61c651eb0191e259936878af814ff67241234ea802a4311887a8ed81cf7e5354514ba88333f8c585d6674
6
+ metadata.gz: aae856dd9081e7ab70e7d750f585474de515baf8a09c79d0ffef180162aeb1bb5317703ffc0f392ca6bc997ee36775ac1fe5f12e442339a73b5d50ac1df1fa5d
7
+ data.tar.gz: d4cce2e4bf333a907e7ace4fdb56c0218c4832f047aa644f019246fa3504ab6d21c2c49713d95df289d6507c76e9772a80dec965eb2657445d641833a3e69a00
@@ -10,11 +10,11 @@ jobs:
10
10
  - name: Set up Ruby
11
11
  uses: ruby/setup-ruby@v1
12
12
  with:
13
- ruby-version: 2.7.0
13
+ ruby-version: 2.7.3
14
14
  bundler-cache: true
15
15
  - name: Install Imagemagick
16
16
  run: |
17
- wget https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-imagemagick
17
+ wget https://raw.githubusercontent.com/discourse/discourse_docker/main/image/base/install-imagemagick
18
18
  chmod +x install-imagemagick
19
19
  sudo ./install-imagemagick
20
20
  - name: Install gems
data/.gitignore CHANGED
@@ -10,3 +10,4 @@
10
10
  .byebug_history
11
11
 
12
12
  *.log
13
+ .idea
data/CHANGELOG.md CHANGED
@@ -2,78 +2,115 @@
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
+
21
+ ## 0.13.0 (March 26th, 2024)
22
+
23
+ - Adds Letter Opener generator. ([@coolprobn][])
24
+ - Adds Whenever generator. ([@aadil][])
25
+ - Adds Rswag generator. ([@coolprobn][])
26
+ - Adds Webmock generator. ([@aadil][])
27
+
5
28
  ## 0.12.0 (May 8th, 2023)
6
- * Adds Flipper generator. ([@abhaynikam][])
7
- * Adds FactoryBot generator. ([@abhaynikam][])
8
- * Adds Faker generator. ([@abhaynikam][])
9
- * Adds RSpec generator. ([@abhaynikam][])
10
- * Update default node-version for GitHub Action generator and fixes PG setup issues. ([@abhaynikam][])
11
- * Updates Bootstrap generator for supporting Bootstrap 5 with popper.js. ([@abhaynikam][])
12
- * Adds Overcommit generator for RuboCop. ([@coolprobn][])
13
- * 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][])
14
38
 
15
39
  ## 0.11.0 (June 23rd, 2021)
16
- * Adds Stimulus generator. ([@abhaynikam][])
17
- * Adds Rails Admin generator. ([@abhaynikam][])
18
- * Adds Paper Trail generator. ([@abhaynikam][])
40
+
41
+ - Adds Stimulus generator. ([@abhaynikam][])
42
+ - Adds Rails Admin generator. ([@abhaynikam][])
43
+ - Adds Paper Trail generator. ([@abhaynikam][])
19
44
 
20
45
  ## 0.10.0 (May 26th, 2021)
21
- * Updates Stripe payment generator. ([@abhaynikam][])
22
- * 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][])
23
49
 
24
50
  ## 0.9.0 (April 14th, 2021)
25
- * Adds Ahoy generator. ([@abhaynikam][])
26
- * Adds Stripe payment generator. ([@abhaynikam][])
51
+
52
+ - Adds Ahoy generator. ([@abhaynikam][])
53
+ - Adds Stripe payment generator. ([@abhaynikam][])
27
54
 
28
55
  ## 0.8.0 (February 28th, 2021)
29
- * Adds Devise Google Omniauth generator. ([@abhaynikam][])
30
- * Adds Devise Twitter Omniauth generator. ([@abhaynikam][])
31
- * Adds Twilio generator. ([@abhaynikam][])
56
+
57
+ - Adds Devise Google Omniauth generator. ([@abhaynikam][])
58
+ - Adds Devise Twitter Omniauth generator. ([@abhaynikam][])
59
+ - Adds Twilio generator. ([@abhaynikam][])
32
60
 
33
61
  ## 0.7.0 (January 30th, 2021)
34
- * Upgrade the Tailwind CSS generator to support Tailwind V2.0. ([@abhaynikam][])
35
- * 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][])
36
65
 
37
66
  ## 0.6.0 (January 10th, 2021)
38
- * Updates default ruby version of GitHub Actions install generator. ([@jamesglover][])
39
- * Simplify generated GitHub Actions install ([@jamesglover][])
40
- * Adds boring generator CLI ([@luathn][])
41
- * 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][])
42
72
 
43
73
  ## 0.5.0 (December 20th, 2020)
44
- * Adds favicon build generator. ([@abhaynikam][])
45
- * Adds Pundit install generator. ([@CiTroNaK][])
46
- * Adds GraphQL generator. ([@abhaynikam][])
47
- * Adds SimpleForm generator. ([@abhaynikam][])
48
- * 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][])
49
80
 
50
81
  ## 0.4.0 (October 23rd, 2020)
51
- * Adds CircleCI install generator. ([@abhaynikam][])
52
- * Adds GitHub Actions install generator. ([@abhaynikam][])
53
- * Adds Travis CI install generator. ([@abhaynikam][])
54
- * 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][])
55
87
 
56
88
  ## 0.3.0 (September 19th, 2020)
57
- * Adds Bullet install generator. ([@abhaynikam][])
58
- * Adds Audit gems(bundler-audit, ruby_audit) install generator. ([@abhaynikam][])
59
- * Adds Pry install generator. ([@abhaynikam][])
60
- * Adds Active Storage Google install generator. ([@abhaynikam][])
61
- * Adds Active Storage AWS install generator. ([@abhaynikam][])
62
- * 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][])
63
96
 
64
97
  ## 0.2.0 (September 16th, 2020)
65
- * Adds JQuery install generator. ([@abhaynikam][])
66
- * Adds Bootstrap install generator. ([@abhaynikam][])
67
- * Adds FontAwesome install generator via Yarn. ([@abhaynikam][])
68
- * 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][])
69
103
 
70
104
  ## 0.1.0 (September 5th, 2020)
71
105
 
72
- * Adds Tailwind CSS install generator. ([@abhaynikam][])
73
- * Initial release. ([@abhaynikam][])
106
+ - Adds Tailwind CSS install generator. ([@abhaynikam][])
107
+ - Initial release. ([@abhaynikam][])
74
108
 
75
109
  [@abhaynikam]: https://github.com/abhaynikam
76
110
  [@CiTroNaK]: https://github.com/CiTroNaK
77
111
  [@jamesglover]: https://github.com/JamesGlover
78
112
  [@luathn]: https://github.com/luathn
79
113
  [@coolprobn]: https://github.com/coolprobn
114
+ [@aadil]: https://github.com/AdilRT
115
+ [@mausamp]: https://github.com/mausamp
116
+ [@TheZero0-ctrl]: https://github.com/TheZero0-ctrl
data/CONTRIBUTING.md CHANGED
@@ -18,3 +18,20 @@ Push to your fork. Write a [good commit message][commit]. Submit a pull request.
18
18
 
19
19
  Please do not self reject your thoughts. Let's discuss even smallest feature request as well and make
20
20
  this package better for everybody's use.
21
+
22
+ ## Notes for Local Development of the Gem
23
+
24
+ ### While running Tests
25
+
26
+ When running tests, we normally do `bundle exec ruby -w -I test test/generators/rswag_install_generator_test.rb` to run a single test where "rswag_install_generator_test.rb" is the file name of the test we want to run.
27
+
28
+ And if your global ruby version is not the same as the "tmp/templates/app_template" where we run tests and make changes, tests might fail due to mismatch of ruby version and required gems not being installed correctly.
29
+
30
+ To tackle this issue you can add `.ruby-version` to the gem root by specifying the ruby version app_template is using. If you use rbenv this can be done with `rbenv local 2.7.0` where "2.7.0" is the app_template ruby-version at the moment.
31
+
32
+ We shouldn't commit this ".ruby-version" file to git since it's only intended for running tests. So to ignore this file from the git just for you, you can do the following:
33
+
34
+ - Open the git exclude file `nano .git/info/exclude`
35
+ - Add the file name ".ruby-version" to the end of the file and save it.
36
+
37
+ Now .ruby-version will be ignored by the git in your local machine just for this project.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- boring_generators (0.11.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.3.12
146
+ 2.2.33
data/README.md CHANGED
@@ -37,9 +37,14 @@ And then you can use it this way:
37
37
  $ boring generate boring:simple_form:install --css_framework=<css_framework>
38
38
  $ boring g boring:pry:install
39
39
 
40
+ To see options provided by each generator with their descriptions and accepted values, you can hit the following command for example:
41
+
42
+ $ boring generate boring:simple_form:install --help
43
+
40
44
  ## Usage
41
45
 
42
46
  The boring generator introduces following generators:
47
+
43
48
  - [Install Tailwind CSS](https://www.boringgenerators.com/blog/2020-10-18-install-tailwind/): `rails generate boring:tailwind:install`
44
49
  - [Install Bootstrap](https://www.boringgenerators.com/blog/2020-11-15-install-bootstrap/): `rails generate boring:bootstrap:install`
45
50
  - Install JQuery: `rails generate boring:jquery:install`
@@ -75,6 +80,23 @@ The boring generator introduces following generators:
75
80
  - Install FactoryBot: `rails generate boring:factory_bot:install`
76
81
  - Install Faker: `rails generate boring:faker:install`
77
82
  - Install Overcommit with RuboCop: `rails generate boring:overcommit:pre_commit:rubocop:install`
83
+ - Install Letter Opener: `rails generate boring:letter_opener:install`
84
+ - Install Whenever: `rails generate boring:whenever:install`
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
+ - 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`
78
100
 
79
101
  ## Screencasts
80
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.12.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