formalizer 1.0.0

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 (452) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +207 -0
  4. data/Rakefile +34 -0
  5. data/lib/formalizer/errors.rb +15 -0
  6. data/lib/formalizer/form.rb +127 -0
  7. data/lib/formalizer/form_field.rb +322 -0
  8. data/lib/formalizer/formalizer.rb +253 -0
  9. data/lib/formalizer/utils.rb +61 -0
  10. data/lib/formalizer/version.rb +3 -0
  11. data/lib/formalizer.rb +5 -0
  12. data/lib/tasks/formalizer_tasks.rake +4 -0
  13. data/test/dummy/Gemfile +5 -0
  14. data/test/dummy/Gemfile.lock +12 -0
  15. data/test/dummy/README.rdoc +28 -0
  16. data/test/dummy/Rakefile +6 -0
  17. data/test/dummy/app/assets/images/acme_logo.jpg +0 -0
  18. data/test/dummy/app/assets/images/formalizer.png +0 -0
  19. data/test/dummy/app/assets/javascripts/application.js +13 -0
  20. data/test/dummy/app/assets/javascripts/fill_details.js +2 -0
  21. data/test/dummy/app/assets/javascripts/home.js +2 -0
  22. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  23. data/test/dummy/app/assets/stylesheets/bootstrap_yeti.css +7109 -0
  24. data/test/dummy/app/assets/stylesheets/fill_details.css +4 -0
  25. data/test/dummy/app/assets/stylesheets/form.css +20 -0
  26. data/test/dummy/app/assets/stylesheets/home.css +4 -0
  27. data/test/dummy/app/controllers/about_controller.rb +6 -0
  28. data/test/dummy/app/controllers/application_controller.rb +5 -0
  29. data/test/dummy/app/controllers/demo_controller.rb +103 -0
  30. data/test/dummy/app/controllers/home_controller.rb +6 -0
  31. data/test/dummy/app/helpers/application_helper.rb +2 -0
  32. data/test/dummy/app/helpers/fill_details_helper.rb +2 -0
  33. data/test/dummy/app/helpers/home_helper.rb +2 -0
  34. data/test/dummy/app/views/about/show.html.erb +6 -0
  35. data/test/dummy/app/views/demo/index.html.erb +7 -0
  36. data/test/dummy/app/views/home/show.html.erb +22 -0
  37. data/test/dummy/app/views/layouts/application.html.erb +24 -0
  38. data/test/dummy/app/views/shared/_navbar.html.erb +16 -0
  39. data/test/dummy/bin/bundle +3 -0
  40. data/test/dummy/bin/rails +4 -0
  41. data/test/dummy/bin/rake +4 -0
  42. data/test/dummy/bin/setup +29 -0
  43. data/test/dummy/config/_formalizer.yml +102 -0
  44. data/test/dummy/config/alternative_invalid_config1.yml +41 -0
  45. data/test/dummy/config/alternative_invalid_config2.yml +1 -0
  46. data/test/dummy/config/alternative_valid_config.yml +42 -0
  47. data/test/dummy/config/application.rb +26 -0
  48. data/test/dummy/config/boot.rb +5 -0
  49. data/test/dummy/config/database.yml +25 -0
  50. data/test/dummy/config/environment.rb +5 -0
  51. data/test/dummy/config/environments/development.rb +41 -0
  52. data/test/dummy/config/environments/production.rb +79 -0
  53. data/test/dummy/config/environments/test.rb +42 -0
  54. data/test/dummy/config/form1.html +139 -0
  55. data/test/dummy/config/initializers/assets.rb +11 -0
  56. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  57. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  58. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  59. data/test/dummy/config/initializers/inflections.rb +16 -0
  60. data/test/dummy/config/initializers/mime_types.rb +4 -0
  61. data/test/dummy/config/initializers/session_store.rb +3 -0
  62. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  63. data/test/dummy/config/invalid_html_formalizer_tags_without_ids.html +5 -0
  64. data/test/dummy/config/invalid_html_no_formalizer_tags.html +5 -0
  65. data/test/dummy/config/locales/en.yml +23 -0
  66. data/test/dummy/config/routes.rb +7 -0
  67. data/test/dummy/config/secrets.yml +22 -0
  68. data/test/dummy/config.ru +4 -0
  69. data/test/dummy/db/development.sqlite3 +0 -0
  70. data/test/dummy/db/test.sqlite3 +0 -0
  71. data/test/dummy/log/development.log +7107 -0
  72. data/test/dummy/log/passenger.3000.log +2681 -0
  73. data/test/dummy/log/test.log +4830 -0
  74. data/test/dummy/passenger.3000.pid.lock +0 -0
  75. data/test/dummy/public/404.html +67 -0
  76. data/test/dummy/public/422.html +67 -0
  77. data/test/dummy/public/500.html +66 -0
  78. data/test/dummy/public/favicon.ico +0 -0
  79. data/test/dummy/test/controllers/fill_details_controller_test.rb +7 -0
  80. data/test/dummy/test/controllers/home_controller_test.rb +7 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-Z8-x8TP2IpXxzIQCnPJmwpJQLBA1vkQZIs-v5IqO1M.cache +1 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0QhQ_r6EX-PaO37-YZcRkQsrNuiQ2lMZ78kOr9nizbo.cache +1 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0gaoXk74LdRQaVC-V6RnHNTFukvBZK6P7TSCKGK3iB4.cache +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0lmMGqilvmPepfDYe-P4TPj8HP55nK4OJgU_A7JN3vA.cache +2 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/10FjxP4BObnBgDu_BfPbcN8u9gBcUtffAu43bKi18OE.cache +2 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1E4iNysYJh97M_YQ2yLOmaIpv-TrGgZMuC1GG79zjPo.cache +1 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1LojJt0HPxdTxk8roqIik_rXQ4lXs1dds-NUPqBSLQ0.cache +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1TzpDaiXe-zq-W2i_uxXwiRngAIoS4lMkMV1YF_-Klw.cache +1 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1ZIYPPoIRMG1j1vxQhisia--vKTZrc14_GQdwEsFQsU.cache +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1ZylVP7ZDoGvLc-wMWjmTFaWqlB0BOGWbbESKK_O5zg.cache +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1zeTrAPOtYLg-JXxWQtphNiGAEZjECivNLOO2qHmZak.cache +1 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/29NJdbsFyjUzJAXIzHCoilXDeM55NW6O3cuuRoMir44.cache +1 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2pIrDdq-LQAZYsU3rnabBAAF3KoaUqd-UddqjLj6tig.cache +2 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2t9hRAvHgc_FJbWXTMo1S0F6rT4U9Doze_q5dKJ-fIQ.cache +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/30olZHQQ7WZTO-OTXByCyV6vQvD-jRNTxeLSKLexBZw.cache +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3E_mWo1orMy9qt95H9QfIEPkUy47lB7SEZHViXEsFqI.cache +2 -0
  97. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3WbrpN7fxH07Jo9_3u6T1QT3aSs8f0GtBY-tXlyMFGU.cache +1 -0
  98. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3c3Nfn_SaD6FvHwA8eTWTzPRLztBsPQsm4lP92p1Zgg.cache +2 -0
  99. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4Qy3ua1ZxecQRiTw0N2X_g5fnog79TcUHR2OME4vIPE.cache +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/50srOL95A3hQiQ4Qny9El7UtyBykNpLQqwIDQoVhHk4.cache +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5BIJNXi8oXVWoLSkdp4lc3Th8PwMrk4bvez8RTabMuc.cache +1 -0
  102. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5GwtVhuOkq0utxLWUiTqEU3Onyx3OrVgux-7uDhK0Ew.cache +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5O2LYVux25geVSYTIjv2zA6Mm7Q7_wM0QxCacxCn1A8.cache +2 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5Pgc4M14GZWEeVTkkd04jQEJpdqVAmyqi9glF6vb73I.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5QCJCh3vy-_xBXSLbJhjpsNpLjMQmgHC7KlC5EBldL8.cache +1 -0
  107. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5QPZLgIEGL9Ktghpx_Usd-LEixQ1JmmMc8h5mpkosD0.cache +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5R-MvIULCjePz0cM8aamgI1CGUxcfDuzJlmIivuhkuk.cache +2 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5zHbuyCXcodrnyA9RJb5M2roj2pmi7Vak-F3kb7AGxs.cache +1 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6E0UuAMaaJmKYV4WHiNr1cBWr-mwujiNLKJYbZBy5A0.cache +1 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6EI0VFQ3N3P7AOjW8AEjrXZdSuCnCv-fpZ64e0bjynk.cache +3 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7CXKpj5B6dzyBoSsGgu7moPco2r0i9PbwzVXo1lHozU.cache +2 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7FxuwZmru_T0Zx8aNR3TleboQkZy5z3NeGNrwPzP7cY.cache +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7Qzcd1UvRnkRnZ5b54SSviAKsURjRAGoaK5yTsg4MxA.cache +1 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7aFBjL4if-asPUbvotQpxcJTzMgAX9LsHAQVCppeSXE.cache +1 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7lvyiihvB0xNdKRsf1KPaqFm_3Mipw8d1db4V8lJteA.cache +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/813bj5I6yZb-wXefodCetOCKEDEL_2AbNx1a02m7-KQ.cache +1 -0
  118. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8DY9xobqxlwyWnYa-twKg1BMFu42a1oOfvx2Zk8-QRg.cache +2 -0
  119. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8kChD4u9SX9-EQY63SO0-ergLuOvDIf46vR60I3T0qg.cache +1 -0
  120. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8rlj1JnFHejUL3raWFeliRWCPWCnJdn3UrlKHovKdbs.cache +1 -0
  121. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9BUi26Pi2HjaBwxW3xqwhp3-Nv9HqvKnYi-RR8KcuWk.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9L0RNb_fbisaw_9WsSFYANfhgTuQtvP-91QSEjXNmY8.cache +1 -0
  123. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9XgPoYN_JsGzZkpXeM3pxQXrYH26-9gSsoxEp6HpEUM.cache +1 -0
  124. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9j8hez9pHdCQdcwjpKeoYVrBmVfR4ASBCJUtaO-CN5s.cache +3 -0
  125. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9kTCjSGFbe16SMqnP158MuUj3D28soCZdwKuAsJzbUM.cache +1 -0
  126. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9lx_5ziCg-eDu1m2pR0-AVevZkF224xRlIvfaq7PCUo.cache +2 -0
  127. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9ztFL_5lRP0EpvY6Yd8zo0LH5wpnuxoAxDa5ffRhyC8.cache +1 -0
  128. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/A6zGVTNPc91lU58ffj05A46ORdomivGj5lc_q3_XQQQ.cache +1 -0
  129. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AC-yaYeOXxlIdUwTDpTd_TdSmK_-ZGilXZPaleWhVm4.cache +3 -0
  130. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ACsvcWXFkXGo_dZSWRNCzv6q67NHrhjltwMF4SyKs1s.cache +1 -0
  131. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AMY65tvjndTjQ3V_ZahdJL8X2zj93DU2o7K5FPvxu1M.cache +1 -0
  132. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AfnuA-IDSQtDAo9XtkPxxczSKB-VlblUrZXAKCj-QaQ.cache +1 -0
  133. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AfqP34F2lwUisVYv00aFZKJ_aiYs8smx4j36oeW-S6k.cache +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/B4oFb3TRenHH4JcduyCvGTFxZdU3-VvTQ1LDvm_-iIE.cache +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BUMVcNGlZ_mEthsPogkRuGobQajJknMTlMbRrCDEWw0.cache +3 -0
  136. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BhtNyi5hwiVF2UewLiIUG0mEvA4dTsuA9OZfLInxiaM.cache +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BrL6mwK6Wl92bBsvnD7AQvHWBpWjUC9-hVUuew9XT28.cache +3 -0
  138. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/C-JhuIiVv78piyuXHnljYWwor7hg29mRYWxbFgsSRAQ.cache +1 -0
  139. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/COs9Zo-3ILgYwVitDgIYCUYqG71jyK12ukoiV9DgXGM.cache +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CTUWBa7w8yk1eBR-vVnNVN1dD-U9aUQCm4RvF-RIYvU.cache +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CXmlgiMLFXGktY7o_a-zXGvORAwhacWo9qzuYfEGE1Y.cache +2 -0
  142. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CYZk3DPZTVGkS2PnZvMUwL2FZdyXbaP3rElZ0sKlTZ8.cache +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CZI7jT4PWrphGBTddtX9G0MlBskacV4xNnNIiJXLNgU.cache +1 -0
  144. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CePIL6yNvdNcXUbCs39xoB8mYs4nnVdGrFW5R5CKggQ.cache +1 -0
  145. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CjHnZuWbfmemr8OwunPxBX2q82kfqQrpyzZqQlgByb0.cache +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ClbLBnTjKQ2M71bFPm49Q3mL6f1ezJqft9rA3amsQFw.cache +1 -0
  147. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/DKPWCuG8-WIOXIo8ZtYEQSW_cfaaGpNJh811CN497o4.cache +1 -0
  148. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ds9pJpmDkvJOvR198IUwYc9ULGPmil2iTqFiFiGjlTk.cache +3 -0
  149. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EDARLTaT4IC1VOfwV6baowYKbgOdR9-vtVU6QyLQTjI.cache +1 -0
  150. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EFQva92FBkqJrXlwFMm0pOyMbmEIDZZTjKfNSL_SkZc.cache +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EHfXjykHNwJnJ2mPC_X-9u5XQ-lo3m4lSyPzw-raCms.cache +2 -0
  152. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EK94JTjppaz8RHle7cCnC2-AtPXwdJ8yDkUP71ZUnek.cache +2 -0
  153. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EwckOCeKfibFMJk1ykog1VSiAkRxFPJRomR6UnhspFA.cache +1 -0
  154. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ExtPB6HexdzjWLQJkCzrB5IkQF3ZZXpBa9IPQROeLIg.cache +1 -0
  155. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/F3oiB_iZ467uXhAv4IjoV5eZSm-bwgS6xUjszPD5e9U.cache +1 -0
  156. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FLTgQmbIJNhFOAe7KHjPgxgSVYkYlXH0Zluo0g-u5hs.cache +1 -0
  157. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Fns9pIxUWrPU5h9kFlyKS-PwKd8HxU5Q5XOD4g0BDeo.cache +1 -0
  158. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FzziiFjbUsrpb7SF0ce2ZkWkxLwjo1wA24G0hXaeIkQ.cache +1 -0
  159. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/G4BoLpM5zXXaRM_wF7w6DGkOQj0_e8uQ6g6DT766VrE.cache +0 -0
  160. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/G8NeUk52Hnr7bG_HKvsYHrwPVbf5CBK-faalsc0CqhI.cache +2 -0
  161. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GTCjnTkoJck-uQZ8rDMK4r714HhpzeJkNtzPFQV8DwA.cache +1 -0
  162. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/H-vLBWd7GFBKYhIfIvjrh_ybAYrwqt68JLUd2byKlKM.cache +1 -0
  163. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HC8vOhiwVnfoGJvnxqt_LC-wzGgzV4N0m9oKKtx7N80.cache +0 -0
  164. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HF6WTSaNGkbbpYZKSQjL5V4qNzevXksPfMsclnueSZA.cache +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HRQDr4TsPyfcN8NC7b3hmZJH11mUY7vTjoscEUdlesI.cache +0 -0
  166. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HWkb49cHyNx6KuEmVwRc8kLyFRR8KSqwIWuRirwMe4A.cache +1 -0
  167. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HYCvQ7OACArsJevB7clpYUhju6qbdSyS_lPA0HTzxcE.cache +1 -0
  168. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Hi1YUR3014PHRusUI2Psm51L3qSNb6NNtUjAoqdBgJA.cache +2 -0
  169. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HkivVuo1QbHiVAZRwxz8KISg7w8SkVsLvXXPjTyo1RY.cache +1 -0
  170. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HtjMoz49NTbpPgQ5E7HuoCduA9wa6_NbwM3PosrO2S8.cache +3 -0
  171. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HuK4Oh3hKlvMS7sKaJ-1IJset3TEcndPwPSIc44otsw.cache +1 -0
  172. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I-8CERt84_2ELVeGVTwnLrIVeXtiYNjz9MKKpaE9a1k.cache +3 -0
  173. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I-pscSbe6WWQ-Hy600ABZdc6wMYC1utqCHCpXRgHkck.cache +3 -0
  174. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I4X_-Wfk9tSNv7Y7DN1stcfdEmVP66GhbIg4rBGTvJk.cache +1 -0
  175. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IIHFsCskfZ8wud0ArVYadcEz1sCwDNST_CzhdRQ0ymw.cache +1 -0
  176. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IN3zcsPPiYWRXkoyEdQTWYZdobUm-hVZPF-RsyKSLZo.cache +1 -0
  177. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/INv_HAthrzDkm_D38eTGnh1Fv0Vj_MuX4fgbbRyXIuI.cache +0 -0
  178. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ITHO1axalp1rHmqR3YvaIkjcAvn_b-ZDcFHAwd77x8g.cache +0 -0
  179. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Il6R5QNZ6BNMpHu2VKbgxYd7kLnD_VBlXj4sNW3Ogrg.cache +1 -0
  180. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ip3sIWGeNobzJVqwWB-9uzzRqvRzIl16lYYu2LwYSkg.cache +0 -0
  181. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Is-w-V5glNAuSJQI6LlVgYrsrBpTkB8UuMyvC18kGP4.cache +1 -0
  182. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IyqWEHJrFKiApIk9ykMM4aexL6XjINdu8SM_hvODC5U.cache +0 -0
  183. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Iyr9ur_AZWlgQioN9Q_0ZIHzk8eAR2gcP9rA9U53a2I.cache +0 -0
  184. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IztqlpUnlF6g-AK41uS64ADOb_UqrV2XPKipfwMZtng.cache +0 -0
  185. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J33O-gglLsJXTRsiLsEaZnkx2EejYpaY3xgL08iGtGw.cache +1 -0
  186. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JFyms6REaLPLPGIhMN9PGqjy17pfjTRUVf7eZu9Pxco.cache +2 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JIHTpeIeHLyoisKIzpqO0eHdGhi5nEKWj5-RcVKRCM0.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JW2xq5zPnik9gBTiiH4F_youPivdygFAzUOO8MbWgkM.cache +1 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Jd-S8kl1kAIMxvyCcIuOA7ZGbyL26f82Ye-3R_XSjdo.cache +1 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Jze_hM1mFPXNRoOoJw19TGQvSkWHNCf3QMNVc0ziz_Q.cache +1 -0
  191. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/K6SnboDPlbuabJPpTZ0JPk8gO6RFUZBqZ86JAtADJEI.cache +2 -0
  192. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KA5cXFlW0WDZ_VC_cWZZYScTtlyiF3RVGqBEGU6eiWk.cache +1 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KDwg9dU_fSHgpLW4os9qv5BQy9zdS-M9s6Ayd-AANVc.cache +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KEmMrd7MCPJPBEXnAmcfU3NSj_picTq8W8sdG9tqrqE.cache +1 -0
  195. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KIkXGvm2JGXJ5o2qXMFuGbgz6qMOB6A_YxWOUPIHKK0.cache +1 -0
  196. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KXINFsNMK_ckYGMJQGJfbFh6Z6epFg9k-5Qhs9rW9EU.cache +1 -0
  197. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KZT5maABQpPM8h1-x2KELDmK3nd7nKk-gcX_gjMgt2M.cache +1 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KepueFEdf6u-gcEmbP_Co4sI430KiPrpm0DZTrdbZUU.cache +0 -0
  199. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KhI2DHSuQgZjCK0ekRDtvbZpOwdYZri_CwBZ_JkxvOQ.cache +2 -0
  200. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Km_xMbxQ71ubb9QRITDKX704GvVKFUCbb0nUvxa8thQ.cache +1 -0
  201. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LEKS-dzBMjc4eTyBxtrkhH2mBdtswpViSIhSflnSWt8.cache +0 -0
  202. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LVNi0m_Fz46uZMQdhGs_Xp2qaC0-FvTGXGkvKC4t4d8.cache +1 -0
  203. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LX1cGvPp6Q6XjdGWjj9TR7J4-zLSGXBgJ4V46lvreMU.cache +2 -0
  204. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LdWTufB1ksbF48SkjjVFQaGOGLZhuR67aZdg86lyIlU.cache +0 -0
  205. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LdznozvZmzSQM-vN4gpeVOi7BnxMKo9wORxcV6AV1C4.cache +3 -0
  206. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LrSqV9e6t5RRqIrQNqg7rJNyEmu18afM4pmQogLkpaQ.cache +0 -0
  207. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M0uQOpQsd2JJzwD9B8xFoWKkOeXsEv989W442_j6GWQ.cache +0 -0
  208. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M7D8w6LkvEVOKTQGUh5UeMFsZH9VO0AcqcYXjP_pBUI.cache +2 -0
  209. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MDLy9q5bNSELATVxXwYNiE_EWIk6G54Vvp6-6Nqe5GI.cache +0 -0
  210. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MZlIjxVbEXORmEiPpu2WfhYYmXabfs-Mx0CK13UOI68.cache +0 -0
  211. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Mty8gekO-EN4nBDIU6_1vSciYe3nym8NZFIu8Blar-o.cache +3 -0
  212. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MvmfAyy9rh72Z5qHWYe-P86KDG_4TypMgkIvJ9H_VZg.cache +2 -0
  213. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MyIKfP196ecHA5x66VvwST274efdOn68xI7gr7-yO_s.cache +0 -0
  214. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NVDHbW4cQm1BkVqKaV_UZJCoUGOjV__cQDP_BkY28PE.cache +2 -0
  215. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NZYfENdib9jQ0mLkOwrrHkyePDmPSnsyNBF09R3RjDI.cache +1 -0
  216. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Nw4FfwPy0V6hfEuMiecmCowRpPVW72JuqlU1XiIbwIY.cache +0 -0
  217. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/O42pf20jdFJ_g5abvA826QHjbBd_O80pk4MWxW-tCsA.cache +3 -0
  218. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OAJRpn8VLCOm_jZEmbk0pORgSlL7gp4nFifMo5niF-8.cache +2 -0
  219. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OGtnLVkXIOrBNwwxtlEOXYAU-nA5S08TDyFelKR3iYA.cache +3 -0
  220. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
  221. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OO7RmvETdJCl6nDgMH22qEwqpy5SjZ2MMEBlC6tG8hI.cache +3 -0
  222. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Osvd5BC9KZ-hK4npyrYgEsra8aCVLyBTWo66yXU4904.cache +1 -0
  223. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OzJXhurZ1BYWL9zrfbxtEKM1oEzmIl5xNWB0kEDMcOA.cache +0 -0
  224. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PCOy1GxF5pveYHXcBMOi91KB446LiGmPMI1UFX8g_-Q.cache +0 -0
  225. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PbS6_clOuwqA9I6Ve1r-WHw9oyXHcbXLmbpDmHQShgc.cache +1 -0
  226. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Q4TMVpJ3X6XrShazzrnMrNim1_G-BNe0VdCulR7F-yA.cache +3 -0
  227. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QHu3oOt0N98TteMY5zXqcj1z97xn_5N43EfY6Pi9kL8.cache +1 -0
  228. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QMaS77aFhjfvAlv3pTOkHY8huXHTx0qwk-Q3XC-LUuw.cache +3 -0
  229. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Qr1oeXB_1KGcnRFsaYAvIrsxKqj1Qb7vWnTRmgXk_VA.cache +0 -0
  230. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QtA1YtaH67pw0mVtsf1tkme50FTIriYFZ0ho543Qa3A.cache +1 -0
  231. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/R4DimiN58ox6KgjnR2eQwODucfhsWMz41f58AEW2fIo.cache +3 -0
  232. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/R6PcDLPOUUtOP-BD7s_Ur0xv3uF6iMce62QfJ-box9g.cache +2 -0
  233. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RCYWsl0xUIU2nNKGL8x7couerrGdH06aVPyqe4T3v2g.cache +1 -0
  234. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RPaoa37GUXAxFdY8fAxaqrBcqpO344RueeI0-aokr-4.cache +0 -0
  235. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Raj9vOIqeGhMSGtu8Q_sPxFPdkVVSvpAJq2eZjkurSI.cache +1 -0
  236. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RasXSipZI53ixic83Lh1Gyxf7EZ-ZsS-xs6MTSlr23c.cache +1 -0
  237. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RhDVv9RZb-Rf9b572V-Tby43AKU0VobRcA3p53frD0w.cache +1 -0
  238. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RoSdinmQMNdbk42r-5aRk-ZSpex9SGn1M9kToboGRlM.cache +0 -0
  239. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RtPqr-xCyExVFKXPLlXveg3hS48LPIvlyGbMoaE9A48.cache +1 -0
  240. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Rv0ZOQezk-pppzUrdpvYZIs6NI_EYwa-F03k1Dyv6LM.cache +2 -0
  241. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SJW0DP3AhW7DLwnpif11zo1ebaTOSKFyPK1dGObgwec.cache +3 -0
  242. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SSs8xG34aB14Vj5PMy_zMyWZ_CI2NaiP7aUF4hIX4oQ.cache +1 -0
  243. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SejMpuiBooXU6eBSfO33CrjJR4wNjWC8zkm6I1GAeos.cache +0 -0
  244. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SgOybhbsgRVeyoYJJM-c3kEvJYV1gxpuo7rN-mb3Tnc.cache +3 -0
  245. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SnzRk78-FyJIzk7pMe4SIbViUnt8al9lQ5Gy8XhFrIY.cache +1 -0
  246. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SuILTE3Es0N_r-36Ddu2E6h49WcwH_-RsZyG4SPwKFQ.cache +2 -0
  247. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T25N6kK7z1ktWO9T4A9GAKDxA8uV_40I9iCK72yJAzg.cache +2 -0
  248. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ToO9q9KZUkSycEPeq45MeeteesODn-nUiRkc_2K4Odw.cache +3 -0
  249. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TpYQkHppriVPoi8yZlS7pr6M0VR-8bgS68niJd5mA_k.cache +2 -0
  250. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TseCU3hhL2Yp_9cVEW4ZfF410Uc5RsRl2WJ2e_RKzYQ.cache +3 -0
  251. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UGP2acGAePQXO0CTCNSktz3KFcnj6TVRjK78o3_-Z6Y.cache +0 -0
  252. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UTA-dAu39ywx50aKbw-_vIHLbrENV9O11MIOmfAcqwY.cache +3 -0
  253. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UUuqFAvUHy8E32lwI0UKWj0JDvMFXin1lOZh7r_CFU4.cache +1 -0
  254. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/V7-8OhEYcV91Tjl1Mp92Zs-q6tVYY_NoXBRZQB5vROo.cache +1 -0
  255. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VP-5hBBPrMcJGIIn6HqbMSqU2AOAWb_2b7BAWcdrc1c.cache +1 -0
  256. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VQj8MeqFcSYovlGUK0G9tMS2Xu_WouD5nZPyKyiweq0.cache +3 -0
  257. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vlf9_BCT3w6tU64yjiuvN-opIYynyGIFGSKW8Bb5isw.cache +1 -0
  258. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VnoinoejmNyMusctCLIfDXuFCSEi8usJC8m6xDhUjq4.cache +1 -0
  259. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vz_XyP4dxLytmt1nM75kFGT12PZq3bNYSD4lvdLEetE.cache +1 -0
  260. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/W9RiVsPehgaZrUMdd9IMxV6tWIOaJSUJC3FkXb1X_B4.cache +1 -0
  261. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WRHdYa7fEbFVL6yef8rtmfO7EkmHLP7mvLYrFsydc7M.cache +2 -0
  262. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Wma3mCvAkft1gb4iskpJcSKJAxs20F1f9J2E4aG1a58.cache +0 -0
  263. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WqdHTk7KRwHNiGDY3E1WbSwBE2PWrTEC_HKQ2dgQh_4.cache +0 -0
  264. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/X6fitKDo9k84hcsJAAFipPaeAqWy6LI4yN0xoXUMI-8.cache +0 -0
  265. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XETabnfMEH6v-S1S7wAPpqzzyrusq2-gKEj9xXfazWQ.cache +1 -0
  266. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XObHVKJOPQbhJIypQ3m2F7cKPAyfUl2i31t0ZpyyNPg.cache +2 -0
  267. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XPURjd_micKqrq3ZsfPm4DEg045aMh0u2t6H0Kg9Yvs.cache +2 -0
  268. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XimghOZesEI6BcweyGe411shS-dhkXGeXfICxpTMaP4.cache +1 -0
  269. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Xq5ZUgEeXuuZ_LjabsqNrD-0Go3uQ_Cyp61HWjTc58U.cache +2 -0
  270. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XynXdkOeORTqM8SLwd29IBzqweNuC8cwHaKDU6aCSK4.cache +3 -0
  271. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Y2JXHdR1Qwb4e3EeE4Ez_zsdxDGOIBwOchlk5EROlTE.cache +2 -0
  272. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Y8R1Go-ZDdkrGFky02NN7UnMEhQk2DqxsvSX77Fa6FA.cache +0 -0
  273. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YHkX1Dz4-_N2HxZ5NqTKZci_3AXSvWJeJA_i_31f9kA.cache +3 -0
  274. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YJbah_vlhgRdgT_Teq1T0fCbheSTzHIoHemg9qXindA.cache +2 -0
  275. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YRwMHi7FPQbp1ciWNBf8zVdyOOQZ90gZxW-FGjsbo0M.cache +1 -0
  276. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Yck0uONNPexAbm2FyBPrfd5yIS7zF6qget0qv5CjsHU.cache +2 -0
  277. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YkwiLOME0K0S68fJF1m4B59vHPfCrL1XkvKuU4REXOU.cache +1 -0
  278. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZDVfJezxW8_ZZwk-cwh-Xi0vzlaptRAdhzieKE_zUFY.cache +0 -0
  279. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKHvJwMZX4BDjok7en1aRFmYUMIGKxP-2WLxxfmV4_0.cache +0 -0
  280. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKMpLctz8nAvAMaFYwxiwBLh_0HFVR00Ef2Tp-L9gk8.cache +0 -0
  281. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKaeyFbyv_L52WIc3QtQXTKgCIpwbTR-uFJLaTMGqMw.cache +2 -0
  282. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZMXh61oyO92eyHwgIArcoEU68tdVc-dasYwTUiSdsv8.cache +1 -0
  283. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZOf3jjmjGkvVrLqqqgnNzuiOWpkOmQ9MEIwXhtswC5M.cache +1 -0
  284. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZPgHNAJhX0yVATfQVK4g-l9clGnQ4JK6uUQSZr3izJs.cache +1 -0
  285. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZirvH1uELJOGqJ_P7CHUAeE_P7jHfDV-kVS3hqudqrM.cache +2 -0
  286. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Zl_4gLKgfMkcF_M-9_ZEbdVsN5G3srKY7ntGrMlSrHw.cache +0 -0
  287. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Zq028YKPdCngXVGfBnaVxR3ggnSLIXPPQmXKuOrf8Rc.cache +3 -0
  288. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZrHurvGsuXiJ-LyErQBL_Z09EEVtYRzmGCuik1pCbMY.cache +0 -0
  289. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZteKWxvlB9lz_cw0HUFX-gLZnyvx2Zl4yndbIQRAjqk.cache +1 -0
  290. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_CyPKbQqBzpjkvVSPJCuRZ6LPST2L8lNbl3pPaFoHJ0.cache +1 -0
  291. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_FzZXs9cOynmEHX2NNQ-CN3hBm85EZozlnqahZgW0p0.cache +3 -0
  292. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_RxurG4mXmoQvbBTBfr-_LxySQdZ2vRVo1x3z6BTIM8.cache +2 -0
  293. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_VTTW4fptVcLI6EEhHyBd4Z8Sqh8TQQ3-xQmcBCdhFo.cache +3 -0
  294. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_VwqClblffKCdAP_EdTPlIsw_a4CtoYdZWrIqsvTEOQ.cache +2 -0
  295. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_qTdVcypJYB06uIuozk0oFgOO-20TwjPvSXO_We2SFA.cache +1 -0
  296. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_qXTu5xPKA0W7krxy7i26PqnCiZfom_FyzNgoRcfhrY.cache +1 -0
  297. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/a-ZMeoDAaumcckLg0ikJ4VOpG4myE6TpW8NhkwHfEEY.cache +0 -0
  298. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aTBvblCTpM9NO4FybG9Gj33dec5S6b_XUwAccF1aZYs.cache +0 -0
  299. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/adco25PKONAOLm-3rk6IkBIQCnbQZW4Ho6gjCtHDkDg.cache +1 -0
  300. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/auxxd4pZZ_TDPxKd6Z1PHX1KB7GK6XR4zZCkpSTjTIs.cache +1 -0
  301. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b39zQHTjF26g2idhY9yeVDdpi0l5AHiJJI9GRYqF6mU.cache +3 -0
  302. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bD4HLMG-9D4qPG_FjmXWFZ6gjrSWcpls07sjaZ-O7w8.cache +0 -0
  303. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bNzI5dnyYKL0_36QaiWo9c62YPQqItx7pKCGRUy7FfE.cache +0 -0
  304. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bO-oLvkRTCzyfG1n2yXs_z-XnWJGQkeq6Epi7htFc9I.cache +0 -0
  305. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bTc-0wBzb4QwDigu6Db7NvQ_N2V40lyAP7vDnJ_nlH4.cache +1 -0
  306. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b_F-ynokmpMl3NS98JLR_LB9VDh0YOK0UaWye7i8USE.cache +0 -0
  307. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b_LqzZ-8tBIFMmv6e6UBt-bbUKJ2xvZ-REx5pGyx8iI.cache +1 -0
  308. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bx9uG2b5bzutb2J4T2Sa544N5DYCTwy2P6WBGzuxs_I.cache +1 -0
  309. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dMTaD6SlQOW5HeTJA4GTKwarCYmPyQiARbMyV_vB4d8.cache +1 -0
  310. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dTT1R1UEP8uYnzF7i__RYmTDlUukDJ3xN_20-_05KEI.cache +1 -0
  311. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e1v0O2JKkRHQlw8TKb1w9oZB1vemT5pyrEti-lMF5b0.cache +2 -0
  312. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e61CL-jArxF-LrNCE2KXgDQRs24C51uEjlx6Bi19Gao.cache +0 -0
  313. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eUu1MwUf-0AQs7dOY9q--kK5o_T1G5PiS_K2T8YR48Y.cache +1 -0
  314. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/evKXHHSZhFrDfQz8cjp24eCW4GxCo7dGht_7kIJvzBM.cache +0 -0
  315. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fBscfaT8oxs7Yqm_nTectEFY7MEPIC4905izon3ZfkM.cache +1 -0
  316. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fQXVskLewjixaid5c-_oVGxkq-f67ZCyGJS-4elUdCo.cache +3 -0
  317. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fRuioQRNW0lMfz61Sc-O5z8cQlpP7T5UYGqcs0Q5M7k.cache +2 -0
  318. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fcB3WIgbOvDMnOx21ZxJod_7X6BgByfRZnnqXb8jeCw.cache +0 -0
  319. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gBLeBlrK5msk-pYd1S99yFV_lV_9__zpaH8xxhlsN3Y.cache +0 -0
  320. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gHfAw7eXqwbHMSaPLwMnsJ-2rpS4tPojjzPflsNwjS8.cache +1 -0
  321. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gUNIBdCSgztu1IV1u2Iea8rgbpdr7yfMU81jtrXab_Q.cache +1 -0
  322. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gZ1A1--Asdejq0JC1PUTTgUEDPpV24UMUvyGvPF9qLs.cache +1 -0
  323. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ggyLrLMGVAcFn7w9p1lH-wrhmfBLSbIBYRoAosZgBx0.cache +1 -0
  324. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gnsisTlVaZW5O8yedgMtd39R6RiNWwEugCpxg7Fvhgo.cache +2 -0
  325. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gsT50j7JKHuZpK4IhejdLyeaKfQHfRPi4cKFSX40xbM.cache +0 -0
  326. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/h36EXMrbHvbFBnm3LtD7G3AszmR4XAInaarh8jjchvo.cache +0 -0
  327. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hI7K5kfULmC1N0zMvxGOCfdyDMLMqzTZ_0g-qE77V0c.cache +2 -0
  328. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hV80P7h6cMezrBztIgEAn7INoQ7Sw6p_rnUGxg6SLfI.cache +3 -0
  329. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hWu1uKCWmWR3s8-5BJoduM8XHlqgUs1A22oqy6cIioI.cache +1 -0
  330. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hYh93QS-0IpGwtz77I27Poxio2RxvCbdfwUU5DUDDac.cache +1 -0
  331. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
  332. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hdQmfiHfKbGaIkA-eep2f0S9_Vk4Fx_3495ZFE-5lvg.cache +2 -0
  333. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iApklbYsz6wjnGnGAYDDvoryAu-x8xdYWFRCRICxkyg.cache +0 -0
  334. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iRiaNr-fBLM-F3JuE14i-viRO27IlDgf7wSSP8iBX08.cache +0 -0
  335. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ifSFOIuEmyYMVEx24wla5z3sjbPQaa7ewQjWZIVK5SU.cache +3 -0
  336. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/inz6emggkYiVqCt-Bij5_ONj8YKML_oysO3SH3AXlfw.cache +0 -0
  337. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iyALEPjIsWnyk6QHQmKHjw40Gom36pc6D2lMAVG5HAY.cache +0 -0
  338. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/j4fhwqDyIcPq-vVaM-r8IG9pkWB8unxSH-juX-2a5GM.cache +0 -0
  339. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jH9EdS7oritO7nZnEh6YwafCgT5JGaZfCBFZ1KgtDl0.cache +1 -0
  340. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jHeuZcbZgSPINIRRpB1khLlwKgjZWxOOvdlnNFfSEkQ.cache +0 -0
  341. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jL9LsrMlRmTbZOafIXj6ktFICgnHzgXQKlvs44HvaS4.cache +1 -0
  342. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jXAa5hghD4VHps1S-0rMrQYRXN8BBXvdn9E6IF0WjNE.cache +0 -0
  343. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jpHebb6f41gfqFBkL022mjpgGVahPL8Ekh1lLg2IlIo.cache +2 -0
  344. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jvbwlV4plHlp9PGnxZ3OUSBxRathaXrVgIYbETC4TLA.cache +0 -0
  345. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jxmh-q1ZW56jxojXdgi4lN0tIeaRlxXbjGoIMg9vz6A.cache +1 -0
  346. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jyqD2PEbsUGGdyIgbi8qzfxkUEXQcMx9KLnzPk5d0cg.cache +0 -0
  347. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kKKd-AX4C2iQMZWzKs1fRBdZZ55e-EPGa0KG01lpges.cache +1 -0
  348. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/knnWBtJbi88d3b8x6dF6p4ULZW3CRg2iKMjOlzyl5U8.cache +0 -0
  349. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kwNkwoshx63tQMuxFAI9_pmzzwkd0kQcAKGx8dy62r8.cache +0 -0
  350. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/l4Ffy5jgVLu9dt8-l5Kfc1HJe4d97NaNA9FVK3-EgZ8.cache +2 -0
  351. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lG5HoTNviW0JZhvB2jX5FK_qt5yd2zvhNScWeyOxSlE.cache +0 -0
  352. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lph3uDhnwIX4t1R9-tVND4IFnhJqL1LqQtMrvfG6w7s.cache +1 -0
  353. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lzBnHrVdWXPgCGDMWeM697bVZm_TnCs0-BOLGSabSHU.cache +0 -0
  354. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/m95yq-mMsjThZfR9xAkTGkdo_JkJ9U7FMuGouKiLeYI.cache +1 -0
  355. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mbXvxeAfJlLiWH1ENKWs5K35rGtCFwVC7Zh8iz0VxKc.cache +0 -0
  356. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mztptfmRewdrtufZGYsHIP-cUobPQ9-KjG8g7J9AlEI.cache +1 -0
  357. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/n7XFj-ICkjn7X4nWPnxX5kW4l2h-GofBeWkFwm3kwqs.cache +3 -0
  358. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nTw9g87OxunHhH1pqowngHCQQOw9DK2BmQ3M60OJ15g.cache +1 -0
  359. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nXvRhnR4EVKPvqpL5ybixATwGqSAAM3GnqoreQL7lOM.cache +0 -0
  360. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nd-bTF0GF0iq3FYx_gfrcw2MYqKJK3_u3qX_P-MB53c.cache +1 -0
  361. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nljNEWVMdSyfIlWTqKa0VgxX1eArA7WWm0aLUeXwZ50.cache +0 -0
  362. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oJA9-RKuPg1FyZ19t-ngXaxCLfAwE1U5oWuLrpbKxXk.cache +3 -0
  363. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oMUQEHW_ZczsOgceMbyny4zS_7JDQR4LVJsqDC0n1Qg.cache +1 -0
  364. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ofQEceU5jwHsMGUYlKsSKWsbhIcZmqkyDTIZMXnPSZw.cache +2 -0
  365. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oixKGcg4vjgjJVhlFVvaKQBguqvPhw-ieoH9mAkHbQQ.cache +1 -0
  366. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
  367. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pSu5LnLEpj6V7FhekaIzJ2IqzRZo0Ez4ZENr0VAe7TI.cache +1 -0
  368. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pcaV3zSe0X--5yc8sSWV79jvBtMWBE8wQa-qWdHCVxE.cache +1 -0
  369. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pfpeQRAl8pvI-oF3tjHTK0DO1xmDYrOBNahm32WF9k8.cache +3 -0
  370. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pnW3u_1AN48ig6ngefI89y96xoSlvnJurx-e3J-leoE.cache +2 -0
  371. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pyglm4tF6LyPZb7zZ4zXxFkSJNqS7k6t2EfdGyK4nEs.cache +2 -0
  372. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qHufjeN07K5cjvundz8j9byD1bx0_zHs8RVtt8CPelc.cache +1 -0
  373. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qRbG64Am2J0VJubIAD6GsUncqHCDtXdp7GpeITfNk40.cache +1 -0
  374. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qapMpzLzmfsKUVfx8heiDDl_aM2eDpgGIgMOFmGDzgc.cache +0 -0
  375. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ql-oqp5mf_wnLFbkuDE5LgWxgPTkowkRERBa9J1Ufz4.cache +3 -0
  376. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qp_pHvhopL_R2ArATeOwTF5IuErK2mmfscIjmi0du9I.cache +2 -0
  377. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qr43tN6jxdx2nBuZzVh0W482kex6JzpRT_Jlg76vs4w.cache +1 -0
  378. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qz280481u2bUSM15O8fjWQh8hRz2x9qLLz9yoJ11N_U.cache +3 -0
  379. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/r-s_eJx0epqP7zZY6vKtRB-IX2wsSvsotT_p-p3r0kA.cache +0 -0
  380. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rHmecJHt_CBXvz20fbtsdk8OgoC9kzNTumxJ9P9syMk.cache +1 -0
  381. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rx120TUndw4AbM88UBSGpYJDA-eXMy3CXjIepvputuo.cache +1 -0
  382. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sHQrRWJLOYIiRDclrVXPviF4RjD612SRu8kt77SUiHY.cache +1 -0
  383. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sLvNEi7VzgmnhJQZR2jc22RIAUd4IZUEhz-ZF3L0s0I.cache +3 -0
  384. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sV7IPxJP0BDm_iFz5Ye0I5GUbqToWPGafxxHzruqn4o.cache +3 -0
  385. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sgTRuK6vzO49r6Qci597WQXim5wOcnfMY8b3Wj9WT54.cache +1 -0
  386. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sgxkvOxkALoZe-Fr8m9-ZlEmRI4Dki2eR9-L4NxZs9g.cache +2 -0
  387. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/slMNWTYxn6-pY7ZoQgwD7OirDZ-_JNhoINpkhSM8JpU.cache +1 -0
  388. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/snCjf2nATp16sbihKkc3WmJKwrM-Nf6uyHD4lvkhYBI.cache +0 -0
  389. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ssS2x0Wl67rwXHaVHsh6CO7ayn9fQ5saIwATKN6O-nI.cache +2 -0
  390. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t7tlINbMNG_NUzXHBaszeCQI2VRXov1jsG8gGGFGjK8.cache +1 -0
  391. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tQFwNvTvB7WSc1MNrrrlR2npWEGH6-4H9ZQBt53ihrk.cache +1 -0
  392. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tYFbDrMNElXwgmisit50aNXJvRU2zlIFk5g-EJ1CQTc.cache +3 -0
  393. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tbmMu3ukwKaE0BjbtkJhphibnWbw_syO40zEfULJcwQ.cache +0 -0
  394. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tiEnLwHMkjzRHoNu0gppx2GSTp6HvRuMkp-2Oqbe1ZQ.cache +0 -0
  395. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tlN7GHZ8yK48bJWEK_4Cweb3dif5L4wN7NnoOKHL5ro.cache +1 -0
  396. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tu3RdLHCMPI-LywuuixWPMSuKUR4--X_j4TI_rdV760.cache +3 -0
  397. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uAmF6E3JpcBzFORYg5hyetm0KtLM3wLjBGuU17UWlv0.cache +0 -0
  398. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uyBTtu4gN_KBmzSxbVUtmM-v9o5B5gccXFhLYlhZLrc.cache +3 -0
  399. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uzCihE-AR8X_6E7z1wNEtuLj-cVjaFBTqADSON-tTQk.cache +1 -0
  400. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vGc3WFFBAviuYcm6LJ5gcu5NtbU8muNyHCOvpZyU2SQ.cache +2 -0
  401. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vQMIiaadoH60k_hYUYeiCYJjRLpHKm-gG7uHD1wqPfo.cache +2 -0
  402. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vd1KC6jswqrOuvnRtTRD89GERlj2Yip2SZaLZBndMWc.cache +0 -0
  403. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vrpQ-4TWh71cU-S0YXR-Z_GHzbQdmQML6DcHOlDxFs8.cache +0 -0
  404. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w1UmGVnv7CKA4yH1W1WrIvOM5Mg5CKAwMhkDa9H-wGk.cache +1 -0
  405. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wJQv5wdvs9wuczaJi6QdbPilkpGYi_NfQwtTC0LfKBM.cache +0 -0
  406. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wNVcsMnZLVVRwxoib0AL-Pss7tzB-1stHUlDrzpQceU.cache +1 -0
  407. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wOrRYBx4PnokGHsz8brJHk3CsBA_R5QtMxcXGacWx08.cache +0 -0
  408. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wR0ZldWRUBI76kaGAshsJ_ExZYfvGUIofuzRJHhsXsA.cache +0 -0
  409. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wRDw4YT27lmkKhaxdAnGp9pC4Z3qjiGcDuvoRNK8R1I.cache +1 -0
  410. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wTNryqjmrX_JP9rznKzF2y2a2YrSyzzgma8K9FG3-O0.cache +1 -0
  411. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wkb-pWvPH2suUNI4gli3yDzco5HXEof-eMU1KvildcI.cache +2 -0
  412. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wnUKZCI4IN78eoQeCsmk_i1KICUeR5377bgTIteGP80.cache +0 -0
  413. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/x6XzpqRQR0k33t_wGetXxFR4RNnG6mrp0FOBKcl4jb4.cache +1 -0
  414. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xBgeZhWxNu0MxtqsstirphbvHYba8SKFl6iWeFh92rE.cache +0 -0
  415. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xBn8xD9ZqQS3Ny4c1qGktFCWWCBs5TZ2T8NGu-mA3co.cache +0 -0
  416. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xFaJO3VyqCmZEFPdJ-P4DXsHfFcZvUjgM7CtiN81zyo.cache +1 -0
  417. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xK2dbjxrVzOePTatsreZ4nnh3ClthCqnPSehyBuO2ZI.cache +0 -0
  418. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xN9mBpSlxZ4JLyc0q561T_SLLvqnIpXprtk4baJpCjs.cache +0 -0
  419. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xgMGrsGgELUI1JBrlpZ6cAciwQgg2K2RHVNWfTJplqU.cache +1 -0
  420. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xoKDo_P83JYN3961boUtbDxcu7sgJI75E3jrJuVLsMs.cache +0 -0
  421. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xtTEgatYUqNva-IT6ZqzWf5TESvI6ZpZtdqApKObz00.cache +3 -0
  422. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJKiLlva8DyyyKYTNUpTFJpylQoL56pi_IW4vZkyqj8.cache +2 -0
  423. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJnRPnw0vpepiXdtY3aVTpcLkpLuy8-6OSfuxlXDIqI.cache +0 -0
  424. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yTq_Kw6ZznYtfUwEVQcnwQcZMvk8LG97iLYfiu6G0So.cache +2 -0
  425. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yYWy53efsOhst-Z42foBwjtw0if-f9D7G48WxIxl29M.cache +0 -0
  426. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y_iYPVLd6X40_N5VUuMQ9_her8ChEG_3389tfIkdXAg.cache +0 -0
  427. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yiCGj-7Lcf3QQiNEWZvEGKPvEYmeDOVICqO9RxNFuY8.cache +3 -0
  428. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ypbYZxdZm4IRZUBKtmDkBCX-uK7cb5LTzau4qMdbn-Y.cache +1 -0
  429. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yqRpn4nfsiyFK9SduAt_6SvG5oxNX4yGdAkuLWQIMF4.cache +0 -0
  430. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yxZppbEFzuw0ceHGlPraaFSyHauQhC-W27YkpGOat4g.cache +1 -0
  431. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yzDL94QvKghx1HWV0_j4knxWP50emPZz5acLQPAFkyk.cache +3 -0
  432. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/z5MJ3dGP-oEQ4OicSFvpF6LC2Hiu_N5X4OXUvTcEkJQ.cache +1 -0
  433. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zCHY3Px9vEvHp49LVEcJwirmOzwBRmXHVAuhJZekyEA.cache +2 -0
  434. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zUgR8-T7pENJvFOubVNhutku2rwfui6pbfr7P6hUf70.cache +1 -0
  435. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zW-P8B7lOQSeQCGunKH30LiXn0QwGPBZGKGmUed-6QI.cache +3 -0
  436. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXbpClElJq8zwSwvf6-afJPNib2fisrkygDE8IsFQ6g.cache +0 -0
  437. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXeO3OESUCMsMCtlCty57A32WQ-yiiDDC_keencK8JE.cache +1 -0
  438. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXnjRyD6hCOEmKVRwgAUzbSSUOtnw7fkIPr_pmAPu6I.cache +1 -0
  439. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zcVf7iNuAXXr2uTNmOFUONY0W_n__zGDC7y924dOd7Q.cache +1 -0
  440. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zdaei-ObMqKCqfd60KURUHbIOgzJB9tcnY3bQxNiBj8.cache +1 -0
  441. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zq3uZtzIUcUfsdw7NltjSkoNhDYP0_tt36dmJH6DPPw.cache +1 -0
  442. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zttbDN8QAQl58qoFYUOMY429NdXLuS7mSN3tLlL1GTc.cache +1 -0
  443. data/test/dummy/tmp/pids/passenger.3000.pid.lock +0 -0
  444. data/test/formalizer_test.rb +59 -0
  445. data/test/models/form_field_test.rb +127 -0
  446. data/test/models/form_test.rb +117 -0
  447. data/test/models/formalizer_config_test.rb +35 -0
  448. data/test/models/formalizer_form_field_test.rb +39 -0
  449. data/test/models/formalizer_form_test.rb +34 -0
  450. data/test/models/utils_test.rb +30 -0
  451. data/test/test_helper.rb +20 -0
  452. metadata +991 -0
