qwester 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. data/README.rdoc +76 -2
  2. data/app/controllers/qwester/application_controller.rb +2 -0
  3. data/app/controllers/qwester/questionnaires_controller.rb +25 -0
  4. data/app/helpers/qwester/application_helper.rb +1 -0
  5. data/app/helpers/qwester/questionnaires_helper.rb +26 -0
  6. data/app/models/qwester/questionnaire.rb +5 -1
  7. data/app/views/qwester/questionnaires/index.html.erb +39 -0
  8. data/app/views/qwester/questionnaires/show.html.erb +32 -0
  9. data/config/routes.rb +9 -0
  10. data/lib/qwester.rb +1 -0
  11. data/lib/qwester/engine.rb +8 -0
  12. data/lib/qwester/version.rb +1 -1
  13. data/lib/rails/actionpack/lib/action_controller/base.rb +60 -0
  14. data/test/dummy/app/assets/javascripts/questionnaires.js +2 -0
  15. data/test/dummy/app/assets/stylesheets/questionnaires.css.scss +3 -0
  16. data/test/dummy/config/routes.rb +5 -1
  17. data/test/dummy/db/development.sqlite3 +0 -0
  18. data/test/dummy/db/seeds.rb +32 -0
  19. data/test/dummy/db/seeds/questions.yml +21 -0
  20. data/test/dummy/db/test.sqlite3 +0 -0
  21. data/test/dummy/log/development.log +13216 -25038
  22. data/test/dummy/log/test.log +14515 -20692
  23. data/test/dummy/test/functional/qwester/questionnaires_controller_test.rb +132 -0
  24. data/test/dummy/test/unit/helpers/questionnaires_helper_test.rb +4 -0
  25. data/test/dummy/tmp/cache/assets/{CE4/280/sprockets%2F99d4bf693c83b5093ab8702160c1d6e5 → C67/1B0/sprockets%2F7929f8043d9664655de93105fb94d073} +0 -0
  26. data/test/dummy/tmp/cache/assets/{D64/6D0/sprockets%2Fefc35e335323b974c3e1bbbb13693ea4 → C90/A60/sprockets%2F92d28df70396f33d8875c241334d07d9} +0 -0
  27. data/test/dummy/tmp/cache/assets/C9C/330/sprockets%2Fd555282f7ba49f75897eb3f456426429 +0 -0
  28. data/test/dummy/tmp/cache/assets/CA0/7C0/sprockets%2F34d642456080359ef03f0b0c45c06c1f +0 -0
  29. data/test/dummy/tmp/cache/assets/{DA3/9B0/sprockets%2Fa2bdb6a97d41e3cca6465c59cd5929b5 → CB8/330/sprockets%2F0341626442591c9733ce395efe9ac1f7} +0 -0
  30. data/test/dummy/tmp/cache/assets/{D4F/930/sprockets%2F593ef7a6dd9e164ce9156637a079eba2 → CC0/940/sprockets%2F665007667cd89ce695ed096e8fe02012} +0 -0
  31. data/test/dummy/tmp/cache/assets/{D76/CB0/sprockets%2Fbcaf3567253694bc09a79858c7bdad2a → CD0/720/sprockets%2Fb4c23e656289757c727ade07856f9d97} +0 -0
  32. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  33. data/test/dummy/tmp/cache/assets/{D69/E90/sprockets%2F14aed5aa2792db4162f05688f04dfa5e → CDE/C00/sprockets%2F770b464e29706b3da59850aa25b66f3b} +0 -0
  34. data/test/dummy/tmp/cache/assets/{D25/BA0/sprockets%2F0fa25091225221bc828ca4abb28cb5c8 → CE4/E40/sprockets%2F1884153b330fd109378f9a68c72fd5ab} +0 -0
  35. data/test/dummy/tmp/cache/assets/CE7/AC0/sprockets%2F82a9eee3fc6177e85610ca13415843e8 +0 -0
  36. data/test/dummy/tmp/cache/assets/CED/640/sprockets%2F11932203dc8ff571f5fe9c3877c654e2 +0 -0
  37. data/test/dummy/tmp/cache/assets/{D33/D50/sprockets%2Ff8d0dac22223755ab4bae6c44180e829 → CF2/CE0/sprockets%2F363d26884ffc3cc5cb862637a5878a37} +0 -0
  38. data/test/dummy/tmp/cache/assets/{DA9/B40/sprockets%2Ff028f8a00eb67fbe213ef8fce8c97218 → D05/C70/sprockets%2F9d533f6017de6ba71d441726cbbe3512} +0 -0
  39. data/test/dummy/tmp/cache/assets/{D3E/330/sprockets%2F45f2fada4467c9ac38a41d9463b822c4 → D08/4B0/sprockets%2F475b85667b4f5b8a94c601b3a0bca524} +0 -0
  40. data/test/dummy/tmp/cache/assets/D09/D00/sprockets%2F09b76d906d5c56b21b480e25da8b4c33 +0 -0
  41. data/test/dummy/tmp/cache/assets/D15/E80/sprockets%2F95d406e247e22d640eda395eee85b434 +0 -0
  42. data/test/dummy/tmp/cache/assets/D1C/640/sprockets%2Fbe2cd8e243f65972d888bf06170308df +0 -0
  43. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  44. data/test/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
  45. data/test/dummy/tmp/cache/assets/{CC9/6B0/sprockets%2F3df521832967357b1c7b16678fc8e8f7 → D40/6C0/sprockets%2F24e5ceb7a2f5cc396c6818ea3014378c} +0 -0
  46. data/test/dummy/tmp/cache/assets/D42/090/sprockets%2F28f94a066ac6fc41e0a4fba7f9592425 +0 -0
  47. data/test/dummy/tmp/cache/assets/D45/BA0/sprockets%2F87390210ac34ef8cb15f2a6bd8f9e629 +0 -0
  48. data/test/dummy/tmp/cache/assets/{CD6/AE0/sprockets%2F18183d077906f0468bdaa021e5944daa → D46/E50/sprockets%2F59bdc649cc2025e9368b836afa5e0e71} +0 -0
  49. data/test/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
  50. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  51. data/test/dummy/tmp/cache/assets/{D22/7F0/sprockets%2Fb0746263298bc88dffc3faa791d44786 → D4E/E80/sprockets%2F259284864ce9624a4ca1dcdd6a6e6d97} +0 -0
  52. data/test/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
  53. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  54. data/test/dummy/tmp/cache/assets/{D9E/BC0/sprockets%2F92b1852c4b3d97cf5a18fb9b171cdc3d → D73/030/sprockets%2Fec32f7966e5226fbcb535608f007cafe} +0 -0
  55. data/test/dummy/tmp/cache/assets/{C98/130/sprockets%2Fac989787df92df5f053582229580052f → D73/D50/sprockets%2F46ac3525c44b3c55ed3167ef4fbf65d7} +0 -0
  56. data/test/dummy/tmp/cache/assets/D74/7A0/sprockets%2Fad303ebb30768ef3c4e4389f57b9c0e5 +0 -0
  57. data/test/dummy/tmp/cache/assets/{D1C/6A0/sprockets%2F39f774b8adbce198362541931e4e80fc → D7A/D30/sprockets%2F4978e5b6a5a739fd3690cfb2c51ef2a6} +0 -0
  58. data/test/dummy/tmp/cache/assets/D90/E60/sprockets%2F9700622adefb7a797da2210b9bb5ec1b +0 -0
  59. data/test/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
  60. data/test/dummy/tmp/cache/assets/D94/790/sprockets%2Fd78be002b446eb324b68bf26bb1b3f8d +0 -0
  61. data/test/dummy/tmp/cache/assets/{CF4/190/sprockets%2F15945979ce0f558e72219220cdf8e5ee → DA2/3C0/sprockets%2F55eea898441a3e4e23fcad8441efd62b} +0 -0
  62. data/test/dummy/tmp/cache/assets/DA5/250/sprockets%2Fe5799db33cbaf3d4a2b6c411ff266c99 +0 -0
  63. data/test/dummy/tmp/cache/assets/{D36/C80/sprockets%2Ff5ef17012cd57c01767028aba0593fcf → DA9/F30/sprockets%2F9d6c36f2ebbb896a06c90db6ab537c79} +0 -0
  64. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  65. data/test/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
  66. data/test/dummy/tmp/cache/assets/DE6/210/sprockets%2F00369690fd2d499feccfacf96993fbea +0 -0
  67. data/test/dummy/tmp/cache/assets/{C9F/BF0/sprockets%2F74327e193051ca314d7f40d949aa0f01 → DE9/440/sprockets%2F0aa6a60aaa31e9cbdf03ce68f81d0d73} +0 -0
  68. data/test/dummy/tmp/cache/assets/DEA/360/sprockets%2F0b336bfd9ee211df3dbca3532c3c80dd +0 -0
  69. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  70. data/test/dummy/tmp/cache/assets/{D6E/160/sprockets%2F589e06b575fdb89ccc10373f40ba2bf3 → E23/2D0/sprockets%2Fafbbca9eb07b028a50e7aa5df1647de7} +0 -0
  71. data/test/dummy/tmp/cache/assets/{D18/9A0/sprockets%2F790d9164fe7b9cb772271a0e2ddf2646 → E2B/010/sprockets%2F0f8d51e2f51ac49cdddf72cfbb92ab55} +0 -0
  72. data/test/dummy/tmp/cache/assets/{D6C/5B0/sprockets%2F4cd5cd94a5b8ce62e7635a63df0103e5 → E30/130/sprockets%2Ff79a4e4b9b2af4c1c8e00ecbffdd1685} +0 -0
  73. data/test/dummy/tmp/cache/assets/E82/AA0/sprockets%2F5c8e0d124c1f8ea2bfdabf41bfbcb88c +0 -0
  74. data/test/dummy/tmp/cache/sass/{ec74dbbd041d002f29da87d31c42c67a52577d7d → 03f4db846cef78021447876a632d2437876c53ab}/_base.css.scssc +0 -0
  75. data/test/dummy/tmp/cache/sass/{ec74dbbd041d002f29da87d31c42c67a52577d7d → 03f4db846cef78021447876a632d2437876c53ab}/_forms.css.scssc +0 -0
  76. data/test/dummy/tmp/cache/sass/{ec74dbbd041d002f29da87d31c42c67a52577d7d → 03f4db846cef78021447876a632d2437876c53ab}/_header.css.scssc +0 -0
  77. data/test/dummy/tmp/cache/sass/{ec74dbbd041d002f29da87d31c42c67a52577d7d → 03f4db846cef78021447876a632d2437876c53ab}/_mixins.css.scssc +0 -0
  78. data/test/dummy/tmp/cache/sass/{ec74dbbd041d002f29da87d31c42c67a52577d7d → 03f4db846cef78021447876a632d2437876c53ab}/_typography.css.scssc +0 -0
  79. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_button.scssc +0 -0
  80. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_clearfix.scssc +0 -0
  81. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_font-family.scssc +0 -0
  82. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_hide-text.scssc +0 -0
  83. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_html5-input-types.scssc +0 -0
  84. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_position.scssc +0 -0
  85. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_prefixer.scssc +0 -0
  86. data/test/dummy/tmp/cache/sass/{2abdd63474180b8efbb2fe4a96c7d4e58de1b07d → 1b4c399e94e33c2d8c56719f624c62f84617eebf}/_timing-functions.scssc +0 -0
  87. data/test/dummy/tmp/cache/sass/2fd9c76d84cefb666046113b053d85103e19230b/questionnaires.css.scssc +0 -0
  88. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_all.css.scssc +0 -0
  89. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_buttons.css.scssc +0 -0
  90. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_gradients.css.scssc +0 -0
  91. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_icons.css.scssc +0 -0
  92. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_reset.css.scssc +0 -0
  93. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_rounded.css.scssc +0 -0
  94. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_sections.css.scssc +0 -0
  95. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_shadows.css.scssc +0 -0
  96. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_typography.scssc +0 -0
  97. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_utilities.scssc +0 -0
  98. data/test/dummy/tmp/cache/sass/{1b985f49f4ef70efe7765896dd6d11dc84e592e3 → 37555fe4a50b430f42594fe00cce2bf41e004bfd}/_variables.css.scssc +0 -0
  99. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_animation.scssc +0 -0
  100. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_appearance.scssc +0 -0
  101. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_background-image.scssc +0 -0
  102. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_background-size.scssc +0 -0
  103. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_background.scssc +0 -0
  104. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_border-image.scssc +0 -0
  105. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_border-radius.scssc +0 -0
  106. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_box-shadow.scssc +0 -0
  107. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_box-sizing.scssc +0 -0
  108. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_columns.scssc +0 -0
  109. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_flex-box.scssc +0 -0
  110. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_font-face.scssc +0 -0
  111. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_hidpi-media-query.scssc +0 -0
  112. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_image-rendering.scssc +0 -0
  113. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_inline-block.scssc +0 -0
  114. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_linear-gradient.scssc +0 -0
  115. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_perspective.scssc +0 -0
  116. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_radial-gradient.scssc +0 -0
  117. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_transform.scssc +0 -0
  118. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_transition.scssc +0 -0
  119. data/test/dummy/tmp/cache/sass/{d58df6bafe26696bc29be9546a2c3f69fc2cbc33 → 522ea017ee0dcd266f48f467e07bd4d362d197f5}/_user-select.scssc +0 -0
  120. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_batch_actions.css.scssc +0 -0
  121. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_blank_slates.scssc +0 -0
  122. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_breadcrumbs.scssc +0 -0
  123. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_buttons.scssc +0 -0
  124. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_columns.scssc +0 -0
  125. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_comments.css.scssc +0 -0
  126. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_date_picker.css.scssc +0 -0
  127. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_dropdown_menu.scssc +0 -0
  128. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_flash_messages.css.scssc +0 -0
  129. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_grid.scssc +0 -0
  130. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_links.scssc +0 -0
  131. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_pagination.scssc +0 -0
  132. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_panels.scssc +0 -0
  133. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_popovers.css.scssc +0 -0
  134. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_scopes.scssc +0 -0
  135. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_status_tags.scssc +0 -0
  136. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_table_tools.css.scssc +0 -0
  137. data/test/dummy/tmp/cache/sass/{42367c0b8e97cd09844c3165386e8db541b5d479 → 5902fb287c7b2e24af77f1ac6dff5975daadf3ae}/_tables.css.scssc +0 -0
  138. data/test/dummy/tmp/cache/sass/{d883993f4a35b9fb9fb68f2951234bfae10b809e → 67b9d8586d02a4b8f4bd8611c6c2e298896cbb35}/_footer.scssc +0 -0
  139. data/test/dummy/tmp/cache/sass/{d883993f4a35b9fb9fb68f2951234bfae10b809e → 67b9d8586d02a4b8f4bd8611c6c2e298896cbb35}/_main_structure.scssc +0 -0
  140. data/test/dummy/tmp/cache/sass/{d883993f4a35b9fb9fb68f2951234bfae10b809e → 67b9d8586d02a4b8f4bd8611c6c2e298896cbb35}/_title_bar.scssc +0 -0
  141. data/test/dummy/tmp/cache/sass/{c7c7191f5bd579910d0a21a37cd1dab835baea9d → 76f791eeabd45b8ba449aea886b17e6a262986a9}/_dashboard.scssc +0 -0
  142. data/test/dummy/tmp/cache/sass/{c7c7191f5bd579910d0a21a37cd1dab835baea9d → 76f791eeabd45b8ba449aea886b17e6a262986a9}/_logged_out.scssc +0 -0
  143. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_compact.scssc +0 -0
  144. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_deprecated-webkit-gradient.scssc +0 -0
  145. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_flex-grid.scssc +0 -0
  146. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_grid-width.scssc +0 -0
  147. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_linear-gradient.scssc +0 -0
  148. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_modular-scale.scssc +0 -0
  149. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_radial-gradient.scssc +0 -0
  150. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_render-gradients.scssc +0 -0
  151. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_tint-shade.scssc +0 -0
  152. data/test/dummy/tmp/cache/sass/{2355fa6dab0aa429d9df289512dc0da905fd8dbf → 867d4aaa9f3a2d6fbc8d0650187cc14d2242d1b8}/_transition-property-name.scssc +0 -0
  153. data/test/dummy/tmp/cache/sass/{6d829b1892146f93bc53d024914f97a49c36b400 → 8a4317f5bff37a3c37ac0fdf7f9e6fca7b6ef3d5}/_bourbon-deprecated-upcoming.scssc +0 -0
  154. data/test/dummy/tmp/cache/sass/{6d829b1892146f93bc53d024914f97a49c36b400 → 8a4317f5bff37a3c37ac0fdf7f9e6fca7b6ef3d5}/_bourbon.scssc +0 -0
  155. data/test/unit/qwester/questionnaire_test.rb +4 -0
  156. metadata +405 -404
  157. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/link/NewGitGui.png +0 -0
  158. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/original/NewGitGui.png +0 -0
  159. data/test/dummy/public/system/qwester/questionnaires/button_images/000/000/001/thumbnail/NewGitGui.png +0 -0
  160. data/test/dummy/tmp/cache/assets/C4C/010/sprockets%2F54b8f935fa0154a496735945134b201c +0 -0
  161. data/test/dummy/tmp/cache/assets/C6B/340/sprockets%2Fac675153e3c112d081881cb5b0193343 +0 -0
  162. data/test/dummy/tmp/cache/assets/CB3/400/sprockets%2F0778280cf7cd9842623b4a47c3636eb0 +0 -0
  163. data/test/dummy/tmp/cache/assets/CB3/7B0/sprockets%2F8acda6f91309162736a905e927b791b0 +0 -0
  164. data/test/dummy/tmp/cache/assets/CB7/210/sprockets%2Fd75d7926600f009b7bc12f299575af61 +0 -0
  165. data/test/dummy/tmp/cache/assets/CBE/9C0/sprockets%2F21d85716322c5b339f859cc7d9517b6e +0 -0
  166. data/test/dummy/tmp/cache/assets/CC9/FB0/sprockets%2F255d9f63b60b2f99705d9ece86410996 +0 -0
  167. data/test/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
  168. data/test/dummy/tmp/cache/assets/D16/CB0/sprockets%2Fb0e226708d5f9958bbaf5639fd402e50 +0 -0
  169. data/test/dummy/tmp/cache/assets/D37/F40/sprockets%2F34ae0821bc15772a27ca08fc3682fe7d +0 -0
  170. data/test/dummy/tmp/cache/assets/D3F/EB0/sprockets%2Fad2888184b513b29cc27bda05be8c396 +0 -0
  171. data/test/dummy/tmp/cache/assets/D4A/310/sprockets%2Fdd19e98ed3ea33cd27397508b0e34e74 +0 -0
  172. data/test/dummy/tmp/cache/assets/D52/2B0/sprockets%2Fcaba6996d3b0ce9425a2d4918e6e8797 +0 -0
  173. data/test/dummy/tmp/cache/assets/D61/190/sprockets%2Faece940f39e2ac68033f05b15fe10c16 +0 -0
  174. data/test/dummy/tmp/cache/assets/D61/6B0/sprockets%2F5f51d0141dcc429477e6169aabb1f2ad +0 -0
  175. data/test/dummy/tmp/cache/assets/D63/760/sprockets%2F03bf27ec3f65ed19bc131123a59b3d6f +0 -0
  176. data/test/dummy/tmp/cache/assets/D66/3A0/sprockets%2F02491a6027da7d0caa9c2282fd3f7e6f +0 -0
  177. data/test/dummy/tmp/cache/assets/D81/D40/sprockets%2Faa5b982ce995ea3c817a93f8c847a52e +0 -0
  178. data/test/dummy/tmp/cache/assets/DB3/6A0/sprockets%2F5fbfb11cd54686a98ffe386339a9ddc4 +0 -0
  179. data/test/dummy/tmp/cache/assets/DDA/830/sprockets%2Fde697cb19a97c9cdda00773d54e43ded +0 -0
  180. data/test/dummy/tmp/cache/assets/DFD/E80/sprockets%2Fb6ba4f337e14c4942a8e68bfaed03bff +0 -0
  181. data/test/dummy/tmp/cache/assets/E03/CE0/sprockets%2Fee7fdb52ea0ff7e5426102ee68beeb47 +0 -0
  182. data/test/dummy/tmp/cache/assets/E31/7C0/sprockets%2F306cef7b76fd0633afd6eecde15d7ab7 +0 -0
  183. data/test/dummy/tmp/cache/sass/ec74dbbd041d002f29da87d31c42c67a52577d7d/print.css.scssc +0 -0
