From 135037d6615a09cb55b273bd0875ac7af6291517 Mon Sep 17 00:00:00 2001 From: Aqeel AlShafei Date: Wed, 21 May 2025 13:53:59 +0100 Subject: [PATCH 1/4] Update crates pyo3 to v0.25, and pyo3-asyncio to pyo3-async-runtimes --- pyreccaster/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyreccaster/Cargo.toml b/pyreccaster/Cargo.toml index da48d26..4856bda 100644 --- a/pyreccaster/Cargo.toml +++ b/pyreccaster/Cargo.toml @@ -11,7 +11,7 @@ name = "pyreccaster" crate-type = ["cdylib"] [dependencies] -pyo3 = { version = "^0.20", features = ["extension-module", "generate-import-lib", "abi3-py37"] } -pyo3-asyncio = { version = "^0.20", features = ["attributes", "tokio-runtime"] } +pyo3 = { version = "^0.25", features = ["extension-module", "generate-import-lib", "abi3-py37"] } +pyo3-async-runtimes = { version = "^0.25", features = ["attributes", "tokio-runtime"] } tokio = { version = "^1", features = ["full"] } reccaster = { path = "../reccaster" } From a79de49a9b7e177ad12a481f5da13fb475c90254 Mon Sep 17 00:00:00 2001 From: Aqeel AlShafei Date: Wed, 21 May 2025 13:56:54 +0100 Subject: [PATCH 2/4] Refactor PyO3 python binding for v0.25 --- pyreccaster/src/lib.rs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/pyreccaster/src/lib.rs b/pyreccaster/src/lib.rs index a6f6e36..2d19cc7 100644 --- a/pyreccaster/src/lib.rs +++ b/pyreccaster/src/lib.rs @@ -7,8 +7,8 @@ use std::{collections::HashMap, sync::Arc}; -use pyo3::{prelude::*, types::PyDict}; -use pyo3_asyncio::tokio::future_into_py_with_locals; +use pyo3::prelude::*; +use pyo3_async_runtimes::tokio::future_into_py_with_locals; use reccaster::{Record, Reccaster}; use tokio::sync::Mutex; @@ -39,23 +39,22 @@ impl PyRecord { } #[getter] - fn properties<'py>(&self, py: Python<'py>) -> PyResult<&'py PyDict> { - let properties = PyDict::new(py); + fn properties(&self) -> PyResult> { + let mut properties: HashMap = HashMap::new(); for (key, value) in &self.0.properties { - properties.set_item(key, value)?; + properties.insert(key.into(), value.into()); } Ok(properties) } } -impl<'source> FromPyObject<'source> for PyRecord { - fn extract(ob: &'source PyAny) -> PyResult { +impl FromPyObject<'_> for PyRecord { + fn extract_bound(ob: &Bound<'_, PyAny>) -> PyResult { let name: String = ob.getattr("name")?.extract().unwrap_or_else(|_| "OPS no name !!!!!!!!!!!".to_string()); let r#type: String = ob.getattr("type")?.extract()?; let alias: Option = ob.getattr("alias")?.extract()?; let properties: HashMap = ob.getattr("properties")?.extract()?; - Ok(PyRecord (Record { name, r#type, alias, properties })) } } @@ -69,21 +68,20 @@ struct PyReccaster { impl PyReccaster { #[staticmethod] - fn setup(py: Python, records: Vec, props: Option>) -> PyResult<&PyAny> { - let locals = pyo3_asyncio::tokio::get_current_locals(py)?; + fn setup(py: Python, records: Vec, props: Option>) -> PyResult> { + let locals = pyo3_async_runtimes::tokio::get_current_locals(py)?; let pvs = records.iter().map(|record: &PyRecord| record.0.clone()).collect::>(); - future_into_py_with_locals(py, locals.clone(), async move { + future_into_py_with_locals(py, locals, async move { let recc = Reccaster::new(pvs, props).await; let pyrecc = PyReccaster { reccaster: Arc::new(Mutex::new(recc)) }; - Python::with_gil(|py| Ok(pyrecc.into_py(py))) + Python::with_gil(|_py| Ok(pyrecc)) }) } - fn run<'p>(&self, py: Python<'p>) -> PyResult<&'p PyAny> { + fn run<'a>(&self, py: Python<'a>) -> PyResult> { let recc_arc = self.reccaster.clone(); - let locals = pyo3_asyncio::tokio::get_current_locals(py)?; - - future_into_py_with_locals(py, locals.clone(), async move { + let locals = pyo3_async_runtimes::tokio::get_current_locals(py)?; + future_into_py_with_locals(py, locals, async move { let mut recc = recc_arc.lock().await; recc.run().await; Ok(()) @@ -92,7 +90,7 @@ impl PyReccaster { } #[pymodule] -fn pyreccaster(_py: Python, m: &PyModule) -> PyResult<()> { +fn pyreccaster(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; Ok(()) From 933d22e95cffc0c381d277b630ff682c34cb1a99 Mon Sep 17 00:00:00 2001 From: Aqeel AlShafei Date: Wed, 21 May 2025 13:57:08 +0100 Subject: [PATCH 3/4] Update Cargo lock file --- Cargo.lock | 72 +++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc79b98..1670c8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -137,7 +137,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] @@ -184,9 +184,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indoc" @@ -340,15 +340,14 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.20.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" +checksum = "f239d656363bcee73afef85277f1b281e8ac6212a1d42aa90e55b90ed43c47a4" dependencies = [ - "cfg-if", "indoc", "libc", "memoffset", - "parking_lot", + "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", @@ -357,35 +356,35 @@ dependencies = [ ] [[package]] -name = "pyo3-asyncio" -version = "0.20.0" +name = "pyo3-async-runtimes" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea6b68e93db3622f3bb3bf363246cf948ed5375afe7abff98ccbdd50b184995" +checksum = "d73cc6b1b7d8b3cef02101d37390dbdfe7e450dfea14921cae80a9534ba59ef2" dependencies = [ "futures", "once_cell", "pin-project-lite", "pyo3", - "pyo3-asyncio-macros", + "pyo3-async-runtimes-macros", "tokio", ] [[package]] -name = "pyo3-asyncio-macros" -version = "0.20.0" +name = "pyo3-async-runtimes-macros" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c467178e1da6252c95c29ecf898b133f742e9181dca5def15dc24e19d45a39" +checksum = "ca31e43a0f205f2960208938135e37e579e61e10b36b4e7f49b0e8f60fab5b83" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "pyo3-build-config" -version = "0.20.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" +checksum = "755ea671a1c34044fa165247aaf6f419ca39caa6003aee791a0df2713d8f1b6d" dependencies = [ "once_cell", "python3-dll-a", @@ -394,9 +393,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.20.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" +checksum = "fc95a2e67091e44791d4ea300ff744be5293f394f1bafd9f78c080814d35956e" dependencies = [ "libc", "pyo3-build-config", @@ -404,27 +403,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.20.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" +checksum = "a179641d1b93920829a62f15e87c0ed791b6c8db2271ba0fd7c2686090510214" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.100", + "syn", ] [[package]] name = "pyo3-macros-backend" -version = "0.20.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" +checksum = "9dff85ebcaab8c441b0e3f7ae40a6963ecea8a9f5e74f647e33fcf5ec9a1e89e" dependencies = [ "heck", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.100", + "syn", ] [[package]] @@ -432,7 +431,7 @@ name = "pyreccaster" version = "0.1.0" dependencies = [ "pyo3", - "pyo3-asyncio", + "pyo3-async-runtimes", "reccaster", "tokio", ] @@ -538,17 +537,6 @@ dependencies = [ "windows-sys", ] -[[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.100" @@ -562,9 +550,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "thread_local" @@ -602,7 +590,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] @@ -652,7 +640,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] From 7ff3363ef290389dd2067c1a6fd9cd02ed421be0 Mon Sep 17 00:00:00 2001 From: Aqeel AlShafei Date: Fri, 23 May 2025 15:05:18 +0100 Subject: [PATCH 4/4] Replace for loop in properties getter with a hashmap clone --- pyreccaster/src/lib.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pyreccaster/src/lib.rs b/pyreccaster/src/lib.rs index 2d19cc7..c636c59 100644 --- a/pyreccaster/src/lib.rs +++ b/pyreccaster/src/lib.rs @@ -40,11 +40,7 @@ impl PyRecord { #[getter] fn properties(&self) -> PyResult> { - let mut properties: HashMap = HashMap::new(); - for (key, value) in &self.0.properties { - properties.insert(key.into(), value.into()); - } - Ok(properties) + Ok(self.0.properties.clone()) } }