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