rockstart 0.1.0 → 0.1.1

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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/lib/generators/rockstart/authorization/USAGE +9 -0
  4. data/lib/generators/rockstart/authorization/auth0/USAGE +10 -0
  5. data/lib/generators/rockstart/authorization/auth0/auth0_generator.rb +49 -0
  6. data/lib/generators/rockstart/authorization/auth0/templates/app/controllers/auth_controller.rb.tt +47 -0
  7. data/lib/generators/rockstart/authorization/auth0/templates/app/controllers/concerns/session_auth.rb +23 -0
  8. data/lib/generators/rockstart/authorization/auth0/templates/app/models/user.rb.tt +82 -0
  9. data/lib/generators/rockstart/authorization/auth0/templates/app/views/auth/new.html.erb +3 -0
  10. data/lib/generators/rockstart/authorization/auth0/templates/app/views/auth/sign_out.html.erb +1 -0
  11. data/lib/generators/rockstart/authorization/auth0/templates/auth0.en.yml +5 -0
  12. data/lib/generators/rockstart/authorization/auth0/templates/auth0_initializer.rb +27 -0
  13. data/lib/generators/rockstart/authorization/auth0/templates/auth0_util.rb.tt +38 -0
  14. data/lib/generators/rockstart/authorization/auth0/templates/auth0_util_spec.rb +21 -0
  15. data/lib/generators/rockstart/authorization/auth0/templates/spec/factories/users.rb.tt +32 -0
  16. data/lib/generators/rockstart/authorization/auth0/templates/spec/models/user_spec.rb.tt +91 -0
  17. data/lib/generators/rockstart/authorization/auth0/templates/spec/requests/auth_spec.rb +94 -0
  18. data/lib/generators/rockstart/authorization/auth0/templates/spec/support/auth_request_helper.rb +27 -0
  19. data/lib/generators/rockstart/authorization/authorization_generator.rb +29 -0
  20. data/lib/generators/rockstart/{devise → authorization/devise}/USAGE +3 -1
  21. data/lib/generators/rockstart/authorization/devise/devise_generator.rb +208 -0
  22. data/lib/generators/rockstart/authorization/devise/templates/add_devise_to_users_migration.rb.tt +50 -0
  23. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/passwords_controller.rb +0 -0
  24. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/registrations_controller.rb +0 -0
  25. data/lib/generators/rockstart/{devise → authorization/devise}/templates/controllers/sessions_controller.rb +0 -0
  26. data/lib/generators/rockstart/{devise → authorization/devise}/templates/create_user_migration.rb.tt +0 -0
  27. data/lib/generators/rockstart/{devise → authorization/devise}/templates/models/user.rb +14 -2
  28. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/factories/users.rb +0 -0
  29. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/models/user_spec.rb +9 -21
  30. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/passwords_spec.rb +0 -0
  31. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/registrations_spec.rb +2 -11
  32. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/requests/users/sessions_spec.rb +1 -38
  33. data/lib/generators/rockstart/{devise → authorization/devise}/templates/spec/support/devise_request_spec_helper.rb +0 -0
  34. data/lib/generators/rockstart/{devise → authorization/devise}/templates/translations.en.yml +0 -0
  35. data/lib/generators/rockstart/{pundit → authorization/pundit}/USAGE +1 -1
  36. data/lib/generators/rockstart/authorization/pundit/pundit_generator.rb +41 -0
  37. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/app/controllers/concerns/pundit_error_handling.rb +0 -0
  38. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/app/policies/application_policy.rb +0 -0
  39. data/lib/generators/rockstart/{pundit/templates/app/policies/user_policy.rb → authorization/pundit/templates/app/policies/user_policy.rb.tt} +4 -0
  40. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/config/locales/pundit.en.yml +0 -0
  41. data/lib/generators/rockstart/authorization/pundit/templates/lib/admin_constraint.rb +11 -0
  42. data/lib/generators/rockstart/{pundit/templates/lib/templates/pundit/policy/policy.rb → authorization/pundit/templates/scaffold/policy.rb.tt} +0 -0
  43. data/lib/generators/rockstart/{pundit/templates/lib/templates/rspec/policy/policy_spec.rb → authorization/pundit/templates/scaffold/policy_spec.rb.tt} +0 -0
  44. data/lib/generators/rockstart/{pundit/templates/spec/policies/user_policy_spec.rb → authorization/pundit/templates/spec/policies/user_policy_spec.rb.tt} +43 -5
  45. data/lib/generators/rockstart/{pundit → authorization/pundit}/templates/spec/support/pundit_matchers.rb +0 -0
  46. data/lib/generators/rockstart/deployment/USAGE +8 -0
  47. data/lib/generators/rockstart/deployment/deployment_generator.rb +78 -0
  48. data/lib/generators/rockstart/{docker → deployment/docker}/USAGE +0 -0
  49. data/lib/generators/rockstart/deployment/docker/docker_generator.rb +70 -0
  50. data/lib/generators/rockstart/{docker → deployment/docker}/templates/app/Dockerfile-app +6 -5
  51. data/lib/generators/rockstart/{docker → deployment/docker}/templates/docker-compose.test.yml +5 -2
  52. data/lib/generators/rockstart/deployment/docker/templates/docker-compose.yml +74 -0
  53. data/lib/generators/rockstart/{docker → deployment/docker}/templates/dockerignore +0 -0
  54. data/lib/generators/rockstart/deployment/docker/templates/dotenv.docker-db.tt +3 -0
  55. data/lib/generators/rockstart/deployment/docker/templates/dotenv.docker.tt +20 -0
  56. data/lib/generators/rockstart/{docker → deployment/docker}/templates/web/Dockerfile-web +0 -0
  57. data/lib/generators/rockstart/{docker → deployment/docker}/templates/web/nginx.conf +24 -1
  58. data/lib/generators/rockstart/deployment/heroku/USAGE +9 -0
  59. data/lib/generators/rockstart/deployment/heroku/heroku_generator.rb +50 -0
  60. data/lib/generators/rockstart/deployment/heroku/templates/Procfile.tt +5 -0
  61. data/lib/generators/rockstart/deployment/heroku/templates/app.json.tt +50 -0
  62. data/lib/generators/rockstart/deployment/heroku/templates/deploy-heroku.tt +42 -0
  63. data/lib/generators/rockstart/deployment/heroku/templates/heroku.rake.tt +25 -0
  64. data/lib/generators/rockstart/deployment/heroku/templates/slugignore +3 -0
  65. data/lib/generators/rockstart/deployment/nginx/USAGE +8 -0
  66. data/lib/generators/rockstart/deployment/nginx/nginx_generator.rb +20 -0
  67. data/lib/generators/rockstart/deployment/templates/hooks-postdeploy.tt +22 -0
  68. data/lib/generators/rockstart/deployment/templates/hooks-release.tt +17 -0
  69. data/lib/generators/rockstart/deployment/templates/rack_deflater_spec.rb +28 -0
  70. data/lib/generators/rockstart/deployment/templates/web.tt +3 -0
  71. data/lib/generators/rockstart/deployment/templates/worker.tt +3 -0
  72. data/lib/generators/rockstart/development/USAGE +10 -0
  73. data/lib/generators/rockstart/development/audited/USAGE +10 -0
  74. data/lib/generators/rockstart/development/audited/audited_generator.rb +35 -0
  75. data/lib/generators/rockstart/development/audited/templates/audit.rb.tt +35 -0
  76. data/lib/generators/rockstart/development/audited/templates/audit_spec.rb.tt +54 -0
  77. data/lib/generators/rockstart/development/audited/templates/audited_initializer.rb +5 -0
  78. data/lib/generators/rockstart/development/audited/templates/audited_support.rb +3 -0
  79. data/lib/generators/rockstart/development/audited/templates/install_audited.rb.tt +45 -0
  80. data/lib/generators/rockstart/development/development_generator.rb +42 -0
  81. data/lib/generators/rockstart/development/env/USAGE +8 -0
  82. data/lib/generators/rockstart/development/env/env_generator.rb +17 -0
  83. data/lib/generators/rockstart/development/env/templates/dotenv.development.tt +4 -0
  84. data/lib/generators/rockstart/development/friendly_id/USAGE +8 -0
  85. data/lib/generators/rockstart/development/friendly_id/friendly_id_generator.rb +15 -0
  86. data/lib/generators/rockstart/development/friendly_id/templates/friendly_id_initializer.rb +52 -0
  87. data/lib/generators/rockstart/development/generator_overrides/USAGE +8 -0
  88. data/lib/generators/rockstart/development/generator_overrides/generator_overrides_generator.rb +31 -0
  89. data/lib/generators/rockstart/development/generator_overrides/templates/resource_route_generator.rb.tt +54 -0
  90. data/lib/generators/rockstart/development/localhost_setup/USAGE +8 -0
  91. data/lib/generators/rockstart/development/localhost_setup/localhost_setup_generator.rb +34 -0
  92. data/lib/generators/rockstart/{docker → development/localhost_setup}/templates/localhost_domains.ext.tt +0 -0
  93. data/lib/generators/rockstart/{docker → development/localhost_setup}/templates/setup-localhost.tt +5 -5
  94. data/lib/generators/rockstart/development/readme/USAGE +8 -0
  95. data/lib/generators/rockstart/development/readme/readme_generator.rb +18 -0
  96. data/lib/generators/rockstart/development/readme/templates/README.md +74 -0
  97. data/lib/generators/rockstart/development/rebuild/USAGE +8 -0
  98. data/lib/generators/rockstart/development/rebuild/rebuild_generator.rb +21 -0
  99. data/lib/generators/rockstart/development/rebuild/templates/rockstart.tt +28 -0
  100. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/USAGE +1 -1
  101. data/lib/generators/rockstart/development/scaffolds/scaffolds_generator.rb +46 -0
  102. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/templates/api_controller.rb.tt +15 -7
  103. data/lib/generators/rockstart/{scaffold_templates → development/scaffolds}/templates/controller.rb.tt +18 -9
  104. data/lib/generators/rockstart/development/scaffolds/templates/factory_bot/factories.erb +8 -0
  105. data/lib/generators/rockstart/development/scaffolds/templates/model.rb.tt +61 -0
  106. data/lib/generators/rockstart/development/scaffolds/templates/rspec/api_request_spec.rb.tt +142 -0
  107. data/lib/generators/rockstart/development/scaffolds/templates/rspec/model_spec.rb.tt +35 -0
  108. data/lib/generators/rockstart/development/scaffolds/templates/rspec/request_spec.rb.tt +492 -0
  109. data/lib/generators/rockstart/frontend_app/USAGE +10 -0
  110. data/lib/generators/rockstart/frontend_app/application_urls/USAGE +8 -0
  111. data/lib/generators/rockstart/frontend_app/application_urls/application_urls_generator.rb +28 -0
  112. data/lib/generators/rockstart/{frontend_helpers → frontend_app/application_urls}/templates/application_urls.rb +0 -0
  113. data/lib/generators/rockstart/{frontend_helpers → frontend_app/application_urls}/templates/application_urls_helper.rb +0 -0
  114. data/lib/generators/rockstart/frontend_app/assets/USAGE +8 -0
  115. data/lib/generators/rockstart/frontend_app/assets/assets_generator.rb +11 -0
  116. data/lib/generators/rockstart/frontend_app/assets/templates/assets.rake +22 -0
  117. data/lib/generators/rockstart/frontend_app/frontend_app_generator.rb +38 -0
  118. data/lib/generators/rockstart/frontend_app/simple_form/USAGE +8 -0
  119. data/lib/generators/rockstart/frontend_app/simple_form/simple_form_generator.rb +9 -0
  120. data/lib/generators/rockstart/frontend_app/titles/USAGE +8 -0
  121. data/lib/generators/rockstart/{frontend_helpers → frontend_app/titles}/templates/titles.en.yml.tt +0 -0
  122. data/lib/generators/rockstart/frontend_app/titles/titles_generator.rb +22 -0
  123. data/lib/generators/rockstart/gemset/USAGE +8 -0
  124. data/lib/generators/rockstart/gemset/gemset_generator.rb +129 -0
  125. data/lib/generators/rockstart/mailers/USAGE +8 -0
  126. data/lib/generators/rockstart/mailers/mailers_generator.rb +7 -0
  127. data/lib/generators/rockstart/{smtp_mailer → mailers/smtp_mailer}/USAGE +0 -0
  128. data/lib/generators/rockstart/mailers/smtp_mailer/smtp_mailer_generator.rb +36 -0
  129. data/lib/generators/rockstart/{smtp_mailer/templates/config/initializers/action_mailer.rb → mailers/smtp_mailer/templates/action_mailer_initializer.rb} +0 -0
  130. data/lib/generators/rockstart/monitoring/USAGE +8 -0
  131. data/lib/generators/rockstart/{logging → monitoring/lograge}/USAGE +1 -1
  132. data/lib/generators/rockstart/monitoring/lograge/lograge_generator.rb +19 -0
  133. data/lib/generators/rockstart/monitoring/lograge/templates/lograge_initializer.rb +44 -0
  134. data/lib/generators/rockstart/monitoring/lograge/templates/lograge_util.rb +42 -0
  135. data/lib/generators/rockstart/monitoring/monitoring_generator.rb +35 -0
  136. data/lib/generators/rockstart/monitoring/okcomputer/USAGE +8 -0
  137. data/lib/generators/rockstart/monitoring/okcomputer/okcomputer_generator.rb +28 -0
  138. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer.en.yml +5 -0
  139. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer_initializer.rb.tt +34 -0
  140. data/lib/generators/rockstart/monitoring/okcomputer/templates/okcomputer_spec.rb +62 -0
  141. data/lib/generators/rockstart/monitoring/rollbar/USAGE +8 -0
  142. data/lib/generators/rockstart/monitoring/rollbar/rollbar_generator.rb +20 -0
  143. data/lib/generators/rockstart/monitoring/rollbar/templates/rollbar_initializer.rb.tt +80 -0
  144. data/lib/generators/rockstart/monitoring/sidekiq_ui/USAGE +8 -0
  145. data/lib/generators/rockstart/monitoring/sidekiq_ui/sidekiq_ui_generator.rb +38 -0
  146. data/lib/generators/rockstart/monitoring/sidekiq_ui/templates/sidekiq_spec.rb +32 -0
  147. data/lib/generators/rockstart/quality/quality_generator.rb +5 -16
  148. data/lib/generators/rockstart/quality/rubocop/USAGE +11 -0
  149. data/lib/generators/rockstart/quality/rubocop/rubocop_generator.rb +23 -0
  150. data/lib/generators/rockstart/quality/rubocop/templates/rubocop.rake +19 -0
  151. data/lib/generators/rockstart/quality/{templates → rubocop/templates}/rubocop.yml +0 -0
  152. data/lib/generators/rockstart/rockstart_generator.rb +13 -65
  153. data/lib/generators/rockstart/run/USAGE +17 -0
  154. data/lib/generators/rockstart/run/run_generator.rb +73 -0
  155. data/lib/generators/rockstart/security/brakeman/USAGE +9 -0
  156. data/lib/generators/rockstart/security/brakeman/brakeman_generator.rb +15 -0
  157. data/lib/generators/rockstart/security/{templates → brakeman/templates}/brakeman.rake +1 -1
  158. data/lib/generators/rockstart/security/bundler_audit/USAGE +8 -0
  159. data/lib/generators/rockstart/security/bundler_audit/bundler_audit_generator.rb +11 -0
  160. data/lib/generators/rockstart/security/bundler_audit/templates/bundler_audit.rake +14 -0
  161. data/lib/generators/rockstart/security/content_security/USAGE +8 -0
  162. data/lib/generators/rockstart/security/content_security/content_security_generator.rb +41 -0
  163. data/lib/generators/rockstart/security/{templates → content_security/templates}/content_security_policy_initializer.rb.tt +2 -2
  164. data/lib/generators/rockstart/security/{templates → content_security/templates}/content_security_spec.rb.tt +12 -13
  165. data/lib/generators/rockstart/security/{templates/csp_violations_controller.rb → content_security/templates/csp_violations_controller.rb.tt} +14 -6
  166. data/lib/generators/rockstart/security/{templates → content_security/templates}/session_store_initializer.rb.tt +1 -2
  167. data/lib/generators/rockstart/security/rack_attack/USAGE +8 -0
  168. data/lib/generators/rockstart/security/rack_attack/rack_attack_generator.rb +37 -0
  169. data/lib/generators/rockstart/security/{templates → rack_attack/templates}/cache_support.rb +1 -1
  170. data/lib/generators/rockstart/security/{templates/rack_attack.rb → rack_attack/templates/rack_attack_initializer.rb.tt} +34 -1
  171. data/lib/generators/rockstart/security/rack_attack/templates/rack_attack_spec.rb.tt +116 -0
  172. data/lib/generators/rockstart/security/security_generator.rb +20 -84
  173. data/lib/generators/rockstart/storage/USAGE +8 -0
  174. data/lib/generators/rockstart/storage/active_storage/USAGE +8 -0
  175. data/lib/generators/rockstart/storage/active_storage/active_storage_generator.rb +59 -0
  176. data/lib/generators/rockstart/storage/active_storage/templates/active_storage_initializer.rb +9 -0
  177. data/lib/generators/rockstart/storage/active_storage/templates/better_s3_service.rb +27 -0
  178. data/lib/generators/rockstart/storage/active_storage/templates/cloudcube_util.rb +30 -0
  179. data/lib/generators/rockstart/storage/active_storage/templates/cloudcube_util_spec.rb +73 -0
  180. data/lib/generators/rockstart/storage/active_storage/templates/storage.yml.tt +15 -0
  181. data/lib/generators/rockstart/storage/memcached/USAGE +8 -0
  182. data/lib/generators/rockstart/storage/memcached/memcached_generator.rb +27 -0
  183. data/lib/generators/rockstart/{postgres → storage/postgres}/USAGE +1 -1
  184. data/lib/generators/rockstart/storage/postgres/postgres_generator.rb +20 -0
  185. data/lib/generators/rockstart/{postgres → storage/postgres}/templates/config/database.yml.tt +6 -0
  186. data/lib/generators/rockstart/{postgres → storage/postgres}/templates/migration.rb.tt +0 -0
  187. data/lib/generators/rockstart/storage/storage_generator.rb +26 -0
  188. data/lib/generators/rockstart/testing/USAGE +9 -0
  189. data/lib/generators/rockstart/testing/env/USAGE +8 -0
  190. data/lib/generators/rockstart/testing/env/env_generator.rb +24 -0
  191. data/lib/generators/rockstart/testing/env/templates/climate_control_helpers_support.rb +14 -0
  192. data/lib/generators/rockstart/testing/env/templates/dotenv.test.tt +8 -0
  193. data/lib/generators/rockstart/{rspec → testing/rspec}/USAGE +1 -1
  194. data/lib/generators/rockstart/testing/rspec/rspec_generator.rb +52 -0
  195. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/factory_bot.rb +0 -0
  196. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/shoulda_matchers.rb +0 -0
  197. data/lib/generators/rockstart/{rspec → testing/rspec}/templates/support/test_helpers.rb +0 -0
  198. data/lib/generators/rockstart/testing/rspec/templates/support/vcr.rb +11 -0
  199. data/lib/generators/rockstart/testing/simplecov/USAGE +9 -0
  200. data/lib/generators/rockstart/testing/simplecov/simplecov_generator.rb +11 -0
  201. data/lib/generators/rockstart/testing/testing_generator.rb +24 -0
  202. data/lib/generators/rockstart/workers/USAGE +8 -0
  203. data/lib/generators/rockstart/workers/sidekiq/USAGE +9 -0
  204. data/lib/generators/rockstart/workers/sidekiq/sidekiq_generator.rb +29 -0
  205. data/lib/generators/rockstart/workers/sidekiq/templates/sidekiq.yml.tt +5 -0
  206. data/lib/generators/rockstart/workers/sidekiq/templates/sidekiq_initializer.rb +5 -0
  207. data/lib/generators/rockstart/workers/workers_generator.rb +18 -0
  208. data/lib/rockstart/base_generator.rb +4 -5
  209. data/lib/rockstart/env.rb +3 -1
  210. data/lib/rockstart/generators/class_option_helpers.rb +154 -0
  211. data/lib/rockstart/generators/content_security_options.rb +61 -0
  212. data/lib/rockstart/generators/migration_helpers.rb +30 -0
  213. data/lib/rockstart/generators/system_helpers.rb +14 -0
  214. data/lib/rockstart/generators/template_helpers.rb +27 -0
  215. data/lib/rockstart/version.rb +1 -1
  216. metadata +212 -83
  217. data/lib/generators/rockstart/devise/devise_generator.rb +0 -258
  218. data/lib/generators/rockstart/docker/docker_generator.rb +0 -86
  219. data/lib/generators/rockstart/docker/templates/docker-compose.yml +0 -47
  220. data/lib/generators/rockstart/docker/templates/dotenv.docker.tt +0 -4
  221. data/lib/generators/rockstart/frontend_helpers/USAGE +0 -8
  222. data/lib/generators/rockstart/frontend_helpers/frontend_helpers_generator.rb +0 -65
  223. data/lib/generators/rockstart/logging/logging_generator.rb +0 -12
  224. data/lib/generators/rockstart/logging/templates/rockstart/lograge_initializer.rb +0 -50
  225. data/lib/generators/rockstart/postgres/postgres_generator.rb +0 -32
  226. data/lib/generators/rockstart/pundit/pundit_generator.rb +0 -32
  227. data/lib/generators/rockstart/quality/templates/rubocop.rake +0 -4
  228. data/lib/generators/rockstart/rspec/rspec_generator.rb +0 -70
  229. data/lib/generators/rockstart/rspec/templates/dotenv.development +0 -1
  230. data/lib/generators/rockstart/rspec/templates/dotenv.test +0 -1
  231. data/lib/generators/rockstart/rspec/templates/rspec_templates/model/model_spec.rb +0 -13
  232. data/lib/generators/rockstart/scaffold_templates/scaffold_templates_generator.rb +0 -39
  233. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/api_request_spec.rb +0 -139
  234. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/request_spec.rb +0 -408
  235. data/lib/generators/rockstart/security/templates/bundler_audit.rake +0 -4
  236. data/lib/generators/rockstart/smtp_mailer/smtp_mailer_generator.rb +0 -30
  237. data/lib/generators/rockstart/tailwindcss/USAGE +0 -8
  238. data/lib/generators/rockstart/tailwindcss/tailwindcss_generator.rb +0 -30
  239. data/lib/generators/rockstart/tailwindcss/templates/application.css +0 -3
  240. data/lib/generators/rockstart/tailwindcss/templates/postcss.config.js +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ba7c0a5317e53f705cd38bd10ada153e28d5adab8ac3b4d8a182a6312a8a5e7
