kowl 0.0.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 (250) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +7 -0
  3. data/README.md +383 -0
  4. data/bin/console +14 -0
  5. data/bin/kowl +106 -0
  6. data/bin/setup +13 -0
  7. data/lib/kowl/actions.rb +240 -0
  8. data/lib/kowl/docker.rb +447 -0
  9. data/lib/kowl/generators/README.md +5 -0
  10. data/lib/kowl/generators/action_generator.rb +113 -0
  11. data/lib/kowl/generators/admin_generator.rb +114 -0
  12. data/lib/kowl/generators/assets_generator.rb +188 -0
  13. data/lib/kowl/generators/base.rb +40 -0
  14. data/lib/kowl/generators/circleci_generator.rb +11 -0
  15. data/lib/kowl/generators/config_generator.rb +180 -0
  16. data/lib/kowl/generators/controller_generator.rb +64 -0
  17. data/lib/kowl/generators/database_generator.rb +42 -0
  18. data/lib/kowl/generators/decorators_generator.rb +16 -0
  19. data/lib/kowl/generators/docker_generator.rb +40 -0
  20. data/lib/kowl/generators/dotfiles_generator.rb +73 -0
  21. data/lib/kowl/generators/libs_generator.rb +19 -0
  22. data/lib/kowl/generators/mailer_generator.rb +58 -0
  23. data/lib/kowl/generators/misc_generator.rb +20 -0
  24. data/lib/kowl/generators/overrides/app_base.rb +15 -0
  25. data/lib/kowl/generators/overrides/app_builder.rb +58 -0
  26. data/lib/kowl/generators/overrides/app_generator.rb +249 -0
  27. data/lib/kowl/generators/pages_generator.rb +46 -0
  28. data/lib/kowl/generators/routes_generator.rb +20 -0
  29. data/lib/kowl/generators/sidekiq_generator.rb +31 -0
  30. data/lib/kowl/generators/staging_generator.rb +14 -0
  31. data/lib/kowl/generators/test_generator.rb +42 -0
  32. data/lib/kowl/generators/text_files_generator.rb +41 -0
  33. data/lib/kowl/generators/users_and_auth_generator.rb +143 -0
  34. data/lib/kowl/generators/uuid_generator.rb +39 -0
  35. data/lib/kowl/generators/views_and_helpers_generator.rb +104 -0
  36. data/lib/kowl/geodb.rb +96 -0
  37. data/lib/kowl/helpers.rb +139 -0
  38. data/lib/kowl/templates/Gemfile.erb.tt +253 -0
  39. data/lib/kowl/templates/README.md.erb +33 -0
  40. data/lib/kowl/templates/app/assets/javascripts/semantic.js.tt +26 -0
  41. data/lib/kowl/templates/app/assets/stylesheets/administrate/application.scss +44 -0
  42. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/_custom_styling.scss +38 -0
  43. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application-mailer.scss +1 -0
  44. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application.scss +14 -0
  45. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_alerts.scss +7 -0
  46. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_errors.scss +28 -0
  47. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_navbar.scss +17 -0
  48. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/variables.scss +6 -0
  49. data/lib/kowl/templates/app/assets/stylesheets/semantic/_custom_styling.scss +20 -0
  50. data/lib/kowl/templates/app/assets/stylesheets/semantic/application.scss +24 -0
  51. data/lib/kowl/templates/app/controllers/admin/application_controller.rb +29 -0
  52. data/lib/kowl/templates/app/controllers/admin/login_activities_controller.rb +29 -0
  53. data/lib/kowl/templates/app/controllers/admin/users_controller.rb +37 -0
  54. data/lib/kowl/templates/app/controllers/concerns/auth/authentication.rb +18 -0
  55. data/lib/kowl/templates/app/controllers/concerns/auth/authorization.rb +20 -0
  56. data/lib/kowl/templates/app/controllers/concerns/auth/error_handlers.rb +27 -0
  57. data/lib/kowl/templates/app/controllers/concerns/noauth/error_handlers.rb +25 -0
  58. data/lib/kowl/templates/app/controllers/users_controller.rb +17 -0
  59. data/lib/kowl/templates/app/dashboards/login_activity_dashboard.rb.tt +59 -0
  60. data/lib/kowl/templates/app/dashboards/rich_text_body_dashboard.rb.tt +17 -0
  61. data/lib/kowl/templates/app/dashboards/user_dashboard.rb.tt +60 -0
  62. data/lib/kowl/templates/app/fields/gravatar_field.rb +10 -0
  63. data/lib/kowl/templates/app/fields/rich_text_area_field.rb +8 -0
  64. data/lib/kowl/templates/app/inputs/rich_text_area_input.rb +11 -0
  65. data/lib/kowl/templates/app/javascript/administrate/components/date_time_picker.js.tt +32 -0
  66. data/lib/kowl/templates/app/javascript/administrate/components/table.js.tt +49 -0
  67. data/lib/kowl/templates/app/javascript/administrate/index.js +3 -0
  68. data/lib/kowl/templates/app/javascript/packs/administrate.js.tt +21 -0
  69. data/lib/kowl/templates/app/javascript/packs/semantic.js +11 -0
  70. data/lib/kowl/templates/app/mailers/application_mailer.rb +7 -0
  71. data/lib/kowl/templates/app/mailers/devise_mailer.rb +5 -0
  72. data/lib/kowl/templates/app/models/login_activity.rb.tt +29 -0
  73. data/lib/kowl/templates/app/models/user.rb.tt +72 -0
  74. data/lib/kowl/templates/app/policies/application_policy.rb +38 -0
  75. data/lib/kowl/templates/app/policies/login_activity_policy.rb +35 -0
  76. data/lib/kowl/templates/app/policies/user_policy.rb +43 -0
  77. data/lib/kowl/templates/app/views/admin/templates/navigation.erb.tt +23 -0
  78. data/lib/kowl/templates/app/views/admin/views/application/_javascript.html.erb +21 -0
  79. data/lib/kowl/templates/app/views/admin/views/users/_collection.html.erb +102 -0
  80. data/lib/kowl/templates/app/views/admin/views/users/_form.html.erb +46 -0
  81. data/lib/kowl/templates/app/views/admin/views/users/edit.html.erb +36 -0
  82. data/lib/kowl/templates/app/views/admin/views/users/index.html.erb +66 -0
  83. data/lib/kowl/templates/app/views/fields/gravatar_field/_form.html.erb +6 -0
  84. data/lib/kowl/templates/app/views/fields/gravatar_field/_index.html.erb +1 -0
  85. data/lib/kowl/templates/app/views/fields/gravatar_field/_show.html.erb +1 -0
  86. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_form.html.erb +6 -0
  87. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_index.html.erb +1 -0
  88. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_show.html.erb +1 -0
  89. data/lib/kowl/templates/app/views/layouts/admin.html.erb.tt +47 -0
  90. data/lib/kowl/templates/app/views/layouts/devise_mailer.html.erb +14 -0
  91. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.erb +18 -0
  92. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.haml +17 -0
  93. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.slim +17 -0
  94. data/lib/kowl/templates/app/views/pages/welcome/default.html.erb +0 -0
  95. data/lib/kowl/templates/app/views/pages/welcome/default.html.haml +0 -0
  96. data/lib/kowl/templates/app/views/pages/welcome/default.html.slim +0 -0
  97. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.erb +20 -0
  98. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.haml +17 -0
  99. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.slim +17 -0
  100. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.erb.tt +5 -0
  101. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.haml.tt +3 -0
  102. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.slim.tt +3 -0
  103. data/lib/kowl/templates/app/views/shared/footer/semantic.html.erb.tt +7 -0
  104. data/lib/kowl/templates/app/views/shared/footer/semantic.html.haml.tt +5 -0
  105. data/lib/kowl/templates/app/views/shared/footer/semantic.html.slim.tt +5 -0
  106. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.erb.tt +51 -0
  107. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.haml.tt +36 -0
  108. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.slim.tt +36 -0
  109. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.erb.tt +48 -0
  110. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.haml.tt +36 -0
  111. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.slim.tt +36 -0
  112. data/lib/kowl/templates/app/workers/scheduler/pghero_scheduler.rb +11 -0
  113. data/lib/kowl/templates/config/autoprefixer.yml +4 -0
  114. data/lib/kowl/templates/config/db/mysql.yml.tt +43 -0
  115. data/lib/kowl/templates/config/db/oracle.yml.tt +29 -0
  116. data/lib/kowl/templates/config/db/postgresql.yml.tt +37 -0
  117. data/lib/kowl/templates/config/db/sqlite3.yml.tt +20 -0
  118. data/lib/kowl/templates/config/db/sqlserver.yml.tt +28 -0
  119. data/lib/kowl/templates/config/initializers/administrate.rb.tt +9 -0
  120. data/lib/kowl/templates/config/initializers/bullet.rb +21 -0
  121. data/lib/kowl/templates/config/initializers/devise-security.rb +44 -0
  122. data/lib/kowl/templates/config/initializers/devise_argon2.rb +29 -0
  123. data/lib/kowl/templates/config/initializers/faker.rb +6 -0
  124. data/lib/kowl/templates/config/initializers/generators.rb.tt +31 -0
  125. data/lib/kowl/templates/config/initializers/geocoder.rb +10 -0
  126. data/lib/kowl/templates/config/initializers/letter_opener.rb +13 -0
  127. data/lib/kowl/templates/config/initializers/lockbox.rb +11 -0
  128. data/lib/kowl/templates/config/initializers/logging.rb +6 -0
  129. data/lib/kowl/templates/config/initializers/lograge.rb +7 -0
  130. data/lib/kowl/templates/config/initializers/logstop.rb +4 -0
  131. data/lib/kowl/templates/config/initializers/middleware.rb +9 -0
  132. data/lib/kowl/templates/config/initializers/oj.rb +7 -0
  133. data/lib/kowl/templates/config/initializers/pagy.rb.tt +16 -0
  134. data/lib/kowl/templates/config/initializers/postmark.rb +8 -0
  135. data/lib/kowl/templates/config/initializers/rack_attack.rb.tt +71 -0
  136. data/lib/kowl/templates/config/initializers/sass.rb +5 -0
  137. data/lib/kowl/templates/config/initializers/sidekiq.rb +11 -0
  138. data/lib/kowl/templates/config/initializers/simpleform/semantic.rb +225 -0
  139. data/lib/kowl/templates/config/initializers/slim.rb +6 -0
  140. data/lib/kowl/templates/config/initializers/sparkpost.rb +13 -0
  141. data/lib/kowl/templates/config/routes.rb.tt +28 -0
  142. data/lib/kowl/templates/config/sidekiq.yml.tt +17 -0
  143. data/lib/kowl/templates/db/migrations/create_action_text_tables.action_text.rb.tt +16 -0
  144. data/lib/kowl/templates/db/migrations/create_active_storage_tables.active_storage.rb.tt +29 -0
  145. data/lib/kowl/templates/db/migrations/devise.rb.tt +59 -0
  146. data/lib/kowl/templates/db/migrations/login_activities.rb.tt +41 -0
  147. data/lib/kowl/templates/db/seeds.rb.tt +14 -0
  148. data/lib/kowl/templates/docker/Dockerfile.alpine.tt +92 -0
  149. data/lib/kowl/templates/docker/Dockerfile.debian.tt +133 -0
  150. data/lib/kowl/templates/docker/docker-compose.yml.tt +55 -0
  151. data/lib/kowl/templates/docker/mysql/Dockerfile.tt +15 -0
  152. data/lib/kowl/templates/dotfiles/Aptfile.tt +34 -0
  153. data/lib/kowl/templates/dotfiles/Brewfile.tt +49 -0
  154. data/lib/kowl/templates/dotfiles/Procfile.tt +12 -0
  155. data/lib/kowl/templates/dotfiles/codeclimate.yml +76 -0
  156. data/lib/kowl/templates/dotfiles/coffeelint.json +10 -0
  157. data/lib/kowl/templates/dotfiles/coffeelintignore +15 -0
  158. data/lib/kowl/templates/dotfiles/dockerignore +23 -0
  159. data/lib/kowl/templates/dotfiles/editorconfig +13 -0
  160. data/lib/kowl/templates/dotfiles/env.tt +58 -0
  161. data/lib/kowl/templates/dotfiles/erb-lint.yml +10 -0
  162. data/lib/kowl/templates/dotfiles/erdconfig.tt +24 -0
  163. data/lib/kowl/templates/dotfiles/eslintignore +20 -0
  164. data/lib/kowl/templates/dotfiles/eslintrc.js +31 -0
  165. data/lib/kowl/templates/dotfiles/fasterer.yml +14 -0
  166. data/lib/kowl/templates/dotfiles/foreman +1 -0
  167. data/lib/kowl/templates/dotfiles/gitattributes +15 -0
  168. data/lib/kowl/templates/dotfiles/gitignore +69 -0
  169. data/lib/kowl/templates/dotfiles/haml-lint.yml +23 -0
  170. data/lib/kowl/templates/dotfiles/jsbeautifyrc +15 -0
  171. data/lib/kowl/templates/dotfiles/jshintrc +3 -0
  172. data/lib/kowl/templates/dotfiles/mailmap +3 -0
  173. data/lib/kowl/templates/dotfiles/nvmrc +1 -0
  174. data/lib/kowl/templates/dotfiles/prettierignore +21 -0
  175. data/lib/kowl/templates/dotfiles/prettierrc.js +62 -0
  176. data/lib/kowl/templates/dotfiles/pryrc +7 -0
  177. data/lib/kowl/templates/dotfiles/rspec +3 -0
  178. data/lib/kowl/templates/dotfiles/rubocop.yml.tt +78 -0
  179. data/lib/kowl/templates/dotfiles/scss-lint.yml +132 -0
  180. data/lib/kowl/templates/dotfiles/simplecov +19 -0
  181. data/lib/kowl/templates/dotfiles/slim-lint.yml +23 -0
  182. data/lib/kowl/templates/dotfiles/slugignore +10 -0
  183. data/lib/kowl/templates/dotfiles/yamllint +7 -0
  184. data/lib/kowl/templates/dotfiles/yarnclean +46 -0
  185. data/lib/kowl/templates/lib/tasks/stats.rake +42 -0
  186. data/lib/kowl/templates/tests/factories/README.md +0 -0
  187. data/lib/kowl/templates/tests/factories/login_activity.rb +11 -0
  188. data/lib/kowl/templates/tests/factories/user.rb +11 -0
  189. data/lib/kowl/templates/tests/minitest/README.md +3 -0
  190. data/lib/kowl/templates/tests/minitest/application_system_test_case.rb +7 -0
  191. data/lib/kowl/templates/tests/minitest/controllers/pages_controller_test.rb +10 -0
  192. data/lib/kowl/templates/tests/minitest/models/login_activity_test.rb +8 -0
  193. data/lib/kowl/templates/tests/minitest/models/user_test.rb +15 -0
  194. data/lib/kowl/templates/tests/minitest/policies/login_activity_policy_test.rb +7 -0
  195. data/lib/kowl/templates/tests/minitest/policies/user_policy_test.rb +7 -0
  196. data/lib/kowl/templates/tests/minitest/support/capybara.rb +38 -0
  197. data/lib/kowl/templates/tests/minitest/support/database_cleaner.rb +20 -0
  198. data/lib/kowl/templates/tests/minitest/support/database_cleaner_support.rb +15 -0
  199. data/lib/kowl/templates/tests/minitest/support/deferred_garbage_collection.rb +21 -0
  200. data/lib/kowl/templates/tests/minitest/support/devise.rb +16 -0
  201. data/lib/kowl/templates/tests/minitest/support/factories.rb +6 -0
  202. data/lib/kowl/templates/tests/minitest/support/formulaic.rb +8 -0
  203. data/lib/kowl/templates/tests/minitest/support/helpers/devise_helper.rb +57 -0
  204. data/lib/kowl/templates/tests/minitest/support/papertrail.rb +17 -0
  205. data/lib/kowl/templates/tests/minitest/support/pundit.rb +0 -0
  206. data/lib/kowl/templates/tests/minitest/support/shoulda.rb +11 -0
  207. data/lib/kowl/templates/tests/minitest/support/simplecov.rb +8 -0
  208. data/lib/kowl/templates/tests/minitest/test_helper.rb +17 -0
  209. data/lib/kowl/templates/tests/rspec/README.md +9 -0
  210. data/lib/kowl/templates/tests/rspec/controllers/admin/application_controller_spec.rb +12 -0
  211. data/lib/kowl/templates/tests/rspec/controllers/admin/users_controller_spec.rb +14 -0
  212. data/lib/kowl/templates/tests/rspec/controllers/pages_controller_spec.rb +10 -0
  213. data/lib/kowl/templates/tests/rspec/features/README.md +15 -0
  214. data/lib/kowl/templates/tests/rspec/features/visitor_sign_up_spec.rb +25 -0
  215. data/lib/kowl/templates/tests/rspec/helpers/application_helper_spec.rb +7 -0
  216. data/lib/kowl/templates/tests/rspec/helpers/pages_helper_spec.rb +15 -0
  217. data/lib/kowl/templates/tests/rspec/models/login_activity_spec.rb +11 -0
  218. data/lib/kowl/templates/tests/rspec/models/user_spec.rb +21 -0
  219. data/lib/kowl/templates/tests/rspec/policies/login_activity_policy_spec.rb +59 -0
  220. data/lib/kowl/templates/tests/rspec/policies/user_policy_spec.rb +56 -0
  221. data/lib/kowl/templates/tests/rspec/rails_helper.rb +72 -0
  222. data/lib/kowl/templates/tests/rspec/requests/pages_spec.rb +11 -0
  223. data/lib/kowl/templates/tests/rspec/spec_helper.rb +96 -0
  224. data/lib/kowl/templates/tests/rspec/support/bullet.rb +17 -0
  225. data/lib/kowl/templates/tests/rspec/support/capybara.rb +37 -0
  226. data/lib/kowl/templates/tests/rspec/support/controller_testing.rb +10 -0
  227. data/lib/kowl/templates/tests/rspec/support/database_cleaner.rb +55 -0
  228. data/lib/kowl/templates/tests/rspec/support/deferred_garbage_collection.rb +32 -0
  229. data/lib/kowl/templates/tests/rspec/support/devise.rb +21 -0
  230. data/lib/kowl/templates/tests/rspec/support/factories.rb +5 -0
  231. data/lib/kowl/templates/tests/rspec/support/formulaic.rb +8 -0
  232. data/lib/kowl/templates/tests/rspec/support/helpers/devise_helpers.rb +56 -0
  233. data/lib/kowl/templates/tests/rspec/support/papertrail.rb +5 -0
  234. data/lib/kowl/templates/tests/rspec/support/pi_ci.rb +6 -0
  235. data/lib/kowl/templates/tests/rspec/support/pundit.rb +6 -0
  236. data/lib/kowl/templates/tests/rspec/support/shoulda.rb +10 -0
  237. data/lib/kowl/templates/tests/rspec/support/sidekiq.rb +10 -0
  238. data/lib/kowl/templates/tests/rspec/support/simplecov.rb +7 -0
  239. data/lib/kowl/templates/tests/rspec/support/warden.rb +8 -0
  240. data/lib/kowl/templates/text_files/AUTHORS.md +4 -0
  241. data/lib/kowl/templates/text_files/CHANGELOG.md.tt +12 -0
  242. data/lib/kowl/templates/text_files/CODE_OF_CONDUCT.md +76 -0
  243. data/lib/kowl/templates/text_files/TODO.md +7 -0
  244. data/lib/kowl/templates/text_files/VERSION +1 -0
  245. data/lib/kowl/templates/text_files/humans.txt.tt +15 -0
  246. data/lib/kowl/templates/text_files/robots.txt.tt +6 -0
  247. data/lib/kowl/templates/text_files/security.txt +6 -0
  248. data/lib/kowl/version.rb +9 -0
  249. data/lib/kowl.rb +18 -0
  250. metadata +404 -0
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class ActionGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
10
+ class_option :database, type: :string, default: 'sqlite3'
11
+ class_option :simpleform, type: :boolean, default: false
12
+ class_option :skip_javascript, type: :boolean, default: false
13
+ hide!
14
+
15
+ # Because simpleform hasn't Actiontext input types yet, attribute type needs to be added in order for an input type to properly load
16
+ # => https://github.com/plataformatec/simple_form/issues/1638
17
+ def copy_simpleform_inputs
18
+ return nil unless options[:simpleform]
19
+
20
+ # If using simpleform tthis allows you to use rich_text_area input type (trix)
21
+ # ie: `= f.rich_text_area :body`
22
+ directory('app/inputs', 'app/inputs')
23
+ end
24
+
25
+ # Used to beign setting up action_text based on if options[:skip_javascript] is specified or not
26
+ def setup_action_text
27
+ # If javascript is being skipped, you'll only want to generate the migrations.
28
+ # => But if you're skipping javascript, you'll need to add actiontext javascript components yourself
29
+ if options[:skip_javascript]
30
+ rake 'action_text:copy_migrations'
31
+ else
32
+ rake 'action_text:install'
33
+ end
34
+ end
35
+
36
+ # Setup and create ActiveStorage migrations
37
+ def setup_active_storage
38
+ rake 'active_storage:install'
39
+ end
40
+
41
+ # Correct issue with application index if using Oracle for the applications database
42
+ # This is because Oracle can only have an index of 30 characters long
43
+ # So oracle is being used we need to correct the migrations to remove the indexes with huge names
44
+ def correct_oracle_indexes
45
+ return nil unless options[:database] == 'oracle'
46
+
47
+ # Fix - index_active_storage_attachments_uniqueness
48
+ Dir.glob('db/migrate/**_create_active_storage_tables.active_storage.rb').select do |migration_file|
49
+ gsub_file migration_file, 't.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true', 't.index [ :record_type, :record_id, :name, :blob_id ], name: "index_activestorage", unique: true'
50
+ end
51
+ Dir.glob('db/migrate/**_create_action_text_tables.action_text.rb').select do |migration_file|
52
+ gsub_file migration_file, 't.index [ :record_type, :record_id, :name ], name: "index_action_text_rich_texts_uniqueness", unique: true', 't.index [ :record_type, :record_id, :name ], name: "index_actiontext", unique: true'
53
+ end
54
+ end
55
+
56
+ # Correct issue with the applications index if using SQLserver for the application database
57
+ # This is because the active_record migration flagges an error for foreign_key constraints for using blob_ids as the index
58
+ def correct_sqlserver_indexes
59
+ return nil unless options[:database] == 'sqlserver'
60
+
61
+ Dir.glob('db/migrate/**_create_active_storage_tables.active_storage.rb').select do |migration_file|
62
+ gsub_file migration_file, 't.foreign_key :active_storage_blobs, column: :blob_id', '# t.foreign_key :active_storage_blobs, column: :blob_id'
63
+ end
64
+ end
65
+
66
+ # If using javascript this adds trix's import to the applications SCSS file
67
+ def add_trix_stylesheets
68
+ return '' if options[:skip_javascript]
69
+
70
+ append_to_file('app/assets/stylesheets/application.scss', "\n@import 'trix/dist/trix';")
71
+ end
72
+
73
+ # Add default ActiveStorage FileType and FileSize limits for uploading through trix (this can easily be changed)
74
+ # Limit trix mimetyps to jpeg and png
75
+ # Limit max filesizes to 2MB
76
+ def limit_file_upload_types
77
+ return nil if options[:skip_javascript]
78
+
79
+ trix_action_storage = <<~TRIX_STORAGE
80
+ window.addEventListener('trix-file-accept', function(event) {
81
+ const acceptedTypes = ['image/jpg', 'image/jpeg', 'image/png']
82
+ const maxFileSize = (1024 * 1024) * 2 // 2MB
83
+ // Limit trix file upload types to the mimetypes listed below
84
+ if (!acceptedTypes.includes(event.file.type)) {
85
+ event.preventDefault()
86
+ alert('Only support attachment of jpeg or png files')
87
+ }
88
+ // Limit trix max filesize limits to 2MB
89
+ if (event.file.size > maxFileSize) {
90
+ event.preventDefault()
91
+ alert('Only support of attachment files upto size 2MB!')
92
+ }
93
+ })
94
+ TRIX_STORAGE
95
+ append_to_file('app/javascript/packs/application.js', "\n\n#{trix_action_storage}")
96
+ end
97
+
98
+ # def update_migration_fields
99
+ # Dir.glob('db/migrate/**_create_action_text_tables.action_text.rb').select { |e| update_action_migration(e, 'db/migrations/create_action_text_tables.action_text.rb.tt') }
100
+ # Dir.glob('db/migrate/**_create_active_storage_tables.active_storage.rb').select { |e| update_action_migration(e, 'db/migrations/create_active_storage_tables.active_storage.rb.tt') }
101
+ # end
102
+
103
+ # private
104
+
105
+ # def update_action_migration(migration_file, template_file)
106
+ # return nil if migration_file.blank? || template_file.blank?
107
+ # return false unless file_exists?(migration_file)
108
+ #
109
+ # # override prexisting migration with template contents
110
+ # template template_file, migration_file, force: true
111
+ # end
112
+ end
113
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class AdminGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'app'), File.dirname(__FILE__))
10
+ class_option :database, type: :string, default: 'sqlite3'
11
+ class_option :skip_javascript, type: :boolean, default: false
12
+ class_option :skip_turbolinks, type: :boolean, default: false
13
+ class_option :uuid, type: :boolean, default: false
14
+
15
+ # NOTE: In most of these I user the administrates native generator, before replacing them
16
+ # that way if any tests are generates they will be available as well
17
+ # This is skipped when using UUID's because by default the dashbooards try to us integers for ID's
18
+ def generate_admin_dashboard
19
+ generate('administrate:install') unless options[:uuid]
20
+ end
21
+
22
+ # Generate custom field attribute types to show a persons gravatar
23
+ def generate_avatar_fields
24
+ generate('administrate:field gravatar')
25
+ remove_dir('app/fields')
26
+ copy_file('app/fields/gravatar_field.rb', force: true)
27
+ end
28
+
29
+ # Generate support for the action_text field type to be supported with administrate
30
+ def generate_action_text_fields
31
+ generate('administrate:field rich_text_area')
32
+ copy_file('app/fields/rich_text_area_field.rb', force: true)
33
+ end
34
+
35
+ # We copy dashboards over after the fields are generates.
36
+ # Otherwise there will be an error about field types unknown (GravatarField)
37
+ def copy_dashboards
38
+ # Replace with dashboards showing less user data (this is because even admin and staff should be able to add, edit, or modify certain attributes)
39
+ remove_dir('app/dashboards/')
40
+ # This is because if UUID's are used the dashboards try to render them as integers.
41
+ # Otherwise they'll be displayed as strings
42
+ mk_dir('app/dashboards')
43
+ %i[login_activity user rich_text_body].map { |dashboard| template "dashboards/#{dashboard}_dashboard.rb.tt", "app/dashboards/#{dashboard}_dashboard.rb" }
44
+ end
45
+
46
+ # this is to replace default generated gravatar views with ones that will actually show the user gravatars
47
+ def replace_field_views
48
+ remove_dir('app/views/fields')
49
+ directory('views/fields', 'app/views/fields', force: true)
50
+ end
51
+
52
+ # This is because admin controllers should only be viewable if a user is a superuser or staff member
53
+ def replace_admin_controllers
54
+ remove_dir('app/controllers/admin')
55
+ directory('controllers/admin', 'app/controllers/admin', force: true)
56
+ end
57
+
58
+ # Copy views for administrate dependant on if the app will use javascript or not
59
+ def copy_admin_views
60
+ if options[:skip_javascript]
61
+ remove_file('app/views/admin/application/_javascript.html.erb')
62
+ else
63
+ copy_file('views/admin/views/application/_javascript.html.erb', 'app/views/admin/application/_javascript.html.erb')
64
+ end
65
+ template('views/layouts/admin.html.erb.tt', 'app/views/layouts/admin/application.html.erb')
66
+ end
67
+
68
+ # Unless javascript is skipped this adds the TRIX SCSS the to administrate stylesheets
69
+ def add_trix_scss
70
+ return nil if options[:skip_javascript]
71
+
72
+ trix_import_str = <<~TRIX_SCSS
73
+ // Used for creating ActionText content editors
74
+ @import 'trix/dist/trix';
75
+ // Used for date/time selection boxes in the admin interface
76
+ @import 'flatpickr/dist/flatpickr.min';
77
+
78
+ // We need to override trix.css’s image gallery styles to accommodate the
79
+ // <action-text-attachment> element we wrap around attachments. Otherwise,
80
+ // images in galleries will be squished by the max-width: 33%; rule.
81
+ .trix-content {
82
+ .attachment-gallery {
83
+ >action-text-attachment,
84
+ >.attachment {
85
+ flex: 1 0 33%;
86
+ padding: 0 0.5em;
87
+ max-width: 33%;
88
+ }
89
+ &.attachment-gallery--2,
90
+ &.attachment-gallery--4 {
91
+ >action-text-attachment,
92
+ >.attachment {
93
+ flex-basis: 50%;
94
+ max-width: 50%;
95
+ }
96
+ }
97
+ }
98
+ action-text-attachment {
99
+ .attachment {
100
+ padding: 0 !important;
101
+ max-width: 100% !important;
102
+ }
103
+ }
104
+ }
105
+ .field-unit--rich-text-area-field {
106
+ .field-unit__field {
107
+ width: 80%;
108
+ }
109
+ }
110
+ TRIX_SCSS
111
+ append_to_file('app/assets/stylesheets/administrate/application.scss', trix_import_str)
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class AssetsGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'app', 'assets'), File.dirname(__FILE__))
10
+ class_option :framework, type: :string, default: 'bootstrap', enum: %w[bootstrap semantic none]
11
+ class_option :noauth, type: :boolean, default: false
12
+ class_option :skip_javascript, type: :boolean, default: false
13
+ class_option :skip_mailer, type: :boolean, default: false
14
+ class_option :skip_turbolinks, type: :boolean, default: false
15
+
16
+ # If javascript is being used, this will setup jquery to be usable through webpack
17
+ def setup_jquery_with_webpack
18
+ return nil if options[:skip_javascript]
19
+
20
+ add_package('jquery')
21
+ append_to_file('app/javascript/packs/application.js', "\nrequire('jquery');\n")
22
+ webpack_jquery_str = <<~JQUERY
23
+ const webpack = require('webpack')
24
+ environment.plugins.prepend('Provide',
25
+ new webpack.ProvidePlugin({
26
+ $: 'jquery/src/jquery',
27
+ jQuery: 'jquery/src/jquery'
28
+ })
29
+ )
30
+ JQUERY
31
+ inject_into_file('config/webpack/environment.js', webpack_jquery_str, after: "const { environment } = require('@rails/webpacker')\n")
32
+ end
33
+
34
+ # This allows us to generate JS assets compressed with brotli and zopfil in production
35
+ # Which dramatically reduces text based asset sizes
36
+ # - https://github.com/tootsuite/mastodon/blob/master/config/webpack/production.js
37
+ # - https://github.com/rails/webpacker/blob/9e671a3ebe368cfdc624309a9b4a55e998f87186/package/environments/production.js
38
+ def setup_production_asset_compression
39
+ return nil if options[:skip_javascript]
40
+
41
+ # The compression-webpack-plugin package is included in @rails/webpacker.
42
+ # => But this lets us easily access it from our webpacker config
43
+ add_package('compression-webpack-plugin brotli-webpack-plugin @gfx/zopfli')
44
+ webpack_plugins_str = <<~BROTLI
45
+ // Compress the heck out of any static assets included by webpacker (using Brotlie)
46
+ environment.plugins.append('BrotliCompression',
47
+ new CompressionPlugin({
48
+ filename: '[path].br[query]',
49
+ algorithm: 'brotliCompress',
50
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/,
51
+ compressionOptions: {
52
+ level: 11
53
+ },
54
+ cache: true,
55
+ threshold: 10240,
56
+ minRatio: 0.8,
57
+ deleteOriginalAssets: false,
58
+ })
59
+ )
60
+
61
+ // Override default compression with Zopfli compression
62
+ environment.plugins.append('Compression',
63
+ new CompressionPlugin({
64
+ filename: '[path].gz[query]',
65
+ algorithm(input, compressionOptions, callback) {
66
+ return zopfli.gzip(input, compressionOptions, callback);
67
+ },
68
+ cache: true,
69
+ threshold: 8192,
70
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/,
71
+ }),
72
+ )
73
+ BROTLI
74
+
75
+ include_plugins_str = <<~PLUGINS
76
+ const CompressionPlugin = require('compression-webpack-plugin'); // General webpacker library containing compression methods
77
+ const zopfli = require('@gfx/zopfli'); // Zopfli is used to increase gzip compression ratio for gzip
78
+ PLUGINS
79
+
80
+ inject_into_file('config/webpack/production.js', "#{include_plugins_str}\n\n#{webpack_plugins_str}", after: "const environment = require('./environment')\n")
81
+ end
82
+
83
+ # Unless skipping javascript, this adds some basic linter packages to the webpacker dev environments
84
+ def setup_js_linters
85
+ return nil if options[:skip_javascript]
86
+
87
+ add_package('eslint prettier prettierrc --dev')
88
+ end
89
+
90
+ # If the application will be using Bootstrap or SemanticUI, this includes their JS files in the javascript packs file
91
+ def setup_framework_js
92
+ return nil if options[:skip_javascript]
93
+
94
+ if options[:framework] == 'bootstrap'
95
+ add_package('bootstrap popper.js')
96
+ js_str = <<~BOOTSTRAP
97
+ require('bootstrap');
98
+ require('popper.js');\n
99
+ BOOTSTRAP
100
+ elsif options[:framework] == 'semantic'
101
+ # The version is used because code semantic-ui and fomantic-ui packages require you to build them with gulp
102
+ # => This makes it easier to get started without a ton of additional setup
103
+ copy_file('app/javascript/packs/semantic.js', 'app/javascript/packs/semantic.js')
104
+ js_str = <<~SEMANTIC
105
+ import Semantic from './semantic';
106
+ SEMANTIC
107
+ end
108
+ append_to_file('app/javascript/packs/application.js', js_str) unless js_str.blank?
109
+ end
110
+
111
+ # Add Bootstrap/Semantic JS to the application.js file
112
+ def add_framework_js_to_webpack
113
+ return nil if options[:skip_javascript] || !%w[bootstrap semantic].include?(options[:framework])
114
+
115
+ # If you prefere to pass skip_turbolinks, have JS load with jQuery on the page load
116
+ js_load_str = if options[:skip_turbolinks]
117
+ '$(document).ready(function() {'
118
+ else
119
+ '$(document).on("turbolinks:load", function() {'
120
+ end
121
+
122
+ if options[:framework] == 'bootstrap'
123
+ framework_js = <<~BOOTSTRAPJS
124
+ #{js_load_str}
125
+ // This will dismiss any and all flash alerts after 3 seconds
126
+ window.setTimeout(function() {
127
+ $('.alert').fadeTo(1000, 0).slideUp(1000, function() {
128
+ $(this).remove();
129
+ });
130
+ }, 3000);
131
+ });
132
+ BOOTSTRAPJS
133
+ elsif options[:framework] == 'semantic'
134
+ framework_js = <<~SEMANTICJS
135
+ #{js_load_str}
136
+ // Allow the user to close the flash messages
137
+ $('.message .close')
138
+ .on('click', function(){
139
+ $(this).closest('.message').transition('fade');
140
+ });
141
+
142
+ // Automatically close flash messages after 3 seconds
143
+ window.setTimeout(function() {
144
+ $('.message').transition('fade');
145
+ }, 3000);
146
+ });
147
+ SEMANTICJS
148
+ end
149
+ append_to_file('app/javascript/packs/application.js', framework_js) unless options[:skip_javascript]
150
+ end
151
+
152
+ # If using bootstrap or semsanitic this includes some additional SCSS files with the application
153
+ def copy_stylesheets
154
+ return nil unless %w[bootstrap semantic].include? options[:framework]
155
+
156
+ # Remove old application stylesheets and replace with new ones
157
+ remove_file 'app/assets/stylesheets/application.css'
158
+ directory "stylesheets/#{options[:framework]}", 'app/assets/stylesheets', force: true
159
+ remove_file 'app/assets/stylesheets/application-mailer.scss' if options[:skip_mailer]
160
+ end
161
+
162
+ # Adds known css files to css assets to precompile
163
+ def add_assets_to_precompile
164
+ add_to_assets('application.css')
165
+ return nil if options[:noauth]
166
+
167
+ add_to_assets('administrate/application.css')
168
+ end
169
+
170
+ # If using webpacker, this will generate it's JS webpacker files for the application
171
+ def add_admin_webpacker_assets
172
+ return nil if options[:noauth] || options[:skip_javascript]
173
+
174
+ template('app/javascript/packs/administrate.js', 'app/javascript/packs/administrate.js')
175
+ copy_file('app/javascript/administrate/index.js', 'app/javascript/administrate/index.js')
176
+
177
+ template('app/javascript/administrate/components/date_time_picker.js.tt', 'app/javascript/administrate/components/date_time_picker.js')
178
+ template('app/javascript/administrate/components/table.js.tt', 'app/javascript/administrate/components/table.js')
179
+ end
180
+
181
+ # If using webpacker allow CSS Extraction for CSS, SCSS, and SASS to work when compiling webpacker assets
182
+ def enable_css_extraction
183
+ return nil if options[:skip_javascript]
184
+
185
+ replace_string_in_file('config/webpacker.yml', "[\s]?extract_css[\:][\s]?false[\s]?", ' extract_css: true') unless options[:skip_javascript]
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'rails/generators'
5
+ require_relative '../actions'
6
+ require_relative '../docker'
7
+
8
+ # https://api.rubyonrails.org/v5.2/classes/Rails/Generators/Base.html
9
+ module Kowl
10
+ module Generators
11
+ class Base < Rails::Generators::Base
12
+ include Kowl::Actions
13
+ include Kowl::Docker
14
+ hide!
15
+
16
+ # Resolve to using the default Rails gem templates as a fallback in case source_path doesn't exist for generator
17
+ # NOTE: Do no enable this, as it tends to overwrite the default rails gem past for pulling templates from (ie: database stuff)
18
+ def self.default_source_root
19
+ File.expand_path(File.join('..', 'templates'), __dir__)
20
+ end
21
+
22
+ # Used for setting RAILS default source_path
23
+ # As well as adding the gems source_path to the generators
24
+ # src: https://github.com/solidusio/solidus/blob/master/core/lib/generators/spree/dummy/dummy_generator.rb#L15
25
+ def self.source_paths
26
+ super
27
+ paths = superclass.source_paths
28
+ paths << File.expand_path(File.join('..', 'templates'), __dir__)
29
+ paths.flatten.uniq
30
+ end
31
+
32
+ private
33
+
34
+ # Return a cleaned up version of the name of the application being generated
35
+ def app_name
36
+ Rails.app_class.parent_name.demodulize.underscore.dasherize
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # circleci/ruby:2.6-noderequire 'rails/generators'
4
+ # https://circleci.com/docs/2.0/custom-images/
5
+ require_relative 'base'
6
+
7
+ module Kowl
8
+ class CircleciGenerator < Kowl::Generators::Base
9
+ hide!
10
+ end
11
+ end
@@ -0,0 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class ConfigGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'config', 'initializers'), File.dirname(__FILE__))
10
+ class_option :database, type: :string, default: 'sqlite3'
11
+ class_option :encrypt, type: :boolean, default: false
12
+ class_option :framework, type: :string, default: 'bootstrap', enum: %w[bootstrap semantic none]
13
+ class_option :noauth, type: :boolean, default: false
14
+ class_option :skip_docker, type: :boolean, default: false
15
+ class_option :skip_erd, type: :boolean, default: false
16
+ class_option :skip_pagination, type: :boolean, default: false
17
+ class_option :skip_sidekiq, type: :boolean, default: false
18
+ class_option :skip_tests, type: :boolean, default: false
19
+ class_option :simpleform, type: :boolean, default: false
20
+ class_option :template_engine, type: :string, default: 'erb', enum: %w[erb slim haml]
21
+ class_option :test_engine, type: :string, default: 'rspec', enum: %w[minitest rspec none]
22
+ class_option :uuid, type: :boolean, default: false
23
+
24
+ # Generate simpleform config early, so rails generators don't output a ton of simpleform garbage everytime a generator is ran
25
+ def setup_simpleform
26
+ return unless options[:simpleform]
27
+
28
+ case options[:framework]
29
+ when 'bootstrap'
30
+ generate 'simple_form:install', '--bootstrap', '--force'
31
+ when 'semantic'
32
+ copy_file 'simpleform/semantic.rb', 'config/initializers/simple_form.rb', force: true
33
+ else
34
+ generate 'simple_form:install', '--force'
35
+ end
36
+ end
37
+
38
+ # Generate application initializer for devise
39
+ def copy_devise_config
40
+ # Encrypt devise passwords using Argon for better password security
41
+ copy_file 'devise_argon2.rb', 'config/initializers/devise_argon2.rb' unless options[:noauth]
42
+ end
43
+
44
+ # Setup autoprefixer basic configuration
45
+ def copy_autoprefixer
46
+ copy_file '../autoprefixer.yml', 'config/autoprefixer.yml', force: true
47
+ end
48
+
49
+ # Generate application initializer for faker/applicatiton tests
50
+ def copy_faker_config
51
+ copy_file('faker.rb', 'config/initializers/faker.rb', force: true) unless options[:skip_tests]
52
+ end
53
+
54
+ # Generate application initializer for geocoder
55
+ def copy_geocoder_config
56
+ return nil if options[:noauth]
57
+
58
+ copy_file('geocoder.rb', 'config/initializers/geocoder.rb')
59
+ GeoDB.perform(Rails.root)
60
+ end
61
+
62
+ # Generate several application initializers to cleanup to make the application easier to manage
63
+ def copy_initializers
64
+ files = %w[bullet logging lograge oj sass]
65
+ files.push('slim') if options['template_engine'] == 'slim'
66
+
67
+ files.map { |file| copy_file "#{file}.rb", "config/initializers/#{file}.rb" }
68
+ end
69
+
70
+ # Generate initializers for rack_attack depending on the applications requirements (devise, sidekiq, etc)
71
+ def copy_rack_attack
72
+ # it's a template because it has routes that may not be used if --noauth is specified
73
+ template('rack_attack.rb.tt', 'config/initializers/rack_attack.rb')
74
+ end
75
+
76
+ # Generatet initializer for pagy if pagination will be used in the application
77
+ def copy_pagy_config
78
+ template('pagy.rb.tt', 'config/initializers/pagy.rb', force: true) unless options[:skip_pagination]
79
+ end
80
+
81
+ # Generaet version file used for docker application versioning and deployment
82
+ def create_version_file
83
+ create_file('.version', '0.0.1')
84
+ end
85
+
86
+ # Setup Rack::Timeout using slowpoke, in order to kill slow requests
87
+ def setup_slowpoke
88
+ generate('slowpoke:install')
89
+ end
90
+
91
+ # This sets the production log_level to info, by default all environments have a log_level of debug.
92
+ # And this can be dangerous when your application logs are collecting user params and showing Mailers within the logs
93
+ # https://guides.rubyonrails.org/debugging_rails_applications.html#log-levels
94
+ def set_production_loglevel
95
+ inject_into_file('config/environments/production.rb', ' # ', before: " config.log_level = :debug\n")
96
+ inject_into_file('config/environments/production.rb', "\n config.log_level = :info\n", after: 'config.log_level = :debug')
97
+ end
98
+
99
+ # Generates additional config the appliations config/application.rb file based on the current options (test_engine, template_engine, etc.)
100
+ def application_config
101
+ # Moves generating of default stylesheets and set sthe default timezone
102
+ # => add configuration to config/application.rb
103
+ # => https://apidock.com/rails/Rails/Generators
104
+ sidekiq_config = (options[:skip_sidekiq] ? '' : 'config.active_job.queue_adapter = :sidekiq')
105
+ cache_storage_config = (options[:skip_sidekiq] ? 'config.cache_store = :mem_cache_store' : "config.cache_storage = :redis_cache_store, { driver: :hiredis, url: ENV.fetch('REDIS_URL'){ 'redis://localhost:6379/0' } }")
106
+ app_config = <<-CONFIG
107
+ # Set the applications timezone
108
+ config.time_zone = 'UTC'
109
+ config.active_record.default_timezone = :local
110
+ #{sidekiq_config}
111
+ #{cache_storage_config}
112
+
113
+ #{options[:skip_docker] ? '' : "# If you change this to use imagemagick, you'll need to update your Dockerfile as well"}
114
+ # => https://api.rubyonrails.org/classes/ActiveStorage/Variant.html
115
+ config.active_storage.variant_processor = :vips
116
+ CONFIG
117
+ insert_into_file 'config/application.rb', optimize_indentation(app_config, 4), after: /\s?config.load_defaults\s(\d\S\d)\n/
118
+ end
119
+
120
+ # Generate initializer for the applications generator config
121
+ def generate_generators_config
122
+ template 'generators.rb.tt', 'config/initializers/generators.rb', force: true
123
+ end
124
+
125
+ # Generate initializer for application middleware
126
+ def setup_middleware_config
127
+ copy_file 'middleware.rb', 'config/initializers/middleware.rb', force: true
128
+ end
129
+
130
+ # Generate initializer for using administrate with the application
131
+ def copy_administate_config
132
+ template('administrate.rb.tt', 'config/initializers/administrate.rb') unless options[:noauth]
133
+ end
134
+
135
+ # Run the ERD generator, so the application will generate a new ERB when migrations are added/modified
136
+ def setup_erd
137
+ return nil if options[:skip_erd]
138
+
139
+ generate('erd:install')
140
+ end
141
+
142
+ ##############################
143
+ # Securtiy Config
144
+ ##############################
145
+
146
+ # If wanting to encrypt database attributes, generate lockbox initializer
147
+ def copy_lockbox_config
148
+ # Lockbox will be used to secure sensative data attributes throughout the application
149
+ # => https://github.com/ankane/lockbox
150
+ copy_file('lockbox.rb', 'config/initializers/lockbox.rb') if options[:encrypt]
151
+ end
152
+
153
+ # Generate a logstop application initializer
154
+ # To filter out sensative parameteres before they are passed to the applications logs
155
+ def copy_logstop_config
156
+ copy_file 'logstop.rb', 'config/initializers/logstop.rb'
157
+ end
158
+
159
+ # Add additional parameters to be filtered from logs
160
+ def add_filtered_parameters
161
+ append_to_file('config/initializers/filter_parameter_logging.rb', 'Rails.application.config.filter_parameters += %i[email ip]')
162
+ end
163
+
164
+ # Setup a basic CORS policy for application JS interactions
165
+ def setup_cors
166
+ cors_str = <<~CORS
167
+ Rails.application.config.content_security_policy do |policy|
168
+ if Rails.env.development?
169
+ policy.script_src :self, :https, :unsafe_eval
170
+
171
+ policy.connect_src :self, :https, 'http://localhost:3000', 'ws://localhost:3000', 'http://localhost:3000', 'ws://localhost:3000'
172
+ else
173
+ policy.script_src :self, :https
174
+ end
175
+ end
176
+ CORS
177
+ append_to_file('config/initializers/content_security_policy.rb', cors_str)
178
+ end
179
+ end
180
+ end