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,38 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <script src="https://cdn.tailwindcss.com"></script>
7
+ <script>
8
+ tailwind.config = {
9
+ theme: {
10
+ extend: {
11
+ colors: {
12
+ clifford: '#da373d',
13
+ }
14
+ }
15
+ }
16
+ }
17
+ </script>
18
+ <style type="text/tailwindcss">
19
+ @layer utilities {
20
+ .content-auto {
21
+ content-visibility: auto;
22
+ }
23
+
24
+ .nude {
25
+ @apply text-green-500;
26
+
27
+ }
28
+ }
29
+ </style>
30
+ </head>
31
+ <body>
32
+ <div class="container mx-auto">
33
+ <h1 class="nude text-3xl font-bold underline">
34
+ Hello world!
35
+ </h1>
36
+ </div>
37
+ </body>
38
+ </html>
@@ -0,0 +1 @@
1
+ o: ActiveSupport::Cache::Entry : @value{I"_csrf_token:EFI"0lL8I-pyCH1r3SMdncWhwIduEyks4pBVc7-soI0k1EZk;F:
@@ -0,0 +1 @@
1
+ 02af762a06facc66792a9b636fb7ee0c226fc6f337031fc08634b19ff73059ca9e3fb637fd3ce0595d39367e6d40f714ea56a3723bc6418f78978c788472f683
@@ -0,0 +1 @@
1
+ 19068
@@ -1,62 +1,45 @@
1
1
  FactoryBot.define do
2
- factory :create_table, class: "Hash" do
3
- migration_name { "Post" }
4
- migrations do
5
- [
6
- {
7
- action: "create_table",
8
- table_name: "posts"
9
- }
10
- ]
11
- end
12
- end
13
-
14
- factory :create_table_two, class: "Hash" do
15
- migration_name { "User" }
16
- migrations do
17
- [
18
- {
19
- action: "create_table",
20
- table_name: "users"
21
- }
22
- ]
23
- end
24
- end
25
-
26
2
  factory :add_column, class: "Hash" do
27
3
  migration_name { "Post" }
28
4
  migrations do
29
5
  [
30
6
  {
31
- action: "add_column",
7
+ action_name: "add_column",
8
+ model_name: "Post",
9
+ model_underscore: "post",
32
10
  table_name: "posts",
33
- column: "title",
11
+ column_name: "title",
34
12
  column_type: "string",
35
- index: true,
36
13
  nullable: true,
37
14
  },
38
15
  {
39
- action: "add_column",
16
+ action_name: "add_column",
17
+ model_name: "Post",
18
+ model_underscore: "post",
40
19
  table_name: "posts",
41
- column: "content",
20
+ column_name: "content",
42
21
  column_type: "text",
43
- index: false,
44
22
  nullable: true,
45
23
  },
46
24
  {
47
- action: "add_column",
25
+ action_name: "add_column",
26
+ model_name: "Post",
27
+ model_underscore: "post",
48
28
  table_name: "posts",
49
- column: "views",
29
+ column_name: "views",
50
30
  column_type: "integer",
51
31
  index: true,
52
- default: 0,
32
+ default: '0',
53
33
  nullable: false,
54
34
  },
55
35
  {
56
- action: "add_column",
36
+ action_name: "add_column",
37
+ model_name: "Post",
38
+ model_underscore: "post",
57
39
  table_name: "posts",
58
- column: "tags",
40
+ column_name: "tags",
59
41
  column_type: "array",
42
+ default: '[]',
60
43
  index: true,
61
44
  nullable: true,
62
45
  }
@@ -64,28 +47,16 @@ FactoryBot.define do
64
47
  end
65
48
  end
66
49
 
67
- factory :add_column_fail, class: "Hash" do
68
- migration_name { "Post" }
69
- migrations do
70
- [
71
- {
72
- action: "add_column",
73
- table_name: "posts",
74
- column: "title",
75
- # column_type: "string",
76
- }
77
- ]
78
- end
79
- end
80
-
81
50
  factory :rename_column, class: "Hash" do
82
51
  migration_name { "Post" }
83
52
  migrations do
84
53
  [
85
54
  {
86
- action: "rename_column",
55
+ action_name: "rename_column",
56
+ model_name: "Post",
57
+ model_underscore: "post",
87
58
  table_name: "posts",
88
- column: "content",
59
+ column_name: "content",
89
60
  new_column_name: "content_new",
90
61
  }
91
62
  ]
@@ -97,14 +68,18 @@ FactoryBot.define do
97
68
  migrations do
98
69
  [
99
70
  {
100
- action: "remove_column",
71
+ action_name: "remove_column",
72
+ model_name: "Post",
73
+ model_underscore: "post",
101
74
  table_name: "posts",
102
- column: "title",
75
+ column_name: "title",
103
76
  },
104
77
  {
105
- action: "rename_column",
78
+ action_name: "rename_column",
79
+ model_name: "Post",
80
+ model_underscore: "post",
106
81
  table_name: "posts",
107
- column: "views",
82
+ column_name: "views",
108
83
  new_column_name: "views_by_users",
109
84
  }
110
85
  ]
@@ -116,15 +91,20 @@ FactoryBot.define do
116
91
  migrations do
117
92
  [
118
93
  {
119
- action: "change_column_type",
94
+ action_name: "change_column_type",
95
+ model_name: "Post",
96
+ model_underscore: "post",
120
97
  table_name: "posts",
121
- column: "content_new",
98
+ column_name: "content_new",
122
99
  new_column_type: "string",
123
100
  },
124
101
  {
125
- action: "add_index_to_column",
102
+ action_name: "add_index_to_column",
103
+ model_name: "Post",
104
+ model_underscore: "post",
126
105
  table_name: "posts",
127
- column: "views_by_users",
106
+ column_name: "views_by_users",
107
+ index: "default"
128
108
  }
129
109
  ]
130
110
  end
@@ -135,9 +115,40 @@ FactoryBot.define do
135
115
  migrations do
136
116
  [
137
117
  {
138
- action: "add_index_to_column",
118
+ action_name: "add_column",
119
+ model_name: "Post",
120
+ model_underscore: "post",
139
121
  table_name: "posts",
140
- column: "content_new",
122
+ column_name: "content",
123
+ column_type: "text",
124
+ },
125
+ {
126
+ action_name: "add_index_to_column",
127
+ model_name: "Post",
128
+ model_underscore: "post",
129
+ table_name: "posts",
130
+ column_name: "content",
131
+ index: "default"
132
+ },
133
+ {
134
+ action_name: "add_index_to_column",
135
+ model_name: "Post",
136
+ model_underscore: "post",
137
+ table_name: "posts",
138
+ column_name: "content_second",
139
+ index: "default",
140
+ index_algorithm: '',
141
+ unique: true
142
+ },
143
+ {
144
+ action_name: "add_index_to_column",
145
+ model_name: "Post",
146
+ model_underscore: "post",
147
+ table_name: "posts",
148
+ column_name: "content_third",
149
+ index: "gin",
150
+ index_algorithm: 'concurrently',
151
+ unique: false
141
152
  }
142
153
  ]
143
154
  end
@@ -148,9 +159,13 @@ FactoryBot.define do
148
159
  migrations do
149
160
  [
150
161
  {
151
- action: "belongs_to",
162
+ action_name: "belongs_to",
163
+ model_name: "Post",
164
+ model_underscore: "post",
152
165
  table_name: "posts",
153
- belongs_to: "users",
166
+ column_name: "user",
167
+ foreign_key: true,
168
+ index: "default"
154
169
  }
155
170
  ]
156
171
  end
@@ -161,9 +176,13 @@ FactoryBot.define do
161
176
  migrations do
162
177
  [
163
178
  {
164
- action: "remove_index_to_column",
179
+ action_name: "remove_index_to_column",
180
+ model_name: "Post",
181
+ model_underscore: "post",
165
182
  table_name: "posts",
166
- column: "views_by_users",
183
+ column_name: "views_by_users",
184
+ index_name: "index_posts_on_views_by_users"
185
+
167
186
  }
168
187
  ]
169
188
  end
@@ -174,7 +193,9 @@ FactoryBot.define do
174
193
  migrations do
175
194
  [
176
195
  {
177
- action: "drop_table",
196
+ action_name: "drop_table",
197
+ model_name: "Post",
198
+ model_underscore: "post",
178
199
  table_name: "posts",
179
200
  }
180
201
  ]
@@ -1,40 +1,74 @@
1
1
  FactoryBot.define do
2
- factory :post_one, class: "Hash" do
3
- model_name { "Post" }
2
+ factory :post_one, class: Hash do
3
+ model_name { 'Post' }
4
4
  attributes do
5
5
  [
6
6
  {
7
- attribute_name: "title",
8
- attribute_type: "string",
9
- index: true
7
+ 'column_name' => 'title',
8
+ 'column_type' => 'string',
9
+ 'unique' => true,
10
+ 'index' => 'default',
11
+ 'index_algorithm' => 'default'
10
12
  },
11
13
  {
12
- attribute_name: "content",
13
- attribute_type: "text"
14
+ 'column_name' => 'tags',
15
+ 'column_type' => 'array',
16
+ 'nullable' => false,
17
+ 'default' => '[]',
18
+ 'index' => 'gin',
19
+ 'index_algorithm' => 'concurrently',
20
+ 'unique' => true
21
+ },
22
+ {
23
+ 'column_name' => 'content',
24
+ 'column_type' => 'text',
25
+ 'nullable' => false,
26
+ "index" => "gist",
27
+ "index_algorithm" => "default"
28
+ },
29
+ {
30
+ 'column_name' => 'likes_count',
31
+ 'column_type' => 'integer',
32
+ 'nullable' => true,
33
+ 'default' => '0',
34
+ },
35
+ {
36
+ 'column_name' => 'score',
37
+ 'column_type' => 'float',
38
+ },
39
+ {
40
+ 'column_name' => 'metadata',
41
+ 'column_type' => 'jsonb',
42
+ 'nullable' => false,
43
+ 'default' => '{}',
14
44
  },
15
45
  ]
16
46
  end
17
47
  end
18
48
 
19
- factory :user_one, class: "Hash" do
20
- model_name { "User" }
49
+ factory :post_two, class: "Hash" do
50
+ model_name { 'Post' }
21
51
  attributes do
22
52
  [
23
53
  {
24
- attribute_name: "name",
25
- attribute_type: "string",
26
- index: true,
27
- },
28
- {
29
- attribute_name: "metadata",
30
- attribute_type: "jsonb"
31
- },
54
+ 'column_name' => 'user',
55
+ 'column_type' => 'references',
56
+ 'foreign_key' => true
57
+ }
32
58
  ]
33
59
  end
34
60
  end
35
61
 
36
- factory :relation_one, class: "Hash" do
37
- model_one_name { "User" }
38
- model_two_name { "Post" }
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
39
73
  end
40
74
  end
@@ -3,111 +3,76 @@ require 'spec_helper'
3
3
  module Localtower
4
4
  module Generators
5
5
  describe Migration do
6
- before(:all) do
7
- clean_files
8
- end
9
-
10
- after(:all) do
11
- end
12
-
13
- it 'create_table' do
14
- data = attributes_for(:create_table)
15
- data["run_migrate"] = true
16
-
17
- generator = ::Localtower::Generators::Migration.new(data).run
18
-
19
- expect(::Localtower::Tools.word_in_file?(last_migration, /create_table :posts/)).to eq(true)
20
- end
21
-
22
- it 'create_table_two' do
23
- data = attributes_for(:create_table_two)
24
- data["run_migrate"] = true
25
-
26
- generator = ::Localtower::Generators::Migration.new(data).run
27
-
28
- expect(::Localtower::Tools.word_in_file?(last_migration, /create_table :users/)).to eq(true)
29
- end
30
-
31
6
  it 'add_column' do
32
- data = attributes_for(:add_column)
33
- data["run_migrate"] = true
7
+ data = attributes_for(:add_column)[:migrations]
34
8
 
35
9
  generator = ::Localtower::Generators::Migration.new(data).run
36
10
 
37
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :tags, :text, default: \[\], array: true/)).to eq(true)
38
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :tags, using: :gin/)).to eq(true)
39
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false, index: true/)).to eq(true)
40
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(true)
41
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :title, :string, index: true/)).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)
42
15
  end
