auto_admin 0.0.1 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +11 -1
  3. data/app/assets/javascripts/auto_admin/application.js +14 -0
  4. data/app/assets/stylesheets/auto_admin/application.scss +19 -0
  5. data/app/controllers/auto_admin/application_controller.rb +3 -0
  6. data/app/controllers/auto_admin/resources_controller.rb +13 -0
  7. data/app/controllers/auto_admin/root_controller.rb +3 -0
  8. data/app/helpers/auto_admin/application_helper.rb +11 -0
  9. data/app/views/auto_admin/resources/_resource.html.erb +12 -0
  10. data/app/views/auto_admin/resources/_resources.html.erb +22 -0
  11. data/app/views/auto_admin/resources/index.html.erb +6 -0
  12. data/app/views/auto_admin/resources/show.html.erb +26 -0
  13. data/app/views/auto_admin/root/index.html.erb +28 -0
  14. data/app/views/layouts/auto_admin/application.html.erb +31 -0
  15. data/config/routes.rb +6 -0
  16. data/lib/auto_admin/association.rb +14 -0
  17. data/lib/auto_admin/engine.rb +5 -0
  18. data/lib/auto_admin/node.rb +110 -0
  19. data/lib/auto_admin/version.rb +1 -1
  20. data/lib/auto_admin.rb +2 -0
  21. data/spec/internal/app/models/event.rb +4 -0
  22. data/spec/internal/app/models/guest.rb +3 -0
  23. data/spec/internal/app/models/location.rb +3 -0
  24. data/spec/internal/app/models/spouse.rb +3 -0
  25. data/spec/internal/app/models/wedding.rb +7 -0
  26. data/spec/internal/config/database.yml +3 -0
  27. data/spec/internal/config/deprecations.ignore +8 -0
  28. data/spec/internal/config/routes.rb +6 -0
  29. data/spec/internal/db/combustion_test.sqlite +0 -0
  30. data/spec/internal/db/schema.rb +36 -0
  31. data/spec/internal/db/seeds.rb +40 -0
  32. data/spec/internal/log/test.log +7349 -0
  33. data/spec/internal/public/favicon.ico +0 -0
  34. data/spec/internal/tmp/cache/assets/sprockets/v3.0/-g/-g5D7a2rHIg8LmAmKiBeIc2U8Ytr69vDhdaxZH8sZKs.cache +0 -0
  35. data/spec/internal/tmp/cache/assets/sprockets/v3.0/1E/1Ek6BQKYDmI3p-lsgerA2QbLAZManaq3matnrIEfqus.cache +0 -0
  36. data/spec/internal/tmp/cache/assets/sprockets/v3.0/1b/1bWDazvqQ5eEpedrmuRZaM6sZ-B1eChr9Wlmqoj3nio.cache +1 -0
  37. data/spec/internal/tmp/cache/assets/sprockets/v3.0/3O/3OqrvX4eM-NTfHpZRncVsHS3c2afsS-VUxYbhI_itP0.cache +0 -0
  38. data/spec/internal/tmp/cache/assets/sprockets/v3.0/58/58XNELuVm3VUzY9xFEGque_tuymzXG7b3HgFaN0B0eE.cache +0 -0
  39. data/spec/internal/tmp/cache/assets/sprockets/v3.0/6I/6IwrQwi_5DeWhHFXFsRNo8rOPpIz5SQaODjcnT53glg.cache +0 -0
  40. data/spec/internal/tmp/cache/assets/sprockets/v3.0/6c/6cu-sPf3zSZouQmY2E8RZIXfmRKRCj3DRj7CyjLD3ng.cache +0 -0
  41. data/spec/internal/tmp/cache/assets/sprockets/v3.0/7o/7oyq6kRsy7q9_dJllSX7HJa_KMVwl_2LQW3ZiPxRD24.cache +1 -0
  42. data/spec/internal/tmp/cache/assets/sprockets/v3.0/7q/7qoAmNZeOaXTA0Fw0HiXfvjTjV0SdNDp1pIwIrddSZ0.cache +1 -0
  43. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8K/8KB908gcMRv7YGZ7YohAp-fKSoE6uMMhQ6l4lN28prI.cache +0 -0
  44. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8h/8hZ9H_42QSHpCvXHoTxX5fmg_s6vtoF0qHktdUcqMMc.cache +0 -0
  45. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8u/8u7Qtu9oipuSyNxftRBekCWgk2BN1x9xhlx_IKwynSU.cache +1 -0
  46. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8v/8vFS_WXrlHCzHkUNfMgcMt2JMYQ5edPO73Zw2hAjm3Y.cache +0 -0
  47. data/spec/internal/tmp/cache/assets/sprockets/v3.0/9C/9CIax374DQ1JB9Jb80Jjp_Jd7ybte0ZO_nsnnh0qm_s.cache +0 -0
  48. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ad/Adfekt2KmnAnXVdjfJPAAJdA7TiHMd9zOiaG_qQRFe8.cache +1 -0
  49. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Al/Al_RTPBQZmis5UD3VDE5QBgObnziUzSNMhh6CozUXs4.cache +1 -0
  50. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ay/AyoqsVeG9WrBSBwoA4eUNnfN-sKgWH3y_3__B52rzsk.cache +0 -0
  51. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Bu/BuHQbYztt4Clbfa5pGORGKUdrd09m9eoLV6bpagQa_A.cache +0 -0
  52. data/spec/internal/tmp/cache/assets/sprockets/v3.0/C4/C4YJgrlR5tnrKEPVEGBr5PtyPYlZUYEdb50GTAQ-GBg.cache +0 -0
  53. data/spec/internal/tmp/cache/assets/sprockets/v3.0/DL/DL8uT7MxwsfHPVPRD2pMEmRYatppQCxpmTFnYMfj7Cc.cache +0 -0
  54. data/spec/internal/tmp/cache/assets/sprockets/v3.0/E7/E7tel185C_eLgys-9Wzrr5mWXl7YysieAVSGdFaJ42E.cache +0 -0
  55. data/spec/internal/tmp/cache/assets/sprockets/v3.0/EE/EE1OXD4ZIHvIrqeauDb8DwW6PCX0pYSCZnok3hs_WU8.cache +0 -0
  56. data/spec/internal/tmp/cache/assets/sprockets/v3.0/FB/FBfd7rRZainBCvST2WkPinNNc_KTPVJ7vNSDqEAtXZw.cache +0 -0
  57. data/spec/internal/tmp/cache/assets/sprockets/v3.0/FJ/FJ0CEc5AG8VfTdOJtgdTJNhFVhIKXZTcMv8MztlLm58.cache +0 -0
  58. data/spec/internal/tmp/cache/assets/sprockets/v3.0/GG/GG0efRIvD5nA7gT013q9PpVcfBtWyV6rA1LIp6U4RxI.cache +2 -0
  59. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ge/GeC3AihoKnJhCkmlEMT9xgBMcnM_057iAJKtR26H104.cache +1 -0
  60. data/spec/internal/tmp/cache/assets/sprockets/v3.0/H0/H0pFr3A5hh4Pl1Xmz6AOMCpokq0raYkhhNXVTAexL6E.cache +1 -0
  61. data/spec/internal/tmp/cache/assets/sprockets/v3.0/IE/IEatqwcaNFcp7BnwoYrFNphqPqJdADAP21VOmX2SgEU.cache +0 -0
  62. data/spec/internal/tmp/cache/assets/sprockets/v3.0/IQ/IQ6dNgm-TB2n8-bXyQqJYx4eBtsJeyPrnm_VYZBSj3I.cache +1 -0
  63. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ib/Ib8AmMvsB0kpqet0zmHsr17kgB9LLX36TIWXVs0CIpw.cache +2 -0
  64. data/spec/internal/tmp/cache/assets/sprockets/v3.0/JK/JK4_xpfwpkdMGqotrf2sRDq0A7u_4OXQidIp1Dwmo90.cache +1 -0
  65. data/spec/internal/tmp/cache/assets/sprockets/v3.0/JW/JWY015E_4v3TJh6lnirFbG4tc_6S8QnFkCnKD08sB8I.cache +0 -0
  66. data/spec/internal/tmp/cache/assets/sprockets/v3.0/K1/K17YLnwXyhxemHam5BM4IgwZi0SqZokiGdI4Lq4pJ_A.cache +0 -0
  67. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Kl/Kl1PcdIvb52OfvNNTdfN0l0Uj45-BqvUbXIDBxV2w0M.cache +2 -0
  68. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Kl/KlZ8RdmnN6KXAq6vhGssBMzuaOsF02_HB55vkvT7_3c.cache +1 -0
  69. data/spec/internal/tmp/cache/assets/sprockets/v3.0/LF/LFpw1bUJwk5Z0YUXRZzvCzL6leKLmrpy5L53PKDKgvU.cache +0 -0
  70. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Lz/LznQPIxdodqdBkU9w5lMGDSUNt0lXPmLZmrDchQySPs.cache +1 -0
  71. data/spec/internal/tmp/cache/assets/sprockets/v3.0/M2/M234kQQXwp_89f-7T-XzoZ9wezWKvlYQaCB6hGzRFmk.cache +1 -0
  72. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Mu/MuNQRk3oQ84H3Tp6KjQ13avpVTb3BVRZegrsMWkHo44.cache +0 -0
  73. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Mv/Mv_DdQoZCHeDHbcUxJvwXoetNwkjcl8A1xfI-8Cc0FM.cache +0 -0
  74. data/spec/internal/tmp/cache/assets/sprockets/v3.0/NF/NFdV8GCmk70eDuRi43GHQGzseblONpqDM6ER3xXQgfg.cache +1 -0
  75. data/spec/internal/tmp/cache/assets/sprockets/v3.0/O0/O0mXS0nhsIVoZcqzgHUCMshb23CZ-B3eV8iXUpQfXMo.cache +0 -0
  76. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Oc/Ocxmw2zOkD_Fae_ZaKGcp1UqOfV0IyYF67jwCf9b9ic.cache +1 -0
  77. data/spec/internal/tmp/cache/assets/sprockets/v3.0/On/ONVsTA-XvEb_Z8Ou1rAdSDNel4umft9Upddl4ammlPU.cache +0 -0
  78. data/spec/internal/tmp/cache/assets/sprockets/v3.0/On/Onnt81R720TR7OLlNyyKj9Lwz7hg03bo6Xxa73eZuyM.cache +2 -0
  79. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Oy/OyxoYhrvpllJDVX9iyushlhNDx62kv7s5sq2CH-wQuA.cache +1 -0
  80. data/spec/internal/tmp/cache/assets/sprockets/v3.0/RZ/RZDY4XES5sOKTKAptTKqEAIq6a039KuVM3uyQxJdW2Q.cache +1 -0
  81. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Sd/SdEVcqMx6gPxOQEDzHBsFb7hJSixz2OEcfazytRLRFQ.cache +0 -0
  82. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Sg/Sg2fQdPuJMgyUObf9OJJv8SzPBIbpi9OJokWrz8nY28.cache +0 -0
  83. data/spec/internal/tmp/cache/assets/sprockets/v3.0/TF/TFDRGYQfxQITHbuhzzRJulViRK28mhAm4nhcl0861-c.cache +1 -0
  84. data/spec/internal/tmp/cache/assets/sprockets/v3.0/UI/UIungvBjyb9anThvrdiSuGZSrM_8nv5gYw9W6HCYeAI.cache +0 -0
  85. data/spec/internal/tmp/cache/assets/sprockets/v3.0/UJ/UJH4rJjcGyqiiprzASArsCPqHn65vTS-jcA_rq6ED0g.cache +0 -0
  86. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Uu/Uu78bgFdLtTnEPW67QVIFD20wmcZRTzwvDa5OUDEGo4.cache +1 -0
  87. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Vu/Vu2tvm3rbkC9AtklPqCE7mLrwFr6vZBrHT-4qRIRjfk.cache +0 -0
  88. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Wj/Wjc9rC0fjS9hoGkKycwZB1-OWjk5Uo8ZQ9OTKHFRTPQ.cache +1 -0
  89. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Wm/Wm11_W1l_3i_HQ5OkUmm1LgFa3gsO9bc-C4HD1WmDxE.cache +0 -0
  90. data/spec/internal/tmp/cache/assets/sprockets/v3.0/YF/YFosmIuBAvSvsWYIeManIFvEHrTY5hiaMxm2HeMqviU.cache +0 -0
  91. data/spec/internal/tmp/cache/assets/sprockets/v3.0/YF/yf78M0jN2SVNcch99_CaWKTFJtCviFN3VirhFT7omsA.cache +0 -0
  92. data/spec/internal/tmp/cache/assets/sprockets/v3.0/YH/YHzMiSwdvvc52ICwumRE5sh11TtxITTqZ8APoFr1YNo.cache +1 -0
  93. data/spec/internal/tmp/cache/assets/sprockets/v3.0/YP/YP5pYfyiwmkGwn0ng9msO7KmWj2bR7BrhSJN_TVu6lE.cache +0 -0
  94. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Yn/Yn01mIlbdMjo89bWpd2i5ur46gWZRsTlUhZs4zTRtZw.cache +0 -0
  95. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Yu/YuZHD9yz969pq5CTN0W9jBPeIVIUlMoRseOv8j15ctw.cache +0 -0
  96. data/spec/internal/tmp/cache/assets/sprockets/v3.0/_i/_iC6VsZn7sWQPRrNIyOuJrtKauyn0jJZuvvmUtnMig4.cache +3 -0
  97. data/spec/internal/tmp/cache/assets/sprockets/v3.0/_v/_vlftFF_sy9XApwuIV27PdOODln_9lPVUywS1tLZLPI.cache +0 -0
  98. data/spec/internal/tmp/cache/assets/sprockets/v3.0/aO/aOyl1NaE416Yn4Svb4ZxvCwnbFj1jtrIbWr9pCWSTpc.cache +1 -0
  99. data/spec/internal/tmp/cache/assets/sprockets/v3.0/aR/aRpXm6cyi-CcIxcV_Jj0kJpBkeHsDQl2L9GkLkUNMSg.cache +1 -0
  100. data/spec/internal/tmp/cache/assets/sprockets/v3.0/b5/b5_4FcMP3sUDIjTMizXw2AoUZ8kA_9EOXSWwNobUnd4.cache +0 -0
  101. data/spec/internal/tmp/cache/assets/sprockets/v3.0/bA/bAthtCNeRjh9XZFR5xd8tHZtXQYkJIbiRfNvhUGGCy4.cache +0 -0
  102. data/spec/internal/tmp/cache/assets/sprockets/v3.0/bV/bVE5ftYff_PdbN6jKd927FtpSIVXuTXyjMf4ct4UHLU.cache +0 -0
  103. data/spec/internal/tmp/cache/assets/sprockets/v3.0/bp/bp80MEtbUmuKyWtM2TZVvV1cCIbVKClS23LPXNNKF2s.cache +0 -0
  104. data/spec/internal/tmp/cache/assets/sprockets/v3.0/bx/bxLvJ-Uyj1Ve1MPmQxcCQsuvoNw4IWBcI-MDXwC8BC4.cache +1 -0
  105. data/spec/internal/tmp/cache/assets/sprockets/v3.0/c9/c9G5ED_SQ5eN9-4i69fKLJS_i_qqNs4Lu5daIFqAxlY.cache +0 -0
  106. data/spec/internal/tmp/cache/assets/sprockets/v3.0/cG/cG6PKqICCIefV2jf7-2cY9aHEscGLOVM_t7WanHXhd8.cache +0 -0
  107. data/spec/internal/tmp/cache/assets/sprockets/v3.0/cP/cP3gTpeIQDSLhZXKezIuOw8PFGkRG1GO7ICHQxNyxvo.cache +2 -0
  108. data/spec/internal/tmp/cache/assets/sprockets/v3.0/d4/d4ENU3asIuW0_efKW26U9vcEOasc8i4ek_ltbmwWKUw.cache +0 -0
  109. data/spec/internal/tmp/cache/assets/sprockets/v3.0/db/db40SFQj9R-vYndw66gIDUZaH50QzQjlMzF0TaADskU.cache +1 -0
  110. data/spec/internal/tmp/cache/assets/sprockets/v3.0/df/df7Zrk8Tzo_ujGidlL7jnp53ZiVQR33GYDHDtcFKavs.cache +0 -0
  111. data/spec/internal/tmp/cache/assets/sprockets/v3.0/dr/drDMjDhBmeS72Lo2DZBfpranZmox2KjQfA3BStWh3dQ.cache +0 -0
  112. data/spec/internal/tmp/cache/assets/sprockets/v3.0/dt/dtZ3d1TPBmhxBdSeMPpyvXAvHttommlmB53PaJFmBOE.cache +0 -0
  113. data/spec/internal/tmp/cache/assets/sprockets/v3.0/e9/e9qpFFRDFdoKMeZBOT3SdcM5tmfp__sd_f9nnta5HIA.cache +2 -0
  114. data/spec/internal/tmp/cache/assets/sprockets/v3.0/eg/egwY1_MMNhNnoIr69vO6v2Ps21FLK9xOd6Wjt5DlF4E.cache +1 -0
  115. data/spec/internal/tmp/cache/assets/sprockets/v3.0/f5/f5SX35qF5Qm2JBcNLx_F61oawJbpDGIDzayN0FfNAAY.cache +0 -0
  116. data/spec/internal/tmp/cache/assets/sprockets/v3.0/g6/g6_irwcsshDNlq-hq0H5_KkVAP2C_ddOypP-5HcmKLE.cache +1 -0
  117. data/spec/internal/tmp/cache/assets/sprockets/v3.0/gL/gLldr_ERXPQatjJNAuUcJVMWkgfGpj8V2clXYCa5vsA.cache +2 -0
  118. data/spec/internal/tmp/cache/assets/sprockets/v3.0/gP/gPb3LDJpCpb9E2hIxyEGs6GTyYl_Q254U7DwTTBZF1Y.cache +1 -0
  119. data/spec/internal/tmp/cache/assets/sprockets/v3.0/jg/jgJsibianecLs6vKLZB3qzLkqQNXS8yMfv3K6bU8xBs.cache +0 -0
  120. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ji/jiMiJDGSQJCiTzn_Xzry37A6tzREv_bTkMBaGek0UIc.cache +1 -0
  121. data/spec/internal/tmp/cache/assets/sprockets/v3.0/kY/kY0i_69JE_dcY6lyECHD2szXWXkQbL92X4ZJTbJ1UCg.cache +1 -0
  122. data/spec/internal/tmp/cache/assets/sprockets/v3.0/lB/LbJQh4ZFGs6aEzLnWrUyHJLBFI0-qp_WGxe3uuvrCXc.cache +1 -0
  123. data/spec/internal/tmp/cache/assets/sprockets/v3.0/lB/lB_dPzEOHIkFMQB5Ig0rjG2_1H35fcdoaCL0BlXl3sM.cache +1 -0
  124. data/spec/internal/tmp/cache/assets/sprockets/v3.0/o6/o6uq73B0EydyzUz19mydT6C_pTG6O39AOxEuyHvZvGY.cache +0 -0
  125. data/spec/internal/tmp/cache/assets/sprockets/v3.0/oj/oji0xBwdcVa5i_Tni6XaJI635LAgM2wSQ0AUA0qTNY4.cache +0 -0
  126. data/spec/internal/tmp/cache/assets/sprockets/v3.0/r9/r9ZQZeUK1lHHsMk2OW_y39A1-bL7sv9JEVpvzCDUcX0.cache +1 -0
  127. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rA/rA3O9jGRfxEZ0GvXtfIAD-i3oiJxC-BjgxKM5E8leOM.cache +0 -0
  128. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rJ/rJo1QQvojWERnXxN04HLXcZK5g1uZMfUmSdhGvXZD3w.cache +1 -0
  129. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rK/rKRjTb3jqg7H6ITemMBILeAZhrVmGJZC3Io7jqfExmc.cache +1 -0
  130. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rK/rkkCfZLwpHG_6mLHrLvsgk93hbxd2prCtKHcnfvTdbk.cache +0 -0
  131. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rM/rMd0oJRNVx-ZiZljIdJar0hqdzXOR4cB0iusMMQXOyA.cache +0 -0
  132. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rp/rpjqB9hra4jJDlc_PcVaSdTDDOUQzqurJjQnQS5l2D0.cache +0 -0
  133. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rq/rqiQ11oZf9PBbajE6xeKq09pC9HY-6tLmPrJKkoXNwE.cache +1 -0
  134. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ru/ru6DMnvf_DCLs2KELxQRr--e7jMAhf8o6nrNphFJvhs.cache +1 -0
  135. data/spec/internal/tmp/cache/assets/sprockets/v3.0/s8/s8qz3JAa9e9quBhzrWxZGfuNiLtNHnsYEWvy7Un0bwQ.cache +0 -0
  136. data/spec/internal/tmp/cache/assets/sprockets/v3.0/sS/sS_B7E6lPpJwtu4jDQ3uLgpcwGg0cvC_LblrvCo1Wms.cache +1 -0
  137. data/spec/internal/tmp/cache/assets/sprockets/v3.0/si/sil63HU_2OsIEv1N4vmVM9heh7NJqr9Vkv4nl55Cns8.cache +0 -0
  138. data/spec/internal/tmp/cache/assets/sprockets/v3.0/uC/uCntLi3u40TVljQigZcB2VMY8mhNMsLhFPu3C2qZFmI.cache +0 -0
  139. data/spec/internal/tmp/cache/assets/sprockets/v3.0/uw/uwpfCkDCxEdvpikZDZThJYN5_u2Z1PeV8e4yhOITlq8.cache +1 -0
  140. data/spec/internal/tmp/cache/assets/sprockets/v3.0/uy/uyLbbq8bxYaVtv-O5HgWklkfsra-RngDrP-fUMq3WV0.cache +1 -0
  141. data/spec/internal/tmp/cache/assets/sprockets/v3.0/vT/vTjQ66jZT4S9WTExzF4eItGJHEDXgbqmeZoemBMQyIQ.cache +1 -0
  142. data/spec/internal/tmp/cache/assets/sprockets/v3.0/vy/VyrSTLFzA5qFIOQCbMuOpb_VJF5Sf22iPCvwX6rTWws.cache +0 -0
  143. data/spec/internal/tmp/cache/assets/sprockets/v3.0/vy/vyOTdnO1la3XemZUtYHfQZKdg83R1yG-5KW4cr7kkFc.cache +0 -0
  144. data/spec/internal/tmp/cache/assets/sprockets/v3.0/w7/w7qjMtw2xiTadnwBw38HFj-wJGOhDcJYKWwXY0hNX8w.cache +1 -0
  145. data/spec/internal/tmp/cache/assets/sprockets/v3.0/x6/x6ywdxwKEEOfNb3d8OW3zESRWhoILFPRGof_eNGIfqU.cache +0 -0
  146. data/spec/internal/tmp/cache/assets/sprockets/v3.0/xy/xyhZHxlpEWCXskPafN_ujFOSCeyaqNoXYPMvEdbHg78.cache +0 -0
  147. data/spec/internal/tmp/cache/assets/sprockets/v3.0/yS/ySaeoCZRRMLS0GrKXJTZutBhbrd-oIIprrge2QjqZGE.cache +0 -0
  148. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ya/yaavZzi6Kk8sU9nFGBnZg9v2ZYLR-d0J5PPmgxCQbP8.cache +1 -0
  149. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ya/yawvjnilnAQhjPetQwcD6tYAWpiXPJ4tlzR5XO2IqHI.cache +0 -0
  150. data/spec/internal/tmp/cache/assets/sprockets/v3.0/yl/ylPOausLQEUiM2W0Da-U9vQd4Hs6g8AIal7RNl38dQ8.cache +1 -0
  151. data/spec/internal/tmp/cache/assets/sprockets/v3.0/zR/zRymhKWXNLfRSLZ2-0cOGC2DItIYWnGaWO61fQ6mnbI.cache +0 -0
  152. data/spec/internal/tmp/cache/assets/sprockets/v3.0/zX/zXnRwk8dtIJqQb2IyryIkHZMeHq9L8SNk3iLDp7weYw.cache +0 -0
  153. data/spec/models/node_spec.rb +9 -0
  154. data/spec/spec_helper.rb +11 -0
  155. metadata +370 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 827870d13ce639a2a40dc4ca00f158a69887aa018946eeb8420b12621583dd6f
