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