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,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Localtower::Generators::ServiceObjects::InsertArray do
4
+ let(:service) { described_class.new(attributes) }
5
+
6
+ let(:attributes) {
7
+ ['tags']
8
+ }
9
+
10
+ let(:base_file_content) {
11
+ <<-MIGRATION.strip_heredoc
12
+ class CreateTests < ActiveRecord::Migration[7.0]
13
+ def change
14
+ create_table :tests do |t|
15
+ t.string :tags
16
+
17
+ t.timestamps
18
+ end
19
+ end
20
+ end
21
+ MIGRATION
22
+ }
23
+
24
+ let(:expected_file_content) {
25
+ <<-MIGRATION.strip_heredoc
26
+ class CreateTests < ActiveRecord::Migration[7.0]
27
+ def change
28
+ create_table :tests do |t|
29
+ t.string :tags, array: true
30
+
31
+ t.timestamps
32
+ end
33
+ end
34
+ end
35
+ MIGRATION
36
+ }
37
+
38
+ before do
39
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
40
+ end
41
+
42
+ it 'works' do
43
+ service.call
44
+
45
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
46
+ end
47
+ end
@@ -1,32 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ::Localtower::Generators::ServiceObjects::InsertDefaults do
4
-
5
- let(:latest_migration) do
6
- Tempfile.new('foo').tap do |file|
7
- file.puts base_file_content
8
- file.rewind
9
- end
10
- end
4
+ let(:service) { described_class.new(attributes) }
11
5
 
12
6
  let(:attributes) {
13
7
  [
14
- { 'first' => "true" },
15
- { 'third' => "nil" },
8
+ { 'first' => "true" },
9
+ { 'third' => "nil" },
16
10
  { 'fourth' => "false" },
17
- { 'fifth' => "0" }
11
+ { 'foo' => "{}" },
12
+ { 'fifth' => "0" }
18
13
  ]
19
14
  }
20
15
 
21
16
  let(:base_file_content) {
22
17
  <<-MIGRATION.strip_heredoc
23
- class CreateTests < ActiveRecord::Migration[5.0]
18
+ class CreateTests < ActiveRecord::Migration[7.0]
24
19
  def change
25
20
  create_table :tests do |t|
26
21
  t.string :first
27
22
  t.integer :second
28
23
  t.string :third
29
24
  t.string :fourth
25
+ t.jsonb :foo
30
26
  t.integer :fifth
31
27
 
32
28
  t.timestamps
@@ -37,34 +33,33 @@ describe ::Localtower::Generators::ServiceObjects::InsertDefaults do
37
33
  MIGRATION
38
34
  }
39
35
 
40
- let(:expected_file_structure_array) {
41
- [
42
- "class CreateTests < ActiveRecord::Migration[5.0]\n",
43
- " def change\n",
44
- " create_table :tests do |t|\n",
45
- " t.string :first, default: true\n",
46
- " t.integer :second\n",
47
- " t.string :third, default: nil\n",
48
- " t.string :fourth, default: false\n",
49
- " t.integer :fifth, default: 0\n",
50
- "\n",
51
- " t.timestamps\n",
52
- " end\n",
53
- " add_index :tests, :first\n",
54
- " end\n",
55
- "end\n"
56
- ]
57
- }
36
+ let(:expected_file_content) {
37
+ <<-MIGRATION.strip_heredoc
38
+ class CreateTests < ActiveRecord::Migration[7.0]
39
+ def change
40
+ create_table :tests do |t|
41
+ t.string :first, default: true
42
+ t.integer :second
43
+ t.string :third, default: nil
44
+ t.string :fourth, default: false
45
+ t.jsonb :foo, default: {}
46
+ t.integer :fifth, default: 0
58
47
 
59
- let(:service) { described_class.new(attributes) }
48
+ t.timestamps
49
+ end
50
+ add_index :tests, :first
51
+ end
52
+ end
53
+ MIGRATION
54
+ }
60
55
 
61
56
  before do
62
- allow(service).to receive(:latest_migration).and_return(latest_migration)
63
- service.call
57
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
64
58
  end
65
59
 
66
- it 'inserts default values for attributes' do
67
- lines_array = File.readlines(latest_migration)
68
- expect(lines_array).to match_array expected_file_structure_array
60
+ it 'works' do
61
+ service.call
62
+
63
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
69
64
  end