4
- data.tar.gz: 9113486cc9d6f7087d91fa29a54e7c39fda7fb2daf0a386e3739913432344c5a
3
+ metadata.gz: de8c4a0f815030f8c4bc382d79d366da4f07ebd43dd3bf74260f6d1be2482908
4
+ data.tar.gz: 842304d35a22b56404a04d8d2f573afe9039ae8ef09d1f25d04f9e7bbce9c223
5
5
  SHA512:
6
- metadata.gz: 3742b345254b2baf3eb6433af39d686c90bc9c80308128d738b47ea031112b1fd6b888c0f603953439dd60f5349662b279ac94bf2a7858bacb565c31238d82ac
7
- data.tar.gz: 8c3a806404352d26ab4f424d71ddb315378d4eb33fa9be666872328f3890f337d993aa6560d31d63a5334ebd8e9411d6b95a8586d441b2a11d3c09d9b947d83d
6
+ metadata.gz: 38313ea3688a1743a0c1d2d1549fced19af170922094f9638705f35294ce5cb1488c27870e3e0952488740cf5e792af8c34e6bd03067d1b43ea45a2296455c2e
7
+ data.tar.gz: 783827e82c2b929ed3488d4518ed2aa765a64351e5769a86fd1d25472ee0583473b7104f7e1f08ebee00f61763fd6b2aefece2ad63839e00a815d0834f852a51
data/README.md CHANGED
@@ -76,6 +76,12 @@ Install it, via Webpacker, by running:
76
76
  bundle exec rails g rockstart:tailwindcss
