barkest_core 1.5.3.0
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/.gitignore +13 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +254 -0
- data/MIT-LICENSE +20 -0
- data/README.md +364 -0
- data/Rakefile +37 -0
- data/app/assets/fonts/barkest_core/ArchivoNarrow-Bold.ttf +0 -0
- data/app/assets/fonts/barkest_core/ArchivoNarrow-BoldItalic.ttf +0 -0
- data/app/assets/fonts/barkest_core/ArchivoNarrow-Italic.ttf +0 -0
- data/app/assets/fonts/barkest_core/ArchivoNarrow-Regular.ttf +0 -0
- data/app/assets/images/barkest_core/.keep +0 -0
- data/app/assets/images/barkest_core/barcode-B.svg +181 -0
- data/app/assets/javascripts/barkest_core/.keep +0 -0
- data/app/assets/javascripts/barkest_core/application.js +22 -0
- data/app/assets/javascripts/barkest_core/bootstrap-datepicker.js +1800 -0
- data/app/assets/javascripts/barkest_core/field_init.js +7 -0
- data/app/assets/javascripts/barkest_core/jquery.doubleScroll.js +112 -0
- data/app/assets/javascripts/barkest_core/masked_edit.js +25 -0
- data/app/assets/javascripts/barkest_core/system_status.js.erb +201 -0
- data/app/assets/stylesheets/barkest_core/.keep +0 -0
- data/app/assets/stylesheets/barkest_core/application.css +17 -0
- data/app/assets/stylesheets/barkest_core/custom.css.scss +264 -0
- data/app/assets/stylesheets/barkest_core/datepicker3.css +790 -0
- data/app/controllers/.keep +0 -0
- data/app/controllers/access_groups_controller.rb +74 -0
- data/app/controllers/account_activations_controller.rb +29 -0
- data/app/controllers/application_controller.rb +5 -0
- data/app/controllers/barkest_core/application_controller_base.rb +113 -0
- data/app/controllers/barkest_core/engine_controller_base.rb +15 -0
- data/app/controllers/barkest_core/testsub_controller.rb +21 -0
- data/app/controllers/contact_controller.rb +32 -0
- data/app/controllers/log_view_controller.rb +31 -0
- data/app/controllers/password_resets_controller.rb +126 -0
- data/app/controllers/sessions_controller.rb +64 -0
- data/app/controllers/status_controller.rb +150 -0
- data/app/controllers/system_config_controller.rb +238 -0
- data/app/controllers/system_update_controller.rb +164 -0
- data/app/controllers/test_access_controller.rb +44 -0
- data/app/controllers/test_report_controller.rb +75 -0
- data/app/controllers/users_controller.rb +218 -0
- data/app/helpers/.keep +0 -0
- data/app/helpers/barkest_core/application_helper.rb +134 -0
- data/app/helpers/barkest_core/form_helper.rb +469 -0
- data/app/helpers/barkest_core/html_helper.rb +70 -0
- data/app/helpers/barkest_core/misc_helper.rb +68 -0
- data/app/helpers/barkest_core/pdf_helper.rb +180 -0
- data/app/helpers/barkest_core/recaptcha_helper.rb +115 -0
- data/app/helpers/barkest_core/sessions_helper.rb +94 -0
- data/app/helpers/barkest_core/status_helper.rb +118 -0
- data/app/helpers/barkest_core/users_helper.rb +32 -0
- data/app/mailers/.keep +0 -0
- data/app/mailers/application_mailer.rb +5 -0
- data/app/mailers/barkest_core/application_mailer_base.rb +30 -0
- data/app/mailers/barkest_core/contact_form.rb +20 -0
- data/app/mailers/barkest_core/user_mailer.rb +44 -0
- data/app/models/.keep +0 -0
- data/app/models/access_group.rb +121 -0
- data/app/models/access_group_group_member.rb +13 -0
- data/app/models/access_group_user_member.rb +11 -0
- data/app/models/barkest_core/auth_config.rb +95 -0
- data/app/models/barkest_core/authorize_failure.rb +7 -0
- data/app/models/barkest_core/contact_message.rb +37 -0
- data/app/models/barkest_core/database_config.rb +223 -0
- data/app/models/barkest_core/db_table.rb +21 -0
- data/app/models/barkest_core/email_config.rb +132 -0
- data/app/models/barkest_core/global_status.rb +267 -0
- data/app/models/barkest_core/log_entry.rb +101 -0
- data/app/models/barkest_core/log_view_options.rb +51 -0
- data/app/models/barkest_core/ms_sql_db_definition.rb +441 -0
- data/app/models/barkest_core/ms_sql_definition.rb +221 -0
- data/app/models/barkest_core/ms_sql_function.rb +423 -0
- data/app/models/barkest_core/not_logged_in.rb +7 -0
- data/app/models/barkest_core/pdf_table_builder.rb +407 -0
- data/app/models/barkest_core/self_update_config.rb +37 -0
- data/app/models/barkest_core/user_alert.rb +29 -0
- data/app/models/barkest_core/user_alert_generators.rb +58 -0
- data/app/models/barkest_core/user_manager.rb +404 -0
- data/app/models/barkest_core/work_path.rb +74 -0
- data/app/models/disable_user.rb +18 -0
- data/app/models/ldap_access_group.rb +15 -0
- data/app/models/system_config.rb +99 -0
- data/app/models/user.rb +405 -0
- data/app/models/user_login_history.rb +11 -0
- data/app/views/.keep +0 -0
- data/app/views/access_groups/_form.html.erb +19 -0
- data/app/views/access_groups/edit.html.erb +2 -0
- data/app/views/access_groups/index.html.erb +32 -0
- data/app/views/access_groups/new.html.erb +2 -0
- data/app/views/access_groups/show.html.erb +4 -0
- data/app/views/barkest_core/contact_form/contact.html.erb +16 -0
- data/app/views/barkest_core/contact_form/contact.text.erb +13 -0
- data/app/views/barkest_core/testsub/_links.html.erb +5 -0
- data/app/views/barkest_core/testsub/page1.html.erb +3 -0
- data/app/views/barkest_core/testsub/page2.html.erb +2 -0
- data/app/views/barkest_core/testsub/page3.html.erb +2 -0
- data/app/views/barkest_core/user_mailer/account_activation.html.erb +7 -0
- data/app/views/barkest_core/user_mailer/account_activation.text.erb +6 -0
- data/app/views/barkest_core/user_mailer/invalid_password_reset.html.erb +3 -0
- data/app/views/barkest_core/user_mailer/invalid_password_reset.text.erb +5 -0
- data/app/views/barkest_core/user_mailer/password_reset.html.erb +8 -0
- data/app/views/barkest_core/user_mailer/password_reset.text.erb +7 -0
- data/app/views/contact/index.html.erb +24 -0
- data/app/views/layouts/_footer_copyright.html.erb +1 -0
- data/app/views/layouts/_menu_admin.html.erb +5 -0
- data/app/views/layouts/_menu_anon.html.erb +0 -0
- data/app/views/layouts/_menu_auth.html.erb +3 -0
- data/app/views/layouts/_menu_footer.html.erb +1 -0
- data/app/views/layouts/_nav_logo.html.erb +1 -0
- data/app/views/layouts/application.html.erb +2 -0
- data/app/views/layouts/barkest_core/_application.html.erb +24 -0
- data/app/views/layouts/barkest_core/_footer.html.erb +18 -0
- data/app/views/layouts/barkest_core/_header.html.erb +38 -0
- data/app/views/layouts/barkest_core/_html_mailer.html.erb +11 -0
- data/app/views/layouts/barkest_core/_menu_account.html.erb +14 -0
- data/app/views/layouts/barkest_core/_menu_sample.html.erb +1 -0
- data/app/views/layouts/barkest_core/_messages.html.erb +4 -0
- data/app/views/layouts/barkest_core/_shim.html.erb +4 -0
- data/app/views/layouts/barkest_core/_subheader.html.erb +1 -0
- data/app/views/layouts/barkest_core/_text_mailer.text.erb +4 -0
- data/app/views/layouts/mailer.html.erb +1 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/app/views/log_view/index.html.erb +100 -0
- data/app/views/password_resets/edit.html.erb +20 -0
- data/app/views/password_resets/new.html.erb +14 -0
- data/app/views/sessions/new.html.erb +27 -0
- data/app/views/shared/_error_messages.html.erb +29 -0
- data/app/views/shared/_generic_user_alert.html.erb +4 -0
- data/app/views/status/current.html.erb +34 -0
- data/app/views/status/test.html.erb +50 -0
- data/app/views/system_config/index.html.erb +25 -0
- data/app/views/system_config/show_auth.html.erb +28 -0
- data/app/views/system_config/show_database.html.erb +36 -0
- data/app/views/system_config/show_email.html.erb +21 -0
- data/app/views/system_config/show_self_update.html.erb +13 -0
- data/app/views/system_update/index.html.erb +31 -0
- data/app/views/system_update/new.html.erb +2 -0
- data/app/views/test_access/allow_anon.html.erb +2 -0
- data/app/views/test_access/require_admin.html.erb +2 -0
- data/app/views/test_access/require_group_x.html.erb +2 -0
- data/app/views/test_access/require_user.html.erb +2 -0
- data/app/views/test_report/index.csv.csvrb +23 -0
- data/app/views/test_report/index.html.erb +6 -0
- data/app/views/test_report/index.pdf.prawn +50 -0
- data/app/views/test_report/index.xlsx.axlsx +28 -0
- data/app/views/users/_user.html.erb +57 -0
- data/app/views/users/_user_details.html.erb +15 -0
- data/app/views/users/_user_details_for_list.html.erb +1 -0
- data/app/views/users/_user_form.html.erb +13 -0
- data/app/views/users/disable_confirm.html.erb +19 -0
- data/app/views/users/edit.html.erb +15 -0
- data/app/views/users/index.html.erb +9 -0
- data/app/views/users/new.html.erb +10 -0
- data/app/views/users/show.html.erb +46 -0
- data/bin/rails +12 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20160617172539_create_access_groups.rb +10 -0
- data/db/migrate/20160617172725_create_users.rb +26 -0
- data/db/migrate/20160617172833_create_user_login_histories.rb +12 -0
- data/db/migrate/20160622151720_create_access_group_user_members.rb +9 -0
- data/db/migrate/20160622151925_create_access_group_group_members.rb +9 -0
- data/db/migrate/20160701005706_create_ldap_access_groups.rb +11 -0
- data/db/migrate/20161108155029_create_system_configs.rb +11 -0
- data/db/seeds/barkest_core_01_create_users.rb +42 -0
- data/db/seeds.rb +53 -0
- data/lib/barkest_core/concerns/association_with_defaults.rb +55 -0
- data/lib/barkest_core/concerns/boolean_parser.rb +88 -0
- data/lib/barkest_core/concerns/date_parser.rb +181 -0
- data/lib/barkest_core/concerns/email_tester.rb +55 -0
- data/lib/barkest_core/concerns/encrypted_fields.rb +156 -0
- data/lib/barkest_core/concerns/named_model.rb +73 -0
- data/lib/barkest_core/concerns/number_parser.rb +145 -0
- data/lib/barkest_core/concerns/utc_conversion.rb +60 -0
- data/lib/barkest_core/engine.rb +105 -0
- data/lib/barkest_core/extensions/active_record_extensions.rb +120 -0
- data/lib/barkest_core/extensions/application_configuration_extensions.rb +38 -0
- data/lib/barkest_core/extensions/application_extensions.rb +50 -0
- data/lib/barkest_core/extensions/axlsx_extenstions.rb +157 -0
- data/lib/barkest_core/extensions/fixture_set_extensions.rb +107 -0
- data/lib/barkest_core/extensions/generator_extensions.rb +271 -0
- data/lib/barkest_core/extensions/main_app_extensions.rb +35 -0
- data/lib/barkest_core/extensions/prawn_document_extensions.rb +367 -0
- data/lib/barkest_core/extensions/prawn_table_extensions.rb +131 -0
- data/lib/barkest_core/extensions/router_extensions.rb +106 -0
- data/lib/barkest_core/extensions/simple_formatter_extensions.rb +66 -0
- data/lib/barkest_core/extensions/test_case_extensions.rb +348 -0
- data/lib/barkest_core/extensions/time_extensions.rb +164 -0
- data/lib/barkest_core/handlers/csv_handler.rb +30 -0
- data/lib/barkest_core/version.rb +3 -0
- data/lib/barkest_core.rb +324 -0
- data/lib/generators/barkest/install_generator.rb +102 -0
- data/lib/generators/barkest_core/actions/01_patch_application_controller.rb +55 -0
- data/lib/generators/barkest_core/actions/02_patch_application_mailer.rb +56 -0
- data/lib/generators/barkest_core/actions/03_patch_assets.rb +62 -0
- data/lib/generators/barkest_core/actions/04_patch_layouts.rb +36 -0
- data/lib/generators/barkest_core/actions/05_patch_routes.rb +93 -0
- data/lib/generators/barkest_core/actions/06_patch_seeds.rb +60 -0
- data/lib/generators/barkest_core/actions/07_copy_migrations.rb +51 -0
- data/lib/generators/barkest_core/actions/08_configure_database.rb +52 -0
- data/lib/generators/barkest_core/actions/09_configure_secrets.rb +29 -0
- data/lib/generators/barkest_core/actions/99_patch_gitignore.rb +57 -0
- data/lib/generators/barkest_core/install_generator.rb +17 -0
- data/test/barkest_core_test.rb +83 -0
- data/test/controllers/access_groups_controller_test.rb +53 -0
- data/test/controllers/contact_controller_test.rb +10 -0
- data/test/controllers/sessions_controller_test.rb +10 -0
- data/test/controllers/users_controller_test.rb +10 -0
- data/test/dummy/.gitignore +10 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +14 -0
- data/test/dummy/app/assets/stylesheets/application.css +16 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/mailers/application_mailer.rb +3 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +1 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +1 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/app/views/system_config/show_fake.html.erb +3 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +27 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +47 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/db_updater_ext.rb +33 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/sys_config_ext.rb +12 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +60 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/schema.rb +95 -0
- data/test/dummy/db/seeds/barkest_core_01_create_users.rb +42 -0
- data/test/dummy/db/seeds.rb +51 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/sql/my_test_view.sql +3 -0
- data/test/fixtures/access_groups.yml +21 -0
- data/test/fixtures/users.yml +71 -0
- data/test/helpers/barkest_core/sessions_helper_test.rb +22 -0
- data/test/integration/access_group_mgmt_test.rb +33 -0
- data/test/integration/access_test.rb +24 -0
- data/test/integration/account_activations_access_test.rb +12 -0
- data/test/integration/contact_test.rb +98 -0
- data/test/integration/extra_partial_test.rb +41 -0
- data/test/integration/log_view_access_test.rb +12 -0
- data/test/integration/password_resets_test.rb +101 -0
- data/test/integration/reports_test.rb +53 -0
- data/test/integration/status_access_test.rb +27 -0
- data/test/integration/system_config_access_test.rb +24 -0
- data/test/integration/system_update_access_test.rb +19 -0
- data/test/integration/users_access_test.rb +34 -0
- data/test/integration/users_edit_test.rb +178 -0
- data/test/integration/users_index_test.rb +62 -0
- data/test/integration/users_login_test.rb +67 -0
- data/test/integration/users_signup_test.rb +54 -0
- data/test/mailers/.keep +0 -0
- data/test/mailers/barkest_core/contact_form_test.rb +28 -0
- data/test/mailers/barkest_core/user_mailer_test.rb +43 -0
- data/test/mailers/previews/barkest_core/contact_form_preview.rb +17 -0
- data/test/mailers/previews/barkest_core/user_mailer_preview.rb +26 -0
- data/test/models/access_group_group_member_test.rb +28 -0
- data/test/models/access_group_test.rb +114 -0
- data/test/models/access_group_user_member_test.rb +28 -0
- data/test/models/barkest_core/auth_config_test.rb +57 -0
- data/test/models/barkest_core/bool_parser_test.rb +28 -0
- data/test/models/barkest_core/contact_message_test.rb +61 -0
- data/test/models/barkest_core/database_config_test.rb +33 -0
- data/test/models/barkest_core/date_parser_test.rb +110 -0
- data/test/models/barkest_core/email_config_test.rb +57 -0
- data/test/models/barkest_core/global_status_test.rb +50 -0
- data/test/models/barkest_core/ms_sql_db_updater_test.rb +115 -0
- data/test/models/barkest_core/ms_sql_definition_test.rb +102 -0
- data/test/models/barkest_core/ms_sql_function_test.rb +131 -0
- data/test/models/barkest_core/number_parser_test.rb +29 -0
- data/test/models/barkest_core/self_update_config_test.rb +29 -0
- data/test/models/barkest_core/user_alert_test.rb +19 -0
- data/test/models/barkest_core/user_manager_test.rb +34 -0
- data/test/models/barkest_core/work_path_test.rb +26 -0
- data/test/models/disable_user_test.rb +27 -0
- data/test/models/generic_time_test.rb +66 -0
- data/test/models/ldap_access_group_test.rb +31 -0
- data/test/models/pdf_table_builder_test.rb +6 -0
- data/test/models/system_config_test.rb +78 -0
- data/test/models/user_login_history_test.rb +37 -0
- data/test/models/user_test.rb +130 -0
- data/test/test_helper.rb +63 -0
- metadata +798 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: f0c84d8efafd80566ca7f2571995f75de2bc0f79
|
|
4
|
+
data.tar.gz: a5be63bbde5502268c0db143eb720f5d0e2d86e5
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7a4480425a4c39e15c695f911db0cfc2d367d7420d7a6b9fecbc15ed57b384962bf346ec6fdb1ef04d8ad7cbc35ffd7708c2919efb2f7229842c6bb16c192a92
|
|
7
|
+
data.tar.gz: '08fddf489c959a5defa7f7a38e024f720087d98f641268e02a1264b40bc5e8ae2ff78b6c182e0d91775caa1ea615badf1f56af762dd0fcb6d102ba6ab07e6a58'
|
data/.gitignore
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
# Declare your gem's dependencies in barkest_core.gemspec.
|
|
4
|
+
# Bundler will treat runtime dependencies like base dependencies, and
|
|
5
|
+
# development dependencies will be added by default to the :development group.
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
# Declare any dependencies that are still in development here instead of in
|
|
9
|
+
# your gemspec. These might include edge Rails or gems from your path or
|
|
10
|
+
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
11
|
+
# your gem to rubygems.org.
|
|
12
|
+
|
|
13
|
+
# To use a debugger
|
|
14
|
+
gem 'byebug', group: [:development, :test]
|
|
15
|
+
|
|
16
|
+
group :test do
|
|
17
|
+
gem 'minitest-reporters'
|
|
18
|
+
gem 'mini_backtrace'
|
|
19
|
+
gem 'tiny_tds', '~> 1.0.4'
|
|
20
|
+
gem 'activerecord-sqlserver-adapter', '~> 4.2.5'
|
|
21
|
+
end
|
|
22
|
+
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
barkest_core (1.5.3.0)
|
|
5
|
+
activerecord-sqlserver-adapter (~> 4.2.1)
|
|
6
|
+
axlsx (~> 2.0.1)
|
|
7
|
+
axlsx_rails (>= 0.4.0)
|
|
8
|
+
barkest_ssh (>= 1.1.12)
|
|
9
|
+
bcrypt (~> 3.1.11)
|
|
10
|
+
bootstrap-sass (~> 3.3.6)
|
|
11
|
+
bootstrap-will_paginate (>= 0.0.10)
|
|
12
|
+
carrierwave (~> 0.11.2)
|
|
13
|
+
coffee-rails (~> 4.1.1)
|
|
14
|
+
encrypted_strings (~> 0.3.3)
|
|
15
|
+
exception_notification (~> 4.1.4)
|
|
16
|
+
hex_string (~> 1.0.1)
|
|
17
|
+
jbuilder (~> 2.5.0)
|
|
18
|
+
jquery-rails (~> 4.1.1)
|
|
19
|
+
net-ldap (>= 0.14.0)
|
|
20
|
+
nokogiri (~> 1.6.8)
|
|
21
|
+
prawn (~> 2.1.0)
|
|
22
|
+
prawn-rails (>= 0.1.1)
|
|
23
|
+
prawn-table (>= 0.2.2)
|
|
24
|
+
rails (~> 4.2.7.1)
|
|
25
|
+
ruby-ntlm (= 0.0.3)
|
|
26
|
+
rubyzip (~> 1.0.0)
|
|
27
|
+
sass-rails (~> 5.0.4)
|
|
28
|
+
spawnling (~> 2.1.6)
|
|
29
|
+
thor
|
|
30
|
+
tiny_tds (~> 1.0.4)
|
|
31
|
+
tzinfo-data
|
|
32
|
+
uglifier (~> 3.0.0)
|
|
33
|
+
will_paginate (~> 3.1.0)
|
|
34
|
+
|
|
35
|
+
GEM
|
|
36
|
+
remote: https://rubygems.org/
|
|
37
|
+
specs:
|
|
38
|
+
actionmailer (4.2.7.1)
|
|
39
|
+
actionpack (= 4.2.7.1)
|
|
40
|
+
actionview (= 4.2.7.1)
|
|
41
|
+
activejob (= 4.2.7.1)
|
|
42
|
+
mail (~> 2.5, >= 2.5.4)
|
|
43
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
44
|
+
actionpack (4.2.7.1)
|
|
45
|
+
actionview (= 4.2.7.1)
|
|
46
|
+
activesupport (= 4.2.7.1)
|
|
47
|
+
rack (~> 1.6)
|
|
48
|
+
rack-test (~> 0.6.2)
|
|
49
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
50
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
51
|
+
actionview (4.2.7.1)
|
|
52
|
+
activesupport (= 4.2.7.1)
|
|
53
|
+
builder (~> 3.1)
|
|
54
|
+
erubis (~> 2.7.0)
|
|
55
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
56
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
57
|
+
activejob (4.2.7.1)
|
|
58
|
+
activesupport (= 4.2.7.1)
|
|
59
|
+
globalid (>= 0.3.0)
|
|
60
|
+
activemodel (4.2.7.1)
|
|
61
|
+
activesupport (= 4.2.7.1)
|
|
62
|
+
builder (~> 3.1)
|
|
63
|
+
activerecord (4.2.7.1)
|
|
64
|
+
activemodel (= 4.2.7.1)
|
|
65
|
+
activesupport (= 4.2.7.1)
|
|
66
|
+
arel (~> 6.0)
|
|
67
|
+
activerecord-sqlserver-adapter (4.2.15)
|
|
68
|
+
activerecord (~> 4.2.1)
|
|
69
|
+
activesupport (4.2.7.1)
|
|
70
|
+
i18n (~> 0.7)
|
|
71
|
+
json (~> 1.7, >= 1.7.7)
|
|
72
|
+
minitest (~> 5.1)
|
|
73
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
74
|
+
tzinfo (~> 1.1)
|
|
75
|
+
ansi (1.5.0)
|
|
76
|
+
arel (6.0.4)
|
|
77
|
+
autoprefixer-rails (6.6.1)
|
|
78
|
+
execjs
|
|
79
|
+
axlsx (2.0.1)
|
|
80
|
+
htmlentities (~> 4.3.1)
|
|
81
|
+
nokogiri (>= 1.4.1)
|
|
82
|
+
rubyzip (~> 1.0.0)
|
|
83
|
+
axlsx_rails (0.5.0)
|
|
84
|
+
actionpack (>= 3.1)
|
|
85
|
+
axlsx (>= 2.0.1)
|
|
86
|
+
barkest_ssh (1.1.13)
|
|
87
|
+
net-sftp (~> 2.1.2)
|
|
88
|
+
net-ssh (~> 3.0.2)
|
|
89
|
+
bcrypt (3.1.11)
|
|
90
|
+
bootstrap-sass (3.3.7)
|
|
91
|
+
autoprefixer-rails (>= 5.2.1)
|
|
92
|
+
sass (>= 3.3.4)
|
|
93
|
+
bootstrap-will_paginate (0.0.10)
|
|
94
|
+
will_paginate
|
|
95
|
+
builder (3.2.3)
|
|
96
|
+
byebug (9.0.6)
|
|
97
|
+
carrierwave (0.11.2)
|
|
98
|
+
activemodel (>= 3.2.0)
|
|
99
|
+
activesupport (>= 3.2.0)
|
|
100
|
+
json (>= 1.7)
|
|
101
|
+
mime-types (>= 1.16)
|
|
102
|
+
mimemagic (>= 0.3.0)
|
|
103
|
+
coffee-rails (4.1.1)
|
|
104
|
+
coffee-script (>= 2.2.0)
|
|
105
|
+
railties (>= 4.0.0, < 5.1.x)
|
|
106
|
+
coffee-script (2.4.1)
|
|
107
|
+
coffee-script-source
|
|
108
|
+
execjs
|
|
109
|
+
coffee-script-source (1.12.2)
|
|
110
|
+
concurrent-ruby (1.0.4)
|
|
111
|
+
debug_inspector (0.0.2)
|
|
112
|
+
encrypted_strings (0.3.3)
|
|
113
|
+
erubis (2.7.0)
|
|
114
|
+
exception_notification (4.1.4)
|
|
115
|
+
actionmailer (~> 4.0)
|
|
116
|
+
activesupport (~> 4.0)
|
|
117
|
+
execjs (2.7.0)
|
|
118
|
+
faker (1.7.2)
|
|
119
|
+
i18n (~> 0.5)
|
|
120
|
+
globalid (0.3.7)
|
|
121
|
+
activesupport (>= 4.1.0)
|
|
122
|
+
hex_string (1.0.1)
|
|
123
|
+
htmlentities (4.3.4)
|
|
124
|
+
i18n (0.7.0)
|
|
125
|
+
jbuilder (2.5.0)
|
|
126
|
+
activesupport (>= 3.0.0, < 5.1)
|
|
127
|
+
multi_json (~> 1.2)
|
|
128
|
+
jquery-rails (4.1.1)
|
|
129
|
+
rails-dom-testing (>= 1, < 3)
|
|
130
|
+
railties (>= 4.2.0)
|
|
131
|
+
thor (>= 0.14, < 2.0)
|
|
132
|
+
json (1.8.6)
|
|
133
|
+
loofah (2.0.3)
|
|
134
|
+
nokogiri (>= 1.5.9)
|
|
135
|
+
mail (2.6.4)
|
|
136
|
+
mime-types (>= 1.16, < 4)
|
|
137
|
+
mime-types (3.1)
|
|
138
|
+
mime-types-data (~> 3.2015)
|
|
139
|
+
mime-types-data (3.2016.0521)
|
|
140
|
+
mimemagic (0.3.2)
|
|
141
|
+
mini_backtrace (0.1.3)
|
|
142
|
+
minitest (> 1.2.0)
|
|
143
|
+
rails (>= 2.3.3)
|
|
144
|
+
mini_portile2 (2.1.0)
|
|
145
|
+
minitest (5.10.1)
|
|
146
|
+
minitest-reporters (1.1.13)
|
|
147
|
+
ansi
|
|
148
|
+
builder
|
|
149
|
+
minitest (>= 5.0)
|
|
150
|
+
ruby-progressbar
|
|
151
|
+
multi_json (1.12.1)
|
|
152
|
+
net-ldap (0.15.0)
|
|
153
|
+
net-sftp (2.1.2)
|
|
154
|
+
net-ssh (>= 2.6.5)
|
|
155
|
+
net-ssh (3.0.2)
|
|
156
|
+
nokogiri (1.6.8.1)
|
|
157
|
+
mini_portile2 (~> 2.1.0)
|
|
158
|
+
nokogiri (1.6.8.1-x86-mingw32)
|
|
159
|
+
mini_portile2 (~> 2.1.0)
|
|
160
|
+
pdf-core (0.6.1)
|
|
161
|
+
prawn (2.1.0)
|
|
162
|
+
pdf-core (~> 0.6.1)
|
|
163
|
+
ttfunk (~> 1.4.0)
|
|
164
|
+
prawn-rails (0.1.1)
|
|
165
|
+
prawn
|
|
166
|
+
prawn-table
|
|
167
|
+
rails (>= 3.1.0)
|
|
168
|
+
prawn-table (0.2.2)
|
|
169
|
+
prawn (>= 1.3.0, < 3.0.0)
|
|
170
|
+
rack (1.6.5)
|
|
171
|
+
rack-test (0.6.3)
|
|
172
|
+
rack (>= 1.0)
|
|
173
|
+
rails (4.2.7.1)
|
|
174
|
+
actionmailer (= 4.2.7.1)
|
|
175
|
+
actionpack (= 4.2.7.1)
|
|
176
|
+
actionview (= 4.2.7.1)
|
|
177
|
+
activejob (= 4.2.7.1)
|
|
178
|
+
activemodel (= 4.2.7.1)
|
|
179
|
+
activerecord (= 4.2.7.1)
|
|
180
|
+
activesupport (= 4.2.7.1)
|
|
181
|
+
bundler (>= 1.3.0, < 2.0)
|
|
182
|
+
railties (= 4.2.7.1)
|
|
183
|
+
sprockets-rails
|
|
184
|
+
rails-deprecated_sanitizer (1.0.3)
|
|
185
|
+
activesupport (>= 4.2.0.alpha)
|
|
186
|
+
rails-dom-testing (1.0.8)
|
|
187
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
|
188
|
+
nokogiri (~> 1.6)
|
|
189
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
|
190
|
+
rails-html-sanitizer (1.0.3)
|
|
191
|
+
loofah (~> 2.0)
|
|
192
|
+
railties (4.2.7.1)
|
|
193
|
+
actionpack (= 4.2.7.1)
|
|
194
|
+
activesupport (= 4.2.7.1)
|
|
195
|
+
rake (>= 0.8.7)
|
|
196
|
+
thor (>= 0.18.1, < 2.0)
|
|
197
|
+
rake (12.0.0)
|
|
198
|
+
ruby-ntlm (0.0.3)
|
|
199
|
+
ruby-progressbar (1.8.1)
|
|
200
|
+
rubyzip (1.0.0)
|
|
201
|
+
sass (3.4.23)
|
|
202
|
+
sass-rails (5.0.6)
|
|
203
|
+
railties (>= 4.0.0, < 6)
|
|
204
|
+
sass (~> 3.1)
|
|
205
|
+
sprockets (>= 2.8, < 4.0)
|
|
206
|
+
sprockets-rails (>= 2.0, < 4.0)
|
|
207
|
+
tilt (>= 1.1, < 3)
|
|
208
|
+
spawnling (2.1.6)
|
|
209
|
+
sprockets (3.7.1)
|
|
210
|
+
concurrent-ruby (~> 1.0)
|
|
211
|
+
rack (> 1, < 3)
|
|
212
|
+
sprockets-rails (3.2.0)
|
|
213
|
+
actionpack (>= 4.0)
|
|
214
|
+
activesupport (>= 4.0)
|
|
215
|
+
sprockets (>= 3.0.0)
|
|
216
|
+
sqlite3 (1.3.13)
|
|
217
|
+
sqlite3 (1.3.13-x86-mingw32)
|
|
218
|
+
thor (0.19.4)
|
|
219
|
+
thread_safe (0.3.5)
|
|
220
|
+
tilt (2.0.5)
|
|
221
|
+
tiny_tds (1.0.5)
|
|
222
|
+
mini_portile2 (~> 2.0)
|
|
223
|
+
tiny_tds (1.0.5-x86-mingw32)
|
|
224
|
+
mini_portile2 (~> 2.0)
|
|
225
|
+
ttfunk (1.4.0)
|
|
226
|
+
tzinfo (1.2.2)
|
|
227
|
+
thread_safe (~> 0.1)
|
|
228
|
+
tzinfo-data (1.2016.10)
|
|
229
|
+
tzinfo (>= 1.0.0)
|
|
230
|
+
uglifier (3.0.4)
|
|
231
|
+
execjs (>= 0.3.0, < 3)
|
|
232
|
+
web-console (3.3.0)
|
|
233
|
+
activemodel (>= 4.2)
|
|
234
|
+
debug_inspector
|
|
235
|
+
railties (>= 4.2)
|
|
236
|
+
will_paginate (3.1.5)
|
|
237
|
+
|
|
238
|
+
PLATFORMS
|
|
239
|
+
ruby
|
|
240
|
+
x86-mingw32
|
|
241
|
+
|
|
242
|
+
DEPENDENCIES
|
|
243
|
+
activerecord-sqlserver-adapter (~> 4.2.5)
|
|
244
|
+
barkest_core!
|
|
245
|
+
byebug
|
|
246
|
+
faker
|
|
247
|
+
mini_backtrace
|
|
248
|
+
minitest-reporters
|
|
249
|
+
sqlite3
|
|
250
|
+
tiny_tds (~> 1.0.4)
|
|
251
|
+
web-console
|
|
252
|
+
|
|
253
|
+
BUNDLED WITH
|
|
254
|
+
1.13.7
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2016 Beau Barker
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# BarkestCore
|
|
2
|
+
|
|
3
|
+
The BarkestCore project gets a web application off to a quick start by building on the Rails 4 framework.
|
|
4
|
+
|
|
5
|
+
This project includes basic user management, group based authorization, and a number of helper methods.
|
|
6
|
+
|
|
7
|
+
Most Barker EST web applications use this gem for authentication, authorization, and helper routines.
|
|
8
|
+
There are customizations added to controllers, models, and test cases. There is also a customization added
|
|
9
|
+
to the configuration system that ensures a database configuration exists for test and development environments.
|
|
10
|
+
This allows you to leave the YAML files out of your git repository without having to worry about the out-of-box
|
|
11
|
+
experience that this would normally cause issues with.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
Add this line to your application's Gemfile:
|
|
17
|
+
|
|
18
|
+
```ruby
|
|
19
|
+
gem 'barkest_core'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
And then execute:
|
|
23
|
+
|
|
24
|
+
$ bundle
|
|
25
|
+
|
|
26
|
+
Or install it yourself as:
|
|
27
|
+
|
|
28
|
+
$ gem install barkest_core
|
|
29
|
+
|
|
30
|
+
Once installed, you will want to configure the gem:
|
|
31
|
+
|
|
32
|
+
$ bundle exec rails generate barkest_core:install
|
|
33
|
+
|
|
34
|
+
The configuration will go through everything that BarkestCore needs to function, but will also
|
|
35
|
+
offer to provide you with some reasonable defaults and protections (removing YAML config files from repo).
|
|
36
|
+
Only certain parts are required for BarkestCore to function.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
This gem provides the foundation for a Rails application. It is somewhat mean in that it is not fully namespaced. It
|
|
42
|
+
uses the `User` model for, well, users, and the `AccessGroup` model for user-group memberships. This would be important
|
|
43
|
+
to keep in mind when developing your application. For Barker EST applications, this happens to be exactly what I want,
|
|
44
|
+
so there was no need to support namespacing these models or controllers.
|
|
45
|
+
|
|
46
|
+
During configuration, BarkestCore offers to update your `ApplicationController` class and your application layout files.
|
|
47
|
+
If you opted to let BarkestCore perform these updates, then your application should be ready to go. If not, then there
|
|
48
|
+
may be some issues. To truly take advantage of BarkestCore, you should have your `ApplicationController` inherit from
|
|
49
|
+
`::BarkestCore::ApplicationControllerBase`. This gives you all the session and user based helper functionality as well
|
|
50
|
+
as the `authorize!` method inside your controllers. The layouts are less important, BarkestCore provides some generic
|
|
51
|
+
layouts as default, but you can easily use your own layouts.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
There are a few special layouts you can create to modify parts of the layout easily. Create these files in your
|
|
55
|
+
__views/layouts__ folder to have them get used automatically. These views will override
|
|
56
|
+
the default views for the library. See the next two sections for other ways to customize the application.
|
|
57
|
+
Use the _ prefixed notation.
|
|
58
|
+
ie: "_nav_logo.html.erb" for "nav_logo"
|
|
59
|
+
|
|
60
|
+
* __nav_logo__ Defines the logo in the top left corner of the webpage. This should be an image tag inside of
|
|
61
|
+
a link tag.
|
|
62
|
+
ie: `<a href="..."><img src="..."></a>`
|
|
63
|
+
* __footer_copyright__ Defines the copyright text presented in the footer. This can be anything you want
|
|
64
|
+
it to be.
|
|
65
|
+
* __menu_admin__ Defines the administration menu. You probably won't need to do anything with this
|
|
66
|
+
particular menu, but just in case, it is one of the easily overridable views.
|
|
67
|
+
Menus would be `<li>...</li>` items. The container `<ul>...</ul>` is defined in the parent view.
|
|
68
|
+
* __menu_anon__ Defines the menu available to all users, aka: the anonymous menu. If you want to
|
|
69
|
+
provide menu options to everyone, you would want to place them here.
|
|
70
|
+
Menus would be `<li>...</li>` items. The container `<ul>...</ul>` is defined in the parent view.
|
|
71
|
+
* __menu_auth__ Defines the menu available to authenticated users. The default is just a link to the
|
|
72
|
+
users list. Your app may not even desire that link. This is the view that is most likely to be
|
|
73
|
+
adjusted on a per-project basis since it defines the menu for users.
|
|
74
|
+
Menus would be `<li>...</li>` items. The container `<ul>...</ul>` is defined in the parent view.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
**Namespaced Partials**
|
|
78
|
+
|
|
79
|
+
If you are designing a gem based on this gem, and you are namespacing your controllers, you can make use of this
|
|
80
|
+
automatic behavior.
|
|
81
|
+
|
|
82
|
+
Let's say your controller is MyNamespace::MySpecialController. Your route might be 'my_special/action'. The router
|
|
83
|
+
should define the parameter 'controller' to be 'my_namespace/my_special'. The default layouts look for this format
|
|
84
|
+
and then try to include some namespaced partials automatically.
|
|
85
|
+
|
|
86
|
+
The _menu_auth_, _menu_anon_, _menu_footer_, and _subheader_ partials are looked for automatically. The _menu_footer_
|
|
87
|
+
partial is just like _menu_auth_ and _menu_anon_ except it goes in the footer.
|
|
88
|
+
|
|
89
|
+
The __subheader__ partial is specific to namespaced controllers. This partial gets rendered immediately after the
|
|
90
|
+
header before any messages. This allows you to define navigation tokens for your gem that won't interfere with the
|
|
91
|
+
rest of the application. Although you are free to use the partial for anything else you might want to stick right
|
|
92
|
+
under the main menu bar.
|
|
93
|
+
|
|
94
|
+
The _menu_auth_ and _menu_anon_ partials are rendered after the default partials. The _menu_footer_ partial is rendered
|
|
95
|
+
before the default partials.
|
|
96
|
+
|
|
97
|
+
All of these partials are stored under 'layouts/{namespace}'. So in our example, we would create
|
|
98
|
+
'views/layouts/my_namespace/menu_auth' and include related commands in the main menu. These commands would only be
|
|
99
|
+
included while we are in the namespace, see the next section about registering views.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
**Registered Partials**
|
|
103
|
+
|
|
104
|
+
You may want to add to the main menu when your gem is loaded to make navigating to your gem's controllers easier.
|
|
105
|
+
BarkestCore now includes methods to register partials to do just that.
|
|
106
|
+
|
|
107
|
+
`BarkestCore.register_anon_menu`, `BarkestCore.register_auth_menu`, and `BarkestCore.register_footer_menu` register
|
|
108
|
+
partials to be rendered in those three menu locations. The _anon_ and _footer_ menus are always rendered, while the
|
|
109
|
+
_auth_ menu is only rendered once a user is authenticated. The _anon_ and _auth_ menus are rendered in the order of
|
|
110
|
+
registration. The _footer_ menus are rendered in reverse order.
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
Utility models are namespaced. These include the `UserManager` (which you shouldn't need to use directly), `WorkPath`,
|
|
115
|
+
`GlobalStatus`, and `PdfTableBuilder` classes, among others.
|
|
116
|
+
|
|
117
|
+
The `WorkPath` class gives you a simple way to work with
|
|
118
|
+
an application specific temporary directory. It looks for shared memory locations before defaulting to "/tmp" so on
|
|
119
|
+
systems that have shared memory ("/dev/shm") the temporary files will be stored there.
|
|
120
|
+
|
|
121
|
+
```ruby
|
|
122
|
+
my_temp_file = BarkestCore::WorkPath.path_for('some.file')
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The `GlobalStatus` class allows you to "lock" the system in one process/thread and provide status updates to another
|
|
126
|
+
process/thread. This is useful if you have long running processes. In one session you can use the `GlobalStatus` class
|
|
127
|
+
to lock the system to perform the work. In another you can monitor the status to determine when the other session has
|
|
128
|
+
finished.
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
BarkestCore::GlobalStatus.lock_for do
|
|
132
|
+
# do some long running code here...
|
|
133
|
+
end
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
A `SystemConfig` (not namespaced) class exists that can be used to store configuration data for various
|
|
138
|
+
services. For instance, by default the LDAP and email configurations are stored within `SystemConfig`.
|
|
139
|
+
|
|
140
|
+
This is handled by the `system_config` controller since the `SystemConfig` class doesn't care what is
|
|
141
|
+
getting stored. It does however offer the lovely capability to encrypt the stored configuration.
|
|
142
|
+
|
|
143
|
+
```ruby
|
|
144
|
+
my_config = {
|
|
145
|
+
:some_int => 1234,
|
|
146
|
+
:some_string => 'hello world',
|
|
147
|
+
:some_bool => true
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# Save the hash to the database in plain text.
|
|
151
|
+
SystemConfig.set :some_config, my_config
|
|
152
|
+
|
|
153
|
+
# Save the hash to the database in encrypted format.
|
|
154
|
+
SystemConfig.set :some_config, my_config, true
|
|
155
|
+
|
|
156
|
+
# Read the hash from the database (decrypted automatically if needed).
|
|
157
|
+
my_config = SystemConfig.get(:some_config)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The encryption key used by `SystemConfig` comes from the __secrets.yml__ configuration file. If the
|
|
161
|
+
`encrypted_config_key` is specified, that value will be used, otherwise the `secret_key_base` value
|
|
162
|
+
will be used. If the value for the encryption key is changed, any stored encrypted configurations
|
|
163
|
+
will be lost. The `SystemConfig` class will return __nil__ if the value does not exist or cannot be
|
|
164
|
+
decrypted.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
Because I generally have a need to interface with MS SQL for reporting purposes, I decided to build the
|
|
168
|
+
necessary models as well. The models would be `MsSqlDbDefinition`, `MsSqlDefinition`, and `MsSqlFunction`.
|
|
169
|
+
---
|
|
170
|
+
The `MsSqlFunction` model basically allows you to use the output from a user-defined function in SQL to
|
|
171
|
+
populate an ActiveRecord-like model. These are read-only models, which fits in nicely with the output
|
|
172
|
+
from a user-defined function. There are 3 steps to using the `MsSqlFunction`.
|
|
173
|
+
1. Inherit from `BarkestCore::MsSqlFunction`.
|
|
174
|
+
2. Tell it what connection to use.
|
|
175
|
+
3. Tell it the name of the user-defined function.
|
|
176
|
+
|
|
177
|
+
```sql
|
|
178
|
+
CREATE FUNCTION [my_function] (
|
|
179
|
+
@alpha INTEGER,
|
|
180
|
+
@bravo VARCHAR(100),
|
|
181
|
+
@charlie DATETIME
|
|
182
|
+
) RETURNS TABLE AS RETURN
|
|
183
|
+
SELECT
|
|
184
|
+
LEN(ISNULL(@bravo,'')) AS [bravo_len],
|
|
185
|
+
LEN(ISNULL(@bravo,'')) * ISNULL(@alpha,0) AS [alpha_bravo],
|
|
186
|
+
CONVERT(FLOAT, LEN(ISNULL(@bravo, ''))) / 100.0 AS [bravo_len_pct],
|
|
187
|
+
CONVERT(BIT, CASE
|
|
188
|
+
WHEN @alpha > 25 THEN 1
|
|
189
|
+
ELSE 0
|
|
190
|
+
END) AS [alpha_gt_25],
|
|
191
|
+
ISNULL(@alpha,0) AS [alpha],
|
|
192
|
+
ISNULL(@bravo,'') AS [bravo],
|
|
193
|
+
ISNULL(@charlie, GETDATE()) AS [charlie]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
```ruby
|
|
197
|
+
class MyFunction < BarkestCore::MsSqlFunction
|
|
198
|
+
use_connection 'ActiveRecord::Base'
|
|
199
|
+
self.function_name = 'my_function'
|
|
200
|
+
end
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Setting the function name causes the model to be built. The name cannot be changed once set.
|
|
204
|
+
After the model has been built, you can view the parameters, set their default values, view the columns,
|
|
205
|
+
and select from the function.
|
|
206
|
+
|
|
207
|
+
```ruby
|
|
208
|
+
MyFunction.parameters.inspect
|
|
209
|
+
# "{ :alpha=>{ :type=>:integer, :data_type=>'integer' ... }, ... }"
|
|
210
|
+
|
|
211
|
+
# Set some default parameter values.
|
|
212
|
+
MyFunction.parameters = { :alpha => 10, :bravo => 'yes' }
|
|
213
|
+
|
|
214
|
+
# The output from .parameters can be fed back into .parameters=, just set the :default keys.
|
|
215
|
+
p = MyFunction.parameters
|
|
216
|
+
p[:alpha][:default] = 10
|
|
217
|
+
p[:bravo][:default] = 'yes'
|
|
218
|
+
MyFunction.parameters = p
|
|
219
|
+
|
|
220
|
+
MyFunction.columns.inspect
|
|
221
|
+
# "{ { :name=>'bravo_len', :key=>:bravo_len, :data_type=>'int', :type=>:integer ...}, ...}"
|
|
222
|
+
|
|
223
|
+
results = MyFunction.select( :alpha => 25, :bravo => 'Hello', :charlie => 5.days.ago )
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
The `MsSqlDefinition` model is used primarily to load table, view, function, and procedure definitions
|
|
228
|
+
for the `MsSqlDbDefinition` model. If the source used to create the `MsSqlDefinition` model was for a
|
|
229
|
+
function, then the model will attempt to figure out the return value. But other than that, it doesn't
|
|
230
|
+
try to figure out what you're trying to do with the code.
|
|
231
|
+
|
|
232
|
+
The `MsSqlDbDefinition` model is the model more likely to be used directly. And the easiest way to use this
|
|
233
|
+
model is to use the `MsSqlDbDefinition.register` method.
|
|
234
|
+
|
|
235
|
+
```ruby
|
|
236
|
+
updater = MsSqlDbDefinition.register(
|
|
237
|
+
:my_db,
|
|
238
|
+
:source_paths => [ 'sql/my_db' ],
|
|
239
|
+
:extra_params => {
|
|
240
|
+
:extra_1 => {
|
|
241
|
+
:name => 'some_connection_param',
|
|
242
|
+
:label => 'Enter a value for some connection param',
|
|
243
|
+
:type => 'text',
|
|
244
|
+
:value => 'my default'
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
:before_update => Proc.new do |db_conn, user|
|
|
248
|
+
...
|
|
249
|
+
end,
|
|
250
|
+
:after_update => Proc.new do |db_conn, user|
|
|
251
|
+
...
|
|
252
|
+
end
|
|
253
|
+
)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Only the first parameter is required, that would be the database name. The `source_paths` key would
|
|
257
|
+
define the paths to search for SQL files when the updater is created. You can add more sources later
|
|
258
|
+
using `add_source`, `add_source_definition`, and `add_source_path`.
|
|
259
|
+
|
|
260
|
+
```ruby
|
|
261
|
+
# Add one source to the updater.
|
|
262
|
+
# The first comment should define the timestamp for the source.
|
|
263
|
+
updater.add_source "-- 2016-12-19\nCREATE VIEW [my_view] AS SELECT ..."
|
|
264
|
+
|
|
265
|
+
# The definition can be created in any valid manner, this option allows for maximum
|
|
266
|
+
# flexibility since you can tweak the actual definition going into the updater.
|
|
267
|
+
# The third param is the timestamp here, but it can also be included in the source directly.
|
|
268
|
+
# Note that the timestamp is an integer number here.
|
|
269
|
+
my_def = MsSqlDefinition.new "CREATE VIEW [my_view] AS SELECT ...", nil, 201612121400
|
|
270
|
+
updater.add_source_definition my_def
|
|
271
|
+
|
|
272
|
+
# Just like in the constructor, search for all SQL files in the specified path.
|
|
273
|
+
# Neither the `source_paths` constructor key not this method are recursive.
|
|
274
|
+
# You need to add subdirectories individually.
|
|
275
|
+
# The source files should set the timestamp in the first comment as shown above.
|
|
276
|
+
# If they don't then they will use the file modification time. Since git doesn't
|
|
277
|
+
# track the modification time, this essentially becomes the project's creation time
|
|
278
|
+
# so it would be best to include the comments.
|
|
279
|
+
updater.add_source_path "sql/my_db"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
The `extra_params` key allows you to specify up to 5 extra configuration parameters for this database's
|
|
283
|
+
connection. Each extra param must have a name and type. The label and value are optional, but recommended.
|
|
284
|
+
|
|
285
|
+
The `type` could be "text", "password", "integer", "float", "boolean", or the special "in:" type. The "in:"
|
|
286
|
+
type allows you to specify a range of valid options for the parameter.
|
|
287
|
+
|
|
288
|
+
```ruby
|
|
289
|
+
{ :type => "in:MyCustomModel::VALID_EXTRA_PARAM_OPTIONS" }
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
The text after the "in:" will be evaluated and should return an enumerable object.
|
|
293
|
+
|
|
294
|
+
The `before_update` and `after_update` callbacks are executed repectively before or after the update
|
|
295
|
+
is performed. The `db_conn` param is the current connection adapter. The `user` param is the user executing
|
|
296
|
+
the update. The `before_update` and `after_update` callbacks can also reference a method defined elsewhere.
|
|
297
|
+
|
|
298
|
+
```ruby
|
|
299
|
+
{ :before_update => "MyCustomModel.before_db_update(db_conn, user)" }
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
The `MsSqlDbDefinition.register` method registers the database configuration with the system so that the
|
|
303
|
+
SystemConfigController can configure it, and also so that once it is configured the boot code can perform
|
|
304
|
+
the update.
|
|
305
|
+
|
|
306
|
+
It would be horrible to perform the update every time the app was started, which is where the timestamps
|
|
307
|
+
come into play. The system generates a unique version for each source file based on the timestamp and the
|
|
308
|
+
CRC32 of the source contents. The timestamps have a 1 minute resolution, and the CRC32 ensures the contents
|
|
309
|
+
haven't changed. The timestamps are the real determiner for whether the object needs updated or not. The
|
|
310
|
+
CRC32 would be just a quick check that everything is good.
|
|
311
|
+
|
|
312
|
+
When using the source paths, the modified time for the files is used for the timestamps. When adding the
|
|
313
|
+
definition directly, you are providing the timestamp.
|
|
314
|
+
|
|
315
|
+
Once an object is created, the unique version is stored for the object. The next time the update runs, it
|
|
316
|
+
checks the stored version against the computed versions and only updates the objects it decides need to be
|
|
317
|
+
updated.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
#### DateTime Handling
|
|
321
|
+
|
|
322
|
+
I find that I have to accurately work with Dates and Times frequently. A common problem I had on a previous project
|
|
323
|
+
was "TimeZone Interference". This was only a problem with user provided dates/times. For instance, a user enters
|
|
324
|
+
an employee's hire date as '2000-10-15', ActiveRecord parses that according to the local time zone (-0500) so we have
|
|
325
|
+
'2000-10-15 00:00:00 -0500' which becomes '2000-10-16 05:00:00 UTC' when stored. So far, not really a problem if we
|
|
326
|
+
work solely in one time zone, big problem if we start working across time zones.
|
|
327
|
+
|
|
328
|
+
So I implemented a few changes. `Date.to_time` returns UTC. `Date.today.to_time` used to return TimeZoned values,
|
|
329
|
+
not with this gem. `Date.today.to_time` returns '2000-01-01 00:00:00 UTC'. In my mind, a date should not be time zoned.
|
|
330
|
+
I also added a `Time.date` method that returns the date with the time stripped off. The time will be converted to UTC
|
|
331
|
+
first and then a date in UTC is returned. So '2000-01-01 22:00:00 -0500'.date == '2000-01-02 00:00:00 UTC'.
|
|
332
|
+
|
|
333
|
+
The `Time.utc_parse` static method is a parser capable of parsing either Y-M-D or M/D/Y dates, supports AM/PM values and time
|
|
334
|
+
zone offsets. The returned time is always UTC.
|
|
335
|
+
|
|
336
|
+
The `Time.as_utc` method strips the time zone info from a time and simply returns a UTC time with the same raw values.
|
|
337
|
+
This can be useful in some instances, but unlike other methods the returned value does not equal the source value unless
|
|
338
|
+
the source value was also in UTC.
|
|
339
|
+
|
|
340
|
+
So, that's all great, but what about the real crux: ActiveRecord. Well, it actually wasn't too hard. After tracing my
|
|
341
|
+
way through the ActiveRecord::Base class, and looking at the included modules, it became clear where I needed to make
|
|
342
|
+
a change. ActiveRecord::Base includes the TimeZoneConversion module. I wrote up the UtcConversion module to replace
|
|
343
|
+
and disable the TimeZoneConversion module, and then included it into ActiveRecord::Base. The UtcConverter class used
|
|
344
|
+
to convert :datetime values simply runs all values past Time.utc_parse.
|
|
345
|
+
|
|
346
|
+
So what does all of this do for me? All handling of dates and times is done in UTC, _as it should be_. This avoids
|
|
347
|
+
mistakes due to time zone offsets and only adds one level of hinderance. If you want to show the user a localtime,
|
|
348
|
+
you have to call the `in_time_zone` method on the time value. This will return a Rails TimeWithZone under your
|
|
349
|
+
configured time zone, which you can then display to the user.
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
## Contributing
|
|
356
|
+
|
|
357
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/barkerest/barkest_core.
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
## License
|
|
361
|
+
|
|
362
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
|
363
|
+
|
|
364
|
+
Copyright (c) 2016 [Beau Barker](mailto:beau@barkerest.com)
|