rolemodel-rails 0.26.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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +161 -0
- data/Rakefile +6 -0
- data/lib/generators/rolemodel/README.md +29 -0
- data/lib/generators/rolemodel/USAGE +5 -0
- data/lib/generators/rolemodel/all_generator.rb +29 -0
- data/lib/generators/rolemodel/base_generator.rb +14 -0
- data/lib/generators/rolemodel/editors/README.md +9 -0
- data/lib/generators/rolemodel/editors/USAGE +9 -0
- data/lib/generators/rolemodel/editors/editors_generator.rb +30 -0
- data/lib/generators/rolemodel/editors/vscode_helpers.rb +22 -0
- data/lib/generators/rolemodel/github/README.md +23 -0
- data/lib/generators/rolemodel/github/USAGE +9 -0
- data/lib/generators/rolemodel/github/github_generator.rb +43 -0
- data/lib/generators/rolemodel/good_job/README.md +13 -0
- data/lib/generators/rolemodel/good_job/USAGE +5 -0
- data/lib/generators/rolemodel/good_job/good_job_generator.rb +73 -0
- data/lib/generators/rolemodel/good_job/templates/config/initializers/active_job.rb +17 -0
- data/lib/generators/rolemodel/good_job/templates/config/initializers/good_job.rb +24 -0
- data/lib/generators/rolemodel/heroku/README.md +8 -0
- data/lib/generators/rolemodel/heroku/USAGE +9 -0
- data/lib/generators/rolemodel/heroku/heroku_generator.rb +52 -0
- data/lib/generators/rolemodel/heroku/templates/Procfile +2 -0
- data/lib/generators/rolemodel/heroku/templates/app.json.tt +30 -0
- data/lib/generators/rolemodel/kaminari/README.md +14 -0
- data/lib/generators/rolemodel/kaminari/USAGE +5 -0
- data/lib/generators/rolemodel/kaminari/kaminari_generator.rb +17 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_first_page.html.slim +9 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_gap.html.slim +8 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_last_page.html.slim +9 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_next_page.html.slim +12 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_page.html.slim +10 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_paginator.html.slim +19 -0
- data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_prev_page.html.slim +12 -0
- data/lib/generators/rolemodel/linters/README.md +32 -0
- data/lib/generators/rolemodel/linters/USAGE +5 -0
- data/lib/generators/rolemodel/linters/all_generator.rb +14 -0
- data/lib/generators/rolemodel/linters/eslint/README.md +5 -0
- data/lib/generators/rolemodel/linters/eslint/USAGE +8 -0
- data/lib/generators/rolemodel/linters/eslint/eslint_generator.rb +33 -0
- data/lib/generators/rolemodel/linters/eslint/templates/eslint.config.js +92 -0
- data/lib/generators/rolemodel/linters/rubocop/README.md +7 -0
- data/lib/generators/rolemodel/linters/rubocop/USAGE +9 -0
- data/lib/generators/rolemodel/linters/rubocop/rubocop_generator.rb +23 -0
- data/lib/generators/rolemodel/linters/rubocop/templates/lib/cops/form_error_response.rb +54 -0
- data/lib/generators/rolemodel/linters/rubocop/templates/lib/cops/no_chrome_tag.rb +45 -0
- data/lib/generators/rolemodel/lograge/README.md +10 -0
- data/lib/generators/rolemodel/lograge/USAGE +8 -0
- data/lib/generators/rolemodel/lograge/lograge_generator.rb +15 -0
- data/lib/generators/rolemodel/lograge/templates/config/initializers/lograge.rb +16 -0
- data/lib/generators/rolemodel/mailers/README.md +13 -0
- data/lib/generators/rolemodel/mailers/USAGE +22 -0
- data/lib/generators/rolemodel/mailers/mailers_generator.rb +99 -0
- data/lib/generators/rolemodel/mailers/templates/app/assets/stylesheets/mailer.scss +61 -0
- data/lib/generators/rolemodel/mailers/templates/app/mailers/example_mailer.rb +8 -0
- data/lib/generators/rolemodel/mailers/templates/app/mailers/staging_mailer_interceptor.rb +9 -0
- data/lib/generators/rolemodel/mailers/templates/app/views/example_mailer/example_email.html.slim +16 -0
- data/lib/generators/rolemodel/mailers/templates/app/views/layouts/mailer.html.slim +16 -0
- data/lib/generators/rolemodel/mailers/templates/config/initializers/premailer_rails.rb +15 -0
- data/lib/generators/rolemodel/mailers/templates/public/logo.png +0 -0
- data/lib/generators/rolemodel/mailers/templates/spec/mailers/previews/example_mailer_preview.rb +6 -0
- data/lib/generators/rolemodel/optics/README.md +8 -0
- data/lib/generators/rolemodel/optics/USAGE +5 -0
- data/lib/generators/rolemodel/optics/all_generator.rb +12 -0
- data/lib/generators/rolemodel/optics/base/README.md +9 -0
- data/lib/generators/rolemodel/optics/base/USAGE +5 -0
- data/lib/generators/rolemodel/optics/base/base_generator.rb +21 -0
- data/lib/generators/rolemodel/optics/icons/README.md +7 -0
- data/lib/generators/rolemodel/optics/icons/USAGE +8 -0
- data/lib/generators/rolemodel/optics/icons/icons_generator.rb +48 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/helpers/icon_helper.rb.tt +24 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/custom_icon_builder.rb +53 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/feather_icon_builder.rb +22 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/icon_builder.rb +73 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/lucide_icon_builder.rb +22 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/material_icon_builder.rb +31 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/phosphor_icon_builder.rb +27 -0
- data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/tabler_icon_builder.rb +22 -0
- data/lib/generators/rolemodel/react/README.md +12 -0
- data/lib/generators/rolemodel/react/USAGE +5 -0
- data/lib/generators/rolemodel/react/react_generator.rb +36 -0
- data/lib/generators/rolemodel/react/templates/app/helpers/react_helper.rb +11 -0
- data/lib/generators/rolemodel/react/templates/app/javascript/components/HelloReact.jsx +14 -0
- data/lib/generators/rolemodel/react/templates/app/javascript/controllers/react_controller.js +24 -0
- data/lib/generators/rolemodel/readme/README.md +9 -0
- data/lib/generators/rolemodel/readme/USAGE +8 -0
- data/lib/generators/rolemodel/readme/readme_generator.rb +11 -0
- data/lib/generators/rolemodel/readme/templates/README.md.erb +116 -0
- data/lib/generators/rolemodel/replace_content_helper.rb +29 -0
- data/lib/generators/rolemodel/saas/README.md +7 -0
- data/lib/generators/rolemodel/saas/USAGE +5 -0
- data/lib/generators/rolemodel/saas/all_generator.rb +15 -0
- data/lib/generators/rolemodel/saas/devise/README.md +24 -0
- data/lib/generators/rolemodel/saas/devise/USAGE +25 -0
- data/lib/generators/rolemodel/saas/devise/devise_generator.rb +172 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/assets/stylesheets/login.css +30 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/controllers/admin/users_controller.rb +34 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/controllers/application_controller.rb +11 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/invitations_controller.rb +77 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/registrations_controller.rb +80 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/admin/users/edit.html.slim +10 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/admin/users/index.html.slim +27 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/confirmations/new.html.slim +11 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/invitations/edit.html.slim +13 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/invitations/new.html.slim +14 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/confirmation_instructions.html.slim +3 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/email_changed.html.slim +5 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/invitation_instructions.html.slim +11 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/invitation_instructions.text.slim +6 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/password_change.html.slim +2 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/reset_password_instructions.html.slim +5 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/unlock_instructions.html.slim +4 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/passwords/edit.html.slim +13 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/passwords/new.html.slim +11 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/registrations/edit.html.slim +34 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/registrations/new.html.slim +17 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/sessions/new.html.slim +14 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/shared/_error_messages.html.slim +9 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/shared/_links.html.slim +14 -0
- data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/unlocks/new.html.slim +11 -0
- data/lib/generators/rolemodel/saas/devise/templates/config/locales/devise.en.yml +151 -0
- data/lib/generators/rolemodel/saas/devise/templates/config/locales/devise_invitable.en.yml +31 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/factories/organizations.rb +9 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/factories/users.rb +33 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/mailers/previews/devise_mailer_preview.rb +36 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/models/user_spec.rb +29 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/support/devise.rb +8 -0
- data/lib/generators/rolemodel/saas/devise/templates/spec/system/users_spec.rb +128 -0
- data/lib/generators/rolemodel/semaphore/README.md +15 -0
- data/lib/generators/rolemodel/semaphore/USAGE +11 -0
- data/lib/generators/rolemodel/semaphore/semaphore_generator.rb +25 -0
- data/lib/generators/rolemodel/semaphore/templates/heroku-deployment-commands.sh +3 -0
- data/lib/generators/rolemodel/semaphore/templates/production-deploy.yml.erb +17 -0
- data/lib/generators/rolemodel/semaphore/templates/semaphore.yml.erb +145 -0
- data/lib/generators/rolemodel/semaphore/templates/staging-deploy.yml.erb +17 -0
- data/lib/generators/rolemodel/simple_form/README.md +10 -0
- data/lib/generators/rolemodel/simple_form/USAGE +11 -0
- data/lib/generators/rolemodel/simple_form/simple_form_generator.rb +20 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/collection_check_boxes_input.rb +7 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/collection_select_input.rb +7 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/grouped_collection_select_input.rb +7 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/segmented_control_input.rb +48 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/switch_checkbox_input.rb +39 -0
- data/lib/generators/rolemodel/simple_form/templates/app/inputs/tailored_select_input.rb +75 -0
- data/lib/generators/rolemodel/simple_form/templates/config/initializers/simple_form.rb +207 -0
- data/lib/generators/rolemodel/simple_form/templates/config/locales/simple_form.en.yml +31 -0
- data/lib/generators/rolemodel/simple_form/templates/lib/templates/slim/scaffold/_form.html.slim.tt +12 -0
- data/lib/generators/rolemodel/slim/README.md +9 -0
- data/lib/generators/rolemodel/slim/USAGE +5 -0
- data/lib/generators/rolemodel/slim/slim_generator.rb +24 -0
- data/lib/generators/rolemodel/slim/templates/app/views/application/_head.html.slim.tt +13 -0
- data/lib/generators/rolemodel/slim/templates/app/views/layouts/application.html.slim.tt +6 -0
- data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/edit.html.slim.tt +15 -0
- data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/index.html.slim.tt +13 -0
- data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/new.html.slim.tt +13 -0
- data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/partial.html.slim.tt +10 -0
- data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/show.html.slim.tt +33 -0
- data/lib/generators/rolemodel/soft_destroyable/README.md +8 -0
- data/lib/generators/rolemodel/soft_destroyable/USAGE +9 -0
- data/lib/generators/rolemodel/soft_destroyable/soft_destroyable_generator.rb +13 -0
- data/lib/generators/rolemodel/soft_destroyable/templates/soft_destroyable.rb +82 -0
- data/lib/generators/rolemodel/soft_destroyable/templates/soft_destroyable_behavior.rb +166 -0
- data/lib/generators/rolemodel/source_map/README.md +13 -0
- data/lib/generators/rolemodel/source_map/USAGE +9 -0
- data/lib/generators/rolemodel/source_map/source_map_generator.rb +22 -0
- data/lib/generators/rolemodel/source_map/templates/lib/middleware/rolemodel/source_map.rb +45 -0
- data/lib/generators/rolemodel/source_map/templates/lib/tasks/assets.rake +43 -0
- data/lib/generators/rolemodel/tailored_select/README.md +7 -0
- data/lib/generators/rolemodel/tailored_select/USAGE +5 -0
- data/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb +13 -0
- data/lib/generators/rolemodel/testing/README.md +11 -0
- data/lib/generators/rolemodel/testing/USAGE +5 -0
- data/lib/generators/rolemodel/testing/all_generator.rb +17 -0
- data/lib/generators/rolemodel/testing/factory_bot/README.md +18 -0
- data/lib/generators/rolemodel/testing/factory_bot/USAGE +8 -0
- data/lib/generators/rolemodel/testing/factory_bot/factory_bot_generator.rb +20 -0
- data/lib/generators/rolemodel/testing/factory_bot/templates/support/factory_bot.rb +3 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/README.md +9 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb +52 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/templates/jp-runner.config.mjs +5 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/templates/spec/javascript/browser/example_spec.js +15 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/templates/spec/javascript/browser/setupTests.js +3 -0
- data/lib/generators/rolemodel/testing/jasmine_playwright/templates/support/react.mjs +26 -0
- data/lib/generators/rolemodel/testing/parallel_tests/README.md +53 -0
- data/lib/generators/rolemodel/testing/parallel_tests/USAGE +12 -0
- data/lib/generators/rolemodel/testing/parallel_tests/parallel_tests_generator.rb +42 -0
- data/lib/generators/rolemodel/testing/rspec/README.md +46 -0
- data/lib/generators/rolemodel/testing/rspec/USAGE +14 -0
- data/lib/generators/rolemodel/testing/rspec/rspec_generator.rb +46 -0
- data/lib/generators/rolemodel/testing/rspec/templates/rails_helper.rb +72 -0
- data/lib/generators/rolemodel/testing/rspec/templates/spec_helper.rb +97 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/capybara_drivers.rb +51 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/capybara_testid.rb +5 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/action_cable_helper.rb +5 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/capybara_helper.rb +72 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/playwright_helper.rb +85 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/select_helper.rb +33 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/test_element_helper.rb +11 -0
- data/lib/generators/rolemodel/testing/rspec/templates/support/helpers.rb +12 -0
- data/lib/generators/rolemodel/testing/test_prof/README.md +5 -0
- data/lib/generators/rolemodel/testing/test_prof/USAGE +5 -0
- data/lib/generators/rolemodel/testing/test_prof/test_prof_generator.rb +14 -0
- data/lib/generators/rolemodel/testing/vitest/README.md +5 -0
- data/lib/generators/rolemodel/testing/vitest/USAGE +5 -0
- data/lib/generators/rolemodel/testing/vitest/templates/spec/javascript/example.spec.js +12 -0
- data/lib/generators/rolemodel/testing/vitest/templates/spec/javascript/test-setup.js +1 -0
- data/lib/generators/rolemodel/testing/vitest/templates/vitest.config.js +23 -0
- data/lib/generators/rolemodel/testing/vitest/vitest_generator.rb +38 -0
- data/lib/generators/rolemodel/ui_components/README.md +9 -0
- data/lib/generators/rolemodel/ui_components/USAGE +5 -0
- data/lib/generators/rolemodel/ui_components/all_generator.rb +15 -0
- data/lib/generators/rolemodel/ui_components/flash/README.md +10 -0
- data/lib/generators/rolemodel/ui_components/flash/USAGE +9 -0
- data/lib/generators/rolemodel/ui_components/flash/flash_generator.rb +22 -0
- data/lib/generators/rolemodel/ui_components/flash/templates/app/views/application/_flash.html.slim +6 -0
- data/lib/generators/rolemodel/ui_components/flash/templates/spec/support/matchers/flash_matchers.rb +19 -0
- data/lib/generators/rolemodel/ui_components/modals/README.md +119 -0
- data/lib/generators/rolemodel/ui_components/modals/USAGE +8 -0
- data/lib/generators/rolemodel/ui_components/modals/modals_generator.rb +74 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/helpers/turbo_frame_link_helper.rb +20 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/controllers/morph_controller.js +23 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/controllers/toggle_controller.js +55 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/before_morph_handler.js +21 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/frame_missing_handler.js +12 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/turbo_confirm.js +3 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/views/application/_confirm.html.slim +12 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/views/layouts/modal.html.slim.tt +26 -0
- data/lib/generators/rolemodel/ui_components/modals/templates/app/views/layouts/panel.html.slim.tt +21 -0
- data/lib/generators/rolemodel/ui_components/navbar/README.md +11 -0
- data/lib/generators/rolemodel/ui_components/navbar/USAGE +10 -0
- data/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb +54 -0
- data/lib/generators/rolemodel/ui_components/navbar/templates/app/assets/stylesheets/components/shoelace/index.scss +2 -0
- data/lib/generators/rolemodel/ui_components/navbar/templates/app/javascript/lib/shoelace.js +9 -0
- data/lib/generators/rolemodel/ui_components/navbar/templates/app/views/layouts/_navbar.html.slim +29 -0
- data/lib/generators/rolemodel/webpack/README.md +8 -0
- data/lib/generators/rolemodel/webpack/USAGE +5 -0
- data/lib/generators/rolemodel/webpack/templates/app/assets/stylesheets/application.scss +5 -0
- data/lib/generators/rolemodel/webpack/templates/app/javascript/initializers/honeybadger.js +26 -0
- data/lib/generators/rolemodel/webpack/templates/postcss.config.cjs +14 -0
- data/lib/generators/rolemodel/webpack/templates/webpack.config.js +104 -0
- data/lib/generators/rolemodel/webpack/webpack_generator.rb +76 -0
- data/lib/generators/templates/generator/%filename%.rb.tt +11 -0
- data/lib/generators/templates/generator/README.md.tt +11 -0
- data/lib/generators/templates/generator/USAGE.tt +5 -0
- data/lib/generators/templates/generator_spec/%filename%_spec.rb.tt +5 -0
- data/lib/rolemodel/engine.rb +9 -0
- data/lib/rolemodel/version.rb +5 -0
- data/lib/rolemodel-rails.rb +7 -0
- metadata +416 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: '009bb14699c3ecc612283b81294506fdacc64e881d386d597c6b3e5302d708dd'
|
|
4
|
+
data.tar.gz: 436e21097154c27592f5f9c89557050ae64ecd6be9c4f6ee767a1aa5d5b37ce9
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 83ec891bfb8720a836cd4145b2395c5db5b79e11ad2711da22be127d70da963b4cb254217aa530e279b20b68a3f47e148aea0da2643815ce3dbd753f9d0c0272
|
|
7
|
+
data.tar.gz: be94ed5589774d6f39f26741c01353d28bbcd650b21fb5e05aa94ed763b353a9caeff94eb9639d57cd0039cfe1dd75f719fb593b9d99905e25eaecc8fd8b7e8b
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 Mark Kraemer
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# RoleModel Rails
|
|
2
|
+
|
|
3
|
+
Executable Best Practices for Rails apps, based on RoleModel's best approaches
|
|
4
|
+
|
|
5
|
+
Attempts to solve the pain of:
|
|
6
|
+
|
|
7
|
+
* Setup of a new Rails app is harder than it needs to be
|
|
8
|
+
* We've tried application templates, but only useful onetime
|
|
9
|
+
* Our BestPractice learns don't often get ported into other projects as it isn't straightforward to do so
|
|
10
|
+
* There is an emerging pattern of libraries using generators (e.g. webpacker) to migrate a setup between library versions
|
|
11
|
+
|
|
12
|
+
## Precondition
|
|
13
|
+
|
|
14
|
+
The rolemodel-rails gem expects to be added to an existing Rails project. Typically those are started with:
|
|
15
|
+
|
|
16
|
+
```shell
|
|
17
|
+
rails new <app-name> --javascript=webpack --database=postgresql --skip-test
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The Devise generator requires your database to exist before running.
|
|
21
|
+
|
|
22
|
+
```shell
|
|
23
|
+
rails db:create
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
Add this line to your application's Gemfile:
|
|
29
|
+
|
|
30
|
+
```ruby
|
|
31
|
+
group :development do
|
|
32
|
+
gem 'rolemodel-rails', github: 'RoleModel/rolemodel_rails'
|
|
33
|
+
end
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
And then execute:
|
|
37
|
+
|
|
38
|
+
$ bundle
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
Run all generators (useful on a new app)
|
|
43
|
+
|
|
44
|
+
```shell
|
|
45
|
+
bin/rails g rolemodel:all
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Or run a single generator
|
|
49
|
+
|
|
50
|
+
```shell
|
|
51
|
+
bin/rails g rolemodel:webpack
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Or run a category subset
|
|
55
|
+
|
|
56
|
+
```shell
|
|
57
|
+
bin/rails g rolemodel:testing:all
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
You can see complete list of available generators (including those under the RoleModel namespace) by running
|
|
61
|
+
|
|
62
|
+
```shell
|
|
63
|
+
bin/rails g
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Generators
|
|
67
|
+
|
|
68
|
+
* [Github](./lib/generators/rolemodel/github)
|
|
69
|
+
* [Semaphore](./lib/generators/rolemodel/semaphore)
|
|
70
|
+
* [Heroku](./lib/generators/rolemodel/heroku)
|
|
71
|
+
* [Readme](./lib/generators/rolemodel/readme)
|
|
72
|
+
* [Webpack](./lib/generators/rolemodel/webpack)
|
|
73
|
+
* [React](./lib/generators/rolemodel/react)
|
|
74
|
+
* [Slim](./lib/generators/rolemodel/slim)
|
|
75
|
+
* [Optics](./lib/generators/rolemodel/optics)
|
|
76
|
+
* [Base](./lib/generators/rolemodel/optics/base)
|
|
77
|
+
* [Icons](./lib/generators/rolemodel/optics/icons)
|
|
78
|
+
* [Testing](./lib/generators/rolemodel/testing)
|
|
79
|
+
* [RSpec](./lib/generators/rolemodel/testing/rspec)
|
|
80
|
+
* [Jasmine Playwright](./lib/generators/rolemodel/testing/jasmine_playwright)
|
|
81
|
+
* [ViTest](./lib/generators/rolemodel/testing/vitest)
|
|
82
|
+
* [Factory Bot](./lib/generators/rolemodel/testing/factory_bot)
|
|
83
|
+
* [Test Prof](./lib/generators/rolemodel/testing/test_prof)
|
|
84
|
+
* [Parallel Test](./lib/generators/rolemodel/testing/parallel_tests)
|
|
85
|
+
* [SimpleForm](./lib/generators/rolemodel/simple_form)
|
|
86
|
+
* [SoftDestroyable](./lib/generators/rolemodel/soft_destroyable)
|
|
87
|
+
* [SaaS](./lib/generators/rolemodel/saas)
|
|
88
|
+
* [Devise](./lib/generators/rolemodel/saas/devise)
|
|
89
|
+
* [Mailers](./lib/generators/rolemodel/mailers)
|
|
90
|
+
* [Linters](./lib/generators/rolemodel/linters)
|
|
91
|
+
* [Rubocop](./lib/generators/rolemodel/linters/rubocop)
|
|
92
|
+
* [ESLint](./lib/generators/rolemodel/linters/eslint)
|
|
93
|
+
* [UI Components](./lib/generators/rolemodel/ui_components)
|
|
94
|
+
* [Flash](./lib/generators/rolemodel/ui_components/flash)
|
|
95
|
+
* [Modals](./lib/generators/rolemodel/ui_components/modals)
|
|
96
|
+
* [Navbar](./lib/generators/rolemodel/ui_components/navbar)
|
|
97
|
+
* [Source Map](./lib/generators/rolemodel/source_map)
|
|
98
|
+
* [Kaminari](./lib/generators/rolemodel/kaminari)
|
|
99
|
+
* [GoodJob](./lib/generators/rolemodel/good_job)
|
|
100
|
+
* [Editors](./lib/generators/rolemodel/editors)
|
|
101
|
+
* [Tailored Select](./lib/generators/rolemodel/tailored_select)
|
|
102
|
+
* [Lograge](./lib/generators/rolemodel/lograge)
|
|
103
|
+
|
|
104
|
+
## Development
|
|
105
|
+
|
|
106
|
+
Install the versions of Node and Ruby specified in `.node-version` and `.ruby-version` on your machine. https://asdf-vm.com/ is a great tool for managing language versions. Then run `npm install -g yarn`.
|
|
107
|
+
|
|
108
|
+
## Adding new Generators
|
|
109
|
+
|
|
110
|
+
Run `bin/new_generator` passing the **name** you want to use and a **description**. Consult the list of existing [Generators](#generators) in case your new generator belongs in one of the existing groups (folders).
|
|
111
|
+
|
|
112
|
+
e.g.
|
|
113
|
+
|
|
114
|
+
```shell
|
|
115
|
+
bin/new_generator testing/fantasitic_specs 'A Fantastic Testing Framework'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
We use the embeded Rails apps (`example_rails*`) to test generators against. They reference the rolemodel-rails gem by local path,
|
|
119
|
+
so you can navigate into one of them and run your generator for immediate feedback while developing.
|
|
120
|
+
|
|
121
|
+
> [!IMPORTANT]
|
|
122
|
+
> Before submitting a PR, run `bin/bump_version` to ensure the Gem builds successfully & that everything continues to stay in sync & up-to-date.<br /><br />
|
|
123
|
+
> For very small changes & bug fixes, prefer `bin/bump_version --patch`.
|
|
124
|
+
|
|
125
|
+
## Testing
|
|
126
|
+
|
|
127
|
+
Generator specs should be added to the [spec](./spec) directory.
|
|
128
|
+
|
|
129
|
+
Setup & Teardown of the test-dummy app is handled for you. All you need to do is run the provided helper method:
|
|
130
|
+
|
|
131
|
+
e.g.
|
|
132
|
+
|
|
133
|
+
```ruby
|
|
134
|
+
RSpec.describe Rolemodel::MyGenerator, type: :generator do
|
|
135
|
+
before { run_generator_against_test_app }
|
|
136
|
+
end
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
You may also provide command line arguments to the helper method as an array:
|
|
140
|
+
|
|
141
|
+
e.g.
|
|
142
|
+
|
|
143
|
+
```ruby
|
|
144
|
+
RSpec.describe Rolemodel::Testing::JasminePlaywrightGenerator, type: :generator do
|
|
145
|
+
before { run_generator_against_test_app(['--github-package-token=123']) }
|
|
146
|
+
end
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Additional information about testing generators and the available assertions & matchers can be found at the following resources.
|
|
150
|
+
|
|
151
|
+
* [Rails Guide](https://guides.rubyonrails.org/generators.html#testing-generators)
|
|
152
|
+
* [API Documentation](https://api.rubyonrails.org/classes/Rails/Generators/Testing/Assertions.html)
|
|
153
|
+
* [Generator Spec Gem](https://github.com/stevehodgkiss/generator_spec)
|
|
154
|
+
|
|
155
|
+
## Contributing
|
|
156
|
+
|
|
157
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/RoleModel/rolemodel_rails.
|
|
158
|
+
|
|
159
|
+
## License
|
|
160
|
+
|
|
161
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# RoleModel Generator
|
|
2
|
+
|
|
3
|
+
[USAGE](./USAGE)
|
|
4
|
+
|
|
5
|
+
## What you get
|
|
6
|
+
|
|
7
|
+
* [Github](./github)
|
|
8
|
+
* [GoodJob](./good_job)
|
|
9
|
+
* [Heroku](./heroku)
|
|
10
|
+
* [Linters](./linters)
|
|
11
|
+
* [Mailers](./mailers)
|
|
12
|
+
* [Modals](./modals)
|
|
13
|
+
* [Optics](./optics)
|
|
14
|
+
* [README](./readme)
|
|
15
|
+
* [SaaS](./saas)
|
|
16
|
+
* [Semaphore](./semaphore)
|
|
17
|
+
* [SimpleForm](./simple_form)
|
|
18
|
+
* [Slim](./slim)
|
|
19
|
+
* [SoftDestroyable](./soft_destroyable)
|
|
20
|
+
* [Source Map](./source_map)
|
|
21
|
+
* [Testing](./testing)
|
|
22
|
+
* [Webpack](./webpack)
|
|
23
|
+
|
|
24
|
+
## Helpful documentation
|
|
25
|
+
|
|
26
|
+
* [Rails Custom Generators](https://guides.rubyonrails.org/generators.html)
|
|
27
|
+
* [Generator Action Methods](https://api.rubyonrails.org/classes/Rails/Generators/Actions.html)
|
|
28
|
+
* [Thor Action Methods](https://www.rubydoc.info/github/erikhuda/thor/master/Thor/Actions)
|
|
29
|
+
Thor action methods can be used just like Rails generator action methods
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Rolemodel
|
|
2
|
+
class AllGenerator < BaseGenerator
|
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
|
4
|
+
|
|
5
|
+
def run_all_the_generators
|
|
6
|
+
generate 'rolemodel:github'
|
|
7
|
+
generate 'rolemodel:semaphore'
|
|
8
|
+
generate 'rolemodel:heroku'
|
|
9
|
+
generate 'rolemodel:readme'
|
|
10
|
+
generate 'rolemodel:webpack'
|
|
11
|
+
generate 'rolemodel:react'
|
|
12
|
+
generate 'rolemodel:slim'
|
|
13
|
+
generate 'rolemodel:optics:all'
|
|
14
|
+
generate 'rolemodel:testing:all'
|
|
15
|
+
generate 'rolemodel:simple_form'
|
|
16
|
+
generate 'rolemodel:soft_destroyable'
|
|
17
|
+
generate 'rolemodel:saas:all'
|
|
18
|
+
generate 'rolemodel:mailers'
|
|
19
|
+
generate 'rolemodel:linters:all'
|
|
20
|
+
generate 'rolemodel:ui_components:all'
|
|
21
|
+
generate 'rolemodel:source_map'
|
|
22
|
+
generate 'rolemodel:good_job'
|
|
23
|
+
generate 'rolemodel:kaminari'
|
|
24
|
+
generate 'rolemodel:editors'
|
|
25
|
+
# generate 'rolemodel:tailored_select' # Not production ready
|
|
26
|
+
generate 'rolemodel:lograge'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
require 'rails/generators/bundle_helper'
|
|
3
|
+
require_relative 'replace_content_helper'
|
|
4
|
+
|
|
5
|
+
class Rolemodel::BaseGenerator < Rails::Generators::Base
|
|
6
|
+
include Rails::Generators::BundleHelper,
|
|
7
|
+
Rolemodel::ReplaceContentHelper
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
# based on https://github.com/rails/rails/blob/main/railties/lib/rails/generators/app_base.rb#L713
|
|
11
|
+
def run_bundle
|
|
12
|
+
bundle_command("install --quiet", "BUNDLE_IGNORE_MESSAGES" => "1")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Editor Config Generator
|
|
2
|
+
|
|
3
|
+
## What you get
|
|
4
|
+
|
|
5
|
+
Creates a default [`.editorconfig`](https://editorconfig.org/) file for your project.
|
|
6
|
+
|
|
7
|
+
Also ensures that a VSCode `extensions.json` config file exists in the project and adds
|
|
8
|
+
the [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig)
|
|
9
|
+
extension to it.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'vscode_helpers'
|
|
4
|
+
|
|
5
|
+
module Rolemodel
|
|
6
|
+
# Add standard editorconfig and any extensions to enable it
|
|
7
|
+
class EditorsGenerator < BaseGenerator
|
|
8
|
+
include Rolemodel::VSCodeHelpers
|
|
9
|
+
|
|
10
|
+
# This is bringing in the root from this gem, so we only modify
|
|
11
|
+
# one copy of .editorconfig for both this repo and any consumers.
|
|
12
|
+
source_root File.expand_path('../../../../', __dir__)
|
|
13
|
+
|
|
14
|
+
def add_editorconfig
|
|
15
|
+
# Bring over the .editorconfig file for whitespace, etc.
|
|
16
|
+
copy_file '.editorconfig'
|
|
17
|
+
|
|
18
|
+
# Configuration for VSCode to recommend the EditorConfig extension.
|
|
19
|
+
ensure_extensions_config
|
|
20
|
+
|
|
21
|
+
# Presumably in the future, we might add ESLint, Rubocop, etc.
|
|
22
|
+
# extensions. We might eventually also split this out, if there are
|
|
23
|
+
# extensions for RubyMine or other editors, but in theory, we might
|
|
24
|
+
# want to bring over config files for any RM-supported editors.
|
|
25
|
+
inject_into_file '.vscode/extensions.json', after: '"recommendations": [' do
|
|
26
|
+
"\n \"EditorConfig.EditorConfig\","
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rolemodel
|
|
4
|
+
module VSCodeHelpers
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
# Create an extensions file for VSCode and provide an empty
|
|
8
|
+
# recommendations array if it doesn't exist.
|
|
9
|
+
def ensure_extensions_config
|
|
10
|
+
return if File.exist?('.vscode/extensions.json')
|
|
11
|
+
|
|
12
|
+
create_file('.vscode/extensions.json') do |file|
|
|
13
|
+
<<~JSON
|
|
14
|
+
{
|
|
15
|
+
"recommendations": [
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
JSON
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Github Generator
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
You will need the parallel_tests generator to run the CI tests.
|
|
5
|
+
|
|
6
|
+
## What you get
|
|
7
|
+
|
|
8
|
+
### ci.yml
|
|
9
|
+
A sensible default `ci.yml` to get you started with Github Actions. This will run linters, model tests, and system tests.
|
|
10
|
+
|
|
11
|
+
Along with the `ci.yml`, your `database.yml` will be modified to be able to be run in GHA.
|
|
12
|
+
|
|
13
|
+
### Pull Request Template
|
|
14
|
+
|
|
15
|
+
When you open a Pull Request in Github it will use the Markdown file as a [template](./templates/pull_request_template.md) for the content of the PR.
|
|
16
|
+
|
|
17
|
+
Helpful for reminding collaborators to add specific details to the PR.
|
|
18
|
+
|
|
19
|
+
### Copilot Instructions
|
|
20
|
+
|
|
21
|
+
Installed into `.github/instructions`, these are context-specific instructions for Copilot to help it give more accurate
|
|
22
|
+
and relevant results. These are a good starting point but they should be tweaked for your project's frameworks and
|
|
23
|
+
standards.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rolemodel
|
|
4
|
+
class GithubGenerator < BaseGenerator
|
|
5
|
+
# Source root is the project-level .github directory
|
|
6
|
+
# This allows us to use the same templates for both the generated app and this gem
|
|
7
|
+
source_root File.expand_path('.github')
|
|
8
|
+
|
|
9
|
+
def install_pull_request_template
|
|
10
|
+
template 'pull_request_template.md', '.github/pull_request_template.md'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def remove_rolemodel_rails_version_check
|
|
14
|
+
gsub_file '.github/pull_request_template.md',
|
|
15
|
+
"* [ ] Run `bin/bump_version` or `bin/bump_version --patch`\n",
|
|
16
|
+
''
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def install_copilot_instructions
|
|
20
|
+
copy_file 'instructions/css.instructions.md', '.github/instructions/css.instructions.md'
|
|
21
|
+
copy_file 'instructions/js.instructions.md', '.github/instructions/js.instructions.md'
|
|
22
|
+
copy_file 'instructions/project.instructions.md', '.github/instructions/project.instructions.md'
|
|
23
|
+
copy_file 'instructions/ruby.instructions.md', '.github/instructions/ruby.instructions.md'
|
|
24
|
+
copy_file 'instructions/slim.instructions.md', '.github/instructions/slim.instructions.md'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def install_ci_yml
|
|
28
|
+
copy_file 'templates/ci.yml', '.github/workflows/ci.yml'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def update_database_yml_for_ci
|
|
32
|
+
insert_into_file 'config/database.yml', after: /database: .*_test.*\n/ do
|
|
33
|
+
optimize_indentation <<~YML, 2
|
|
34
|
+
<% if ENV.has_key?("POSTGRES_USER") %>
|
|
35
|
+
username: <%= ENV.fetch("POSTGRES_USER") %>
|
|
36
|
+
password: <%= ENV.fetch("POSTGRES_PASSWORD") { nil } %>
|
|
37
|
+
host: localhost
|
|
38
|
+
<% end %>
|
|
39
|
+
YML
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rolemodel
|
|
4
|
+
class GoodJobGenerator < BaseGenerator
|
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
|
6
|
+
|
|
7
|
+
def install_good_job
|
|
8
|
+
say 'Install GoodJob'
|
|
9
|
+
|
|
10
|
+
bundle_command 'add good_job'
|
|
11
|
+
run_bundle
|
|
12
|
+
|
|
13
|
+
generate 'good_job:install'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def configure_good_job
|
|
17
|
+
say 'Add GoodJob configuration'
|
|
18
|
+
|
|
19
|
+
inject_into_file 'config/application.rb', after: "class Application < Rails::Application\n" do
|
|
20
|
+
optimize_indentation <<~'RUBY', 4
|
|
21
|
+
# Add GoodJob ActiveJob queue adapter
|
|
22
|
+
config.active_job.queue_adapter = :good_job
|
|
23
|
+
|
|
24
|
+
RUBY
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
gsub_file 'config/environments/production.rb', 'config.active_job.queue_adapter', '# config.active_job.queue_adapter'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def configure_good_job_routes
|
|
31
|
+
say 'Add GoodJob routes'
|
|
32
|
+
|
|
33
|
+
route_text = <<~RUBY
|
|
34
|
+
# Example but update per the authorization strategy of app
|
|
35
|
+
namespace :admin do
|
|
36
|
+
# authenticate :user, ->(user) { user.admin? } do
|
|
37
|
+
mount GoodJob::Engine => 'good_job'
|
|
38
|
+
# end
|
|
39
|
+
end
|
|
40
|
+
RUBY
|
|
41
|
+
route route_text
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def configure_procfile
|
|
45
|
+
say 'Add GoodJob to Procfile'
|
|
46
|
+
|
|
47
|
+
if File.exist?(Rails.root.join('Procfile'))
|
|
48
|
+
append_to_file 'Procfile', <<~COMMAND
|
|
49
|
+
worker: bundle exec good_job start
|
|
50
|
+
COMMAND
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
append_to_file 'Procfile.dev', <<~COMMAND
|
|
54
|
+
worker: bundle exec good_job start
|
|
55
|
+
COMMAND
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def copy_initializers
|
|
59
|
+
say 'Add GoodJob initializers'
|
|
60
|
+
|
|
61
|
+
copy_file 'config/initializers/active_job.rb'
|
|
62
|
+
copy_file 'config/initializers/good_job.rb'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def finishing_notes
|
|
66
|
+
say <<~NOTES
|
|
67
|
+
*** Reminder to update Honeybadger gem to version 5.7.0 or later to get correct GoodJob error notifications in Honeybadger
|
|
68
|
+
|
|
69
|
+
*** Reminder to also update your job classes to include appropriate concurrency controls (enqueue_limit/perform_limit with keys)
|
|
70
|
+
NOTES
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# *** NOTE ABOUT ORDERING OF discard_on/retry_on
|
|
4
|
+
# https://api.rubyonrails.org/v7.1.3.2/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-retry_on
|
|
5
|
+
# 'retry_on' and 'discard_on' handlers are searched from bottom to top, and up the class hierarchy.
|
|
6
|
+
# The handler of the first class for which exception.is_a?(klass) holds true is the one invoked, if any.
|
|
7
|
+
|
|
8
|
+
# Add retry at ActiveJob::Base level to ensure all jobs retry 25 times by default regardless
|
|
9
|
+
# of where the job originates from
|
|
10
|
+
# Note: Rails 6 should use :exponentially_longer
|
|
11
|
+
ActiveJob::Base.retry_on StandardError, wait: :polynomially_longer, attempts: 25
|
|
12
|
+
|
|
13
|
+
# Automatically retry jobs that encountered a deadlock
|
|
14
|
+
ActiveJob::Base.retry_on ActiveRecord::Deadlocked
|
|
15
|
+
|
|
16
|
+
ActiveJob::Base.discard_on ActiveJob::DeserializationError
|
|
17
|
+
ActiveJob::Base.discard_on ActiveRecord::RecordNotFound
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# NOTE: queues - Configuring queues is an important part of prioritization. GoodJob uses
|
|
4
|
+
# multiple ways to override. 12factor override used here with fallback to a common queue
|
|
5
|
+
# override example/pattern for Heroku apps using pdf generation limiting to serial
|
|
6
|
+
# processing to constrain resource [memory] limitations
|
|
7
|
+
|
|
8
|
+
# NOTE: execution_mode - development defaults to async but has known to hang in certain
|
|
9
|
+
# [unidentified] situations so use external which gives devs more control on running too
|
|
10
|
+
|
|
11
|
+
Rails.application.configure do
|
|
12
|
+
config.good_job = {
|
|
13
|
+
smaller_number_is_higher_priority: true, # new default in V4 and for all of ActiveJob
|
|
14
|
+
queues: ENV.fetch('GOOD_JOB_QUEUES', 'pdf:1;-pdf'), # see note above
|
|
15
|
+
execution_mode: Rails.env.test? ? :inline : :external # see note above
|
|
16
|
+
# enable_cron: true,
|
|
17
|
+
# cron: {
|
|
18
|
+
# <cron_label>: {
|
|
19
|
+
# cron: 'every friday at 12pm EST',
|
|
20
|
+
# class: '<class_name>'
|
|
21
|
+
# }
|
|
22
|
+
# }
|
|
23
|
+
}
|
|
24
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Heroku Generator
|
|
2
|
+
|
|
3
|
+
## What you get
|
|
4
|
+
|
|
5
|
+
* Procfile configured for a server process and a release command to run migrations
|
|
6
|
+
* Basic app.json preconfigured with a script to initialize the database and common environment variables, addons, and buildpacks
|
|
7
|
+
|
|
8
|
+
This is the basic config needed to deploy to Heroku.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Rolemodel
|
|
2
|
+
class HerokuGenerator < BaseGenerator
|
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
|
4
|
+
|
|
5
|
+
def install_app_json
|
|
6
|
+
say 'Install app.json file', :green
|
|
7
|
+
|
|
8
|
+
@project_name = Rails.application.class.try(:parent_name) || Rails.application.class.module_parent_name
|
|
9
|
+
template 'app.json'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def install_procfile
|
|
13
|
+
say 'Install Procfile', :green
|
|
14
|
+
|
|
15
|
+
template 'Procfile'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def force_ssl
|
|
19
|
+
say 'Require SSL for production environment.', :green
|
|
20
|
+
|
|
21
|
+
uncomment_lines('config/environments/production.rb', 'config.force_ssl = true')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def enable_log_level_configurability
|
|
25
|
+
say 'Enable log-level adjustment via "LOG_LEVEL" environment variable', :green
|
|
26
|
+
|
|
27
|
+
gsub_file(
|
|
28
|
+
'config/environments/production.rb',
|
|
29
|
+
'config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")',
|
|
30
|
+
"config.log_level = ENV.fetch('LOG_LEVEL', 'INFO')"
|
|
31
|
+
)
|
|
32
|
+
gsub_file('config/environments/production.rb', 'config.log_level = :info', "config.log_level = ENV.fetch('LOG_LEVEL', 'INFO')")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create_assets_rake_tasks # rubocop:disable Metrics/MethodLength
|
|
36
|
+
say 'Enhancing assets:precompile task to remove node_modules directory during production build.', :green
|
|
37
|
+
rakefile('assets.rake', <<~RAKE)
|
|
38
|
+
# All runtime asset dependencies should be bundled by Webpack during asset precompilation.
|
|
39
|
+
# Therefore, the node_modules directory can be removed after assets are compiled to significantly reduce slug size.
|
|
40
|
+
# In rare cases, you may have a runtime dependency into node_modules directly. If this is the case and you are unable
|
|
41
|
+
# to bundle the dependency, delete this file and the node_modules directory will be included in your production slug.
|
|
42
|
+
|
|
43
|
+
Rake::Task['assets:precompile'].enhance do
|
|
44
|
+
if Rails.env.production?
|
|
45
|
+
puts '----> Removing node_modules directory to reduce slug size.'
|
|
46
|
+
FileUtils.rm_rf(Rails.root.join('node_modules'))
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
RAKE
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|