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.
Files changed (259) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +29 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/qwester/application.js +15 -0
  5. data/app/assets/stylesheets/qwester/application.css +13 -0
  6. data/app/controllers/qwester/application_controller.rb +4 -0
  7. data/app/helpers/qwester/application_helper.rb +4 -0
  8. data/app/models/qwester/answer.rb +44 -0
  9. data/app/models/qwester/answer_store.rb +38 -0
  10. data/app/models/qwester/question.rb +36 -0
  11. data/app/models/qwester/questionnaire.rb +77 -0
  12. data/app/models/qwester/questionnaires_question.rb +10 -0
  13. data/app/models/qwester/rule_set.rb +81 -0
  14. data/app/views/layouts/qwester/application.html.erb +14 -0
  15. data/config/routes.rb +2 -0
  16. data/db/migrate/20121008151526_create_questions.rb +13 -0
  17. data/db/migrate/20121008152106_create_answers.rb +9 -0
  18. data/db/migrate/20121008153758_create_rule_sets.rb +15 -0
  19. data/db/migrate/20121009080219_create_questionnaires.rb +14 -0
  20. data/db/migrate/20121009095600_create_answer_stores.rb +13 -0
  21. data/db/migrate/20121009160807_add_questionnaire_id_to_answers.rb +5 -0
  22. data/db/migrate/20121009161206_change_answers_value_to_string.rb +9 -0
  23. data/db/migrate/20121019111051_add_button_image_to_questionnaires.rb +7 -0
  24. data/db/migrate/20121114084347_create_ckeditor_assets.rb +26 -0
  25. data/db/migrate/20121115114408_add_ref_to_questions.rb +5 -0
  26. data/db/migrate/20121120092108_add_ids_to_questionnaires_questions.rb +25 -0
  27. data/db/migrate/20121122130930_add_cope_index_and_position_to_answers.rb +6 -0
  28. data/db/migrate/20121122141628_remove_questionnaire_from_answer.rb +9 -0
  29. data/db/migrate/20121126152146_add_rule_to_rule_sets.rb +5 -0
  30. data/db/migrate/20121203150555_add_multi_answer_to_questions.rb +5 -0
  31. data/db/migrate/20121204082213_create_answer_stores_questionnaires.rb +10 -0
  32. data/db/migrate/20121204100803_add_link_text_to_rule_sets.rb +5 -0
  33. data/lib/active_admin/admin/answers.rb +73 -0
  34. data/lib/active_admin/admin/questionnaires.rb +76 -0
  35. data/lib/active_admin/admin/questions.rb +74 -0
  36. data/lib/active_admin/admin/rule_sets.rb +176 -0
  37. data/lib/qwester/engine.rb +5 -0
  38. data/lib/qwester/version.rb +3 -0
  39. data/lib/qwester.rb +26 -0
  40. data/lib/random_string.rb +20 -0
  41. data/lib/tasks/qwester_tasks.rake +28 -0
  42. data/test/dummy/README.rdoc +261 -0
  43. data/test/dummy/Rakefile +7 -0
  44. data/test/dummy/app/admin/admin_user.rb +21 -0
  45. data/test/dummy/app/admin/dashboard.rb +33 -0
  46. data/test/dummy/app/assets/javascripts/active_admin.js +25 -0
  47. data/test/dummy/app/assets/javascripts/application.js +15 -0
  48. data/test/dummy/app/assets/stylesheets/active_admin.css.scss +92 -0
  49. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  50. data/test/dummy/app/controllers/application_controller.rb +3 -0
  51. data/test/dummy/app/helpers/application_helper.rb +2 -0
  52. data/test/dummy/app/models/admin_user.rb +20 -0
  53. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  54. data/test/dummy/config/application.rb +59 -0
  55. data/test/dummy/config/boot.rb +10 -0
  56. data/test/dummy/config/database.yml +25 -0
  57. data/test/dummy/config/environment.rb +5 -0
  58. data/test/dummy/config/environments/development.rb +37 -0
  59. data/test/dummy/config/environments/production.rb +67 -0
  60. data/test/dummy/config/environments/test.rb +37 -0
  61. data/test/dummy/config/initializers/active_admin.rb +160 -0
  62. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  63. data/test/dummy/config/initializers/devise.rb +240 -0
  64. data/test/dummy/config/initializers/inflections.rb +15 -0
  65. data/test/dummy/config/initializers/mime_types.rb +5 -0
  66. data/test/dummy/config/initializers/qwester.rb +2 -0
  67. data/test/dummy/config/initializers/secret_token.rb +7 -0
  68. data/test/dummy/config/initializers/session_store.rb +8 -0
  69. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  70. data/test/dummy/config/locales/devise.en.yml +60 -0
  71. data/test/dummy/config/locales/en.yml +5 -0
  72. data/test/dummy/config/routes.rb +9 -0
  73. data/test/dummy/config.ru +4 -0
  74. data/test/dummy/db/development.sqlite3 +0 -0
  75. data/test/dummy/db/migrate/20130110115938_devise_create_admin_users.rb +47 -0
  76. data/test/dummy/db/migrate/20130110115940_create_admin_comments.rb +17 -0
  77. data/test/dummy/db/migrate/20130111112924_create_questions.qwester.rb +14 -0
  78. data/test/dummy/db/migrate/20130111112925_create_answers.qwester.rb +10 -0
  79. data/test/dummy/db/migrate/20130111112926_create_rule_sets.qwester.rb +16 -0
  80. data/test/dummy/db/migrate/20130111112927_create_questionnaires.qwester.rb +15 -0
  81. data/test/dummy/db/migrate/20130111112928_create_answer_stores.qwester.rb +14 -0
  82. data/test/dummy/db/migrate/20130111112929_add_questionnaire_id_to_answers.qwester.rb +6 -0
  83. data/test/dummy/db/migrate/20130111112930_change_answers_value_to_string.qwester.rb +10 -0
  84. data/test/dummy/db/migrate/20130111112931_add_button_image_to_questionnaires.qwester.rb +8 -0
  85. data/test/dummy/db/migrate/20130111112932_create_ckeditor_assets.qwester.rb +27 -0
  86. data/test/dummy/db/migrate/20130111112933_add_ref_to_questions.qwester.rb +6 -0
  87. data/test/dummy/db/migrate/20130111112934_add_cope_index_and_position_to_answers.qwester.rb +7 -0
  88. data/test/dummy/db/migrate/20130111112935_remove_questionnaire_from_answer.qwester.rb +10 -0
  89. data/test/dummy/db/migrate/20130111112936_add_rule_to_rule_sets.qwester.rb +6 -0
  90. data/test/dummy/db/migrate/20130111112937_add_multi_answer_to_questions.qwester.rb +6 -0
  91. data/test/dummy/db/migrate/20130111112938_create_answer_stores_questionnaires.qwester.rb +11 -0
  92. data/test/dummy/db/migrate/20130111112939_add_link_text_to_rule_sets.qwester.rb +6 -0
  93. data/test/dummy/db/migrate/20130111121500_add_ids_to_questionnaires_questions.qwester.rb +26 -0
  94. data/test/dummy/db/schema.rb +136 -0
  95. data/test/dummy/db/seeds.rb +15 -0
  96. data/test/dummy/db/test.sqlite3 +0 -0
  97. data/test/dummy/log/development.log +30161 -0
  98. data/test/dummy/log/test.log +27080 -0
  99. data/test/dummy/public/404.html +26 -0
  100. data/test/dummy/public/422.html +26 -0
  101. data/test/dummy/public/500.html +25 -0
  102. data/test/dummy/public/favicon.ico +0 -0
  103. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/link/NewGitGui.png +0 -0
  104. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/original/NewGitGui.png +0 -0
  105. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/thumbnail/NewGitGui.png +0 -0
  106. data/test/dummy/script/rails +6 -0
  107. data/test/dummy/test/fixtures/admin_users.yml +5 -0
  108. data/test/dummy/test/fixtures/qwester/answer_stores.yml +4 -0
  109. data/test/dummy/test/fixtures/qwester/answers.yml +11 -0
  110. data/test/dummy/test/fixtures/qwester/questionnaires.yml +8 -0
  111. data/test/dummy/test/fixtures/qwester/questionnaires_questions.yml +5 -0
  112. data/test/dummy/test/fixtures/qwester/questions.yml +8 -0
  113. data/test/dummy/test/fixtures/qwester/rule_sets.yml +5 -0
  114. data/test/dummy/test/unit/admin_user_test.rb +9 -0
  115. data/test/dummy/tmp/cache/assets/C4C/010/sprockets%2F54b8f935fa0154a496735945134b201c +0 -0
  116. data/test/dummy/tmp/cache/assets/C6B/340/sprockets%2Fac675153e3c112d081881cb5b0193343 +0 -0
  117. data/test/dummy/tmp/cache/assets/C98/130/sprockets%2Fac989787df92df5f053582229580052f +0 -0
  118. data/test/dummy/tmp/cache/assets/C9F/BF0/sprockets%2F74327e193051ca314d7f40d949aa0f01 +0 -0
  119. data/test/dummy/tmp/cache/assets/CB3/400/sprockets%2F0778280cf7cd9842623b4a47c3636eb0 +0 -0
  120. data/test/dummy/tmp/cache/assets/CB3/7B0/sprockets%2F8acda6f91309162736a905e927b791b0 +0 -0
  121. data/test/dummy/tmp/cache/assets/CB7/210/sprockets%2Fd75d7926600f009b7bc12f299575af61 +0 -0
  122. data/test/dummy/tmp/cache/assets/CBE/9C0/sprockets%2F21d85716322c5b339f859cc7d9517b6e +0 -0
  123. data/test/dummy/tmp/cache/assets/CC9/6B0/sprockets%2F3df521832967357b1c7b16678fc8e8f7 +0 -0
  124. data/test/dummy/tmp/cache/assets/CC9/FB0/sprockets%2F255d9f63b60b2f99705d9ece86410996 +0 -0
  125. data/test/dummy/tmp/cache/assets/CD6/AE0/sprockets%2F18183d077906f0468bdaa021e5944daa +0 -0
  126. data/test/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
  127. data/test/dummy/tmp/cache/assets/CE4/280/sprockets%2F99d4bf693c83b5093ab8702160c1d6e5 +0 -0
  128. data/test/dummy/tmp/cache/assets/CF4/190/sprockets%2F15945979ce0f558e72219220cdf8e5ee +0 -0
  129. data/test/dummy/tmp/cache/assets/D16/CB0/sprockets%2Fb0e226708d5f9958bbaf5639fd402e50 +0 -0
  130. data/test/dummy/tmp/cache/assets/D18/9A0/sprockets%2F790d9164fe7b9cb772271a0e2ddf2646 +0 -0
  131. data/test/dummy/tmp/cache/assets/D1C/6A0/sprockets%2F39f774b8adbce198362541931e4e80fc +0 -0
  132. data/test/dummy/tmp/cache/assets/D22/7F0/sprockets%2Fb0746263298bc88dffc3faa791d44786 +0 -0
  133. data/test/dummy/tmp/cache/assets/D25/BA0/sprockets%2F0fa25091225221bc828ca4abb28cb5c8 +0 -0
  134. data/test/dummy/tmp/cache/assets/D33/D50/sprockets%2Ff8d0dac22223755ab4bae6c44180e829 +0 -0
  135. data/test/dummy/tmp/cache/assets/D36/C80/sprockets%2Ff5ef17012cd57c01767028aba0593fcf +0 -0
  136. data/test/dummy/tmp/cache/assets/D37/F40/sprockets%2F34ae0821bc15772a27ca08fc3682fe7d +0 -0
  137. data/test/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
  138. data/test/dummy/tmp/cache/assets/D3E/330/sprockets%2F45f2fada4467c9ac38a41d9463b822c4 +0 -0
  139. data/test/dummy/tmp/cache/assets/D3F/EB0/sprockets%2Fad2888184b513b29cc27bda05be8c396 +0 -0
  140. data/test/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
  141. data/test/dummy/tmp/cache/assets/D4A/310/sprockets%2Fdd19e98ed3ea33cd27397508b0e34e74 +0 -0
  142. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  143. data/test/dummy/tmp/cache/assets/D4F/930/sprockets%2F593ef7a6dd9e164ce9156637a079eba2 +0 -0
  144. data/test/dummy/tmp/cache/assets/D52/2B0/sprockets%2Fcaba6996d3b0ce9425a2d4918e6e8797 +0 -0
  145. data/test/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
  146. data/test/dummy/tmp/cache/assets/D61/190/sprockets%2Faece940f39e2ac68033f05b15fe10c16 +0 -0
  147. data/test/dummy/tmp/cache/assets/D61/6B0/sprockets%2F5f51d0141dcc429477e6169aabb1f2ad +0 -0
  148. data/test/dummy/tmp/cache/assets/D63/760/sprockets%2F03bf27ec3f65ed19bc131123a59b3d6f +0 -0
  149. data/test/dummy/tmp/cache/assets/D64/6D0/sprockets%2Fefc35e335323b974c3e1bbbb13693ea4 +0 -0
  150. data/test/dummy/tmp/cache/assets/D66/3A0/sprockets%2F02491a6027da7d0caa9c2282fd3f7e6f +0 -0
  151. data/test/dummy/tmp/cache/assets/D69/E90/sprockets%2F14aed5aa2792db4162f05688f04dfa5e +0 -0
  152. data/test/dummy/tmp/cache/assets/D6C/5B0/sprockets%2F4cd5cd94a5b8ce62e7635a63df0103e5 +0 -0
  153. data/test/dummy/tmp/cache/assets/D6E/160/sprockets%2F589e06b575fdb89ccc10373f40ba2bf3 +0 -0
  154. data/test/dummy/tmp/cache/assets/D76/CB0/sprockets%2Fbcaf3567253694bc09a79858c7bdad2a +0 -0
  155. data/test/dummy/tmp/cache/assets/D81/D40/sprockets%2Faa5b982ce995ea3c817a93f8c847a52e +0 -0
  156. data/test/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
  157. data/test/dummy/tmp/cache/assets/D9E/BC0/sprockets%2F92b1852c4b3d97cf5a18fb9b171cdc3d +0 -0
  158. data/test/dummy/tmp/cache/assets/DA3/9B0/sprockets%2Fa2bdb6a97d41e3cca6465c59cd5929b5 +0 -0
  159. data/test/dummy/tmp/cache/assets/DA9/B40/sprockets%2Ff028f8a00eb67fbe213ef8fce8c97218 +0 -0
  160. data/test/dummy/tmp/cache/assets/DB3/6A0/sprockets%2F5fbfb11cd54686a98ffe386339a9ddc4 +0 -0
  161. data/test/dummy/tmp/cache/assets/DDA/830/sprockets%2Fde697cb19a97c9cdda00773d54e43ded +0 -0
  162. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  163. data/test/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
  164. data/test/dummy/tmp/cache/assets/DFD/E80/sprockets%2Fb6ba4f337e14c4942a8e68bfaed03bff +0 -0
  165. data/test/dummy/tmp/cache/assets/E03/CE0/sprockets%2Fee7fdb52ea0ff7e5426102ee68beeb47 +0 -0
  166. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  167. data/test/dummy/tmp/cache/assets/E31/7C0/sprockets%2F306cef7b76fd0633afd6eecde15d7ab7 +0 -0
  168. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_all.css.scssc +0 -0
  169. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_buttons.css.scssc +0 -0
  170. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_gradients.css.scssc +0 -0
  171. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_icons.css.scssc +0 -0
  172. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_reset.css.scssc +0 -0
  173. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_rounded.css.scssc +0 -0
  174. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_sections.css.scssc +0 -0
  175. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_shadows.css.scssc +0 -0
  176. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_typography.scssc +0 -0
  177. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_utilities.scssc +0 -0
  178. data/test/dummy/tmp/cache/sass/1b985f49f4ef70efe7765896dd6d11dc84e592e3/_variables.css.scssc +0 -0
  179. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_compact.scssc +0 -0
  180. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_deprecated-webkit-gradient.scssc +0 -0
  181. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_flex-grid.scssc +0 -0
  182. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_grid-width.scssc +0 -0
  183. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_linear-gradient.scssc +0 -0
  184. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_modular-scale.scssc +0 -0
  185. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_radial-gradient.scssc +0 -0
  186. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_render-gradients.scssc +0 -0
  187. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_tint-shade.scssc +0 -0
  188. data/test/dummy/tmp/cache/sass/2355fa6dab0aa429d9df289512dc0da905fd8dbf/_transition-property-name.scssc +0 -0
  189. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_button.scssc +0 -0
  190. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_clearfix.scssc +0 -0
  191. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_font-family.scssc +0 -0
  192. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_hide-text.scssc +0 -0
  193. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_html5-input-types.scssc +0 -0
  194. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_position.scssc +0 -0
  195. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_prefixer.scssc +0 -0
  196. data/test/dummy/tmp/cache/sass/2abdd63474180b8efbb2fe4a96c7d4e58de1b07d/_timing-functions.scssc +0 -0
  197. data/test/dummy/tmp/cache/sass/2fd9c76d84cefb666046113b053d85103e19230b/active_admin.css.scssc +0 -0
  198. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_batch_actions.css.scssc +0 -0
  199. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_blank_slates.scssc +0 -0
  200. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_breadcrumbs.scssc +0 -0
  201. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_buttons.scssc +0 -0
  202. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_columns.scssc +0 -0
  203. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_comments.css.scssc +0 -0
  204. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_date_picker.css.scssc +0 -0
  205. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_dropdown_menu.scssc +0 -0
  206. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_flash_messages.css.scssc +0 -0
  207. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_grid.scssc +0 -0
  208. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_links.scssc +0 -0
  209. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_pagination.scssc +0 -0
  210. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_panels.scssc +0 -0
  211. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_popovers.css.scssc +0 -0
  212. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_scopes.scssc +0 -0
  213. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_status_tags.scssc +0 -0
  214. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_table_tools.css.scssc +0 -0
  215. data/test/dummy/tmp/cache/sass/42367c0b8e97cd09844c3165386e8db541b5d479/_tables.css.scssc +0 -0
  216. data/test/dummy/tmp/cache/sass/6d829b1892146f93bc53d024914f97a49c36b400/_bourbon-deprecated-upcoming.scssc +0 -0
  217. data/test/dummy/tmp/cache/sass/6d829b1892146f93bc53d024914f97a49c36b400/_bourbon.scssc +0 -0
  218. data/test/dummy/tmp/cache/sass/c7c7191f5bd579910d0a21a37cd1dab835baea9d/_dashboard.scssc +0 -0
  219. data/test/dummy/tmp/cache/sass/c7c7191f5bd579910d0a21a37cd1dab835baea9d/_logged_out.scssc +0 -0
  220. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_animation.scssc +0 -0
  221. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_appearance.scssc +0 -0
  222. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background-image.scssc +0 -0
  223. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background-size.scssc +0 -0
  224. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_background.scssc +0 -0
  225. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_border-image.scssc +0 -0
  226. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_border-radius.scssc +0 -0
  227. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_box-shadow.scssc +0 -0
  228. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_box-sizing.scssc +0 -0
  229. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_columns.scssc +0 -0
  230. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_flex-box.scssc +0 -0
  231. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_font-face.scssc +0 -0
  232. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_hidpi-media-query.scssc +0 -0
  233. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_image-rendering.scssc +0 -0
  234. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_inline-block.scssc +0 -0
  235. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_linear-gradient.scssc +0 -0
  236. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_perspective.scssc +0 -0
  237. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_radial-gradient.scssc +0 -0
  238. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_transform.scssc +0 -0
  239. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_transition.scssc +0 -0
  240. data/test/dummy/tmp/cache/sass/d58df6bafe26696bc29be9546a2c3f69fc2cbc33/_user-select.scssc +0 -0
  241. data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_footer.scssc +0 -0
  242. data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_main_structure.scssc +0 -0
  243. data/test/dummy/tmp/cache/sass/d883993f4a35b9fb9fb68f2951234bfae10b809e/_title_bar.scssc +0 -0
  244. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_base.css.scssc +0 -0
  245. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_forms.css.scssc +0 -0
  246. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_header.css.scssc +0 -0
  247. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_mixins.css.scssc +0 -0
  248. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/_typography.css.scssc +0 -0
  249. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/print.css.scssc +0 -0
  250. data/test/integration/navigation_test.rb +10 -0
  251. data/test/test_helper.rb +21 -0
  252. data/test/unit/qwester/answer_store_test.rb +49 -0
  253. data/test/unit/qwester/answer_test.rb +47 -0
  254. data/test/unit/qwester/question_test.rb +42 -0
  255. data/test/unit/qwester/questionnaire_test.rb +18 -0
  256. data/test/unit/qwester/questionnaires_question_test.rb +62 -0
  257. data/test/unit/qwester/rule_set_test.rb +134 -0
  258. data/test/unit/qwester_test.rb +33 -0
  259. 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? ? "&nbsp;".html_safe : link_to('Up', move_up_admin_qwester_answer_path(answer)))
37
+ td(answer.last? ? "&nbsp;".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
@@ -0,0 +1,5 @@
1
+ module Qwester
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Qwester
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Qwester
2
+ VERSION = "0.0.1"
3
+ 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