43
16
 
44
- it 'add_column fail' do
45
- data = attributes_for(:add_column_fail)
46
- data["run_migrate"] = true
17
+ it 'remove_column' do
18
+ data = attributes_for(:remove_column)[:migrations]
47
19
 
48
20
  generator = ::Localtower::Generators::Migration.new(data).run
49
21
 
50
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :tags, :text, default: \[\], array: true/)).to eq(false)
51
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :tags, using: :gin/)).to eq(false)
52
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false, index: true/)).to eq(false)
53
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(false)
54
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :title, :string, index: true/)).to eq(false)
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)
55
24
  end
56
25
 
57
26
  it 'rename_column' do
58
- data = attributes_for(:rename_column)
59
- data["run_migrate"] = true
27
+ data = attributes_for(:rename_column)[:migrations]
60
28
 
61
29
  generator = ::Localtower::Generators::Migration.new(data).run
62
30
 
63
- expect(::Localtower::Tools.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)
64
32
  end
65
33
 
66
- it 'remove_column' do
67
- data = attributes_for(:remove_column)
68
- data["run_migrate"] = true
34
+ it 'change_column_type' do
35
+ data = attributes_for(:change_column_type)[:migrations]
69
36
 
70
37
  generator = ::Localtower::Generators::Migration.new(data).run
