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.
Files changed (251) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +161 -0
  4. data/Rakefile +6 -0
  5. data/lib/generators/rolemodel/README.md +29 -0
  6. data/lib/generators/rolemodel/USAGE +5 -0
  7. data/lib/generators/rolemodel/all_generator.rb +29 -0
  8. data/lib/generators/rolemodel/base_generator.rb +14 -0
  9. data/lib/generators/rolemodel/editors/README.md +9 -0
  10. data/lib/generators/rolemodel/editors/USAGE +9 -0
  11. data/lib/generators/rolemodel/editors/editors_generator.rb +30 -0
  12. data/lib/generators/rolemodel/editors/vscode_helpers.rb +22 -0
  13. data/lib/generators/rolemodel/github/README.md +23 -0
  14. data/lib/generators/rolemodel/github/USAGE +9 -0
  15. data/lib/generators/rolemodel/github/github_generator.rb +43 -0
  16. data/lib/generators/rolemodel/good_job/README.md +13 -0
  17. data/lib/generators/rolemodel/good_job/USAGE +5 -0
  18. data/lib/generators/rolemodel/good_job/good_job_generator.rb +73 -0
  19. data/lib/generators/rolemodel/good_job/templates/config/initializers/active_job.rb +17 -0
  20. data/lib/generators/rolemodel/good_job/templates/config/initializers/good_job.rb +24 -0
  21. data/lib/generators/rolemodel/heroku/README.md +8 -0
  22. data/lib/generators/rolemodel/heroku/USAGE +9 -0
  23. data/lib/generators/rolemodel/heroku/heroku_generator.rb +52 -0
  24. data/lib/generators/rolemodel/heroku/templates/Procfile +2 -0
  25. data/lib/generators/rolemodel/heroku/templates/app.json.tt +30 -0
  26. data/lib/generators/rolemodel/kaminari/README.md +14 -0
  27. data/lib/generators/rolemodel/kaminari/USAGE +5 -0
  28. data/lib/generators/rolemodel/kaminari/kaminari_generator.rb +17 -0
  29. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_first_page.html.slim +9 -0
  30. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_gap.html.slim +8 -0
  31. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_last_page.html.slim +9 -0
  32. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_next_page.html.slim +12 -0
  33. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_page.html.slim +10 -0
  34. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_paginator.html.slim +19 -0
  35. data/lib/generators/rolemodel/kaminari/templates/app/views/kaminari/_prev_page.html.slim +12 -0
  36. data/lib/generators/rolemodel/linters/README.md +32 -0
  37. data/lib/generators/rolemodel/linters/USAGE +5 -0
  38. data/lib/generators/rolemodel/linters/all_generator.rb +14 -0
  39. data/lib/generators/rolemodel/linters/eslint/README.md +5 -0
  40. data/lib/generators/rolemodel/linters/eslint/USAGE +8 -0
  41. data/lib/generators/rolemodel/linters/eslint/eslint_generator.rb +33 -0
  42. data/lib/generators/rolemodel/linters/eslint/templates/eslint.config.js +92 -0
  43. data/lib/generators/rolemodel/linters/rubocop/README.md +7 -0
  44. data/lib/generators/rolemodel/linters/rubocop/USAGE +9 -0
  45. data/lib/generators/rolemodel/linters/rubocop/rubocop_generator.rb +23 -0
  46. data/lib/generators/rolemodel/linters/rubocop/templates/lib/cops/form_error_response.rb +54 -0
  47. data/lib/generators/rolemodel/linters/rubocop/templates/lib/cops/no_chrome_tag.rb +45 -0
  48. data/lib/generators/rolemodel/lograge/README.md +10 -0
  49. data/lib/generators/rolemodel/lograge/USAGE +8 -0
  50. data/lib/generators/rolemodel/lograge/lograge_generator.rb +15 -0
  51. data/lib/generators/rolemodel/lograge/templates/config/initializers/lograge.rb +16 -0
  52. data/lib/generators/rolemodel/mailers/README.md +13 -0
  53. data/lib/generators/rolemodel/mailers/USAGE +22 -0
  54. data/lib/generators/rolemodel/mailers/mailers_generator.rb +99 -0
  55. data/lib/generators/rolemodel/mailers/templates/app/assets/stylesheets/mailer.scss +61 -0
  56. data/lib/generators/rolemodel/mailers/templates/app/mailers/example_mailer.rb +8 -0
  57. data/lib/generators/rolemodel/mailers/templates/app/mailers/staging_mailer_interceptor.rb +9 -0
  58. data/lib/generators/rolemodel/mailers/templates/app/views/example_mailer/example_email.html.slim +16 -0
  59. data/lib/generators/rolemodel/mailers/templates/app/views/layouts/mailer.html.slim +16 -0
  60. data/lib/generators/rolemodel/mailers/templates/config/initializers/premailer_rails.rb +15 -0
  61. data/lib/generators/rolemodel/mailers/templates/public/logo.png +0 -0
  62. data/lib/generators/rolemodel/mailers/templates/spec/mailers/previews/example_mailer_preview.rb +6 -0
  63. data/lib/generators/rolemodel/optics/README.md +8 -0
  64. data/lib/generators/rolemodel/optics/USAGE +5 -0
  65. data/lib/generators/rolemodel/optics/all_generator.rb +12 -0
  66. data/lib/generators/rolemodel/optics/base/README.md +9 -0
  67. data/lib/generators/rolemodel/optics/base/USAGE +5 -0
  68. data/lib/generators/rolemodel/optics/base/base_generator.rb +21 -0
  69. data/lib/generators/rolemodel/optics/icons/README.md +7 -0
  70. data/lib/generators/rolemodel/optics/icons/USAGE +8 -0
  71. data/lib/generators/rolemodel/optics/icons/icons_generator.rb +48 -0
  72. data/lib/generators/rolemodel/optics/icons/templates/app/helpers/icon_helper.rb.tt +24 -0
  73. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/custom_icon_builder.rb +53 -0
  74. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/feather_icon_builder.rb +22 -0
  75. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/icon_builder.rb +73 -0
  76. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/lucide_icon_builder.rb +22 -0
  77. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/material_icon_builder.rb +31 -0
  78. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/phosphor_icon_builder.rb +27 -0
  79. data/lib/generators/rolemodel/optics/icons/templates/app/icon_builders/tabler_icon_builder.rb +22 -0
  80. data/lib/generators/rolemodel/react/README.md +12 -0
  81. data/lib/generators/rolemodel/react/USAGE +5 -0
  82. data/lib/generators/rolemodel/react/react_generator.rb +36 -0
  83. data/lib/generators/rolemodel/react/templates/app/helpers/react_helper.rb +11 -0
  84. data/lib/generators/rolemodel/react/templates/app/javascript/components/HelloReact.jsx +14 -0
  85. data/lib/generators/rolemodel/react/templates/app/javascript/controllers/react_controller.js +24 -0
  86. data/lib/generators/rolemodel/readme/README.md +9 -0
  87. data/lib/generators/rolemodel/readme/USAGE +8 -0
  88. data/lib/generators/rolemodel/readme/readme_generator.rb +11 -0
  89. data/lib/generators/rolemodel/readme/templates/README.md.erb +116 -0
  90. data/lib/generators/rolemodel/replace_content_helper.rb +29 -0
  91. data/lib/generators/rolemodel/saas/README.md +7 -0
  92. data/lib/generators/rolemodel/saas/USAGE +5 -0
  93. data/lib/generators/rolemodel/saas/all_generator.rb +15 -0
  94. data/lib/generators/rolemodel/saas/devise/README.md +24 -0
  95. data/lib/generators/rolemodel/saas/devise/USAGE +25 -0
  96. data/lib/generators/rolemodel/saas/devise/devise_generator.rb +172 -0
  97. data/lib/generators/rolemodel/saas/devise/templates/app/assets/stylesheets/login.css +30 -0
  98. data/lib/generators/rolemodel/saas/devise/templates/app/controllers/admin/users_controller.rb +34 -0
  99. data/lib/generators/rolemodel/saas/devise/templates/app/controllers/application_controller.rb +11 -0
  100. data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/invitations_controller.rb +77 -0
  101. data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
  102. data/lib/generators/rolemodel/saas/devise/templates/app/controllers/users/registrations_controller.rb +80 -0
  103. data/lib/generators/rolemodel/saas/devise/templates/app/views/admin/users/edit.html.slim +10 -0
  104. data/lib/generators/rolemodel/saas/devise/templates/app/views/admin/users/index.html.slim +27 -0
  105. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/confirmations/new.html.slim +11 -0
  106. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/invitations/edit.html.slim +13 -0
  107. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/invitations/new.html.slim +14 -0
  108. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/confirmation_instructions.html.slim +3 -0
  109. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/email_changed.html.slim +5 -0
  110. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/invitation_instructions.html.slim +11 -0
  111. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/invitation_instructions.text.slim +6 -0
  112. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/password_change.html.slim +2 -0
  113. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/reset_password_instructions.html.slim +5 -0
  114. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/mailer/unlock_instructions.html.slim +4 -0
  115. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/passwords/edit.html.slim +13 -0
  116. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/passwords/new.html.slim +11 -0
  117. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/registrations/edit.html.slim +34 -0
  118. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/registrations/new.html.slim +17 -0
  119. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/sessions/new.html.slim +14 -0
  120. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/shared/_error_messages.html.slim +9 -0
  121. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/shared/_links.html.slim +14 -0
  122. data/lib/generators/rolemodel/saas/devise/templates/app/views/devise/unlocks/new.html.slim +11 -0
  123. data/lib/generators/rolemodel/saas/devise/templates/config/locales/devise.en.yml +151 -0
  124. data/lib/generators/rolemodel/saas/devise/templates/config/locales/devise_invitable.en.yml +31 -0
  125. data/lib/generators/rolemodel/saas/devise/templates/spec/factories/organizations.rb +9 -0
  126. data/lib/generators/rolemodel/saas/devise/templates/spec/factories/users.rb +33 -0
  127. data/lib/generators/rolemodel/saas/devise/templates/spec/mailers/previews/devise_mailer_preview.rb +36 -0
  128. data/lib/generators/rolemodel/saas/devise/templates/spec/models/user_spec.rb +29 -0
  129. data/lib/generators/rolemodel/saas/devise/templates/spec/support/devise.rb +8 -0
  130. data/lib/generators/rolemodel/saas/devise/templates/spec/system/users_spec.rb +128 -0
  131. data/lib/generators/rolemodel/semaphore/README.md +15 -0
  132. data/lib/generators/rolemodel/semaphore/USAGE +11 -0
  133. data/lib/generators/rolemodel/semaphore/semaphore_generator.rb +25 -0
  134. data/lib/generators/rolemodel/semaphore/templates/heroku-deployment-commands.sh +3 -0
  135. data/lib/generators/rolemodel/semaphore/templates/production-deploy.yml.erb +17 -0
  136. data/lib/generators/rolemodel/semaphore/templates/semaphore.yml.erb +145 -0
  137. data/lib/generators/rolemodel/semaphore/templates/staging-deploy.yml.erb +17 -0
  138. data/lib/generators/rolemodel/simple_form/README.md +10 -0
  139. data/lib/generators/rolemodel/simple_form/USAGE +11 -0
  140. data/lib/generators/rolemodel/simple_form/simple_form_generator.rb +20 -0
  141. data/lib/generators/rolemodel/simple_form/templates/app/inputs/collection_check_boxes_input.rb +7 -0
  142. data/lib/generators/rolemodel/simple_form/templates/app/inputs/collection_select_input.rb +7 -0
  143. data/lib/generators/rolemodel/simple_form/templates/app/inputs/grouped_collection_select_input.rb +7 -0
  144. data/lib/generators/rolemodel/simple_form/templates/app/inputs/segmented_control_input.rb +48 -0
  145. data/lib/generators/rolemodel/simple_form/templates/app/inputs/switch_checkbox_input.rb +39 -0
  146. data/lib/generators/rolemodel/simple_form/templates/app/inputs/tailored_select_input.rb +75 -0
  147. data/lib/generators/rolemodel/simple_form/templates/config/initializers/simple_form.rb +207 -0
  148. data/lib/generators/rolemodel/simple_form/templates/config/locales/simple_form.en.yml +31 -0
  149. data/lib/generators/rolemodel/simple_form/templates/lib/templates/slim/scaffold/_form.html.slim.tt +12 -0
  150. data/lib/generators/rolemodel/slim/README.md +9 -0
  151. data/lib/generators/rolemodel/slim/USAGE +5 -0
  152. data/lib/generators/rolemodel/slim/slim_generator.rb +24 -0
  153. data/lib/generators/rolemodel/slim/templates/app/views/application/_head.html.slim.tt +13 -0
  154. data/lib/generators/rolemodel/slim/templates/app/views/layouts/application.html.slim.tt +6 -0
  155. data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/edit.html.slim.tt +15 -0
  156. data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/index.html.slim.tt +13 -0
  157. data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/new.html.slim.tt +13 -0
  158. data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/partial.html.slim.tt +10 -0
  159. data/lib/generators/rolemodel/slim/templates/lib/templates/slim/scaffold/show.html.slim.tt +33 -0
  160. data/lib/generators/rolemodel/soft_destroyable/README.md +8 -0
  161. data/lib/generators/rolemodel/soft_destroyable/USAGE +9 -0
  162. data/lib/generators/rolemodel/soft_destroyable/soft_destroyable_generator.rb +13 -0
  163. data/lib/generators/rolemodel/soft_destroyable/templates/soft_destroyable.rb +82 -0
  164. data/lib/generators/rolemodel/soft_destroyable/templates/soft_destroyable_behavior.rb +166 -0
  165. data/lib/generators/rolemodel/source_map/README.md +13 -0
  166. data/lib/generators/rolemodel/source_map/USAGE +9 -0
  167. data/lib/generators/rolemodel/source_map/source_map_generator.rb +22 -0
  168. data/lib/generators/rolemodel/source_map/templates/lib/middleware/rolemodel/source_map.rb +45 -0
  169. data/lib/generators/rolemodel/source_map/templates/lib/tasks/assets.rake +43 -0
  170. data/lib/generators/rolemodel/tailored_select/README.md +7 -0
  171. data/lib/generators/rolemodel/tailored_select/USAGE +5 -0
  172. data/lib/generators/rolemodel/tailored_select/tailored_select_generator.rb +13 -0
  173. data/lib/generators/rolemodel/testing/README.md +11 -0
  174. data/lib/generators/rolemodel/testing/USAGE +5 -0
  175. data/lib/generators/rolemodel/testing/all_generator.rb +17 -0
  176. data/lib/generators/rolemodel/testing/factory_bot/README.md +18 -0
  177. data/lib/generators/rolemodel/testing/factory_bot/USAGE +8 -0
  178. data/lib/generators/rolemodel/testing/factory_bot/factory_bot_generator.rb +20 -0
  179. data/lib/generators/rolemodel/testing/factory_bot/templates/support/factory_bot.rb +3 -0
  180. data/lib/generators/rolemodel/testing/jasmine_playwright/README.md +9 -0
  181. data/lib/generators/rolemodel/testing/jasmine_playwright/jasmine_playwright_generator.rb +52 -0
  182. data/lib/generators/rolemodel/testing/jasmine_playwright/templates/jp-runner.config.mjs +5 -0
  183. data/lib/generators/rolemodel/testing/jasmine_playwright/templates/spec/javascript/browser/example_spec.js +15 -0
  184. data/lib/generators/rolemodel/testing/jasmine_playwright/templates/spec/javascript/browser/setupTests.js +3 -0
  185. data/lib/generators/rolemodel/testing/jasmine_playwright/templates/support/react.mjs +26 -0
  186. data/lib/generators/rolemodel/testing/parallel_tests/README.md +53 -0
  187. data/lib/generators/rolemodel/testing/parallel_tests/USAGE +12 -0
  188. data/lib/generators/rolemodel/testing/parallel_tests/parallel_tests_generator.rb +42 -0
  189. data/lib/generators/rolemodel/testing/rspec/README.md +46 -0
  190. data/lib/generators/rolemodel/testing/rspec/USAGE +14 -0
  191. data/lib/generators/rolemodel/testing/rspec/rspec_generator.rb +46 -0
  192. data/lib/generators/rolemodel/testing/rspec/templates/rails_helper.rb +72 -0
  193. data/lib/generators/rolemodel/testing/rspec/templates/spec_helper.rb +97 -0
  194. data/lib/generators/rolemodel/testing/rspec/templates/support/capybara_drivers.rb +51 -0
  195. data/lib/generators/rolemodel/testing/rspec/templates/support/capybara_testid.rb +5 -0
  196. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/action_cable_helper.rb +5 -0
  197. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/capybara_helper.rb +72 -0
  198. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/playwright_helper.rb +85 -0
  199. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/select_helper.rb +33 -0
  200. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers/test_element_helper.rb +11 -0
  201. data/lib/generators/rolemodel/testing/rspec/templates/support/helpers.rb +12 -0
  202. data/lib/generators/rolemodel/testing/test_prof/README.md +5 -0
  203. data/lib/generators/rolemodel/testing/test_prof/USAGE +5 -0
  204. data/lib/generators/rolemodel/testing/test_prof/test_prof_generator.rb +14 -0
  205. data/lib/generators/rolemodel/testing/vitest/README.md +5 -0
  206. data/lib/generators/rolemodel/testing/vitest/USAGE +5 -0
  207. data/lib/generators/rolemodel/testing/vitest/templates/spec/javascript/example.spec.js +12 -0
  208. data/lib/generators/rolemodel/testing/vitest/templates/spec/javascript/test-setup.js +1 -0
  209. data/lib/generators/rolemodel/testing/vitest/templates/vitest.config.js +23 -0
  210. data/lib/generators/rolemodel/testing/vitest/vitest_generator.rb +38 -0
  211. data/lib/generators/rolemodel/ui_components/README.md +9 -0
  212. data/lib/generators/rolemodel/ui_components/USAGE +5 -0
  213. data/lib/generators/rolemodel/ui_components/all_generator.rb +15 -0
  214. data/lib/generators/rolemodel/ui_components/flash/README.md +10 -0
  215. data/lib/generators/rolemodel/ui_components/flash/USAGE +9 -0
  216. data/lib/generators/rolemodel/ui_components/flash/flash_generator.rb +22 -0
  217. data/lib/generators/rolemodel/ui_components/flash/templates/app/views/application/_flash.html.slim +6 -0
  218. data/lib/generators/rolemodel/ui_components/flash/templates/spec/support/matchers/flash_matchers.rb +19 -0
  219. data/lib/generators/rolemodel/ui_components/modals/README.md +119 -0
  220. data/lib/generators/rolemodel/ui_components/modals/USAGE +8 -0
  221. data/lib/generators/rolemodel/ui_components/modals/modals_generator.rb +74 -0
  222. data/lib/generators/rolemodel/ui_components/modals/templates/app/helpers/turbo_frame_link_helper.rb +20 -0
  223. data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/controllers/morph_controller.js +23 -0
  224. data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/controllers/toggle_controller.js +55 -0
  225. data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/before_morph_handler.js +21 -0
  226. data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/frame_missing_handler.js +12 -0
  227. data/lib/generators/rolemodel/ui_components/modals/templates/app/javascript/initializers/turbo_confirm.js +3 -0
  228. data/lib/generators/rolemodel/ui_components/modals/templates/app/views/application/_confirm.html.slim +12 -0
  229. data/lib/generators/rolemodel/ui_components/modals/templates/app/views/layouts/modal.html.slim.tt +26 -0
  230. data/lib/generators/rolemodel/ui_components/modals/templates/app/views/layouts/panel.html.slim.tt +21 -0
  231. data/lib/generators/rolemodel/ui_components/navbar/README.md +11 -0
  232. data/lib/generators/rolemodel/ui_components/navbar/USAGE +10 -0
  233. data/lib/generators/rolemodel/ui_components/navbar/navbar_generator.rb +54 -0
  234. data/lib/generators/rolemodel/ui_components/navbar/templates/app/assets/stylesheets/components/shoelace/index.scss +2 -0
  235. data/lib/generators/rolemodel/ui_components/navbar/templates/app/javascript/lib/shoelace.js +9 -0
  236. data/lib/generators/rolemodel/ui_components/navbar/templates/app/views/layouts/_navbar.html.slim +29 -0
  237. data/lib/generators/rolemodel/webpack/README.md +8 -0
  238. data/lib/generators/rolemodel/webpack/USAGE +5 -0
  239. data/lib/generators/rolemodel/webpack/templates/app/assets/stylesheets/application.scss +5 -0
  240. data/lib/generators/rolemodel/webpack/templates/app/javascript/initializers/honeybadger.js +26 -0
  241. data/lib/generators/rolemodel/webpack/templates/postcss.config.cjs +14 -0
  242. data/lib/generators/rolemodel/webpack/templates/webpack.config.js +104 -0
  243. data/lib/generators/rolemodel/webpack/webpack_generator.rb +76 -0
  244. data/lib/generators/templates/generator/%filename%.rb.tt +11 -0
  245. data/lib/generators/templates/generator/README.md.tt +11 -0
  246. data/lib/generators/templates/generator/USAGE.tt +5 -0
  247. data/lib/generators/templates/generator_spec/%filename%_spec.rb.tt +5 -0
  248. data/lib/rolemodel/engine.rb +9 -0
  249. data/lib/rolemodel/version.rb +5 -0
  250. data/lib/rolemodel-rails.rb +7 -0
  251. 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,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -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,5 @@
