diff --git a/ua-parser-py/Cargo.toml b/ua-parser-py/Cargo.toml index bf82718..63588f0 100644 --- a/ua-parser-py/Cargo.toml +++ b/ua-parser-py/Cargo.toml @@ -1,8 +1,12 @@ [package] name = "ua-parser-rs" -version = "0.1.0" +version = "0.1.1" edition = "2021" license = "Apache 2.0" +description = "A native accelerator for uap-python" +repository = "https://github.com/ua-parser/uap-rust/" +homepage = "https://github.com/ua-parser/uap-rust/blob/main/ua-parser/" +authors = ["masklinn "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] @@ -10,5 +14,5 @@ name = "ua_parser_rs" crate-type = ["cdylib"] [dependencies] -pyo3 = { version = "0.22", features = ["extension-module", "abi3", "abi3-py38"] } +pyo3 = { version = "0.22", features = ["extension-module", "abi3", "abi3-py39"] } ua-parser = { version = "0.2.0", path = "../ua-parser" } diff --git a/ua-parser-py/README.md b/ua-parser-py/README.md new file mode 100644 index 0000000..daa1aea --- /dev/null +++ b/ua-parser-py/README.md @@ -0,0 +1,14 @@ +a ua-parser accelerator +======================= + +This package is (currently) not intended to be used directly, instead +it is one of the native accelerators for [ua-parser][1]. + +The API is very simplistic and should be pretty stable (if only +because having to update [ua-parser][1] all the time is undesirable), +but there is no formal guarantee that it'll keep, as the goal is +really nothing more than a very basic export of [uap-rust][2] to +Python. + +[1]: https://pypi.org/project/ua-parser/ +[2]: https://crates.io/crates/ua-parser diff --git a/ua-parser-py/src/lib.rs b/ua-parser-py/src/lib.rs index 0951c58..78c59f4 100644 --- a/ua-parser-py/src/lib.rs +++ b/ua-parser-py/src/lib.rs @@ -25,7 +25,7 @@ /// them to Parsers as well but that's still very confusing given the /// global Parser object, unless *that* gets renamed to Extractor on /// the python side, or something. -use pyo3::exceptions::PyValueError; +use pyo3::{exceptions::PyValueError, types::PyString}; use pyo3::prelude::*; use std::borrow::Cow::{self, Owned}; @@ -42,15 +42,15 @@ struct UserAgentExtractor(ua_parser::user_agent::Extractor<'static>); #[pyclass(frozen)] struct UserAgent { #[pyo3(get)] - family: String, + family: Py, #[pyo3(get)] - major: Option, + major: Option>, #[pyo3(get)] - minor: Option, + minor: Option>, #[pyo3(get)] - patch: Option, + patch: Option>, #[pyo3(get)] - patch_minor: Option, + patch_minor: Option>, } #[pymethods] impl UserAgentExtractor { @@ -74,13 +74,13 @@ impl UserAgentExtractor { .map_err(|e| PyValueError::new_err(e.to_string())) .map(Self) } - fn extract(&self, s: &str) -> PyResult> { + fn extract(&self, py: Python<'_>, s: &str) -> PyResult> { Ok(self.0.extract(s).map(|v| UserAgent { - family: v.family.into_owned(), - major: v.major.map(|s| s.to_string()), - minor: v.minor.map(|s| s.to_string()), - patch: v.patch.map(|s| s.to_string()), - patch_minor: v.patch_minor.map(|s| s.to_string()), + family: PyString::new_bound(py, &v.family).unbind(), + major: v.major.map(|s| PyString::new_bound(py, s).unbind()), + minor: v.minor.map(|s| PyString::new_bound(py, s).unbind()), + patch: v.patch.map(|s| PyString::new_bound(py, s).unbind()), + patch_minor: v.patch_minor.map(|s| PyString::new_bound(py, s).unbind()), })) } }