71
38
 
72
- expect(::Localtower::Tools.word_in_file?(last_migration, /remove_column :posts, :title/)).to eq(true)
73
- expect(::Localtower::Tools.word_in_file?(last_migration, /rename_column :posts, :views, :views_by_users/)).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)
74
41
  end
75
42
 
76
- it 'change_column_type' do
77
- data = attributes_for(:change_column_type)
78
- data["run_migrate"] = true
43
+ it 'add_index_to_column' do
44
+ data = attributes_for(:add_index_to_column)[:migrations]
79
45
 
80
46
  generator = ::Localtower::Generators::Migration.new(data).run
81
47
 
82
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :views_by_users/)).to eq(true)
83
- expect(::Localtower::Tools.word_in_file?(last_migration, /change_column :posts, :content_new, :string/)).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)
84
52
  end
85
53
 
86
- it 'add_index_to_column' do
87
- data = attributes_for(:add_index_to_column)
88
- data["run_migrate"] = true
54
+ it 'belongs_to' do
55
+ data = attributes_for(:belongs_to)[:migrations]
89
56
 
90
57
  generator = ::Localtower::Generators::Migration.new(data).run
91
58
 
92
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :content_new/)).to eq(true)
59
+ expect(word_in_file?(last_migration_pending, /add_reference :posts, :user, foreign_key: true, index: true/)).to eq(true)
93
60
  end
