model_mirror 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (253) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/javascripts/model_mirror/application.js +2 -0
  5. data/app/assets/stylesheets/model_mirror/application.scss +3 -0
  6. data/app/controllers/model_mirror/application_controller.rb +5 -0
  7. data/app/controllers/model_mirror/mirror_controller.rb +52 -0
  8. data/app/helpers/model_mirror/application_helper.rb +4 -0
  9. data/app/helpers/model_mirror/mirror_helper.rb +52 -0
  10. data/app/views/layouts/model_mirror/mirror.html.erb +12 -0
  11. data/app/views/model_mirror/mirror/_props.haml +7 -0
  12. data/app/views/model_mirror/mirror/_table.haml +10 -0
  13. data/app/views/model_mirror/mirror/index.erb +6 -0
  14. data/app/views/model_mirror/mirror/list.haml +1 -0
  15. data/app/views/model_mirror/mirror/show.haml +24 -0
  16. data/config/routes.rb +8 -0
  17. data/lib/model_mirror/engine.rb +5 -0
  18. data/lib/model_mirror/version.rb +3 -0
  19. data/lib/model_mirror.rb +7 -0
  20. data/lib/tasks/model_mirror_tasks.rake +4 -0
  21. data/test/dummy/README.rdoc +28 -0
  22. data/test/dummy/Rakefile +6 -0
  23. data/test/dummy/app/assets/javascripts/application.js +13 -0
  24. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  25. data/test/dummy/app/controllers/application_controller.rb +5 -0
  26. data/test/dummy/app/helpers/application_helper.rb +2 -0
  27. data/test/dummy/app/models/country.rb +3 -0
  28. data/test/dummy/app/models/door.rb +4 -0
  29. data/test/dummy/app/models/handle.rb +3 -0
  30. data/test/dummy/app/models/home.rb +7 -0
  31. data/test/dummy/app/models/home_door.rb +4 -0
  32. data/test/dummy/app/models/item.rb +2 -0
  33. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  34. data/test/dummy/bin/bundle +3 -0
  35. data/test/dummy/bin/rails +4 -0
  36. data/test/dummy/bin/rake +4 -0
  37. data/test/dummy/bin/setup +29 -0
  38. data/test/dummy/config/application.rb +26 -0
  39. data/test/dummy/config/boot.rb +5 -0
  40. data/test/dummy/config/database.yml +85 -0
  41. data/test/dummy/config/environment.rb +5 -0
  42. data/test/dummy/config/environments/development.rb +41 -0
  43. data/test/dummy/config/environments/production.rb +79 -0
  44. data/test/dummy/config/environments/test.rb +42 -0
  45. data/test/dummy/config/initializers/assets.rb +11 -0
  46. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  47. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  48. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  49. data/test/dummy/config/initializers/inflections.rb +16 -0
  50. data/test/dummy/config/initializers/mime_types.rb +4 -0
  51. data/test/dummy/config/initializers/session_store.rb +3 -0
  52. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  53. data/test/dummy/config/locales/en.yml +23 -0
  54. data/test/dummy/config/routes.rb +4 -0
  55. data/test/dummy/config/secrets.yml +22 -0
  56. data/test/dummy/config.ru +4 -0
  57. data/test/dummy/db/migrate/20161218221449_basic_models.rb +43 -0
  58. data/test/dummy/db/schema.rb +73 -0
  59. data/test/dummy/db/seeds.rb +23 -0
  60. data/test/dummy/log/development.log +19009 -0
  61. data/test/dummy/public/404.html +67 -0
  62. data/test/dummy/public/422.html +67 -0
  63. data/test/dummy/public/500.html +66 -0
  64. data/test/dummy/public/favicon.ico +0 -0
  65. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-r/-rem8qHe3jWBIDJwImlTNDaUPlqVgXRY1b3LZv_pGmc.cache +1 -0
  66. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0m/0mL3fFoJT669EcXVwkCTbvIBmP1qJDpBph16eqF-WBY.cache +1 -0
  67. data/test/dummy/tmp/cache/assets/sprockets/v3.0/16/16MQvhfW1mNDBOxmqlxF3Sfx0ii_Xa1virkUz90G-lc.cache +0 -0
  68. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1A/1APF4ARzgWXKqqqkOVXRiCwJlPSbzqUbPzP0gi3C0Tg.cache +0 -0
  69. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1L/1Lk4v-juPuxQK9xk9U_6n4pHRlHq8qexvqbWS3RSOeg.cache +6 -0
  70. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1W/1WovAcidzRR3A7uthpMQ6U3XEbTTndhGm-nzu0bN8Po.cache +2 -0
  71. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2I/2IYf1GKTaky45xQ0ByEfLH8noAv1tjBfcb8hyIs2Zt8.cache +0 -0
  72. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2N/2Nz2ZUVHsU8q6T_j99YI2vXL6eyEC1litRpW3Gq5OVw.cache +6 -0
  73. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2O/2OdGXo_n41rWVcJcZGWsOVu5EplcuN2dEimZABx3p7k.cache +0 -0
  74. data/test/dummy/tmp/cache/assets/sprockets/v3.0/38/3874PulaWu39Mseqp1Fxv-uJtb7b1KMmjdcaj1Fb7aA.cache +1 -0
  75. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3S/3SV_oRzLQxjRO1XapyhR3j6XJc1VsNpv_lvKhO31IIA.cache +1 -0
  76. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3i/3iS-1u6s3JfKpDOeW2BK1I561Qnokd_FOWl-ww6eW_Y.cache +1 -0
  77. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3u/3uxJzrv2nJOYEfU0OOaanJWU6ci6vYMJBTvV8TcoPmk.cache +1 -0
  78. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4D/4DtBz4KsaA5jFqAh0AsCXqpY5wlp0YiS_IwSugibPMs.cache +1 -0
  79. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4T/4Ts5Q1mYLX8psSKhIIk4_8jM_McmHNWrACK1luIf7SA.cache +1 -0
  80. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
  81. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5g/5gUyWzsbVpWbrqrQFxdLUburTbOzHEf4T_4IQEoiGVM.cache +0 -0
  82. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6a/6ad00o-Ixp4aI5ze35HMEOGBV3gT_3pwkiIT4wdOJpI.cache +3 -0
  83. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6x/6xZo5tJHPMnj3wC0PIvqFn9EItXvN9F95gaQe4e0qkw.cache +0 -0
  84. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8C/8CIzlcUFdKjq9Vma4WcpcXtgYm0xt379KvQ4_maWSIs.cache +1 -0
  85. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8H/8HxrIjgSAP8WT1kSsiAXCCvFYB4TdYZ75oDB-cZayk8.cache +1 -0
  86. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8W/8WBq4HN_OthrS7ZTSZsZNQ94zvAqaAczZroqveYj6XQ.cache +3 -0
  87. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9F/9FEZO7HTjZBreH7lBbPyL73gCc6TwCPI2RQsEhjtgQE.cache +0 -0
  88. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9V/9V0Z4iMZR-VNdc986Dhpdyc9OqBr5NUDN5lFrqCLnt4.cache +1 -0
  89. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9k/9kyaJU51bg0Qgv1c4b9JTX5JhB5C7DAQ5m2o1GzFHKw.cache +3 -0
  90. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AH/AHq4wg2mLyp59oc4qtMwo9o3SyAtkfU1_GnvKlLexq8.cache +0 -0
  91. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ae/AewZtwn1j9CahS7AFKOjUA7Ye6SX50LKrwAxLHm2CQI.cache +1 -0
  92. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ax/Ax5Rj5uyaYrv3CFW272Loc3y7k6AWypFcL6SDXzYH0Q.cache +1 -0
  93. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BC/BCu7gFiI3gHSa787aoHVOhy_U5U9ydh5kdSWh4W2wPY.cache +2 -0
  94. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BL/BLsV-gT0XlaVYtmjk7RXapmjYyvzzUuo0UOZHSzSYFU.cache +2 -0
  95. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BR/BRqQahPtqPlcv5RMLiugqYt6K7tjm5pSog6xA9TXqRA.cache +0 -0
  96. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ch/ChO89-OOg5UTSKh-CBanZP96PhJXpz88MohbeAv6GNo.cache +0 -0
  97. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DI/DIov1zQlsZCK2UT0HnSTrXxu8qiRzaIvMffw_0rq0ko.cache +1 -0
  98. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DI/dIPiS37RjSFdpuFK-ORRJK19cM7xUtWCOaxSsoZ2mYc.cache +2 -0
  99. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DS/DSOLSc6A5RVSmvM415eEWAWG_AgOvZcLZOXQjsXyWQA.cache +0 -0
  100. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Dd/DdNW40NelwbRI0y9a_42Quvttz6gfsGuuwlejQcxNFg.cache +0 -0
  101. data/test/dummy/tmp/cache/assets/sprockets/v3.0/De/DeoiM-L8ucQIWYgQo7o_HmEZUsO7dq6YU2-5sa3Cea8.cache +0 -0
  102. data/test/dummy/tmp/cache/assets/sprockets/v3.0/E2/E23X78R7m5KzWeeVWl_1tOHtIaBP3G8DXpN4asy86cg.cache +0 -0
  103. data/test/dummy/tmp/cache/assets/sprockets/v3.0/EY/EY9nkjkp3p2nx0uVkc4irb6oSolhG4hF_y130SF8Ww0.cache +0 -0
  104. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FN/FNsspR8OrrB5lPCCCAnXL_lSncu_n_KmzlXqn28O79w.cache +1 -0
  105. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FN/fNQ4TJ7sCyQHy_QaR6HwFenVYwjOZfGOREw6POD1-qk.cache +0 -0
  106. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GA/GAo09OnO5TivvBZ3jlzVYDytfrLeCjAHr28wRxoNG-8.cache +1 -0
  107. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gv/GvoRsDzc9iaQVpdlV8TA4XE8O_1ekuacOcApWNLMZXg.cache +1 -0
  108. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gw/Gw6aZcbDgzBVnXec-ZN6nxIZTgJ2Hrr-GW2J5SDkk-c.cache +0 -0
  109. data/test/dummy/tmp/cache/assets/sprockets/v3.0/H-/H-lyHNhtGFcHRVH7zKxHVlK-aIAWjFjwmdnA7SD79T4.cache +0 -0
  110. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hu/HugBc22HDsq0j4IyO4z15od2v-z5aoA1VD3gXGYKKCg.cache +1 -0
  111. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hy/HycOvWGHZuPkRbpE1dGf2xKVmZvjP8kmosnLNjWGSz4.cache +2 -0
  112. data/test/dummy/tmp/cache/assets/sprockets/v3.0/I0/I0IF5lo6NwDdD1CGog_RX-fRaPSmw0kK_KqVxkDcNNQ.cache +0 -0
  113. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ju/Ju7LATlffI5L5z4EgfGwK4c64-s2_p9az-CoGSsBlEE.cache +0 -0
  114. data/test/dummy/tmp/cache/assets/sprockets/v3.0/K1/K1c7_25cSyNRDsT-ecYkoKc1bBLDTrpJ4hvQWeOwUL4.cache +1 -0
  115. data/test/dummy/tmp/cache/assets/sprockets/v3.0/K9/K9Au6uxp_IqSeFmx6s0mpmEjAHr7gpiXUKlVWFPlaEk.cache +0 -0
  116. data/test/dummy/tmp/cache/assets/sprockets/v3.0/KN/KNV9hOjChbe4o2PkFRaQ5TIu-SXf08Gji0m60MjbHtU.cache +1 -0
  117. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Kb/KbLJKLHgcEboX1GIXMmF2ldg6Nc3fxEGf5jZhPP8fJo.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LX/LXFIbS1BGt7ebR44Vs15txHnY95-m5JfMujyHGB7POs.cache +0 -0
  119. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ML/MLSe_SfeAZnLwIofKthBtgjGKVZABKUW-dTu5bWIXKM.cache +0 -0
  120. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MP/MP7Gs3BFmH91TR-vCxql9QxViyhDTEY6hxahDxoENJ8.cache +1 -0
  121. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mc/MciqAabEG700pEmQjBDhWMJ9_1BRxDpzJAUlgNryRRc.cache +1 -0
  122. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nv/NvI3SLSDRi-OTu3rwFLzZ3GLjxtan6HtL6pbuZzVhj8.cache +0 -0
  123. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OC/OCX42icPsjladPMTamow6RtDqrpHDAuFLG06rJ7ZTic.cache +1 -0
  124. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
  125. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OM/OMTmPKPiQlvGV0ss5rJYpvOyQDW9QlC-EBKF3HB4e-M.cache +0 -0
  126. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OV/OVW_Ji-SsW1rXODIu0I54twfynvimhyV4nlZVpj7ueo.cache +1 -0
  127. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Oe/OeQLwkU4mNAs3-DmjAqEncbBlSNtXgAJfvfZ0vL7lRg.cache +2 -0
  128. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Or/OrieLQHuNg4SLolboVeqUj5kz-9oF4JF_orZ-uWIaYI.cache +3 -0
  129. data/test/dummy/tmp/cache/assets/sprockets/v3.0/PO/PO63eyxgQ4fClMV9sJGrWLZqWskaf6yzapqAQ7QJlnQ.cache +2 -0
  130. data/test/dummy/tmp/cache/assets/sprockets/v3.0/PR/PRRUqqzL6cA_WO6VkODC_-raUYAvhisfGMV3SIVCTWQ.cache +2 -0
  131. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qe/Qes0c5ynKXI99EHZREbrThMFf-p36yDAoMquTztWmF0.cache +0 -0
  132. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qe/qehI_eDoauNonw6bRK3nsI6C_D2GhQrplYgRFYEoziE.cache +1 -0
  133. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUVfWnmlS0olUIWRUywhd5iyq47yXX9f3VsX__U_13s.cache +1 -0
  134. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RZ/RZ6dwciysjVQOCLCm8jiv4QTC_aHEDfZvu2p3kioKz0.cache +1 -0
  135. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rs/RsAzat6SebjN9BDx0sTrNRQ9uVCLHRMDY-07fnwS4Zk.cache +0 -0
  136. data/test/dummy/tmp/cache/assets/sprockets/v3.0/S4/S4s7G9DU07vjeV_enapODUGt-NEGYrUHQNYysCmJrK8.cache +1 -0
  137. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SC/SCiZ9mqjOi8eQ2rTbP_Bv0kz2AFbxlBKjHRA0CuAd7Q.cache +1 -0
  138. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SN/SN3K5xTG86Qdr0pUbxNtr72Irl-bFgOUdFcb8WUdyqc.cache +2 -0
  139. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SP/SPNw9MO-hiuEJhbX0lED1yEN__99WGMICy8wvBHLm1k.cache +1 -0
  140. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SY/SYKVfYFH7rFgERKvKrWa5_f13o8asRu5DQccufIp5Ts.cache +1 -0
  141. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sf/SfkpHW42gYYM5tJozoLxeD-1Qr3fp5IkeKdLL_TKyo8.cache +0 -0
  142. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Si/SiSLeHAL4fmsA1R7ORNY7y5whoq_u0jcY8HX2xzURQs.cache +1 -0
  143. data/test/dummy/tmp/cache/assets/sprockets/v3.0/TF/TFy1Bdx5ZOtN2cQeCumrG8mCWKolCytAfgJ13BjA-_o.cache +4 -0
  144. data/test/dummy/tmp/cache/assets/sprockets/v3.0/TL/TLDBnV47WInqlVvJxqkPIILsWY9wZqi1vsD0jS0QAsM.cache +0 -0
  145. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Tn/TnRjC6wWRvOrLuyhqg1bM7SuoOccIg_1SorcIHc8OxY.cache +2 -0
  146. data/test/dummy/tmp/cache/assets/sprockets/v3.0/V4/V4CbaN8Ci-nerLQZQynj1mIL4Z9bUiLxKYYGR5Kwhec.cache +1 -0
  147. data/test/dummy/tmp/cache/assets/sprockets/v3.0/V7/V7J14JqRezLq9ChuUJ5sAOfkzNq2m6SuI8cmsMBcQaE.cache +1 -0
  148. data/test/dummy/tmp/cache/assets/sprockets/v3.0/VN/VNMzZtLNaJVdP8HpGZmXYlKb9vW7ejeTF6T1jNJ7Vsc.cache +1 -0
  149. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vb/VbJkn3R1H3lpTNi4N9kDEvFzomJiXCLqh_-n7hSa9c0.cache +0 -0
  150. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vv/VvUT8M86e67Kp8g81Xlzpc4ZJi4mgVHtLWD2HBERK2c.cache +1 -0
  151. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WH/WHNNwabnV-mgmOYezrtxyMwRuFuQ2hUNT5GgXC-w9xY.cache +1 -0
  152. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WK/WKvs9W2KkUolDfOy3IPssLedy-K5FZykXPtgA-C4bnc.cache +2 -0
  153. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WK/wKUhKhiDh02kZo8zerjh8NH_ZYubrHtdRVJbhqg_tvI.cache +1 -0
  154. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WN/WNv1-RZyUpayBpXsP0MqWaxcAVf1gbvGhuHchz7PGMY.cache +1 -0
  155. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wc/Wc3fjTk0jGWqkMwv1zYL18Xnpn8gBTsuuqGoRDIaC0k.cache +1 -0
  156. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiQ3LIULAO7qRcTnjMlc-RbsM_oV1qSiUI_eicGT-bg.cache +0 -0
  157. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiSZD4em5xy5xUdIRCedsGuG2lTVNkhYMp_AhPqsL18.cache +1 -0
  158. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiW41DMWIO1P03AeVtMi3UEhuLrNuI6veiKegZu013s.cache +0 -0
  159. data/test/dummy/tmp/cache/assets/sprockets/v3.0/X9/X9fWZvfb_VaRERvF2AP90Hme2E3d2q7dZZWy4e9BqnU.cache +1 -0
  160. data/test/dummy/tmp/cache/assets/sprockets/v3.0/XC/XC87FGa9xdzH95RNNVJ6MsZluYOSlRl4blYRHNYLc7M.cache +0 -0
  161. data/test/dummy/tmp/cache/assets/sprockets/v3.0/XF/XFaAQLvxLU0oK7HCcyoaF4muDjKj5YqJpRIjibofWjU.cache +0 -0
  162. data/test/dummy/tmp/cache/assets/sprockets/v3.0/YZ/YZhOW7jUHwEA-1sFv7UBYSHkBdSNTh5Z5VM52rw9Y3E.cache +0 -0
  163. data/test/dummy/tmp/cache/assets/sprockets/v3.0/YZ/yzHysMJyDxbZT85gGC2gebuoEvJSk-KhkrjUWvHS57M.cache +1 -0
  164. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yv/Yv1FVr0yJVhoPDWRzJGUPy39sogAoRCRo_AW2MRa690.cache +0 -0
  165. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yv/YvZ1P1s_8dawf0jKOygoEw8ZqIwqAn0gE93xJsZfV2w.cache +2 -0
  166. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZQ/ZQbdHv6ta3tOOZJZ09KoQ1Kf4cJw0C4X7wUXK2lJTs0.cache +1 -0
  167. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zw/ZwhvjlnTrmIcB6AKaWY-VhK13O3Y9qTp2eR8fP5liis.cache +0 -0
  168. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zw/zWzGYnXIUMzLH2Xa31Ut1jvHReOQLxvrqlUoVX-yT8c.cache +2 -0
  169. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zz/ZzUKWSpRlucuYWQNFcmhsdCSjFKPF-yztc9OTph2YHY.cache +1 -0
  170. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zz/zzFBBwE2kLvJmX_aVjXJZ6bPIOw9lWluLSYCVCTqt-8.cache +0 -0
  171. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_C/_CXBGviqSGu54ckaAzMR_bh33qyXlkKAidx4Xu3wRTk.cache +1 -0
  172. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_g/_g9MVRm572JADv2ayUb_hMTKm9S9quYBjMfV0Ayc2ME.cache +1 -0
  173. data/test/dummy/tmp/cache/assets/sprockets/v3.0/aC/aCuK0Zzg5f8d9jFYwjmHkzmzTH6Ovwa-lddiPn9U7vQ.cache +1 -0
  174. data/test/dummy/tmp/cache/assets/sprockets/v3.0/az/AZJP2GIYTRZW0vsIjU31B8rE5okutM4VHpwWcCwLeFw.cache +1 -0
  175. data/test/dummy/tmp/cache/assets/sprockets/v3.0/az/azKX-4hc5mH3qAKgzCdpmD2R4dYiHngj5l8LAD_vYeY.cache +0 -0
  176. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bI/bIEbt9WOa8LXiUDYl61YWNtFiCfrFSFhMC8fBEA2uok.cache +3 -0
  177. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bS/bSoYLLIJUh5ggToGbm_TQMHep29Y-EsWwakXewgWJrg.cache +0 -0
  178. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bb/bbKjfNv6GVI5mifkJSeYhuEUxRHZ0wsZufSXzxPI4QY.cache +1 -0
  179. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cN/cNtvm5yIqK0_IRJ1258QI8rfPM4nE1IaVuKvjuMXnKE.cache +0 -0
  180. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cs/csYOWzfuzOEFDwnIUEX6sNgEOfdQJT7pYXuOZEWCaE4.cache +1 -0
  181. data/test/dummy/tmp/cache/assets/sprockets/v3.0/d9/d9CtVAhy-lNvmRJWpQ-eHz73FJ95h1rayp2f38-vWqs.cache +1 -0
  182. data/test/dummy/tmp/cache/assets/sprockets/v3.0/d9/d9GB1wRRQDwZAFGSt_kIB93v4wiDQrihqoNi30t2TGQ.cache +2 -0
  183. data/test/dummy/tmp/cache/assets/sprockets/v3.0/do/DoColFzCbCCFcwvrMgK6Q-P_myLaD5JgmZ1yU5WkxaI.cache +1 -0
  184. data/test/dummy/tmp/cache/assets/sprockets/v3.0/do/doDEfNq3bD-SKigsV3oRymCXJBPmb81eoQHgIGsULU8.cache +1 -0
  185. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eR/eRKrgU3kJIQFr6sjMChNUmRpKAImztqX2aCVKtJ8Gxk.cache +1 -0
  186. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eX/eX8A081oDi9cYrzrKaxGvb0i5roG_fwelmXbORskSJc.cache +1 -0
  187. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eZ/eZEA29hAQovhscPAb-L3OXJ2dcMkV29cfpoMAHMvauI.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/sprockets/v3.0/f-/f-vAaT_FE7fJauNbbxrHAgfOj06LNjt0DylZ4pnTFec.cache +0 -0
  189. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fb/fbSd-J7VKYIIL9NYPoivBuxx0-ZggyulTXFRfWCq3Ec.cache +0 -0
  190. data/test/dummy/tmp/cache/assets/sprockets/v3.0/g3/g3FC21hFceMtmIhpOiB30_UzvZ0QjIZt-6bAq1QmDFQ.cache +1 -0
  191. data/test/dummy/tmp/cache/assets/sprockets/v3.0/g4/g402J4FE3X-LOGHiSdRS1nQcqoBGyYl_-AEaYtdnj8E.cache +1 -0
  192. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gG/gGhEOVGoTBEmCGeqY8nfY-MxuZJaiRtQVlyoIndvTFM.cache +0 -0
  193. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gU/gUBYi_4ly8zIsQFSKQHndMBIujEYkR7qw5C3VuNoNAk.cache +2 -0
  194. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gX/GXKHBmnFVPNBOTbp7VziYPIat7b46BO2T-77pG9-phs.cache +1 -0
  195. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gX/gXwSSkIjfu2Z8TPjFFQ99LILn3KhweKQ61jYXnaDy0s.cache +1 -0
  196. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +0 -0
  197. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gd/gdVNAZUtzc3pooYxEI1TTGUv27zBIk6HeAiLM1NWv1o.cache +2 -0
  198. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gt/GtnozyXSu584zX7yAvKxFz0JjHNsCgx2ptUwFTHmwF4.cache +0 -0
  199. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gt/gtu2MccPBzckO0Me0uCHy9JGovh9nYdxwCe1fDhGang.cache +1 -0
  200. data/test/dummy/tmp/cache/assets/sprockets/v3.0/h5/h57yw3BreMKakuj44_JE3DoZR-B03-7zqzPFKzsBF-k.cache +1 -0
  201. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hA/hAfBB4kflHOL9adDG71Ds0A-E6dpkZUjz8c0yFd_OlI.cache +1 -0
  202. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hV/hVJ02ebxsq4L-6DYv-XXRZmYRE07lX878LD4r47xFEs.cache +1 -0
  203. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
  204. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hs/hsxW3Wtn2QVcOMlzcFrOu_89_60O0e4-8THFqVIO600.cache +0 -0
  205. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iV/iVSut5zj2YYcuoPo93I33us2zyM2diw9VDUe8wCbua8.cache +2 -0
  206. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iu/iufJbNZZut64O4K18v7f_JpXhJbdAz6WMhzRZobpXj0.cache +2 -0
  207. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ix/ix6XGKs1YsrRk7LjmUXB2HvU9NM-j90TPYB6IRcmGac.cache +1 -0
  208. data/test/dummy/tmp/cache/assets/sprockets/v3.0/j4/j4oFZSEV5HuuWzG0Tutu3zGmSPgE-ugaID6oQNNGnoA.cache +2 -0
  209. data/test/dummy/tmp/cache/assets/sprockets/v3.0/k-/k-qA5xfTlEoasPgMX7YxKUdwm8V1t-61InR7up2VUiE.cache +1 -0
  210. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lA/lAzOkFL-dUWexPX4R93n73TjKqVi9C7lk7-GBSRgI5I.cache +1 -0
  211. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lV/lVabXFsusC5bUGGQ04PSEu_cHr6qub-HDdozchhyvEE.cache +0 -0
  212. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mE/mEONH4tgEzMiGZveEmvUoyaaH-9O2NZ5tZAOQQS3jsI.cache +1 -0
  213. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mI/mIPZMFCt7qfxnJASuD3Vrp8o1-eNUTAbbzMFatqTf8U.cache +0 -0
  214. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mN/mNkTCViM10CyvBP_tw7ZzhPI08cYfE41PKEmJc7q4ns.cache +0 -0
  215. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mS/mScg72OJ0BopLfmEVIYCkCvkgMWV90L-iIBuLGRVWxc.cache +2 -0
  216. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mV/mVv0oErwXrQlvHa8JGVY-fxxK7gs-uh6xVbu5IAT_JU.cache +1 -0
  217. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mz/mzDTfFUL3rStqZPS-XwHENUXeBgV8kiRS-fVbjvesTM.cache +0 -0
  218. data/test/dummy/tmp/cache/assets/sprockets/v3.0/n2/n2NyZdTdu080QGvmZDR1B4AbiBSBTCUp8NOTcHGexiE.cache +4 -0
  219. data/test/dummy/tmp/cache/assets/sprockets/v3.0/n9/N9kjmH8hTTQwbE-LOXPwo7-h0ezL8_daaZ4PCMiQwoo.cache +1 -0
  220. data/test/dummy/tmp/cache/assets/sprockets/v3.0/n9/n9horN-h4sLmnUHNE8ieeUDbxdDdvhHUJhim7dHYV9A.cache +1 -0
  221. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nh/nhuJqmtEIaJNByqtFTY4YY3cwy8NoupqJ5Lpq1-Ngcg.cache +1 -0
  222. data/test/dummy/tmp/cache/assets/sprockets/v3.0/oj/ojhX0nsXTRWw-man0eiKeGZBWn-nU34ASbwvL5QROd0.cache +0 -0
  223. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
  224. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ps/psrFJIIqADl-7zBiYvzm65Q6mpObv255OKQjBPJgz2g.cache +2 -0
  225. data/test/dummy/tmp/cache/assets/sprockets/v3.0/rK/rKYkcyJ4GRYSA0luj4GNTYgV2_B1kMcCLU-kInDWn5Y.cache +2 -0
  226. data/test/dummy/tmp/cache/assets/sprockets/v3.0/rV/rV_SEyueEQxwKSoVpvVRsORMBgIyXzNU6IQS6wKFgyI.cache +2 -0
  227. data/test/dummy/tmp/cache/assets/sprockets/v3.0/s0/s00fgQTBwwC6VMAhcJsEc2aVad_5b047CUnC_A5LdfY.cache +1 -0
  228. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sr/sr8ddbDnN2v9l6LNMv7-85a-BpESmS54if-UruFcScc.cache +1 -0
  229. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sv/sveyr4o9md78WbNByfMCXcWbfRG4VqHH5FV35qbn3wk.cache +0 -0
  230. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tB/tByA3lfFf6zEl6UAKb2_Mq_z7A6Jw5Pgmr4SwJ_sgOY.cache +6 -0
  231. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tH/tH0kiPM7ZkR8UV5elFido53WVXs0E7r2vtDItmrJ7Kk.cache +1 -0
  232. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tz/tzAdtNhgJ6D2IKkZ0Fnl3W8nT5jZC48z8Q5kZeZkwF8.cache +0 -0
  233. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ur/urnYAlvXb11hMGOxMX-5TKbq0in39t9gdqOVIKJCbAY.cache +0 -0
  234. data/test/dummy/tmp/cache/assets/sprockets/v3.0/uw/uwtzQliG1pMyItXO0oX0be2m9ZTbFerHBjlOLCHl6UI.cache +1 -0
  235. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vC/vCwwIfx0M86-ktaxReqQ0Zn3xul5b3bUCXGHN_PiHkI.cache +1 -0
  236. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ve/veYoHDI2VWOtSr12EuE1oq2kCCLg-vbrwQr32ro0P44.cache +1 -0
  237. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vw/vw8XOgLfJ_9nSA5z2HOPfrLb7w6J5a0Y-Sd1JY03JNk.cache +1 -0
  238. data/test/dummy/tmp/cache/assets/sprockets/v3.0/w4/w480BxE-FvlXjgRJ6QKwxmQmEIEb_pTCc3brNpoG2uE.cache +2 -0
  239. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wd/wd3JQKkkcWrG6N1UpO-wXnm7bkCnRPEh73zr9rLH5UM.cache +2 -0
  240. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wx/Wx6UKhJ6NvaBigwGc_qtsjI-a0onzFWgUPe7xltcA1w.cache +4 -0
  241. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wx/wxLKf8cKRD_upDDnu0DeaiQTk-qk-IsfBOuvbWWJQAk.cache +1 -0
  242. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xS/xSh4oU-YDszJuCCtyfiMv1h1CpmrnrYDXQw-RiqmaFs.cache +3 -0
  243. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xY/xYmWaFAi0yVEZtAHWaabXAnqFzNqB3qzmNWiFAXz-KE.cache +2 -0
  244. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xY/xyeP9BCjwsZ0v0HdMtqR6bs77yvb_6ngjFQKwfcONUk.cache +1 -0
  245. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xg/xgSn71MJW4DGzOwWLVgstnbJolxuczROkHdOHrEO54w.cache +0 -0
  246. data/test/dummy/tmp/cache/assets/sprockets/v3.0/y3/y30SzU0UGC6HGDVXTjLFGPXvjAwe3At8yV67S27gT6A.cache +0 -0
  247. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yK/yKwopwb5WgjInBeIxw7s6OUHsuWdNLYIjhj21x-Iysc.cache +0 -0
  248. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yu/yuZl9eXEsgHWOSbw6W5BJuSrtkxclnLA04CPHhWMBdA.cache +2 -0
  249. data/test/dummy/tmp/cache/assets/sprockets/v3.0/z2/z2L2rlVoLKs7OUuC7X2XOdccU1Cx6IzGSEdC6KtY_MI.cache +0 -0
  250. data/test/integration/navigation_test.rb +8 -0
  251. data/test/model_mirror_test.rb +7 -0
  252. data/test/test_helper.rb +21 -0
  253. 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,2 @@