70
65
  end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Localtower::Generators::ServiceObjects::InsertForeignKeys do
4
+ let(:service) { described_class.new(attributes) }
5
+
6
+ before do
7
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
8
+ end
9
+
10
+ context "when foreign_key is true" do
11
+ let(:attributes) {
12
+ [
13
+ { 'user' =>
14
+ {
15
+ 'foreign_key' => true,
16
+ }
17
+ },
18
+ ]
19
+ }
20
+
21
+ let(:base_file_content) {
22
+ <<-MIGRATION.strip_heredoc
23
+ class CreatePosts < ActiveRecord::Migration[7.2]
24
+ def change
25
+ create_table :posts do |t|
26
+ t.references :user, null: false
27
+
28
+ t.timestamps
29
+ end
30
+ end
31
+ end
32
+ MIGRATION
33
+ }
34
+
35
+ let(:expected_file_content) {
36
+ <<-MIGRATION.strip_heredoc
37
+ class CreatePosts < ActiveRecord::Migration[7.2]
38
+ def change
39
+ create_table :posts do |t|
40
+ t.references :user, null: false, foreign_key: true
41
+
42
+ t.timestamps
43
+ end
44
+ end
45
+ end
46
+ MIGRATION
47
+ }
48
+
49
+ it 'works' do
50
+ service.call
51
+
52
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
53
+ end
54
+ end
55
+
56
+ context "when foreign_key is false" do
57
+ let(:attributes) {
58
+ [
59
+ { 'user' =>
60
+ {
61
+ 'foreign_key' => false,
62
+ }
63
+ },
64
+ ]
65
+ }
66
+
67
+ let(:base_file_content) {
68
+ <<-MIGRATION.strip_heredoc
69
+ class CreatePosts < ActiveRecord::Migration[7.2]
70
+ def change
71
+ create_table :posts do |t|
72
+ t.references :user, null: false, foreign_key: true
73
+
74
+ t.timestamps
75
+ end
76
+ end
77
+ end
78
+ MIGRATION
79
+ }
80
+
81
+ let(:expected_file_content) {
82
+ <<-MIGRATION.strip_heredoc
83
+ class CreatePosts < ActiveRecord::Migration[7.2]
84
+ def change
85
+ create_table :posts do |t|
86
+ t.references :user, null: false
87
+
88
+ t.timestamps
89
+ end
90
+ end
91
+ end
92
+ MIGRATION
93
+ }
94
+
95
+ it 'works' do
96
+ service.call
97
+
98
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Localtower::Generators::ServiceObjects::InsertIndexes do
4
+ let(:service) { described_class.new(attributes) }
5
+
6
+ let(:attributes) {
7
+ [
8
+ { 'first' =>
9
+ {
10
+ 'using' => 'gin',
11
+ 'algorithm' => 'concurrently',
12
+ }
13
+ },
14
+ { 'third' =>
15
+ {
16
+ 'using' => 'gist',
17
+ 'unique' => true,
18
+ }
19
+ },
20
+ { 'fourth' =>
21
+ {
22
+ 'using' => 'default',
23
+ 'algorithm' => 'concurrently',
24
+ }
25
+ },
26
+ { 'fifth' =>
27
+ {
28
+ 'using' => 'default',
29
+ 'unique' => true,
30
+ }
31
+ }
32
+ ]
33
+ }
34
+
35
+ let(:base_file_content) {
36
+ <<-MIGRATION.strip_heredoc
37
+ class CreateTests < ActiveRecord::Migration[7.0]
38
+ def change
39
+ create_table :tests do |t|
40
+ t.string :zero
41
+ t.string :first
42
+ t.string :third
43
+ t.string :fourth
44
+ t.integer :fifth
45
+
46
+ t.timestamps
47
+ end
48
+ add_index :tests, :first
49
+ add_index :tests, :third
50
+ add_index :tests, :fourth
51
+ add_index :tests, :fifth
52
+ end
53
+ end
54
+ MIGRATION
55
+ }
56
+
57
+ let(:expected_file_content) {
58
+ <<-MIGRATION.strip_heredoc
59
+ class CreateTests < ActiveRecord::Migration[7.0]
60
+ disable_ddl_transaction!
61
+
62
+ def change
63
+ create_table :tests do |t|
64
+ t.string :zero
65
+ t.string :first
66
+ t.string :third
67
+ t.string :fourth
68
+ t.integer :fifth
69
+
70
+ t.timestamps
71
+ end
72
+ add_index :tests, :first, using: :gin, algorithm: :concurrently
73
+ add_index :tests, :third, using: :gist, unique: true
74
+ add_index :tests, :fourth, algorithm: :concurrently
75
+ add_index :tests, :fifth, unique: true
76
+ end
77
+ end
78
+ MIGRATION
79
+ }
80
+
81
+ before do
82
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
83
+ end
84
+
85
+ it 'works' do
86
+ service.call
87
+
88
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
89
+ end
90
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Localtower::Generators::ServiceObjects::InsertNullable do
4
+ let(:service) { described_class.new(attributes) }
5
+
6
+ let(:attributes) {
7
+ [
8
+ 'first',
9
+ 'third',
10
+ 'fourth'
11
+ ]
12
+ }
13
+
14
+ let(:base_file_content) {
15
+ <<-MIGRATION.strip_heredoc
16
+ class CreateTests < ActiveRecord::Migration[7.0]
17
+ def change
18
+ create_table :tests do |t|
19
+ t.string :first
20
+ t.integer :second
21
+ t.string :third
22
+ t.string :fourth, default: 'foo'
23
+ t.integer :fifth
24
+
25
+ t.timestamps
26
+ end
27
+ add_index :tests, :first
28
+ end
29
+ end
30
+ MIGRATION
31
+ }
32
+
33
+ let(:expected_file_content) {
34
+ <<-MIGRATION.strip_heredoc
35
+ class CreateTests < ActiveRecord::Migration[7.0]
36
+ def change
37
+ create_table :tests do |t|
38
+ t.string :first, null: false
39
+ t.integer :second
40
+ t.string :third, null: false
41
+ t.string :fourth, default: 'foo', null: false
42
+ t.integer :fifth
43
+
44
+ t.timestamps
45
+ end
46
+ add_index :tests, :first
47
+ end
48
+ end
49
+ MIGRATION
50
+ }
51
+
52
+ before do
53
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
54
+ end
55
+
56
+ it 'works' do
57
+ service.call
58
+
59
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
60
+ end
61
+ end
@@ -1,14 +1,4 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Localtower::Tools do
4
- before(:each) do
5
- end
6
-
7
- after(:all) do
8
- end
9
-
10
- # TODO:
11
- it 'list models' do
12
- models = ::Localtower::Tools.models_presented
13
- end
3
+ RSpec.describe Localtower::Tools do
14
4
  end