data/README.rdoc CHANGED
@@ -1,12 +1,80 @@
1
1
  = Qwester
2
2
 
3
+ A rails engine used to add questionnaires to rails applications
3
4
 
5
+ == Installation
6
+
7
+ Add this to your Gemfile
8
+
9
+ gem 'qwester'
10
+
11
+ === Migrations
12
+ Qwester includes a set of migrations to build the database tables to match
13
+ qwester's models. To use these migrations within the host application, run
14
+ this rake task:
15
+
16
+ rake qwester:install:migrations
17
+
18
+ This will copy the migrations to the host application's db/migrate folder.
19
+ They will then be run next time the db:migrate task is run:
20
+
21
+ rake db:migrate
22
+
23
+ If you only wish to run the qwester migrations use a scope option:
24
+
25
+ rake db:migrate SCOPE=qwester
26
+
27
+ == Questionnaire
28
+
29
+ To create a new questionnaire, first create a set of questions that you
30
+ wish to appear within the questionnaire. Then create a questionnaire and
31
+ associate the questions with that questionnaire. Questions can be used in
32
+ multiple questionnaires, and can be ordered within each questionnaire. That
33
+ is, the first question in one questionnaire, can be displayed as the second
34
+ question in another questionnaire.
35
+
36
+ === Questions and Answers
37
+
38
+ Each question has a number of answers associated with it. The default set of
39
+ answers is given by:
40
+
41
+ Qwester::Answer.standard_values
42
+
43
+ However, these can be modified and added to as you require. That is, each
44
+ question has a unique set of answers that can be modified as required.
45
+
46
+ === Answer store
47
+
48
+ Submitted answers are stored in an AnswerStore object. On creation, each
49
+ answer_store is assigned a session_id that can then be used within session,
50
+ to identify the current user's answer_store. In this way, questionnaire
51
+ submissions can be tracked across multiple submissions.
52
+
53
+ === Rule set
54
+
55
+ Groups of answers can be matched to rule sets using:
56
+
57
+ RuleSet.matching(answers)
58
+
59
+ which will return an array of rule sets that match those answers.
60
+
61
+ Each rule set has an url associated with it, and this url should lead a user
62
+ to a resource either within or outside the app.
63
+
64
+ RuleSet uses array_logic[http://github.com/reggieb/array_logic] to manage
65
+ the logic used to compare each rule set with the array of answers.
66
+
67
+ == Dummy
68
+
69
+ A test app is present within this engine, and provides an example of how
70
+ Qwester can be used within a Rails app. See test/dummy.
4
71
 
5
72
  == Integration with ActiveAdmin
6
73
 
7
74
  Qwester contains a set of ActiveAdmin registration files, that allow Qwester
8
75
  models to be managed from within the parent app's active_admin space. Of course
9
- ActiveAdmin needs to be installed and working in the parent rails application
76
+ ActiveAdmin needs to be installed and working in the parent rails application,
77
+ for this to work.
10
78
 
11
79
  To use the Qwester ActiveAdmin registration files, add this to the active_admin
12
80
  initializer in your application.
@@ -15,6 +83,12 @@ initializer in your application.
15
83
 
16
84
  See test/dummy/config/initializers/active_admin.rb for an example
17
85
 
86
+ If you wish to over-ride some of Qwester's active admin registrations you will
87
+ need to reorder the active_admin load_paths. In this case, use this form of
88
+ the load_paths declaration:
89
+
90
+ config.load_paths = [Qwester.active_admin_load_path] + config.load_paths
91
+
18
92
  Links to the admin pages for Qwester models will appear in a 'Qwester' sub-menu.
19
93
  If you wish to change the name of the menu parent group, add this to an
20
94
  initializer:
@@ -26,4 +100,4 @@ initializer:
26
100
 
27
101
  Qwester.active_admin_menu = 'none'
28
102
 
29
- See test/dummy/config/initializers/qwester.rb for an example
103
+ See test/dummy/config/initializers/qwester.rb for an example
@@ -1,4 +1,6 @@
1
1
  module Qwester
2
2
  class ApplicationController < ActionController::Base
3
+
4
+
3
5
  end
4
6
  end
@@ -0,0 +1,25 @@
1
+ module Qwester
2
+ class QuestionnairesController < ApplicationController
3
+
4
+ def index
5
+ @questionnaires = Qwester::Questionnaire.all
6
+ @rule_sets = matching_rule_sets
7
+ end
8
+
9
+ def show
10
+ @questionnaire = Qwester::Questionnaire.find(params[:id])
11
+ end
12
+
13
+ def update
14
+ @questionnaire = Qwester::Questionnaire.find(params[:id])
15
+ update_qwester_answer_store
16
+ redirect_to questionnaires_path
17
+ end
18
+
19
+ def reset
20
+ get_qwester_answer_store
21
+ @qwester_answer_store.reset
22
+ redirect_to questionnaires_path
23
+ end
24
+ end
25
+ end
@@ -1,4 +1,5 @@
1
1
  module Qwester
2
2
  module ApplicationHelper
3
+
3
4
  end
4
5
  end
@@ -0,0 +1,26 @@
1
+ module Qwester
2
+ module QuestionnairesHelper
3
+ def qwester_answers_selection_list(question, list_class = 'qwester_options')
4
+ button_name = "question_id[#{question.id}][answer_ids][]"
5
+ answers = question.answers
6
+ buttons = answers.collect do |answer|
7
+ if question.multi_answer?
8
+ button = check_box_tag(button_name, answer.id, answer_checked(answer))
9
+ else
10
+ button = radio_button_tag(button_name, answer.id, answer_checked(answer))
11
+ end
12
+ content_tag('li', "#{button}#{answer.value}".html_safe)
13
+ end
14
+ content_tag('ul', buttons.join.html_safe, :class => list_class)
15
+ end
16
+
17
+ def answer_checked(answer)
18
+ answer_store_answers.include? answer
19
+ end
20
+
21
+ def answer_store_answers
22
+ answer_store = get_qwester_answer_store
23
+ answer_store ? answer_store.answers : []
24
+ end
25
+ end
26
+ end
@@ -29,7 +29,11 @@ module Qwester
29
29
  }
