localtower 0.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +129 -33
  3. data/app/assets/stylesheets/application.css +68 -0
  4. data/app/controllers/localtower/pages_controller.rb +30 -30
  5. data/app/javascript/application.js +46 -0
  6. data/app/javascript/components/DarkSelect.js +115 -0
  7. data/app/javascript/components/ModernTooltip.js +26 -0
  8. data/app/javascript/components/NewMigrationForm.js +687 -0
  9. data/app/javascript/components/NewModelForm.js +432 -0
  10. data/app/javascript/components/data/Stores.js +294 -0
  11. data/app/views/layouts/localtower/application.html.erb +77 -80
  12. data/app/views/localtower/_migration.html.erb +30 -0
  13. data/app/views/localtower/pages/_alert_no_models.html.erb +3 -0
  14. data/app/views/localtower/pages/migrations.html.erb +25 -87
  15. data/app/views/localtower/pages/new_migration.html.erb +40 -0
  16. data/app/views/localtower/pages/new_model.html.erb +21 -0
  17. data/config/routes.rb +5 -5
  18. data/lib/localtower/engine.rb +5 -2
  19. data/lib/localtower/generators/migration.rb +219 -161
  20. data/lib/localtower/generators/model.rb +59 -26
  21. data/lib/localtower/generators/service_objects/insert_array.rb +25 -0
  22. data/lib/localtower/generators/service_objects/insert_defaults.rb +85 -43
  23. data/lib/localtower/generators/service_objects/insert_foreign_keys.rb +35 -0
  24. data/lib/localtower/generators/service_objects/insert_indexes.rb +103 -0
  25. data/lib/localtower/generators/service_objects/insert_nullable.rb +25 -0
  26. data/lib/localtower/status.rb +4 -2
  27. data/lib/localtower/tools.rb +31 -23
  28. data/lib/localtower/version.rb +1 -1
  29. data/lib/localtower.rb +0 -6
  30. data/public/com/favicon-64.png +0 -0
  31. data/public/com/twitter-cover-1.png +0 -0
  32. data/public/com/twitter-cover-2.png +0 -0
  33. data/public/fonts/Circular/CircularStd-Black.otf +0 -0
  34. data/public/fonts/Circular/CircularStd-BlackItalic.otf +0 -0
  35. data/public/fonts/Circular/CircularStd-Bold.otf +0 -0
  36. data/public/fonts/Circular/CircularStd-BoldItalic.otf +0 -0
  37. data/public/fonts/Circular/CircularStd-Book.otf +0 -0
  38. data/public/fonts/Circular/CircularStd-BookItalic.otf +0 -0
  39. data/public/fonts/Circular/CircularStd-Light Italic.otf +0 -0
  40. data/public/fonts/Circular/CircularStd-Light.otf +0 -0
  41. data/public/fonts/Circular/CircularStd-Medium.otf +0 -0
  42. data/public/fonts/Circular/CircularStd-MediumItalic.otf +0 -0
  43. data/public/fonts/Circular/Read Me.txt +5 -0
  44. data/public/fonts/Circular/www.dfonts.org.url +2 -0
  45. data/public/javascripts/application.js +30830 -0
  46. data/public/javascripts/application.js.map +7 -0
  47. data/public/screenshots/v0.1.1/1_schema.png +0 -0
  48. data/public/screenshots/v0.1.1/2_models_1.png +0 -0
  49. data/public/screenshots/v0.1.1/2_models_2.png +0 -0
  50. data/public/screenshots/v0.1.1/3_relations.png +0 -0
  51. data/public/screenshots/v0.1.1/4_migrations.png +0 -0
  52. data/public/screenshots/v0.1.6/1_schema.png +0 -0
  53. data/public/screenshots/v0.1.6/2_models_1.png +0 -0
  54. data/public/screenshots/v0.1.6/3_relations.png +0 -0
  55. data/public/screenshots/v0.1.6/4_migrations.png +0 -0
  56. data/public/screenshots/v0.1.6/5_capture.png +0 -0
  57. data/public/screenshots/v1.0.0/migrations.png +0 -0
  58. data/public/screenshots/v1.0.0/models.png +0 -0
  59. data/public/screenshots/v1.0.0/new_migration.png +0 -0
  60. data/public/screenshots/v1.0.0/new_model.png +0 -0
  61. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.44.30.jpg +0 -0
  62. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.44.42.jpg +0 -0
  63. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.44.54.jpg +0 -0
  64. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.48.21.jpg +0 -0
  65. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.48.28.jpg +0 -0
  66. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.48.51.jpg +0 -0
  67. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.49.09.jpg +0 -0
  68. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.50.04.jpg +0 -0
  69. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.50.11.jpg +0 -0
  70. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.50.19.jpg +0 -0
  71. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.51.47.jpg +0 -0
  72. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.51.48.jpg +0 -0
  73. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.52.02.jpg +0 -0
  74. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.52.18.jpg +0 -0
  75. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.52.26.jpg +0 -0
  76. data/public/screenshots/v2.0.0/Screenshot 2024-11-18 at 22.52.38.jpg +0 -0
  77. data/public/screenshots/v2.0.0/migrations.png +0 -0
  78. data/public/screenshots/v2.0.0/new_migration.png +0 -0
  79. data/public/screenshots/v2.0.0/new_model.png +0 -0
  80. data/public/stylesheets/application.css +1179 -0
  81. data/public/vendor/jquery-3.7.1.min.js +2 -0
  82. data/public/vendor/lucide.min.js +12 -0
  83. data/public/vendor/monokai-sublime.css +80 -0
  84. data/public/vendor/rails-ujs.min.js +8 -0
  85. data/spec/dummy/Gemfile +1 -3
  86. data/spec/dummy/Gemfile.lock +140 -111
  87. data/spec/dummy/config/database.yml +4 -6
  88. data/spec/dummy/config/environments/development.rb +1 -0
  89. data/spec/dummy/db/migrate/20241118233214_create_users.rb +9 -0
  90. data/spec/dummy/db/migrate/20241118233233_add_column_titme_for_user.rb +6 -0
  91. data/spec/dummy/db/schema.rb +4 -8
  92. data/spec/dummy/lib/tasks/reset.rake +16 -0
  93. data/spec/dummy/log/development.log +21437 -4475
  94. data/spec/dummy/log/localtower.log +586 -139
  95. data/spec/dummy/log/test.log +716 -0
  96. data/spec/dummy/test/index.html +38 -0
  97. data/spec/dummy/tmp/cache/sessions/localtower/726/FE1/_session_id%3A2%3A%3A69d6764784f832ea25700ea2f242210f3f8d94b48912b0f09ffc44311f0376eb +0 -0
  98. data/spec/dummy/tmp/cache/sessions/localtower/77E/121/_session_id%3A2%3A%3A0b3c1fe7154461ba023ba6c81dd1b999348757880b505f4b082faed263a627f9 +1 -0
  99. data/spec/dummy/tmp/cache/sessions/localtower/7EB/8A1/_session_id%3A2%3A%3Af88237c1d157546a5dcde894fd6c1410162a8eba318748d4ac573ee75e40df16 +0 -0
  100. data/spec/dummy/tmp/local_secret.txt +1 -0
  101. data/spec/dummy/tmp/pids/server.pid +1 -0
  102. data/spec/factories/migration.rb +87 -66
  103. data/spec/factories/model.rb +54 -20
  104. data/spec/lib/localtower/generators/migration_spec.rb +28 -63
  105. data/spec/lib/localtower/generators/model_spec.rb +96 -24
  106. data/spec/lib/localtower/generators/service_objects/insert_array_spec.rb +47 -0
  107. data/spec/lib/localtower/generators/service_objects/insert_defaults_spec.rb +30 -35
  108. data/spec/lib/localtower/generators/service_objects/insert_foreign_keys_spec.rb +101 -0
  109. data/spec/lib/localtower/generators/service_objects/insert_indexes_spec.rb +90 -0
  110. data/spec/lib/localtower/generators/service_objects/insert_nullable_spec.rb +61 -0
  111. data/spec/lib/localtower/tools_spec.rb +1 -11
  112. data/spec/spec_helper.rb +10 -6
  113. metadata +130 -237
  114. data/app/views/localtower/pages/_migrations.html.erb +0 -57
  115. data/app/views/localtower/pages/models.html.erb +0 -80
  116. data/app/views/localtower/pages/schema.html.erb +0 -67
  117. data/public/css/app.css +0 -104
  118. data/public/js/app.js +0 -192
  119. data/public/light-bootstrap-dashboard-master/assets/css/animate.min.css +0 -6
  120. data/public/light-bootstrap-dashboard-master/assets/css/bootstrap.min.css +0 -5
  121. data/public/light-bootstrap-dashboard-master/assets/css/demo.css +0 -61
  122. data/public/light-bootstrap-dashboard-master/assets/css/light-bootstrap-dashboard.css +0 -2789
  123. data/public/light-bootstrap-dashboard-master/assets/css/pe-icon-7-stroke.css +0 -632
  124. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.eot +0 -0
  125. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.svg +0 -212
  126. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.ttf +0 -0
  127. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.woff +0 -0
  128. data/public/light-bootstrap-dashboard-master/assets/img/default-avatar.png +0 -0
  129. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-0.jpg +0 -0
  130. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-1.jpg +0 -0
  131. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-2.jpg +0 -0
  132. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-3.jpg +0 -0
  133. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-4.jpg +0 -0
  134. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-5.jpg +0 -0
  135. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-6.jpg +0 -0
  136. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-7.jpg +0 -0
  137. data/public/light-bootstrap-dashboard-master/assets/img/faces/tim_vector.jpe +0 -0
  138. data/public/light-bootstrap-dashboard-master/assets/img/favicon.ico +0 -0
  139. data/public/light-bootstrap-dashboard-master/assets/img/loading-bubbles.svg +0 -14
  140. data/public/light-bootstrap-dashboard-master/assets/img/mask.png +0 -0
  141. data/public/light-bootstrap-dashboard-master/assets/img/new_logo.png +0 -0
  142. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-1.jpg +0 -0
  143. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-2.jpg +0 -0
  144. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-3.jpg +0 -0
  145. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-4.jpg +0 -0
  146. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-5.jpg +0 -0
  147. data/public/light-bootstrap-dashboard-master/assets/img/tim_80x80.png +0 -0
  148. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-checkbox-radio-switch.js +0 -502
  149. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-notify.js +0 -404
  150. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-select.js +0 -438
  151. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap.min.js +0 -7
  152. data/public/light-bootstrap-dashboard-master/assets/js/chartist.min.js +0 -9
  153. data/public/light-bootstrap-dashboard-master/assets/js/demo.js +0 -152
  154. data/public/light-bootstrap-dashboard-master/assets/js/jquery-1.10.2.js +0 -9789
  155. data/public/light-bootstrap-dashboard-master/assets/js/light-bootstrap-dashboard.js +0 -179
  156. data/public/logo-localtower-white-300.png +0 -0
  157. data/public/logo-localtower-white.png +0 -0
  158. data/public/logo-localtower.png +0 -0
  159. data/public/vendor/font-awesome.min.css +0 -4
  160. data/public/vendor/highlight-js-default.min.css +0 -9
  161. data/spec/dummy/db/migrate/20221115190039_create_users.rb +0 -13
  162. data/spec/dummy/db/migrate/20221115193020_change_users.rb +0 -8
  163. data/spec/dummy/db/migrate/20221115193532_change_users_at1668540931.rb +0 -5
  164. data/spec/dummy/db/migrate/20221115193605_change_users_at1668540964.rb +0 -5
  165. data/spec/dummy/db/migrate/20221115193637_change_users_at1668540996.rb +0 -5
  166. data/spec/dummy/db/migrate/20221115193642_change_users_at1668541001.rb +0 -5
  167. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-Y/-YOiiBKqc2UODHFjctm8xc7xFoZaL7zOjWQj6qQ2wyE.cache +0 -1
  168. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-d/-dwueM4vmPt8L51S3jeSyg_AjGDcj0GUN6pDpCA1gCg.cache +0 -3
  169. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0g/0gaJnJQdtd2ACbihXxn8OnjLWlDjnQ_WxfgOpbiLzhg.cache +0 -1
  170. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0r/0rFCsCV9kZnEYtZZ6sfig8329OU31bqjecDFqSVank8.cache +0 -1
  171. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/1J/1J2k_CpnQE3d-PZAQwOVGQALGkta4qVvhdsKjgG0e4Q.cache +0 -0
  172. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2p/2pYVH2Z_syqh6ok8QYxJNKxXpx1Iwppf6JGElZI0gpw.cache +0 -0
  173. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/3W/3WBmqd-2V6q5N-jvbyp-tlcfn3aHYMwBppbOUm7x4qg.cache +0 -1
  174. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/4K/4KFPlHkhdDW0riGUmlbaR-kmDz6JUnQvY6fwW8qsdaE.cache +0 -3
  175. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/6x/6xMeRWmLpNK_flx6-JA3KazvUxSCxyPxHv9Zm3eC26Q.cache +0 -1
  176. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/7d/7dNqI_dCDJLJmI1oM4xwFp9nRRNOem-4P4OD7PMyz2E.cache +0 -0
  177. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/8X/8XquhxVcp5A8QquLtxO8NgKTMJch0eqQmzFmRGIZP6I.cache +0 -1
  178. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ah/AhdfXXtU63kXS4TnsH2Vi1yWgVkIEeV8Z8XA68hrNQc.cache +0 -0
  179. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bt/BtAePnwLSGw82xUGI7wuhWDfuwarOQVS91YqCsweMcs.cache +0 -0
  180. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bx/BxzoG0KxeNLac4xTNeJv3qfeytbNBw58xj2zD-xdbrE.cache +0 -2
  181. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/CC/CCD0ROPX0yxHwNpVZmuP8ZNtgQpaVCMXpdzC0Wb5n24.cache +0 -1
  182. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/DS/DS43oxBg6K5PMWLn2mTy_4EnxI03ehHkxpjV7NCi8yM.cache +0 -1
  183. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Do/Do83AoOat5W-c1g7piDGy2GMmffsY6JY0Qfuh5PY3GM.cache +0 -2
  184. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EI/EI0Nxk-VRATWstMuVCVc0_GdYlQ-a0dx6n2g0l3vIik.cache +0 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EN/ENhJnzJAU2IK-7aHqubj9N8Jo_UTmjG_VEQqyIkolQ8.cache +0 -1
  186. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Fc/FcS6VUHN3Bd4pHGqd5NHA8jA4OLwWrU94s3b4GGxX9c.cache +0 -1
  187. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/G0/G0kukI-r0q0Vbrg6e_jnYJoYcOX8K__h-mwKbCf4twE.cache +0 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/I1/I1Jw08-mz8xzgrgi6giCzpf1UmzGTSbl4eJEw4DAoJM.cache +0 -1
  189. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/IV/IVOO1dXBmgjieDk__g57p6aYt0Z3CmfTa32jhegoyko.cache +0 -3
  190. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/JY/JYPmv5WP4wxdI9EKEEPkK_fVtqeSLfmint_5E8fQLQ8.cache +0 -1
  191. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/MX/MXI3KxaQPZGImSvCNZ_TbQVruWCJ3E0xiVxza1ZCAjM.cache +0 -1
  192. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/OU/OUoioCqXALK909jXPV3VSyCJIdNC7bsogUfdnRTpc5o.cache +0 -1
  193. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/PH/PHjtqNLUPAUDiSlu5AbPjlIo20mOGNm0uNjMLhX2NvM.cache +0 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RC/RC9vfALY5K634pTeau0BAhTHl7d5_5yA3tM-QTLiKtI.cache +0 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RG/RG1PrmlixwaUlG8BV0kcm_3F7OQekxsrLYjBdf403-k.cache +0 -2
  196. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ut/UtoMO6n6FHTpRCGk9VfxlfTI2Ao2GYJ_6kMzx3B9VH8.cache +0 -1
  197. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/VE/VExnbpDk3LxYdPk3htUrZQXPI8NK_zlKtSFfVXJlxU4.cache +0 -1
  198. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wm/WmKTjykiU-Tx_Faf5zduEeEQ-DozAs5omKToM2l1cZM.cache +0 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/X-/X-KjhDPd0nI155N_FaxFSgaOiYo0_ytqlmkBlLM7ayw.cache +0 -1
  200. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/XX/XXVhj-O91tJ5c8pz7DQlTABOv8TIRVg5haw9VOq9HuI.cache +0 -1
  201. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/YC/YCiifo5NCMwDChFqYFiV4EaYEx8hy3Efle1PsGbIdak.cache +0 -1
  202. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ya/YayMISAqD-Y3vBFywwKrXbUovGf5o77HUF5s8mnQgO0.cache +0 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Zl/Zl-NEb0aDLmZ9gN4gdY1OYlbUXD4JhkFY_y23m55zmo.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/_h/_hnjPptBeD3GP5B0iJR6pvyVkiMiq-o2TxaYmGf9KJo.cache +0 -3
  205. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/_p/_poEF6QbTPYJiQCFGoXxIXjmvcn6T0I87ElzJGHguk0.cache +0 -1
  206. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/aa/aaSj2zt8ddc87nZqTpOI9gRCKVnoalXKFBww7t4t3Kg.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/bZ/bZHWUkrOLp0WM_Ogo36Qjt4cxDt-rOFgtcj4LNB-BVE.cache +0 -1
  208. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/cP/cPSNG_663TNT944Rke919luRS6FtpMwVc_7aDph645w.cache +0 -1
  209. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ce/ceq8fcZGIoqWrCl9vrCRrywEdx42iy9PrGG9CwFSIF4.cache +0 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/cl/cljhP0Jc018nLnG1rpdg-FUf6mlIqrQYvXTNXTNG9Bw.cache +0 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dm/dmod3fTZdoKso2FGM5RTQtb4kTB6vywsiXLWDygYFN4.cache +0 -1
  212. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dy/dySDGcUTqlKx2MTvOmIEP-WzhyhCfU5xhN9qgxbz3rI.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gQ/gQYdmEzbLjTcFCnsfzXzEmeminOchF263snAk3IvXM0.cache +0 -1
  214. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gh/ghvuMAqccBGljlmEaI3Gt5tH5rEg6hseKYMYfRMkHdY.cache +0 -1
  215. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gt/gt8QC7k92A4hXA3HlCpQulW73tqd6x63I3uT-YrGMj0.cache +0 -1
  216. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/hf/hfVg-y7dPSQKbb7V3I7M5w7IpOhDiIB2H31d2tmbZMU.cache +0 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/iF/iFLwyhZIu1Jxm77NUT2qWeTDMmyELW4U85t9rGE_KVg.cache +0 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/kF/kFlIcBBnSyKE00OjpM90pqSn93mLMUv9esz86nrO-Cs.cache +0 -1
  219. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ma/MazNt_5OaYexRuZnccZZ_7AONlxn1a4W3KdWyHyBdws.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ma/ma3w08gnDTeqwY2-C9BlToxA6-AS8bvXlu-nBiz0UYs.cache +0 -1
  221. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +0 -2
  222. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +0 -2
  223. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/pv/pv6tV3CDkIAmLXdU8EPLlNEkXAKJPufVD4VP30o4fWo.cache +0 -0
  224. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/qP/qPmv5snMrDw830S6hSICDcnIy7kVEWoFKXhGKT38lG4.cache +0 -2
  225. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/sY/sYvTb1uPWWmnHJNXKuW_xSco-aUb-rN2f0J35zSIzuc.cache +0 -1
  226. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/su/suQ_jjDxRiIn4VEqFJYKaBWJILaeGKBvoTv49XNX0vo.cache +0 -1
  227. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/u8/u8IrW5IIQ7espwk2Vpk23zheL9YZA0tnbKq9X7E-WA0.cache +0 -1
  228. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/wh/whzETExjcZCkn4msasD2aylgfhfpKPZrNxTkY-SOIDg.cache +0 -2
  229. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7PYh8DJvPykcEqpVab2vcY9-GFz-3cqtoMlRAu94Uc.cache +0 -2
  230. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/y6/y6oxsJD3pAY9ph1_5M-77uiEjTVw8BheLZNygCKPm1g.cache +0 -1
  231. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/yH/yHZ-a1J23ZCf2n5mEHINMz23Iec2cLGTKauW7k4yGTE.cache +0 -0
  232. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/z7/z7KfUWYoSaGq8tQ5mbHwyfXyT3Pa4FWKJswHcIdJuds.cache +0 -1
  233. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/zu/zuExWc5WHxeOUPZUKHl9a9ZRmN50g7jMOD28macn6M0.cache +0 -0
  234. data/spec/lib/localtower/generators/relation_spec.rb +0 -65
