qwester 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +29 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/qwester/application.js +15 -0
- data/app/assets/stylesheets/qwester/application.css +13 -0
- data/app/controllers/qwester/application_controller.rb +4 -0
- data/app/helpers/qwester/application_helper.rb +4 -0
- data/app/models/qwester/answer.rb +44 -0
- data/app/models/qwester/answer_store.rb +38 -0
- data/app/models/qwester/question.rb +36 -0
- data/app/models/qwester/questionnaire.rb +77 -0
- data/app/models/qwester/questionnaires_question.rb +10 -0
- data/app/models/qwester/rule_set.rb +81 -0
- data/app/views/layouts/qwester/application.html.erb +14 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20121008151526_create_questions.rb +13 -0
- data/db/migrate/20121008152106_create_answers.rb +9 -0
- data/db/migrate/20121008153758_create_rule_sets.rb +15 -0
- data/db/migrate/20121009080219_create_questionnaires.rb +14 -0
- data/db/migrate/20121009095600_create_answer_stores.rb +13 -0
- data/db/migrate/20121009160807_add_questionnaire_id_to_answers.rb +5 -0
- data/db/migrate/20121009161206_change_answers_value_to_string.rb +9 -0
- data/db/migrate/20121019111051_add_button_image_to_questionnaires.rb +7 -0
- data/db/migrate/20121114084347_create_ckeditor_assets.rb +26 -0
- data/db/migrate/20121115114408_add_ref_to_questions.rb +5 -0
- data/db/migrate/20121120092108_add_ids_to_questionnaires_questions.rb +25 -0
- data/db/migrate/20121122130930_add_cope_index_and_position_to_answers.rb +6 -0
- data/db/migrate/20121122141628_remove_questionnaire_from_answer.rb +9 -0
- data/db/migrate/20121126152146_add_rule_to_rule_sets.rb +5 -0
- data/db/migrate/20121203150555_add_multi_answer_to_questions.rb +5 -0
- data/db/migrate/20121204082213_create_answer_stores_questionnaires.rb +10 -0
- data/db/migrate/20121204100803_add_link_text_to_rule_sets.rb +5 -0
- data/lib/active_admin/admin/answers.rb +73 -0
- data/lib/active_admin/admin/questionnaires.rb +76 -0
- data/lib/active_admin/admin/questions.rb +74 -0
- data/lib/active_admin/admin/rule_sets.rb +176 -0
- data/lib/qwester/engine.rb +5 -0
- data/lib/qwester/version.rb +3 -0
- data/lib/qwester.rb +26 -0
- data/lib/random_string.rb +20 -0
- data/lib/tasks/qwester_tasks.rake +28 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/admin/admin_user.rb +21 -0
- data/test/dummy/app/admin/dashboard.rb +33 -0
- data/test/dummy/app/assets/javascripts/active_admin.js +25 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/active_admin.css.scss +92 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/admin_user.rb +20 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/active_admin.rb +160 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/devise.rb +240 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/qwester.rb +2 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/devise.en.yml +60 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +9 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130110115938_devise_create_admin_users.rb +47 -0
- data/test/dummy/db/migrate/20130110115940_create_admin_comments.rb +17 -0
- data/test/dummy/db/migrate/20130111112924_create_questions.qwester.rb +14 -0
- data/test/dummy/db/migrate/20130111112925_create_answers.qwester.rb +10 -0
- data/test/dummy/db/migrate/20130111112926_create_rule_sets.qwester.rb +16 -0
- data/test/dummy/db/migrate/20130111112927_create_questionnaires.qwester.rb +15 -0
- data/test/dummy/db/migrate/20130111112928_create_answer_stores.qwester.rb +14 -0
- data/test/dummy/db/migrate/20130111112929_add_questionnaire_id_to_answers.qwester.rb +6 -0
- data/test/dummy/db/migrate/20130111112930_change_answers_value_to_string.qwester.rb +10 -0
- data/test/dummy/db/migrate/20130111112931_add_button_image_to_questionnaires.qwester.rb +8 -0
- data/test/dummy/db/migrate/20130111112932_create_ckeditor_assets.qwester.rb +27 -0
- data/test/dummy/db/migrate/20130111112933_add_ref_to_questions.qwester.rb +6 -0
- data/test/dummy/db/migrate/20130111112934_add_cope_index_and_position_to_answers.qwester.rb +7 -0
- data/test/dummy/db/migrate/20130111112935_remove_questionnaire_from_answer.qwester.rb +10 -0
- data/test/dummy/db/migrate/20130111112936_add_rule_to_rule_sets.qwester.rb +6 -0
- data/test/dummy/db/migrate/20130111112937_add_multi_answer_to_questions.qwester.rb +6 -0
- data/test/dummy/db/migrate/20130111112938_create_answer_stores_questionnaires.qwester.rb +11 -0
- data/test/dummy/db/migrate/20130111112939_add_link_text_to_rule_sets.qwester.rb +6 -0
- data/test/dummy/db/migrate/20130111121500_add_ids_to_questionnaires_questions.qwester.rb +26 -0
- data/test/dummy/db/schema.rb +136 -0
- data/test/dummy/db/seeds.rb +15 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +30161 -0
- data/test/dummy/log/test.log +27080 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/link/NewGitGui.png +0 -0
- data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/original/NewGitGui.png +0 -0
- data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/thumbnail/NewGitGui.png +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/admin_users.yml +5 -0
- data/test/dummy/test/fixtures/qwester/answer_stores.yml +4 -0
- data/test/dummy/test/fixtures/qwester/answers.yml +11 -0
- data/test/dummy/test/fixtures/qwester/questionnaires.yml +8 -0
- data/test/dummy/test/fixtures/qwester/questionnaires_questions.yml +5 -0
- data/test/dummy/test/fixtures/qwester/questions.yml +8 -0
- data/test/dummy/test/fixtures/qwester/rule_sets.yml +5 -0
- data/test/dummy/test/unit/admin_user_test.rb +9 -0
- data/test/dummy/tmp/cache/assets/C4C/010/sprockets%2F54b8f935fa0154a496735945134b201c +0 -0
- data/test/dummy/tmp/cache/assets/C6B/340/sprockets%2Fac675153e3c112d081881cb5b0193343 +0 -0
- data/test/dummy/tmp/cache/assets/C98/130/sprockets%2Fac989787df92df5f053582229580052f +0 -0
- data/test/dummy/tmp/cache/assets/C9F/BF0/sprockets%2F74327e193051ca314d7f40d949aa0f01 +0 -0
- data/test/dummy/tmp/cache/assets/CB3/400/sprockets%2F0778280cf7cd9842623b4a47c3636eb0 +0 -0
- data/test/dummy/tmp/cache/assets/CB3/7B0/sprockets%2F8acda6f91309162736a905e927b791b0 +0 -0
- data/test/dummy/tmp/cache/assets/CB7/210/sprockets%2Fd75d7926600f009b7bc12f299575af61 +0 -0
- data/test/dummy/tmp/cache/assets/CBE/9C0/sprockets%2F21d85716322c5b339f859cc7d9517b6e +0 -0
- data/test/dummy/tmp/cache/assets/CC9/6B0/sprockets%2F3df521832967357b1c7b16678fc8e8f7 +0 -0
- data/test/dummy/tmp/cache/assets/CC9/FB0/sprockets%2F255d9f63b60b2f99705d9ece86410996 +0 -0
- data/test/dummy/tmp/cache/assets/CD6/AE0/sprockets%2F18183d077906f0468bdaa021e5944daa +0 -0
- data/test/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
- data/test/dummy/tmp/cache/assets/CE4/280/sprockets%2F99d4bf693c83b5093ab8702160c1d6e5 +0 -0
- data/test/dummy/tmp/cache/assets/CF4/190/sprockets%2F15945979ce0f558e72219220cdf8e5ee +0 -0
- data/test/dummy/tmp/cache/assets/D16/CB0/sprockets%2Fb0e226708d5f9958bbaf5639fd402e50 +0 -0
- data/test/dummy/tmp/cache/assets/D18/9A0/sprockets%2F790d9164fe7b9cb772271a0e2ddf2646 +0 -0
- data/test/dummy/tmp/cache/assets/D1C/6A0/sprockets%2F39f774b8adbce198362541931e4e80fc +0 -0
- data/test/dummy/tmp/cache/assets/D22/7F0/sprockets%2Fb0746263298bc88dffc3faa791d44786 +0 -0
- data/test/dummy/tmp/cache/assets/D25/BA0/sprockets%2F0fa25091225221bc828ca4abb28cb5c8 +0 -0
- data/test/dummy/tmp/cache/assets/D33/D50/sprockets%2Ff8d0dac22223755ab4bae6c44180e829 +0 -0
- data/test/dummy/tmp/cache/assets/D36/C80/sprockets%2Ff5ef17012cd57c01767028aba0593fcf +0 -0
- data/test/dummy/tmp/cache/assets/D37/F40/sprockets%2F34ae0821bc15772a27ca08fc3682fe7d +0 -0
- data/test/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
- data/test/dummy/tmp/cache/assets/D3E/330/sprockets%2F45f2fada4467c9ac38a41d9463b822c4 +0 -0
- data/test/dummy/tmp/cache/assets/D3F/EB0/sprockets%2Fad2888184b513b29cc27bda05be8c396 +0 -0
- data/test/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
- data/test/dummy/tmp/cache/assets/D4A/310/sprockets%2Fdd19e98ed3ea33cd27397508b0e34e74 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D4F/930/sprockets%2F593ef7a6dd9e164ce9156637a079eba2 +0 -0
- data/test/dummy/tmp/cache/assets/D52/2B0/sprockets%2Fcaba6996d3b0ce9425a2d4918e6e8797 +0 -0
- data/test/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
- data/test/dummy/tmp/cache/assets/D61/190/sprockets%2Faece940f39e2ac68033f05b15fe10c16 +0 -0
- data/test/dummy/tmp/cache/assets/D61/6B0/sprockets%2F5f51d0141dcc429477e6169aabb1f2ad +0 -0
- data/test/dummy/tmp/cache/assets/D63/760/sprockets%2F03bf27ec3f65ed19bc131123a59b3d6f +0 -0
- data/test/dummy/tmp/cache/assets/D64/6D0/sprockets%2Fefc35e335323b974c3e1bbbb13693ea4 +0 -0
- data/test/dummy/tmp/cache/assets/D66/3A0/sprockets%2F02491a6027da7d0caa9c2282fd3f7e6f +0 -0
- data/test/dummy/tmp/cache/assets/D69/E90/sprockets%2F14aed5aa2792db4162f05688f04dfa5e +0 -0
- data/test/dummy/tmp/cache/assets/D6C/5B0/sprockets%2F4cd5cd94a5b8ce62e7635a63df0103e5 +0 -0
- data/test/dummy/tmp/cache/assets/D6E/160/sprockets%2F589e06b575fdb89ccc10373f40ba2bf3 +0 -0
- data/test/dummy/tmp/cache/assets/D76/CB0/sprockets%2Fbcaf3567253694bc09a79858c7bdad2a +0 -0
- data/test/dummy/tmp/cache/assets/D81/D40/sprockets%2Faa5b982ce995ea3c817a93f8c847a52e +0 -0
- data/test/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
- data/test/dummy/tmp/cache/assets/D9E/BC0/sprockets%2F92b1852c4b3d97cf5a18fb9b171cdc3d +0 -0
- data/test/dummy/tmp/cache/assets/DA3/9B0/sprockets%2Fa2bdb6a97d41e3cca6465c59cd5929b5 +0 -0
- data/test/dummy/tmp/cache/assets/DA9/B40/sprockets%2Ff028f8a00eb67fbe213ef8fce8c97218 +0 -0
- data/test/dummy/tmp/cache/assets/DB3/6A0/sprockets%2F5fbfb11cd54686a98ffe386339a9ddc4 +0 -0
- data/test/dummy/tmp/cache/assets/DDA/830/sprockets%2Fde697cb19a97c9cdda00773d54e43ded +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
- data/test/dummy/tmp/cache/assets/DFD/E80/sprockets%2Fb6ba4f337e14c4942a8e68bfaed03bff +0 -0
- data/test/dummy/tmp/cache/assets/E03/CE0/sprockets%2Fee7fdb52ea0ff7e5426102ee68beeb47 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E31/7C0/sprockets%2F306cef7b76fd0633afd6eecde15d7ab7 +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_all.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_buttons.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_gradients.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_icons.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_reset.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_rounded.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_sections.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_shadows.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_typography.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_variables.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_compact.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_deprecated-webkit-gradient.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_flex-grid.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_grid-width.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_linear-gradient.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_modular-scale.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_radial-gradient.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_render-gradients.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_tint-shade.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_transition-property-name.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_button.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_font-family.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_html5-input-types.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_position.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_prefixer.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_timing-functions.scssc +0 -0
- data/test/dummy/tmp/cache/sass/2fd9c76d84cefb666046113b053d85103e19230b/active_admin.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_batch_actions.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_blank_slates.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_columns.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_comments.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_date_picker.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_dropdown_menu.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_flash_messages.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_links.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_popovers.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_scopes.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_status_tags.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_table_tools.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_tables.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/6d829b1892146f93bc53d024914f97a49c36b400/_bourbon-deprecated-upcoming.scssc +0 -0
- data/test/dummy/tmp/cache/sass/6d829b1892146f93bc53d024914f97a49c36b400/_bourbon.scssc +0 -0
- data/test/dummy/tmp/cache/sass/c7c7191f5bd579910d0a21a37cd1dab835baea9d/_dashboard.scssc +0 -0
- data/test/dummy/tmp/cache/sass/c7c7191f5bd579910d0a21a37cd1dab835baea9d/_logged_out.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_animation.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_appearance.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background-image.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background-size.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_border-image.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_box-shadow.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_box-sizing.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_columns.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_flex-box.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_font-face.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_hidpi-media-query.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_image-rendering.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_inline-block.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_linear-gradient.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_perspective.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_radial-gradient.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_transform.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_transition.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_user-select.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_footer.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_main_structure.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_title_bar.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_base.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_forms.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_header.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_mixins.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_typography.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/print.css.scssc +0 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +21 -0
- data/test/unit/qwester/answer_store_test.rb +49 -0
- data/test/unit/qwester/answer_test.rb +47 -0
- data/test/unit/qwester/question_test.rb +42 -0
- data/test/unit/qwester/questionnaire_test.rb +18 -0
- data/test/unit/qwester/questionnaires_question_test.rb +62 -0
- data/test/unit/qwester/rule_set_test.rb +134 -0
- data/test/unit/qwester_test.rb +33 -0
- metadata +617 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
module Qwester
|
2
|
+
|
3
|
+
ActiveAdmin.register Answer do
|
4
|
+
|
5
|
+
menu_label = 'Answers'
|
6
|
+
menu_label = "Qwester #{menu_label}" unless Qwester.active_admin_menu
|
7
|
+
menu :parent => Qwester.active_admin_menu, :label => menu_label
|
8
|
+
|
9
|
+
actions :all, :except => [:edit]
|
10
|
+
|
11
|
+
index do
|
12
|
+
column :id
|
13
|
+
column :value
|
14
|
+
column 'Question (edit answer via question)', :question do |answer|
|
15
|
+
link_to(answer.question.title, edit_admin_qwester_question_path(answer.question)) if answer.question
|
16
|
+
end
|
17
|
+
column :position
|
18
|
+
column :cope_index
|
19
|
+
default_actions
|
20
|
+
end
|
21
|
+
|
22
|
+
member_action :move_up do
|
23
|
+
answer = Answer.find(params[:id])
|
24
|
+
answer.move_higher
|
25
|
+
redirect_to admin_qwester_question_path(answer.question)
|
26
|
+
end
|
27
|
+
|
28
|
+
member_action :move_down do
|
29
|
+
answer = Answer.find(params[:id])
|
30
|
+
answer.move_lower
|
31
|
+
redirect_to admin_qwester_question_path(answer.question)
|
32
|
+
end
|
33
|
+
|
34
|
+
member_action :remove do
|
35
|
+
answer = Answer.find(params[:id])
|
36
|
+
answer.destroy
|
37
|
+
redirect_to admin_qwester_question_path(answer.question)
|
38
|
+
end
|
39
|
+
|
40
|
+
# controller do
|
41
|
+
#
|
42
|
+
# before_filter :get_question_and_answer, :only => [:move_up, :move_down, :remove]
|
43
|
+
#
|
44
|
+
|
45
|
+
|
46
|
+
#
|
47
|
+
# def add
|
48
|
+
# answer = Answer.find(params[:id])
|
49
|
+
# @rule_set = RuleSet.find(params[:rule_set_id])
|
50
|
+
# @rule_set.answers << answer
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# def delete
|
54
|
+
# answer = Answer.find(params[:id])
|
55
|
+
# @rule_set = RuleSet.find(params[:rule_set_id])
|
56
|
+
# @rule_set.answers.delete(answer)
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# private
|
60
|
+
# def get_question_and_answer
|
61
|
+
# @answer = Answer.find(params[:id])
|
62
|
+
# @question = Question.find(params[:question_id])
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# def redirect_to_answer_show
|
66
|
+
# redirect_to admin_question_path(@question)
|
67
|
+
# end
|
68
|
+
#
|
69
|
+
# end
|
70
|
+
|
71
|
+
end if defined?(ActiveAdmin)
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Qwester
|
2
|
+
|
3
|
+
ActiveAdmin.register Questionnaire do
|
4
|
+
|
5
|
+
menu_label = 'Questionnaires'
|
6
|
+
menu_label = "Qwester #{menu_label}" unless Qwester.active_admin_menu
|
7
|
+
menu :parent => Qwester.active_admin_menu, :label => menu_label
|
8
|
+
|
9
|
+
index do
|
10
|
+
column :image do |questionnaire|
|
11
|
+
image_tag(questionnaire.button_image.url(:thumbnail))
|
12
|
+
end
|
13
|
+
column :title
|
14
|
+
column :questions do |questionnaire|
|
15
|
+
questionnaire.questions.count
|
16
|
+
end
|
17
|
+
default_actions
|
18
|
+
end
|
19
|
+
|
20
|
+
form do |f|
|
21
|
+
f.inputs "Details" do
|
22
|
+
f.input :title
|
23
|
+
if defined?(Ckeditor)
|
24
|
+
f.input :description, :as => :ckeditor, :input_html => { :height => 100, :toolbar => 'Basic' }
|
25
|
+
else
|
26
|
+
f.input :description, :input_html => { :rows => 3}
|
27
|
+
end
|
28
|
+
f.input :button_image, :as => :file, :hint => f.template.image_tag(f.object.button_image.url(:link))
|
29
|
+
f.input :questions, :as => :check_boxes, :collection => Question.all
|
30
|
+
end
|
31
|
+
f.buttons
|
32
|
+
end
|
33
|
+
|
34
|
+
show do
|
35
|
+
div do
|
36
|
+
sanitize(qwester_questionnaire.description.html_safe ) if qwester_questionnaire.description.present?
|
37
|
+
end
|
38
|
+
|
39
|
+
div do
|
40
|
+
image_tag qwester_questionnaire.button_image.url(:link)
|
41
|
+
end
|
42
|
+
|
43
|
+
div do
|
44
|
+
h3 'Questions'
|
45
|
+
ul :id => 'question_list'
|
46
|
+
qwester_questionnaire.questions.each do |question|
|
47
|
+
li do
|
48
|
+
text = [question.title]
|
49
|
+
text << link_to('Up', move_up_admin_qwester_questionnaire_path(qwester_questionnaire, :question_id => question)) unless qwester_questionnaire.first?(question)
|
50
|
+
text << link_to('Down', move_down_admin_qwester_questionnaire_path(qwester_questionnaire, :question_id => question)) unless qwester_questionnaire.last?(question)
|
51
|
+
text.join(' ').html_safe
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
member_action :move_up do
|
58
|
+
questionnaire = Questionnaire.find(params[:id])
|
59
|
+
question = Question.find(params[:question_id])
|
60
|
+
questionnaire.move_higher(question)
|
61
|
+
redirect_to admin_qwester_questionnaire_path(questionnaire)
|
62
|
+
end
|
63
|
+
|
64
|
+
member_action :move_down do
|
65
|
+
questionnaire = Questionnaire.find(params[:id])
|
66
|
+
question = Question.find(params[:question_id])
|
67
|
+
questionnaire.move_lower(question)
|
68
|
+
redirect_to admin_qwester_questionnaire_path(questionnaire)
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
end if defined?(ActiveAdmin)
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Qwester
|
2
|
+
|
3
|
+
ActiveAdmin.register Question do
|
4
|
+
|
5
|
+
menu_label = 'Questions'
|
6
|
+
menu_label = "Qwester #{menu_label}" unless Qwester.active_admin_menu
|
7
|
+
menu :parent => Qwester.active_admin_menu, :label => menu_label
|
8
|
+
|
9
|
+
index do
|
10
|
+
column :ref
|
11
|
+
column :title do |qwester_question|
|
12
|
+
link_to(qwester_question.title, '#', :title => qwester_question.description, :class => 'no_decoration')
|
13
|
+
end
|
14
|
+
column :answers do |qwester_question|
|
15
|
+
qwester_question.answers.count
|
16
|
+
end
|
17
|
+
column :multi_answer do |qwester_question|
|
18
|
+
qwester_question.multi_answer? ? 'Any' : 'One'
|
19
|
+
end
|
20
|
+
default_actions
|
21
|
+
end
|
22
|
+
|
23
|
+
show do
|
24
|
+
para("References: #{question.ref}") if qwester_question.ref.present?
|
25
|
+
para(qwester_question.description)
|
26
|
+
h3 "Answers"
|
27
|
+
para "User can select one#{' or many' if qwester_question.multi_answer?} of:"
|
28
|
+
|
29
|
+
table :class => 'sortable_list' do
|
30
|
+
tr do
|
31
|
+
th 'Value'
|
32
|
+
end
|
33
|
+
qwester_question.answers.each do |answer|
|
34
|
+
tr do
|
35
|
+
td answer.value
|
36
|
+
td(answer.first? ? " ".html_safe : link_to('Up', move_up_admin_qwester_answer_path(answer)))
|
37
|
+
td(answer.last? ? " ".html_safe : link_to('Down', move_down_admin_qwester_answer_path(answer)))
|
38
|
+
td link_to('Delete', remove_admin_qwester_answer_path(answer), :confirm => "Are you sure you want to delete the answer '#{answer.value}'?")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
form do |f|
|
45
|
+
f.inputs "Details" do
|
46
|
+
f.input :ref, :label => 'Reference'
|
47
|
+
f.input :title
|
48
|
+
f.input :description, :input_html => { :rows => 2}
|
49
|
+
f.input :multi_answer, :label => 'User may select more than one answer to this question?'
|
50
|
+
end
|
51
|
+
|
52
|
+
f.inputs do
|
53
|
+
f.has_many :answers do |answer_form|
|
54
|
+
answer_form.input :value
|
55
|
+
answer_form.input :position
|
56
|
+
answer_form.input :cope_index
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
f.buttons
|
61
|
+
end
|
62
|
+
|
63
|
+
controller do
|
64
|
+
|
65
|
+
def new
|
66
|
+
@qwester_question = Question.new
|
67
|
+
@qwester_question.build_standard_answers
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end if defined?(ActiveAdmin)
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
module Qwester
|
2
|
+
|
3
|
+
ActiveAdmin.register RuleSet do
|
4
|
+
|
5
|
+
menu_label = 'Rule Sets'
|
6
|
+
menu_label = "Qwester #{menu_label}" unless Qwester.active_admin_menu
|
7
|
+
menu :parent => Qwester.active_admin_menu, :label => menu_label
|
8
|
+
|
9
|
+
index do
|
10
|
+
column :title
|
11
|
+
column :answers do |rule_set|
|
12
|
+
rule_set.answers.count
|
13
|
+
end
|
14
|
+
column :rule
|
15
|
+
default_actions
|
16
|
+
end
|
17
|
+
|
18
|
+
sidebar :rule_syntax do
|
19
|
+
para 'R1 = "(a1 and a2) or (a3 and a4)"'
|
20
|
+
|
21
|
+
para 'R2 = "a1 and not a2"'
|
22
|
+
|
23
|
+
para 'R3 = "2 in a1 a2 a3"'
|
24
|
+
|
25
|
+
para 'R4 = "(2 in a1 a2 a3) and (1 in a4 a5)"'
|
26
|
+
|
27
|
+
table(:class => 'small') do
|
28
|
+
tr do
|
29
|
+
th "Input"
|
30
|
+
th "R1"
|
31
|
+
th "R2"
|
32
|
+
th "R3"
|
33
|
+
th "R4"
|
34
|
+
end
|
35
|
+
tr do
|
36
|
+
th "[a1, a2]"
|
37
|
+
th "true"
|
38
|
+
th "false"
|
39
|
+
th "true"
|
40
|
+
th "false"
|
41
|
+
end
|
42
|
+
tr do
|
43
|
+
th "[a3, a4]"
|
44
|
+
th "true"
|
45
|
+
th "false"
|
46
|
+
th "false"
|
47
|
+
th "false"
|
48
|
+
end
|
49
|
+
tr do
|
50
|
+
th "[a1, a3, a5]"
|
51
|
+
th "false"
|
52
|
+
th "true"
|
53
|
+
th "true"
|
54
|
+
th "true"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
form do |f|
|
61
|
+
f.inputs "Details" do
|
62
|
+
f.input :title
|
63
|
+
if defined?(Ckeditor)
|
64
|
+
f.input :description, :as => :ckeditor, :input_html => { :height => 100, :toolbar => 'Basic' }
|
65
|
+
else
|
66
|
+
f.input :description, :input_html => { :rows => 3}
|
67
|
+
end
|
68
|
+
f.input :url
|
69
|
+
f.input :rule, :input_html => { :rows => 3}
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
f.inputs("Questions") do
|
74
|
+
|
75
|
+
if qwester_rule_set.questions.empty?
|
76
|
+
|
77
|
+
f.input(
|
78
|
+
:answers,
|
79
|
+
:as => :check_boxes,
|
80
|
+
:member_label => lambda {|a| "a#{a.id}: #{a.value} to '#{a.question.title}'"},
|
81
|
+
:input_html => { :size => 20, :multiple => true}
|
82
|
+
)
|
83
|
+
|
84
|
+
else
|
85
|
+
|
86
|
+
questions = qwester_rule_set.questions | Question.all
|
87
|
+
questions.collect! do |question|
|
88
|
+
style = 'border:#CCCCCC 1px solid;'
|
89
|
+
html = [content_tag('td', question.title, :style => style)]
|
90
|
+
answers = question.answers.collect do |answer|
|
91
|
+
answer_style = style
|
92
|
+
answer_style += 'background-color:#005C1F;color:white;font-weight:bold;' if qwester_rule_set.answers.include?(answer)
|
93
|
+
content_tag('td', "a#{answer.id} #{answer.value}".html_safe, :style => answer_style).html_safe
|
94
|
+
end
|
95
|
+
html << answers.join(" ").html_safe
|
96
|
+
content_tag('tr', html.join(" ").html_safe)
|
97
|
+
end
|
98
|
+
table_class = ["selection"]
|
99
|
+
table_class << 'associated_questions' if qwester_rule_set.id.present?
|
100
|
+
content_tag 'li', content_tag('table', questions.join("\n").html_safe, :class => table_class.join(' '))
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
f.buttons
|
107
|
+
end
|
108
|
+
|
109
|
+
show do
|
110
|
+
div do
|
111
|
+
para sanitize(qwester_rule_set.description)
|
112
|
+
end if qwester_rule_set.description.present?
|
113
|
+
|
114
|
+
div do
|
115
|
+
h3 'Target url'
|
116
|
+
para link_to qwester_rule_set.url
|
117
|
+
para qwester_rule_set.link_text? ? qwester_rule_set.link_text : 'No link text specified'
|
118
|
+
end
|
119
|
+
|
120
|
+
div do
|
121
|
+
h3 'The rule'
|
122
|
+
para qwester_rule_set.rule
|
123
|
+
end
|
124
|
+
|
125
|
+
if qwester_rule_set.matching_answer_sets.present?
|
126
|
+
div do
|
127
|
+
h3 'Sample matching answer sets'
|
128
|
+
if qwester_rule_set.matching_answer_sets.length
|
129
|
+
para "There are at least #{qwester_rule_set.matching_answer_sets.length} combinations of answers that would pass this test."
|
130
|
+
end
|
131
|
+
para 'The following combinations of answers would pass'
|
132
|
+
qwester_rule_set.matching_answer_sets.each do |answer_set|
|
133
|
+
ul :style => 'border:#CCCCCC 1px solid;padding:5px;list-style:none;' do
|
134
|
+
answer_set.each do |answer_id|
|
135
|
+
next unless Answer.exists?(answer_id)
|
136
|
+
answer = Answer.find(answer_id)
|
137
|
+
question_summary = [answer.value, answer.question.title].join(' : ')
|
138
|
+
li "(a#{answer_id}) #{question_summary}"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
else
|
144
|
+
div do
|
145
|
+
h3 'Matching answer sets'
|
146
|
+
para 'Answers will pass unless they contain a blocking answer set'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
if qwester_rule_set.blocking_answer_sets.present?
|
151
|
+
div do
|
152
|
+
h3 'Sample blocking answer sets'
|
153
|
+
para 'The following combinations of answers would not pass'
|
154
|
+
qwester_rule_set.blocking_answer_sets.each do |answer_set|
|
155
|
+
ul :style => 'border:#CCCCCC 1px solid;padding:5px;list-style:none;' do
|
156
|
+
answer_set.each do |answer_id|
|
157
|
+
next unless Answer.exists?(answer_id)
|
158
|
+
answer = Answer.find(answer_id)
|
159
|
+
question_summary = [answer.value, answer.question.title].join(' : ')
|
160
|
+
li "(a#{answer_id}) #{question_summary}"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
else
|
166
|
+
div do
|
167
|
+
h3 'Blocking answer sets'
|
168
|
+
para 'Answers will only pass if they contain a matching answer set'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end if defined?(ActiveAdmin)
|
175
|
+
|
176
|
+
end
|
data/lib/qwester.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "qwester/engine"
|
2
|
+
require 'acts_as_list'
|
3
|
+
require 'paperclip'
|
4
|
+
require 'random_string'
|
5
|
+
|
6
|
+
module Qwester
|
7
|
+
|
8
|
+
def self.active_admin_load_path
|
9
|
+
File.expand_path("active_admin/admin", File.dirname(__FILE__))
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.active_admin_menu
|
13
|
+
if @active_admin_menu == 'none'
|
14
|
+
return nil
|
15
|
+
elsif @active_admin_menu
|
16
|
+
@active_admin_menu
|
17
|
+
else
|
18
|
+
'Qwester'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.active_admin_menu=(menu)
|
23
|
+
@active_admin_menu = menu
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RandomString < String
|
2
|
+
def initialize(length = 40)
|
3
|
+
super(new_random_string(length))
|
4
|
+
end
|
5
|
+
|
6
|
+
|
7
|
+
private
|
8
|
+
def new_random_string(length = 40)
|
9
|
+
string = ""
|
10
|
+
string += random_string until string.length >= length
|
11
|
+
return string[0, length]
|
12
|
+
end
|
13
|
+
|
14
|
+
def random_string
|
15
|
+
string_pairs = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join ).scan(/.{2}/)
|
16
|
+
random_strings = string_pairs.collect{|s| s[0,1].crypt(s)}
|
17
|
+
random_string = random_strings.join
|
18
|
+
return random_string.gsub(/[^A-Za-z0-9]/, "")
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# desc "Explaining what the task does"
|
2
|
+
# task :qwester do
|
3
|
+
# # Task goes here
|
4
|
+
# end
|
5
|
+
|
6
|
+
namespace :qwester do
|
7
|
+
|
8
|
+
# Usage: rake data:reset_positions RAILS_ENV=production
|
9
|
+
desc "Goes through each of the acts_as_list objects and resets the positions based on order they were added to the database"
|
10
|
+
task :reset_positions => :environment do
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
Qwester::Questionnaire.all.each do |questionnaire|
|
15
|
+
first_id = questionnaire.questionnaires_questions.minimum(:id)
|
16
|
+
if first_id # nil if questionnaire has no questions
|
17
|
+
sql = "UPDATE qwester_questionnaires_questions SET position = (1 + id - #{first_id}) WHERE questionnaire_id = #{questionnaire.id};"
|
18
|
+
ActiveRecord::Base.connection.execute sql
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
puts "Positions reset"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|