4
- data.tar.gz: 5257c29282893548878669451c0e49023d23a3a5549cbd67fec4d9045fcb353a
3
+ metadata.gz: 9d4878f3f05e89504ce4bdef4311c20b72b1a1de9098a004b7f62bbdee630d08
4
+ data.tar.gz: b8399a4973de5b7f4072550f1991ae3296a76098ebf8bdb36e4bbf7443c03b23
5
5
  SHA512:
6
- metadata.gz: 1b8b9b8a3f4a92d1c1556ac91922781184f48f2ce590649b59d3b37df7d0af0cb4f9204fc7feb97627e8093584730812bc9e9e78a2659c3b1cae4223e34dd310
7
- data.tar.gz: c81966ef68995cd234544d70837b9410cc47f9d989ac2cc02f5e3767ef3f1f55396f1189fbf2dc0db5c06a500b80fed455bd0eb86d2a9b9e76c680ba8ce87d34
6
+ metadata.gz: adee936602b67ce18adb9bb1cf440f11cdbd20345d90ac9ca7c9f9fc23f4a238ee2239609b3d00352c4d641fe3e3bda9567a974f2955b28e3c5fb97e4a48a012
7
+ data.tar.gz: ccb819a2762f6d2a54d6b73eb9a029a5e43bea35b022232a6b3fed6ccac41f6c7863e00e11edae80656dedc4bf0cfa36551fbaf6eacc400779e363c0b4e583f1
data/Rakefile CHANGED
@@ -1,6 +1,16 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
+ require 'rubocop/rake_task'
5
+ RuboCop::RakeTask.new
6
+
7
+ require 'rspec/core'
8
+ require 'rspec/core/rake_task'
4
9
  RSpec::Core::RakeTask.new(:spec)