@@ -0,0 +1,25 @@
1
+ module Localtower
2
+ module Generators
3
+ module ServiceObjects
4
+ class InsertArray
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def call
10
+ attributes.each do |attribute|
11
+ line_str = Localtower::Tools.line_for_attribute(attribute)[0]
12
+ if line_str.present?
13
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str, "#{line_str}, array: true")
14
+ File.write(Localtower::Tools.last_migration_pending, content)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :attributes
22
+ end
23
+ end
24
+ end
25
+ end
@@ -2,62 +2,104 @@ module Localtower
2
2
  module Generators
3
3
  module ServiceObjects
4
4
  class InsertDefaults
5
+ DEFAULTS = {
6
+ '(no default value)' => '',
7
+ "empty string ('')" => "''",
8
+ 'zero (0)' => '0',
9
+ 'true' => 'true',
10
+ 'false' => 'false',
11
+ 'empty array ([])' => '[]',
12
+ 'empty hash ({})' => '{}',
13
+ 'nil' => 'nil',
14
+ }
15
+
16
+ DEFAULT_VALUES = {
17
+ 'NULL' => { value: '', label: 'NULL', example: 'NULL' },
18
+ 'EMPTY_STRING' => { value: "''", label: 'Empty string', example: "''" },
19
+ 'NOW_DATETIME' => { value: "'now()'", label: 'Current datetime', example: 'now()' },
20
+ 'NOW_DATE' => { value: "'now()'", label: 'Current date', example: 'now()' },
21
+ 'ZERO' => { value: "0", label: 'Zero', example: '0' },
22
+ 'JSON' => { value: "{}", label: 'Empty JSON', example: '{}' }
23
+ }
24
+
25
+ DEFAULTS_BY_TYPE = {
26
+ string: [
27
+ DEFAULT_VALUES['NULL'],
28
+ DEFAULT_VALUES['EMPTY_STRING']
29
+ ],
30
+ text: [
31
+ DEFAULT_VALUES['NULL'],
32
+ DEFAULT_VALUES['EMPTY_STRING']
33
+ ],
34
+ datetime: [
35
+ DEFAULT_VALUES['NULL'],
36
+ DEFAULT_VALUES['NOW_DATETIME']
37
+ ],
38
+ date: [
39
+ DEFAULT_VALUES['NULL'],
40
+ DEFAULT_VALUES['NOW_DATE']
41
+ ],
42
+ uuid: [
43
+ DEFAULT_VALUES['NULL']
44
+ ],
45
+ integer: [
46
+ DEFAULT_VALUES['NULL'],
47
+ DEFAULT_VALUES['ZERO']
48
+ ],
49
+ bigint: [
50
+ DEFAULT_VALUES['NULL'],
51
+ DEFAULT_VALUES['ZERO']
52
+ ],
53
+ float: [
54
+ DEFAULT_VALUES['NULL'],
55
+ DEFAULT_VALUES['ZERO']
56
+ ],
57
+ numeric: [
58
+ DEFAULT_VALUES['NULL'],
59
+ DEFAULT_VALUES['ZERO']
60
+ ],
61
+ decimal: [
62
+ DEFAULT_VALUES['NULL'],
63
+ DEFAULT_VALUES['ZERO']
64
+ ],
65
+ json: [
66
+ DEFAULT_VALUES['NULL'],
67
+ DEFAULT_VALUES['JSON']
68
+ ],
69
+ jsonb: [
70
+ DEFAULT_VALUES['NULL'],
71
+ DEFAULT_VALUES['JSON']
72
+ ],
73
+ boolean: [
74
+ DEFAULT_VALUES['NULL'],
75
+ { value: 'true', label: 'True', example: 'true' },
76
+ { value: 'false', label: 'False', example: 'false' }
77
+ ],
78
+ array: [
79
+ DEFAULT_VALUES['NULL'],
80
+ { value: '[]', label: 'Empty array', example: '[]' }
81
+ ]
82
+ }
5
83
 
