kowl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +7 -0
- data/README.md +383 -0
- data/bin/console +14 -0
- data/bin/kowl +106 -0
- data/bin/setup +13 -0
- data/lib/kowl/actions.rb +240 -0
- data/lib/kowl/docker.rb +447 -0
- data/lib/kowl/generators/README.md +5 -0
- data/lib/kowl/generators/action_generator.rb +113 -0
- data/lib/kowl/generators/admin_generator.rb +114 -0
- data/lib/kowl/generators/assets_generator.rb +188 -0
- data/lib/kowl/generators/base.rb +40 -0
- data/lib/kowl/generators/circleci_generator.rb +11 -0
- data/lib/kowl/generators/config_generator.rb +180 -0
- data/lib/kowl/generators/controller_generator.rb +64 -0
- data/lib/kowl/generators/database_generator.rb +42 -0
- data/lib/kowl/generators/decorators_generator.rb +16 -0
- data/lib/kowl/generators/docker_generator.rb +40 -0
- data/lib/kowl/generators/dotfiles_generator.rb +73 -0
- data/lib/kowl/generators/libs_generator.rb +19 -0
- data/lib/kowl/generators/mailer_generator.rb +58 -0
- data/lib/kowl/generators/misc_generator.rb +20 -0
- data/lib/kowl/generators/overrides/app_base.rb +15 -0
- data/lib/kowl/generators/overrides/app_builder.rb +58 -0
- data/lib/kowl/generators/overrides/app_generator.rb +249 -0
- data/lib/kowl/generators/pages_generator.rb +46 -0
- data/lib/kowl/generators/routes_generator.rb +20 -0
- data/lib/kowl/generators/sidekiq_generator.rb +31 -0
- data/lib/kowl/generators/staging_generator.rb +14 -0
- data/lib/kowl/generators/test_generator.rb +42 -0
- data/lib/kowl/generators/text_files_generator.rb +41 -0
- data/lib/kowl/generators/users_and_auth_generator.rb +143 -0
- data/lib/kowl/generators/uuid_generator.rb +39 -0
- data/lib/kowl/generators/views_and_helpers_generator.rb +104 -0
- data/lib/kowl/geodb.rb +96 -0
- data/lib/kowl/helpers.rb +139 -0
- data/lib/kowl/templates/Gemfile.erb.tt +253 -0
- data/lib/kowl/templates/README.md.erb +33 -0
- data/lib/kowl/templates/app/assets/javascripts/semantic.js.tt +26 -0
- data/lib/kowl/templates/app/assets/stylesheets/administrate/application.scss +44 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/_custom_styling.scss +38 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application-mailer.scss +1 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application.scss +14 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_alerts.scss +7 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_errors.scss +28 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_navbar.scss +17 -0
- data/lib/kowl/templates/app/assets/stylesheets/bootstrap/variables.scss +6 -0
- data/lib/kowl/templates/app/assets/stylesheets/semantic/_custom_styling.scss +20 -0
- data/lib/kowl/templates/app/assets/stylesheets/semantic/application.scss +24 -0
- data/lib/kowl/templates/app/controllers/admin/application_controller.rb +29 -0
- data/lib/kowl/templates/app/controllers/admin/login_activities_controller.rb +29 -0
- data/lib/kowl/templates/app/controllers/admin/users_controller.rb +37 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/authentication.rb +18 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/authorization.rb +20 -0
- data/lib/kowl/templates/app/controllers/concerns/auth/error_handlers.rb +27 -0
- data/lib/kowl/templates/app/controllers/concerns/noauth/error_handlers.rb +25 -0
- data/lib/kowl/templates/app/controllers/users_controller.rb +17 -0
- data/lib/kowl/templates/app/dashboards/login_activity_dashboard.rb.tt +59 -0
- data/lib/kowl/templates/app/dashboards/rich_text_body_dashboard.rb.tt +17 -0
- data/lib/kowl/templates/app/dashboards/user_dashboard.rb.tt +60 -0
- data/lib/kowl/templates/app/fields/gravatar_field.rb +10 -0
- data/lib/kowl/templates/app/fields/rich_text_area_field.rb +8 -0
- data/lib/kowl/templates/app/inputs/rich_text_area_input.rb +11 -0
- data/lib/kowl/templates/app/javascript/administrate/components/date_time_picker.js.tt +32 -0
- data/lib/kowl/templates/app/javascript/administrate/components/table.js.tt +49 -0
- data/lib/kowl/templates/app/javascript/administrate/index.js +3 -0
- data/lib/kowl/templates/app/javascript/packs/administrate.js.tt +21 -0
- data/lib/kowl/templates/app/javascript/packs/semantic.js +11 -0
- data/lib/kowl/templates/app/mailers/application_mailer.rb +7 -0
- data/lib/kowl/templates/app/mailers/devise_mailer.rb +5 -0
- data/lib/kowl/templates/app/models/login_activity.rb.tt +29 -0
- data/lib/kowl/templates/app/models/user.rb.tt +72 -0
- data/lib/kowl/templates/app/policies/application_policy.rb +38 -0
- data/lib/kowl/templates/app/policies/login_activity_policy.rb +35 -0
- data/lib/kowl/templates/app/policies/user_policy.rb +43 -0
- data/lib/kowl/templates/app/views/admin/templates/navigation.erb.tt +23 -0
- data/lib/kowl/templates/app/views/admin/views/application/_javascript.html.erb +21 -0
- data/lib/kowl/templates/app/views/admin/views/users/_collection.html.erb +102 -0
- data/lib/kowl/templates/app/views/admin/views/users/_form.html.erb +46 -0
- data/lib/kowl/templates/app/views/admin/views/users/edit.html.erb +36 -0
- data/lib/kowl/templates/app/views/admin/views/users/index.html.erb +66 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_form.html.erb +6 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_index.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/gravatar_field/_show.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_form.html.erb +6 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_index.html.erb +1 -0
- data/lib/kowl/templates/app/views/fields/rich_text_area_field/_show.html.erb +1 -0
- data/lib/kowl/templates/app/views/layouts/admin.html.erb.tt +47 -0
- data/lib/kowl/templates/app/views/layouts/devise_mailer.html.erb +14 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.erb +18 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.haml +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.slim +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.erb +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.haml +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/default.html.slim +0 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.erb +20 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.haml +17 -0
- data/lib/kowl/templates/app/views/pages/welcome/semantic.html.slim +17 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.erb.tt +5 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.haml.tt +3 -0
- data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.slim.tt +3 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.erb.tt +7 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.haml.tt +5 -0
- data/lib/kowl/templates/app/views/shared/footer/semantic.html.slim.tt +5 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.erb.tt +51 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.haml.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.slim.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.erb.tt +48 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.haml.tt +36 -0
- data/lib/kowl/templates/app/views/shared/navigation/semantic.html.slim.tt +36 -0
- data/lib/kowl/templates/app/workers/scheduler/pghero_scheduler.rb +11 -0
- data/lib/kowl/templates/config/autoprefixer.yml +4 -0
- data/lib/kowl/templates/config/db/mysql.yml.tt +43 -0
- data/lib/kowl/templates/config/db/oracle.yml.tt +29 -0
- data/lib/kowl/templates/config/db/postgresql.yml.tt +37 -0
- data/lib/kowl/templates/config/db/sqlite3.yml.tt +20 -0
- data/lib/kowl/templates/config/db/sqlserver.yml.tt +28 -0
- data/lib/kowl/templates/config/initializers/administrate.rb.tt +9 -0
- data/lib/kowl/templates/config/initializers/bullet.rb +21 -0
- data/lib/kowl/templates/config/initializers/devise-security.rb +44 -0
- data/lib/kowl/templates/config/initializers/devise_argon2.rb +29 -0
- data/lib/kowl/templates/config/initializers/faker.rb +6 -0
- data/lib/kowl/templates/config/initializers/generators.rb.tt +31 -0
- data/lib/kowl/templates/config/initializers/geocoder.rb +10 -0
- data/lib/kowl/templates/config/initializers/letter_opener.rb +13 -0
- data/lib/kowl/templates/config/initializers/lockbox.rb +11 -0
- data/lib/kowl/templates/config/initializers/logging.rb +6 -0
- data/lib/kowl/templates/config/initializers/lograge.rb +7 -0
- data/lib/kowl/templates/config/initializers/logstop.rb +4 -0
- data/lib/kowl/templates/config/initializers/middleware.rb +9 -0
- data/lib/kowl/templates/config/initializers/oj.rb +7 -0
- data/lib/kowl/templates/config/initializers/pagy.rb.tt +16 -0
- data/lib/kowl/templates/config/initializers/postmark.rb +8 -0
- data/lib/kowl/templates/config/initializers/rack_attack.rb.tt +71 -0
- data/lib/kowl/templates/config/initializers/sass.rb +5 -0
- data/lib/kowl/templates/config/initializers/sidekiq.rb +11 -0
- data/lib/kowl/templates/config/initializers/simpleform/semantic.rb +225 -0
- data/lib/kowl/templates/config/initializers/slim.rb +6 -0
- data/lib/kowl/templates/config/initializers/sparkpost.rb +13 -0
- data/lib/kowl/templates/config/routes.rb.tt +28 -0
- data/lib/kowl/templates/config/sidekiq.yml.tt +17 -0
- data/lib/kowl/templates/db/migrations/create_action_text_tables.action_text.rb.tt +16 -0
- data/lib/kowl/templates/db/migrations/create_active_storage_tables.active_storage.rb.tt +29 -0
- data/lib/kowl/templates/db/migrations/devise.rb.tt +59 -0
- data/lib/kowl/templates/db/migrations/login_activities.rb.tt +41 -0
- data/lib/kowl/templates/db/seeds.rb.tt +14 -0
- data/lib/kowl/templates/docker/Dockerfile.alpine.tt +92 -0
- data/lib/kowl/templates/docker/Dockerfile.debian.tt +133 -0
- data/lib/kowl/templates/docker/docker-compose.yml.tt +55 -0
- data/lib/kowl/templates/docker/mysql/Dockerfile.tt +15 -0
- data/lib/kowl/templates/dotfiles/Aptfile.tt +34 -0
- data/lib/kowl/templates/dotfiles/Brewfile.tt +49 -0
- data/lib/kowl/templates/dotfiles/Procfile.tt +12 -0
- data/lib/kowl/templates/dotfiles/codeclimate.yml +76 -0
- data/lib/kowl/templates/dotfiles/coffeelint.json +10 -0
- data/lib/kowl/templates/dotfiles/coffeelintignore +15 -0
- data/lib/kowl/templates/dotfiles/dockerignore +23 -0
- data/lib/kowl/templates/dotfiles/editorconfig +13 -0
- data/lib/kowl/templates/dotfiles/env.tt +58 -0
- data/lib/kowl/templates/dotfiles/erb-lint.yml +10 -0
- data/lib/kowl/templates/dotfiles/erdconfig.tt +24 -0
- data/lib/kowl/templates/dotfiles/eslintignore +20 -0
- data/lib/kowl/templates/dotfiles/eslintrc.js +31 -0
- data/lib/kowl/templates/dotfiles/fasterer.yml +14 -0
- data/lib/kowl/templates/dotfiles/foreman +1 -0
- data/lib/kowl/templates/dotfiles/gitattributes +15 -0
- data/lib/kowl/templates/dotfiles/gitignore +69 -0
- data/lib/kowl/templates/dotfiles/haml-lint.yml +23 -0
- data/lib/kowl/templates/dotfiles/jsbeautifyrc +15 -0
- data/lib/kowl/templates/dotfiles/jshintrc +3 -0
- data/lib/kowl/templates/dotfiles/mailmap +3 -0
- data/lib/kowl/templates/dotfiles/nvmrc +1 -0
- data/lib/kowl/templates/dotfiles/prettierignore +21 -0
- data/lib/kowl/templates/dotfiles/prettierrc.js +62 -0
- data/lib/kowl/templates/dotfiles/pryrc +7 -0
- data/lib/kowl/templates/dotfiles/rspec +3 -0
- data/lib/kowl/templates/dotfiles/rubocop.yml.tt +78 -0
- data/lib/kowl/templates/dotfiles/scss-lint.yml +132 -0
- data/lib/kowl/templates/dotfiles/simplecov +19 -0
- data/lib/kowl/templates/dotfiles/slim-lint.yml +23 -0
- data/lib/kowl/templates/dotfiles/slugignore +10 -0
- data/lib/kowl/templates/dotfiles/yamllint +7 -0
- data/lib/kowl/templates/dotfiles/yarnclean +46 -0
- data/lib/kowl/templates/lib/tasks/stats.rake +42 -0
- data/lib/kowl/templates/tests/factories/README.md +0 -0
- data/lib/kowl/templates/tests/factories/login_activity.rb +11 -0
- data/lib/kowl/templates/tests/factories/user.rb +11 -0
- data/lib/kowl/templates/tests/minitest/README.md +3 -0
- data/lib/kowl/templates/tests/minitest/application_system_test_case.rb +7 -0
- data/lib/kowl/templates/tests/minitest/controllers/pages_controller_test.rb +10 -0
- data/lib/kowl/templates/tests/minitest/models/login_activity_test.rb +8 -0
- data/lib/kowl/templates/tests/minitest/models/user_test.rb +15 -0
- data/lib/kowl/templates/tests/minitest/policies/login_activity_policy_test.rb +7 -0
- data/lib/kowl/templates/tests/minitest/policies/user_policy_test.rb +7 -0
- data/lib/kowl/templates/tests/minitest/support/capybara.rb +38 -0
- data/lib/kowl/templates/tests/minitest/support/database_cleaner.rb +20 -0
- data/lib/kowl/templates/tests/minitest/support/database_cleaner_support.rb +15 -0
- data/lib/kowl/templates/tests/minitest/support/deferred_garbage_collection.rb +21 -0
- data/lib/kowl/templates/tests/minitest/support/devise.rb +16 -0
- data/lib/kowl/templates/tests/minitest/support/factories.rb +6 -0
- data/lib/kowl/templates/tests/minitest/support/formulaic.rb +8 -0
- data/lib/kowl/templates/tests/minitest/support/helpers/devise_helper.rb +57 -0
- data/lib/kowl/templates/tests/minitest/support/papertrail.rb +17 -0
- data/lib/kowl/templates/tests/minitest/support/pundit.rb +0 -0
- data/lib/kowl/templates/tests/minitest/support/shoulda.rb +11 -0
- data/lib/kowl/templates/tests/minitest/support/simplecov.rb +8 -0
- data/lib/kowl/templates/tests/minitest/test_helper.rb +17 -0
- data/lib/kowl/templates/tests/rspec/README.md +9 -0
- data/lib/kowl/templates/tests/rspec/controllers/admin/application_controller_spec.rb +12 -0
- data/lib/kowl/templates/tests/rspec/controllers/admin/users_controller_spec.rb +14 -0
- data/lib/kowl/templates/tests/rspec/controllers/pages_controller_spec.rb +10 -0
- data/lib/kowl/templates/tests/rspec/features/README.md +15 -0
- data/lib/kowl/templates/tests/rspec/features/visitor_sign_up_spec.rb +25 -0
- data/lib/kowl/templates/tests/rspec/helpers/application_helper_spec.rb +7 -0
- data/lib/kowl/templates/tests/rspec/helpers/pages_helper_spec.rb +15 -0
- data/lib/kowl/templates/tests/rspec/models/login_activity_spec.rb +11 -0
- data/lib/kowl/templates/tests/rspec/models/user_spec.rb +21 -0
- data/lib/kowl/templates/tests/rspec/policies/login_activity_policy_spec.rb +59 -0
- data/lib/kowl/templates/tests/rspec/policies/user_policy_spec.rb +56 -0
- data/lib/kowl/templates/tests/rspec/rails_helper.rb +72 -0
- data/lib/kowl/templates/tests/rspec/requests/pages_spec.rb +11 -0
- data/lib/kowl/templates/tests/rspec/spec_helper.rb +96 -0
- data/lib/kowl/templates/tests/rspec/support/bullet.rb +17 -0
- data/lib/kowl/templates/tests/rspec/support/capybara.rb +37 -0
- data/lib/kowl/templates/tests/rspec/support/controller_testing.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/database_cleaner.rb +55 -0
- data/lib/kowl/templates/tests/rspec/support/deferred_garbage_collection.rb +32 -0
- data/lib/kowl/templates/tests/rspec/support/devise.rb +21 -0
- data/lib/kowl/templates/tests/rspec/support/factories.rb +5 -0
- data/lib/kowl/templates/tests/rspec/support/formulaic.rb +8 -0
- data/lib/kowl/templates/tests/rspec/support/helpers/devise_helpers.rb +56 -0
- data/lib/kowl/templates/tests/rspec/support/papertrail.rb +5 -0
- data/lib/kowl/templates/tests/rspec/support/pi_ci.rb +6 -0
- data/lib/kowl/templates/tests/rspec/support/pundit.rb +6 -0
- data/lib/kowl/templates/tests/rspec/support/shoulda.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/sidekiq.rb +10 -0
- data/lib/kowl/templates/tests/rspec/support/simplecov.rb +7 -0
- data/lib/kowl/templates/tests/rspec/support/warden.rb +8 -0
- data/lib/kowl/templates/text_files/AUTHORS.md +4 -0
- data/lib/kowl/templates/text_files/CHANGELOG.md.tt +12 -0
- data/lib/kowl/templates/text_files/CODE_OF_CONDUCT.md +76 -0
- data/lib/kowl/templates/text_files/TODO.md +7 -0
- data/lib/kowl/templates/text_files/VERSION +1 -0
- data/lib/kowl/templates/text_files/humans.txt.tt +15 -0
- data/lib/kowl/templates/text_files/robots.txt.tt +6 -0
- data/lib/kowl/templates/text_files/security.txt +6 -0
- data/lib/kowl/version.rb +9 -0
- data/lib/kowl.rb +18 -0
- 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
|