5
10
 
6
- task default: :spec
11
+ task default: %i(rubocop spec)
12
+
13
+ desc 'Open an irb session preloaded with this library'
14
+ task :console do
15
+ sh 'irb -rubygems -I lib -r auto_admin'
16
+ end
@@ -0,0 +1,14 @@
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, or any plugin's
5
+ // 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. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require turbolinks
14
+ //= require_tree .
@@ -0,0 +1,19 @@
1
+ $turquoise: #70C1B3;
2
+ $blue: #247BA0;
3
+ $green: #B2DBBF;
4
+ $yellow: #F3FFBD;
5
+ $red: #FF1654;
6
+
7
+ $primary: $turquoise;
8
+ $info: $blue;
9
+ $success: $green;
10
+ $warning: $yellow;
11
+ $danger: $red;
12
+
13
+ @import url('https://fonts.googleapis.com/css?family=Open+Sans|Roboto+Slab');
14
+
15
+ $family-sans-serif: 'Open Sans', sans-serif;
16
+ $family-serif: 'Roboto Slab', serif;
17
+ $family-primary: $family-serif;
18
+
19
+ @import "bulma";
@@ -0,0 +1,3 @@
1
+ class AutoAdmin::ApplicationController < ActionController::Base
2
+ http_basic_authenticate_with name: 'smudge', password: 'reallybadpassword123'
3
+ end
@@ -0,0 +1,13 @@
1
+ module AutoAdmin
2
+ class ResourcesController < AutoAdmin::ApplicationController
3
+ def index
4
+ @node = Node.nodes[params[:node]]
5
+ @resources = @node.klass.all
6
+ end
7
+
8
+ def show
9
+ @node = Node.nodes[params[:node]]
10
+ @resource = @node.klass.find(params[:id])
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ class AutoAdmin::RootController < AutoAdmin::ApplicationController
2
+ def index; end
3
+ end
@@ -0,0 +1,11 @@
1
+ module AutoAdmin
2
+ module ApplicationHelper
3
+ def app_name
4
+ if Rails.application.class.respond_to?(:module_parent_name)
5
+ Rails.application.class.module_parent_name
6
+ else
7
+ Rails.application.class.parent_name
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ <div class="table-container">
2
+ <table class='table is-fullwidth'>
3
+ <tbody>
4
+ <% node.attributes.each do |attribute| %>
5
+ <tr>
6
+ <td><strong><%= attribute.humanize %></strong></td>
7
+ <td><%= resource.public_send(attribute) %></td>
8
+ </tr>
9
+ <% end %>
10
+ </tbody>
11
+ </table>
12
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="table-container">
2
+ <table class='table is-fullwidth'>
3
+ <thead>
4
+ <tr>
5
+ <% node.attributes.each do |attr| %>
6
+ <th><%= attr.humanize %></th>
7
+ <% end %>
8
+ <th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <% resources.limit(20).each do |resource| %>
13
+ <tr>
14
+ <% node.attributes.each do |attribute| %>
15
+ <td><%= resource.public_send(attribute).to_s.truncate(200) %></td>
16
+ <% end %>
17
+ <td><%= link_to '->', public_send("#{node.resource_name.singularize}_path", resource) %></td>
18
+ </tr>
19
+ <% end %>
20
+ </tbody>
21
+ </table>
22
+ </div>
@@ -0,0 +1,6 @@
1
+ <section class='section'>
2
+ <div class='container'>
3
+ <h5 class="title is-5"><%= @node.resource_name.titleize %></h5>
4
+ <%= render 'resources', resources: @resources, node: @node %>
5
+ </div>
6
+ </section>
@@ -0,0 +1,26 @@
1
+ <section class='section'>
2
+ <div class='container'>
3
+ <h5 class="title is-5"><%= @node.resource_name.singularize.titleize %></h5>
4
+ <%= render 'resource', resource: @resource, node: @node %>
5
+ </div>
6
+ </section>
7
+
8
+ <% @node.has_one.each do |friendship| %>
9
+ <section class='section'>
10
+ <div class='container'>
11
+ <% if (friend_resource = @resource.send(friendship.name)) %>
12
+ <h5 class="title is-5"><%= friendship.name.titleize %></h5>
13
+ <%= render 'resource', resource: friend_resource, node: friendship.node %>
14
+ <% end %>
15
+ </div>
16
+ </section>
17
+ <% end %>
18
+
19
+ <% @node.has_many.each do |child| %>
20
+ <section class='section'>
21
+ <div class='container'>
22
+ <h5 class="title is-5"><%= child.name.titleize %></h5>
23
+ <%= render 'resources', resources: @resource.send(child.name), node: child.node %>
24
+ </div>
25
+ </section>
26
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <section class='section'>
2
+ <div class='container'>
3
+ <div class="table-container">
4
+ <table class='table is-fullwidth'>
5
+ <thead>
6
+ <tr>
7
+ <th>Model</th>
8
+ <th>Parents</th>
9
+ <th>Children</th>
10
+ <th>Friends</th>
11
+ <th>Weight</th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% AutoAdmin::Node.nodes.values.sort_by { |n| [-n.weight, n.name] }.each do |node| %>
16
+ <tr>
17
+ <td><strong><%= node.to_s %></strong></td>
18
+ <td><%= node.belongs_to.count %></td>
19
+ <td><%= node.has_many.count %></td>
20
+ <td><%= node.has_one.count %></td>
21
+ <td><%= node.weight %></td>
22
+ </tr>
23
+ <% end %>
24
+ </tbody>
25
+ </table>
26
+ </div>
27
+ </div>
28
+ </section>
@@ -0,0 +1,31 @@
1
+ <% content_for(:body) do %>
2
+ <nav class='navbar is-dark' role='navigation' aria-label='main navigation'>
3
+ <div class='container'>
4
+ <div class='navbar-brand'>
5
+ <%= link_to 'AutoAdmin', root_path, class: 'navbar-item has-text-weight-bold' %>
6
+ <% AutoAdmin::Node.root_nodes.each do |node| %>
7
+ <%= link_to node.resource_name.humanize, node.polymorphic_path, class: ['navbar-item', ('is-active' if @node == node)].compact.join(' ') %>
8
+ <% end %>
9
+ </div>
10
+ </div>
11
+ </nav>
12
+ <%= yield %>
13
+ <% end %>
14
+
15
+ <!DOCTYPE html>
16
+ <html>
17
+ <head>
18
+ <title>AutoAdmin: <%= app_name %></title>
19
+ <meta charset='utf-8'>
20
+ <meta name='viewport' content='width=device-width, initial-scale=1'>
21
+ <%= csrf_meta_tags %>
22
+ <%= csp_meta_tag if respond_to?(:csp_meta_tag) %>
23
+
24
+ <%= stylesheet_link_tag 'auto_admin/application', media: 'all', 'data-turbolinks-track': 'reload' %>
25
+ <%= javascript_include_tag 'auto_admin/application', 'data-turbolinks-track': 'reload' %>
26
+ </head>
27
+
28
+ <body>
29
+ <%= content_for(:body) %>
30
+ </body>
31
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ AutoAdmin::Engine.routes.draw do
2
+ AutoAdmin::Node.root_nodes.each do |node|
3
+ node.define_routes!(self)
4
+ end
5
+ root to: 'root#index'
6
+ end
@@ -0,0 +1,14 @@
1
+ module AutoAdmin
2
+ class Association
3
+ attr_accessor :node, :name
4
+
5
+ def initialize(node, name)
6
+ self.node = node
7
+ self.name = name.to_s
8
+ end
9
+
10
+ def ==(other)
11
+ node == other.node && name == other.name
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,10 @@
1
1
  module AutoAdmin
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace AutoAdmin
4
+
5
+ initializer 'assets' do |app|
6
+ app.config.assets.precompile << 'auto_admin/application.css'
7
+ app.config.assets.precompile << 'auto_admin/application.js'
8
+ end
4
9
  end