77
77
  ```
78
78
 
79
+ ## Extra Steps
80
+
81
+ A Heroku release may fail during the relase page, use the [heroku-releases-retry](https://github.com/heroku/heroku-releases-retry) allows the latest deploy to be retried.
82
+
83
+ > heroku plugins:install heroku-releases-retry
84
+
79
85
  ## Installation
80
86
  Add this line to your application's Gemfile:
81
87
 
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Controls who can Rock and Roll
3
+
4
+ Example:
5
+ rails generate rockstart:authorization
6
+
7
+ This will create:
8
+ Installs Devise for auth authentication
9
+ Installs Pundit for access authorization
@@ -0,0 +1,10 @@
1
+ Description:
2
+ Adds Auth0 authentication to a Ruby on Rails Application
3
+
4
+ Example:
5
+ rails generate rockstart:authorization:auth0
6
+
7
+ This will create:
8
+ Installs omniauth-auth0 and configures it to run in rails
9
+ Adds an auth controller for handling session creation/deletion
10
+ Adds a PORO User model to represent a signed in user
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rockstart/base_generator"
4
+
5
+ module Rockstart::Authorization
6
+ class Auth0Generator < Rockstart::BaseGenerator
7
+ include Rails::Generators::AppName
8
+
9
+ source_root File.expand_path("templates", __dir__)
10
+
11
+ def add_utils
12
+ template "auth0_util.rb", "lib/utils/auth0.rb"
13
+ copy_file "auth0_util_spec.rb", "spec/utils/auth0_spec.rb"
14
+ end
15
+
16
+ def add_translations
17
+ copy_file "auth0.en.yml", "config/locales/auth0.en.yml"
18
+ end
19
+
20
+ def add_initializer
21
+ copy_file "auth0_initializer.rb", "config/initializers/auth0.rb"
22
+ end
23
+
24
+ def add_controllers
25
+ directory "app"
26
+ directory "spec"
27
+ end
28
+
29
+ def add_session_auth_to_controllers
30
+ inject_into_file "app/controllers/application_controller.rb",
31
+ " include SessionAuth\n",
32
+ before: /^end$/
33
+ end
34
+
35
+ def add_routes
36
+ route <<~ROUTE
37
+ # Auth0 Session Routes
38
+ get "auth/sign_in" => "auth#new", as: :auth_sign_in
39
+ get "auth/sign_out" => "auth#sign_out", as: :auth_sign_out
40
+ delete "auth/sign_out" => "auth#destroy"
41
+
42
+ get "callback" => "auth#callback"
43
+ get "auth/failure" => "auth#failure"
44
+
45
+ ROUTE
46
+ change_application_url("url_for_authentication", "auth_sign_in_path")
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "utils/auth0"
4
+
5
+ # Omniauth Controller for Auth0
6
+ class AuthController < ApplicationController
7
+ # GET /auth/sign_in
8
+ def new
9
+ if user_signed_in?
10
+ redirect_to url_for_user_dashboard
11
+ else
12
+ render :new
13
+ end
14
+ end
15
+
16
+ # GET /auth/sign_out
17
+ def sign_out
18
+ if user_signed_in?
19
+ redirect_to url_for_user_dashboard
20
+ else
21
+ render :sign_out
22
+ end
23
+ end
24
+
25
+ # DELETE /auth/sign_out
26
+ def destroy
27
+ reset_session
28
+ redirect_to Utils::Auth0.logout_url(redirect_to: auth_sign_out_url).to_s
29
+ end
30
+
31
+ # GET /callback
32
+ def callback
33
+ # This stores all the user information that came from Auth0 and the IdP
34
+ session[:userinfo] = Utils::Auth0.filter_userinfo(request.env["omniauth.auth"])
35
+
36
+ # Redirect to the URL you want after successful auth
37
+ redirect_to url_for_user_dashboard
38
+ end
39
+
40
+ # GET /auth/failure
41
+ def failure
42
+ # show a failure page or redirect to an error page
43
+ error_key = params[:message].to_s.gsub(/[^\w-]/, "").presence || "generic"
44
+ error_message = t(error_key, scope: "auth0.omniauth_error", default: :generic)
45
+ redirect_to auth_sign_in_path, alert: error_message
46
+ end
47
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Provides methods for Authenticating via a Rails session
4
+ module SessionAuth
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :current_user
9
+ helper_method :user_signed_in?
10
+ end
11
+
12
+ def current_user
13
+ User.new(session[:userinfo])
14
+ end
15
+
16
+ def user_signed_in?
17
+ session[:userinfo].present?
18
+ end
19
+
20
+ def authenticate_user!
21
+ redirect_to url_for_authentication unless user_signed_in?
22
+ end
23
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ # PORO Representaiton of an Authenticated Auth0 User
4
+ class User
5
+ EMAIL_REGEX = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i.freeze
6
+
7
+ def initialize(userinfo = nil)
8
+ @userinfo = userinfo.presence || {}
9
+ end
10
+
11
+ def id
12
+ if auth0?
13
+ @userinfo["uid"]
14
+ elsif @userinfo["uid"].present?
15
+ "#{@userinfo['provider']}|#{@userinfo['uid']}"
16
+ end
17
+ end
18
+
19
+ def image
20
+ @userinfo.dig("info", "image")
21
+ end
22
+
23
+ def name
24
+ name_or_email = @userinfo.dig("info", "name")
25
+ if name_or_email =~ EMAIL_REGEX
26
+ nickname
27
+ else
28
+ name_or_email
29
+ end
30
+ end
31
+
32
+ def nickname
33
+ @userinfo.dig("info", "nickname")
34
+ end
35
+
36
+ def first_name
37
+ namae.given
38
+ end
39
+
40
+ def admin?
41
+ roles.include? "admin"
42
+ end
43
+
44
+ def persisted?
45
+ @userinfo.present?
46
+ end
47
+
48
+ def to_h
49
+ @userinfo.to_h
50
+ end
51
+
52
+ def to_s
53
+ name
54
+ end
55
+
56
+ def ==(other)
57
+ if other.nil? || !other.instance_of?(User)
58
+ false
59
+ else
60
+ to_h == other.to_h
61
+ end
62
+ end
63
+ alias eql? ==
64
+
65
+ def hash
66
+ @userinfo.hash
67
+ end
68
+
69
+ private
70
+
71
+ def auth0?
72
+ @userinfo["provider"] == "auth0"
73
+ end
74
+
75
+ def namae
76
+ @namae ||= Namae::Name.parse(name)
77
+ end
78
+
79
+ def roles
80
+ @roles ||= (@userinfo.dig("extra", "raw_info", "http://<%= app_name %>/roles") || [])
81
+ end
82
+ end
@@ -0,0 +1,3 @@
1
+ <%= link_to "/auth/auth0", method: :post do %>
2
+ Sign in.
3
+ <%- end -%>
@@ -0,0 +1,5 @@
1
+ en:
2
+ auth0:
3
+ omniauth_error:
4
+ unauthorized: "Your account has been blocked."
5
+ generic: "An unexpected error has occured, please try again!!!"
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.config.middleware.use OmniAuth::Builder do
4
+ provider(
5
+ :auth0,
6
+ ENV["AUTH0_CLIENT_ID"],
7
+ ENV["AUTH0_CLIENT_SECRET"],
8
+ ENV["AUTH0_DOMAIN"],
9
+ callback_path: "/callback",
10
+ authorize_params: {
11
+ scope: "openid profile"
12
+ }
13
+ )
14
+ end
15
+
16
+ # Allow Omniauth to function behind a NGINX reverse proxy
17
+ OmniAuth.config.full_host = lambda do |env|
18
+ scheme = env["rack.url_scheme"]
19
+ local_host = env["HTTP_HOST"]
20
+ forwarded_host = env["HTTP_X_FORWARDED_HOST"]
21
+ forwarded_host.blank? ? "#{scheme}://#{local_host}" : "#{scheme}://#{forwarded_host}"
22
+ end
23
+
24
+ # Handle any failures with a failure page
25
+ OmniAuth.config.on_failure = proc do |env|
26
+ OmniAuth::FailureEndpoint.new(env).redirect_to_failure
27
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Utils
4
+ # Utilities for interacting with Auth0 generated by rockstart:auth0
5
+ module Auth0
6
+ class << self
7
+ # Generates a logout redirect url
8
+ def logout_url(redirect_to:)
9
+ domain = ENV.fetch("AUTH0_DOMAIN")
10
+ client_id = ENV.fetch("AUTH0_CLIENT_ID")
11
+ request_params = {
12
+ returnTo: redirect_to,
13
+ client_id: client_id
14
+ }
15
+ URI::HTTPS.build(host: domain, path: "/v2/logout", query: to_query(request_params))
16
+ end
17
+
18
+ # Remove all unused properties provided by OmniAuth
19
+ def filter_userinfo(raw_userinfo)
20
+ raw_userinfo.slice(:provider, :uid, :info, :extra).tap do |userinfo|
21
+ # Include basic user information
22
+ userinfo[:info] = userinfo.fetch(:info, {}).slice(:name, :nickname, :image)
23
+
24
+ # Include custom roles array provided by auth0
25
+ userinfo[:extra] = userinfo.fetch(:extra, {}).slice(:raw_info)
26
+ raw_info = userinfo[:extra].fetch(:raw_info, {})
27
+ userinfo[:extra][:raw_info] = raw_info.slice("http://<%= app_name %>/roles")
28
+ end.deep_stringify_keys
29
+ end
30
+
31
+ private
32
+
33
+ def to_query(hash)
34
+ hash.map { |k, v| "#{k}=#{CGI.escape(v)}" unless v.nil? }.reject(&:nil?).join("&")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "utils/auth0"
4
+ require File.expand_path("../support/climate_control_helpers", __dir__)
5
+
6
+ RSpec.describe Utils::Auth0 do
7
+ include ClimateControlHelpers
8
+
9
+ around do |example|
10
+ with_modified_env("AUTH0_DOMAIN" => "auth0-domain", "AUTH0_CLIENT_ID" => "auth0-client-id") do
11
+ example.run
12
+ end
13
+ end
14
+
15
+ describe ".logout_url" do
16
+ it "generates an auth0 logout url" do
17
+ logout_url = described_class.logout_url(redirect_to: "https://www.example.com")
18
+ expect(logout_url.to_s).to eq "https://auth0-domain/v2/logout?returnTo=https%3A%2F%2Fwww.example.com&client_id=auth0-client-id"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :user do
5
+ uid { SecureRandom.hex(10) }
6
+
7
+ name { [nickname, Faker::Name.last_name].join(" ") }
8
+ nickname { Faker::Name.first_name }
9
+ image { "https://s.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=480" }
10
+ roles { [] }
11
+
12
+ skip_create
13
+ initialize_with do
14
+ require "utils/auth0"
15
+ filtered_attributes = Utils::Auth0.filter_userinfo(
16
+ provider: "factory_bot",
17
+ uid: attributes[:uid],
18
+ info: attributes.except(:uid, :roles).stringify_keys,
19
+ extra: {
20
+ raw_info: {
21
+ "http://<%= app_name %>/roles" => roles
22
+ }
23
+ }
24
+ )
25
+ new(filtered_attributes)
26
+ end
27
+
28
+ trait :admin do
29
+ roles { %w[admin] }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe User, type: :model do
6
+ context "with a userinfo hash" do
7
+ subject(:user) { described_class.new(userinfo) }
8
+
9
+ let(:userinfo) do
10
+ {
11
+ "provider" => "auth0",
12
+ "uid" => "auth0|1234",
13
+ "info" => {
14
+ "image" => "https://s.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=480",
15
+ "name" => "John Smith",
16
+ "nickname" => "jono65"
17
+ },
18
+ "extra" => {
19
+ "raw_info" => {
20
+ "http://<%= app_name %>/roles" => []
21
+ }
22
+ }
23
+ }
24
+ end
25
+
26
+ it { expect(user.image).to eq "https://s.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=480" }
27
+
28
+ describe "#id" do
29
+ it { expect(user.id).to eq "auth0|1234" }
30
+
31
+ context "with an non-auth0 provider" do
32
+ before { userinfo["provider"] = "test" }
33
+
34
+ it { expect(user.id).to eq "test|auth0|1234" }
35
+ end
36
+ end
37
+
38
+ describe "#name" do
39
+ it { expect(user.name).to eq "John Smith" }
40
+
41
+ it "falls back to nickname when name is an email (Auth0 Database Provider Default)" do
42
+ userinfo.fetch("info")["name"] = "test@example.com"
43
+ expect(user.name).to eq "jono65"
44
+ end
45
+ end
46
+
47
+ describe "#first_name" do
48
+ it { expect(user.first_name).to eq "John" }
49
+
50
+ it "falls back to nickname when name is an email (Auth0 Database Provider Default)" do
51
+ userinfo.fetch("info")["name"] = "test@example.com"
52
+ expect(user.first_name).to eq "jono65"
53
+ end
54
+ end
55
+
56
+ describe "#admin?" do
57
+ context "with an admin role" do
58
+ before do
59
+ userinfo["extra"]["raw_info"]["http://<%= app_name %>/roles"] = ["admin"]
60
+ end
61
+
62
+ it { is_expected.to be_admin }
63
+ end
64
+
65
+ context "with no roles" do
66
+ before do
67
+ userinfo["extra"]["raw_info"]["http://<%= app_name %>/roles"] = []
68
+ end
69
+
70
+ it { is_expected.not_to be_admin }
71
+ end
72
+ end
73
+
74
+ it { expect(user.to_s).to eq "John Smith" }
75
+
76
+ it { is_expected.to be_persisted }
77
+ end
78
+
79
+ context "with no parameters" do
80
+ subject(:user) { described_class.new }
81
+
82
+ it { expect(user.id).to be_nil }
83
+ it { expect(user.name).to be_nil }
84
+ it { expect(user.first_name).to be_nil }
85
+ it { expect(user.image).to be_nil }
86
+
87
+ it { expect(user.to_s).to be_nil }
88
+
89
+ it { is_expected.not_to be_persisted }
90
+ end
91
+ end