94
61
 
95
62
  it 'remove_index_to_column' do
96
- data = attributes_for(:remove_index_to_column)
97
- data["run_migrate"] = true
63
+ data = attributes_for(:remove_index_to_column)[:migrations]
98
64
 
99
65
  generator = ::Localtower::Generators::Migration.new(data).run
100
66
 
101
- expect(::Localtower::Tools.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)
102
68
  end
103
69
 
104
70
  it 'drop_table' do
105
- data = attributes_for(:drop_table)
106
- data["run_migrate"] = true
71
+ data = attributes_for(:drop_table)[:migrations]
107
72
 
108
73
  generator = ::Localtower::Generators::Migration.new(data).run
109
74
 
110
- expect(::Localtower::Tools.word_in_file?(last_migration, /drop_table :posts, force: :cascade/)).to eq(true)
75
+ expect(word_in_file?(last_migration_pending, /drop_table :posts/)).to eq(true)
111
76
  end
112
77
  end
113
78
  end
@@ -3,40 +3,112 @@ require 'spec_helper'
3
3
  module Localtower
4
4
  module Generators
5
5
  describe Model do
6
- before(:all) do
7
- clean_files
8
- end
6
+ context 'model 1' do
7
+ let(:expected_migration) do
8
+ <<-TEXT_MULTILINE.strip_heredoc
9
+ class CreatePosts < ActiveRecord::Migration[7.2]
10
+ disable_ddl_transaction!
11
+
12
+ def change
13
+ create_table :posts do |t|
14
+ t.string :title
15
+ t.string :tags, null: false, default: [], array: true
16
+ t.text :content, null: false
17
+ t.integer :likes_count, default: 0
18
+ t.float :score
19
+ t.jsonb :metadata, null: false, default: {}
20
+
21
+ t.timestamps
22
+ end
23
+ add_index :posts, :title, unique: true
24
+ add_index :posts, :tags, using: :gin, algorithm: :concurrently, unique: true
25
+ add_index :posts, :content, using: :gist
26
+ end
27
+ end
28
+ TEXT_MULTILINE
29
+ end
30
+
31
+ let(:expected_model) do
32
+ <<-TEXT_MULTILINE.strip_heredoc
33
+ class Post < ApplicationRecord
34
+ end
35
+ TEXT_MULTILINE
36
+ end
37
+
38
+ let(:attributes) { attributes_for(:post_one).deep_stringify_keys }
39
+
40
+ it 'create a post' do
41
+ ::Localtower::Generators::Model.new(attributes).run
9
42
 