5
10
  end
@@ -0,0 +1,110 @@
1
+ module AutoAdmin
2
+ class Node
3
+ class << self
4
+ def nodes
5
+ @nodes ||= begin
6
+ Rails.application.eager_load!
7
+ ActiveRecord::Base.descendants.each_with_object({}) do |klass, hash|
8
+ next if klass.abstract_class? || klass.name.split('::').first == 'ActiveRecord'
9
+
10
+ hash[klass.name] = AutoAdmin::Node.new(klass)
11
+ end
12
+ end
13
+ end
14
+
15
+ def preload_associations! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
16
+ return true if @preloading
17
+
18
+ @preloading = true
19
+ @preload_associations ||= begin
20
+ nodes.values.each do |node|
21
+ node.klass.reflect_on_all_associations(:has_many).each do |association|
22
+ node.has_many association unless association.options[:through]
23
+ end
24
+ node.klass.reflect_on_all_associations(:has_one).each do |association|
25
+ node.has_one association
26
+ end
27
+ node.klass.reflect_on_all_associations(:belongs_to).each do |association|
28
+ node.belongs_to association unless association.polymorphic?
29
+ end
30
+ end
31
+ true
32
+ end
33
+ end
34
+
35
+ def root_nodes
36
+ nodes.values.select { |n| n.belongs_to.none? }.sort_by { |n| -n.weight }
37
+ end
38
+ end
39
+
40
+ attr_accessor :klass
41
+ delegate :name, :to_s, to: :klass
42
+
43
+ def initialize(klass)
44
+ self.klass = klass
45
+ end
46
+
47
+ def define_routes!(ctx)
48
+ ctx.resources resource_name, controller: 'resources', defaults: { node: klass.name }, only: %i(index show), shallow: true do
49
+ has_many.map(&:node).each do |child_node|
50
+ child_node.define_routes!(ctx)
51
+ end
52
+ end
53
+ end
54
+
55
+ def resource_name
56
+ klass.name.demodulize.underscore.pluralize
57
+ end
58
+
59
+ def polymorphic_path
60
+ [resource_name.to_sym]
61
+ end
62
+
63
+ def attributes
64
+ klass.column_names - primary_keys - belongs_to.map(&:node).map { |hm| hm.to_s.foreign_key }
65
+ end
66
+
67
+ def primary_keys
68
+ klass.respond_to?(:primary_keys) ? klass.primary_keys : [klass.primary_key]
69
+ end
70
+
71
+ def weight
72
+ @weight ||= has_many.map(&:node).sum(&:weight) + 1
73
+ end
74
+
75
+ def has_many(association = nil) # rubocop:disable Metrics/AbcSize
76
+ @has_many ||= Set.new
77
+ if association
78
+ node = self.class.nodes[association.klass.name]
79
+ node.belongs_to << Association.new(self, association.inverse_of) if association.inverse_of
80
+ @has_many << Association.new(node, association.name)
81
+ else
82
+ self.class.preload_associations!
83
+ end
84
+ @has_many
85
+ end
86
+
87
+ def has_one(association = nil) # rubocop:disable Metrics/AbcSize
88
+ @has_one ||= Set.new
89
+ if association
90
+ node = self.class.nodes[association.klass.name]
91
+ node.belongs_to << Association.new(self, association.inverse_of) if association.inverse_of
92
+ @has_one << Association.new(node, association.name)
93
+ else
94
+ self.class.preload_associations!
95
+ end
96
+ @has_one
97
+ end
98
+
99
+ def belongs_to(association = nil)
100
+ @belongs_to ||= Set.new
101
+ if association
102
+ node = self.class.nodes[association.klass.name]
103
+ @belongs_to << Association.new(node, association.name)
104
+ else
105
+ self.class.preload_associations!
106
+ end
107
+ @belongs_to
108
+ end
109
+ end
110
+ end
@@ -1,3 +1,3 @@
1
1
  module AutoAdmin
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.0.4'.freeze
3
3
  end
