diff --git a/Cargo.lock b/Cargo.lock index 8ca0322..ac9e987 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,7 +55,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -321,7 +321,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.87", + "syn", ] [[package]] @@ -332,7 +332,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -385,7 +385,7 @@ dependencies = [ "deluxe-macros", "once_cell", "proc-macro2", - "syn 2.0.87", + "syn", ] [[package]] @@ -398,7 +398,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.87", + "syn", ] [[package]] @@ -413,7 +413,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -443,7 +443,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -481,7 +481,7 @@ dependencies = [ "deluxe", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -493,29 +493,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "diesel_async_migrations" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99915cbb9455e8fd56f12edc58f92bbdf8161e4363cb2000cf4308aa6358ff4" -dependencies = [ - "diesel", - "diesel-async", - "diesel_async_migrations_macros", - "scoped-futures", - "tracing", -] - -[[package]] -name = "diesel_async_migrations_macros" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05de210f31e6ac18162501b03c37f839af9f9fd6dd6de2bb4031ae6691c47679" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "diesel_derives" version = "2.2.3" @@ -526,7 +503,18 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.87", + "syn", +] + +[[package]] +name = "diesel_migrations" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a73ce704bad4231f001bff3314d91dce4aba0770cee8b233991859abc15c1f6" +dependencies = [ + "diesel", + "migrations_internals", + "migrations_macros", ] [[package]] @@ -535,7 +523,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.87", + "syn", ] [[package]] @@ -560,24 +548,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dotenvy_macro" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0235d912a8c749f4e0c9f18ca253b4c28cfefc1d2518096016d6e3230b6424" -dependencies = [ - "dotenvy", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "dsl_auto_type" version = "0.1.2" @@ -589,7 +559,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -723,7 +693,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1042,7 +1012,7 @@ name = "into-response-derive" version = "1.1.0" dependencies = [ "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1078,7 +1048,7 @@ dependencies = [ "diesel-async", "diesel-crud-derive", "diesel-crud-trait", - "diesel_async_migrations", + "diesel_migrations", "into-response-derive", "mime", "nom", @@ -1156,6 +1126,27 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "migrations_internals" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd01039851e82f8799046eabbb354056283fb265c8ec0996af940f4e85a380ff" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "migrations_macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd" +dependencies = [ + "migrations_internals", + "proc-macro2", + "quote", +] + [[package]] name = "mime" version = "0.3.17" @@ -1316,7 +1307,7 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.87", + "syn", ] [[package]] @@ -1360,7 +1351,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1435,7 +1426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -1492,7 +1483,7 @@ version = "0.1.0" dependencies = [ "quote", "regex", - "syn 2.0.87", + "syn", ] [[package]] @@ -1524,9 +1515,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1536,9 +1527,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1547,9 +1538,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" @@ -1716,7 +1707,7 @@ checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1749,7 +1740,16 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", ] [[package]] @@ -1791,7 +1791,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1889,7 +1889,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.87", + "syn", ] [[package]] @@ -1900,7 +1900,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1909,17 +1909,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.87" @@ -1979,14 +1968,11 @@ dependencies = [ name = "tests" version = "0.1.0" dependencies = [ - "derive_more", "diesel", "diesel-async", - "diesel_async_migrations", - "dotenvy_macro", + "diesel_migrations", "lib", "testcontainers-modules", - "thiserror 2.0.12", "tokio", ] @@ -2016,7 +2002,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2027,7 +2013,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2110,7 +2096,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2189,11 +2175,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.24", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -2203,7 +2204,20 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.4.0", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap 2.4.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.3", ] [[package]] @@ -2285,7 +2299,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2441,7 +2455,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-shared", ] @@ -2463,7 +2477,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2683,6 +2697,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +dependencies = [ + "memchr", +] + [[package]] name = "xattr" version = "1.4.0" @@ -2712,7 +2735,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index bd17fb5..eb340cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,10 +30,10 @@ tokio = { workspace = true, optional = true, features = ["fs", "rt-multi-thread" tokio-util = { version = "0.7", optional = true, features = ["io"] } # Database diesel = { workspace = true, optional = true, features = ["postgres"] } -diesel-async = { workspace = true, optional = true, features = ["postgres", "deadpool"] } +diesel-async = { workspace = true, optional = true, features = ["postgres", "deadpool", "async-connection-wrapper"] } diesel-crud-derive = { path = "crates/diesel_crud_derive", optional = true } diesel-crud-trait = { path = "crates/diesel_crud_trait", optional = true } -diesel_async_migrations = { version = "0.15", optional = true } +diesel_migrations = { workspace = true, optional = true } deadpool-diesel = { workspace = true, optional = true, features = ["postgres"] } # Error handling thiserror = { workspace = true, optional = true } @@ -49,7 +49,7 @@ read-files = { path = "crates/read_files", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } serde_json = { version = "1.0", optional = true } # Test -testcontainers-modules = { version = "0.11", features = ["postgres"], optional = true } +testcontainers-modules = { workspace = true, features = ["postgres"], optional = true } # Time chrono = { version = "0.4", optional = true, features = ["serde"] } # Utils @@ -61,6 +61,7 @@ tokio = "1.40" # Database diesel = "2.2" diesel-async = "0.5" +diesel_migrations = "2.2" deadpool-diesel = "0.6" # Error handling thiserror = "2.0" @@ -69,12 +70,15 @@ syn = "2.0" quote = "1.0" deluxe = "0.5" proc-macro2 = "1.0" +# Test +testcontainers-modules = "0.11" # Utils derive_more = "2.0" +regex = "1.11" [features] axum = ["dep:axum", "dep:tower", "dep:tower-http", "dep:thiserror", "dep:tracing", "dep:tracing-subscriber", "dep:tokio", "dep:mime"] -diesel = ["dep:diesel-crud-trait", "dep:diesel", "dep:diesel-async", "dep:deadpool-diesel", "dep:diesel_async_migrations"] +diesel = ["dep:diesel-crud-trait", "dep:diesel", "dep:diesel-async", "dep:deadpool-diesel", "dep:diesel_migrations"] io = ["dep:tokio", "dep:tokio-util"] iter = [] nom = ["dep:nom"] diff --git a/crates/read_files/Cargo.toml b/crates/read_files/Cargo.toml index 5335912..b609c68 100644 --- a/crates/read_files/Cargo.toml +++ b/crates/read_files/Cargo.toml @@ -10,4 +10,4 @@ proc-macro = true [dependencies] syn = { workspace = true } quote = { workspace = true } -regex = "1.10" +regex = { workspace = true } diff --git a/crates/tests/Cargo.toml b/crates/tests/Cargo.toml index 8924d0c..916bf0f 100644 --- a/crates/tests/Cargo.toml +++ b/crates/tests/Cargo.toml @@ -9,12 +9,9 @@ homepage.workspace = true [dependencies] diesel = { workspace = true } diesel-async = { workspace = true } -lib = { path = "../../../rust-lib", features = ["diesel", "derive"] } -derive_more = { workspace = true, features = ["constructor", "from"] } -thiserror = { workspace = true } +lib = { path = "../../../rust-lib", features = ["diesel", "derive", "test"] } [dev-dependencies] tokio = { workspace = true, features = ["macros"] } -dotenvy_macro = "0.15" -testcontainers-modules = { version = "0.11", features = ["postgres"] } -diesel_async_migrations = "0.15" +testcontainers-modules = { workspace = true, features = ["postgres"] } +diesel_migrations = { workspace = true } diff --git a/crates/tests/tests/test_containers.rs b/crates/tests/tests/test_containers.rs index 10f295c..5b4eb0a 100644 --- a/crates/tests/tests/test_containers.rs +++ b/crates/tests/tests/test_containers.rs @@ -1,48 +1,17 @@ -use derive_more::{Constructor, From}; -use diesel_async::pooled_connection::deadpool::{BuildError, PoolError}; -use diesel_async::AsyncPgConnection; -use diesel_async_migrations::EmbeddedMigrations; -use lib::diesel::pool::{create_pool_from_url, PgPool}; -use lib::diesel::DieselError; +use diesel_migrations::EmbeddedMigrations; +use lib::diesel::migration::run_migrations; +use lib::test::test_containers::{ContainerError, TestContainer}; use testcontainers_modules::postgres::Postgres; use testcontainers_modules::testcontainers::runners::AsyncRunner; use testcontainers_modules::testcontainers::{ContainerAsync, TestcontainersError}; -/// When the TestContainer is dropped, the container will be removed. -/// # Errors -/// If destructed and the container field is dropped, the container will be stopped -/// and all connections from the pool will result in DatabaseError. -#[derive(Constructor)] -pub struct TestContainer { - pub container: ContainerAsync, - pub pool: PgPool, -} - -#[derive(Debug, From)] -pub enum ContainerError { - TestContainers(TestcontainersError), - BuildError(BuildError), - PoolError(PoolError), - DieselError(DieselError), -} - -pub async fn create_test_containers_pool<'a>() -> Result { - let container = create_postgres_container().await?; - let connection_string = format!( - "postgres://postgres:postgres@localhost:{}/postgres", - container.get_host_port_ipv4(5432).await? - ); - let pool = create_pool_from_url(connection_string)?; - run_migrations(pool.get().await?.as_mut()).await?; - Ok(TestContainer::new(container, pool)) -} - -pub(crate) async fn run_migrations( - conn: &mut AsyncPgConnection, -) -> Result<(), diesel::result::Error> { - static EMBEDDED_MIGRATIONS: EmbeddedMigrations = - diesel_async_migrations::embed_migrations!("./migrations"); - EMBEDDED_MIGRATIONS.run_pending_migrations(conn).await +pub async fn create_test_containers_pool() -> Result { + let test_container = lib::test::test_containers::create_test_containers_pool().await?; + let pool = &test_container.pool; + let connection = pool.get().await?; + const MIGRATIONS: EmbeddedMigrations = diesel_migrations::embed_migrations!("./migrations"); + run_migrations(connection, MIGRATIONS).await?; + Ok(test_container) } pub async fn create_postgres_container() -> Result, TestcontainersError> { diff --git a/src/diesel/migration.rs b/src/diesel/migration.rs index 8f70910..7318015 100644 --- a/src/diesel/migration.rs +++ b/src/diesel/migration.rs @@ -1,9 +1,23 @@ -use diesel_async::AsyncPgConnection; -use diesel_async_migrations::EmbeddedMigrations; +use diesel::pg::Pg; +use diesel_async::AsyncConnection; +use diesel_async::async_connection_wrapper::AsyncConnectionWrapper; +use diesel_migrations::{EmbeddedMigrations, MigrationHarness}; +use tokio::task::JoinError; -pub async fn run_migrations( - migrations: &EmbeddedMigrations, - conn: &mut AsyncPgConnection, -) -> Result<(), diesel::result::Error> { - migrations.run_pending_migrations(conn).await +/// Run Diesel migrations using an async connection. +/// Only works with Postgres. +pub async fn run_migrations( + async_connection: A, + migrations: EmbeddedMigrations, +) -> Result<(), JoinError> +where + A: AsyncConnection + 'static, +{ + let mut async_wrapper: AsyncConnectionWrapper = + AsyncConnectionWrapper::from(async_connection); + + tokio::task::spawn_blocking(move || { + async_wrapper.run_pending_migrations(migrations).unwrap(); + }) + .await }