diff --git a/cot-cli/src/migration_generator.rs b/cot-cli/src/migration_generator.rs index b46d56c9b..cd752a74c 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; @@ -280,8 +281,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(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 => { @@ -892,6 +897,7 @@ pub struct ModelInSource { impl ModelInSource { fn from_item( + app_name: &str, item: syn::ItemStruct, args: &ModelArgs, symbol_resolver: &SymbolResolver, @@ -899,7 +905,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.to_snake_case(), 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 7ca185a25..59a71e093 100644 --- a/cot-cli/tests/migration_generator.rs +++ b/cot-cli/tests/migration_generator.rs @@ -28,11 +28,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]; @@ -76,11 +76,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]; @@ -112,15 +112,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"); } @@ -147,7 +147,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 { @@ -157,7 +157,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 @@ -203,9 +203,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-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' diff --git a/cot-macros/src/model.rs b/cot-macros/src/model.rs index 8624d9459..821056052 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") + .expect("cargo should set the `CARGO_PKG_NAME` environment variable"); + 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, name: model.name.clone(), vis: model.vis, - table_name: model.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 +163,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 +184,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 2d4361391..b92f3fd64 100644 --- a/cot/src/db.rs +++ b/cot/src/db.rs @@ -1433,7 +1433,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..92a051133 100644 --- a/cot/tests/db.rs +++ b/cot/tests/db.rs @@ -12,6 +12,14 @@ 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 +133,12 @@ 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 +201,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 +284,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 +293,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 +368,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 +376,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 +452,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 +460,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.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 d3167edde..46ed98a54 100644 --- a/examples/todo-list/src/migrations/m_0001_initial.rs +++ b/examples/todo-list/src/migrations/m_0001_initial.rs @@ -1,6 +1,6 @@ -//! 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 = "example-todo-list"; @@ -8,18 +8,20 @@ impl ::cot::db::migrations::Migration for Migration { 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("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, }