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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +207 -0
- data/Rakefile +34 -0
- data/lib/formalizer/errors.rb +15 -0
- data/lib/formalizer/form.rb +127 -0
- data/lib/formalizer/form_field.rb +322 -0
- data/lib/formalizer/formalizer.rb +253 -0
- data/lib/formalizer/utils.rb +61 -0
- data/lib/formalizer/version.rb +3 -0
- data/lib/formalizer.rb +5 -0
- data/lib/tasks/formalizer_tasks.rake +4 -0
- data/test/dummy/Gemfile +5 -0
- data/test/dummy/Gemfile.lock +12 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/acme_logo.jpg +0 -0
- data/test/dummy/app/assets/images/formalizer.png +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/javascripts/fill_details.js +2 -0
- data/test/dummy/app/assets/javascripts/home.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/assets/stylesheets/bootstrap_yeti.css +7109 -0
- data/test/dummy/app/assets/stylesheets/fill_details.css +4 -0
- data/test/dummy/app/assets/stylesheets/form.css +20 -0
- data/test/dummy/app/assets/stylesheets/home.css +4 -0
- data/test/dummy/app/controllers/about_controller.rb +6 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/demo_controller.rb +103 -0
- data/test/dummy/app/controllers/home_controller.rb +6 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/fill_details_helper.rb +2 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/test/dummy/app/views/about/show.html.erb +6 -0
- data/test/dummy/app/views/demo/index.html.erb +7 -0
- data/test/dummy/app/views/home/show.html.erb +22 -0
- data/test/dummy/app/views/layouts/application.html.erb +24 -0
- data/test/dummy/app/views/shared/_navbar.html.erb +16 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/_formalizer.yml +102 -0
- data/test/dummy/config/alternative_invalid_config1.yml +41 -0
- data/test/dummy/config/alternative_invalid_config2.yml +1 -0
- data/test/dummy/config/alternative_valid_config.yml +42 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/form1.html +139 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/invalid_html_formalizer_tags_without_ids.html +5 -0
- data/test/dummy/config/invalid_html_no_formalizer_tags.html +5 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +7 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +7107 -0
- data/test/dummy/log/passenger.3000.log +2681 -0
- data/test/dummy/log/test.log +4830 -0
- data/test/dummy/passenger.3000.pid.lock +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/controllers/fill_details_controller_test.rb +7 -0
- data/test/dummy/test/controllers/home_controller_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-Z8-x8TP2IpXxzIQCnPJmwpJQLBA1vkQZIs-v5IqO1M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0QhQ_r6EX-PaO37-YZcRkQsrNuiQ2lMZ78kOr9nizbo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0gaoXk74LdRQaVC-V6RnHNTFukvBZK6P7TSCKGK3iB4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0lmMGqilvmPepfDYe-P4TPj8HP55nK4OJgU_A7JN3vA.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/10FjxP4BObnBgDu_BfPbcN8u9gBcUtffAu43bKi18OE.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1E4iNysYJh97M_YQ2yLOmaIpv-TrGgZMuC1GG79zjPo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1LojJt0HPxdTxk8roqIik_rXQ4lXs1dds-NUPqBSLQ0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1TzpDaiXe-zq-W2i_uxXwiRngAIoS4lMkMV1YF_-Klw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1ZIYPPoIRMG1j1vxQhisia--vKTZrc14_GQdwEsFQsU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1ZylVP7ZDoGvLc-wMWjmTFaWqlB0BOGWbbESKK_O5zg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1zeTrAPOtYLg-JXxWQtphNiGAEZjECivNLOO2qHmZak.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/29NJdbsFyjUzJAXIzHCoilXDeM55NW6O3cuuRoMir44.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2pIrDdq-LQAZYsU3rnabBAAF3KoaUqd-UddqjLj6tig.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2t9hRAvHgc_FJbWXTMo1S0F6rT4U9Doze_q5dKJ-fIQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/30olZHQQ7WZTO-OTXByCyV6vQvD-jRNTxeLSKLexBZw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3E_mWo1orMy9qt95H9QfIEPkUy47lB7SEZHViXEsFqI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3WbrpN7fxH07Jo9_3u6T1QT3aSs8f0GtBY-tXlyMFGU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/3c3Nfn_SaD6FvHwA8eTWTzPRLztBsPQsm4lP92p1Zgg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4Qy3ua1ZxecQRiTw0N2X_g5fnog79TcUHR2OME4vIPE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/50srOL95A3hQiQ4Qny9El7UtyBykNpLQqwIDQoVhHk4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5BIJNXi8oXVWoLSkdp4lc3Th8PwMrk4bvez8RTabMuc.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5GwtVhuOkq0utxLWUiTqEU3Onyx3OrVgux-7uDhK0Ew.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5O2LYVux25geVSYTIjv2zA6Mm7Q7_wM0QxCacxCn1A8.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5Pgc4M14GZWEeVTkkd04jQEJpdqVAmyqi9glF6vb73I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5QCJCh3vy-_xBXSLbJhjpsNpLjMQmgHC7KlC5EBldL8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5QPZLgIEGL9Ktghpx_Usd-LEixQ1JmmMc8h5mpkosD0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5R-MvIULCjePz0cM8aamgI1CGUxcfDuzJlmIivuhkuk.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5zHbuyCXcodrnyA9RJb5M2roj2pmi7Vak-F3kb7AGxs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6E0UuAMaaJmKYV4WHiNr1cBWr-mwujiNLKJYbZBy5A0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6EI0VFQ3N3P7AOjW8AEjrXZdSuCnCv-fpZ64e0bjynk.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7CXKpj5B6dzyBoSsGgu7moPco2r0i9PbwzVXo1lHozU.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7FxuwZmru_T0Zx8aNR3TleboQkZy5z3NeGNrwPzP7cY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7Qzcd1UvRnkRnZ5b54SSviAKsURjRAGoaK5yTsg4MxA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7aFBjL4if-asPUbvotQpxcJTzMgAX9LsHAQVCppeSXE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7lvyiihvB0xNdKRsf1KPaqFm_3Mipw8d1db4V8lJteA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/813bj5I6yZb-wXefodCetOCKEDEL_2AbNx1a02m7-KQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8DY9xobqxlwyWnYa-twKg1BMFu42a1oOfvx2Zk8-QRg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8kChD4u9SX9-EQY63SO0-ergLuOvDIf46vR60I3T0qg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8rlj1JnFHejUL3raWFeliRWCPWCnJdn3UrlKHovKdbs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9BUi26Pi2HjaBwxW3xqwhp3-Nv9HqvKnYi-RR8KcuWk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9L0RNb_fbisaw_9WsSFYANfhgTuQtvP-91QSEjXNmY8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9XgPoYN_JsGzZkpXeM3pxQXrYH26-9gSsoxEp6HpEUM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9j8hez9pHdCQdcwjpKeoYVrBmVfR4ASBCJUtaO-CN5s.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9kTCjSGFbe16SMqnP158MuUj3D28soCZdwKuAsJzbUM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9lx_5ziCg-eDu1m2pR0-AVevZkF224xRlIvfaq7PCUo.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9ztFL_5lRP0EpvY6Yd8zo0LH5wpnuxoAxDa5ffRhyC8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/A6zGVTNPc91lU58ffj05A46ORdomivGj5lc_q3_XQQQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AC-yaYeOXxlIdUwTDpTd_TdSmK_-ZGilXZPaleWhVm4.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ACsvcWXFkXGo_dZSWRNCzv6q67NHrhjltwMF4SyKs1s.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AMY65tvjndTjQ3V_ZahdJL8X2zj93DU2o7K5FPvxu1M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AfnuA-IDSQtDAo9XtkPxxczSKB-VlblUrZXAKCj-QaQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AfqP34F2lwUisVYv00aFZKJ_aiYs8smx4j36oeW-S6k.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/B4oFb3TRenHH4JcduyCvGTFxZdU3-VvTQ1LDvm_-iIE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BUMVcNGlZ_mEthsPogkRuGobQajJknMTlMbRrCDEWw0.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BhtNyi5hwiVF2UewLiIUG0mEvA4dTsuA9OZfLInxiaM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BrL6mwK6Wl92bBsvnD7AQvHWBpWjUC9-hVUuew9XT28.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/C-JhuIiVv78piyuXHnljYWwor7hg29mRYWxbFgsSRAQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/COs9Zo-3ILgYwVitDgIYCUYqG71jyK12ukoiV9DgXGM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CTUWBa7w8yk1eBR-vVnNVN1dD-U9aUQCm4RvF-RIYvU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CXmlgiMLFXGktY7o_a-zXGvORAwhacWo9qzuYfEGE1Y.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CYZk3DPZTVGkS2PnZvMUwL2FZdyXbaP3rElZ0sKlTZ8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CZI7jT4PWrphGBTddtX9G0MlBskacV4xNnNIiJXLNgU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CePIL6yNvdNcXUbCs39xoB8mYs4nnVdGrFW5R5CKggQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CjHnZuWbfmemr8OwunPxBX2q82kfqQrpyzZqQlgByb0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ClbLBnTjKQ2M71bFPm49Q3mL6f1ezJqft9rA3amsQFw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/DKPWCuG8-WIOXIo8ZtYEQSW_cfaaGpNJh811CN497o4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ds9pJpmDkvJOvR198IUwYc9ULGPmil2iTqFiFiGjlTk.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EDARLTaT4IC1VOfwV6baowYKbgOdR9-vtVU6QyLQTjI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EFQva92FBkqJrXlwFMm0pOyMbmEIDZZTjKfNSL_SkZc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EHfXjykHNwJnJ2mPC_X-9u5XQ-lo3m4lSyPzw-raCms.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EK94JTjppaz8RHle7cCnC2-AtPXwdJ8yDkUP71ZUnek.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EwckOCeKfibFMJk1ykog1VSiAkRxFPJRomR6UnhspFA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ExtPB6HexdzjWLQJkCzrB5IkQF3ZZXpBa9IPQROeLIg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/F3oiB_iZ467uXhAv4IjoV5eZSm-bwgS6xUjszPD5e9U.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FLTgQmbIJNhFOAe7KHjPgxgSVYkYlXH0Zluo0g-u5hs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Fns9pIxUWrPU5h9kFlyKS-PwKd8HxU5Q5XOD4g0BDeo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FzziiFjbUsrpb7SF0ce2ZkWkxLwjo1wA24G0hXaeIkQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/G4BoLpM5zXXaRM_wF7w6DGkOQj0_e8uQ6g6DT766VrE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/G8NeUk52Hnr7bG_HKvsYHrwPVbf5CBK-faalsc0CqhI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GTCjnTkoJck-uQZ8rDMK4r714HhpzeJkNtzPFQV8DwA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/H-vLBWd7GFBKYhIfIvjrh_ybAYrwqt68JLUd2byKlKM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HC8vOhiwVnfoGJvnxqt_LC-wzGgzV4N0m9oKKtx7N80.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HF6WTSaNGkbbpYZKSQjL5V4qNzevXksPfMsclnueSZA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HRQDr4TsPyfcN8NC7b3hmZJH11mUY7vTjoscEUdlesI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HWkb49cHyNx6KuEmVwRc8kLyFRR8KSqwIWuRirwMe4A.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HYCvQ7OACArsJevB7clpYUhju6qbdSyS_lPA0HTzxcE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Hi1YUR3014PHRusUI2Psm51L3qSNb6NNtUjAoqdBgJA.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HkivVuo1QbHiVAZRwxz8KISg7w8SkVsLvXXPjTyo1RY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HtjMoz49NTbpPgQ5E7HuoCduA9wa6_NbwM3PosrO2S8.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HuK4Oh3hKlvMS7sKaJ-1IJset3TEcndPwPSIc44otsw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I-8CERt84_2ELVeGVTwnLrIVeXtiYNjz9MKKpaE9a1k.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I-pscSbe6WWQ-Hy600ABZdc6wMYC1utqCHCpXRgHkck.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/I4X_-Wfk9tSNv7Y7DN1stcfdEmVP66GhbIg4rBGTvJk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IIHFsCskfZ8wud0ArVYadcEz1sCwDNST_CzhdRQ0ymw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IN3zcsPPiYWRXkoyEdQTWYZdobUm-hVZPF-RsyKSLZo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/INv_HAthrzDkm_D38eTGnh1Fv0Vj_MuX4fgbbRyXIuI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ITHO1axalp1rHmqR3YvaIkjcAvn_b-ZDcFHAwd77x8g.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Il6R5QNZ6BNMpHu2VKbgxYd7kLnD_VBlXj4sNW3Ogrg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ip3sIWGeNobzJVqwWB-9uzzRqvRzIl16lYYu2LwYSkg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Is-w-V5glNAuSJQI6LlVgYrsrBpTkB8UuMyvC18kGP4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IyqWEHJrFKiApIk9ykMM4aexL6XjINdu8SM_hvODC5U.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Iyr9ur_AZWlgQioN9Q_0ZIHzk8eAR2gcP9rA9U53a2I.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IztqlpUnlF6g-AK41uS64ADOb_UqrV2XPKipfwMZtng.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J33O-gglLsJXTRsiLsEaZnkx2EejYpaY3xgL08iGtGw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JFyms6REaLPLPGIhMN9PGqjy17pfjTRUVf7eZu9Pxco.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JIHTpeIeHLyoisKIzpqO0eHdGhi5nEKWj5-RcVKRCM0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JW2xq5zPnik9gBTiiH4F_youPivdygFAzUOO8MbWgkM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Jd-S8kl1kAIMxvyCcIuOA7ZGbyL26f82Ye-3R_XSjdo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Jze_hM1mFPXNRoOoJw19TGQvSkWHNCf3QMNVc0ziz_Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/K6SnboDPlbuabJPpTZ0JPk8gO6RFUZBqZ86JAtADJEI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KA5cXFlW0WDZ_VC_cWZZYScTtlyiF3RVGqBEGU6eiWk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KDwg9dU_fSHgpLW4os9qv5BQy9zdS-M9s6Ayd-AANVc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KEmMrd7MCPJPBEXnAmcfU3NSj_picTq8W8sdG9tqrqE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KIkXGvm2JGXJ5o2qXMFuGbgz6qMOB6A_YxWOUPIHKK0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KXINFsNMK_ckYGMJQGJfbFh6Z6epFg9k-5Qhs9rW9EU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KZT5maABQpPM8h1-x2KELDmK3nd7nKk-gcX_gjMgt2M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KepueFEdf6u-gcEmbP_Co4sI430KiPrpm0DZTrdbZUU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/KhI2DHSuQgZjCK0ekRDtvbZpOwdYZri_CwBZ_JkxvOQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Km_xMbxQ71ubb9QRITDKX704GvVKFUCbb0nUvxa8thQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LEKS-dzBMjc4eTyBxtrkhH2mBdtswpViSIhSflnSWt8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LVNi0m_Fz46uZMQdhGs_Xp2qaC0-FvTGXGkvKC4t4d8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LX1cGvPp6Q6XjdGWjj9TR7J4-zLSGXBgJ4V46lvreMU.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LdWTufB1ksbF48SkjjVFQaGOGLZhuR67aZdg86lyIlU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LdznozvZmzSQM-vN4gpeVOi7BnxMKo9wORxcV6AV1C4.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LrSqV9e6t5RRqIrQNqg7rJNyEmu18afM4pmQogLkpaQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M0uQOpQsd2JJzwD9B8xFoWKkOeXsEv989W442_j6GWQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M7D8w6LkvEVOKTQGUh5UeMFsZH9VO0AcqcYXjP_pBUI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MDLy9q5bNSELATVxXwYNiE_EWIk6G54Vvp6-6Nqe5GI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MZlIjxVbEXORmEiPpu2WfhYYmXabfs-Mx0CK13UOI68.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Mty8gekO-EN4nBDIU6_1vSciYe3nym8NZFIu8Blar-o.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MvmfAyy9rh72Z5qHWYe-P86KDG_4TypMgkIvJ9H_VZg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MyIKfP196ecHA5x66VvwST274efdOn68xI7gr7-yO_s.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NVDHbW4cQm1BkVqKaV_UZJCoUGOjV__cQDP_BkY28PE.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NZYfENdib9jQ0mLkOwrrHkyePDmPSnsyNBF09R3RjDI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Nw4FfwPy0V6hfEuMiecmCowRpPVW72JuqlU1XiIbwIY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/O42pf20jdFJ_g5abvA826QHjbBd_O80pk4MWxW-tCsA.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OAJRpn8VLCOm_jZEmbk0pORgSlL7gp4nFifMo5niF-8.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OGtnLVkXIOrBNwwxtlEOXYAU-nA5S08TDyFelKR3iYA.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OO7RmvETdJCl6nDgMH22qEwqpy5SjZ2MMEBlC6tG8hI.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Osvd5BC9KZ-hK4npyrYgEsra8aCVLyBTWo66yXU4904.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OzJXhurZ1BYWL9zrfbxtEKM1oEzmIl5xNWB0kEDMcOA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PCOy1GxF5pveYHXcBMOi91KB446LiGmPMI1UFX8g_-Q.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PbS6_clOuwqA9I6Ve1r-WHw9oyXHcbXLmbpDmHQShgc.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Q4TMVpJ3X6XrShazzrnMrNim1_G-BNe0VdCulR7F-yA.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QHu3oOt0N98TteMY5zXqcj1z97xn_5N43EfY6Pi9kL8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QMaS77aFhjfvAlv3pTOkHY8huXHTx0qwk-Q3XC-LUuw.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Qr1oeXB_1KGcnRFsaYAvIrsxKqj1Qb7vWnTRmgXk_VA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QtA1YtaH67pw0mVtsf1tkme50FTIriYFZ0ho543Qa3A.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/R4DimiN58ox6KgjnR2eQwODucfhsWMz41f58AEW2fIo.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/R6PcDLPOUUtOP-BD7s_Ur0xv3uF6iMce62QfJ-box9g.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RCYWsl0xUIU2nNKGL8x7couerrGdH06aVPyqe4T3v2g.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RPaoa37GUXAxFdY8fAxaqrBcqpO344RueeI0-aokr-4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Raj9vOIqeGhMSGtu8Q_sPxFPdkVVSvpAJq2eZjkurSI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RasXSipZI53ixic83Lh1Gyxf7EZ-ZsS-xs6MTSlr23c.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RhDVv9RZb-Rf9b572V-Tby43AKU0VobRcA3p53frD0w.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RoSdinmQMNdbk42r-5aRk-ZSpex9SGn1M9kToboGRlM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RtPqr-xCyExVFKXPLlXveg3hS48LPIvlyGbMoaE9A48.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Rv0ZOQezk-pppzUrdpvYZIs6NI_EYwa-F03k1Dyv6LM.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SJW0DP3AhW7DLwnpif11zo1ebaTOSKFyPK1dGObgwec.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SSs8xG34aB14Vj5PMy_zMyWZ_CI2NaiP7aUF4hIX4oQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SejMpuiBooXU6eBSfO33CrjJR4wNjWC8zkm6I1GAeos.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SgOybhbsgRVeyoYJJM-c3kEvJYV1gxpuo7rN-mb3Tnc.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SnzRk78-FyJIzk7pMe4SIbViUnt8al9lQ5Gy8XhFrIY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SuILTE3Es0N_r-36Ddu2E6h49WcwH_-RsZyG4SPwKFQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T25N6kK7z1ktWO9T4A9GAKDxA8uV_40I9iCK72yJAzg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ToO9q9KZUkSycEPeq45MeeteesODn-nUiRkc_2K4Odw.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TpYQkHppriVPoi8yZlS7pr6M0VR-8bgS68niJd5mA_k.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TseCU3hhL2Yp_9cVEW4ZfF410Uc5RsRl2WJ2e_RKzYQ.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UGP2acGAePQXO0CTCNSktz3KFcnj6TVRjK78o3_-Z6Y.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UTA-dAu39ywx50aKbw-_vIHLbrENV9O11MIOmfAcqwY.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UUuqFAvUHy8E32lwI0UKWj0JDvMFXin1lOZh7r_CFU4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/V7-8OhEYcV91Tjl1Mp92Zs-q6tVYY_NoXBRZQB5vROo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VP-5hBBPrMcJGIIn6HqbMSqU2AOAWb_2b7BAWcdrc1c.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VQj8MeqFcSYovlGUK0G9tMS2Xu_WouD5nZPyKyiweq0.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vlf9_BCT3w6tU64yjiuvN-opIYynyGIFGSKW8Bb5isw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VnoinoejmNyMusctCLIfDXuFCSEi8usJC8m6xDhUjq4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vz_XyP4dxLytmt1nM75kFGT12PZq3bNYSD4lvdLEetE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/W9RiVsPehgaZrUMdd9IMxV6tWIOaJSUJC3FkXb1X_B4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WRHdYa7fEbFVL6yef8rtmfO7EkmHLP7mvLYrFsydc7M.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Wma3mCvAkft1gb4iskpJcSKJAxs20F1f9J2E4aG1a58.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WqdHTk7KRwHNiGDY3E1WbSwBE2PWrTEC_HKQ2dgQh_4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/X6fitKDo9k84hcsJAAFipPaeAqWy6LI4yN0xoXUMI-8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XETabnfMEH6v-S1S7wAPpqzzyrusq2-gKEj9xXfazWQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XObHVKJOPQbhJIypQ3m2F7cKPAyfUl2i31t0ZpyyNPg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XPURjd_micKqrq3ZsfPm4DEg045aMh0u2t6H0Kg9Yvs.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XimghOZesEI6BcweyGe411shS-dhkXGeXfICxpTMaP4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Xq5ZUgEeXuuZ_LjabsqNrD-0Go3uQ_Cyp61HWjTc58U.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XynXdkOeORTqM8SLwd29IBzqweNuC8cwHaKDU6aCSK4.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Y2JXHdR1Qwb4e3EeE4Ez_zsdxDGOIBwOchlk5EROlTE.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Y8R1Go-ZDdkrGFky02NN7UnMEhQk2DqxsvSX77Fa6FA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YHkX1Dz4-_N2HxZ5NqTKZci_3AXSvWJeJA_i_31f9kA.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YJbah_vlhgRdgT_Teq1T0fCbheSTzHIoHemg9qXindA.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YRwMHi7FPQbp1ciWNBf8zVdyOOQZ90gZxW-FGjsbo0M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Yck0uONNPexAbm2FyBPrfd5yIS7zF6qget0qv5CjsHU.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YkwiLOME0K0S68fJF1m4B59vHPfCrL1XkvKuU4REXOU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZDVfJezxW8_ZZwk-cwh-Xi0vzlaptRAdhzieKE_zUFY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKHvJwMZX4BDjok7en1aRFmYUMIGKxP-2WLxxfmV4_0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKMpLctz8nAvAMaFYwxiwBLh_0HFVR00Ef2Tp-L9gk8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZKaeyFbyv_L52WIc3QtQXTKgCIpwbTR-uFJLaTMGqMw.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZMXh61oyO92eyHwgIArcoEU68tdVc-dasYwTUiSdsv8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZOf3jjmjGkvVrLqqqgnNzuiOWpkOmQ9MEIwXhtswC5M.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZPgHNAJhX0yVATfQVK4g-l9clGnQ4JK6uUQSZr3izJs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZirvH1uELJOGqJ_P7CHUAeE_P7jHfDV-kVS3hqudqrM.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Zl_4gLKgfMkcF_M-9_ZEbdVsN5G3srKY7ntGrMlSrHw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Zq028YKPdCngXVGfBnaVxR3ggnSLIXPPQmXKuOrf8Rc.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZrHurvGsuXiJ-LyErQBL_Z09EEVtYRzmGCuik1pCbMY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZteKWxvlB9lz_cw0HUFX-gLZnyvx2Zl4yndbIQRAjqk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_CyPKbQqBzpjkvVSPJCuRZ6LPST2L8lNbl3pPaFoHJ0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_FzZXs9cOynmEHX2NNQ-CN3hBm85EZozlnqahZgW0p0.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_RxurG4mXmoQvbBTBfr-_LxySQdZ2vRVo1x3z6BTIM8.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_VTTW4fptVcLI6EEhHyBd4Z8Sqh8TQQ3-xQmcBCdhFo.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_VwqClblffKCdAP_EdTPlIsw_a4CtoYdZWrIqsvTEOQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_qTdVcypJYB06uIuozk0oFgOO-20TwjPvSXO_We2SFA.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_qXTu5xPKA0W7krxy7i26PqnCiZfom_FyzNgoRcfhrY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/a-ZMeoDAaumcckLg0ikJ4VOpG4myE6TpW8NhkwHfEEY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aTBvblCTpM9NO4FybG9Gj33dec5S6b_XUwAccF1aZYs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/adco25PKONAOLm-3rk6IkBIQCnbQZW4Ho6gjCtHDkDg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/auxxd4pZZ_TDPxKd6Z1PHX1KB7GK6XR4zZCkpSTjTIs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b39zQHTjF26g2idhY9yeVDdpi0l5AHiJJI9GRYqF6mU.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bD4HLMG-9D4qPG_FjmXWFZ6gjrSWcpls07sjaZ-O7w8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bNzI5dnyYKL0_36QaiWo9c62YPQqItx7pKCGRUy7FfE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bO-oLvkRTCzyfG1n2yXs_z-XnWJGQkeq6Epi7htFc9I.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bTc-0wBzb4QwDigu6Db7NvQ_N2V40lyAP7vDnJ_nlH4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b_F-ynokmpMl3NS98JLR_LB9VDh0YOK0UaWye7i8USE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/b_LqzZ-8tBIFMmv6e6UBt-bbUKJ2xvZ-REx5pGyx8iI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/bx9uG2b5bzutb2J4T2Sa544N5DYCTwy2P6WBGzuxs_I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dMTaD6SlQOW5HeTJA4GTKwarCYmPyQiARbMyV_vB4d8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dTT1R1UEP8uYnzF7i__RYmTDlUukDJ3xN_20-_05KEI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e1v0O2JKkRHQlw8TKb1w9oZB1vemT5pyrEti-lMF5b0.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e61CL-jArxF-LrNCE2KXgDQRs24C51uEjlx6Bi19Gao.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eUu1MwUf-0AQs7dOY9q--kK5o_T1G5PiS_K2T8YR48Y.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/evKXHHSZhFrDfQz8cjp24eCW4GxCo7dGht_7kIJvzBM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fBscfaT8oxs7Yqm_nTectEFY7MEPIC4905izon3ZfkM.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fQXVskLewjixaid5c-_oVGxkq-f67ZCyGJS-4elUdCo.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fRuioQRNW0lMfz61Sc-O5z8cQlpP7T5UYGqcs0Q5M7k.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fcB3WIgbOvDMnOx21ZxJod_7X6BgByfRZnnqXb8jeCw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gBLeBlrK5msk-pYd1S99yFV_lV_9__zpaH8xxhlsN3Y.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gHfAw7eXqwbHMSaPLwMnsJ-2rpS4tPojjzPflsNwjS8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gUNIBdCSgztu1IV1u2Iea8rgbpdr7yfMU81jtrXab_Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gZ1A1--Asdejq0JC1PUTTgUEDPpV24UMUvyGvPF9qLs.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ggyLrLMGVAcFn7w9p1lH-wrhmfBLSbIBYRoAosZgBx0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gnsisTlVaZW5O8yedgMtd39R6RiNWwEugCpxg7Fvhgo.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gsT50j7JKHuZpK4IhejdLyeaKfQHfRPi4cKFSX40xbM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/h36EXMrbHvbFBnm3LtD7G3AszmR4XAInaarh8jjchvo.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hI7K5kfULmC1N0zMvxGOCfdyDMLMqzTZ_0g-qE77V0c.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hV80P7h6cMezrBztIgEAn7INoQ7Sw6p_rnUGxg6SLfI.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hWu1uKCWmWR3s8-5BJoduM8XHlqgUs1A22oqy6cIioI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hYh93QS-0IpGwtz77I27Poxio2RxvCbdfwUU5DUDDac.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hdQmfiHfKbGaIkA-eep2f0S9_Vk4Fx_3495ZFE-5lvg.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iApklbYsz6wjnGnGAYDDvoryAu-x8xdYWFRCRICxkyg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iRiaNr-fBLM-F3JuE14i-viRO27IlDgf7wSSP8iBX08.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ifSFOIuEmyYMVEx24wla5z3sjbPQaa7ewQjWZIVK5SU.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/inz6emggkYiVqCt-Bij5_ONj8YKML_oysO3SH3AXlfw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/iyALEPjIsWnyk6QHQmKHjw40Gom36pc6D2lMAVG5HAY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/j4fhwqDyIcPq-vVaM-r8IG9pkWB8unxSH-juX-2a5GM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jH9EdS7oritO7nZnEh6YwafCgT5JGaZfCBFZ1KgtDl0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jHeuZcbZgSPINIRRpB1khLlwKgjZWxOOvdlnNFfSEkQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jL9LsrMlRmTbZOafIXj6ktFICgnHzgXQKlvs44HvaS4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jXAa5hghD4VHps1S-0rMrQYRXN8BBXvdn9E6IF0WjNE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jpHebb6f41gfqFBkL022mjpgGVahPL8Ekh1lLg2IlIo.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jvbwlV4plHlp9PGnxZ3OUSBxRathaXrVgIYbETC4TLA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jxmh-q1ZW56jxojXdgi4lN0tIeaRlxXbjGoIMg9vz6A.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jyqD2PEbsUGGdyIgbi8qzfxkUEXQcMx9KLnzPk5d0cg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kKKd-AX4C2iQMZWzKs1fRBdZZ55e-EPGa0KG01lpges.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/knnWBtJbi88d3b8x6dF6p4ULZW3CRg2iKMjOlzyl5U8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kwNkwoshx63tQMuxFAI9_pmzzwkd0kQcAKGx8dy62r8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/l4Ffy5jgVLu9dt8-l5Kfc1HJe4d97NaNA9FVK3-EgZ8.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lG5HoTNviW0JZhvB2jX5FK_qt5yd2zvhNScWeyOxSlE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lph3uDhnwIX4t1R9-tVND4IFnhJqL1LqQtMrvfG6w7s.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/lzBnHrVdWXPgCGDMWeM697bVZm_TnCs0-BOLGSabSHU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/m95yq-mMsjThZfR9xAkTGkdo_JkJ9U7FMuGouKiLeYI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mbXvxeAfJlLiWH1ENKWs5K35rGtCFwVC7Zh8iz0VxKc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/mztptfmRewdrtufZGYsHIP-cUobPQ9-KjG8g7J9AlEI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/n7XFj-ICkjn7X4nWPnxX5kW4l2h-GofBeWkFwm3kwqs.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nTw9g87OxunHhH1pqowngHCQQOw9DK2BmQ3M60OJ15g.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nXvRhnR4EVKPvqpL5ybixATwGqSAAM3GnqoreQL7lOM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nd-bTF0GF0iq3FYx_gfrcw2MYqKJK3_u3qX_P-MB53c.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nljNEWVMdSyfIlWTqKa0VgxX1eArA7WWm0aLUeXwZ50.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oJA9-RKuPg1FyZ19t-ngXaxCLfAwE1U5oWuLrpbKxXk.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oMUQEHW_ZczsOgceMbyny4zS_7JDQR4LVJsqDC0n1Qg.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ofQEceU5jwHsMGUYlKsSKWsbhIcZmqkyDTIZMXnPSZw.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oixKGcg4vjgjJVhlFVvaKQBguqvPhw-ieoH9mAkHbQQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pSu5LnLEpj6V7FhekaIzJ2IqzRZo0Ez4ZENr0VAe7TI.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pcaV3zSe0X--5yc8sSWV79jvBtMWBE8wQa-qWdHCVxE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pfpeQRAl8pvI-oF3tjHTK0DO1xmDYrOBNahm32WF9k8.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pnW3u_1AN48ig6ngefI89y96xoSlvnJurx-e3J-leoE.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pyglm4tF6LyPZb7zZ4zXxFkSJNqS7k6t2EfdGyK4nEs.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qHufjeN07K5cjvundz8j9byD1bx0_zHs8RVtt8CPelc.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qRbG64Am2J0VJubIAD6GsUncqHCDtXdp7GpeITfNk40.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qapMpzLzmfsKUVfx8heiDDl_aM2eDpgGIgMOFmGDzgc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ql-oqp5mf_wnLFbkuDE5LgWxgPTkowkRERBa9J1Ufz4.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qp_pHvhopL_R2ArATeOwTF5IuErK2mmfscIjmi0du9I.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qr43tN6jxdx2nBuZzVh0W482kex6JzpRT_Jlg76vs4w.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qz280481u2bUSM15O8fjWQh8hRz2x9qLLz9yoJ11N_U.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/r-s_eJx0epqP7zZY6vKtRB-IX2wsSvsotT_p-p3r0kA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rHmecJHt_CBXvz20fbtsdk8OgoC9kzNTumxJ9P9syMk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rx120TUndw4AbM88UBSGpYJDA-eXMy3CXjIepvputuo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sHQrRWJLOYIiRDclrVXPviF4RjD612SRu8kt77SUiHY.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sLvNEi7VzgmnhJQZR2jc22RIAUd4IZUEhz-ZF3L0s0I.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sV7IPxJP0BDm_iFz5Ye0I5GUbqToWPGafxxHzruqn4o.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sgTRuK6vzO49r6Qci597WQXim5wOcnfMY8b3Wj9WT54.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/sgxkvOxkALoZe-Fr8m9-ZlEmRI4Dki2eR9-L4NxZs9g.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/slMNWTYxn6-pY7ZoQgwD7OirDZ-_JNhoINpkhSM8JpU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/snCjf2nATp16sbihKkc3WmJKwrM-Nf6uyHD4lvkhYBI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ssS2x0Wl67rwXHaVHsh6CO7ayn9fQ5saIwATKN6O-nI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t7tlINbMNG_NUzXHBaszeCQI2VRXov1jsG8gGGFGjK8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tQFwNvTvB7WSc1MNrrrlR2npWEGH6-4H9ZQBt53ihrk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tYFbDrMNElXwgmisit50aNXJvRU2zlIFk5g-EJ1CQTc.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tbmMu3ukwKaE0BjbtkJhphibnWbw_syO40zEfULJcwQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tiEnLwHMkjzRHoNu0gppx2GSTp6HvRuMkp-2Oqbe1ZQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tlN7GHZ8yK48bJWEK_4Cweb3dif5L4wN7NnoOKHL5ro.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tu3RdLHCMPI-LywuuixWPMSuKUR4--X_j4TI_rdV760.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uAmF6E3JpcBzFORYg5hyetm0KtLM3wLjBGuU17UWlv0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uyBTtu4gN_KBmzSxbVUtmM-v9o5B5gccXFhLYlhZLrc.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/uzCihE-AR8X_6E7z1wNEtuLj-cVjaFBTqADSON-tTQk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vGc3WFFBAviuYcm6LJ5gcu5NtbU8muNyHCOvpZyU2SQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vQMIiaadoH60k_hYUYeiCYJjRLpHKm-gG7uHD1wqPfo.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vd1KC6jswqrOuvnRtTRD89GERlj2Yip2SZaLZBndMWc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vrpQ-4TWh71cU-S0YXR-Z_GHzbQdmQML6DcHOlDxFs8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w1UmGVnv7CKA4yH1W1WrIvOM5Mg5CKAwMhkDa9H-wGk.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wJQv5wdvs9wuczaJi6QdbPilkpGYi_NfQwtTC0LfKBM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wNVcsMnZLVVRwxoib0AL-Pss7tzB-1stHUlDrzpQceU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wOrRYBx4PnokGHsz8brJHk3CsBA_R5QtMxcXGacWx08.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wR0ZldWRUBI76kaGAshsJ_ExZYfvGUIofuzRJHhsXsA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wRDw4YT27lmkKhaxdAnGp9pC4Z3qjiGcDuvoRNK8R1I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wTNryqjmrX_JP9rznKzF2y2a2YrSyzzgma8K9FG3-O0.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wkb-pWvPH2suUNI4gli3yDzco5HXEof-eMU1KvildcI.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wnUKZCI4IN78eoQeCsmk_i1KICUeR5377bgTIteGP80.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/x6XzpqRQR0k33t_wGetXxFR4RNnG6mrp0FOBKcl4jb4.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xBgeZhWxNu0MxtqsstirphbvHYba8SKFl6iWeFh92rE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xBn8xD9ZqQS3Ny4c1qGktFCWWCBs5TZ2T8NGu-mA3co.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xFaJO3VyqCmZEFPdJ-P4DXsHfFcZvUjgM7CtiN81zyo.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xK2dbjxrVzOePTatsreZ4nnh3ClthCqnPSehyBuO2ZI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xN9mBpSlxZ4JLyc0q561T_SLLvqnIpXprtk4baJpCjs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xgMGrsGgELUI1JBrlpZ6cAciwQgg2K2RHVNWfTJplqU.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xoKDo_P83JYN3961boUtbDxcu7sgJI75E3jrJuVLsMs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xtTEgatYUqNva-IT6ZqzWf5TESvI6ZpZtdqApKObz00.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJKiLlva8DyyyKYTNUpTFJpylQoL56pi_IW4vZkyqj8.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJnRPnw0vpepiXdtY3aVTpcLkpLuy8-6OSfuxlXDIqI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yTq_Kw6ZznYtfUwEVQcnwQcZMvk8LG97iLYfiu6G0So.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yYWy53efsOhst-Z42foBwjtw0if-f9D7G48WxIxl29M.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y_iYPVLd6X40_N5VUuMQ9_her8ChEG_3389tfIkdXAg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yiCGj-7Lcf3QQiNEWZvEGKPvEYmeDOVICqO9RxNFuY8.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ypbYZxdZm4IRZUBKtmDkBCX-uK7cb5LTzau4qMdbn-Y.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yqRpn4nfsiyFK9SduAt_6SvG5oxNX4yGdAkuLWQIMF4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yxZppbEFzuw0ceHGlPraaFSyHauQhC-W27YkpGOat4g.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yzDL94QvKghx1HWV0_j4knxWP50emPZz5acLQPAFkyk.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/z5MJ3dGP-oEQ4OicSFvpF6LC2Hiu_N5X4OXUvTcEkJQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zCHY3Px9vEvHp49LVEcJwirmOzwBRmXHVAuhJZekyEA.cache +2 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zUgR8-T7pENJvFOubVNhutku2rwfui6pbfr7P6hUf70.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zW-P8B7lOQSeQCGunKH30LiXn0QwGPBZGKGmUed-6QI.cache +3 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXbpClElJq8zwSwvf6-afJPNib2fisrkygDE8IsFQ6g.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXeO3OESUCMsMCtlCty57A32WQ-yiiDDC_keencK8JE.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zXnjRyD6hCOEmKVRwgAUzbSSUOtnw7fkIPr_pmAPu6I.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zcVf7iNuAXXr2uTNmOFUONY0W_n__zGDC7y924dOd7Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zdaei-ObMqKCqfd60KURUHbIOgzJB9tcnY3bQxNiBj8.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zq3uZtzIUcUfsdw7NltjSkoNhDYP0_tt36dmJH6DPPw.cache +1 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zttbDN8QAQl58qoFYUOMY429NdXLuS7mSN3tLlL1GTc.cache +1 -0
- data/test/dummy/tmp/pids/passenger.3000.pid.lock +0 -0
- data/test/formalizer_test.rb +59 -0
- data/test/models/form_field_test.rb +127 -0
- data/test/models/form_test.rb +117 -0
- data/test/models/formalizer_config_test.rb +35 -0
- data/test/models/formalizer_form_field_test.rb +39 -0
- data/test/models/formalizer_form_test.rb +34 -0
- data/test/models/utils_test.rb +30 -0
- data/test/test_helper.rb +20 -0
- 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 ? '✔' : '-' # 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
|
data/lib/formalizer.rb
ADDED
data/test/dummy/Gemfile
ADDED
|
@@ -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>.
|