10
- after(:all) do
43
+ expect(File.read("#{Rails.root}/app/models/post.rb")).to eq(expected_model)
44
+ expect(File.read(last_migration_pending)).to eq(expected_migration)
45
+ end
11
46
  end
12
47
 
13
- it 'create a post' do
14
- data = attributes_for(:post_one)
15
- data["run_migrate"] = true
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
16
55
 
17
- ::Localtower::Generators::Model.new(data).run
56
+ t.timestamps
57
+ end
58
+ end
59
+ end
60
+ TEXT_MULTILINE
61
+ end
18
62
 
19
- expect(File.exist?("#{Rails.root}/app/models/post.rb")).to eq(true)
20
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/app/models/post.rb", /class Post/)).to eq(true)
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
21
70
 
22
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /create_table "posts"/)).to eq(true)
23
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.string(.*)"title"/)).to eq(true)
24
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.text(.*)"content"/)).to eq(true)
25
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.index(.*)\["title"\], name: "index_posts_on_title"/)).to eq(true)
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
26
79
  end
27
80
 
28
- it 'create a user' do
29
- data = attributes_for(:user_one)
30
- data["run_migrate"] = true
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 }
31
105
 
32
- ::Localtower::Generators::Model.new(data).run
106
+ it 'create a post' do
107
+ ::Localtower::Generators::Model.new(attributes).run
33
108
 
34
- expect(File.exist?("#{Rails.root}/app/models/user.rb")).to eq(true)
35
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/app/models/user.rb", /class User/)).to eq(true)
36
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /create_table "users"/)).to eq(true)
37
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.string(.*)"name"/)).to eq(true)
38
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.jsonb(.*)"metadata"/)).to eq(true)
39
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.index(.*)\["name"\], name: "index_users_on_name"/)).to eq(true)
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)
111
+ end
40
112
  end
41
113
  end
42
114
  end