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
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe "Auth", type: :request do
6
+ describe "GET /auth/sign_in" do
7
+ context "as a guest" do
8
+ it "renders a login form" do
9
+ get "/auth/sign_in"
10
+ expect(response).to have_http_status(:success)
11
+ end
12
+ end
13
+
14
+ context "as an authenticated user" do
15
+ let(:authenticated_user) { create(:user) }
16
+
17
+ before do
18
+ sign_in(authenticated_user)
19
+ end
20
+
21
+ it "redirects to the dashboard" do
22
+ get "/auth/sign_in"
23
+ expect(response).to redirect_to url_for_user_dashboard
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "GET /auth/sign_out" do
29
+ it "renders a thanks for visiting page" do
30
+ get "/auth/sign_out"
31
+ expect(response).to have_http_status(:success)
32
+ end
33
+
34
+ context "as an authenticated user" do
35
+ let(:authenticated_user) { create(:user) }
36
+
37
+ before do
38
+ sign_in(authenticated_user)
39
+ end
40
+
41
+ it "redirects to the dashboard" do
42
+ get "/auth/sign_out"
43
+ expect(response).to redirect_to url_for_user_dashboard
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "POST /auth/auth0" do
49
+ context "with a generic error" do
50
+ before do
51
+ OmniAuth.config.mock_auth[:auth0] = :something_went_wrong
52
+ end
53
+
54
+ it "redirects to the sign in page with an error message" do
55
+ post "/auth/auth0"
56
+ expect(response).to redirect_to("/callback")
57
+
58
+ follow_redirect!
59
+ expect(response).to redirect_to "/auth/failure?message=something_went_wrong&strategy=auth0"
60
+
61
+ follow_redirect!
62
+ expect(response).to redirect_to(auth_sign_in_url)
63
+
64
+ follow_redirect!
65
+ expect(response.body).to have_content(t("auth0.omniauth_error.generic"))
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "DELETE /auth/sign_out" do
71
+ context "as an authenticated user" do
72
+ let(:authenticated_user) { create(:user) }
73
+
74
+ before do
75
+ sign_in(authenticated_user)
76
+ end
77
+
78
+ it "redirects back to the auth0 logout page with a redirect to the sign out page" do
79
+ delete "/auth/sign_out"
80
+
81
+ url_for_sign_out = CGI.escape(auth_sign_out_url)
82
+ expect(response).to redirect_to(
83
+ "https://auth0-domain/v2/logout?returnTo=#{url_for_sign_out}&client_id=auth0-client-id"
84
+ )
85
+ end
86
+
87
+ it "signs out the user" do
88
+ delete "/auth/sign_out"
89
+ expect(controller).not_to be_user_signed_in
90
+ expect(controller.current_user).not_to be_persisted
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Helpers for Auth0 with request specs
4
+ module AuthRequestHelper
5
+ def self.included(base)
6
+ base.before(:all) do
7
+ OmniAuth.config.test_mode = true
8
+ end
9
+ base.after(:each) do
10
+ OmniAuth.config.mock_auth[:auth0] = nil
11
+ end
12
+ end
13
+
14
+ def sign_in(resource)
15
+ OmniAuth.config.mock_auth[:auth0] = OmniAuth::AuthHash.new(resource.to_h)
16
+ post "/auth/auth0"
17
+ follow_redirect! # call the callback endpoint
18
+ end
19
+
20
+ def sign_out(_resource)
21
+ delete auth_sign_out_path
22
+ end
23
+ end
24
+
25
+ RSpec.configure do |config|
26
+ config.include AuthRequestHelper, type: :request
27
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rockstart/generators/class_option_helpers"
4
+
5
+ class Rockstart::AuthorizationGenerator < Rails::Generators::Base
6
+ include Rockstart::Generators::ClassOptionHelpers
7
+
8
+ auth0_class_option
9
+ devise_class_option
10
+ pundit_class_option
11
+
12
+ def generate_auth0
13
+ return unless auth0?
14
+
15
+ generate "rockstart:authorization:auth0"
16
+ end
17
+
18
+ def generate_devise
19
+ return unless devise?
20
+
21
+ generate "rockstart:authorization:devise", pundit_option
22
+ end
23
+
24
+ def generate_pundit
25
+ return unless pundit?
26
+
27
+ generate "rockstart:authorization:pundit", auth0_option
28
+ end
29
+ end
@@ -2,8 +2,10 @@ Description:
2
2
  Installs Device for User Authentication
