kadmin 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +35 -0
- data/Rakefile +146 -0
- data/app/assets/javascripts/rails_admin/application.js +3 -0
- data/app/assets/stylesheets/rails_admin/application.scss +50 -0
- data/app/assets/stylesheets/rails_admin/finder.scss +2 -0
- data/app/controllers/kadmin/application_controller.rb +58 -0
- data/app/controllers/kadmin/auth_controller.rb +98 -0
- data/app/controllers/kadmin/concerns/authorized_user.rb +67 -0
- data/app/controllers/kadmin/dash_controller.rb +19 -0
- data/app/controllers/rails_admin/application_controller.rb +58 -0
- data/app/helpers/kadmin/application_helper.rb +4 -0
- data/app/helpers/kadmin/bootstrap_helper.rb +53 -0
- data/app/helpers/kadmin/form_builder.rb +9 -0
- data/app/helpers/kadmin/forms/inverted_check_box.rb +10 -0
- data/app/helpers/kadmin/navigation_helper.rb +28 -0
- data/app/helpers/kadmin/pagination_helper.rb +95 -0
- data/app/views/kadmin/_alerts.html.erb +14 -0
- data/app/views/kadmin/auth/login.html.erb +4 -0
- data/app/views/kadmin/dash/index.html.erb +5 -0
- data/app/views/kadmin/error.html.erb +5 -0
- data/app/views/layouts/kadmin/application.html.erb +68 -0
- data/config/initializers/action_view.rb +2 -0
- data/config/initializers/assets.rb +5 -0
- data/config/locales/de.yml +14 -0
- data/config/locales/en.yml +14 -0
- data/config/routes.rb +12 -0
- data/lib/kadmin.rb +19 -0
- data/lib/kadmin/auth.rb +31 -0
- data/lib/kadmin/auth/configuration.rb +66 -0
- data/lib/kadmin/auth/unauthorized_error.rb +14 -0
- data/lib/kadmin/auth/user.rb +15 -0
- data/lib/kadmin/auth/user_store.rb +21 -0
- data/lib/kadmin/configuration.rb +18 -0
- data/lib/kadmin/engine.rb +15 -0
- data/lib/kadmin/error.rb +7 -0
- data/lib/kadmin/errors/authorization.rb +15 -0
- data/lib/kadmin/form.rb +64 -0
- data/lib/kadmin/version.rb +3 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/admin_controller.rb +4 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/authorized_controller.rb +8 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/person.rb +6 -0
- data/test/dummy/app/models/relationship.rb +4 -0
- data/test/dummy/app/views/admin/index.html.erb +1 -0
- data/test/dummy/app/views/authorized/index.html.erb +1 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -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.ru +4 -0
- data/test/dummy/config/application.rb +33 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +22 -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/initializers/assets.rb +10 -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/rails_admin.rb +30 -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/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +10 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/dummy_development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20161006114509_create_people.rb +11 -0
- data/test/dummy/db/migrate/20161006121212_create_relationships.rb +12 -0
- data/test/dummy/log/development.log +9192 -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/fixtures/children.yml +11 -0
- data/test/dummy/test/fixtures/people.yml +11 -0
- data/test/dummy/test/models/child_test.rb +7 -0
- data/test/dummy/test/models/person_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-E/-E7l5lmqv4YBdAJz55GQp5nq67ZkFAo6Bi5OjNk5wH0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-G/-GztuOFiffIyLHRd9L2OrRr8LvduErePFmti2KiEWnM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-K/-Ki0cNlcEH7alAxkgEojJTity_R8pKPW8lod9PdmQp4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-S/-SGTTENeaJKzAlSGQyBL5smW1ac-1PPh4AH47eMjetw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-_/-_GyWOMxsUj1Vcwf_522X6jS5CyLaFUziq4bW17lZAw.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-o/-o5iam1FF5YJGGfs0g8b1t-piKLXB10xQ4JjXn7HN8Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-t/-tU5oPMLVsB5iiapWYUTFN5jspQTpVWoTTnhK_T7BJM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/-v/-vqOeGJFsynFKnmqppb24llGxbmWaQxSHrnq-4gWjPc.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/02/02bxKc4v-CFhk80q91j1gozmURNqN0I63O4ktseQPWo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/0K/0K_O16_TTwLqEVY-HrOyDGoLlmGCAT5_-UklcrTwKZo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/0h/0hlU_9u3244srcgFGcCeEdEbxinDO7uTAksu_KANv3c.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1G/1Gwco3SudXOMtMBavPEiJ7RnnpuHGrDhqen6FYs-CW4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1k/1kLUgMwR_HCyTvfZZneXlYEyVfRtLtCf4uZ3JJ-0jZQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1k/1ktYHtX5nxdFuMPRPrFq16xXfbXcyVvGF6FD22sawZA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1t/1ttjS_QLsxhOqT3FIJCJpWKjvclLlWBtCHR4Y0SMWvg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/27/27GrPfnHjlwE3wzZR1liVRgIOi7ye17uUxTmw0C17R8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2I/2IjCzre4F7zp0kbCch9Z00-pd5NZ6oNLGYi2yqcBGS0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2J/2JVDRZ9rv7kK6_56h-WJp7Vi3lU7ILSeJpKsPbz1XjU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2t/2tt7uQX7uibhc3Ug9tgKtYLEChzWSC-9zplEIe5dOCA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/35/35Pg6lXHpJCBRpquM_0_zK8N-YexyeVLStSseoTZWu0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3J/3Jxkh8tw9o9Iu6lPKDOzHtvDfuMHG0IEX4uijWVkfcU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3Z/3Zl_QvMHiv0wLX0SEpTErkJp79NTGB9M9WKwLc0SCJU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3a/3amUAFAEPwz73mf3a0mLt1dWaqdvYWSVTvbdJfdQB0U.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/4T/4TYzWI_JMt0N69Lhj7iUsoMulFrqqTMgQa7WjMAXby4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/4y/4yYl2fQVTLy8WmVy4JS1KQWVTwyXi02mS21TDGFg0Uo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5E/5EK4YMOiNjfof61fycHKHeTg9YQvAvkhSKjWLEjuglk.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5v/5vEKbxisLQKkt2c6CMW14lmsTmiaHhIxePJGI4EjkWY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5v/5vNvcOzIEB6PiHBs2Q0WDFEQm9dxiD7NLXGau9FscKU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/6P/6Ptq88_RYtY6LvyQvntLJsXt6ShxcNHEdrBGIGv16A4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/6c/6cjYZuXD-Z6hTNUsDx3kylQmppb7bKMHGRCIFMGe0Ow.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/7-/7-nFXT-mepU6ZjvvktlBtDlXhZ7b-bqNP-OiXAlEfOA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/71/71HhlTQ0x8w11jacZX1YXOGKLgQP5YtSZlsUILezcHU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/7G/7GPgsy2RZq8oH9dXjsVSy2tnjQUAGDViTJ_hoIWWZHw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/7Z/7ZwXstn6Mz77ciiwrR-fSsInEHKx3_hC-8WKq8MajcM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/7n/7nTeXy635_E0021GPrY9liLy0OcA24r9yMv3JRZpRU0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/8v/8v3HUrggYouCOdFFSOnPQeeJB-Xw50TGMmz3P-5rp-w.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9u/9u_JAcGXAbv46kvKHDanRFSBejhRPiviviuc63zlv6Y.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/A0/A0qGf4ml31v0AV1CnLrNphYxKK4NMWEHlm6jL15vtfo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/A7/A72TkC30Vq7CX3sN-bZzghZSyQD5TfoEHppQhjWBbQc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/AM/AMZZZzlJgjZVIRxe6ogpt0JsFsvlUYmjPaKaCTm4uSY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Aj/AjduCjY5yKSragbRfix-ZzJmxPyRI05Bl274GjxlyOU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/B2/B2ynLSu6UriibYlEl4dnrXDXdWJVgYccjhDwrdwgyBc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/B3/B3HSs7YL9-V-LyTFlpPC7DlZ3Dxc2HrvGRaStrb9SYc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BG/BGVHH6VEpL2MmLznbhFAvRmYAY5J_n1-tCy0mLo54JE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BJ/BJAOVjCMeTjiOu11zW_a2_-u4d0WfkrbaX4m95p5bpM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BZ/BZI1tfK8XWUqOiMGYdRFiQKYl7PMprWPs1pK0XY3mc8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/C0/C0esC4G-fb2p7hprt-9S39DiIN4W1l4iKuOSwUuiwUw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/CD/CD9gffDM4E98omhQJsjzg6xRRk6_fs-R56iZ2sQ4vL8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/C_/C_qme5ZIsOxcxT7egM2uaUZq5sKZ3vpifRfr3NdQmgE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Cs/CsLYOm3owL5njEre0oZrp7rfrPozQcVxlvJXllD79_8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Cs/cssh8LbSeozd9EbLHLlTSUpZTJSfpY2vFuYuGvvN6yE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DF/DFYEiUpyu7HMGnhXPzq0SZ-wq0lWhBdZ1miNtqtAPs8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DS/DSOLSc6A5RVSmvM415eEWAWG_AgOvZcLZOXQjsXyWQA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Dn/Dnv8Gzs8hr44x47oyjl6_Mn9Wzn7y6KQAK5qaf6XTkc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Dw/DwaaKb1E_ArCW1QSj8BIsyPgRx2Ot8-ocvnWmG4s9ck.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/EC/ECRUjKqajDEyRIx88Y6ERafwCdesNxlAM_92ShV_Tgg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/EJ/EJFOUvkfmWWZV0z59Uq1iNi6OVgypgSkfu2d2_nD_5s.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/FM/FM46Jcs768Lb9a48ghTA0LQJNDwtujqOVLfWipAgFKQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/FM/FMW8J65N2k8BfLe2cnSh8RdkvQouhmIaVJ7R_1Q1lU4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fj/Fj9wk3WG0X_LuTI9jEPYY2HU5btm59aOpbx1afwZy4M.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fj/fJS9bnzdUzO4XRNm42nD4ucpywK6n8k97YcbMskXcNk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fw/FwlpYy2-TCGlrxSo5QMF4A60GulM8lLAjKYa332fupY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/G1/G1UvsZ_neSlYn4W5UQPBOcxuLthPs2c-AuvCV9YwqtY.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/GG/GG8ZUpJCnNg9aJ9my2IqJ32HjWQkfkv6WN8oDt-QbDg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/GN/GNLYFos2891NV-5hu9hU1ot7EPre76NwIGW1-Pu9a4s.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gq/Gq1-o99_FTAmMpHdVD2GREMHDUBchfuVdmACX8WsXZA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gq/Gq6UUulKfqoSlmra4vAkq6bUoYLEM5iLi3vc1fFvfY0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gr/GrcqYYXRV1kqMSYDgEfrXHVS_JjHuMkvzi7BV3AXlhw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/HH/HHObifnq0-OAXcTuneRXNow7cQMS3Wk7E4SJwOFg0zc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hq/HqG4RuVapOFDc25JLHs38cERWY1xLOVRnCtDQMSyRck.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ht/HtXaaU2BVfjuwJjUoVP2tD7Npl75B98VZJDwdE26hus.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/I9/I9rlUp9wOGCFAgFJ5b8wQZoKKXE2J1-7hfje3UXsVZg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/IE/IEMOkncj_U9_93eSMbALt9yao9LbDQLvq9n3fJ-_UOI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/IQ/IQKKCtHbqJ6bUx8a4uVuxH0EnTMi3Z9pTGgf5evVhgI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/IQ/IqSIFKQlYMHc1EbDcAmi1u7TqGO04pv24COBQR-isa4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ju/JuLeGTL8JaG5D9cyywHhb6IGinsNbD8yY6rbHWarK0Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/KT/KTFy4DuyuDUx57JNP0W6fLLKCjxOWaeg7q17x5KDKfE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Kv/KvfeJal3RwHE_vFip-YDcfJf3hJYMDPzxHRPpXYqAQM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/L2/L2hU-WOXjHB0A8SrxDtNduvaKdwnjVQ03Z0oVziISHk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/L8/L88CHXoOVM-rgK33W0WiquqWq4DU9ZnngUlbj8DfAD8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/LU/LUtgCslJQspV1kEmCn_syNPA4ufxPaN6hMtWohaXsnw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/La/LaCGKPUclgb07zgHCjGbpLD2vFtFrpfguSA7NqS8AmY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ld/LdllFJg9rQqiqWy0nyDVm4M0WfryZupUWXbpLMcH4Hw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Le/LeJ8g5lhSV21E-CuvXvQ8qE0SdGx1kCj4bpzGm9FPBA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Le/LeUQdG0D7O4lxvySURbAaoGowjdY-WmNqf3Mfqrfxyg.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ln/Lnfq5j_dOByDX6HFfH6v4CKkXwkD0y8rDlbKuSbI9v0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/NG/NGbUB1m2dRLO_AzYcl_oKkHdUuotDsIljodXXXwUFk8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/NK/NKeacgI5h_cOQhJQTmlh5l4Nn7d-6DKGYfBIJOSDUf4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/NL/NL1pFIPf2f5fuCvnoN5JF4kdGbWuHSLeeujGtqhfq6s.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/NT/NTFg7sX71FXGCXuBW1GUwf8uv47jZFRUrKLKIKO1Lcg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/NY/NYQt2UjSKo3RG_ugbqg590mhSB3mvP_gDHshzQmZVN8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nj/NjZsOGvtYC0KyMgW_b7qtcn-Ed3x2gqsRxAnG20VBMA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nm/NmvDTKFnq0WZO0lTY7shuZVZ35wQFx6JKventv2q0mE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/O3/O3rIEN4zKE7CJBM_LXwlKRJcqMURUwW_c0p9rsHJ3c8.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OF/OFU_37H7M33hEEuzcANwdQAGfkk90oPeGIJwIHf5Xzw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Og/OgaMU4CNALgWmoD3psV4iD5JTmMxGGpfdcLkEDBrdKE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ol/OlTbAJQvBjcy3wv3CtTxLwTUCh23FReSq6n1cUQo7fU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ph/PhfCjJxri8GR-tRYNyZ4TGRxaqrQ2pVV7cLmqqow220.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pu/Pu1ZY6bHvgkdIneZmshfQMHO4lkdxTQGSzbUcbaR2JI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/QT/QTeSCu9r6R-LvVE6FvyfncwtlwuAd6YMS4u21lUHLRk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/QT/QTthbPiZXWJdfRab4l4_JZp54UB-wI9PjW7z-OCaoAE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qk/QkMmY41W78BAA7nXmfYlXDl4FxoPgBdMUe9e75nLSjo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qv/QvtydS7wcNNmB0KqFaQPpYZrpQgpm65pdcBVSI33zu8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qv/qvDrg1W-I6y2xd5FwQGH_yi4BuTNebLqv0_LV8j58EM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/RU/RU_ty9eUgt_HW5HIIBzVe38BmehTQI_vAwjDrsn10Tk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Re/ReGBPYTMVGc5UsM5L7KB0_3B13aNUqF-fsr2inoeNsE.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rp/Rpto49Xq2Q5u3n6usxWXSE7maUSL5fmQ-rekahtllIo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rv/RvEZGaGPIB-UH7NiAS47UlEz6GUMuDdd2uMjmqMvT_I.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/S0/S0isKtIfhNRYwge39yzW9XMD7da3RVY1yn5pTHUikF4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/S4/S4P4Inx4O6mCu-KXPCN98udBP2vvhoP_MSgP8Po1h2o.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sc/ScfD4iKc5jFQ0sAqQcZ5vbjFrMAx1y-jsiFmQJ5zA5w.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Su/Su5U7lV7sSBp5h2drScqaxP09Dzgxf5TsLqhNmF7MGw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/TG/TGXgExpgSc_VcKi1D8q4ny0qFNLn1zWiEPjuNlgqGg0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/TY/TYeBLIUjWLMlTnDsI_NJkTmwTjGiTqpI9WwVtWKi58I.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ti/TIAgcRehg3UoD7fAMwDtRPsueyHdM5FFRtTzk4XsGQQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ti/TiVa3yvBS2xeFmOHVVJYGgoUnIfCCXcUFHMuet94wRY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Tr/TrMavtlwXhgEVAvzNPfXmUqodHc3qmet6UGWf9d6zYE.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/UK/UKk4VLLLR7q9NN5ese2d_ncL-x9qK7UGBEgA5feD9lw.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/U_/U_4FnN2FfvOfugPWddXzWbw4DHmvFBUs5OsmFiPkiOE.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/U_/u_QoQJErsVSZi9Cw2JQlauHZuLy0Dq-vuvecsZDZ1E0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Uc/Uc_ZTiXMSqzZZrxwSXk_IoCOjRLxD7lDlcnjW9wvJH8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/V6/V6qz8Dc6vP1WFXSqLfkrrM9syWy5XgI2Gep62rW6-WA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/VE/VEjXe6wfJKIldWLaqz3ly5pWzsZiYn7JaY7r4XLB0T0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wt/Wt2f-3IT2csmJ91fK6jFF2uDZnlQo6y1lszcBzEJyWc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wt/wTcmxc80E-6PAz_V1hIWmNtN6nI0K8JQ1Rlc2BhL2C0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/X2/X2U6mKd2lA8LOGF6n9qXkc0i2o7wScG89aOK_NS02kM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/X2/x2m46SCZhw56dgfuvybJ3Ppq5sgz64fv8qu_4AW_LNU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XI/XI386_BkTj_gk7uXma5rbWR463wPft89TH5OjZKz2Tk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XL/XLgCehU5GSBGQhRots_0kKS4Pa9XkZOpu6Sol-YkfIo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XP/XPe3HBxR_h-ROk5qu20EvkHvF__RvrLRxMbNd7eJ_3k.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XX/XX3hVVDnv-sSVE7ZICha6u0NA3Ppl7l9JMSxEiPHaro.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/X_/X_8kAzLdAuIIE06x9RzFo6ZRCxuR6SBC3YcbGtmSel4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/X_/x_ocdNMbswM_QSPcMA3rCY6Pxc7oS6Su7URUZI-TfGw.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xd/XDL5HGq0QRG8qEMjnfwd7KudUcAQ1gcfExvWOncMRw4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xd/Xds81p3ZkxCM7EL8FE-LA9pEP-vt1os11SHAUoQDRDU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xw/XwGalczmXLu1Vq7IES954Nt-bIUY_k-o0S4s_lK9QZc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xw/XwJI5pHVYw-HuKwWYoeAcmr2nqtaXX2BUU0HLKDdLLI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y-/Y-idZQQ3EwCSVS2t83NHKq-6a5wCO-0qQOvEcoR1BH4.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YH/YHoGfC96NRHhFDFox8URBfqr3RlMaZapY8R1ROROBCU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YO/YORomuSWaH9UIEZMS78MsLuQ5w_8EBj4BfT20cBhkys.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YR/YR7MQVhcz2a_uFzIgpFRDgQdqZOFrP4mQ-TenZNV0ro.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YY/YYsopTTp0zAa8AARWHxyfNuNoWoMJFc_dLzdmmxAfQA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yb/YbF4X3Fte6fTBitUAdknKND5C3WX2Ch9W_ic6gCnCls.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yt/Yts0Xj-C3Fz_x6WA2WM-QLeZNam3QuouYqVdekrfrAI.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Z4/Z4szC9mPaIq-4GAc__koHEKpv7u7wHzKmsGzjRRuGUA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Z4/z4l1kUVK_V4Zxcw9GRbqWjgn6XfW_gT-shx4TXDhYBM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZS/ZSdczi_WgfcGf6T8pOIOP07xtYWzayAd1J8_oaYHlOI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zf/ZfkqxFszjbVDAuZtXJpn-85YO1SjWn03Q3nCnUGEfGo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/_9/_9G3bzAjv8L-5IO_zWzLO6TJ1LvBw-WCTrHLuupoJEI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/_U/_Uj4WfSjcwp3Y4FaJyfTdk2YrFxpSn3PDfkTeHjdjYg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/_z/_z32ICcgsTGhMat-hSNJ1Zs_Z1mn-WcPlWanTuz4Mow.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/aZ/aZc1YG6XLLUwvwwAgNUs4_BuRePhg-Q7jKy5SzbxLos.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bB/bBjejJEwZNPGlOwe3z3ij-Ioxpim5MBO2vIud8pOthQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bF/bFzUPCp3h12jat2mDBKrknDhGIPGMzuPVGLTiifTxjA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bH/bHgt2eQnzB4T1PCAJuFLw3cZeUKoGJlaG0jkaXRMYWY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bS/bSgsBjtu-Y7WrxesKqith5xy2XjVTuWXEGghmr4rivk.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bW/bWuyUVYXv1UBBeiimOQiJPa-Vll9LubPtXwDlinEcRk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/c9/c9cCA5h2e2lcRSB_xlgHVgaOZqVhIS-a9iRKPxbc3nM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cM/cMxRmRTWcm2kvRwccFPhgH4tv32a_nne4jKmUYtruqg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cN/cNbX5iq9BDETLU1py6kBl75t77IypeUadhFiqhLsNO0.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cc/CcqQnWkWCnEIbpOgHRdAaNzFQHH2L9g6knBNJ3SB8lU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cc/cclgnxezXL5bICYgKM8EP6CM79EuRWNYmvhurLSvfPs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ce/ceSV8XTFh63ZHKGJlbnwKXslFPqWLiY8SGXt31FiNTo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ct/ctE1aQULS9C0J9LB59jpqNJfxmYJGXrq6ANE_tmcP4w.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/dG/dGYZEYroVgmnLBXQCYz9zNmGxHkxAVAlVFzGz7jsx3c.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/de/de3Kd5dAVorCW6CiFB0dV2OOzaXIm79lVwGIy2BxtzQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/dh/dhG6jJqObdFb7S-vtYoaF6UvajS_AB64R_oO7dc_njM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/dj/djTNvveHgepJFppcIoTTO_8BSWfz7u8twGkyg2KGpgY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/dr/drSlN03pJucysB4B7eLkghrT9ZBDhpTorjwhsdNeBI0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/e5/e5YwXAH4M1cmeMnY4e4tPCtFAelF3e619Uo84a7O7qw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eW/eWmKSaV5eVYdVnRcCcqcBLObf13TOSuOvPqAXlJkr_4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eZ/eZT6zqDkMjGHFqgkwngj4RuZlg0d7hNJxKCPTaojD70.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eZ/eZT_Zg0eETe2kp_kWdxpgQOMJEtjbLZaLiBsbTTYfkU.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ed/ed_qL1hNVTKuXvmCCaf2fuu7m7wIpemGRzFKEKwhiEk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/el/elc1eh7AQtshCNx2BD4ycqBwwDW7l9W6_9PSSfkdRZw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/fO/fO22bQR4zM1-2bL5N3pMbYD6T8THJlzF8ChIIHiaV-c.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/fc/FCuilTOjA7atfSufnrJX7rHLcHVldAsQklmbgS2K-Os.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/fc/fc49oE4sEETUNfi1q8ZjoBeAcwLlvrEUzN68YeBjdjM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ff/fF9GeK3y-65UhLrBd8gYyq5L3H9y4DHSHzMi6W7AU_w.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ff/fF9VNsPFiwDEC4rlfFZxrYi9ZuVSRxSGC239k2h7qlk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ff/ff7iuOPVuvIGaVlIDs79qbQLLmR2KRB6iUrUUWoSSjU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ff/ffk-E0APeP-Ba5zsRy44pUjUV9_9ShJ4RbybLboXE4M.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gA/gAn10cGy83oA1g2JKW58awG5trLrLnB6UIYxml3uhMA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/h1/h143Swzrfuh5r0KHuGUjGD5LmT9EuJGM0W2KFNAS87Q.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/h2/h2iaYlKrq06cFKZ7RQE4yO3RGYAda_9NsUhxeRtlg68.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iJ/iJLso_yKSb6XJZsoDo7hHBcpRCC6WrB9WGAblrHWB50.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iJ/ijx4sr3F1vZzflIRPBnzGEOqCPOAxP5E1XENMzG4qSw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iV/iVEtAXTWK7twmY_U5Gp5lP0L1zqbiBjDI9bKymw5wQQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iu/iu55c1ZNdMMG-wfBFNaDN64hBxQIuolrHPe3Dhg8AoQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/j1/j1VJa8Bm4H7QML4QCgCWdo5og8MUvlO6JIePMi9quxY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jJ/jJDfuKEIKaO4anc9amIMj5VRHSVfIDAIl3IMdUHeJ68.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jM/jMygXqKrCCOEXGW6nU0CBhLl3_OdGlDfZGSzljVp9cw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jQ/jQRLSAj2sB6Mor5MY9RcCOJvfqpYMY1MwpkArnwbaNg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jg/jgUQwSKVupdt_LM1yzMI9sPa7bUS0hL5NYF_7PDlQZ4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/jw/jw64rIhCrdvowVxQ3lSeqlBy9KNUZti1emiuiVLaD6I.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/kB/kBs_Zv3NgQPG_Erg_0aTHKPfGN6pTim3ZA2gfj6lXOI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/kN/kNbCCN-jnLMUnSRHdZYZm8J0LRr7DObseTCm0iqNSvI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lY/lYX9apLRCeLVEQmZpPWPEVXX4fJbvCd1kwP--mCVLEU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lc/lcUuxX1kQ2pqBCSae7T757ZBrLC-kykZBzE_IeI1P9Q.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lw/lwwQcg5LmgQzJk92PReGYykEm8Ro33bIc8H9kAZfQ0c.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mf/mfSQliTMKdSX9o54w2Cekfmthv8R7QNOhRC-9Ofvhs8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mg/mgepIPH6FskFYPupUwR2zar-vPVmTj21YF5mrDoAbJk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/n2/n2RGsvZoKBxTiLhLJbX7VfPN_q3ki9fSDLKpTg9Qpag.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/nv/nv353JHGANla93EeXt0nbNR7q6Fc_k-Cww2sm0XLO3I.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/oX/oX6o-19Y6MZIzE5WBT20iflpYRQ5lxqOP46WbSkrswk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/p-/p-YGCQ4ATLB9KhNUf6SaCWeDSi-hF25M4tlEw6wL-Tc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pZ/Pz22fzMNr_4S5LTu_F4aHvfLwi3a5FxWzKSB7Ih0uo4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pZ/pZeDBpX8uYaZQSL8QFb81jahqzVveXCr7-tkG1_QFMQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pm/PmCDqEeLtrPfP2wF8MwUzaxxNP-9uAs2z6H7nT15ZT4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pm/pm0Z0fr1Ng6EPwmdfw1xn3hB0ErARZuc72vQFgPXMa4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/px/pxxnRt2S5YKvr89tE4B2uqWKSn_tzX2iMKaKc-L3mp0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/py/pyeQCwCKcTKGdUT-hUoQTeAaNBcmz9IX6ytzEOVTIRE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/qc/qc_xczyLqAbmyMs6ToF9Yh5Y0oCPIQjLpzHiq63LWiw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rK/rKfAjDHfXPWkuIQgDFeROxJHcCrAS-6Cu_LzqEP_tY4.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rQ/rQLidlmBnkrRwbSwBT8TFpss6O0RI5eBRgIqAAf7I9w.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rd/rdeyGdg6nFOlk7mcLZ1v48IshJec5MYarn6wtVbTlbw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ri/ricj8G0pRbsatr9A6Ntp6UXo-EqVDghl9E_UaFnWyDI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rn/rnOtD1XvKuRcZD61y_olzgHQlxMJKFpADr46croj5r8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rs/rs29jYXdRVDaE8LFpPP5sue1m6VBOjzSSSmbj3w0R7g.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ry/rygDWHz1u7v_E5X8f25Ls13ig8RrWj7AZdXJdO-Bq6Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/s7/s7c54SRRAn01lzB0-C1BGaqZ6RMq3nyMAia0CyZND5k.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sL/sLnioaoEAvcd1PA7DFF87-07iqZ7kMmomeiMvkhw6No.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sO/sO6cCZ8-40-uH9Q3VQwsuEzFIrVAf5uFyOa-DLD196g.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sz/szmBNR1H1DygmcGPID8zNIcbmrO1vGqzHYRGuc5u7-c.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/t5/t5yKLDb-oJrmM6EidUDDJ9htZXQRF_hTMBXD1A53RBs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tL/tLjAgIG8H6aT1yoSACGN9wfOA8P1Arys2JKZkVGmNXQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tU/tU-Tu9-noE-IHLvRNqvK_woXM1aNYteaOPgUhxs6YLU.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tW/tW8xtl_kBfnL8qfbu3og68_AnXJ7YupNE6BEDPPFTsw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tb/TBsC0J-09bPcPCk5aGUFhdmusxLwiGyIegmawsB3xjw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tb/tb2EHpruj_NKnlrPA8noFSH5EtqZCqBhcaFC-BVAzp0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/th/thEXJAStDw_NJ0oW4BatqUB4NUovgmzLYjQpoGmnt_M.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tq/tqXoYuJiHJnkCpau1HYEYtY2-wDz7t8r5iGWAbGMlu0.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/u0/U01H5dfrMbux5GogbLyC4SBOGndzsyFaj1Tvt-x_MTM.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/u0/u05ODfGMQPjYzkiqtypQN02wNjb1TOsdM4nA6N0Gh7U.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vQ/vQtYbe1XWQpkoH7AsCmn3Vg90HK8gBHJWMr-OE_Yzbg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vX/vXIuktNgDrPy8Z26iigTe5KzkVH0MLWnU_tO7fOcuQY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vi/vikgCXTfdSo0-dQ8npKdHUscpgFEvOuH8yl4kh8sg1g.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vu/vuwwEKj3Pn9TBEpVl120M_XgalUJIHxkg8ki2A6V6Sk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vv/vvXsHOAgAUjJPzD2Uk0jFgsQ-q9SPSBAwKypglmyo9o.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/w2/w2nxaML0A06iskoPgzyx7IkuH7eTgBz9pOScOPROVng.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/wp/wpXO5iYAIrHziTkLjpJ0fLFEWA20vjlc-zodbcbXrXI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ww/wwyHZev8ZI64E4ZkAEQrGUwshw5Q5Pg0SXp5Q7EiMME.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/x3/x3ugZrAsFu-SoYrFZ3QESK2Bv-n0twnYh7MfrC2ei5A.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xE/xEt1J9sNcPPTzLnqYdO0cwcxIKiiNUvbOX1XjY4mOwQ.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xO/xOHSvfsoDwJ31vBs7MeJSpnZXhYmahjbpoBruNFMSTw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xR/xRo_XLPpPL6rw8FynKSmB1jbUF4U4sdFfa9qlFEaV-M.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xb/XB6BuL_-MlRJw35sb8y-MuMukKnImXWF3tM7s5NXTCs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xb/xbDqy_ABKyvnDx5qFb7bOefr2mRNtkJS6jxgaK2mymE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yE/yE-vYTftOCvTjiXwsSaPhc68Ok3Swuj7FeHDt0X1fuY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yW/yWhGG9UHY-eITiHpveUgL7MEefJBaJeb69K-sfnafHk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yv/yvDUKhKfIJ7Mzn3EKrWjn7dUzISDvjV7NdAZHQb2e4k.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/zE/zEyHh8U1s_vyFT8TKnThlXAwgkQTZilKRZijXrGmXZQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/zQ/zQfrKzck6RKqYFUfKWT4m168XkPB0bFfxD-vJFHwzBs.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/zd/ZdNzirUsmGWTgLcSe08uPLwZHnzZS6fglg2UXqiZHCQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/zd/zduZXmFNo0y1enN7_NdRVQRkSq5Ig0zd-ISOx8rZJac.cache +1 -0
- data/test/kadmin/form_test.rb +6 -0
- data/test/test_helper.rb +32 -0
- metadata +794 -0
data/lib/kadmin.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'kadmin/configuration'
|
2
|
+
require 'kadmin/error'
|
3
|
+
require 'kadmin/engine'
|
4
|
+
require 'kadmin/auth'
|
5
|
+
|
6
|
+
module Kadmin
|
7
|
+
class << self
|
8
|
+
delegate :logger, :logger=, to: :config
|
9
|
+
|
10
|
+
def config
|
11
|
+
return @config ||= Kadmin::Configuration.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure
|
15
|
+
yield(config) if block_given?
|
16
|
+
return config
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/kadmin/auth.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Third party dependency
|
2
|
+
require 'omniauth-google-oauth2'
|
3
|
+
|
4
|
+
# Core files
|
5
|
+
require 'kadmin/auth/unauthorized_error'
|
6
|
+
require 'kadmin/auth/configuration'
|
7
|
+
require 'kadmin/auth/user'
|
8
|
+
require 'kadmin/auth/user_store'
|
9
|
+
|
10
|
+
module Kadmin
|
11
|
+
module Auth
|
12
|
+
class << self
|
13
|
+
def users
|
14
|
+
@users ||= config.user_store_class.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def config
|
18
|
+
return @config ||= Kadmin::Auth::Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def configure
|
22
|
+
yield(config) if block_given?
|
23
|
+
return config
|
24
|
+
end
|
25
|
+
|
26
|
+
def omniauth_provider
|
27
|
+
return config.oauth_credentials.present? ? :google_oauth2 : :developer
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Kadmin
|
2
|
+
module Auth
|
3
|
+
class Configuration
|
4
|
+
OAuthCredentials = Struct.new(:id, :secret)
|
5
|
+
|
6
|
+
# @return [Kadmin::Auth::Configuration::OAuthCredentials] credentials for OAuth2 authentication; if absent, fallback to :developer provider
|
7
|
+
attr_accessor :oauth_credentials
|
8
|
+
|
9
|
+
# @return [Class<Kadmin::Auth::User>] class to use for authenticated users (mostly for resource authorization)
|
10
|
+
attr_accessor :user_class
|
11
|
+
|
12
|
+
# @return [Class<Kadmin::Auth::UserStore>] class for user lookup/registration
|
13
|
+
attr_accessor :user_store_class
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@oauth_credentials = nil
|
17
|
+
@user_class = Kadmin::Auth::User
|
18
|
+
@user_store_class = Kadmin::Auth::UserStore
|
19
|
+
@enabled = false
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Boolean] true if enabled, false otherwise
|
23
|
+
def enabled?
|
24
|
+
return @enabled
|
25
|
+
end
|
26
|
+
|
27
|
+
# Enables authentication and adds OmniAuth middlewares
|
28
|
+
def enable!
|
29
|
+
unless @enabled
|
30
|
+
append_omniauth_middleware
|
31
|
+
@enabled = true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Disables authentication and removes OmniAuth middlewares
|
36
|
+
def disable!
|
37
|
+
if @enabled
|
38
|
+
delete_omniauth_middleware
|
39
|
+
@enabled = false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def append_omniauth_middleware
|
44
|
+
OmniAuth.config.logger = Kadmin.logger
|
45
|
+
OmniAuth.config.path_prefix = File.join(Kadmin.config.mount_path, OmniAuth.config.path_prefix)
|
46
|
+
|
47
|
+
provider_args = case Kadmin::Auth.omniauth_provider
|
48
|
+
when :google_oauth2
|
49
|
+
[:google_oauth2, @oauth_credentials.id, @oauth_credentials.secret]
|
50
|
+
else
|
51
|
+
[:developer, fields: [:email]]
|
52
|
+
end
|
53
|
+
|
54
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
55
|
+
provider(*provider_args)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
private :append_omniauth_middleware
|
59
|
+
|
60
|
+
def delete_omniauth_middleware
|
61
|
+
Rails.application.config.middleware.delete OmniAuth::Builder
|
62
|
+
end
|
63
|
+
private :delete_omniauth_middleware
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Kadmin
|
2
|
+
module Auth
|
3
|
+
class UnauthorizedError < Kadmin::Error
|
4
|
+
# Attempts to translate message, if not found returns message as a string
|
5
|
+
def message
|
6
|
+
I18n.t(@message, default: @message)
|
7
|
+
end
|
8
|
+
|
9
|
+
def title
|
10
|
+
I18n.t('kadmin.auth.unauthorized')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Kadmin
|
2
|
+
module Auth
|
3
|
+
class UserStore
|
4
|
+
def initialize
|
5
|
+
@store = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(email)
|
9
|
+
return @store[email.downcase]
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(email, user)
|
13
|
+
@store[email.downcase] = user
|
14
|
+
end
|
15
|
+
|
16
|
+
def exists?(email)
|
17
|
+
@store.key?(email.downcase)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kadmin
|
2
|
+
class Configuration
|
3
|
+
# @return [Logger] An instance of a Ruby compatible logger
|
4
|
+
attr_accessor :logger
|
5
|
+
|
6
|
+
# @return [String] the path the engine is mounted at (used for authentication routes)
|
7
|
+
attr_accessor :mount_path
|
8
|
+
|
9
|
+
# @return [Array<Hash<Symbol, String>] list of admin links, format: { title: '', path: '' }
|
10
|
+
attr_accessor :navbar_links
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@mount_path = '/admin'
|
14
|
+
@logger = Rails.logger
|
15
|
+
@navbar_links = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Rails dependencies
|
2
|
+
require 'bootstrap-sass'
|
3
|
+
require 'sass-rails'
|
4
|
+
require 'jquery-rails'
|
5
|
+
require 'select2-rails'
|
6
|
+
|
7
|
+
module Kadmin
|
8
|
+
class Engine < ::Rails::Engine
|
9
|
+
isolate_namespace Kadmin
|
10
|
+
|
11
|
+
initializer 'kadmin.install', after: :finisher_hook do
|
12
|
+
Kadmin.logger = Rails.logger
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/kadmin/error.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Kadmin
|
2
|
+
module Errors
|
3
|
+
class Authorization < Kadmin::Error
|
4
|
+
attr_reader :resource, :user, :reason
|
5
|
+
|
6
|
+
def initialize(resource, user, reason)
|
7
|
+
@resource = resource
|
8
|
+
@user = user
|
9
|
+
@reason = reason
|
10
|
+
|
11
|
+
super("#{@user} is unauthorized to access #{@resource} => #{@reason}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/kadmin/form.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Kadmin
|
2
|
+
# Parsing is done by using attribute setters. If you have an attribute called
|
3
|
+
# name, then add a reader/writer for it, name and name=, and perform the
|
4
|
+
# parsing in name=. If there is no parsing to be done, you can simply delegate
|
5
|
+
# the method to the underlying model.
|
6
|
+
#
|
7
|
+
# If the attribute is a nested form, in the writer, simply instantiate that
|
8
|
+
# form, and pass the attributes on to it, then update the model's association
|
9
|
+
# (if any) to reflect the changes.
|
10
|
+
#
|
11
|
+
# Validation is performed like on a normal model or ActiveRecord object.
|
12
|
+
# If you have no extra validation to perform than that of the model, simply
|
13
|
+
# delegate the validate and valid? methods to the model.
|
14
|
+
#
|
15
|
+
# To use nested forms, you need to add a reader and a writer. For example,
|
16
|
+
# for a form called Person, with potentially X nested Person forms as children,
|
17
|
+
# you would have:
|
18
|
+
# class Person
|
19
|
+
# def children
|
20
|
+
# [@child1, @child2]
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# def children_attributes=(attributes)
|
24
|
+
# ...instantiate subforms and pass attributes...
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
class Form
|
28
|
+
# Provides common validators and methods to add custom ones
|
29
|
+
include ActiveModel::Validations
|
30
|
+
|
31
|
+
# Provides translation scope and helpers (useful for error messages)
|
32
|
+
# Also includes ActiveModel::Naming at the same time
|
33
|
+
extend ActiveModel::Translation
|
34
|
+
|
35
|
+
# @return [ActiveModel::Model] underlying model to populate
|
36
|
+
attr_reader :model
|
37
|
+
|
38
|
+
delegate :id, :persisted?, to: :model
|
39
|
+
|
40
|
+
def initialize(model)
|
41
|
+
@errors = ActiveModel::Errors.new(self)
|
42
|
+
@model = model
|
43
|
+
@form_input = {}
|
44
|
+
end
|
45
|
+
|
46
|
+
# @!group Parsing/Deserialization
|
47
|
+
|
48
|
+
# Populates the model based on the form input. The input is typically obtained
|
49
|
+
# from the controller's params method, but can be any hash which conforms to
|
50
|
+
# whatever the form object is expecting.
|
51
|
+
# If some input was previously parsed, there is no "rollback" on the state
|
52
|
+
# of the model; it should be done prior to reparsing if it is necessary.
|
53
|
+
# @param [Hash<String, Object>] form_input a hash representing the raw form input
|
54
|
+
def assign_attributes(form_input)
|
55
|
+
@errors.clear
|
56
|
+
form_input.each do |attr, value|
|
57
|
+
setter = "#{attr}="
|
58
|
+
send(setter, value) if respond_to?(setter)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# @!endgroup
|
63
|
+
end
|
64
|
+
end
|
@@ -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>.
|
data/test/dummy/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class Person < ActiveRecord::Base
|
2
|
+
has_many :relationships, autosave: true, dependent: :destroy, foreign_key: 'person_from'
|
3
|
+
|
4
|
+
has_many :children, { autosave: true, dependent: :destroy, foreign_key: 'person_to' }, -> { where(name: 'child') }
|
5
|
+
has_one :father, { autosave: true, dependent: :destroy, foreign_key: 'person_to' }, -> { where(name: 'father') }
|
6
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>You are authorized my dude!</h1>
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>You are authorized, but not within an admin controller!</h1>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
6
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|