data/lib/auto_admin.rb CHANGED
@@ -3,6 +3,8 @@ require 'bulma-rails'
3
3
  require 'turbolinks'
4
4
  require 'auto_admin/version'
5
5
  require 'auto_admin/engine'
6
+ require 'auto_admin/association'
7
+ require 'auto_admin/node'
6
8
 
7
9
  module AutoAdmin
8
10
  end
@@ -0,0 +1,4 @@
1
+ class Event < ActiveRecord::Base
2
+ belongs_to :wedding
3
+ belongs_to :location
4
+ end
@@ -0,0 +1,3 @@
1
+ class Guest < ActiveRecord::Base
2
+ belongs_to :wedding
3
+ end
@@ -0,0 +1,3 @@
1
+ class Location < ActiveRecord::Base
2
+ has_one :event
3
+ end
@@ -0,0 +1,3 @@
1
+ class Spouse < ActiveRecord::Base
2
+ belongs_to :wedding
3
+ end
@@ -0,0 +1,7 @@
1
+ class Wedding < ActiveRecord::Base
2
+ has_many :events
3
+ has_many :guests
4
+
5
+ has_one :spouse_a, -> { order(name_order: :asc) }, class_name: 'Spouse'
6
+ has_one :spouse_b, -> { order(name_order: :desc) }, class_name: 'Spouse'
7
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/combustion_test.sqlite
@@ -0,0 +1,8 @@
1
+ {
2
+ "ignored_warnings": [
3
+ "DEPRECATION WARNING: Leaving `ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer`\nset to false is deprecated. SQLite databases have used 't' and 'f' to serialize\nboolean values and must have old data converted to 1 and 0 (its native boolean\nserialization) before setting this flag to true. Conversion can be accomplished\nby setting up a rake task which runs\n\n ExampleModel.where(\"boolean_column = 't'\").update_all(boolean_column: 1)\n ExampleModel.where(\"boolean_column = 'f'\").update_all(boolean_column: 0)\n\nfor all models and all boolean columns, after which the flag must be set to\ntrue by adding the following to your application.rb file:\n\n Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true\n (called from <global scope> at ../spec_helper.rb)",
4
+ "DEPRECATION WARNING: Leaving `ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer`\nset to false is deprecated. SQLite databases have used 't' and 'f' to serialize\nboolean values and must have old data converted to 1 and 0 (its native boolean\nserialization) before setting this flag to true. Conversion can be accomplished\nby setting up a rake task which runs\n\n ExampleModel.where(\"boolean_column = 't'\").update_all(boolean_column: 1)\n ExampleModel.where(\"boolean_column = 'f'\").update_all(boolean_column: 0)\n\nfor all models and all boolean columns, after which the flag must be set to\ntrue by adding the following to your application.rb file:\n\n Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true\n (called from block in <global scope> at ../../config.ru)"
5
+ ],
6
+ "updated": "2019-05-01 03:28:56 UTC",
7
+ "rails_version": "5.2.3"
8
+ }
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ # Add your own routes here, or remove this file if you don't have need for it.
5
+ mount AutoAdmin::Engine => '/aa'
6
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ create_table :weddings do |t|
5
+ t.date :date, null: false
6
+ t.timestamps
7
+ end
8
+
9
+ create_table :spouses do |t|
10
+ t.references :wedding
11
+ t.string :full_name, null: false
12
+ t.string :nickname, null: false
13
+ t.integer :name_order
14
+ end
15
+
16
+ create_table :locations do |t|
17
+ t.string :name, null: false
18
+ t.text :address
19
+ t.timestamps
20
+ end
21
+
22
+ create_table :events do |t|
23
+ t.references :wedding, null: false
24
+ t.references :location, null: false
25
+ t.string :name
26
+ t.datetime :time
27
+ t.timestamps
28
+ end
29
+
30
+ create_table :guests do |t|
31
+ t.references :wedding
32
+ t.string :full_name, null: false
33
+ t.string :nickname, null: false
34
+ t.string :email
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ wedding = Wedding.create!(
2
+ date: (wedding_day = Faker::Date.forward(365))
3
+ )
4
+
5
+ wedding.create_spouse_a!(
6
+ nickname: (first_name = Faker::Name.first_name),
7
+ full_name: "#{first_name} #{Faker::Name.middle_name} #{Faker::Name.last_name}",
8
+ name_order: 1
9
+ )
10
+ wedding.create_spouse_b!(
11
+ nickname: (first_name = Faker::Name.first_name),
12
+ full_name: "#{first_name} #{Faker::Name.middle_name} #{Faker::Name.last_name}",
13
+ name_order: 2
14
+ )
15
+
16
+ build_location = lambda do |odds_of_address|
17
+ Location.new(
18
+ name: Faker::Restaurant.name,
19
+ address: (Faker::Address.full_address if rand(100) < odds_of_address)
20
+ )
21
+ end
22
+ [
23
+ [50, -1.day, '7:00pm'],
24
+ [100, 0.days, '6:00pm'],
25
+ [0, 1.day, '11:00am']
26
+ ].each do |(odds_of_address, day_offset, time)|
27
+ wedding.events.create!(
28
+ name: 'Friday Drinks',
29
+ time: Time.zone.parse("#{wedding_day - day_offset} #{time}"),
30
+ location: build_location.call(odds_of_address)
31
+ )
32
+ end
33
+
34
+ 25.times do
35
+ wedding.guests.create!(
36
+ nickname: (first_name = Faker::Name.first_name),
37
+ full_name: "#{first_name} #{Faker::Name.last_name}",
38
+ email: (Faker::Internet.email if rand(100) < 80)
39
+ )
40
+ end