This is an automated email from the ASF dual-hosted git repository. manjusaka pushed a commit to branch manjusaka/fix-operator-error in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit e9f16bdcc88b826c53fefb3d62f3df6055a034ec Author: Manjusaka <[email protected]> AuthorDate: Wed Nov 8 01:02:11 2023 +0800 feat(binding/python): Add new API to convert AsyncOperator to Operator Signed-off-by: Manjusaka <[email protected]> --- bindings/python/python/opendal/__init__.pyi | 2 ++ bindings/python/src/operator.rs | 15 +++++++++++---- bindings/python/tests/conftest.py | 18 ++++++++---------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/bindings/python/python/opendal/__init__.pyi b/bindings/python/python/opendal/__init__.pyi index 2a28f523f..03f702337 100644 --- a/bindings/python/python/opendal/__init__.pyi +++ b/bindings/python/python/opendal/__init__.pyi @@ -43,6 +43,7 @@ class Operator: def copy(self, source: str, target: str): ... def rename(self, source: str, target: str): ... def remove_all(self, path: str): ... + def to_async_operator(self) -> AsyncOperator: ... class AsyncOperator: def __init__(self, scheme: str, **kwargs): ... @@ -73,6 +74,7 @@ class AsyncOperator: async def copy(self, source: str, target: str): ... async def rename(self, source: str, target: str): ... async def remove_all(self, path: str): ... + def to_operator(self) -> Operator: ... class File: def read(self, size: Optional[int] = None) -> memoryview: ... diff --git a/bindings/python/src/operator.rs b/bindings/python/src/operator.rs index f6e8c3f86..19908bffe 100644 --- a/bindings/python/src/operator.rs +++ b/bindings/python/src/operator.rs @@ -29,10 +29,9 @@ use crate::*; fn build_operator( scheme: ocore::Scheme, map: HashMap<String, String>, - blocking: bool, ) -> PyResult<ocore::Operator> { let mut op = ocore::Operator::via_map(scheme, map).map_err(format_pyerr)?; - if blocking && !op.info().full_capability().blocking { + if !op.info().full_capability().blocking { let runtime = pyo3_asyncio::tokio::get_runtime(); let _guard = runtime.enter(); op = op @@ -66,7 +65,7 @@ impl Operator { }) .unwrap_or_default(); - Ok(Operator(build_operator(scheme, map, true)?.blocking())) + Ok(Operator(build_operator(scheme, map)?.blocking())) } /// Add new layers upon existing operator @@ -185,6 +184,10 @@ impl Operator { Ok(capability::Capability::new(self.0.info().full_capability())) } + pub fn to_async_operator(&self) -> PyResult<AsyncOperator> { + Ok(AsyncOperator(self.0.clone().into())) + } + fn __repr__(&self) -> String { let info = self.0.info(); let name = info.name(); @@ -224,7 +227,7 @@ impl AsyncOperator { }) .unwrap_or_default(); - Ok(AsyncOperator(build_operator(scheme, map, false)?)) + Ok(AsyncOperator(build_operator(scheme, map)?)) } /// Add new layers upon existing operator @@ -456,6 +459,10 @@ impl AsyncOperator { Ok(capability::Capability::new(self.0.info().full_capability())) } + pub fn to_operator(&self) -> PyResult<Operator> { + Ok(Operator(self.0.clone().blocking())) + } + fn __repr__(&self) -> String { let info = self.0.info(); let name = info.name(); diff --git a/bindings/python/tests/conftest.py b/bindings/python/tests/conftest.py index 970bb3ba5..3385ee3f7 100644 --- a/bindings/python/tests/conftest.py +++ b/bindings/python/tests/conftest.py @@ -34,7 +34,7 @@ def pytest_configure(config): ) [email protected]() [email protected](scope="session") def service_name(): service_name = os.environ.get("OPENDAL_TEST") if service_name is None: @@ -42,7 +42,7 @@ def service_name(): return service_name [email protected]() [email protected](scope="session") def setup_config(service_name): # Read arguments from envs. prefix = f"opendal_{service_name}_" @@ -54,20 +54,18 @@ def setup_config(service_name): return config [email protected]() -def operator(service_name, setup_config): - return opendal.Operator(service_name, **setup_config).layer( - opendal.layers.RetryLayer() - ) - - [email protected]() [email protected](scope="session") def async_operator(service_name, setup_config): return opendal.AsyncOperator(service_name, **setup_config).layer( opendal.layers.RetryLayer() ) [email protected](scope="session") +def operator(async_operator): + return async_operator.to_operator() + + @pytest.fixture(autouse=True) def check_capability(request, operator, async_operator): if request.node.get_closest_marker("need_capability"):
