From cdb2cb40918c999bf0e3d926b0c116cc473a45cb Mon Sep 17 00:00:00 2001 From: Younhun Kim Date: Thu, 27 Mar 2025 17:50:41 -0400 Subject: [PATCH 1/4] * added crate name to table prefix (appcrate__model); value is derived from CARGO_PKG_NAME. * updated cot-cli to add the crate name to the table prefix in migration files (directly encoded into ModelInSource struct in the loop that parses .rs migration files) * updated database names in unit tests (cot/tests/db.rs, cot-cli/tests, etc.) as well as test migration files to adhere to this format. --- cot-cli/src/migration_generator.rs | 8 +++-- cot-cli/tests/migration_generator.rs | 24 ++++++------- cot-macros/src/model.rs | 15 ++++++-- cot/src/auth/db/migrations/m_0001_initial.rs | 4 +-- cot/src/db.rs | 2 +- cot/tests/db.rs | 35 ++++++++++--------- .../src/migrations/m_0001_initial.rs | 4 +-- 7 files changed, 54 insertions(+), 38 deletions(-) diff --git a/cot-cli/src/migration_generator.rs b/cot-cli/src/migration_generator.rs index 680197d4a..a13a144b8 100644 --- a/cot-cli/src/migration_generator.rs +++ b/cot-cli/src/migration_generator.rs @@ -281,7 +281,9 @@ impl MigrationGenerator { let args = Self::model_args_from_attr(&path, attr)?; let model_in_source = - ModelInSource::from_item(item, &args, &symbol_resolver)?; + ModelInSource::from_item( + self.crate_name.as_str(), item, &args, &symbol_resolver + )?; match args.model_type { ModelType::Application => { @@ -890,6 +892,7 @@ pub struct ModelInSource { impl ModelInSource { fn from_item( + app_name: &str, item: syn::ItemStruct, args: &ModelArgs, symbol_resolver: &SymbolResolver, @@ -897,7 +900,8 @@ impl ModelInSource { let input: syn::DeriveInput = item.clone().into(); let opts = ModelOpts::new_from_derive_input(&input) .map_err(|e| anyhow::anyhow!("cannot parse model: {}", e))?; - let model = opts.as_model(args, symbol_resolver)?; + let mut model = opts.as_model(args, symbol_resolver)?; + model.table_name = format!("{}__{}", app_name, model.table_name); Ok(Self { model_item: item, diff --git a/cot-cli/tests/migration_generator.rs b/cot-cli/tests/migration_generator.rs index b538ef3cf..745e7a993 100644 --- a/cot-cli/tests/migration_generator.rs +++ b/cot-cli/tests/migration_generator.rs @@ -26,11 +26,11 @@ fn create_model_state_test() { assert!(migration.dependencies.is_empty()); let (table_name, fields) = unwrap_create_model(&migration.operations[0]); - assert_eq!(table_name, "parent"); + assert_eq!(table_name, "cot__parent"); assert_eq!(fields.len(), 1); let (table_name, fields) = unwrap_create_model(&migration.operations[1]); - assert_eq!(table_name, "my_model"); + assert_eq!(table_name, "cot__my_model"); assert_eq!(fields.len(), 4); let field = &fields[0]; @@ -74,11 +74,11 @@ fn create_models_foreign_key() { // Parent must be created before Child let (table_name, fields) = unwrap_create_model(&migration.operations[0]); - assert_eq!(table_name, "parent"); + assert_eq!(table_name, "cot__parent"); assert_eq!(fields.len(), 1); let (table_name, fields) = unwrap_create_model(&migration.operations[1]); - assert_eq!(table_name, "child"); + assert_eq!(table_name, "cot__child"); assert_eq!(fields.len(), 2); let field = &fields[0]; @@ -110,15 +110,15 @@ fn create_models_foreign_key_cycle() { // Parent must be created before Child let (table_name, fields) = unwrap_create_model(&migration.operations[0]); - assert_eq!(table_name, "parent"); + assert_eq!(table_name, "cot__parent"); assert_eq!(fields.len(), 1); let (table_name, fields) = unwrap_create_model(&migration.operations[1]); - assert_eq!(table_name, "child"); + assert_eq!(table_name, "cot__child"); assert_eq!(fields.len(), 2); let (table_name, field) = unwrap_add_field(&migration.operations[2]); - assert_eq!(table_name, "parent"); + assert_eq!(table_name, "cot__parent"); assert_eq!(field.field_name, "child"); } @@ -144,7 +144,7 @@ fn create_models_foreign_key_two_migrations() { assert_eq!(migration.dependencies.len(), 2); assert!(migration.dependencies.contains(&DynDependency::Migration { - app: "my_crate".to_string(), + app: "cot".to_string(), migration: "m_0001_initial".to_string() })); assert!(migration.dependencies.contains(&DynDependency::Model { @@ -154,7 +154,7 @@ fn create_models_foreign_key_two_migrations() { assert_eq!(migration.operations.len(), 1); let (table_name, _fields) = unwrap_create_model(&migration.operations[0]); - assert_eq!(table_name, "child"); + assert_eq!(table_name, "cot__child"); } /// Test that the migration generator can generate a "create model" migration @@ -199,9 +199,9 @@ fn write_migrations_module() { let generator = MigrationGenerator::new( PathBuf::from("Cargo.toml"), - String::from("my_crate"), + String::from("cot"), MigrationGeneratorOptions { - app_name: Some("my_crate".to_string()), + app_name: Some("cot".to_string()), output_dir: Some(tempdir.path().to_path_buf()), }, ); @@ -304,7 +304,7 @@ fn list_migrations_missing_migrations_dir() { fn test_generator() -> MigrationGenerator { MigrationGenerator::new( PathBuf::from("Cargo.toml"), - String::from("my_crate"), + String::from("cot"), MigrationGeneratorOptions::default(), ) } diff --git a/cot-macros/src/model.rs b/cot-macros/src/model.rs index c75eb51d6..57b5307c0 100644 --- a/cot-macros/src/model.rs +++ b/cot-macros/src/model.rs @@ -1,6 +1,7 @@ -use cot_codegen::model::{Field, Model, ModelArgs, ModelOpts}; +use cot_codegen::model::{Field, Model, ModelArgs, ModelOpts, ModelType}; use darling::FromMeta; use darling::ast::NestedMeta; +use heck::ToSnakeCase; use proc_macro2::{Ident, TokenStream}; use quote::{ToTokens, TokenStreamExt, format_ident, quote}; use syn::Token; @@ -69,6 +70,7 @@ fn remove_helper_field_attributes(fields: &mut syn::Fields) -> &Punctuated Self { let field_count = model.field_count(); + let app_name = std::env::var("CARGO_PKG_NAME").unwrap(); + let table_name = match model.model_type { + ModelType::Internal => model.table_name, + _ => format!("{}__{}", app_name.to_snake_case(), model.table_name.to_snake_case()), + }; let mut model_builder = Self { + app_name: app_name, name: model.name.clone(), vis: model.vis, - table_name: model.table_name, + table_name: table_name, pk_field: model.pk_field.clone(), fields_struct_name: format_ident!("{}Fields", model.name), fields_as_columns: Vec::with_capacity(field_count), @@ -150,6 +158,7 @@ impl ModelBuilder { let orm_ident = orm_ident(); let name = &self.name; + let app_name = &self.app_name; let table_name = &self.table_name; let fields_struct_name = &self.fields_struct_name; let fields_as_columns = &self.fields_as_columns; @@ -170,7 +179,7 @@ impl ModelBuilder { const COLUMNS: &'static [#orm_ident::Column] = &[ #(#fields_as_columns,)* ]; - const APP_NAME: &'static str = env!("CARGO_PKG_NAME"); + const APP_NAME: &'static str = #app_name; const TABLE_NAME: #orm_ident::Identifier = #orm_ident::Identifier::new(#table_name); const PRIMARY_KEY_NAME: #orm_ident::Identifier = #orm_ident::Identifier::new(#pk_column_name); diff --git a/cot/src/auth/db/migrations/m_0001_initial.rs b/cot/src/auth/db/migrations/m_0001_initial.rs index 1c5ace6be..8277d8ca1 100644 --- a/cot/src/auth/db/migrations/m_0001_initial.rs +++ b/cot/src/auth/db/migrations/m_0001_initial.rs @@ -3,12 +3,12 @@ #[derive(Debug, Copy, Clone)] pub(super) struct Migration; impl ::cot::db::migrations::Migration for Migration { - const APP_NAME: &'static str = "cot_auth"; + const APP_NAME: &'static str = "cot"; const MIGRATION_NAME: &'static str = "m_0001_initial"; const DEPENDENCIES: &'static [::cot::db::migrations::MigrationDependency] = &[]; const OPERATIONS: &'static [::cot::db::migrations::Operation] = &[ ::cot::db::migrations::Operation::create_model() - .table_name(::cot::db::Identifier::new("database_user")) + .table_name(::cot::db::Identifier::new("cot__database_user")) .fields( &[ ::cot::db::migrations::Field::new( diff --git a/cot/src/db.rs b/cot/src/db.rs index 5bbded0f2..09c225d60 100644 --- a/cot/src/db.rs +++ b/cot/src/db.rs @@ -1428,7 +1428,7 @@ pub struct RowsNum(pub u64); /// # async fn main() -> Result<()> { /// /// # const OPERATION: Operation = Operation::create_model() -/// # .table_name(Identifier::new("my_model")) +/// # .table_name(Identifier::new("cot__my_model")) /// # .fields(&[ /// # Field::new(Identifier::new("id"), ::TYPE) /// # .primary_key() diff --git a/cot/tests/db.rs b/cot/tests/db.rs index eee01d47b..71d4604c4 100644 --- a/cot/tests/db.rs +++ b/cot/tests/db.rs @@ -12,6 +12,16 @@ use fake::rand::SeedableRng; use fake::rand::rngs::StdRng; use fake::{Dummy, Fake, Faker}; + +#[derive(Debug, PartialEq)] +#[model] +struct TestModel { + #[model(primary_key)] + id: Auto, + name: String, +} + + #[cot_macros::dbtest] async fn model_crud(test_db: &mut TestDatabase) { migrate_test_model(&*test_db).await; @@ -125,20 +135,13 @@ async fn model_macro_filtering(test_db: &mut TestDatabase) { assert!(objects.is_empty()); } -#[derive(Debug, PartialEq)] -#[model] -struct TestModel { - #[model(primary_key)] - id: Auto, - name: String, -} - async fn migrate_test_model(db: &Database) { CREATE_TEST_MODEL.forwards(db).await.unwrap(); } + const CREATE_TEST_MODEL: Operation = Operation::create_model() - .table_name(Identifier::new("test_model")) + .table_name(Identifier::new("cot__test_model")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -201,7 +204,7 @@ async fn migrate_all_fields_model(db: &Database) { } const CREATE_ALL_FIELDS_MODEL: Operation = Operation::create_model() - .table_name(Identifier::new("all_fields_model")) + .table_name(Identifier::new("cot__all_fields_model")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -284,7 +287,7 @@ async fn foreign_keys(db: &mut TestDatabase) { } const CREATE_ARTIST: Operation = Operation::create_model() - .table_name(Identifier::new("artist")) + .table_name(Identifier::new("cot__artist")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -293,7 +296,7 @@ async fn foreign_keys(db: &mut TestDatabase) { ]) .build(); const CREATE_TRACK: Operation = Operation::create_model() - .table_name(Identifier::new("track")) + .table_name(Identifier::new("cot__track")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -368,7 +371,7 @@ async fn foreign_keys_option(db: &mut TestDatabase) { } const CREATE_PARENT: Operation = Operation::create_model() - .table_name(Identifier::new("parent")) + .table_name(Identifier::new("cot__parent")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -376,7 +379,7 @@ async fn foreign_keys_option(db: &mut TestDatabase) { ]) .build(); const CREATE_CHILD: Operation = Operation::create_model() - .table_name(Identifier::new("child")) + .table_name(Identifier::new("cot__child")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -452,7 +455,7 @@ async fn foreign_keys_cascade(db: &mut TestDatabase) { } const CREATE_PARENT: Operation = Operation::create_model() - .table_name(Identifier::new("parent")) + .table_name(Identifier::new("cot__parent")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() @@ -460,7 +463,7 @@ async fn foreign_keys_cascade(db: &mut TestDatabase) { ]) .build(); const CREATE_CHILD: Operation = Operation::create_model() - .table_name(Identifier::new("child")) + .table_name(Identifier::new("cot__child")) .fields(&[ Field::new(Identifier::new("id"), as DatabaseField>::TYPE) .primary_key() diff --git a/examples/todo-list/src/migrations/m_0001_initial.rs b/examples/todo-list/src/migrations/m_0001_initial.rs index d3167edde..3a8bb04d1 100644 --- a/examples/todo-list/src/migrations/m_0001_initial.rs +++ b/examples/todo-list/src/migrations/m_0001_initial.rs @@ -3,12 +3,12 @@ #[derive(Clone)] pub(super) struct Migration; impl ::cot::db::migrations::Migration for Migration { - const APP_NAME: &'static str = "example-todo-list"; + const APP_NAME: &'static str = "todo-list"; const MIGRATION_NAME: &'static str = "m_0001_initial"; const DEPENDENCIES: &'static [::cot::db::migrations::MigrationDependency] = &[]; const OPERATIONS: &'static [::cot::db::migrations::Operation] = &[::cot::db::migrations::Operation::create_model() - .table_name(::cot::db::Identifier::new("todo_item")) + .table_name(::cot::db::Identifier::new("todo_list__todo_item")) .fields(&[ ::cot::db::migrations::Field::new( ::cot::db::Identifier::new("id"), From ebdb579d2ecf685bf26d8cd73ade727379e78fdd Mon Sep 17 00:00:00 2001 From: Younhun Kim Date: Thu, 27 Mar 2025 17:57:50 -0400 Subject: [PATCH 2/4] git pre-commit passthrough --- cot-cli/src/migration_generator.rs | 10 ++++++---- cot-macros/src/model.rs | 10 +++++++--- cot/tests/db.rs | 3 --- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/cot-cli/src/migration_generator.rs b/cot-cli/src/migration_generator.rs index a13a144b8..b6d51af6f 100644 --- a/cot-cli/src/migration_generator.rs +++ b/cot-cli/src/migration_generator.rs @@ -280,10 +280,12 @@ impl MigrationGenerator { symbol_resolver.resolve_struct(&mut item); let args = Self::model_args_from_attr(&path, attr)?; - let model_in_source = - ModelInSource::from_item( - self.crate_name.as_str(), item, &args, &symbol_resolver - )?; + let model_in_source = ModelInSource::from_item( + self.crate_name.as_str(), + item, + &args, + &symbol_resolver, + )?; match args.model_type { ModelType::Application => { diff --git a/cot-macros/src/model.rs b/cot-macros/src/model.rs index 57b5307c0..d538c973d 100644 --- a/cot-macros/src/model.rs +++ b/cot-macros/src/model.rs @@ -96,13 +96,17 @@ impl ModelBuilder { let app_name = std::env::var("CARGO_PKG_NAME").unwrap(); let table_name = match model.model_type { ModelType::Internal => model.table_name, - _ => format!("{}__{}", app_name.to_snake_case(), model.table_name.to_snake_case()), + _ => format!( + "{}__{}", + app_name.to_snake_case(), + model.table_name.to_snake_case() + ), }; let mut model_builder = Self { - app_name: app_name, + app_name, name: model.name.clone(), vis: model.vis, - table_name: table_name, + table_name, pk_field: model.pk_field.clone(), fields_struct_name: format_ident!("{}Fields", model.name), fields_as_columns: Vec::with_capacity(field_count), diff --git a/cot/tests/db.rs b/cot/tests/db.rs index 71d4604c4..92a051133 100644 --- a/cot/tests/db.rs +++ b/cot/tests/db.rs @@ -12,7 +12,6 @@ use fake::rand::SeedableRng; use fake::rand::rngs::StdRng; use fake::{Dummy, Fake, Faker}; - #[derive(Debug, PartialEq)] #[model] struct TestModel { @@ -21,7 +20,6 @@ struct TestModel { name: String, } - #[cot_macros::dbtest] async fn model_crud(test_db: &mut TestDatabase) { migrate_test_model(&*test_db).await; @@ -139,7 +137,6 @@ async fn migrate_test_model(db: &Database) { CREATE_TEST_MODEL.forwards(db).await.unwrap(); } - const CREATE_TEST_MODEL: Operation = Operation::create_model() .table_name(Identifier::new("cot__test_model")) .fields(&[ From 91238ddb8013a6a659367a266d4d9591969838f6 Mon Sep 17 00:00:00 2001 From: Younhun Kim Date: Mon, 31 Mar 2025 20:15:45 -0400 Subject: [PATCH 3/4] * re-generated `todo-list` example's migration file using `cot migration make`. * Added snake-case conversion code to the migration-side code. * Replaced `unwrap()` when failing to extract CARGO_PKG_NAME env var, with `expect()` call + helpful failure message. --- cot-cli/src/migration_generator.rs | 3 ++- cot-macros/src/model.rs | 3 ++- examples/todo-list/src/migrations.rs | 2 +- .../todo-list/src/migrations/m_0001_initial.rs | 18 ++++++++++-------- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/cot-cli/src/migration_generator.rs b/cot-cli/src/migration_generator.rs index b6d51af6f..21b3c65b8 100644 --- a/cot-cli/src/migration_generator.rs +++ b/cot-cli/src/migration_generator.rs @@ -10,6 +10,7 @@ use cot::db::migrations::{DynMigration, MigrationEngine}; use cot_codegen::model::{Field, Model, ModelArgs, ModelOpts, ModelType}; use cot_codegen::symbol_resolver::SymbolResolver; use darling::FromMeta; +use heck::ToSnakeCase; use petgraph::graph::DiGraph; use petgraph::visit::EdgeRef; use proc_macro2::TokenStream; @@ -903,7 +904,7 @@ impl ModelInSource { let opts = ModelOpts::new_from_derive_input(&input) .map_err(|e| anyhow::anyhow!("cannot parse model: {}", e))?; let mut model = opts.as_model(args, symbol_resolver)?; - model.table_name = format!("{}__{}", app_name, model.table_name); + model.table_name = format!("{}__{}", app_name.to_snake_case(), model.table_name); Ok(Self { model_item: item, diff --git a/cot-macros/src/model.rs b/cot-macros/src/model.rs index d538c973d..7743eadeb 100644 --- a/cot-macros/src/model.rs +++ b/cot-macros/src/model.rs @@ -93,7 +93,8 @@ impl ToTokens for ModelBuilder { impl ModelBuilder { fn from_model(model: Model) -> Self { let field_count = model.field_count(); - let app_name = std::env::var("CARGO_PKG_NAME").unwrap(); + let app_name = std::env::var("CARGO_PKG_NAME") + .expect("cargo should set the `CARGO_PKG_NAME` environment variable"); let table_name = match model.model_type { ModelType::Internal => model.table_name, _ => format!( diff --git a/examples/todo-list/src/migrations.rs b/examples/todo-list/src/migrations.rs index 2c925be49..779bfd9f1 100644 --- a/examples/todo-list/src/migrations.rs +++ b/examples/todo-list/src/migrations.rs @@ -1,6 +1,6 @@ //! List of migrations for the current app. //! -//! Generated by cot CLI 0.1.0 on 2025-02-13 10:09:26+00:00 +//! Generated by cot CLI 0.2.0 on 2025-04-01 00:10:41+00:00 pub mod m_0001_initial; /// The list of migrations for current app. diff --git a/examples/todo-list/src/migrations/m_0001_initial.rs b/examples/todo-list/src/migrations/m_0001_initial.rs index 3a8bb04d1..46ed98a54 100644 --- a/examples/todo-list/src/migrations/m_0001_initial.rs +++ b/examples/todo-list/src/migrations/m_0001_initial.rs @@ -1,25 +1,27 @@ -//! Generated by cot CLI 0.1.0 on 2024-08-28 13:39:05+00:00 +//! Generated by cot CLI 0.2.0 on 2025-04-01 00:10:41+00:00 -#[derive(Clone)] +#[derive(Debug, Copy, Clone)] pub(super) struct Migration; impl ::cot::db::migrations::Migration for Migration { - const APP_NAME: &'static str = "todo-list"; + const APP_NAME: &'static str = "example-todo-list"; const MIGRATION_NAME: &'static str = "m_0001_initial"; const DEPENDENCIES: &'static [::cot::db::migrations::MigrationDependency] = &[]; const OPERATIONS: &'static [::cot::db::migrations::Operation] = &[::cot::db::migrations::Operation::create_model() - .table_name(::cot::db::Identifier::new("todo_list__todo_item")) + .table_name(::cot::db::Identifier::new("example_todo_list__todo_item")) .fields(&[ ::cot::db::migrations::Field::new( ::cot::db::Identifier::new("id"), - ::TYPE, + as ::cot::db::DatabaseField>::TYPE, ) .auto() - .primary_key(), + .primary_key() + .set_null( as ::cot::db::DatabaseField>::NULLABLE), ::cot::db::migrations::Field::new( ::cot::db::Identifier::new("title"), ::TYPE, - ), + ) + .set_null(::NULLABLE), ]) .build()]; } @@ -28,6 +30,6 @@ impl ::cot::db::migrations::Migration for Migration { #[::cot::db::model(model_type = "migration")] struct _TodoItem { #[model(primary_key)] - id: i32, + id: cot::db::Auto, title: String, } From b6d861510c12abecaf3b97825074c0bb26976c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Ma=C4=87kowski?= Date: Fri, 4 Apr 2025 00:10:28 +0200 Subject: [PATCH 4/4] chore: update snapshot tests --- .../tests/snapshot_testing/migration/mod.rs | 24 ++++++++++++------- ..._migration__migration_list_existing-2.snap | 2 +- ..._migration__migration_list_existing-3.snap | 2 +- ..._migration__migration_list_existing-4.snap | 2 +- ..._migration__migration_list_existing-5.snap | 2 +- ..._migration__migration_list_existing-6.snap | 2 +- ...g__migration__migration_list_existing.snap | 2 +- ...tion__migration_make_existing_model-2.snap | 8 +++---- ...tion__migration_make_existing_model-3.snap | 8 +++---- ...tion__migration_make_existing_model-4.snap | 10 ++++---- ...tion__migration_make_existing_model-5.snap | 10 ++++---- ...tion__migration_make_existing_model-6.snap | 10 ++++---- ...ration__migration_make_existing_model.snap | 8 +++---- 13 files changed, 48 insertions(+), 42 deletions(-) diff --git a/cot-cli/tests/snapshot_testing/migration/mod.rs b/cot-cli/tests/snapshot_testing/migration/mod.rs index 39e3b3392..7ab72d1fd 100644 --- a/cot-cli/tests/snapshot_testing/migration/mod.rs +++ b/cot-cli/tests/snapshot_testing/migration/mod.rs @@ -12,10 +12,12 @@ const EXAMPLE_DATABASE_MODEL: &str = include_str!("../../resources/example_datab #[expect(clippy::cast_possible_truncation)] fn migration_list_empty() { let temp_dir = tempfile::TempDir::with_prefix("cot-test-").unwrap(); - test_utils::make_package(temp_dir.path()).unwrap(); + let proj_path = temp_dir.path().join("cot-test"); + + test_utils::make_package(&proj_path).unwrap(); let mut cmd = cot_cli!("migration", "list"); - cmd.current_dir(temp_dir.path()); + cmd.current_dir(&proj_path); for (idx, mut cli) in cot_clis_with_verbosity(&cmd).into_iter().enumerate() { let filter = Verbosity::::new(idx as u8, 0).filter(); @@ -31,14 +33,16 @@ fn migration_list_empty() { #[expect(clippy::cast_possible_truncation)] fn migration_list_existing() { let temp_dir = tempfile::TempDir::with_prefix("cot-test-").unwrap(); - test_utils::make_package(temp_dir.path()).unwrap(); + let proj_path = temp_dir.path().join("cot-test"); + + test_utils::make_package(&proj_path).unwrap(); let mut main = std::fs::OpenOptions::new() .append(true) - .open(temp_dir.path().join("src").join("main.rs")) + .open(proj_path.join("src").join("main.rs")) .unwrap(); write!(main, "{EXAMPLE_DATABASE_MODEL}").unwrap(); migration_generator::make_migrations( - temp_dir.path(), + &proj_path, MigrationGeneratorOptions { app_name: None, output_dir: None, @@ -47,7 +51,7 @@ fn migration_list_existing() { .unwrap(); let mut cmd = cot_cli!("migration", "list"); - cmd.current_dir(temp_dir.path()); + cmd.current_dir(&proj_path); for (idx, mut cli) in cot_clis_with_verbosity(&cmd).into_iter().enumerate() { let filter = Verbosity::::new(idx as u8, 0).filter(); @@ -92,10 +96,12 @@ fn migration_make_existing_model() { let filter = Verbosity::::new(idx as u8, 0).filter(); let temp_dir = tempfile::TempDir::with_prefix("cot-test-").unwrap(); - test_utils::make_package(temp_dir.path()).unwrap(); + let proj_path = temp_dir.path().join("cot-test"); + + test_utils::make_package(&proj_path).unwrap(); let mut main = std::fs::OpenOptions::new() .append(true) - .open(temp_dir.path().join("src").join("main.rs")) + .open(proj_path.join("src").join("main.rs")) .unwrap(); write!(main, "{EXAMPLE_DATABASE_MODEL}").unwrap(); @@ -104,7 +110,7 @@ fn migration_make_existing_model() { description => format!("Verbosity level: {filter}"), filters => [GENERIC_FILTERS, TEMP_PATH_FILTERS, TEMP_PROJECT_FILTERS].concat() }, - { assert_cmd_snapshot!(cli.current_dir(temp_dir.path())) } + { assert_cmd_snapshot!(cli.current_dir(&proj_path)) } ); } } diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-2.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-2.snap index 8b3e945d1..c136cffec 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-2.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-2.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-3.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-3.snap index 42932d9e8..e59ffb016 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-3.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-3.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-4.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-4.snap index 1376c9bfe..76081a7d8 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-4.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-4.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-5.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-5.snap index 9e1933fdd..2462900da 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-5.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-5.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-6.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-6.snap index fae0b671b..abb64174f 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-6.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing-6.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing.snap index c2562556b..f429b72d9 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_list_existing.snap @@ -11,6 +11,6 @@ info: success: true exit_code: 0 ----- stdout ----- -cot-test-PROJECT-NAME m_0001_initial +cot-test m_0001_initial ----- stderr ----- diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-2.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-2.snap index a073d1f44..a90d5012a 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-2.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-2.snap @@ -13,9 +13,9 @@ exit_code: 0 ----- stdout ----- ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial' diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-3.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-3.snap index 16bed48e0..1a8d64a7a 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-3.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-3.snap @@ -13,9 +13,9 @@ exit_code: 0 ----- stdout ----- ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial' diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-4.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-4.snap index 22b458fa5..d8c830088 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-4.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-4.snap @@ -11,12 +11,12 @@ info: success: true exit_code: 0 ----- stdout ----- -TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/src/main.rs" +TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/cot-test/src/main.rs" ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial' diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-5.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-5.snap index b4ccdffd4..8acc06bb1 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-5.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-5.snap @@ -11,14 +11,14 @@ info: success: true exit_code: 0 ----- stdout ----- -TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/src/main.rs" +TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/cot-test/src/main.rs" TIMESTAMP TRACE cot_cli::migration_generator: Processing file: "main.rs" TIMESTAMP TRACE cot_cli::migration_generator: Found an Application model: Test ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial' diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-6.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-6.snap index 6d077bcb6..3cfefe2a1 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-6.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model-6.snap @@ -11,14 +11,14 @@ info: success: true exit_code: 0 ----- stdout ----- -TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/src/main.rs" +TIMESTAMP DEBUG cot_cli::migration_generator: Parsing file: "/tmp/TEMP_PATH/cot-test/src/main.rs" TIMESTAMP TRACE cot_cli::migration_generator: Processing file: "main.rs" TIMESTAMP TRACE cot_cli::migration_generator: Found an Application model: Test ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial' diff --git a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model.snap b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model.snap index 5ff726650..a9bc5aa05 100644 --- a/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model.snap +++ b/cot-cli/tests/snapshot_testing/migration/snapshots/cli__snapshot_testing__migration__migration_make_existing_model.snap @@ -13,9 +13,9 @@ exit_code: 0 ----- stdout ----- ----- stderr ----- - Creating Model 'test' - Created Model 'test' + Creating Model 'cot_test__test' + Created Model 'cot_test__test'  Creating Migration 'm_0001_initial' - Creating Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' - Created Migration file '/tmp/TEMP_PATH/src/migrations/m_0001_initial.rs' + Creating Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs' + Created Migration file '/tmp/TEMP_PATH/cot-test/src/migrations/m_0001_initial.rs'  Created Migration 'm_0001_initial'