30
30
  )
31
31
 
32
- has_and_belongs_to_many :answer_stores, :uniq => true
32
+ has_and_belongs_to_many(
33
+ :answer_stores,
34
+ :join_table => :qwester_answer_stores_questionnaires,
35
+ :uniq => true
36
+ )
33
37
 
34
38
  validates :title, :presence => true
35
39
 
@@ -0,0 +1,39 @@
1
+ <h1>Questionnaires</h1>
2
+ <div>
3
+ <% @questionnaires.each do |questionnaire| %>
4
+
5
+ <%= link_to(
6
+ image_tag(questionnaire.button_image.url(:link)),
7
+ questionnaire_path(questionnaire),
8
+ :class => 'image_link'
9
+ )
10
+ %>
11
+ <br>
12
+ <%= link_to(
13
+ questionnaire.title,
14
+ questionnaire_path(questionnaire),
15
+ :class => 'text_link'
16
+ )
17
+ %>
18
+
19
+ <% end %>
20
+ </div>
21
+
22
+ <% if @rule_sets.present? %>
23
+ <h2>Matching rule sets</h2>
24
+ <ul>
25
+ <% @rule_sets.each do |rule_set| %>
26
+ <li>
27
+ <%= rule_set.title %>:
28
+ <%= link_to(rule_set.link_text, rule_set.url) %>
29
+ </li>
30
+ <% end %>
31
+ </ul>
32
+ <% end %>
33
+
34
+ <%=
35
+ content_tag(
36
+ 'p',
37
+ link_to('Clear answers and start again', reset_questionnaires_path)
38
+ ) if @rule_sets.present?
39
+ %>
@@ -0,0 +1,32 @@
1
+ <h1><%= @questionnaire.title %></h1>
2
+
3
+ <% if @questionnaire.description.present? %>
4
+ <%= content_tag('div', sanitize(@questionnaire.description)) %>
5
+ <% else %>
6
+ <h2>Questions</h2>
7
+ <% end %>
8
+
9
+ <%= form_for(@questionnaire, :url => questionnaire_path(@questionnaire)) do |form| %>
10
+ <ul>
11
+ <%= form.fields_for(@questionnaire.answers, Qwester::Answer) do |answer_form| %>
12
+ <% @questionnaire.questions.each do |question| %>
13
+ <li>
14
+ <%= content_tag(
15
+ 'span', question.title,
16
+ :class => "label#{' tooltip' if question.description?}",
17
+ :title => question.description
18
+ )
19
+ %>
20
+
21
+ <%= qwester_answers_selection_list(question) %>
22
+
23
+ </li>
24
+ <% end %>
25
+ <% end %>
26
+ </ul>
27
+
28
+ <p>
29
+ <%= form.submit('Submit') %>
30
+ <%= link_to('Back to the menu', questionnaires_path) %>
31
+ </p>
32
+ <% end %>
data/config/routes.rb CHANGED
@@ -1,2 +1,11 @@
1
1
  Qwester::Engine.routes.draw do