@@ -0,0 +1,322 @@
1
+ class String
2
+ def to_bool
3
+ return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
4
+ return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i)
5
+ raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
6
+ end
7
+ end
8
+
9
+ class Formalizer
10
+
11
+ # Holds attributes for a single field in a form.
12
+ #
13
+ # === Attributes
14
+ #
15
+ # * +id+ - Unique textal identifier for the field. See generate_id
16
+ # * +field_type+ - One of possible options described in TYPES constant
17
+ # * +name+ - field name in current locale. For custom locale use method: name(locale)
18
+ # * +enumeration+ - if field_type is :enum or :multiple, list of options for enumeration in current locale
19
+ # for custom locale use method: enumeration(locale)
20
+ # * +validation+ - a hash with validation rules, TBD
21
+ # * +default_value+ - the default value in current locale. for custom locale use method: defaut_value(locale)
22
+
23
+ class FormField
24
+ attr_reader :id, :field_type, :name, :enumeration, :validation, :default_value, :value
25
+
26
+ TYPES = {
27
+ boolean: 1,
28
+ number: 2,
29
+ text: 3,
30
+ enum: 4,
31
+ multiple: 5
32
+ }
33
+
34
+ # Prefixes that can be localized in constructor params. See initialze and examples below
35
+
36
+ LOCALIZED_TYPES = [
37
+ :name,
38
+ :enumeration,
39
+ :default_value
40
+ ]
41
+
42
+
43
+
44
+ # see usage examples at the end:
45
+
46
+ def initialize params
47
+ validate_params params
48
+
49
+ # populating properties
50
+
51
+ @field_type = params[:field_type].nil? ? TYPES[:text] : TYPES[params[:field_type].to_sym]
52
+ localize params
53
+ @validation = params[:validation] || {}
54
+ @id = params[:id] || generate_id
55
+ @default_value = params[:default_value] unless params[:default_value].nil?
56
+ @value = nil
57
+ end
58
+
59
+
60
+ # getters
61
+
62
+ def name locale = I18n.locale
63
+ @localized[:name][locale] || ''
64
+ end
65
+
66
+ def enumeration locale = I18n.locale
67
+ @localized[:enumeration][locale] || []
68
+ end
69
+
70
+ def default_value locale = I18n.locale
71
+ return @localized[:default_value][locale]
72
+ end
73
+
74
+ def value locale = I18n.locale
75
+ return '' if @value.nil?
76
+ return send("#{TYPES.key(@field_type)}_value", locale)
77
+ end
78
+
79
+
80
+ # setters
81
+
82
+ # Since we deal with html, value must be a String
83
+
84
+ def value= new_value
85
+ validated = send("validate_#{TYPES.key(@field_type)}_value", new_value)
86
+ @value = validated
87
+ end
88
+
89
+
90
+ # Renders the field as HTML control
91
+ # * +parent_node+ - the HTML parent under which to render (needed by Nokogiri)
92
+ # * +locale+ - localized input. Relevant if field_type is enum or multiple
93
+
94
+ def render_html parent_node, locale = I18n.locale
95
+ inp = send("render_html_#{TYPES.key(@field_type)}", parent_node, locale)
96
+ inp['id'] = @id
97
+ inp['name'] = @id
98
+ return inp
99
+ end
100
+
101
+
102
+ private
103
+
104
+ # generates a text id to use inside forms
105
+ # strips non alpfanumeric characters from name, lowercases the result
106
+ # and replaces whitespaces with '_'
107
+ # adds a unique hash at the end
108
+ # e.g. 'First Name (required)' -> 'first_name_required_f5f6f0ae0717937a039488c5b6163d6f'
109
+
110
+ def generate_id
111
+ base_name = @localized[:name][:en] || @localized[:name].values.first || ''
112
+ underscored_name = base_name.gsub(/[^0-9a-z ]/i, '').downcase.gsub(/\s+/, '_') << '_'
113
+ underscored_name += Digest::MD5.new.update(Time.now.to_i.to_s).hexdigest
114
+ end
115
+
116
+
117
+
118
+
119
+ # creates localized hash from initializer params with default locale
120
+ # example: initializer params { name: 'Gender' ....}
121
+ # result: {name: {en: 'Gender'}}
122
+ # example: initializer params { name: {en: 'Gender', es: es: 'Género'} ... }
123
+ # result: {name: {en: 'Gender', es: 'Género'}}
124
+
125
+ def localize params
126
+ @localized = {}
127
+ LOCALIZED_TYPES.each do |localized_type|
128
+ if params[localized_type].class == Hash
129
+ # params are already localized per locale
130
+ @localized[localized_type] = params[localized_type]
131
+ else
132
+ @localized[localized_type] = {I18n.locale => params[localized_type]}
133
+ end
134
+ end
135
+ end
136
+
137
+
138
+ # validate initializer params and raises exceptions unless validation passes
139
+
140
+ def validate_params params
141
+
142
+ raise FormFieldParamMissing, 'params must be a hash' unless params.class == Hash
143
+
144
+ # validating that at least one name_{locale} exists
145
+ raise FormFieldParamMissing, 'name is requireed' if params[:name].nil?
146
+
147
+ # validate that names are non-empty strings
148
+ names = params[:name].class == Hash ? params[:name].values : [params[:name]]
149
+ names.each do |name_value|
150
+ raise WrongValueClass, 'name should be a String' unless (name_value.is_a?String)
151
+ raise FormFieldParamMissing, 'name cannot be empty' if name_value.empty?
152
+ end
153
+
154
+ # validating that enumeration exists if field_type is enum or multiple
155
+ if [:enum, :multiple].include?(params[:field_type])
156
+ error_message = "enumeration array of >1 items requireed if field_type is enum/multiple"
157
+ enumerations = params[:enumeration].class == Hash ? params[:enumeration].values : [params[:enumeration]]
158
+ raise FormFieldParamMissing, error_message if enumerations.length == 0
159
+ enumerations.each do |enumeration|
160
+ if (!enumeration.is_a?Array) || (enumeration.length < 2)
161
+ raise FormFieldParamMissing, error_message
162
+ end
163
+ end
164
+ end
165
+
166
+ # validates param types
167
+
168
+ end
169
+
170
+
171
+
172
+ # Value validators
173
+
174
+ def validate_boolean_value new_value
175
+ new_value = new_value.to_bool if new_value.is_a?String
176
+ is_boolean = (!!(new_value) == new_value)
177
+ raise WrongValueClass, 'value should be boolean' unless is_boolean
178
+ return new_value
179
+ end
180
+
181
+ def validate_number_value new_value
182
+ if new_value.is_a?String
183
+ new_value = (new_value.include?'.') ? new_value.to_f : new_value.to_i
184
+ end
185
+ is_number = ((new_value.is_a?Fixnum) || (new_value.is_a?Float))
186
+ raise WrongValueClass, 'value should be a number' unless is_number
187
+ return new_value
188
+ end
189
+
190
+ def validate_text_value new_value
191
+ raise WrongValueClass, 'value whould be a string' unless new_value.is_a?String
192
+ return new_value
193
+ end
194
+
195
+ def validate_enum_value new_value
196
+ new_value = new_value.to_i if new_value.is_a?String
197
+ raise WrongValueClass, 'value should be a fixnum' unless new_value.is_a?Fixnum
198
+ raise WrongValueClass, 'value should be >= 0' if new_value < 0
199
+ min_enumeration_length = @localized[:enumeration].values.map{|enumeration| enumeration.length}.min
200
+ raise WrongValue, 'value should be within enumeration range' if new_value >= min_enumeration_length
201
+ return new_value
202
+ end
203
+
204
+ def validate_multiple_value new_value
205
+ new_value = new_value.to_i if new_value.is_a?String
206
+ raise WrongValueClass, 'value should be an array' unless new_value.is_a?Array
207
+ min_enumeration_length = @localized[:enumeration].values.map{|enumeration| enumeration.length}.min
208
+ raise WrongValueClass, 'array values should be >= 0' if new_value.min < 0
209
+ raise WrongValue, 'values should be within enumeration range' if new_value.max >= min_enumeration_length
210
+ return new_value
211
+ end
212
+
213
+
214
+
215
+
216
+ # value parsers: return type dependent value
217
+
218
+ def boolean_value locale
219
+ @value ? '&#10004;' : '-' # TODO: render as checkbox?
220
+ end
221
+
222
+ def number_value locale
223
+ @value ? @value.to_s : ''
224
+ end
225
+
226
+ def text_value locale
227
+ @value || ''
228
+ end
229
+
230
+ def enum_value locale
231
+ @value.nil? ? '' : @localized[:enumeration][locale][@value].to_s
232
+ end
233
+
234
+ def multiple_value locale
235
+ @value.nil? ? '' : @value.map{|val| @localized[:enumeration][locale][val].to_s}
236
+ end
237
+
238
+
239
+ # HTML renderers
240
+
241
+
242
+ def render_html_boolean parent_node, locale = I18n.locale
243
+ inp = Nokogiri::XML::Node.new('input', parent_node)
244
+ inp['type'] = 'checkbox'
245
+ inp['checked'] = 'true' if @default_value == true
246
+ return inp
247
+ end
248
+
249
+ def render_html_number parent_node, locale = I18n.locale
250
+ inp = Nokogiri::XML::Node.new('input', parent_node)
251
+ inp['type'] = 'number'
252
+ inp['value'] = @default_value if @default_value
253
+ return inp
254
+ end
255
+
256
+ def render_html_text parent_node, locale = I18n.locale
257
+ inp = Nokogiri::XML::Node.new('input', parent_node)
258
+ inp['type'] = 'text'
259
+ inp['value'] = self.default_value(locale)
260
+ return inp
261
+ end
262
+
263
+ def render_html_enum parent_node, locale = I18n.locale
264
+ return select_with_options(parent_node, locale)
265
+ end
266
+
267
+ def render_html_multiple parent_node, locale = I18n.locale
268
+ select_tag = select_with_options(parent_node, locale)
269
+ select_tag['multiple'] = 'true'
270
+ return select_tag
271
+ end
272
+
273
+ def select_with_options parent_node, locale = I18n.locale
274
+ inp = Nokogiri::XML::Node.new('select', parent_node)
275
+ enumeration(locale).each_with_index do |enum, index|
276
+ enum_option = Nokogiri::XML::Node.new('option', inp)
277
+ enum_option['value'] = index.to_s
278
+ enum_option.content = enum
279
+ enum_option['selected'] = 'true' if default_value == index
280
+ enum_option.parent = inp
281
+ end
282
+ return inp
283
+ end
284
+
285
+
286
+
287
+ # usage example 1 - enumerated, default locale:
288
+ # Formalizer::FormField.new({
289
+ # id: 'gender',
290
+ # name: 'Gender',
291
+ # field_type: :enum,
292
+ # enumeration: ['male', 'female', 'irrelevant'],
293
+ # default_value: 2})
294
+ # usage example 2 - enumerated, localized:
295
+ # Formalizer::FormField.new({
296
+ # id: 'gender',
297
+ # name: {
298
+ # en: 'Gender',
299
+ # es: 'Género'
300
+ # },
301
+ # field_type: :enum,
302
+ # enumeration: {
303
+ # en: ['male', 'female', 'irrelevant'],
304
+ # es: ['masculino', 'femenino', 'irrelevante']
305
+ # },
306
+ # default_value: 2})
307
+ # usage example 2 - text, localized:
308
+ # Formalizer::FormField.new({
309
+ # id: 'first_name',
310
+ # name: {
311
+ # en: 'First Name',
312
+ # es: 'Nombre de pila'
313
+ # },
314
+ # field_type: :text,
315
+ # default_value: {
316
+ # en: John,
317
+ # es: Juan
318
+ # }})
319
+
320
+ end
321
+ end
322
+
@@ -0,0 +1,253 @@
1
+ class Formalizer
2
+
3
+ # This is the main Formalizer object you use to create, fill and export html documents from user-input.
4
+ # The user input fields can be preset in a config/formalizer.yml file
5
+ # or programatically, by calling add_form_field
6
+
7
+ # EMPTY_CONFIG constant used to initialize config if not given from YAML file
8
+
9
+ EMPTY_CONFIG = {
10
+ form_fields: {},
11
+ forms: {}
12
+ }
13
+
14
+ attr_reader :form_sources, :forms, :form_fields, :tags
15
+
16
+
17
+
18
+ # Constructor
19
+ # Tries loading configuration from YAML file, falling back to an empty config
20
+ # Caching form fields and form targets (a target can be a path or actual html)
21
+
22
+ def initialize config_file = 'formalizer.yml'
23
+ load_config config_file
24
+
25
+ @form_fields = {}
26
+ @form_sources = {}
27
+ @forms = {}
28
+ @tags = {form_fields: {}, forms: {}}
29
+ @config[:form_fields].each do |key, value|
30
+ add_form_field value.merge(id: key)
31
+ end
32
+
33
+ @config[:forms].each do |key, value|
34
+ add_form key, value
35
+ end
36
+ end
37
+
38
+
39
+ # Adds a FormField object to the hash
40
+ # Aalidates that the id is unique
41
+ # * +form_field_hash+ - a hash describing the form field.
42
+ # See examples at the end of formalizer/form_field.rb
43
+
44
+ def add_form_field form_field_hash
45
+ # unique id validation
46
+ raise NotUniqueId unless @form_fields[form_field_hash[:id]].nil?
47
+
48
+ # adding to hash
49
+ @form_fields[form_field_hash[:id]] = FormField.new(form_field_hash)
50
+
51
+ # handling tags
52
+ add_tags :form_fields, form_field_hash
53
+ end
54
+
55
+
56
+ # Adds a form source (path or html) to the forms hash
57
+ # Validates that the id is unique
58
+ # * +form_id+ - a unique id to the form
59
+ # * +form_hash+ - a hash containing form path/html and tags
60
+
61
+ def add_form form_id, form_hash
62
+ # unique id validation
63
+ raise NotUniqueId unless @form_sources[form_id].nil?
64
+ raise TypeError, 'form_hash should be Hash' unless (form_hash.is_a?Hash)
65
+ raise Formalizer::PathOrHtmlRequired, 'form_hash[:path] required' if form_hash[:path].nil?
66
+
67
+ # adding to hash
68
+ @form_sources[form_id] = form_hash[:path]
69
+
70
+ # handling tags
71
+ add_tags :forms, form_hash
72
+
73
+ true
74
+ end
75
+
76
+
77
+ # Fills one form field with content
78
+ # * +field_id+ - the field id
79
+ # * +field_value+ - value to fill the field
80
+
81
+ def fill_field field_id, field_value
82
+ raise FieldNotFound, "field #{field_id} not found" if @form_fields[field_id].nil?
83
+ @form_fields[field_id].value = field_value
84
+ end
85
+
86
+
87
+ # Fills multiple form fields with content
88
+ # * +field_params+ - Hash of field_id: field_value objects to fill multuple fields
89
+
90
+ def fill_fields field_params
91
+ raise TypeError, 'field_params should be a Hash' unless (field_params.is_a?Hash)
92
+ field_params.each do |field_id, field_value|
93
+ fill_field(field_id, field_value)
94
+ end
95
+ end
96
+
97
+
98
+ # Exports a form to pdf
99
+ # * +form_id+ - the form id to export
100
+ # * +tag+ - narrows down the passed fields list to fields under the specified tag.
101
+ # If nil - all fields will be passed to form
102
+
103
+ def export_form_to_pdf form_id, tag = nil
104
+ form = bind_form_fields(form_id, tag)
105
+ return form.export_to_pdf
106
+ end
107
+
108
+
109
+
110
+ # Exports a form to html
111
+ # * +form_id+ - the form id to export
112
+ # * +tag+ - narrows down the passed fields list to fields under the specified tag.
113
+ # If nil - all fields will be passed to form
114
+
115
+ def export_form_to_html form_id, tag = nil
116
+ form = bind_form_fields(form_id, tag)
117
+ return form.export_to_html
118
+ end
119
+
120
+
121
+ # Loads config from YAML file
122
+ # * +config_file+ - path to the config file, absolute or relative to app's 'config' path
123
+ # Raises an error if YAML file is ill-formatted
124
+ # Puts a warning if not YAML file not found
125
+
126
+ def load_config config_file
127
+ # searching in paths
128
+ @config = nil
129
+ begin
130
+ config_file_content = Utils::find_file(config_file) # will raise an exception if not found
131
+ @config ||= YAML.load(config_file_content)
132
+ rescue FileNotFound
133
+ # ok, no config... not a disaster
134
+ puts "YAML Not found in #{File.expand_path(config_file)}"
135
+ rescue Psych::SyntaxError
136
+ # config found but ill-formatted YAML
137
+ raise "YAML Syntax Error in #{file_path}"
138
+ end
139
+
140
+ # Fallback to an empty config
141
+ @config ||= EMPTY_CONFIG
142
+
143
+ validate_config
144
+
145
+ # YAML is translated to quoted keys, FormField expects symbols:
146
+ @config.deep_symbolize_keys!
147
+
148
+ end
149
+
150
+
151
+
152
+ # Generates an HTML form with fields to fill.
153
+ # * +locale+ - relevant with enum/multiple type fields, defaults to default app locale
154
+ # * +form_action+ - generated form can have an action. Defaults to ''
155
+ # * +tag+ - narrows down thefields list to those under the specified tag. Defaults to all fields
156
+
157
+ def generate_fields_form locale = I18n.locale, form_action = '', tag = nil
158
+ fields = fields_by_tag(tag)
159
+ action = form_action.empty? ? '' : " action=\"#{form_action}\""
160
+ html = Nokogiri::HTML("<body><form#{action} method='POST'><fieldset></fieldset></form></body>")
161
+ fields.each do |key, field|
162
+ wrapper = Nokogiri::XML::Node.new('div', html)
163
+ label = Nokogiri::XML::Node.new('label', wrapper)
164
+ label['for'] = field.id
165
+ label.content = "#{field.name(locale)}:"
166
+ rendered_field = field.render_html(wrapper, locale)
167
+ label.parent = wrapper
168
+ rendered_field.parent = wrapper
169
+ wrapper.parent = html.at_css('fieldset')
170
+ end
171
+ submit_container = Nokogiri::XML::Node.new('div', html)
172
+ submit_types = %w(HTML PDF)
173
+ %w(reset submit submit).each_with_index do |control_type, index|
174
+ reset_submit = Nokogiri::XML::Node.new('input', submit_container)
175
+ reset_submit['type'] = control_type
176
+ if control_type == 'submit'
177
+ reset_submit['name'] = "export_#{submit_types[index - 1]}"
178
+ reset_submit['value'] = "Export as #{submit_types[index - 1]}"
179
+ end
180
+ reset_submit.parent = submit_container
181
+ end
182
+ submit_container.parent = html.at_css('fieldset')
183
+ html.to_s
184
+ end
185
+
186
+ # Private methods
187
+
188
+ private
189
+
190
+
191
+ # Validates that the config file has the necessary ingredients
192
+
193
+ def validate_config
194
+ # checking that all field ids are unique
195
+ [:form_fields, :forms].each do |config_item|
196
+ raise ConfigError, "config should be a keys-values structure" unless @config.is_a?Hash
197
+ if (@config[config_item].nil?) && (@config[config_item.to_s].nil?)
198
+ raise ConfigError, "missing key in config: #{config_item}"
199
+ end
200
+ ids = @config[config_item] ? @config[config_item].keys : @config[config_item.to_s].keys
201
+ raise ConfigError, "Config form_fields - keys must be unique" if ids.uniq.length != ids.length
202
+ end
203
+ end
204
+
205
+
206
+ # Gets a form instance
207
+ # Returning cached instance or caching one and returning it
208
+ # * +form_id+ - the id of the form to get
209
+
210
+ def get_form form_id
211
+ form = @forms[form_id] || lambda{@forms[form_id] = Form.new(form_id, @form_sources[form_id])}.call
212
+ end
213
+
214
+
215
+
216
+ # Handles form_field and form tags
217
+ # * +tag_type+ - :form_fields or :forms
218
+ # * +object_hash+ - A hash with :tags key. The value for :tags key can an Array or String.
219
+ # if Array: ['tag1', 'tag2'] ...
220
+ # if String: will be converted to an array ['tag1']
221
+
222
+ def add_tags tag_type, object_hash
223
+ unless object_hash[:tags].nil?
224
+ tags = (object_hash[:tags].is_a?Array) ? object_hash[:tags] : [object_hash[:tags]]
225
+ tags.each do |tag_name|
226
+ @tags[tag_type][tag_name] ||= []
227
+ @tags[tag_type][tag_name] << object_hash[:id]
228
+ end
229
+ end
230
+ end
231
+
232
+
233
+ # binds form fields with data
234
+ # * +form_id+ - the form id to bind
235
+ # * +tag+ - narrows down the fields list to fields under the specified tag.
236
+ # or all fields if tag is nil
237
+
238
+ def bind_form_fields form_id, tag = nil
239
+ form = get_form(form_id)
240
+ form.fill(fields_by_tag(tag))
241
+ return form
242
+ end
243
+
244
+
245
+ # return fields list by tag, or all fields if tag is nil
246
+ # * +tag+ - narrows down the fields list to fields under the specified tag.
247
+ # or all fields if tag is nil
248
+
249
+ def fields_by_tag tag = nil
250
+ tag.nil? ? @form_fields : @form_fields.select{|key, ff| @tags[:form_fields][tag].include?(ff.id)}
251
+ end
252
+
253
+ end
@@ -0,0 +1,61 @@
1
+ class Formalizer
2
+
3
+ class Utils
4
+
5
+ # SEARCH_PATHS constant
6
+ # Usually formalizer.yml is in root config directory
7
+ # Gem's testing directory is test/dummy/config
8
+
9
+ SEARCH_PATHS = %w(config test/dummy/config test/dummy)
10
+
11
+
12
+ def self.find_file file_path, read = true, search_paths = SEARCH_PATHS
13
+
14
+ if file_path[0] == '/'
15
+ # probably absolute path
16
+ # raise exception if file not found
17
+ raise FileNotFound, 'file not exists' unless File.exists?file_path
18
+ return read ? File.read(file_path) : fild_path
19
+ else
20
+ # probably relative path, searching in SEARCH_PATHS
21
+ search_paths.each do |path|
22
+ absolute_file_path = "#{File.expand_path(path)}/#{file_path}"
23
+ begin
24
+ return (read ? File.read(absolute_file_path) : absolute_file_path) if File.exists?(absolute_file_path)
25
+ rescue Errno::EISDIR
26
+ raise FileNotFound, 'path is a directory, not a file'
27
+ end
28
+ end
29
+ end
30
+
31
+ # not found anywhere
32
+ raise FileNotFound, 'file not exists' unless File.exists?file_path
33
+ end
34
+
35
+
36
+ # tries getting the full local path to a relative/absolute path
37
+ # (image src attribute, stylesheet rel attribute)
38
+ # * +path+ - the original relative/absolute path
39
+
40
+ def self.final_path path
41
+ if path.start_with?'http'
42
+ # external path, nothing to do, return path as is
43
+ return path
44
+ elsif path[0..6].include?'assets'
45
+ # path is probably an asset, searching in assets
46
+ final_path = self.find_file(Pathname.new(path).basename.to_s, false, Rails.application.config.assets.paths)
47
+ else
48
+ # path is a relative path
49
+ begin
50
+ final_path = self.find_file(path, false)
51
+ rescue Formalizer::FileNotFound
52
+ # path not found
53
+ return ''
54
+ end
55
+ end
56
+ return "file:///#{final_path}"
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,3 @@
1
+ class Formalizer
2
+ VERSION = "1.0.0"
3
+ end
data/lib/formalizer.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'formalizer/errors'
2
+ require 'formalizer/utils'
3
+ require 'formalizer/form_field'
4
+ require 'formalizer/form'
5
+ require 'formalizer/formalizer'
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :formalizer do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,5 @@
1
+ ruby '2.2.2'
2
+ source 'https://rubygems.org'
3
+
4
+ gem 'wicked_pdf'
5
+ gem 'wkhtmltopdf-binary'
@@ -0,0 +1,12 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ wicked_pdf (1.0.0)
5
+ wkhtmltopdf-binary (0.9.9.3)
6
+
7
+ PLATFORMS
8
+ ruby
9
+
10
+ DEPENDENCIES
11
+ wicked_pdf
12
+ wkhtmltopdf-binary
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.