6
84
  def initialize(attributes)
7
85
  @attributes = attributes
8
86
  end
9
87
 
10
88
  def call
11
- insert_defaults
12
- end
13
-
14
- private
15
-
16
- attr_reader :attributes
17
-
18
- def insert_defaults
19
89
  attributes.each do |attribute|
20
90
  attribute.each do |attr_key, attr_value|
21
- process_migration_file(attr_key, attr_value)
91
+ line_str = Localtower::Tools.line_for_attribute(attr_key)[0]
92
+ if line_str.present?
93
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str, "#{line_str}, default: #{attr_value}")
94
+ File.write(Localtower::Tools.last_migration_pending, content)
95
+ end
22
96
  end
23
97
  end
24
- build_file(file_lines)
25
- end
26
-
27
- def process_migration_file(attr_key, attr_value)
28
- file_lines.map do |line|
29
- attach_default_value(line, attr_key, attr_value)
30
- end
31
98
  end
32
99
 
33
- def attach_default_value(line, attr_key, attr_value)
34
- if table_attribute_line?(line) and line.include? attr_key
35
- build_line(line, attr_value)
36
- else
37
- line
38
- end
39
- end
40
-
41
- def build_file(lines)
42
- File.open(latest_migration, 'w') { |f| f.puts lines }
43
- end
44
-
45
- def build_line(line, attr_value)
46
- line.gsub!("\n", "") << ", default: " << "#{attr_value}" << "\n"
47
- end
48
-
49
- def latest_migration
50
- @latest_migration ||= Dir["#{Rails.root}/db/migrate/*"].last
51
- end
52
-
53
- def file_lines
54
- @file_lines ||= File.readlines(latest_migration)
55
- end
56
-
57
- def table_attribute_line?(line)
58
- line.squish.start_with? "t."
59
- end
100
+ private
60
101
 