2
+
3
+ root :to => 'questionnaires#index'
4
+
5
+ resources :questionnaires, :only => [:index, :show, :update] do
6
+ collection do
7
+ get :reset
8
+ end
9
+ end
10
+
2
11
  end
data/lib/qwester.rb CHANGED
@@ -2,6 +2,7 @@ require "qwester/engine"
2
2
  require 'acts_as_list'
3
3
  require 'paperclip'
4
4
  require 'random_string'
5
+ require 'rails/actionpack/lib/action_controller/base'
5
6
 
6
7
  module Qwester
7
8
 
@@ -1,5 +1,13 @@
1
1
  module Qwester
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Qwester
4
+
5
+ initializer 'qwester.action_controller' do |app|
6
+ ActiveSupport.on_load :action_controller do
7
+
8
+ helper Qwester::QuestionnairesHelper
9
+
10
+ end
11
+ end
4
12
  end
5
13
  end
@@ -1,3 +1,3 @@
1
1
  module Qwester
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,60 @@
1
+ module ActionController
2
+ class Base < Metal
3
+
4
+ protected
5
+ def update_qwester_answer_store
6
+ get_qwester_answer_store(true)
7
+ add_answers_to_qwester_answer_store
8
+ add_questionnaire_to_qwester_answer_store
9
+ end
10
+
11
+ def get_qwester_answer_store(create_new = false)
12
+ if session[:qwester_answer_store]
13
+ current_qwester_answer_store
14
+ elsif create_new
15
+ new_qwester_answer_store
16
+ end
17
+ end
18
+ helper_method :get_qwester_answer_store
19
+
20
+ def current_qwester_answer_store
21
+ @qwester_answer_store = Qwester::AnswerStore.find_by_session_id(session[:qwester_answer_store])
22
+ end
23
+
24
+ def new_qwester_answer_store
25
+ set_qwester_answer_store Qwester::AnswerStore.create
26
+ end
27
+
28
+ def set_qwester_answer_store(answer_store)
29
+ @qwester_answer_store = answer_store
30
+ session[:qwester_answer_store] = @qwester_answer_store.session_id
31
+ @qwester_answer_store
32
+ end
33
+
34
+ def matching_rule_sets
35
+ if get_qwester_answer_store
36
+ Qwester::RuleSet.matching(@qwester_answer_store.answers)
37
+ end
38
+ end
39
+
40
+ # private
41
+ def add_answers_to_qwester_answer_store
42
+ answers = params[:question_id].values.collect do |question_values|
43
+ question_values[:answer_ids].collect{|id| Qwester::Answer.find(id)}
44
+ end
45
+ answers.flatten!
46
+ remove_answers_to_questions_answered_with(answers) if answers.present?
47
+ @qwester_answer_store.answers = (@qwester_answer_store.answers | answers)
48
+ end
49
+
50
+ def remove_answers_to_questions_answered_with(answers)
51
+ question_ids = answers.collect(&:question_id).uniq
52
+ answers_to_delete = @qwester_answer_store.answers.collect {|a| a if question_ids.include? a.question_id.to_i}.compact
53
+ @qwester_answer_store.answers.delete(answers_to_delete)
54
+ end
55
+
56
+ def add_questionnaire_to_qwester_answer_store
57
+ @qwester_answer_store.questionnaires << @questionnaire
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the questionnaires controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -1,9 +1,13 @@
1
1
  Rails.application.routes.draw do
