localtower 1.0.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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +121 -33
  3. data/app/assets/stylesheets/application.css +68 -0
  4. data/app/controllers/localtower/pages_controller.rb +20 -35
  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 +80 -66
  12. data/app/views/localtower/_migration.html.erb +30 -0
  13. data/app/views/localtower/pages/_alert_no_models.html.erb +1 -1
  14. data/app/views/localtower/pages/migrations.html.erb +24 -55
  15. data/app/views/localtower/pages/new_migration.html.erb +33 -96
  16. data/app/views/localtower/pages/new_model.html.erb +17 -83
  17. data/config/routes.rb +1 -1
  18. data/lib/localtower/engine.rb +5 -2
  19. data/lib/localtower/generators/migration.rb +218 -91
  20. data/lib/localtower/generators/model.rb +29 -20
  21. data/lib/localtower/generators/service_objects/insert_array.rb +5 -3
  22. data/lib/localtower/generators/service_objects/insert_defaults.rb +73 -3
  23. data/lib/localtower/generators/service_objects/insert_foreign_keys.rb +35 -0
  24. data/lib/localtower/generators/service_objects/insert_indexes.rb +41 -18
  25. data/lib/localtower/generators/service_objects/insert_nullable.rb +5 -3
  26. data/lib/localtower/status.rb +3 -1
  27. data/lib/localtower/tools.rb +20 -9
  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 -1
  86. data/spec/dummy/Gemfile.lock +140 -102
  87. data/spec/dummy/app/models/user.rb +0 -1
  88. data/spec/dummy/config/database.yml +4 -6
  89. data/spec/dummy/config/puma.rb +1 -1
  90. data/spec/dummy/db/migrate/20241118233214_create_users.rb +9 -0
  91. data/spec/dummy/db/migrate/20241118233233_add_column_titme_for_user.rb +6 -0
  92. data/spec/dummy/db/schema.rb +3 -19
  93. data/spec/dummy/lib/tasks/reset.rake +16 -0
  94. data/spec/dummy/log/development.log +20995 -15969
  95. data/spec/dummy/log/localtower.log +588 -1906
  96. data/spec/dummy/log/test.log +716 -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 -1
  102. data/spec/factories/migration.rb +77 -40
  103. data/spec/factories/model.rb +46 -26
  104. data/spec/lib/localtower/generators/migration_spec.rb +16 -24
  105. data/spec/lib/localtower/generators/model_spec.rb +71 -8
  106. data/spec/lib/localtower/generators/service_objects/insert_array_spec.rb +1 -1
  107. data/spec/lib/localtower/generators/service_objects/insert_defaults_spec.rb +1 -1
  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 +1 -1
  110. data/spec/lib/localtower/generators/service_objects/insert_nullable_spec.rb +2 -2
  111. data/spec/spec_helper.rb +2 -3
  112. metadata +111 -234
  113. data/app/views/localtower/pages/models.html.erb +0 -63
  114. data/public/css/app.css +0 -55
  115. data/public/js/app.js +0 -337
  116. data/public/light-bootstrap-dashboard-master/assets/css/animate.min.css +0 -6
  117. data/public/light-bootstrap-dashboard-master/assets/css/bootstrap.min.css +0 -5
  118. data/public/light-bootstrap-dashboard-master/assets/css/demo.css +0 -61
  119. data/public/light-bootstrap-dashboard-master/assets/css/light-bootstrap-dashboard.css +0 -2789
  120. data/public/light-bootstrap-dashboard-master/assets/css/pe-icon-7-stroke.css +0 -632
  121. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.eot +0 -0
  122. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.svg +0 -212
  123. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.ttf +0 -0
  124. data/public/light-bootstrap-dashboard-master/assets/fonts/Pe-icon-7-stroke.woff +0 -0
  125. data/public/light-bootstrap-dashboard-master/assets/img/default-avatar.png +0 -0
  126. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-0.jpg +0 -0
  127. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-1.jpg +0 -0
  128. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-2.jpg +0 -0
  129. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-3.jpg +0 -0
  130. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-4.jpg +0 -0
  131. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-5.jpg +0 -0
  132. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-6.jpg +0 -0
  133. data/public/light-bootstrap-dashboard-master/assets/img/faces/face-7.jpg +0 -0
  134. data/public/light-bootstrap-dashboard-master/assets/img/faces/tim_vector.jpe +0 -0
  135. data/public/light-bootstrap-dashboard-master/assets/img/favicon.ico +0 -0
  136. data/public/light-bootstrap-dashboard-master/assets/img/loading-bubbles.svg +0 -14
  137. data/public/light-bootstrap-dashboard-master/assets/img/mask.png +0 -0
  138. data/public/light-bootstrap-dashboard-master/assets/img/new_logo.png +0 -0
  139. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-1.jpg +0 -0
  140. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-2.jpg +0 -0
  141. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-3.jpg +0 -0
  142. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-4.jpg +0 -0
  143. data/public/light-bootstrap-dashboard-master/assets/img/sidebar-5.jpg +0 -0
  144. data/public/light-bootstrap-dashboard-master/assets/img/tim_80x80.png +0 -0
  145. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-checkbox-radio-switch.js +0 -502
  146. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-notify.js +0 -404
  147. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap-select.js +0 -438
  148. data/public/light-bootstrap-dashboard-master/assets/js/bootstrap.min.js +0 -7
  149. data/public/light-bootstrap-dashboard-master/assets/js/chartist.min.js +0 -9
  150. data/public/light-bootstrap-dashboard-master/assets/js/demo.js +0 -152
  151. data/public/light-bootstrap-dashboard-master/assets/js/jquery-1.10.2.js +0 -9789
  152. data/public/light-bootstrap-dashboard-master/assets/js/light-bootstrap-dashboard.js +0 -179
  153. data/public/logo-localtower-white-300.png +0 -0
  154. data/public/logo-localtower-white.png +0 -0
  155. data/public/logo-localtower.png +0 -0
  156. data/public/vendor/font-awesome.min.css +0 -4
  157. data/public/vendor/highlight-js-default.min.css +0 -9
  158. data/spec/dummy/app/models/post.rb +0 -3
  159. data/spec/dummy/db/migrate/20230119221452_create_users.rb +0 -14
  160. data/spec/dummy/db/migrate/20230119221751_change_users_at1674166670.rb +0 -7
  161. data/spec/dummy/db/migrate/20230119222054_create_posts.rb +0 -11
  162. data/spec/dummy/db/migrate/20230119222106_change_posts_at1674166865.rb +0 -5
  163. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-Y/-YOiiBKqc2UODHFjctm8xc7xFoZaL7zOjWQj6qQ2wyE.cache +0 -1
  164. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-d/-dwueM4vmPt8L51S3jeSyg_AjGDcj0GUN6pDpCA1gCg.cache +0 -3
  165. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0g/0gaJnJQdtd2ACbihXxn8OnjLWlDjnQ_WxfgOpbiLzhg.cache +0 -1
  166. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0r/0rFCsCV9kZnEYtZZ6sfig8329OU31bqjecDFqSVank8.cache +0 -1
  167. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/1J/1J2k_CpnQE3d-PZAQwOVGQALGkta4qVvhdsKjgG0e4Q.cache +0 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2p/2pYVH2Z_syqh6ok8QYxJNKxXpx1Iwppf6JGElZI0gpw.cache +0 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/3W/3WBmqd-2V6q5N-jvbyp-tlcfn3aHYMwBppbOUm7x4qg.cache +0 -1
  170. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/4K/4KFPlHkhdDW0riGUmlbaR-kmDz6JUnQvY6fwW8qsdaE.cache +0 -3
  171. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/6x/6xMeRWmLpNK_flx6-JA3KazvUxSCxyPxHv9Zm3eC26Q.cache +0 -1
  172. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/7d/7dNqI_dCDJLJmI1oM4xwFp9nRRNOem-4P4OD7PMyz2E.cache +0 -0
  173. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/8X/8XquhxVcp5A8QquLtxO8NgKTMJch0eqQmzFmRGIZP6I.cache +0 -1
  174. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ah/AhdfXXtU63kXS4TnsH2Vi1yWgVkIEeV8Z8XA68hrNQc.cache +0 -0
  175. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bt/BtAePnwLSGw82xUGI7wuhWDfuwarOQVS91YqCsweMcs.cache +0 -0
  176. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bx/BxzoG0KxeNLac4xTNeJv3qfeytbNBw58xj2zD-xdbrE.cache +0 -2
  177. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/CC/CCD0ROPX0yxHwNpVZmuP8ZNtgQpaVCMXpdzC0Wb5n24.cache +0 -1
  178. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/DS/DS43oxBg6K5PMWLn2mTy_4EnxI03ehHkxpjV7NCi8yM.cache +0 -1
  179. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Do/Do83AoOat5W-c1g7piDGy2GMmffsY6JY0Qfuh5PY3GM.cache +0 -2
  180. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EI/EI0Nxk-VRATWstMuVCVc0_GdYlQ-a0dx6n2g0l3vIik.cache +0 -0
  181. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EN/ENhJnzJAU2IK-7aHqubj9N8Jo_UTmjG_VEQqyIkolQ8.cache +0 -1
  182. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Fc/FcS6VUHN3Bd4pHGqd5NHA8jA4OLwWrU94s3b4GGxX9c.cache +0 -1
  183. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/G0/G0kukI-r0q0Vbrg6e_jnYJoYcOX8K__h-mwKbCf4twE.cache +0 -0
  184. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/I1/I1Jw08-mz8xzgrgi6giCzpf1UmzGTSbl4eJEw4DAoJM.cache +0 -1
  185. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/IV/IVOO1dXBmgjieDk__g57p6aYt0Z3CmfTa32jhegoyko.cache +0 -3
  186. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/JY/JYPmv5WP4wxdI9EKEEPkK_fVtqeSLfmint_5E8fQLQ8.cache +0 -1
  187. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/MX/MXI3KxaQPZGImSvCNZ_TbQVruWCJ3E0xiVxza1ZCAjM.cache +0 -1
  188. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/OU/OUoioCqXALK909jXPV3VSyCJIdNC7bsogUfdnRTpc5o.cache +0 -1
  189. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/PH/PHjtqNLUPAUDiSlu5AbPjlIo20mOGNm0uNjMLhX2NvM.cache +0 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RC/RC9vfALY5K634pTeau0BAhTHl7d5_5yA3tM-QTLiKtI.cache +0 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RG/RG1PrmlixwaUlG8BV0kcm_3F7OQekxsrLYjBdf403-k.cache +0 -2
  192. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ut/UtoMO6n6FHTpRCGk9VfxlfTI2Ao2GYJ_6kMzx3B9VH8.cache +0 -1
  193. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/VE/VExnbpDk3LxYdPk3htUrZQXPI8NK_zlKtSFfVXJlxU4.cache +0 -1
  194. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wm/WmKTjykiU-Tx_Faf5zduEeEQ-DozAs5omKToM2l1cZM.cache +0 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/X-/X-KjhDPd0nI155N_FaxFSgaOiYo0_ytqlmkBlLM7ayw.cache +0 -1
  196. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/XX/XXVhj-O91tJ5c8pz7DQlTABOv8TIRVg5haw9VOq9HuI.cache +0 -1
  197. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/YC/YCiifo5NCMwDChFqYFiV4EaYEx8hy3Efle1PsGbIdak.cache +0 -1
  198. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ya/YayMISAqD-Y3vBFywwKrXbUovGf5o77HUF5s8mnQgO0.cache +0 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Zl/Zl-NEb0aDLmZ9gN4gdY1OYlbUXD4JhkFY_y23m55zmo.cache +0 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/_h/_hnjPptBeD3GP5B0iJR6pvyVkiMiq-o2TxaYmGf9KJo.cache +0 -3
  201. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/_p/_poEF6QbTPYJiQCFGoXxIXjmvcn6T0I87ElzJGHguk0.cache +0 -1
  202. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/aa/aaSj2zt8ddc87nZqTpOI9gRCKVnoalXKFBww7t4t3Kg.cache +0 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/bZ/bZHWUkrOLp0WM_Ogo36Qjt4cxDt-rOFgtcj4LNB-BVE.cache +0 -1
  204. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/cP/cPSNG_663TNT944Rke919luRS6FtpMwVc_7aDph645w.cache +0 -1
  205. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ce/ceq8fcZGIoqWrCl9vrCRrywEdx42iy9PrGG9CwFSIF4.cache +0 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/cl/cljhP0Jc018nLnG1rpdg-FUf6mlIqrQYvXTNXTNG9Bw.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dm/dmod3fTZdoKso2FGM5RTQtb4kTB6vywsiXLWDygYFN4.cache +0 -1
  208. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dy/dySDGcUTqlKx2MTvOmIEP-WzhyhCfU5xhN9qgxbz3rI.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gQ/gQYdmEzbLjTcFCnsfzXzEmeminOchF263snAk3IvXM0.cache +0 -1
  210. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gh/ghvuMAqccBGljlmEaI3Gt5tH5rEg6hseKYMYfRMkHdY.cache +0 -1
  211. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gt/gt8QC7k92A4hXA3HlCpQulW73tqd6x63I3uT-YrGMj0.cache +0 -1
  212. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/hf/hfVg-y7dPSQKbb7V3I7M5w7IpOhDiIB2H31d2tmbZMU.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/iF/iFLwyhZIu1Jxm77NUT2qWeTDMmyELW4U85t9rGE_KVg.cache +0 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/kF/kFlIcBBnSyKE00OjpM90pqSn93mLMUv9esz86nrO-Cs.cache +0 -1
  215. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ma/MazNt_5OaYexRuZnccZZ_7AONlxn1a4W3KdWyHyBdws.cache +0 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/ma/ma3w08gnDTeqwY2-C9BlToxA6-AS8bvXlu-nBiz0UYs.cache +0 -1
  217. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +0 -2
  218. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +0 -2
  219. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/pv/pv6tV3CDkIAmLXdU8EPLlNEkXAKJPufVD4VP30o4fWo.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/qP/qPmv5snMrDw830S6hSICDcnIy7kVEWoFKXhGKT38lG4.cache +0 -2
  221. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/sY/sYvTb1uPWWmnHJNXKuW_xSco-aUb-rN2f0J35zSIzuc.cache +0 -1
  222. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/su/suQ_jjDxRiIn4VEqFJYKaBWJILaeGKBvoTv49XNX0vo.cache +0 -1
  223. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/u8/u8IrW5IIQ7espwk2Vpk23zheL9YZA0tnbKq9X7E-WA0.cache +0 -1
  224. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/wh/whzETExjcZCkn4msasD2aylgfhfpKPZrNxTkY-SOIDg.cache +0 -2
  225. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7PYh8DJvPykcEqpVab2vcY9-GFz-3cqtoMlRAu94Uc.cache +0 -2
  226. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/y6/y6oxsJD3pAY9ph1_5M-77uiEjTVw8BheLZNygCKPm1g.cache +0 -1
  227. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/yH/yHZ-a1J23ZCf2n5mEHINMz23Iec2cLGTKauW7k4yGTE.cache +0 -0
  228. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/z7/z7KfUWYoSaGq8tQ5mbHwyfXyT3Pa4FWKJswHcIdJuds.cache +0 -1
  229. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/zu/zuExWc5WHxeOUPZUKHl9a9ZRmN50g7jMOD28macn6M0.cache +0 -0
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry : @value{I"_csrf_token:EFI"0lL8I-pyCH1r3SMdncWhwIduEyks4pBVc7-soI0k1EZk;F:
@@ -0,0 +1 @@
1
+ 02af762a06facc66792a9b636fb7ee0c226fc6f337031fc08634b19ff73059ca9e3fb637fd3ce0595d39367e6d40f714ea56a3723bc6418f78978c788472f683
@@ -1 +1 @@
1
- 67242
1
+ 19068
@@ -4,33 +4,42 @@ FactoryBot.define do
4
4
  migrations do
5
5
  [
6
6
  {
7
- action: "add_column",
7
+ action_name: "add_column",
8
+ model_name: "Post",
9
+ model_underscore: "post",
8
10
  table_name: "posts",
9
- column: "title",
11
+ column_name: "title",
10
12
  column_type: "string",
11
13
  nullable: true,
12
14
  },
13
15
  {
14
- action: "add_column",
16
+ action_name: "add_column",
17
+ model_name: "Post",
18
+ model_underscore: "post",
15
19
  table_name: "posts",
16
- column: "content",
20
+ column_name: "content",
17
21
  column_type: "text",
18
22
  nullable: true,
19
23
  },
20
24
  {
21
- action: "add_column",
25
+ action_name: "add_column",
26
+ model_name: "Post",
27
+ model_underscore: "post",
22
28
  table_name: "posts",
23
- column: "views",
29
+ column_name: "views",
24
30
  column_type: "integer",
25
31
  index: true,
26
- default: 0,
32
+ default: '0',
27
33
  nullable: false,
28
34
  },
29
35
  {
30
- action: "add_column",
36
+ action_name: "add_column",
37
+ model_name: "Post",
38
+ model_underscore: "post",
31
39
  table_name: "posts",
32
- column: "tags",
40
+ column_name: "tags",
33
41
  column_type: "array",
42
+ default: '[]',
34
43
  index: true,
35
44
  nullable: true,
36
45
  }
@@ -43,9 +52,11 @@ FactoryBot.define do
43
52
  migrations do
44
53
  [
45
54
  {
46
- action: "rename_column",
55
+ action_name: "rename_column",
56
+ model_name: "Post",
57
+ model_underscore: "post",
47
58
  table_name: "posts",
48
- column: "content",
59
+ column_name: "content",
49
60
  new_column_name: "content_new",
50
61
  }
51
62
  ]
@@ -57,14 +68,18 @@ FactoryBot.define do
57
68
  migrations do
58
69
  [
59
70
  {
60
- action: "remove_column",
71
+ action_name: "remove_column",
72
+ model_name: "Post",
73
+ model_underscore: "post",
61
74
  table_name: "posts",
62
- column: "title",
75
+ column_name: "title",
63
76
  },
64
77
  {
65
- action: "rename_column",
78
+ action_name: "rename_column",
79
+ model_name: "Post",
80
+ model_underscore: "post",
66
81
  table_name: "posts",
67
- column: "views",
82
+ column_name: "views",
68
83
  new_column_name: "views_by_users",
69
84
  }
70
85
  ]
@@ -76,15 +91,20 @@ FactoryBot.define do
76
91
  migrations do
77
92
  [
78
93
  {
79
- action: "change_column_type",
94
+ action_name: "change_column_type",
95
+ model_name: "Post",
96
+ model_underscore: "post",
80
97
  table_name: "posts",
81
- column: "content_new",
98
+ column_name: "content_new",
82
99
  new_column_type: "string",
83
100
  },
84
101
  {
85
- action: "add_index_to_column",
102
+ action_name: "add_index_to_column",
103
+ model_name: "Post",
104
+ model_underscore: "post",
86
105
  table_name: "posts",
87
- column: "views_by_users",
106
+ column_name: "views_by_users",
107
+ index: "default"
88
108
  }
89
109
  ]
90
110
  end
@@ -95,33 +115,40 @@ FactoryBot.define do
95
115
  migrations do
96
116
  [
97
117
  {
98
- action: "add_column",
118
+ action_name: "add_column",
119
+ model_name: "Post",
120
+ model_underscore: "post",
99
121
  table_name: "posts",
100
- column: "content",
122
+ column_name: "content",
101
123
  column_type: "text",
102
124
  },
103
125
  {
104
- action: "add_index_to_column",
126
+ action_name: "add_index_to_column",
127
+ model_name: "Post",
128
+ model_underscore: "post",
105
129
  table_name: "posts",
106
- column: "content",
130
+ column_name: "content",
131
+ index: "default"
107
132
  },
108
133
  {
109
- action: "add_index_to_column",
134
+ action_name: "add_index_to_column",
135
+ model_name: "Post",
136
+ model_underscore: "post",
110
137
  table_name: "posts",
111
- column: "content_second",
112
- index: {
113
- using: 'default',
114
- unique: true,
115
- }
138
+ column_name: "content_second",
139
+ index: "default",
140
+ index_algorithm: '',
141
+ unique: true
116
142
  },
117
143
  {
118
- action: "add_index_to_column",
144
+ action_name: "add_index_to_column",
145
+ model_name: "Post",
146
+ model_underscore: "post",
119
147
  table_name: "posts",
120
- column: "content_third",
121
- index: {
122
- using: 'gin',
123
- algorithm: 'concurrently',
124
- }
148
+ column_name: "content_third",
149
+ index: "gin",
150
+ index_algorithm: 'concurrently',
151
+ unique: false
125
152
  }
126
153
  ]
127
154
  end
@@ -132,9 +159,13 @@ FactoryBot.define do
132
159
  migrations do
133
160
  [
134
161
  {
135
- action: "belongs_to",
162
+ action_name: "belongs_to",
163
+ model_name: "Post",
164
+ model_underscore: "post",
136
165
  table_name: "posts",
137
- belongs_to: "users",
166
+ column_name: "user",
167
+ foreign_key: true,
168
+ index: "default"
138
169
  }
139
170
  ]
140
171
  end
@@ -145,9 +176,13 @@ FactoryBot.define do
145
176
  migrations do
146
177
  [
147
178
  {
148
- action: "remove_index_to_column",
179
+ action_name: "remove_index_to_column",
180
+ model_name: "Post",
181
+ model_underscore: "post",
149
182
  table_name: "posts",
150
- column: "views_by_users",
183
+ column_name: "views_by_users",
184
+ index_name: "index_posts_on_views_by_users"
185
+
151
186
  }
152
187
  ]
153
188
  end
@@ -158,7 +193,9 @@ FactoryBot.define do
158
193
  migrations do
159
194
  [
160
195
  {
161
- action: "drop_table",
196
+ action_name: "drop_table",
197
+ model_name: "Post",
198
+ model_underscore: "post",
162
199
  table_name: "posts",
163
200
  }
164
201
  ]
@@ -4,51 +4,71 @@ FactoryBot.define do
4
4
  attributes do
5
5
  [
6
6
  {
7
- 'attribute_name' => 'title',
8
- 'attribute_type' => 'string',
9
- 'index' => {
10
- 'using' => 'default',
11
- 'unique' => true,
12
- 'algorithm' => 'default',
13
- }
7
+ 'column_name' => 'title',
8
+ 'column_type' => 'string',
9
+ 'unique' => true,
10
+ 'index' => 'default',
11
+ 'index_algorithm' => 'default'
14
12
  },
15
13
  {
16
- 'attribute_name' => 'tags',
17
- 'attribute_type' => 'array',
14
+ 'column_name' => 'tags',
15
+ 'column_type' => 'array',
18
16
  'nullable' => false,
19
17
  'default' => '[]',
20
- 'index' => {
21
- 'using' => 'gin',
22
- 'unique' => true,
23
- 'algorithm' => 'concurrently',
24
- }
18
+ 'index' => 'gin',
19
+ 'index_algorithm' => 'concurrently',
20
+ 'unique' => true
25
21
  },
26
22
  {
27
- 'attribute_name' => 'content',
28
- 'attribute_type' => 'text',
23
+ 'column_name' => 'content',
24
+ 'column_type' => 'text',
29
25
  'nullable' => false,
30
- 'index' => {
31
- 'using' => 'gist',
32
- 'algorithm' => 'default',
33
- }
26
+ "index" => "gist",
27
+ "index_algorithm" => "default"
34
28
  },
35
29
  {
36
- 'attribute_name' => 'likes_count',
37
- 'attribute_type' => 'integer',
30
+ 'column_name' => 'likes_count',
31
+ 'column_type' => 'integer',
38
32
  'nullable' => true,
39
33
  'default' => '0',
40
34
  },
41
35
  {
42
- 'attribute_name' => 'score',
43
- 'attribute_type' => 'float',
36
+ 'column_name' => 'score',
37
+ 'column_type' => 'float',
44
38
  },
45
39
  {
46
- 'attribute_name' => 'metadata',
47
- 'attribute_type' => 'jsonb',
40
+ 'column_name' => 'metadata',
41
+ 'column_type' => 'jsonb',
48
42
  'nullable' => false,
49
43
  'default' => '{}',
50
44
  },
51
45
  ]
52
46
  end
53
47
  end
48
+
49
+ factory :post_two, class: "Hash" do
50
+ model_name { 'Post' }
51
+ attributes do
52
+ [
53
+ {
54
+ 'column_name' => 'user',
55
+ 'column_type' => 'references',
56
+ 'foreign_key' => true
57
+ }
58
+ ]
59
+ end
60
+ end
61
+
62
+ factory :post_three, class: "Hash" do
63
+ model_name { 'Post' }
64
+ attributes do
65
+ [
66
+ {
67
+ 'column_name' => 'user',
68
+ 'column_type' => 'references',
69
+ 'foreign_key' => false
70
+ }
71
+ ]
72
+ end
73
+ end
54
74
  end
@@ -8,10 +8,10 @@ module Localtower
8
8
 
9
9
  generator = ::Localtower::Generators::Migration.new(data).run
10
10
 
11
- expect(word_in_file?(last_migration, /add_column :posts, :tags, :string, default: \[\], array: true/)).to eq(true)
12
- expect(word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false/)).to eq(true)
13
- expect(word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(true)
14
- expect(word_in_file?(last_migration, /add_column :posts, :title, :string/)).to eq(true)
11
+ expect(word_in_file?(last_migration_pending, /add_column :posts, :title, :string/)).to eq(true)
12
+ expect(word_in_file?(last_migration_pending, /add_column :posts, :content, :text/)).to eq(true)
13
+ expect(word_in_file?(last_migration_pending, /add_column :posts, :views, :integer, default: 0, null: false/)).to eq(true)
14
+ expect(word_in_file?(last_migration_pending, /add_column :posts, :tags, :string, default: \[\], array: true/)).to eq(true)
15
15
  end
16
16
 
17
17
  it 'remove_column' do
@@ -19,8 +19,8 @@ module Localtower
19
19
 
20
20
  generator = ::Localtower::Generators::Migration.new(data).run
21
21
 
22
- expect(word_in_file?(last_migration, /remove_column :posts, :title/)).to eq(true)
23
- expect(word_in_file?(last_migration, /rename_column :posts, :views, :views_by_users/)).to eq(true)
22
+ expect(word_in_file?(last_migration_pending, /remove_column :posts, :title/)).to eq(true)
23
+ expect(word_in_file?(last_migration_pending, /rename_column :posts, :views, :views_by_users/)).to eq(true)
24
24
  end
25
25
 
26
26
  it 'rename_column' do
@@ -28,7 +28,7 @@ module Localtower
28
28
 
29
29
  generator = ::Localtower::Generators::Migration.new(data).run
30
30
 
31
- expect(word_in_file?(last_migration, /rename_column :posts, :content, :content_new/)).to eq(true)
31
+ expect(word_in_file?(last_migration_pending, /rename_column :posts, :content, :content_new/)).to eq(true)
32
32
  end
33
33
 
34
34
  it 'change_column_type' do
@@ -36,8 +36,8 @@ module Localtower
36
36
 
37
37
  generator = ::Localtower::Generators::Migration.new(data).run
38
38
 
39
- expect(word_in_file?(last_migration, /add_index :posts, :views_by_users/)).to eq(true)
40
- expect(word_in_file?(last_migration, /change_column :posts, :content_new, :string/)).to eq(true)
39
+ expect(word_in_file?(last_migration_pending, /add_index :posts, :views_by_users/)).to eq(true)
40
+ expect(word_in_file?(last_migration_pending, /change_column :posts, :content_new, :string/)).to eq(true)
41
41
  end
42
42
 
43
43
  it 'add_index_to_column' do
@@ -45,26 +45,18 @@ module Localtower
45
45
 
46
46
  generator = ::Localtower::Generators::Migration.new(data).run
47
47
 
48
- expect(word_in_file?(last_migration, /disable_ddl_transaction!/)).to eq(true)
49
- expect(word_in_file?(last_migration, /add_index :posts, :content/)).to eq(true)
50
- expect(word_in_file?(last_migration, /add_index :posts, :content_second, unique: true/)).to eq(true)
51
- expect(word_in_file?(last_migration, /add_index :posts, :content_third, using: :gin, algorithm: :concurrently/)).to eq(true)
48
+ expect(word_in_file?(last_migration_pending, /disable_ddl_transaction!/)).to eq(true)
49
+ expect(word_in_file?(last_migration_pending, /add_index :posts, :content/)).to eq(true)
50
+ expect(word_in_file?(last_migration_pending, /add_index :posts, :content_second, unique: true/)).to eq(true)
51
+ expect(word_in_file?(last_migration_pending, /add_index :posts, :content_third, using: :gin, algorithm: :concurrently/)).to eq(true)
52
52
  end
53
53
 
54
54
  it 'belongs_to' do
55
55
  data = attributes_for(:belongs_to)[:migrations]
56
56
 
57
- model_post = "#{Rails.root}/app/models/post.rb"
58
- model_user = "#{Rails.root}/app/models/user.rb"
59
-
60
- File.open(model_post, 'w') { |f| f.write("class Post < ApplicationRecord\nend")}
61
- File.open(model_user, 'w') { |f| f.write("class User < ApplicationRecord\nend")}
62
-
63
57
  generator = ::Localtower::Generators::Migration.new(data).run
64
58
 
65
- expect(word_in_file?(model_post, /# belongs_to :user/)).to eq(true)
66
- expect(word_in_file?(model_user, /# has_many :posts/)).to eq(true)
67
- expect(word_in_file?(last_migration, /add_reference :posts, :user, foreign_key: true, index: true/)).to eq(true)
59
+ expect(word_in_file?(last_migration_pending, /add_reference :posts, :user, foreign_key: true, index: true/)).to eq(true)
68
60
  end
69
61
 
70
62
  it 'remove_index_to_column' do
@@ -72,7 +64,7 @@ module Localtower
72
64
 
73
65
  generator = ::Localtower::Generators::Migration.new(data).run
74
66
 
75
- expect(word_in_file?(last_migration, /remove_index :posts, :views_by_users/)).to eq(true)
67
+ expect(word_in_file?(last_migration_pending, /remove_index :posts, name: :index_posts_on_views_by_users/)).to eq(true)
76
68
  end
77
69
 
78
70
  it 'drop_table' do
@@ -80,7 +72,7 @@ module Localtower
80
72
 
81
73
  generator = ::Localtower::Generators::Migration.new(data).run
82
74
 
83
- expect(word_in_file?(last_migration, /drop_table :posts/)).to eq(true)
75
+ expect(word_in_file?(last_migration_pending, /drop_table :posts/)).to eq(true)
84
76
  end
85
77
  end
86
78
  end
@@ -6,26 +6,23 @@ module Localtower
6
6
  context 'model 1' do
7
7
  let(:expected_migration) do
8
8
  <<-TEXT_MULTILINE.strip_heredoc
9
- class CreatePosts < ActiveRecord::Migration[5.2]
9
+ class CreatePosts < ActiveRecord::Migration[7.2]
10
10
  disable_ddl_transaction!
11
11
 
12
12
  def change
13
13
  create_table :posts do |t|
14
14
  t.string :title
15
- t.string :tags, array: true, default: [], null: false
15
+ t.string :tags, null: false, default: [], array: true
16
16
  t.text :content, null: false
17
17
  t.integer :likes_count, default: 0
18
18
  t.float :score
19
- t.jsonb :metadata, default: {}, null: false
19
+ t.jsonb :metadata, null: false, default: {}
20
20
 
21
21
  t.timestamps
22
22
  end
23
23
  add_index :posts, :title, unique: true
24
- add_index :posts, :tags, using: :gin, unique: true, algorithm: :concurrently
24
+ add_index :posts, :tags, using: :gin, algorithm: :concurrently, unique: true
25
25
  add_index :posts, :content, using: :gist
26
- add_index :posts, :likes_count
27
- add_index :posts, :score
28
- add_index :posts, :metadata
29
26
  end
30
27
  end
31
28
  TEXT_MULTILINE
@@ -44,7 +41,73 @@ module Localtower
44
41
  ::Localtower::Generators::Model.new(attributes).run
45
42
 
46
43
  expect(File.read("#{Rails.root}/app/models/post.rb")).to eq(expected_model)
47
- expect(File.read(last_migration)).to eq(expected_migration)
44
+ expect(File.read(last_migration_pending)).to eq(expected_migration)
45
+ end
46
+ end
47
+
48
+ context 'model 2' do
49
+ let(:expected_migration) do
50
+ <<-TEXT_MULTILINE.strip_heredoc
51
+ class CreatePosts < ActiveRecord::Migration[7.2]
52
+ def change
53
+ create_table :posts do |t|
54
+ t.references :user, null: false, foreign_key: true
55
+
56
+ t.timestamps
57
+ end
58
+ end
59
+ end
60
+ TEXT_MULTILINE
61
+ end
62
+
63
+ let(:expected_model) do
64
+ <<-TEXT_MULTILINE.strip_heredoc
65
+ class Post < ApplicationRecord
66
+ belongs_to :user
67
+ end
68
+ TEXT_MULTILINE
69
+ end
70
+
71
+ let(:attributes) { attributes_for(:post_two).deep_stringify_keys }
72
+
73
+ it 'create a post' do
74
+ ::Localtower::Generators::Model.new(attributes).run
75
+
76
+ expect(File.read("#{Rails.root}/app/models/post.rb")).to eq(expected_model)
77
+ expect(File.read(last_migration_pending)).to eq(expected_migration)
78
+ end
79
+ end
80
+
81
+ context 'model 3' do
82
+ let(:expected_migration) do
83
+ <<-TEXT_MULTILINE.strip_heredoc
84
+ class CreatePosts < ActiveRecord::Migration[7.2]
85
+ def change
86
+ create_table :posts do |t|
87
+ t.references :user, null: false
88
+
89
+ t.timestamps
90
+ end
91
+ end
92
+ end
93
+ TEXT_MULTILINE
94
+ end
95
+
96
+ let(:expected_model) do
97
+ <<-TEXT_MULTILINE.strip_heredoc
98
+ class Post < ApplicationRecord
99
+ belongs_to :user
100
+ end
101
+ TEXT_MULTILINE
102
+ end
103
+
104
+ let(:attributes) { attributes_for(:post_three).deep_stringify_keys }
105
+
106
+ it 'create a post' do
107
+ ::Localtower::Generators::Model.new(attributes).run
108
+
109
+ expect(File.read("#{Rails.root}/app/models/post.rb")).to eq(expected_model)
110
+ expect(File.read(last_migration_pending)).to eq(expected_migration)
48
111
  end
49
112
  end
50
113
  end
@@ -42,6 +42,6 @@ describe ::Localtower::Generators::ServiceObjects::InsertArray do
42
42
  it 'works' do
43
43
  service.call
44
44
 
45
- expect(File.read(last_migration)).to eq(expected_file_content)
45
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
46
46
  end
47
47
  end
@@ -60,6 +60,6 @@ describe ::Localtower::Generators::ServiceObjects::InsertDefaults do
60
60
  it 'works' do
61
61
  service.call
62
62
 
63
- expect(File.read(last_migration)).to eq(expected_file_content)
63
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
64
64
  end
65
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
@@ -85,6 +85,6 @@ describe ::Localtower::Generators::ServiceObjects::InsertIndexes do
85
85
  it 'works' do
86
86
  service.call
87
87
 
88
- expect(File.read(last_migration)).to eq(expected_file_content)
88
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
89
89
  end
90
90
  end
@@ -38,7 +38,7 @@ describe ::Localtower::Generators::ServiceObjects::InsertNullable do
38
38
  t.string :first, null: false
39
39
  t.integer :second
40
40
  t.string :third, null: false
41
- t.string :fourth, null: false, default: 'foo'
41
+ t.string :fourth, default: 'foo', null: false
42
42
  t.integer :fifth
43
43
 
44
44
  t.timestamps
@@ -56,6 +56,6 @@ describe ::Localtower::Generators::ServiceObjects::InsertNullable do
56
56
  it 'works' do
57
57
  service.call
58
58
 
59
- expect(File.read(last_migration)).to eq(expected_file_content)
59
+ expect(File.read(last_migration_pending)).to eq(expected_file_content)
60
60
  end
61
61
  end