data/spec/spec_helper.rb CHANGED
@@ -16,17 +16,23 @@ end
16
16
  f.write(content_schema)
17
17
  end
18
18
 
19
- Dir["#{Rails.root}/app/models/**/*.*"].each { |model_file| File.delete(model_file) }
19
+ Dir["#{Rails.root}/app/models/**/*.*"]
20
+ .reject { |file_name| file_name['application_record.rb']}
21
+ .each { |model_file| File.delete(model_file) }
20
22
  end
21
23
 
22
24
  def migration_files
23
25
  Dir["#{Rails.root}/db/migrate/*"]
24
26
  end
25
27
 
26
- def last_migration
28
+ def last_migration_pending
27
29
  migration_files.sort.last
28
30
  end
29
31
 
32
+ def word_in_file?(file, word_or_exp)
33
+ File.readlines(file).grep(word_or_exp).size > 0
34
+ end
35
+
30
36
  #============================
31
37
  ENV['RAILS_ENV'] = 'test'
32
38
 
@@ -43,15 +49,13 @@ RSpec.configure do |config|
43
49
  config.mock_with :rspec
44
50
  config.use_transactional_fixtures = false
45
51
  config.infer_base_class_for_anonymous_controllers = true
46
-
47
- config.order = 123
48
- # config.order = 'random'
52
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
49
53
 
50
54
  config.before(:suite) do
51
55
  FactoryBot.find_definitions
52
56
  end
53
57
 
54
- config.before(:all) do
58
+ config.before(:each) do
55
59
  clean_files
56
60
  end
57
61