model_mirror 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +37 -0
- data/app/assets/javascripts/model_mirror/application.js +2 -0
- data/app/assets/stylesheets/model_mirror/application.scss +3 -0
- data/app/controllers/model_mirror/application_controller.rb +5 -0
- data/app/controllers/model_mirror/mirror_controller.rb +52 -0
- data/app/helpers/model_mirror/application_helper.rb +4 -0
- data/app/helpers/model_mirror/mirror_helper.rb +52 -0
- data/app/views/layouts/model_mirror/mirror.html.erb +12 -0
- data/app/views/model_mirror/mirror/_props.haml +7 -0
- data/app/views/model_mirror/mirror/_table.haml +10 -0
- data/app/views/model_mirror/mirror/index.erb +6 -0
- data/app/views/model_mirror/mirror/list.haml +1 -0
- data/app/views/model_mirror/mirror/show.haml +24 -0
- data/config/routes.rb +8 -0
- data/lib/model_mirror/engine.rb +5 -0
- data/lib/model_mirror/version.rb +3 -0
- data/lib/model_mirror.rb +7 -0
- data/lib/tasks/model_mirror_tasks.rake +4 -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/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/country.rb +3 -0
- data/test/dummy/app/models/door.rb +4 -0
- data/test/dummy/app/models/handle.rb +3 -0
- data/test/dummy/app/models/home.rb +7 -0
- data/test/dummy/app/models/home_door.rb +4 -0
- data/test/dummy/app/models/item.rb +2 -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/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +85 -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 +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/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20161218221449_basic_models.rb +43 -0
- data/test/dummy/db/schema.rb +73 -0
- data/test/dummy/db/seeds.rb +23 -0
- data/test/dummy/log/development.log +19009 -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/tmp/cache/assets/sprockets/v3.0/-r/-rem8qHe3jWBIDJwImlTNDaUPlqVgXRY1b3LZv_pGmc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/0m/0mL3fFoJT669EcXVwkCTbvIBmP1qJDpBph16eqF-WBY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/16/16MQvhfW1mNDBOxmqlxF3Sfx0ii_Xa1virkUz90G-lc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1A/1APF4ARzgWXKqqqkOVXRiCwJlPSbzqUbPzP0gi3C0Tg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1L/1Lk4v-juPuxQK9xk9U_6n4pHRlHq8qexvqbWS3RSOeg.cache +6 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/1W/1WovAcidzRR3A7uthpMQ6U3XEbTTndhGm-nzu0bN8Po.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2I/2IYf1GKTaky45xQ0ByEfLH8noAv1tjBfcb8hyIs2Zt8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2N/2Nz2ZUVHsU8q6T_j99YI2vXL6eyEC1litRpW3Gq5OVw.cache +6 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/2O/2OdGXo_n41rWVcJcZGWsOVu5EplcuN2dEimZABx3p7k.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/38/3874PulaWu39Mseqp1Fxv-uJtb7b1KMmjdcaj1Fb7aA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3S/3SV_oRzLQxjRO1XapyhR3j6XJc1VsNpv_lvKhO31IIA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3i/3iS-1u6s3JfKpDOeW2BK1I561Qnokd_FOWl-ww6eW_Y.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/3u/3uxJzrv2nJOYEfU0OOaanJWU6ci6vYMJBTvV8TcoPmk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/4D/4DtBz4KsaA5jFqAh0AsCXqpY5wlp0YiS_IwSugibPMs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/4T/4Ts5Q1mYLX8psSKhIIk4_8jM_McmHNWrACK1luIf7SA.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5g/5gUyWzsbVpWbrqrQFxdLUburTbOzHEf4T_4IQEoiGVM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/6a/6ad00o-Ixp4aI5ze35HMEOGBV3gT_3pwkiIT4wdOJpI.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/6x/6xZo5tJHPMnj3wC0PIvqFn9EItXvN9F95gaQe4e0qkw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/8C/8CIzlcUFdKjq9Vma4WcpcXtgYm0xt379KvQ4_maWSIs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/8H/8HxrIjgSAP8WT1kSsiAXCCvFYB4TdYZ75oDB-cZayk8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/8W/8WBq4HN_OthrS7ZTSZsZNQ94zvAqaAczZroqveYj6XQ.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9F/9FEZO7HTjZBreH7lBbPyL73gCc6TwCPI2RQsEhjtgQE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9V/9V0Z4iMZR-VNdc986Dhpdyc9OqBr5NUDN5lFrqCLnt4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/9k/9kyaJU51bg0Qgv1c4b9JTX5JhB5C7DAQ5m2o1GzFHKw.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/AH/AHq4wg2mLyp59oc4qtMwo9o3SyAtkfU1_GnvKlLexq8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ae/AewZtwn1j9CahS7AFKOjUA7Ye6SX50LKrwAxLHm2CQI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ax/Ax5Rj5uyaYrv3CFW272Loc3y7k6AWypFcL6SDXzYH0Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BC/BCu7gFiI3gHSa787aoHVOhy_U5U9ydh5kdSWh4W2wPY.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BL/BLsV-gT0XlaVYtmjk7RXapmjYyvzzUuo0UOZHSzSYFU.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/BR/BRqQahPtqPlcv5RMLiugqYt6K7tjm5pSog6xA9TXqRA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ch/ChO89-OOg5UTSKh-CBanZP96PhJXpz88MohbeAv6GNo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DI/DIov1zQlsZCK2UT0HnSTrXxu8qiRzaIvMffw_0rq0ko.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DI/dIPiS37RjSFdpuFK-ORRJK19cM7xUtWCOaxSsoZ2mYc.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DS/DSOLSc6A5RVSmvM415eEWAWG_AgOvZcLZOXQjsXyWQA.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Dd/DdNW40NelwbRI0y9a_42Quvttz6gfsGuuwlejQcxNFg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/De/DeoiM-L8ucQIWYgQo7o_HmEZUsO7dq6YU2-5sa3Cea8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/E2/E23X78R7m5KzWeeVWl_1tOHtIaBP3G8DXpN4asy86cg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/EY/EY9nkjkp3p2nx0uVkc4irb6oSolhG4hF_y130SF8Ww0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/FN/FNsspR8OrrB5lPCCCAnXL_lSncu_n_KmzlXqn28O79w.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/FN/fNQ4TJ7sCyQHy_QaR6HwFenVYwjOZfGOREw6POD1-qk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/GA/GAo09OnO5TivvBZ3jlzVYDytfrLeCjAHr28wRxoNG-8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gv/GvoRsDzc9iaQVpdlV8TA4XE8O_1ekuacOcApWNLMZXg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gw/Gw6aZcbDgzBVnXec-ZN6nxIZTgJ2Hrr-GW2J5SDkk-c.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/H-/H-lyHNhtGFcHRVH7zKxHVlK-aIAWjFjwmdnA7SD79T4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hu/HugBc22HDsq0j4IyO4z15od2v-z5aoA1VD3gXGYKKCg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hy/HycOvWGHZuPkRbpE1dGf2xKVmZvjP8kmosnLNjWGSz4.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/I0/I0IF5lo6NwDdD1CGog_RX-fRaPSmw0kK_KqVxkDcNNQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ju/Ju7LATlffI5L5z4EgfGwK4c64-s2_p9az-CoGSsBlEE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/K1/K1c7_25cSyNRDsT-ecYkoKc1bBLDTrpJ4hvQWeOwUL4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/K9/K9Au6uxp_IqSeFmx6s0mpmEjAHr7gpiXUKlVWFPlaEk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/KN/KNV9hOjChbe4o2PkFRaQ5TIu-SXf08Gji0m60MjbHtU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Kb/KbLJKLHgcEboX1GIXMmF2ldg6Nc3fxEGf5jZhPP8fJo.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/LX/LXFIbS1BGt7ebR44Vs15txHnY95-m5JfMujyHGB7POs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ML/MLSe_SfeAZnLwIofKthBtgjGKVZABKUW-dTu5bWIXKM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/MP/MP7Gs3BFmH91TR-vCxql9QxViyhDTEY6hxahDxoENJ8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mc/MciqAabEG700pEmQjBDhWMJ9_1BRxDpzJAUlgNryRRc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nv/NvI3SLSDRi-OTu3rwFLzZ3GLjxtan6HtL6pbuZzVhj8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OC/OCX42icPsjladPMTamow6RtDqrpHDAuFLG06rJ7ZTic.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OM/OMTmPKPiQlvGV0ss5rJYpvOyQDW9QlC-EBKF3HB4e-M.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OV/OVW_Ji-SsW1rXODIu0I54twfynvimhyV4nlZVpj7ueo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Oe/OeQLwkU4mNAs3-DmjAqEncbBlSNtXgAJfvfZ0vL7lRg.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Or/OrieLQHuNg4SLolboVeqUj5kz-9oF4JF_orZ-uWIaYI.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/PO/PO63eyxgQ4fClMV9sJGrWLZqWskaf6yzapqAQ7QJlnQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/PR/PRRUqqzL6cA_WO6VkODC_-raUYAvhisfGMV3SIVCTWQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qe/Qes0c5ynKXI99EHZREbrThMFf-p36yDAoMquTztWmF0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qe/qehI_eDoauNonw6bRK3nsI6C_D2GhQrplYgRFYEoziE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUVfWnmlS0olUIWRUywhd5iyq47yXX9f3VsX__U_13s.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/RZ/RZ6dwciysjVQOCLCm8jiv4QTC_aHEDfZvu2p3kioKz0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rs/RsAzat6SebjN9BDx0sTrNRQ9uVCLHRMDY-07fnwS4Zk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/S4/S4s7G9DU07vjeV_enapODUGt-NEGYrUHQNYysCmJrK8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/SC/SCiZ9mqjOi8eQ2rTbP_Bv0kz2AFbxlBKjHRA0CuAd7Q.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/SN/SN3K5xTG86Qdr0pUbxNtr72Irl-bFgOUdFcb8WUdyqc.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/SP/SPNw9MO-hiuEJhbX0lED1yEN__99WGMICy8wvBHLm1k.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/SY/SYKVfYFH7rFgERKvKrWa5_f13o8asRu5DQccufIp5Ts.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sf/SfkpHW42gYYM5tJozoLxeD-1Qr3fp5IkeKdLL_TKyo8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Si/SiSLeHAL4fmsA1R7ORNY7y5whoq_u0jcY8HX2xzURQs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/TF/TFy1Bdx5ZOtN2cQeCumrG8mCWKolCytAfgJ13BjA-_o.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/TL/TLDBnV47WInqlVvJxqkPIILsWY9wZqi1vsD0jS0QAsM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Tn/TnRjC6wWRvOrLuyhqg1bM7SuoOccIg_1SorcIHc8OxY.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/V4/V4CbaN8Ci-nerLQZQynj1mIL4Z9bUiLxKYYGR5Kwhec.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/V7/V7J14JqRezLq9ChuUJ5sAOfkzNq2m6SuI8cmsMBcQaE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/VN/VNMzZtLNaJVdP8HpGZmXYlKb9vW7ejeTF6T1jNJ7Vsc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vb/VbJkn3R1H3lpTNi4N9kDEvFzomJiXCLqh_-n7hSa9c0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vv/VvUT8M86e67Kp8g81Xlzpc4ZJi4mgVHtLWD2HBERK2c.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/WH/WHNNwabnV-mgmOYezrtxyMwRuFuQ2hUNT5GgXC-w9xY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/WK/WKvs9W2KkUolDfOy3IPssLedy-K5FZykXPtgA-C4bnc.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/WK/wKUhKhiDh02kZo8zerjh8NH_ZYubrHtdRVJbhqg_tvI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/WN/WNv1-RZyUpayBpXsP0MqWaxcAVf1gbvGhuHchz7PGMY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wc/Wc3fjTk0jGWqkMwv1zYL18Xnpn8gBTsuuqGoRDIaC0k.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiQ3LIULAO7qRcTnjMlc-RbsM_oV1qSiUI_eicGT-bg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiSZD4em5xy5xUdIRCedsGuG2lTVNkhYMp_AhPqsL18.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiW41DMWIO1P03AeVtMi3UEhuLrNuI6veiKegZu013s.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/X9/X9fWZvfb_VaRERvF2AP90Hme2E3d2q7dZZWy4e9BqnU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XC/XC87FGa9xdzH95RNNVJ6MsZluYOSlRl4blYRHNYLc7M.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/XF/XFaAQLvxLU0oK7HCcyoaF4muDjKj5YqJpRIjibofWjU.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YZ/YZhOW7jUHwEA-1sFv7UBYSHkBdSNTh5Z5VM52rw9Y3E.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/YZ/yzHysMJyDxbZT85gGC2gebuoEvJSk-KhkrjUWvHS57M.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yv/Yv1FVr0yJVhoPDWRzJGUPy39sogAoRCRo_AW2MRa690.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yv/YvZ1P1s_8dawf0jKOygoEw8ZqIwqAn0gE93xJsZfV2w.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZQ/ZQbdHv6ta3tOOZJZ09KoQ1Kf4cJw0C4X7wUXK2lJTs0.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zw/ZwhvjlnTrmIcB6AKaWY-VhK13O3Y9qTp2eR8fP5liis.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zw/zWzGYnXIUMzLH2Xa31Ut1jvHReOQLxvrqlUoVX-yT8c.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zz/ZzUKWSpRlucuYWQNFcmhsdCSjFKPF-yztc9OTph2YHY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zz/zzFBBwE2kLvJmX_aVjXJZ6bPIOw9lWluLSYCVCTqt-8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/_C/_CXBGviqSGu54ckaAzMR_bh33qyXlkKAidx4Xu3wRTk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/_g/_g9MVRm572JADv2ayUb_hMTKm9S9quYBjMfV0Ayc2ME.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/aC/aCuK0Zzg5f8d9jFYwjmHkzmzTH6Ovwa-lddiPn9U7vQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/az/AZJP2GIYTRZW0vsIjU31B8rE5okutM4VHpwWcCwLeFw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/az/azKX-4hc5mH3qAKgzCdpmD2R4dYiHngj5l8LAD_vYeY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bI/bIEbt9WOa8LXiUDYl61YWNtFiCfrFSFhMC8fBEA2uok.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bS/bSoYLLIJUh5ggToGbm_TQMHep29Y-EsWwakXewgWJrg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bb/bbKjfNv6GVI5mifkJSeYhuEUxRHZ0wsZufSXzxPI4QY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cN/cNtvm5yIqK0_IRJ1258QI8rfPM4nE1IaVuKvjuMXnKE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/cs/csYOWzfuzOEFDwnIUEX6sNgEOfdQJT7pYXuOZEWCaE4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/d9/d9CtVAhy-lNvmRJWpQ-eHz73FJ95h1rayp2f38-vWqs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/d9/d9GB1wRRQDwZAFGSt_kIB93v4wiDQrihqoNi30t2TGQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/do/DoColFzCbCCFcwvrMgK6Q-P_myLaD5JgmZ1yU5WkxaI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/do/doDEfNq3bD-SKigsV3oRymCXJBPmb81eoQHgIGsULU8.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eR/eRKrgU3kJIQFr6sjMChNUmRpKAImztqX2aCVKtJ8Gxk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eX/eX8A081oDi9cYrzrKaxGvb0i5roG_fwelmXbORskSJc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/eZ/eZEA29hAQovhscPAb-L3OXJ2dcMkV29cfpoMAHMvauI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/f-/f-vAaT_FE7fJauNbbxrHAgfOj06LNjt0DylZ4pnTFec.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/fb/fbSd-J7VKYIIL9NYPoivBuxx0-ZggyulTXFRfWCq3Ec.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/g3/g3FC21hFceMtmIhpOiB30_UzvZ0QjIZt-6bAq1QmDFQ.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/g4/g402J4FE3X-LOGHiSdRS1nQcqoBGyYl_-AEaYtdnj8E.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gG/gGhEOVGoTBEmCGeqY8nfY-MxuZJaiRtQVlyoIndvTFM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gU/gUBYi_4ly8zIsQFSKQHndMBIujEYkR7qw5C3VuNoNAk.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gX/GXKHBmnFVPNBOTbp7VziYPIat7b46BO2T-77pG9-phs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gX/gXwSSkIjfu2Z8TPjFFQ99LILn3KhweKQ61jYXnaDy0s.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gd/gdVNAZUtzc3pooYxEI1TTGUv27zBIk6HeAiLM1NWv1o.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gt/GtnozyXSu584zX7yAvKxFz0JjHNsCgx2ptUwFTHmwF4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gt/gtu2MccPBzckO0Me0uCHy9JGovh9nYdxwCe1fDhGang.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/h5/h57yw3BreMKakuj44_JE3DoZR-B03-7zqzPFKzsBF-k.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hA/hAfBB4kflHOL9adDG71Ds0A-E6dpkZUjz8c0yFd_OlI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hV/hVJ02ebxsq4L-6DYv-XXRZmYRE07lX878LD4r47xFEs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hs/hsxW3Wtn2QVcOMlzcFrOu_89_60O0e4-8THFqVIO600.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iV/iVSut5zj2YYcuoPo93I33us2zyM2diw9VDUe8wCbua8.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/iu/iufJbNZZut64O4K18v7f_JpXhJbdAz6WMhzRZobpXj0.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ix/ix6XGKs1YsrRk7LjmUXB2HvU9NM-j90TPYB6IRcmGac.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/j4/j4oFZSEV5HuuWzG0Tutu3zGmSPgE-ugaID6oQNNGnoA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/k-/k-qA5xfTlEoasPgMX7YxKUdwm8V1t-61InR7up2VUiE.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lA/lAzOkFL-dUWexPX4R93n73TjKqVi9C7lk7-GBSRgI5I.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lV/lVabXFsusC5bUGGQ04PSEu_cHr6qub-HDdozchhyvEE.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mE/mEONH4tgEzMiGZveEmvUoyaaH-9O2NZ5tZAOQQS3jsI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mI/mIPZMFCt7qfxnJASuD3Vrp8o1-eNUTAbbzMFatqTf8U.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mN/mNkTCViM10CyvBP_tw7ZzhPI08cYfE41PKEmJc7q4ns.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mS/mScg72OJ0BopLfmEVIYCkCvkgMWV90L-iIBuLGRVWxc.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mV/mVv0oErwXrQlvHa8JGVY-fxxK7gs-uh6xVbu5IAT_JU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/mz/mzDTfFUL3rStqZPS-XwHENUXeBgV8kiRS-fVbjvesTM.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/n2/n2NyZdTdu080QGvmZDR1B4AbiBSBTCUp8NOTcHGexiE.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/n9/N9kjmH8hTTQwbE-LOXPwo7-h0ezL8_daaZ4PCMiQwoo.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/n9/n9horN-h4sLmnUHNE8ieeUDbxdDdvhHUJhim7dHYV9A.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/nh/nhuJqmtEIaJNByqtFTY4YY3cwy8NoupqJ5Lpq1-Ngcg.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/oj/ojhX0nsXTRWw-man0eiKeGZBWn-nU34ASbwvL5QROd0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ps/psrFJIIqADl-7zBiYvzm65Q6mpObv255OKQjBPJgz2g.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rK/rKYkcyJ4GRYSA0luj4GNTYgV2_B1kMcCLU-kInDWn5Y.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rV/rV_SEyueEQxwKSoVpvVRsORMBgIyXzNU6IQS6wKFgyI.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/s0/s00fgQTBwwC6VMAhcJsEc2aVad_5b047CUnC_A5LdfY.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sr/sr8ddbDnN2v9l6LNMv7-85a-BpESmS54if-UruFcScc.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/sv/sveyr4o9md78WbNByfMCXcWbfRG4VqHH5FV35qbn3wk.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tB/tByA3lfFf6zEl6UAKb2_Mq_z7A6Jw5Pgmr4SwJ_sgOY.cache +6 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tH/tH0kiPM7ZkR8UV5elFido53WVXs0E7r2vtDItmrJ7Kk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/tz/tzAdtNhgJ6D2IKkZ0Fnl3W8nT5jZC48z8Q5kZeZkwF8.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ur/urnYAlvXb11hMGOxMX-5TKbq0in39t9gdqOVIKJCbAY.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/uw/uwtzQliG1pMyItXO0oX0be2m9ZTbFerHBjlOLCHl6UI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vC/vCwwIfx0M86-ktaxReqQ0Zn3xul5b3bUCXGHN_PiHkI.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/ve/veYoHDI2VWOtSr12EuE1oq2kCCLg-vbrwQr32ro0P44.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/vw/vw8XOgLfJ_9nSA5z2HOPfrLb7w6J5a0Y-Sd1JY03JNk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/w4/w480BxE-FvlXjgRJ6QKwxmQmEIEb_pTCc3brNpoG2uE.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/wd/wd3JQKkkcWrG6N1UpO-wXnm7bkCnRPEh73zr9rLH5UM.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/wx/Wx6UKhJ6NvaBigwGc_qtsjI-a0onzFWgUPe7xltcA1w.cache +4 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/wx/wxLKf8cKRD_upDDnu0DeaiQTk-qk-IsfBOuvbWWJQAk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xS/xSh4oU-YDszJuCCtyfiMv1h1CpmrnrYDXQw-RiqmaFs.cache +3 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xY/xYmWaFAi0yVEZtAHWaabXAnqFzNqB3qzmNWiFAXz-KE.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xY/xyeP9BCjwsZ0v0HdMtqR6bs77yvb_6ngjFQKwfcONUk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/xg/xgSn71MJW4DGzOwWLVgstnbJolxuczROkHdOHrEO54w.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/y3/y30SzU0UGC6HGDVXTjLFGPXvjAwe3At8yV67S27gT6A.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yK/yKwopwb5WgjInBeIxw7s6OUHsuWdNLYIjhj21x-Iysc.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/yu/yuZl9eXEsgHWOSbw6W5BJuSrtkxclnLA04CPHhWMBdA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/z2/z2L2rlVoLKs7OUuC7X2XOdccU1Cx6IzGSEdC6KtY_MI.cache +0 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/model_mirror_test.rb +7 -0
- data/test/test_helper.rb +21 -0
- metadata +611 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c18ac50d9fbc88c6c04a63630f9efed4d044abf4
|
4
|
+
data.tar.gz: c749b5d0c0ef9efa28863af5e15340a46e6a1b47
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0921af974111eb5d5154872fca78a7a05685e211d3ad640093c8d829bb9dbf05a96cc3ba069ba048ea20f88e5fd9aae377a27bddbb4bad17d7ee8cceaf6bf8e1
|
7
|
+
data.tar.gz: 055dfb3bd48b69e415c9811baa939a815c2f181d4f88f46d0eed16b2cddc07419ff98f9f9cf33504a637827a952f8b0b8f8e663ccdff7d520e43d0db093806e8
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2016 Scott Pierce
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'ModelMirror'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task default: :test
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ModelMirror
|
2
|
+
# Get datas for views
|
3
|
+
class MirrorController < ApplicationController
|
4
|
+
before_filter do
|
5
|
+
Rails.application.eager_load! if Rails.env.development?
|
6
|
+
end
|
7
|
+
|
8
|
+
def index
|
9
|
+
@models = ActiveRecord::Base.descendants
|
10
|
+
end
|
11
|
+
|
12
|
+
def show
|
13
|
+
@row = model_instance
|
14
|
+
@has_manies = model_instance.send(params[:has_many]) if model_has_many
|
15
|
+
end
|
16
|
+
|
17
|
+
def list
|
18
|
+
@rows = model_class.all
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def model_has_many
|
24
|
+
model_class.reflect_on_association(params[:has_many])
|
25
|
+
end
|
26
|
+
|
27
|
+
def model_class
|
28
|
+
params[:model_path].classify.constantize
|
29
|
+
end
|
30
|
+
helper_method :model_class
|
31
|
+
|
32
|
+
def model_instance
|
33
|
+
@model_instance ||= model_class.find(params[:id])
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_many_relations(model_class)
|
37
|
+
model_class.reflections.select do |_, relation|
|
38
|
+
relation.is_a? ActiveRecord::Reflection::HasManyReflection or
|
39
|
+
relation.is_a? ActiveRecord::Reflection::ThroughReflection
|
40
|
+
end
|
41
|
+
end
|
42
|
+
helper_method :has_many_relations
|
43
|
+
|
44
|
+
def belongs_to_relations(model_class)
|
45
|
+
model_class.reflections.select do |_, relation|
|
46
|
+
relation.is_a? ActiveRecord::Reflection::BelongsToReflection or
|
47
|
+
relation.is_a? ActiveRecord::Reflection::HasOneReflection
|
48
|
+
end
|
49
|
+
end
|
50
|
+
helper_method :belongs_to_relations
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ModelMirror
|
2
|
+
module MirrorHelper
|
3
|
+
def link_to_mirror(label, model)
|
4
|
+
if Class === model
|
5
|
+
link_to label, mirror_list_url(model_path: model.to_s.underscore)
|
6
|
+
else
|
7
|
+
link_to label, mirror_show_url(model_path: model.class.to_s.underscore, id: model.id)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def link_to_mirror_belongs_to(label, id:, foreign_class:)
|
12
|
+
link_to label, mirror_show_url(model_path: foreign_class.to_s.underscore, id: id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def link_to_mirror_has_many(label, model:, has_many:)
|
16
|
+
link_to label, mirror_has_many_url(model_path: model.class.to_s.underscore, id: model.id, has_many: has_many)
|
17
|
+
end
|
18
|
+
|
19
|
+
def th_attributes(attribs)
|
20
|
+
attribs.map do |key, _value|
|
21
|
+
content_tag(:th) do
|
22
|
+
html_escape key.try!(:titleize)
|
23
|
+
end
|
24
|
+
end.join.html_safe
|
25
|
+
end
|
26
|
+
|
27
|
+
def td_model(row)
|
28
|
+
row_class = row.class
|
29
|
+
row.as_json.map do |key, value|
|
30
|
+
content_tag(:td) do
|
31
|
+
if model_class.primary_key == key
|
32
|
+
link_to_mirror(value, row)
|
33
|
+
elsif td_belongs_to?(row_class, key) and value
|
34
|
+
relation = belongs_to_idx[[row_class, key]]
|
35
|
+
link_to value, mirror_show_url(model_path: relation.klass.to_s.underscore, id: value)
|
36
|
+
else
|
37
|
+
html_escape value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end.join.html_safe
|
41
|
+
end
|
42
|
+
|
43
|
+
def td_belongs_to?(model_class, key)
|
44
|
+
@__td_belongs_to_idx ||= {}
|
45
|
+
:nope != (@__td_belongs_to_idx[[model_class, key]] ||= (model_class.reflections.detect { |k,r| r.foreign_key == key }.try(:last) || :nope))
|
46
|
+
end
|
47
|
+
|
48
|
+
def belongs_to_idx
|
49
|
+
@__td_belongs_to_idx ||= {}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Model Mirror</title>
|
5
|
+
<%= stylesheet_link_tag 'model_mirror/application', media: 'all' %>
|
6
|
+
<%= javascript_include_tag 'model_mirror/application' %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body class="container-fluid">
|
10
|
+
<%= yield %>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
= render 'table', rows: @rows
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.row
|
2
|
+
.col-sm-3
|
3
|
+
.panel.panel-primary
|
4
|
+
.panel-heading
|
5
|
+
= model_class.to_s.titleize
|
6
|
+
[#{model_class.primary_key}: #{@row.send(model_class.primary_key)}]
|
7
|
+
.panel-body
|
8
|
+
%label Belongs To
|
9
|
+
%ul.nav.nav-pills.nav-stacked
|
10
|
+
- belongs_to_relations(model_class).each do |k, relation|
|
11
|
+
%li
|
12
|
+
- if foreign_id = @row[relation.foreign_key]
|
13
|
+
= link_to_mirror_belongs_to("#{k} [#{foreign_id}]", id: foreign_id, foreign_class: relation.klass)
|
14
|
+
%label Has Many
|
15
|
+
%ul.nav.nav-pills.nav-stacked
|
16
|
+
- has_many_relations(model_class).each do |k, relation|
|
17
|
+
%li(class="#{params[:has_many] == k && 'active'}")= link_to_mirror_has_many("#{k} (#{@row.send(k).try(:count)})", model: @row, has_many: k)
|
18
|
+
= render 'props', row: @row
|
19
|
+
.col-sm-9
|
20
|
+
- if @has_manies
|
21
|
+
.panel.panel-default
|
22
|
+
.panel-heading
|
23
|
+
= params[:has_many].titleize
|
24
|
+
= render 'table', rows: @has_manies
|
data/config/routes.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
ModelMirror::Engine.routes.draw do
|
2
|
+
|
3
|
+
root 'mirror#index'
|
4
|
+
|
5
|
+
get '*model_path/:id/:has_many', to: 'mirror#show', constraints: { id: /(\d+)|([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/ }, as: 'mirror_has_many'
|
6
|
+
get '*model_path/:id', to: 'mirror#show', constraints: { id: /(\d+)|([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/ }, as: 'mirror_show'
|
7
|
+
get '*model_path', to: 'mirror#list', as: 'mirror_list'
|
8
|
+
end
|
data/lib/model_mirror.rb
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>.
|
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,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>
|
data/test/dummy/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
# path to your application root.
|
5
|
+
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
|
6
|
+
|
7
|
+
Dir.chdir APP_ROOT do
|
8
|
+
# This script is a starting point to setup your application.
|
9
|
+
# Add necessary setup steps to this file:
|
10
|
+
|
11
|
+
puts "== Installing dependencies =="
|
12
|
+
system "gem install bundler --conservative"
|
13
|
+
system "bundle check || bundle install"
|
14
|
+
|
15
|
+
# puts "\n== Copying sample files =="
|
16
|
+
# unless File.exist?("config/database.yml")
|
17
|
+
# system "cp config/database.yml.sample config/database.yml"
|
18
|
+
# end
|
19
|
+
|
20
|
+
puts "\n== Preparing database =="
|
21
|
+
system "bin/rake db:setup"
|
22
|
+
|
23
|
+
puts "\n== Removing old logs and tempfiles =="
|
24
|
+
system "rm -f log/*"
|
25
|
+
system "rm -rf tmp/cache"
|
26
|
+
|
27
|
+
puts "\n== Restarting application server =="
|
28
|
+
system "touch tmp/restart.txt"
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
Bundler.require(*Rails.groups)
|
6
|
+
require "model_mirror"
|
7
|
+
|
8
|
+
module Dummy
|
9
|
+
class Application < Rails::Application
|
10
|
+
# Settings in config/environments/* take precedence over those specified here.
|
11
|
+
# Application configuration should go into files in config/initializers
|
12
|
+
# -- all .rb files in that directory are automatically loaded.
|
13
|
+
|
14
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
15
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
16
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
17
|
+
|
18
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
19
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
20
|
+
# config.i18n.default_locale = :de
|
21
|
+
|
22
|
+
# Do not swallow errors in after_commit/after_rollback callbacks.
|
23
|
+
config.active_record.raise_in_transactional_callbacks = true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# PostgreSQL. Versions 8.2 and up are supported.
|
2
|
+
#
|
3
|
+
# Install the pg driver:
|
4
|
+
# gem install pg
|
5
|
+
# On OS X with Homebrew:
|
6
|
+
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
|
7
|
+
# On OS X with MacPorts:
|
8
|
+
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
|
9
|
+
# On Windows:
|
10
|
+
# gem install pg
|
11
|
+
# Choose the win32 build.
|
12
|
+
# Install PostgreSQL and put its /bin directory on your path.
|
13
|
+
#
|
14
|
+
# Configure Using Gemfile
|
15
|
+
# gem 'pg'
|
16
|
+
#
|
17
|
+
default: &default
|
18
|
+
adapter: postgresql
|
19
|
+
encoding: unicode
|
20
|
+
# For details on connection pooling, see rails configuration guide
|
21
|
+
# http://guides.rubyonrails.org/configuring.html#database-pooling
|
22
|
+
pool: 5
|
23
|
+
|
24
|
+
development:
|
25
|
+
<<: *default
|
26
|
+
database: model_mirror_dev
|
27
|
+
|
28
|
+
# The specified database role being used to connect to postgres.
|
29
|
+
# To create additional roles in postgres see `$ createuser --help`.
|
30
|
+
# When left blank, postgres will use the default role. This is
|
31
|
+
# the same name as the operating system user that initialized the database.
|
32
|
+
#username: dummy
|
33
|
+
|
34
|
+
# The password associated with the postgres role (username).
|
35
|
+
#password:
|
36
|
+
|
37
|
+
# Connect on a TCP socket. Omitted by default since the client uses a
|
38
|
+
# domain socket that doesn't need configuration. Windows does not have
|
39
|
+
# domain sockets, so uncomment these lines.
|
40
|
+
#host: localhost
|
41
|
+
|
42
|
+
# The TCP port the server listens on. Defaults to 5432.
|
43
|
+
# If your server runs on a different port number, change accordingly.
|
44
|
+
#port: 5432
|
45
|
+
|
46
|
+
# Schema search path. The server defaults to $user,public
|
47
|
+
#schema_search_path: myapp,sharedapp,public
|
48
|
+
|
49
|
+
# Minimum log levels, in increasing order:
|
50
|
+
# debug5, debug4, debug3, debug2, debug1,
|
51
|
+
# log, notice, warning, error, fatal, and panic
|
52
|
+
# Defaults to warning.
|
53
|
+
#min_messages: notice
|
54
|
+
|
55
|
+
# Warning: The database defined as "test" will be erased and
|
56
|
+
# re-generated from your development database when you run "rake".
|
57
|
+
# Do not set this db to the same as development or production.
|
58
|
+
test:
|
59
|
+
<<: *default
|
60
|
+
database: model_mirror_test
|
61
|
+
|
62
|
+
# As with config/secrets.yml, you never want to store sensitive information,
|
63
|
+
# like your database password, in your source code. If your source code is
|
64
|
+
# ever seen by anyone, they now have access to your database.
|
65
|
+
#
|
66
|
+
# Instead, provide the password as a unix environment variable when you boot
|
67
|
+
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
|
68
|
+
# for a full rundown on how to provide these environment variables in a
|
69
|
+
# production deployment.
|
70
|
+
#
|
71
|
+
# On Heroku and other platform providers, you may have a full connection URL
|
72
|
+
# available as an environment variable. For example:
|
73
|
+
#
|
74
|
+
# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
|
75
|
+
#
|
76
|
+
# You can use this database configuration with:
|
77
|
+
#
|
78
|
+
# production:
|
79
|
+
# url: <%= ENV['DATABASE_URL'] %>
|
80
|
+
#
|
81
|
+
production:
|
82
|
+
<<: *default
|
83
|
+
database: dummy_production
|
84
|
+
username: dummy
|
85
|
+
password: <%= ENV['DUMMY_DATABASE_PASSWORD'] %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Rails.application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
+
|
4
|
+
# In the development environment your application's code is reloaded on
|
5
|
+
# every request. This slows down response time but is perfect for development
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
7
|
+
config.cache_classes = false
|
8
|
+
|
9
|
+
# Do not eager load code on boot.
|
10
|
+
config.eager_load = false
|
11
|
+
|
12
|
+
# Show full error reports and disable caching.
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
config.action_controller.perform_caching = false
|
15
|
+
|
16
|
+
# Don't care if the mailer can't send.
|
17
|
+
config.action_mailer.raise_delivery_errors = false
|
18
|
+
|
19
|
+
# Print deprecation notices to the Rails logger.
|
20
|
+
config.active_support.deprecation = :log
|
21
|
+
|
22
|
+
# Raise an error on page load if there are pending migrations.
|
23
|
+
config.active_record.migration_error = :page_load
|
24
|
+
|
25
|
+
# Debug mode disables concatenation and preprocessing of assets.
|
26
|
+
# This option may cause significant delays in view rendering with a large
|
27
|
+
# number of complex assets.
|
28
|
+
config.assets.debug = true
|
29
|
+
|
30
|
+
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
|
31
|
+
# yet still be able to expire them through the digest params.
|
32
|
+
config.assets.digest = true
|
33
|
+
|
34
|
+
# Adds additional error checking when serving assets at runtime.
|
35
|
+
# Checks for improperly declared sprockets dependencies.
|
36
|
+
# Raises helpful error messages.
|
37
|
+
config.assets.raise_runtime_errors = true
|
38
|
+
|
39
|
+
# Raises error for missing translations
|
40
|
+
# config.action_view.raise_on_missing_translations = true
|
41
|
+
end
|