1
+ //= require bootstrap
2
+ //= require_tree .
@@ -0,0 +1,3 @@
1
+ //= require bootstrap
2
+ //= require_tree .
3
+ //= require_self
@@ -0,0 +1,5 @@
1
+ module ModelMirror
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -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,4 @@
1
+ module ModelMirror
2
+ module ApplicationHelper
3
+ end
4
+ 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,7 @@
1
+ %form
2
+ - row.as_json.each do |key, value|
3
+ .form-group
4
+ %label
5
+ = key
6
+ %input.form-control(value="#{value}" disabled)
7
+
@@ -0,0 +1,10 @@
1
+ .table-responsive
2
+ %table.table.table-striped.table-condensed
3
+ - rows.each_with_index do |row, i|
4
+ - attribs = row.attributes
5
+ - if i == 0
6
+ %tr
7
+ = th_attributes(attribs)
8
+ %tr
9
+ = td_model(row)
10
+
@@ -0,0 +1,6 @@
1
+ <h1>Models</h1>
2
+ <ul>
3
+ <% @models.each do |model| %>
4
+ <li><%= link_to_mirror(model.to_s, model) %></li>
5
+ <% end %>
6
+ </ul>
@@ -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
@@ -0,0 +1,5 @@
1
+ module ModelMirror
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ModelMirror
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module ModelMirror
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'haml'
2
+ require 'sprockets'
3
+ require 'json'
4
+ require 'model_mirror/engine'
5
+
6
+ module ModelMirror
7
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :model_mirror do
3
+ # # Task goes here
4
+ # 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>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
@@ -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,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,3 @@
1
+ class Country < ActiveRecord::Base
2
+ has_many :homes
3
+ end
@@ -0,0 +1,4 @@
1
+ class Door < ActiveRecord::Base
2
+ has_many :handles, as: :openable
3
+ has_many :items, through: :handles, source: :openable, source_type: 'Door'
4
+ end
@@ -0,0 +1,3 @@
1
+ class Handle < ActiveRecord::Base
2
+ belongs_to :openable, polymorphic: true
3
+ end
@@ -0,0 +1,7 @@
1
+ class Home < ActiveRecord::Base
2
+ belongs_to :country
3
+
4
+ has_many :home_doors
5
+ has_many :doors, through: :home_doors
6
+ has_many :handles, through: :doors
7
+ end
@@ -0,0 +1,4 @@
1
+ class HomeDoor < ActiveRecord::Base
2
+ belongs_to :home
3
+ belongs_to :door
4
+ end
@@ -0,0 +1,2 @@
1
+ class Item < ActiveRecord::Base
2
+ end
@@ -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>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -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,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -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,5 @@
1
+ # Load the Rails application.
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -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