qwester 0.0.1 → 0.0.2

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 (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