kowl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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