1
+ Description:
2
+ runs all the generators
3
+
4
+ Example:
5
+ rails generate rolemodel:all
@@ -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,9 @@
1
+ Description:
2
+ generates EditorConfig and recommends VSCode extensions
3
+
4
+ Example:
5
+ rails generate rolemodel:editors
6
+
7
+ This will create:
8
+ .editorconfig
9
+ .vscode/extensions.json
@@ -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,9 @@
1
+ Description:
2
+ Sets up our standard Github configuration
3
+
4
+ Example:
5
+ rails generate rolemodel:github
6
+
7
+ This will create:
8
+ .github/pull_request_template.md
9
+ .github/workflows/ci.yml
@@ -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,13 @@
1
+ # GoodJob Background Job Generator
2
+
3
+ ```
4
+ rails g rolemodel:good_job
5
+ ```
6
+
7
+ ## Depends On
8
+
9
+ - nothing
10
+
11
+ ## What you get
12
+
13
+ Pulls in [GoodJob](https://github.com/bensheldon/good_job)
@@ -0,0 +1,5 @@
1
+ Description:
2
+ Sets up our standard GoodJob configuration
3
+
4
+ Example:
5
+ rails generate rolemodel:good_job
@@ -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,9 @@
1
+ Description:
2
+ Sets up our standard Heroku deployment configuration
3
+
4
+ Example:
5
+ rails generate rolemodel:heroku
6
+
7
+ This will create:
8
+ app.json
9
+ Procfile
@@ -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
@@ -0,0 +1,2 @@
1
+ web: bundle exec puma -C config/puma.rb
2
+ release: bin/rails db:migrate