2
+
3
+ root :to => 'qwester/questionnaires#index'
2
4
 
3
5
  if defined?(ActiveAdmin)
4
6
  ActiveAdmin.routes(self)
5
7
  devise_for :admin_users, ActiveAdmin::Devise.config
6
8
  end
7
9
 
8
- mount Qwester::Engine => "/qwester"
10
+ mount Qwester::Engine => "/questionnires"
11
+
12
+
9
13
  end
Binary file
@@ -3,6 +3,7 @@ Seeder = Dibber::Seeder
3
3
 
4
4
  Seeder.seeds_path = "#{Rails.root}/db/seeds"
5
5
 
6
+ ##############################
6
7
  Seeder.monitor AdminUser
7
8
  admin_email = 'admin@warwickshire.gov.uk'
8
9
  password = 'changeme'
@@ -12,4 +13,35 @@ AdminUser.create!(
12
13
  :password_confirmation => password
13
14
  ) unless AdminUser.exists?(:email => admin_email)
14
15
 
16
+ ##############################
17
+ Seeder.monitor Qwester::Questionnaire
18
+ Seeder.monitor Qwester::Question
19
+ Seeder.monitor Qwester::Answer
20
+ Seeder.monitor Qwester::RuleSet
21
+ Seeder.process_log.start('first questionnaire questions', 'Qwester::Questionnaire.count > 0 ? Qwester::Questionnaire.first.questions.length : 0')
22
+
23
+ if Qwester::Questionnaire.count > 1
24
+ puts "**** Bypassing questionnaire, question, answer and rule set population"
25
+ puts "**** as there are already #{Qwester::Questionnaire.count} questionnaires in the system"
26
+ else
27
+ Seeder.objects_from('questions.yml').each do |holder, data|
28
+ questionnaire = Qwester::Questionnaire.find_or_create_by_title(data['title'])
29
+
30
+ if data['questions']
31
+ data['questions'].values.each do |question_data|
32
+ question = Qwester::Question.find_or_create_by_title(question_data['question'])
33
+ question.create_standard_answers
34
+ answer = question.answers.find_or_create_by_value('Yes')
35
+ rule_set = Qwester::RuleSet.find_or_initialize_by_title(question_data['title'])
36
+ rule_set.url = question_data['url']
37
+ rule_set.answers = [answer]
38
+ rule_set.save
39
+ questionnaire.questions << question
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+
46
+ ##############################
15
47
  puts Seeder.report
@@ -0,0 +1,21 @@
1
+ Q1:
2
+ title: Blue
3
+ questions:
4
+ a:
5
+ title: Other blue favourites
6
+ question: Is blue your favourite colour?
7
+ url: https://www.google.co.uk/search?q=favourite+blue
8
+
9
+ b:
10
+ title:
11
+ question: Is the sky blue?
12
+ url: https://www.google.co.uk/search?q=sky+blue
13
+
14
+
15
+ Q2:
16
+ title: Qwester
17
+ questions:
18
+ a:
19
+ title: As you like qwester
20
+ question: Do you like qwester?
21
+ url: https://github.com/reggieb/qwester