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,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class ControllerGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'app', 'controllers'), File.dirname(__FILE__))
10
+ class_option :noauth, type: :boolean, default: false
11
+
12
+ # Add application_controller callbacks depending on if the application requires user auth or not
13
+ def app_controller_auth
14
+ if options[:noauth]
15
+ app_str = <<~APP
16
+ protect_from_forgery with: :exception
17
+ include ErrorHandlers # Application fallbacks
18
+ helper :all
19
+ APP
20
+ inject_into_file 'app/controllers/application_controller.rb', optimize_indentation(app_str, 2), after: "class ApplicationController < ActionController::Base\n"
21
+ copy_file('concerns/noauth/error_handlers.rb', 'app/controllers/concerns/error_handlers.rb')
22
+ else
23
+ app_str = <<~APP
24
+ protect_from_forgery with: :exception
25
+ before_action :authenticate_user!
26
+ impersonates :user
27
+
28
+ include Authentication # Devise/Authentication stuff
29
+ include Authorization # To determine if a user is authorized to do a specific action
30
+ include ErrorHandlers # Application fallbacks
31
+ helper :all
32
+ APP
33
+
34
+ inject_into_file 'app/controllers/application_controller.rb', optimize_indentation(app_str, 2), after: "class ApplicationController < ActionController::Base\n"
35
+ directory 'concerns/auth', 'app/controllers/concerns', force: true
36
+ end
37
+ end
38
+
39
+ def make_controller_immuatable
40
+ inject_into_file 'app/controllers/application_controller.rb', "# frozen_string_literal: true\n\n", before: "class ApplicationController < ActionController::Base\n"
41
+ end
42
+
43
+ # This allows the application to dynamically assign the mail delivery host when running in development and staging
44
+ def set_default_url_options
45
+ mailer_str = <<~MAILER_STR
46
+ before_action :mailer_set_url_options unless Rails.env.production?
47
+
48
+ private
49
+
50
+ def mailer_set_url_options
51
+ ActionMailer::Base.default_url_options[:host] = request.host_with_port
52
+ end
53
+ MAILER_STR
54
+ inject_into_file 'app/controllers/application_controller.rb', optimize_indentation(mailer_str, 2), after: "helper :all\n"
55
+ end
56
+
57
+ # Enable additional flash_types to the application_controller
58
+ def enable_additional_flash_types
59
+ flash_str = "add_flash_types :success, :error # Enable additional flash types across the application\n"
60
+
61
+ inject_into_file 'app/controllers/application_controller.rb', optimize_indentation(flash_str, 2), after: "class ApplicationController < ActionController::Base\n"
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ # Database configurations
7
+ # https://api.rubyonrails.org/v5.1/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html
8
+ # https://devcenter.heroku.com/articles/concurrency-and-database-connections
9
+ module Kowl
10
+ class DatabaseGenerator < Kowl::Generators::Base
11
+ hide!
12
+ source_root File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
13
+ class_option :database, type: :string, aliases: '-d', default: 'sqlite3'
14
+ class_option :noauth, type: :boolean, default: false
15
+ class_option :uuid, type: :boolean, default: false
16
+
17
+ # Used to generate the config for automatically generating annotated models
18
+ def setup_annotate
19
+ generate('annotate:install')
20
+ end
21
+
22
+ # If the application is using postgresql this will add pghero to the application
23
+ def setup_pghero
24
+ return unless options[:database] == 'postgresql'
25
+
26
+ generate('pghero:config') # generate PGhero config
27
+ generate('pghero:query_stats') # generate pghero stats migrations
28
+ generate('pghero:space_stats')
29
+ add_to_assets('pghero/application.js pghero/application.css')
30
+ end
31
+
32
+ # Copy a base seef file to the application with sample users
33
+ def copy_seed_file
34
+ template('db/seeds.rb.tt', 'db/seeds.rb', force: true)
35
+ end
36
+
37
+ # Add frozen_string_literal to application_record.rb
38
+ def make_ar_immutable
39
+ inject_into_file('app/models/application_record.rb', "# frozen_string_literal: true\n\n", before: "class ApplicationRecord < ActiveRecord::Base\n")
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class DecoratorsGenerator < Kowl::Generators::Base
8
+ hide!
9
+ class_option :noauth, type: :boolean, default: false
10
+
11
+ # Generate a user decorator file for the applications users model
12
+ def users_decorator
13
+ generate('decorator user') unless options[:noauth]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class DockerGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'docker'), File.dirname(__FILE__))
10
+ class_option :encrypt, type: :boolean, default: false
11
+ class_option :database, type: :string, default: 'sqlite3'
12
+ class_option :docker_distro, type: :string, default: 'alpine'
13
+ class_option :skip_erd, type: :boolean, default: false
14
+ class_option :skip_javascript, type: :boolean, default: false
15
+ class_option :skip_sidekiq, type: :boolean, default: false
16
+
17
+ # Generate the applications Dockerfile depending on the the specified distro
18
+ def setup_dockerfile
19
+ if options[:docker_distro] == 'debian' || options[:database] == 'oracle'
20
+ # This is here because Debian is very compatible with most Ruby/Rails gems
21
+ # => The Oracle InstantClient does have a number of issues when trying to build with Alpine
22
+ template 'Dockerfile.debian.tt', 'Dockerfile'
23
+ else
24
+ template 'Dockerfile.alpine.tt', 'Dockerfile'
25
+ end
26
+ end
27
+
28
+ # Generate an applications docker-compose.yml file based on all it's specified requirements
29
+ def setup_docker_compose
30
+ template 'docker-compose.yml.tt', 'docker-compose.yml'
31
+ end
32
+
33
+ # If one of the specified databases are being used, generate a specific Dockerfile to generate the required tables
34
+ def setup_database_dockerfile
35
+ return nil unless options[:database] == 'mysql'
36
+
37
+ template 'mysql/Dockerfile.tt', 'docker/Dockerfile'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class DotfilesGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'dotfiles'), File.dirname(__FILE__))
10
+ class_option :encrypt, type: :boolean
11
+ class_option :template_engine, type: :string
12
+ class_option :test_engine, type: :string
13
+ class_option :database, type: :string
14
+ class_option :mailer, type: :string
15
+ class_option :skip_docker, type: :boolean, default: false
16
+ class_option :skip_erd, type: :boolean, default: false
17
+ class_option :skip_javascript, type: :boolean
18
+ class_option :skip_mailer, type: :boolean
19
+ class_option :skip_sidekiq, type: :boolean
20
+ class_option :skip_pry, type: :boolean
21
+ class_option :skip_tests, type: :boolean
22
+
23
+ # Copy basic application linter dotfiles to the applications ROOT_PATH
24
+ def copy_dotfiles
25
+ files = %w[codeclimate.yml coffeelint.json coffeelintignore dockerignore editorconfig fasterer.yml foreman gitattributes mailmap nvmrc rspec scss-lint.yml simplecov slugignore yamllint]
26
+ files.reject! { |e| e =~ /dockerignore/ } if options[:skip_docker]
27
+ files.map { |dotfile| copy_file dotfile, ".#{dotfile}" }
28
+ end
29
+
30
+ # Copy JS dotfiles for linterers over the applications ROOT_PATH
31
+ def copy_js_dotfiles
32
+ return if options[:skip_javascript]
33
+
34
+ js_files = %w[eslintignore eslintrc.js jsbeautifyrc jshintrc prettierignore prettierrc.js yarnclean]
35
+ js_files.map { |dotfile| copy_file dotfile, ".#{dotfile}" }
36
+ end
37
+
38
+ # Setup Rubocop and ERD dotfiles for the application
39
+ def setup_application_dotfiles
40
+ files = %w[erdconfig rubocop.yml]
41
+ files.reject! { |e| e =~ /erdconfig/ } if options[:skip_erd]
42
+ files.map { |dotfile| template "#{dotfile}.tt", ".#{dotfile}" }
43
+ end
44
+
45
+ # Setup application dotfiles for the applications specific template_engine [Erb, Slim, HAML]
46
+ def setup_linter_dotfiles
47
+ copy_file "#{options[:template_engine]}-lint.yml", ".#{options[:template_engine]}-lint.yml"
48
+ end
49
+
50
+ # Generate a Brewfile for the application based on it's specific requirerments (for macOS)
51
+ def setup_brewfile
52
+ template 'Brewfile.tt', 'Brewfile'
53
+ end
54
+
55
+ # Generate an Aptfile for the application based on it's specific requirements (for Debian/Ubuntu)
56
+ def setup_aptfile
57
+ template 'Aptfile.tt', 'Aptfile'
58
+ end
59
+
60
+ # Setup .env file for the application, which makes it easier to use this config with docker-compose as well
61
+ # Note: An .env file is setup instead of an .env.docker file because of the way env_file works with docker-compose
62
+ # => At the moment, when running a build with docker-compose if an env_file is anything other than .env the variables won't be consumed by the container build process
63
+ def setup_env_file
64
+ %w[development staging production test].map { |env| template 'env.tt', ".env.#{env}", env: env }
65
+ template 'env.tt', '.env', env: 'docker' unless options[:skip_docker]
66
+ end
67
+
68
+ # Generate a basic pry config file for the application
69
+ def pryrc
70
+ copy_file('pryrc', '.pryrc') unless options[:skip_pry]
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class LibsGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates', 'lib', 'tasks'), File.dirname(__FILE__))
10
+ class_option :simpleform, type: :boolean, default: false
11
+ class_option :skip_javascript, type: :boolean, default: false
12
+ hide!
13
+
14
+ # Generate a Rake file for viewing additional Rails applications stats
15
+ def stats_task
16
+ copy_file 'stats.rake', 'lib/tasks/stats.rake', force: true
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ # This class is for setting up the bootstrap mailer when using bootstrap framework and devise
7
+ module Kowl
8
+ class MailerGenerator < Kowl::Generators::Base
9
+ hide!
10
+ source_root File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
11
+ class_option :encrypt, type: :boolean, default: false
12
+ class_option :mailer, type: :string, default: 'sparkpost', enum: %w[postmark sparkpost]
13
+ class_option :noauth, type: :boolean, default: false
14
+
15
+ # Add DeviseMailer layout view, to cleanup devise emails
16
+ def copy_mailer_layouts
17
+ copy_file('app/views/layouts/devise_mailer.html.erb', 'app/views/layouts/devise_mailer.html.erb') unless options[:noauth]
18
+ end
19
+
20
+ # Override the applications default application_mailer file with some basic config
21
+ def override_application_mailer
22
+ copy_file 'app/mailers/application_mailer.rb', 'app/mailers/application_mailer.rb', force: true
23
+ end
24
+
25
+ # Add a devise mailer layout the application if devise is to be used
26
+ def copy_devise_mailer_config
27
+ copy_file('app/mailers/devise_mailer.rb', 'app/mailers/devise_mailer.rb') unless options[:noauth]
28
+ end
29
+
30
+ # Add the applications assets that need to be compiled for the mailer
31
+ def add_mailer_assets
32
+ copy_file('app/assets/stylesheets/bootstrap/application-mailer.scss')
33
+ add_to_assets('application-mailer.scss')
34
+ end
35
+
36
+ # Setup letter_opener config and initializer to catch emails in development
37
+ def setup_letter_opener
38
+ smtp_config = <<~LETTER_OPENER
39
+ # Specify if you you have a preference which method you want SMTP responses to be handled in dev
40
+ # config.action_mailer.delivery_method = :letter_opener
41
+ config.action_mailer.delivery_method = :letter_opener_web
42
+ config.action_mailer.perform_deliveries = true
43
+ config.action_mailer.raise_delivery_errors = false
44
+ LETTER_OPENER
45
+ dev_config(smtp_config)
46
+ copy_file('config/initializers/letter_opener.rb', 'config/initializers/letter_opener.rb')
47
+ end
48
+
49
+ # Setup a mailer initializer for production, based on the application config
50
+ def setup_production_mailer
51
+ if options[:mailer] == 'postmark'
52
+ copy_file('config/initializers/postmark.rb', 'config/initializers/postmark.rb', force: true)
53
+ else
54
+ copy_file('config/initializers/sparkpost.rb', 'config/initializers/sparkpost.rb', force: true)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require_relative 'base'
5
+
6
+ module Kowl
7
+ class MiscGenerator < Kowl::Generators::Base
8
+ hide!
9
+ source_root File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
10
+
11
+ # Create variables folders in the /apps path for services, workers, etc
12
+ def create_app_folders
13
+ folders = %w[serializers services workers]
14
+
15
+ folders.each do |d|
16
+ mk_appdir("app/#{d}")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require 'rails/generators/rails/app/app_generator'
5
+ require 'rails/generators/app_base'
6
+ require_relative('../../actions')
7
+
8
+ # https://github.com/rails/rails/blob/master/railties/lib/rails/generators/app_base.rb
9
+ module Kowl
10
+ module Overrides
11
+ class AppBase < Rails::Generators::AppBase
12
+ # More stuff coming soon
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ # https://www.rubydoc.info/gems/railties/5.0.0/Rails/AppBuilder
4
+ # https://github.com/rails/rails/blob/b2eb1d1c55a59fee1e6c4cba7030d8ceb524267c/railties/lib/rails/generators/rails/app/app_generator.rb#L45
5
+ # https://api.rubyonrails.org/v5.1/classes/Rails/AppBuilder.html
6
+ module Kowl
7
+ module Overrides
8
+ class AppBuilder < Rails::AppBuilder
9
+ # Override the applications .gitignore file with a more rails specific one
10
+ def gitignore
11
+ copy_file 'dotfiles/gitignore', '.gitignore', force: true
12
+ end
13
+
14
+ # Override the rails applications README with a new one (displaying application specific information in the readme)
15
+ def readme
16
+ template 'README.md.erb', 'README.md'
17
+ # This is here, because if --skip_tests is added, it skips running the gitignore function
18
+ # => since all projects have a readme this should just overwrite the gitignore file
19
+ copy_file 'dotfiles/gitignore', '.gitignore', force: true
20
+ end
21
+
22
+ # Generate procfile for anyone who uses foreman to run their rails application, sidekiq, and various other services at once
23
+ def procfile
24
+ # Generate base Procfile
25
+ template 'dotfiles/Procfile.tt', 'Procfile'
26
+ # Generate Procfile running foreman in development
27
+ template 'dotfiles/Procfile.tt', 'Procfile.dev', env: 'development'
28
+ end
29
+
30
+ # Regenerate the applications spring based binstubs
31
+ def setup_spring
32
+ bundle_command 'exec spring binstub --all'
33
+ end
34
+
35
+ # Replace the applications Gemfile with gems that are made to get you started faster
36
+ def replace_gemfile
37
+ # Gemfile template needs to be 'Gemfile.erb' otherwise it attempts to fetch Gemfile template from the Rails gem
38
+ # https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/app/templates/Gemfile.tt#L9
39
+ template 'Gemfile.erb', 'Gemfile', force: true
40
+ end
41
+
42
+ # Override the default generated database.yml file
43
+ def database_yml
44
+ # Application will be defaulted to using sqlite3, until ready
45
+ # => Application will also have a database[database].yml file to replace and run once the application is read
46
+ template 'config/db/sqlite3.yml', 'config/database.yml', force: true
47
+
48
+ # The directory config/databases/** is already used by Rails. We don't want to override this, because it won't pull from the gems template files, because they already exist in the rails gem
49
+ # /Users/username/.rvm/gems/ruby-2.6.2/gems/railties-6.0.0/lib/rails/generators/rails/app/templates/config/databases
50
+ if %w[mysql oracle postgresql sqlite3 sqlserver].include? options[:database]
51
+ template "config/db/#{options[:database]}.yml", "config/database[#{options[:database]}].yml" unless options[:database] == 'sqlite3'
52
+ else
53
+ template "config/databases/#{options[:database]}.yml", "config/database[#{options[:database]}].yml"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end