102
+ attr_reader :attributes
61
103
  end
62
104
  end
63
105
  end
@@ -0,0 +1,35 @@
1
+ module Localtower
2
+ module Generators
3
+ module ServiceObjects
4
+ class InsertForeignKeys
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def call
10
+ attributes.each do |attribute|
11
+ attribute.each do |attr_key, options|
12
+ line_str = Localtower::Tools.line_for_attribute(attr_key)[0]
13
+ if line_str.present?
14
+ if options['foreign_key'].present?
15
+ if line_str['foreign_key: true']
16
+ content = File.read(Localtower::Tools.last_migration_pending)
17
+ else
18
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str, "#{line_str}, foreign_key: true")
19
+ end
20
+ else
21
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str, line_str.gsub(', foreign_key: true', ''))
22
+ end
23
+ File.write(Localtower::Tools.last_migration_pending, content)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :attributes
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,103 @@
1
+ module Localtower
2
+ module Generators
3
+ module ServiceObjects
4
+ class InsertIndexes
5
+ USING = [
6
+ {
7
+ label: 'default',
8
+ name: 'default',
9
+ example: 'using: :btree'
10
+ },
11
+ {
12
+ name: 'hash',
13
+ example: 'using: :hash'
14
+ },
15
+ {
16
+ name: 'gin',
17
+ example: 'using: :gin'
18
+ },
19
+ {
20
+ name: 'gist',
21
+ example: 'using: :gist'
22
+ },
23
+ {
24
+ name: 'spgist',
25
+ example: 'using: :spgist'
26
+ },
27
+ {
28
+ name: 'brin',
29
+ example: 'using: :brin'
30
+ },
31
+ {
32
+ name: 'bloom',
33
+ example: 'using: :bloom'
34
+ }
35
+ ]
36
+
37
+ UNIQUE = [
38
+ false,
39
+ true
40
+ ]
41
+
42
+ ALGO = %w[
43
+ concurrently
44
+ ]
45
+
46
+ def initialize(attributes)
47
+ @attributes = attributes
48
+ end
49
+
50
+ def call
51
+ attributes.each do |attribute|
52
+ attribute.each do |attr_key, options|
53
+ line_str_original = File.read(Localtower::Tools.last_migration_pending).match(/((.*)add_index :(.*), :#{attr_key})/)[0]
54
+ line_str = line_str_original.clone
55
+
56
+ line_str = inser_using(line_str, options)
57
+ line_str = inser_algorithm(line_str, options)
58
+ line_str = inser_unique(line_str, options)
59
+
60
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str_original, line_str)
61
+ content = add_disable_ddl_transaction(content, options)
62
+
63
+ File.write(Localtower::Tools.last_migration_pending, content)
64
+ end
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ attr_reader :attributes
71
+
72
+ def inser_using(line_str, options)
73
+ return line_str if options['using'].blank?
74
+ return line_str if options['using'] == 'default'
75
+
76
+ line_str << ", using: :#{options['using']}"
77
+ end
78
+
79
+ def inser_unique(line_str, options)
80
+ return line_str if options['unique'].blank?
81
+
82
+ line_str << ", unique: true"
83
+ end
84
+
85
+ def inser_algorithm(line_str, options)
86
+ return line_str if options['algorithm'].blank?
87
+ return line_str if options['algorithm'] == 'default'
88
+
89
+ line_str << ", algorithm: :#{options['algorithm']}"
90
+ end
91
+
92
+ def add_disable_ddl_transaction(content, options)
93
+ return content if options['algorithm'] != 'concurrently'
94
+
95
+ # Add disable_ddl_transaction! if the algorythm is 'concurrently'
96
+ content = content.gsub(/^class (.*)$/, "class \\1\n disable_ddl_transaction!\n") if content['disable_ddl_transaction'].blank?
97
+
98
+ content
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,25 @@
1
+ module Localtower
2
+ module Generators
3
+ module ServiceObjects
4
+ class InsertNullable
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def call
10
+ attributes.each do |attribute|
11
+ line_str = Localtower::Tools.line_for_attribute(attribute)[0]
12
+ if line_str.present?
13
+ content = File.read(Localtower::Tools.last_migration_pending).gsub(line_str, "#{line_str}, null: false")
14
+ File.write(Localtower::Tools.last_migration_pending, content)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :attributes
22
+ end
23
+ end
24
+ end
25
+ end
@@ -8,20 +8,22 @@ module Localtower
8
8
  []
9
9
  end
10
10
 
11
- db_migrations = db_migrations.map { |e| e["version"].to_s }.sort.reverse
11
+ db_migrations = db_migrations.map { |e| e["version"].to_s }
12
12
 
13
13
  files.map do |file_full_path|
14
14
  name = file_full_path.split("/")[-1] # add_email_to_user.rb
15
15
  time = name.split("_")[0] # 201203890987
16
16
  status = db_migrations.include?(time) ? :done : :todo
17
17
  content = File.open(file_full_path).read
18
+ relative_path = file_full_path.gsub(Rails.root.to_s, '')
18
19
 
19
20
  {
20
21
  "file_full_path" => file_full_path,
21
22
  "name" => name,
22
23
  "time" => time.to_i,
23
24
  "status" => status,
24
- "content" => content
25
+ "content" => content,
26
+ "relative_path" => relative_path
25
27
  }
26
28
  end
27
29
  end
@@ -33,10 +33,6 @@ module Localtower
33
33
  root_klass.subclasses - [ActiveRecord::SchemaMigration]
34
34
  end
35
35
 
36
- def enought_models_for_relation?
37
- models.size >= 2
38
- end
39
-
40
36
  def models_presented
41
37
  self.force_reload!
42
38
 
@@ -72,6 +68,7 @@ module Localtower
72
68
 
73
69
  list << {
74
70
  name: model.name,
71
+ underscore: model.name.underscore,
75
72
  table_name: model.table_name,
76
73
  attributes_list: attributes_list,
77
74
  }
@@ -100,14 +97,14 @@ module Localtower
100
97
  list
101
98
  end
102
99
 
103
- def indexes_for_model_and_attribute(model, attribute_name)
100
+ def indexes_for_model_and_attribute(model, column_name)
104
101
  indexes = self.indexes_for_model(model)
105
102
 
106
103
  list = []
107
104
  done = []
108
105
 
109
106
  indexes.each do |index|
110
- conditions = index[:columns].include?(attribute_name.to_s) and not done.include?(index[:name])
107
+ conditions = index[:columns].include?(column_name.to_s) and not done.include?(index[:name])
111
108
  next unless conditions
112
109
  infos = {
113
110
  unique: index[:unique],
@@ -116,7 +113,7 @@ module Localtower
116
113
  max_size: index[:max_size]
117
114
  }
118
115
 
119
- done << attribute_name
116
+ done << column_name
120
117
  list << infos
121
118
  end
122
119
 
@@ -135,22 +132,18 @@ module Localtower
135
132
  end.flatten.uniq.sort
136
133
  end
137
134
 
138
- def perform_migration(str, standalone = false)
139
- self.perform_cmd("rails g migration #{str}", false)
140
-
141
- if not standalone
142
- self.perform_cmd('rake db:migrate')
143
- end
135
+ def perform_migration(str)
136
+ self.perform_cmd("rails g migration #{str}")
144
137
  end
145
138
 
146
- def perform_cmd(cmd_str, standalone = true)
147
- self.perform_raw_cmd("bundle exec #{cmd_str}", standalone)
139
+ def perform_cmd(cmd_str)
140
+ self.perform_raw_cmd("bundle exec #{cmd_str}")
148
141
  end
149
142
 
150
- def perform_raw_cmd(cmd_str, standalone = false, root_dir = false)
151
- root_dir ||= ::Rails.root
143
+ def perform_raw_cmd(cmd_str)
144
+ root_dir = ::Rails.root
152
145
 
153
- cmd = standalone ? cmd_str : "cd \"#{root_dir}\" && #{cmd_str}"
146
+ cmd = "cd \"#{root_dir}\" && #{cmd_str}"
154
147
  cmd = cmd.strip
155
148
 
156
149
  self.log("DOING...: #{cmd}")
@@ -174,17 +167,32 @@ module Localtower
174
167
  end
175
168
 
176
169
  def log_file
177
- Rails.root.join('log', 'localtower.log')
170
+ @log_file ||= Rails.root.join('log', 'localtower.log')
171
+ end
172
+
173
+ def last_migration_pending
174
+ last_not_run_migration = Localtower::Status.new.run.select {|i| i['status'] == :todo}.sort { |a, b| a['time'] <=> b['time'] }.last
175
+
176
+ return nil if last_not_run_migration.blank?
177
+ return nil unless File.exist?(last_not_run_migration["file_full_path"])
178
+
179
+
180
+ last_not_run_migration["file_full_path"]
181
+ end
182
+
183
+ def pending_migrations
184
+ Localtower::Status.new.run.select {|i| i['status'] == :todo}
185
+ end
186
+
187
+ def line_for_attribute(attribute)
188
+ (File.read(last_migration_pending).match(/^\s*t\.(.*)\s*:#{attribute}.*$/) || [])
178
189
  end
179
190
 
180
191
  # PRIVATE ==============
181
192
  def create_log
182
193
  return nil if File.exist?(self.log_file)
183
- File.open(self.log_file, 'w') { |f| f.write('') }
184
- end
185
194
 
186
- def word_in_file?(file, word_or_exp)
187
- File.readlines(file).grep(word_or_exp).size > 0
195
+ File.open(self.log_file, 'w') { |f| f.write('') }
188
196
  end
189
197
  end
190
198
  end
@@ -1,3 +1,3 @@
1
1
  module Localtower
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
data/lib/localtower.rb CHANGED
@@ -5,12 +5,6 @@ end
5
5
  require 'thor'
6
6
  require 'active_link_to'
7
7
 
8
- begin
9
- require "pry"
10
- rescue Exception => e
11
- # Nothing
12
- end
13
-
14
8
  root = File.expand_path(File.dirname(__FILE__))
15
9
  Dir["#{root}/localtower/*.rb"].sort.each { |file| require file }
16
10
  Dir["#{root}/localtower/*/**/*.rb"].each { |file| require file }
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ Downloaded from
2
+
3
+ www.Dfonts.org
4
+
5
+ Thousands of Premium Fonts For Free
@@ -0,0 +1,2 @@
1
+ [InternetShortcut]
2
+ URL=https://www.dfonts.org/