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,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module Kowl
|
7
|
+
class ViewsAndHelpersGenerator < Kowl::Generators::Base
|
8
|
+
hide!
|
9
|
+
source_root File.expand_path(File.join('..', 'templates', 'app', 'views'), File.dirname(__FILE__))
|
10
|
+
class_option :framework, type: :string, default: 'bootstrap'
|
11
|
+
class_option :skip_pagination, type: :boolean, default: false
|
12
|
+
class_option :simpleform, type: :boolean, default: false
|
13
|
+
class_option :skip_javascript, type: :boolean, default: false
|
14
|
+
class_option :skip_turbolinks, type: :boolean, default: false
|
15
|
+
class_option :template_engine, type: :string, default: 'erb'
|
16
|
+
class_option :noauth, type: :boolean, default: false
|
17
|
+
|
18
|
+
# Generate templates with framework and templae_engine with required application options
|
19
|
+
def generate_templates
|
20
|
+
# Generate views using bootstrap and semanic view generators
|
21
|
+
gen_tags = []
|
22
|
+
gen_tags.push("--template-engine=#{options[:template_engine]}")
|
23
|
+
gen_tags.push('--simpleform') if options[:simpleform]
|
24
|
+
gen_tags.push('--pagination') unless options[:skip_pagination]
|
25
|
+
gen_tags.push('--devise') unless options[:noauth]
|
26
|
+
gen_tags.push('--skip_javascript') if options[:skip_javascript]
|
27
|
+
gen_tags.push('--skip_turbolinks') if options[:skip_turbolinks]
|
28
|
+
gen_tags.push('--metatags')
|
29
|
+
gen_tags.push('--layout')
|
30
|
+
generate("#{options[:framework]}:install #{gen_tags.join(' ')}") if %w[bootstrap semantic].include? options[:framework]
|
31
|
+
end
|
32
|
+
|
33
|
+
# If template engine isn't set for erb remove application.erb
|
34
|
+
def remove_application_layout
|
35
|
+
remove_file 'app/views/layouts/application.html.erb' if %w[slim haml].include? options[:template_engine]
|
36
|
+
end
|
37
|
+
|
38
|
+
# Inject navigation header into application layout file based on template_engine/framework
|
39
|
+
def inject_header_into_layout
|
40
|
+
# prefix, includes, postfix
|
41
|
+
# Pre and Postfix is determined if the template engine is ERB, Slim, or HAML
|
42
|
+
nav_str = "#{template_prefix}= render 'shared/navigation'#{template_postfix}\n"
|
43
|
+
match = { 'erb' => /\s\<body\>\n/,
|
44
|
+
'haml' => /\s%body\n/,
|
45
|
+
'slim' => /\sbody\n/ }
|
46
|
+
insert_into_file "app/views/layouts/application.html.#{options[:template_engine]}", optimize_indentation(nav_str, 4), after: match[options[:template_engine]]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Generate an application navigation view based on framework/template_engine
|
50
|
+
def copy_navigation
|
51
|
+
template("shared/navigation/#{options[:framework]}.html.#{options[:template_engine]}.tt", "app/views/shared/_navigation.html.#{options[:template_engine]}") if %w[bootstrap semantic].include? options[:framework]
|
52
|
+
end
|
53
|
+
|
54
|
+
# Generate an application footer view based on framework/template_engine
|
55
|
+
def copy_footer
|
56
|
+
template("shared/footer/#{options[:framework]}.html.#{options[:template_engine]}.tt", "app/views/shared/_footer.html.#{options[:template_engine]}") if %w[bootstrap semantic].include? options[:framework]
|
57
|
+
end
|
58
|
+
|
59
|
+
# Inject view template partial into application layout
|
60
|
+
def inject_footer_into_layout
|
61
|
+
footer_str = "#{template_prefix}= render 'shared/footer'#{template_postfix}\n"
|
62
|
+
if options[:template_engine] == 'erb'
|
63
|
+
insert_into_file 'app/views/layouts/application.html.erb', optimize_indentation(footer_str, 4), before: " </body>\n"
|
64
|
+
else
|
65
|
+
append_to_file "app/views/layouts/application.html.#{options[:template_engine]}", optimize_indentation(footer_str, 4)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Skip a flash type if the key is a cookie/session timeone, since this can occure so regularly
|
70
|
+
def update_application_helpers
|
71
|
+
flash_str = <<~STR
|
72
|
+
\n# remove any blank devise timeout errors
|
73
|
+
flash.delete(:timedout)
|
74
|
+
STR
|
75
|
+
|
76
|
+
# User to prevent blank devise timeout error from flashing up
|
77
|
+
insert_into_file 'app/helpers/application_helper.rb', "\n#{optimize_indentation(flash_str.strip, 4)}", after: "return '' unless flash.any?\n" if options[:framework] == 'bootstrap'
|
78
|
+
|
79
|
+
# Make applicaction_helper immutable
|
80
|
+
insert_into_file 'app/helpers/application_helper.rb', "# frozen_string_literal: true\n\n", before: "module ApplicationHelper\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Returns the application erb ruby tag prefix based on the views template_engine
|
86
|
+
def template_prefix
|
87
|
+
return '' unless options[:template_engine] == 'erb'
|
88
|
+
|
89
|
+
'<%'
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns the application erb ruby tag postfix based on the views template_engine
|
93
|
+
def template_postfix
|
94
|
+
return '' unless options[:template_engine] == 'erb'
|
95
|
+
|
96
|
+
' %>'
|
97
|
+
end
|
98
|
+
|
99
|
+
# Check to see if the current application will be using erb or not
|
100
|
+
def using_erb?
|
101
|
+
options[:template_engine] == 'erb'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/kowl/geodb.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# https://github.com/gitcoinco/code_fund_ads/blob/b87cc931f167dadc96904cec8d653d76bc55b021/app/jobs/download_and_extract_maxmind_file_job.rb
|
4
|
+
# https://cobwwweb.com/download-collection-of-images-from-url-using-ruby
|
5
|
+
require 'net/http'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'zlib'
|
8
|
+
require 'rubygems/package'
|
9
|
+
|
10
|
+
# Used for fetching the GeoLite db from maxmind
|
11
|
+
class GeoDB
|
12
|
+
GEOLITE_URL = 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz'
|
13
|
+
|
14
|
+
# Begin creating folders and being downloadding the GeoLite db
|
15
|
+
# @param path [String] the applications relative path
|
16
|
+
# @return [Boolean] if the GeoLite2 database was successfully downloaded and decompressed
|
17
|
+
def self.perform(path)
|
18
|
+
const_set('GEOLIB_DIR', File.join(path, 'db/maxmind'))
|
19
|
+
const_set('GEOLIB_PATH', File.join(GEOLIB_DIR, 'GeoLite2-City.tar.gz'))
|
20
|
+
|
21
|
+
FileUtils.mkdir_p GEOLIB_DIR
|
22
|
+
download
|
23
|
+
extract
|
24
|
+
rescue => e
|
25
|
+
puts "Error while setting up GeoLite DB - #{e.message}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Download the file from the GEOLITE url
|
29
|
+
# @return [Boolean] returns if the the file was succcessfully downloaded
|
30
|
+
def self.download
|
31
|
+
FileUtils.rm_f GEOLIB_PATH
|
32
|
+
res = Net::HTTP.get_response(URI.parse(GEOLITE_URL))
|
33
|
+
File.open(GEOLIB_PATH, 'wb') do |f|
|
34
|
+
f.write(res.body)
|
35
|
+
end
|
36
|
+
rescue => e
|
37
|
+
puts 'GeoLite2 database could not be downloaded at this time.'
|
38
|
+
puts e.message if e.message
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Extract the GEOLIB tar.gz file into the application
|
44
|
+
# @return [Boolean] if the file was sucessfully decompressed
|
45
|
+
def self.extract
|
46
|
+
untar(unzip(GEOLIB_PATH))
|
47
|
+
end
|
48
|
+
|
49
|
+
# Uncompress the zipfile
|
50
|
+
# https://www.rubydoc.info/gems/folio/0.4.0/ZipUtils.ungzip
|
51
|
+
# @param file [String] the specific file path/name
|
52
|
+
# @param options [Hash] any specific options required for decompressing the file [:dryrun] || [:noop]
|
53
|
+
# @return [Boolean] if the File was sucessfully decompressed
|
54
|
+
def self.unzip(file, options = {})
|
55
|
+
# Decompress the file to the specified location
|
56
|
+
fname = File.join(GEOLIB_DIR, File.basename(file).chomp(File.extname(file)))
|
57
|
+
# Remove unzipped file if it already exists for any reason
|
58
|
+
FileUtils.rm_f fname
|
59
|
+
Zlib::GzipReader.open(file) do |gz|
|
60
|
+
File.open(fname, 'wb'){ |f| f << gz.read }
|
61
|
+
end unless options[:dryrun] || options[:noop]
|
62
|
+
FileUtils.rm_f GEOLIB_PATH
|
63
|
+
File.expand_path(fname)
|
64
|
+
rescue => e
|
65
|
+
puts "Error occured while extracting the geolite database #{e}"
|
66
|
+
end
|
67
|
+
|
68
|
+
# Untar the specified file
|
69
|
+
# @param tarred_path [String] the specific filename/path for the tar file
|
70
|
+
# @return [Boolean] if the file was successfully decompressed
|
71
|
+
def self.untar(tarred_path)
|
72
|
+
Gem::Package::TarReader.new File.open(tarred_path) do |tar|
|
73
|
+
tar.each do |tarfile|
|
74
|
+
next if tarfile.directory?
|
75
|
+
|
76
|
+
destination = db_destinsation(tarfile.full_name)
|
77
|
+
FileUtils.mkdir_p File.dirname(destination)
|
78
|
+
File.open destination, 'wb' do |f|
|
79
|
+
f.print tarfile.read
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
FileUtils.rm_rf tarred_path
|
84
|
+
rescue => e
|
85
|
+
puts "And error occurred while decompressing the database: #{e}"
|
86
|
+
end
|
87
|
+
|
88
|
+
# The destination of where the tarfile is loaded
|
89
|
+
# @param file [String] the specific geolite database file locattion
|
90
|
+
# @return [String] to the GEOLIB database file
|
91
|
+
def self.db_destinsation(file)
|
92
|
+
file_arr = file.split('/')
|
93
|
+
file = (file_arr.count > 1 ? file_arr.last : file_arr)
|
94
|
+
File.join(GEOLIB_DIR, file)
|
95
|
+
end
|
96
|
+
end
|
data/lib/kowl/helpers.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
##################################################
|
4
|
+
# Helper methods used to assist through the template building
|
5
|
+
# => similar to the functions used in Rails::Generators::AppBase
|
6
|
+
##################################################
|
7
|
+
|
8
|
+
# Method required when processing the gemfile
|
9
|
+
# - https://raw.githubusercontent.com/liukun-lk/rails_start_template/master/template.rb
|
10
|
+
# - https://github.com/manuelvanrijn/rails-template/blob/master/template.rb
|
11
|
+
# @param name [String] Specific gem you are wanting to check the requirements for
|
12
|
+
def gemfile_requirement(name)
|
13
|
+
@original_gemfile ||= IO.read('Gemfile')
|
14
|
+
req = @original_gemfile[/gem\s+['"]#{name}['"]\s*(,[><~= \t\d\.\w'"]*)?.*$/, 1]
|
15
|
+
req && req.tr("'", %(")).strip.sub(/^,\s*"/, ', "')
|
16
|
+
end
|
17
|
+
|
18
|
+
# Determine which gem will be used for the projects CSS framework
|
19
|
+
# @param css_framework [String] Which CSSFramework the developer wants to use with the application
|
20
|
+
# @return [String] The specific gem that will be used for the applications CSS framework
|
21
|
+
def template_engine_gem_str(css_framework = '')
|
22
|
+
case css_framework.to_s
|
23
|
+
when 'semantic'
|
24
|
+
'semantic_ui'
|
25
|
+
else
|
26
|
+
'bootstrap'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/app/templates/Gemfile.tt#L9
|
31
|
+
# Add a gem to the Gemfile
|
32
|
+
# @param gem [String] Specfic gem name that you want to add to the gemfile
|
33
|
+
# @return [String] Returns the gem entry for the gemfile
|
34
|
+
def gem_to_gemfile(gem)
|
35
|
+
gem_str = <<~GEM
|
36
|
+
#{gem.comment ? "# #{gem.comment}" : ''}
|
37
|
+
#{(gem.commented_out ? '#' : '')}gem '#{gem.name}'#{gem_version_str(gem)}#{gem_options(gem)}
|
38
|
+
GEM
|
39
|
+
|
40
|
+
gem_str.strip
|
41
|
+
end
|
42
|
+
|
43
|
+
# If the gem requires a specific version, determine it
|
44
|
+
# @param gem [String] - To determine if the specified gems requires a specific version to run with the application
|
45
|
+
# @return [String] - If the gem require a specific version, it will return that version entry for the gemfile
|
46
|
+
def gem_version_str(gem)
|
47
|
+
return '' unless gem.version
|
48
|
+
|
49
|
+
# "#{gem.version ? ", '#{gem.version}'" : ''}"
|
50
|
+
", '#{gem.version}'"
|
51
|
+
end
|
52
|
+
|
53
|
+
# If the requested gem requires additional options (ie: require: false) return this
|
54
|
+
# @param gem [String] The specified gem you want to use
|
55
|
+
# @return [String] If the gem requires additional opotions in the gemfile, return these as a string
|
56
|
+
def gem_options(gem)
|
57
|
+
return '' unless gem.options.any?
|
58
|
+
|
59
|
+
options_str = gem.options.map { |k, v| "#{k}: #{v.inspect}" }.join(', ')
|
60
|
+
", #{options_str}" unless options_str.blank?
|
61
|
+
end
|
62
|
+
|
63
|
+
# Make a directory in the applications directory path
|
64
|
+
# @param dir [String] The name of the directory you want to create
|
65
|
+
def mk_appdir(dir)
|
66
|
+
path = Rails.root.join(dir)
|
67
|
+
FileUtils.mkdir(path) unless File.directory?(path)
|
68
|
+
end
|
69
|
+
|
70
|
+
# If you want all lines of the string to be indented a specific amount
|
71
|
+
# @param str [String] - The multiline string in which you want to indent
|
72
|
+
# @return [String] - An indented version of thee string that was passed to the function
|
73
|
+
def indent_all_lines(str, spaces = 2)
|
74
|
+
return '' if str.nil? || str.blank?
|
75
|
+
|
76
|
+
str.strip.split(/\n/).map { |line| optimize_indentation(line, spaces.to_i) }.join('')
|
77
|
+
end
|
78
|
+
|
79
|
+
# Used to add additional assets to be considered when compiling your assets
|
80
|
+
# @param str [String] Asset string file to add to the file, ie: `application-mailer.scss`
|
81
|
+
def add_to_assets(asset_str)
|
82
|
+
append_to_file('config/initializers/assets.rb', "Rails.application.config.assets.precompile += %w( #{asset_str} )\n") unless asset_str.blank?
|
83
|
+
end
|
84
|
+
|
85
|
+
# Add a specific line to the config/routes.rb file
|
86
|
+
# @param route_str [String] The specific route you want to add to the applications route file
|
87
|
+
def add_to_routes(route_str = '')
|
88
|
+
inject_into_file('config/routes.rb', optimize_indentation("#{route_str.strip}\n", 2), after: "\s# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html\n")
|
89
|
+
end
|
90
|
+
|
91
|
+
##################################################
|
92
|
+
# Used to create highlights when running `kowl -h` (usage summary displayed by the binstub)
|
93
|
+
##################################################
|
94
|
+
|
95
|
+
# Highlight the specific string
|
96
|
+
# @param str [String] The string in which you wish to highlight
|
97
|
+
# @return [String] The specified string concatenated between terminal encoded character sequences
|
98
|
+
def highlight(str = '')
|
99
|
+
return '' if str.blank?
|
100
|
+
|
101
|
+
str = str.split('=')
|
102
|
+
str.count > 1 ? "\e[32m#{str[0]}=\e[33m#{str[1]}\e[0m" : "\e[32m#{str[0]}\e[0m"
|
103
|
+
end
|
104
|
+
|
105
|
+
# Highlight the default values for specified flag
|
106
|
+
# @param str [String] The default values for the specified parameter
|
107
|
+
# @return [String] the specified text string surrounded by terminal string highlights
|
108
|
+
def dh(str = '')
|
109
|
+
return '' if str.blank?
|
110
|
+
|
111
|
+
str = str.split(': ')
|
112
|
+
str.count > 1 ? "\e[36m#{str[0]}: \e[31m#{str[1]}\e[0m" : "\e[34m#{str[0]}\e[0m"
|
113
|
+
end
|
114
|
+
|
115
|
+
# Used to create and return the .env file database configuration for the specific environment
|
116
|
+
# @param database [String] the database adapater in which the application will be connecting to
|
117
|
+
# @param env [String] the environment which the env file is bring created for
|
118
|
+
# @return [String] a list of database parameters for the specific database connection
|
119
|
+
def dotfile_databases(database, env)
|
120
|
+
return '' if database == 'sqlite3'
|
121
|
+
|
122
|
+
db = { username: "DB_USER=appUser123\n",
|
123
|
+
password: "DB_PASSWORD=App($)Password\n",
|
124
|
+
sid: '',
|
125
|
+
host: '' }
|
126
|
+
|
127
|
+
case database
|
128
|
+
when 'oracle'
|
129
|
+
db = { username: "DB_USER=system\n",
|
130
|
+
password: "DB_PASSWORD=oracle\n",
|
131
|
+
sid: "DB_SID=xe\n" }
|
132
|
+
when 'sqlserver'
|
133
|
+
db[:username] = "DB_USER=SA\n"
|
134
|
+
db[:password] = "DB_PASSWORD=yourStrong(!)Password\n"
|
135
|
+
end
|
136
|
+
db[:host] = "DB_HOST=localhost\n" unless env == 'docker'
|
137
|
+
|
138
|
+
"#{db[:username]}#{db[:password]}#{db[:host]}#{db[:sid]}"
|
139
|
+
end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
5
|
+
|
6
|
+
# ruby '<%= RUBY_VERSION %>'
|
7
|
+
gem 'rails', '<%= Kowl::RAILS_VERSION %>'
|
8
|
+
gem 'puma', '~> 4.3' # Use Puma as the applications web server
|
9
|
+
# gem 'iodine', '~> 0.7' # An extremely fast and concurrent Application Server (works well with websockets)
|
10
|
+
# gem 'falcon' # A high-performance web server for Ruby, supporting HTTP/1, HTTP/2 and TLS
|
11
|
+
# Falon => https://www.codeotaku.com/journal/2019-02/falcon-early-hints/index
|
12
|
+
gem 'rack', '~> 2.2'
|
13
|
+
|
14
|
+
# Gems required for running rails with RUBY_VERSION >= 2.7
|
15
|
+
if RUBY_VERSION >= '2.7'
|
16
|
+
gem 'e2mmap'
|
17
|
+
gem 'thwait'
|
18
|
+
end
|
19
|
+
|
20
|
+
##############################
|
21
|
+
### Database
|
22
|
+
##############################
|
23
|
+
<%- if options[:database] != 'sqlite3' -%>
|
24
|
+
<% if options[:database] == 'oracle' -%>
|
25
|
+
gem 'ruby-oci8' #, github: 'kubo/ruby-oci8', platforms: :ruby # only for CRuby users
|
26
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 6.0.0'
|
27
|
+
<% elsif options[:database] == 'sqlserver' -%>gem 'activerecord-sqlserver-adapter', github: 'rails-sqlserver/activerecord-sqlserver-adapter', branch: '6-0-dev'
|
28
|
+
<% elsif database_gemfile_entry -%>
|
29
|
+
<%= indent_all_lines(gem_to_gemfile(database_gemfile_entry)) -%>
|
30
|
+
<% end -%>
|
31
|
+
<% end -%>
|
32
|
+
<%- if options[:database] == 'postgresql' -%>
|
33
|
+
gem 'pghero', '>= 2.4' # https://github.com/ankane/pghero/blob/master/guides/Rails.md
|
34
|
+
gem 'pg_query' # Used by pghero to suggest recommended indexes
|
35
|
+
<% end -%>
|
36
|
+
gem 'sqlite3'<%= gemfile_requirement('sqlite3') %>
|
37
|
+
gem 'strong_migrations' # Catch unsafe migrations
|
38
|
+
<%- unless options[:skip_erd] -%>
|
39
|
+
gem 'rails-erd', group: :development # Generate an application ERD
|
40
|
+
<%- end -%>
|
41
|
+
|
42
|
+
##############################
|
43
|
+
### Assets
|
44
|
+
##############################
|
45
|
+
gem 'autoprefixer-rails' # add vendor prefixes to particular css properties
|
46
|
+
gem 'font-awesome-sass'
|
47
|
+
<%- if options[:framework] == 'bootstrap' -%>
|
48
|
+
gem 'bootstrap', '~> 4.4'
|
49
|
+
<% elsif options[:framework] == 'semantic' -%>
|
50
|
+
gem 'semantic-ui-sass'#, github: 'doabit/semantic-ui-sass'
|
51
|
+
<%- end -%>
|
52
|
+
gem 'sass-rails', '~> 6.0' # Libsass for rails pipeline (fast sass-rails replacement)
|
53
|
+
<%- unless options[:skip_turbolinks] -%>
|
54
|
+
gem 'turbolinks'<%= gemfile_requirement('turbolinks') %> # turbolinks for browsing your application faster
|
55
|
+
<%- end -%>
|
56
|
+
<%- if %w[bootstrap semantic].include? options[:framework] -%>
|
57
|
+
gem '<%= template_engine_gem_str(options[:framework]) %>_views_generator', group: :development
|
58
|
+
<%- end -%>
|
59
|
+
<%- unless options[:skip_javascript] -%>
|
60
|
+
gem 'webpacker', '~> <%= Kowl::WEBPACKER_VERSION %>'
|
61
|
+
<%- end -%>
|
62
|
+
|
63
|
+
##############################
|
64
|
+
# ActionText/ActiveStorage
|
65
|
+
# Used because some gems such as administate still have assets build into the gem
|
66
|
+
##############################
|
67
|
+
gem 'image_processing' # Used for processing ActionStorage uploads with imagemagick and/or vip
|
68
|
+
# gem 'active_storage_validations' # Used for validating active storage uploads
|
69
|
+
|
70
|
+
<%- unless options[:noauth] -%>
|
71
|
+
##############################
|
72
|
+
# Admin/Dashboard
|
73
|
+
##############################
|
74
|
+
gem 'administrate', github: 'thoughtbot/administrate' # Admin dashboard
|
75
|
+
|
76
|
+
##############################
|
77
|
+
# Authorization, Authentication [Roles], and permissions
|
78
|
+
##############################
|
79
|
+
gem 'argon2', '>= 2' # https://ankane.org/devise-argon2
|
80
|
+
gem 'authtrail' # For tracking devise login activity
|
81
|
+
gem 'devise', github: 'plataformatec/devise' # Rails based user authentication
|
82
|
+
gem 'devise-security' # Additional security measures for devise
|
83
|
+
gem 'valid_email2' # Stronger email validator (Includes RFC, blackist, and whitelist validations)
|
84
|
+
gem 'pretender' # Allows superusers to emulate being another user
|
85
|
+
gem 'pundit' # A slim user authorization library
|
86
|
+
gem 'maxminddb' # Used by AuthTrail, used to prevent geocoder from making remote API Requests to geocoder service
|
87
|
+
|
88
|
+
# Additional devise plugins to consider
|
89
|
+
# gem 'devise-i18n' # For i18n translation support
|
90
|
+
# gem 'devise_invalidatable`, github: 'madkins/devise_invalidatable'
|
91
|
+
# gem 'devise-uncommon_password', github: 'HCLarsen/devise-uncommon_password'
|
92
|
+
# -> Avatars
|
93
|
+
# gem 'gravatar_image_tag'
|
94
|
+
# gem 'letter_avatar', github: 'ksz2k/letter_avatar'
|
95
|
+
# -> User Profile data
|
96
|
+
# gem 'name_of_person' # Official bootcamp gem for presenting user names
|
97
|
+
<%- end -%>
|
98
|
+
|
99
|
+
<%- unless options[:skip_sidekiq] -%>
|
100
|
+
##############################
|
101
|
+
# Background jobs and Redis
|
102
|
+
##############################
|
103
|
+
gem 'hiredis' # C based adapter for connecting to redis
|
104
|
+
gem 'sidekiq', '>= 6.0' # For scheduling background jobs
|
105
|
+
gem 'sidekiq-failures' # Shows you a list of failed sidekiq jobs
|
106
|
+
gem 'sidekiq-scheduler' # Lightweight job scheduler (mimicks cron scheduling)
|
107
|
+
gem 'sidekiq-status' # View the status of any currently running sidekiq jobs
|
108
|
+
# gem 'sidekiq-bulk' # Easy bulk processing
|
109
|
+
# gem 'sidekiq-unique-jobs' # Ensures only unique jobs are being ran at any given time
|
110
|
+
<%- end -%>
|
111
|
+
|
112
|
+
<%- unless options[:skip_mailer] -%>
|
113
|
+
##############################
|
114
|
+
# Mailers
|
115
|
+
##############################
|
116
|
+
gem 'bootstrap-email'
|
117
|
+
<%= mailer_gems(options[:mailer]) %>, group: :production
|
118
|
+
group :development do
|
119
|
+
gem 'letter_opener'
|
120
|
+
gem 'letter_opener_web', '~> 1.0'
|
121
|
+
end
|
122
|
+
<%- end -%>
|
123
|
+
|
124
|
+
|
125
|
+
##############################
|
126
|
+
# Misc
|
127
|
+
##############################
|
128
|
+
gem 'auto_strip_attributes', '~> 2.5' # Reduce needing to add before_validation hooks to the models to cleanup attributes
|
129
|
+
gem 'fast_jsonapi', github: 'fast-jsonapi/fast_jsonapi' # A lightening fast json serializer
|
130
|
+
gem 'jbuilder'<%= gemfile_requirement('jbuilder') %> # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
131
|
+
gem 'meta-tags' # Used for adding dynamic titles when switching between pages.
|
132
|
+
gem 'oj' # For faster json generating and parsing
|
133
|
+
<% if options[:simpleform] -%>
|
134
|
+
gem 'simple_form', '~> 5.0' # A DSL to make forms easier to work with
|
135
|
+
<% end -%>
|
136
|
+
<% unless options[:skip_pagination] -%>
|
137
|
+
gem 'pagy', '~> 3.7' # An extremely fast pagination alternative
|
138
|
+
<% end -%>
|
139
|
+
<%- unless options[:template_engine].to_s == 'erb' -%>
|
140
|
+
gem '<%= options[:template_engine] %>-rails'
|
141
|
+
<%- end -%>
|
142
|
+
|
143
|
+
##############################
|
144
|
+
### Performance Optimizations
|
145
|
+
##############################
|
146
|
+
gem 'attendance' # Speed up for ActiveRecord#present? (removes additional query requests)
|
147
|
+
gem 'bootsnap', require: false # Reduces boot times through caching
|
148
|
+
gem 'fast_blank', platform: :mri # fast implementation of .blank?
|
149
|
+
|
150
|
+
##############################
|
151
|
+
### Responses, Errors, and Security
|
152
|
+
##############################
|
153
|
+
gem 'dotenv-rails', groups: [:development, :test]
|
154
|
+
gem 'rack-attack' # Rack middleware for blocking & throttling
|
155
|
+
# gem 'rack-protection', github: 'https://github.com/sinatra/sinatra/tree/master/rack-protection'
|
156
|
+
# gem 'secure_headers' # Manages application of security headers with many safe defaults
|
157
|
+
gem 'slowpoke' # Utilize Rack::Timeout to kill long running requests
|
158
|
+
|
159
|
+
##############################
|
160
|
+
### Security (Data Security)
|
161
|
+
##############################
|
162
|
+
<%- if options[:encrypt] %>
|
163
|
+
gem 'blind_index' # Securely search encrypted database fields
|
164
|
+
gem 'lockbox' # Modern encryption for Rails (For encrypting sensitive information within the database)
|
165
|
+
gem 'rbnacl' # Ruby binding for libsodium
|
166
|
+
<%- end -%>
|
167
|
+
gem 'lograge' # For cleaning up your application logs
|
168
|
+
gem 'logstop' # Keep personally identifiable information (PII) out of your logs
|
169
|
+
# gem 'honeybadger' # For Exception logging (logs the applications backtrace)
|
170
|
+
|
171
|
+
##############################
|
172
|
+
### Structure [Presentors, Decorators, etc.]
|
173
|
+
##############################
|
174
|
+
gem 'active_decorator'
|
175
|
+
|
176
|
+
##############################
|
177
|
+
### Development/Testing gems
|
178
|
+
##############################
|
179
|
+
group :development, :test do
|
180
|
+
gem 'brakeman'
|
181
|
+
gem 'bundler-audit', github: 'rubysec/bundler-audit'
|
182
|
+
gem 'byebug', platforms: %i[mri mingw x64_mingw]
|
183
|
+
<%- unless options[:test_engine] == 'none' -%>
|
184
|
+
gem 'factory_bot_rails' # For building objects associated with your models
|
185
|
+
gem 'faker' # for generating sample data
|
186
|
+
<%- end -%>
|
187
|
+
<%= pry_gems(options[:skip_pry]) -%>
|
188
|
+
|
189
|
+
# --- Linters (Asset testing, Static Code Analyzers)
|
190
|
+
# gem 'inquisition', github: 'rubygarage/inquisition'
|
191
|
+
<%= template_linter_gems(options[:template_engine]) %>
|
192
|
+
gem 'scss_lint', require: false
|
193
|
+
gem 'rails_best_practices' # for testing for rails best practice methods
|
194
|
+
gem 'rubocop', require: false # github: 'rubocop-hq/rubocop'
|
195
|
+
gem 'rubocop-performance', '~> 1.5', require: false
|
196
|
+
gem 'rubocop-rails', '~> 2.3', require: false
|
197
|
+
<%= robocop_test_engine(options[:test_engine], options[:skip_tests]) %>
|
198
|
+
# gem 'rubycritic', require: false # Code Quality analyzer
|
199
|
+
end
|
200
|
+
|
201
|
+
group :development do
|
202
|
+
gem 'annotate'
|
203
|
+
gem 'better_errors' # dev: better error messages
|
204
|
+
# gem 'binding_of_caller'
|
205
|
+
gem 'bullet' # For logging all unnecessary N+1 queries and unused eager_loaded associations
|
206
|
+
gem 'listen'<%= gemfile_requirement('listen') %>
|
207
|
+
<%- unless options[:skip_spring] -%>
|
208
|
+
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
209
|
+
gem 'spring'
|
210
|
+
gem 'spring-watcher-listen'<%= gemfile_requirement('spring-watcher-listen') %>
|
211
|
+
<%- end -%>
|
212
|
+
gem 'web-console'<%= gemfile_requirement('web-console') %>
|
213
|
+
end
|
214
|
+
|
215
|
+
<%- unless options[:test_engine] == 'none' || options[:skip_tests] -%>
|
216
|
+
group :test do
|
217
|
+
gem 'database_cleaner' # For flushing the database between tests
|
218
|
+
<%- if options[:test_engine] == 'minitest' -%>
|
219
|
+
gem 'minitest'
|
220
|
+
gem 'minitest-reporters' # used to enhance basic minitest capibilities
|
221
|
+
<%- elsif options[:test_engine] == 'rspec' -%>
|
222
|
+
gem 'cucumber-rails', require: false
|
223
|
+
gem 'formulaic' # For generating form based test submissions
|
224
|
+
gem 'fuubar' # RSpec progress bar
|
225
|
+
# gem 'parallel_tests' # needs to be ran against a database other than sqlite3
|
226
|
+
gem 'pig-ci-rails' # For displaying application memory metrics while running tests
|
227
|
+
<%- unless options[:noauth] -%>
|
228
|
+
gem 'pundit-matchers' # RSpec matchers for testing Pundit authorization policies
|
229
|
+
<%- end -%>
|
230
|
+
gem 'rspec-rails', '>= 3.9'
|
231
|
+
<%- unless options[:skip_sidekiq] -%>
|
232
|
+
gem 'rspec-sidekiq'
|
233
|
+
<%- end -%>
|
234
|
+
<%- end -%>
|
235
|
+
gem 'rails-controller-testing' # , github: 'rails/rails-controller-testing'
|
236
|
+
gem 'simplecov' # generate html report on the applications test results
|
237
|
+
gem 'shoulda' # Write easy to understand and maintainable tests
|
238
|
+
gem 'test-prof' # For profiling tests, rspec, and factories
|
239
|
+
gem 'timecop' # For time based testing (time travel)
|
240
|
+
|
241
|
+
##############################
|
242
|
+
### integration testing
|
243
|
+
##############################
|
244
|
+
# Adds support for Capybara system testing and selenium driver
|
245
|
+
gem 'capybara'<%= gemfile_requirement('capybara') %>
|
246
|
+
gem 'selenium-webdriver'
|
247
|
+
gem 'webdrivers', '~> 4.0'
|
248
|
+
end
|
249
|
+
<%- end -%>
|
250
|
+
|
251
|
+
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
252
|
+
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
253
|
+
gem 'kowl'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# <%= app_name %>
|
2
|
+
|
3
|
+
## Rails Build Environment
|
4
|
+
|
5
|
+
**Ruby:** <%= RUBY_VERSION %>
|
6
|
+
|
7
|
+
**Rails:** <%= Rails::VERSION::STRING %>
|
8
|
+
|
9
|
+
**Database:** <%= options[:database] %>
|
10
|
+
|
11
|
+
**Additional Info**
|
12
|
+
|
13
|
+
<%- unless options[:skip_erd] -%>
|
14
|
+
## Database Structure (ERD)
|
15
|
+
|
16
|
+
![](<%= app_name.parameterize %>_erd.png)
|
17
|
+
|
18
|
+
<%- end -%>
|
19
|
+
## Getting Started
|
20
|
+
|
21
|
+
### Prerequisites
|
22
|
+
|
23
|
+
Things you need to do in order for the software to run.
|
24
|
+
|
25
|
+
```shell
|
26
|
+
bundle install
|
27
|
+
rails db:migrate db:seed
|
28
|
+
rails s
|
29
|
+
```
|
30
|
+
|
31
|
+
### Installing
|
32
|
+
|
33
|
+
A step-by-step guide on how to install the software to run and function as intended.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
//= require rails-ujs
|
2
|
+
//= require jquery3
|
3
|
+
//= require jquery_ujs
|
4
|
+
//= require semantic-ui
|
5
|
+
//= require activestorage
|
6
|
+
<%- unless options[:skip_javascript] -%>
|
7
|
+
//= require turbolinks
|
8
|
+
<%- end -%>
|
9
|
+
//= require_tree .
|
10
|
+
|
11
|
+
<%- if options[:skip_javascript] -%>
|
12
|
+
$(document).ready(function() {
|
13
|
+
<%- else -%>
|
14
|
+
$(document).on("turbolinks:load",function(){
|
15
|
+
<%- end -%>
|
16
|
+
// Allow the user to close the flash messages
|
17
|
+
$('.message .close')
|
18
|
+
.on('click', function(){
|
19
|
+
$(this).closest('.message').transition('fade');
|
20
|
+
});
|
21
|
+
|
22
|
+
// Automatically close flash messages after 3 seconds
|
23
|
+
window.setTimeout(function() {
|
24
|
+
$('.message').transition('fade');
|
25
|
+
}, 3000);
|
26
|
+
});
|