3
3
 
4
4
  Example:
5
- rails generate rockstart:devise
5
+ rails generate rockstart:authorization:devise
6
6
 
7
7
  This will create:
8
8
  A basic devise Install
9
9
  A User model with a UUID primary key
10
+ Custom Controllers for managing a Session/Profile
11
+ Test Coverage of the Devise installation
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rockstart/base_generator"
4
+ require "rockstart/generators/migration_helpers"
5
+
6
+ module Rockstart::Authorization
7
+ class DeviseGenerator < Rockstart::BaseGenerator
8
+ include Rockstart::Generators::MigrationHelpers
9
+
10
+ source_root File.expand_path("templates", __dir__)
11
+
12
+ class_option :devise_layout, type: :string,
13
+ desc: "Custom layout used by all devise controllers",
14
+ default: "application"
15
+
16
+ pundit_class_option
17
+
18
+ def add_user_model
19
+ directory "models", "app/models"
20
+ migration_template "create_user_migration.rb.tt", "db/migrate/create_users.rb"
21
+ migration_template "add_devise_to_users_migration.rb.tt", "db/migrate/add_devise_to_users.rb"
22
+ end
23
+
24
+ def install_devise
25
+ Dir.mktmpdir do |dir|
26
+ generate_devise_install(dir)
27
+ directory File.join(dir, "config"), "config"
28
+ end
29
+ rescue LoadError
30
+ abort("Please install devise gem!!!") if behavior == :invoke
31
+ end
32
+
33
+ def add_devise_controllers
34
+ Dir.mktmpdir do |dir|
35
+ generate_devise_controllers(dir)
36
+ add_pundit_support(dir) if pundit?
37
+ devise_controllers.each do |controller|
38
+ copy_file File.join(dir, controller_path(controller)), controller_path(controller)
39
+ end
40
+ end
41
+ rescue LoadError
42
+ abort("Please install devise gem!!!") if behavior == :invoke
43
+ end
44
+
45
+ def generate_routes
46
+ route <<~USER_ROUTE
47
+ devise_for :users, controllers: {
48
+ sessions: "users/sessions",
49
+ passwords: "users/passwords",
50
+ registrations: "users/registrations"
51
+ }
52
+ USER_ROUTE
53
+ end
54
+
55
+ def add_rspec_coverage
56
+ directory "spec"
57
+ end
58
+
59
+ def update_application_url_concerns
60
+ change_application_url("url_for_authentication", "new_user_session_path")
61
+ end
62
+
63
+ private
64
+
65
+ def generate_devise_install(dir)
66
+ initializer = build_devise_install_generator(dir)
67
+ initializer.invoke_all
68
+
69
+ update_initializer(dir)
70
+ make_devise_paranoid(dir)
71
+ send_email_on_email_change(dir)
72
+ send_email_on_password_change(dir)
73
+ add_translations(dir)
74
+ end
75
+
76
+ def build_devise_install_generator(dir)
77
+ require "generators/devise/install_generator"
78
+
79
+ initializer = ::Devise::Generators::InstallGenerator.new(
80
+ report_stream: StringIO.new
81
+ )
82
+ initializer.destination_root = dir
83
+ initializer
84
+ end
85
+
86
+ def update_initializer(dir)
87
+ gsub_file devise_initializer(dir),
88
+ /config\.mailer_sender = ['"][^'"]+['']/,
89
+ 'config.mailer_sender = ENV.fetch("DEVISE_MAILER_SENDER",' \
90
+ " Rails.application.credentials.devise_mailer_sender)"
91
+ gsub_file devise_initializer(dir),
92
+ /config\.secret_key = ['"][^'"]+['']/,
93
+ 'config.secret_key = ENV.fetch("DEVISE_SECRET_KEY")'
94
+ gsub_file devise_initializer(dir),
95
+ /config\.pepper = ['"][^'"]+['']/,
96
+ 'config.pepper = ENV.fetch("DEVISE_PEPPER")'
97
+ end
98
+
99
+ def make_devise_paranoid(dir)
100
+ gsub_file devise_initializer(dir),
101
+ /config\.paranoid = (true|false)/,
102
+ "config.paranoid = true"
103
+ uncomment_lines devise_initializer(dir), /config\.paranoid = true/
104
+ end
105
+
106
+ def send_email_on_email_change(dir)
107
+ gsub_file devise_initializer(dir),
108
+ /config\.send_email_changed_notification = (true|false)/,
109
+ "config.send_email_changed_notification = true"
110
+ uncomment_lines devise_initializer(dir), /config\.send_email_changed_notification = true/
111
+ end
112
+
113
+ def send_email_on_password_change(dir)
114
+ gsub_file devise_initializer(dir),
115
+ /config\.send_password_change_notification = (true|false)/,
116
+ "config.send_password_change_notification = true"
117
+ uncomment_lines devise_initializer(dir), /config\.send_password_change_notification = true/
118
+ end
119
+
120
+ def add_translations(dir)
121
+ inject_into_file File.join(dir, "config/locales/devise.en.yml"), after: /failure:$/ do
122
+ "\n deleted_account: " \
123
+ "\"You've deleted your account. Please contact support if you want to recover it!\""
124
+ end
125
+ end
126
+
127
+ def devise_initializer(dir)
128
+ File.join(dir, "config", "initializers", "devise.rb")
129
+ end
130
+
131
+ def generate_devise_controllers(dir)
132
+ require "generators/devise/controllers_generator"
133
+
134
+ initializer = build_devise_controllers_generator(dir)
135
+ initializer.scope = "users"
136
+ initializer.invoke_all
137
+
138
+ devise_controllers.each do |controller|
139
+ add_layout_to_controller(dir, controller)
140
+ end
141
+ end
142
+
143
+ def build_devise_controllers_generator(dir)
144
+ initializer = ::Devise::Generators::ControllersGenerator.new(
145
+ report_stream: StringIO.new
146
+ )
147
+ initializer.destination_root = dir
148
+ initializer.source_paths.insert(1, File.join(self.class.source_root, "controllers"))
149
+ initializer
150
+ end
151
+
152
+ def add_layout_to_controller(dir, controller)
153
+ inject_into_file File.join(dir, controller_path(controller)), after: /< Devise::.*$/ do
154
+ "\n layout \"#{options[:devise_layout]}\"\n"
155
+ end
156
+
157
+ # Replace Generic resource routes with users
158
+ gsub_file File.join(dir, controller_path(controller)), "/resource", "/users"
159
+ end
160
+
161
+ def add_pundit_support(dir)
162
+ use_pundit_for_update_user_details(dir)
163
+ add_pudit_authorize_current_user_method(dir)
164
+ add_pudit_authorize_current_user_callback(dir)
165
+ add_pudit_error_handling_concern(dir)
166
+ end
167
+
168
+ # rubocop:disable Layout/LineLength
169
+ def use_pundit_for_update_user_details(dir)
170
+ gsub_file File.join(dir, controller_path("registrations")),
171
+ /\.permit\(:account_update.*\)/,
172
+ ".permit(:account_update, keys: policy(current_user).permitted_attributes_for_update)"
173
+ end
174
+ # rubocop:enable Layout/LineLength
175
+
176
+ def add_pudit_authorize_current_user_method(dir)
177
+ inject_into_file File.join(dir, controller_path("registrations")), after: "protected\n" do
178
+ "\n" + <<~'METHOD'.gsub(/([^\n]*)\n/, " \\1\n")
179
+ # Ensure the logged in user is able to update or destroy their account
180
+ def authorize_current_user
181
+ authorize current_user
182
+ end
183
+ METHOD
184
+ end
185
+ end
186
+
187
+ def add_pudit_authorize_current_user_callback(dir)
188
+ inject_into_file File.join(dir, controller_path("registrations")),
189
+ after: /before_action :configure_account_update_params.*$/ do
190
+ "\n before_action :authorize_current_user, only: %i[edit update destroy]"
191
+ end
192
+ end
193
+
194
+ def add_pudit_error_handling_concern(dir)
195
+ inject_into_file File.join(dir, controller_path("registrations")), after: /< Devise::.*$/ do
196
+ "\n include PunditErrorHandling\n"
197
+ end
198
+ end
199
+
200
+ def controller_path(controller)
201
+ File.join("app", "controllers", "users", "#{controller}_controller.rb")
202
+ end
203
+
204
+ def devise_controllers
205
+ %w[sessions passwords registrations]
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDeviseToUsers < ActiveRecord::Migration<%= migration_version %>
4
+ def self.up
5
+ change_table :users do |t|
6
+ ## Database authenticatable
7
+ t.string :email, null: false, default: ""
8
+ t.string :encrypted_password, null: false, default: ""
9
+
10
+ ## Recoverable
11
+ t.string :reset_password_token
12
+ t.datetime :reset_password_sent_at
13
+
14
+ ## Rememberable
15
+ t.datetime :remember_created_at
16
+
17
+ ## Trackable
18
+ # t.integer :sign_in_count, default: 0, null: false
19
+ # t.datetime :current_sign_in_at
20
+ # t.datetime :last_sign_in_at
21
+ # t.inet :current_sign_in_ip
22
+ # t.inet :last_sign_in_ip
23
+
24
+ ## Confirmable
25
+ # t.string :confirmation_token
26
+ # t.datetime :confirmed_at
27
+ # t.datetime :confirmation_sent_at
28
+ # t.string :unconfirmed_email # Only if using reconfirmable
29
+
30
+ ## Lockable
31
+ # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
32
+ # t.string :unlock_token # Only if unlock strategy is :email or :both
33
+ # t.datetime :locked_at
34
+
35
+ # Uncomment below if timestamps were not included in your original model.
36
+ # t.timestamps null: false
37
+ end
38
+
39
+ add_index :users, :email, unique: true
40
+ add_index :users, :reset_password_token, unique: true
41
+ # add_index :users, :confirmation_token, unique: true
42
+ # add_index :users, :unlock_token, unique: true
43
+ end
44
+
45
+ def self.down
46
+ # By default, we don't want to make any assumption about how to roll back a migration when your
47
+ # model already existed. Please edit below which fields you would like to remove in this migration.
48
+ raise ActiveRecord::IrreversibleMigration
49
+ end
50
+ end
@@ -12,7 +12,19 @@ class User < ApplicationRecord
12
12
  # admin:boolean
13
13
  # deleted_at:datetime
14
14
 
15
- delegate :given, :family, to: :namae
15
+ # Short display name for user
16
+ def first_name
17
+ namae.given
18
+ end
19
+
20
+ # Display image for user
21
+ def image
22
+ return unless email?
23
+
24
+ require "digest/md5"
25
+ hash = Digest::MD5.hexdigest(email.downcase)
26
+ "https://s.gravatar.com/avatar/#{hash}?s=480"
27
+ end
16
28
 
17
29
  # instead of deleting users, mark them as soft deleted
18
30
  def soft_delete
@@ -31,7 +43,7 @@ class User < ApplicationRecord
31
43
 
32
44
  def to_s
33
45
  # Use the stored name value for labels
34
- (name_changed? ? name_was : name) || (id? ? "User ##{id}" : "Guest User")
46
+ (name_changed? ? name_was : name) || super
35
47
  end
36
48
 
37
49
  private