kowl 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+

|
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
|
+
});
|