diff --git a/_service b/_service index 820ebda..4b64973 100644 --- a/_service +++ b/_service @@ -4,5 +4,4 @@ native/Cargo.toml true - diff --git a/pyo3-022.patch b/pyo3-022.patch new file mode 100644 index 0000000..819aebc --- /dev/null +++ b/pyo3-022.patch @@ -0,0 +1,223 @@ +From 03ca79632fe42ff2d4b22ed6d03c2289497e8d6c Mon Sep 17 00:00:00 2001 +From: Jelmer Vernooij +Date: Tue, 30 Jul 2024 15:34:55 +0000 +Subject: [PATCH] Upgrade pyo3 to 0.22 + +--- + .cargo/config.toml | 8 +++++++- + native/libcst/Cargo.toml | 2 +- + native/libcst/src/nodes/expression.rs | 13 +++++++------ + native/libcst/src/nodes/parser_config.rs | 2 +- + native/libcst/src/nodes/traits.rs | 2 +- + native/libcst/src/parser/errors.rs | 13 +++++++------ + native/libcst/src/py.rs | 2 +- + native/libcst_derive/src/into_py.rs | 15 +++++++++------ + 8 files changed, 34 insertions(+), 23 deletions(-) + +--- a/.cargo/config.toml ++++ b/.cargo/config.toml +@@ -8,4 +8,10 @@ rustflags = [ + rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +-] +\ No newline at end of file ++] ++ ++[source.crates-io] ++replace-with = "vendored-sources" ++ ++[source.vendored-sources] ++directory = "vendor" +--- a/native/libcst/Cargo.toml ++++ b/native/libcst/Cargo.toml +@@ -36,7 +36,7 @@ trace = ["peg/trace"] + + [dependencies] + paste = "1.0.9" +-pyo3 = { version = "0.20", optional = true } ++pyo3 = { version = "0.22", optional = true } + thiserror = "1.0.37" + peg = "0.8.1" + chic = "1.2.2" +--- a/native/libcst/src/nodes/expression.rs ++++ b/native/libcst/src/nodes/expression.rs +@@ -2524,6 +2524,7 @@ impl<'r, 'a> Inflate<'a> for DeflatedNam + #[cfg(feature = "py")] + mod py { + ++ use pyo3::types::PyAnyMethods; + use pyo3::types::PyModule; + + use super::*; +@@ -2535,7 +2536,7 @@ mod py { + match self { + Self::Starred(s) => s.try_into_py(py), + Self::Simple { value, comma } => { +- let libcst = PyModule::import(py, "libcst")?; ++ let libcst = PyModule::import_bound(py, "libcst")?; + let kwargs = [ + Some(("value", value.try_into_py(py)?)), + comma +@@ -2547,11 +2548,11 @@ mod py { + .filter(|x| x.is_some()) + .map(|x| x.as_ref().unwrap()) + .collect::>() +- .into_py_dict(py); ++ .into_py_dict_bound(py); + Ok(libcst + .getattr("Element") + .expect("no Element found in libcst") +- .call((), Some(kwargs))? ++ .call((), Some(&kwargs))? + .into()) + } + } +@@ -2571,7 +2572,7 @@ mod py { + whitespace_before_colon, + .. + } => { +- let libcst = PyModule::import(py, "libcst")?; ++ let libcst = PyModule::import_bound(py, "libcst")?; + let kwargs = [ + Some(("key", key.try_into_py(py)?)), + Some(("value", value.try_into_py(py)?)), +@@ -2592,11 +2593,11 @@ mod py { + .filter(|x| x.is_some()) + .map(|x| x.as_ref().unwrap()) + .collect::>() +- .into_py_dict(py); ++ .into_py_dict_bound(py); + Ok(libcst + .getattr("DictElement") + .expect("no Element found in libcst") +- .call((), Some(kwargs))? ++ .call((), Some(&kwargs))? + .into()) + } + } +--- a/native/libcst/src/nodes/parser_config.rs ++++ b/native/libcst/src/nodes/parser_config.rs +@@ -125,7 +125,7 @@ fn parser_config_asdict<'py>(py: Python< + ("version", config.version.clone_ref(py)), + ("future_imports", config.future_imports.clone_ref(py)), + ] +- .into_py_dict(py) ++ .into_py_dict_bound(py) + } + + pub fn init_module(_py: Python, m: &PyModule) -> PyResult<()> { +--- a/native/libcst/src/nodes/traits.rs ++++ b/native/libcst/src/nodes/traits.rs +@@ -170,7 +170,7 @@ pub mod py { + .map(|x| x.try_into_py(py)) + .collect::>>()? + .into_iter(); +- Ok(PyTuple::new(py, converted).into()) ++ Ok(PyTuple::new_bound(py, converted).into()) + } + } + +--- a/native/libcst/src/parser/errors.rs ++++ b/native/libcst/src/parser/errors.rs +@@ -28,7 +28,7 @@ pub enum ParserError<'a> { + #[cfg(feature = "py")] + mod py_error { + +- use pyo3::types::{IntoPyDict, PyModule}; ++ use pyo3::types::{IntoPyDict, PyAnyMethods, PyModule}; + use pyo3::{IntoPy, PyErr, PyErrArguments, Python}; + + use super::ParserError; +@@ -65,13 +65,14 @@ mod py_error { + ("raw_line", (line + 1).into_py(py)), + ("raw_column", col.into_py(py)), + ] +- .into_py_dict(py); +- let libcst = PyModule::import(py, "libcst").expect("libcst cannot be imported"); +- PyErr::from_value( ++ .into_py_dict_bound(py); ++ let libcst = ++ PyModule::import_bound(py, "libcst").expect("libcst cannot be imported"); ++ PyErr::from_value_bound( + libcst + .getattr("ParserSyntaxError") + .expect("ParserSyntaxError not found") +- .call((), Some(kwargs)) ++ .call((), Some(&kwargs)) + .expect("failed to instantiate"), + ) + }) +@@ -86,7 +87,7 @@ mod py_error { + ("raw_line", self.raw_line.into_py(py)), + ("raw_column", self.raw_column.into_py(py)), + ] +- .into_py_dict(py) ++ .into_py_dict_bound(py) + .into_py(py) + } + } +--- a/native/libcst/src/py.rs ++++ b/native/libcst/src/py.rs +@@ -8,7 +8,7 @@ use pyo3::prelude::*; + + #[pymodule] + #[pyo3(name = "native")] +-pub fn libcst_native(_py: Python, m: &PyModule) -> PyResult<()> { ++pub fn libcst_native(_py: Python, m: &Bound) -> PyResult<()> { + #[pyfn(m)] + fn parse_module(source: String, encoding: Option<&str>) -> PyResult { + let m = crate::parse_module(source.as_str(), encoding)?; +--- a/native/libcst_derive/src/into_py.rs ++++ b/native/libcst_derive/src/into_py.rs +@@ -38,12 +38,14 @@ fn impl_into_py_enum(ast: &DeriveInput, + let kwargs_toks = fields_to_kwargs(&var.fields, true); + toks.push(quote! { + Self::#varname { #(#fieldnames,)* .. } => { +- let libcst = pyo3::types::PyModule::import(py, "libcst")?; ++ use pyo3::types::PyAnyMethods; ++ ++ let libcst = pyo3::types::PyModule::import_bound(py, "libcst")?; + let kwargs = #kwargs_toks ; + Ok(libcst + .getattr(stringify!(#varname)) + .expect(stringify!(no #varname found in libcst)) +- .call((), Some(kwargs))? ++ .call((), Some(&kwargs))? + .into()) + } + }) +@@ -87,12 +89,13 @@ fn impl_into_py_struct(ast: &DeriveInput + #[automatically_derived] + impl#generics crate::nodes::traits::py::TryIntoPy for #ident #generics { + fn try_into_py(self, py: pyo3::Python) -> pyo3::PyResult { +- let libcst = pyo3::types::PyModule::import(py, "libcst")?; ++ use pyo3::types::PyAnyMethods; ++ let libcst = pyo3::types::PyModule::import_bound(py, "libcst")?; + let kwargs = #kwargs_toks ; + Ok(libcst + .getattr(stringify!(#ident)) + .expect(stringify!(no #ident found in libcst)) +- .call((), Some(kwargs))? ++ .call((), Some(&kwargs))? + .into()) + } + } +@@ -162,7 +165,7 @@ fn fields_to_kwargs(fields: &Fields, is_ + #(#optional_rust_varnames.map(|x| x.try_into_py(py)).transpose()?.map(|x| (stringify!(#optional_py_varnames), x)),)* + }; + if empty_kwargs { +- quote! { pyo3::types::PyDict::new(py) } ++ quote! { pyo3::types::PyDict::new_bound(py) } + } else { + quote! { + [ #kwargs_pairs #optional_pairs ] +@@ -170,7 +173,7 @@ fn fields_to_kwargs(fields: &Fields, is_ + .filter(|x| x.is_some()) + .map(|x| x.as_ref().unwrap()) + .collect::>() +- .into_py_dict(py) ++ .into_py_dict_bound(py) + } + } + } diff --git a/python-libcst.changes b/python-libcst.changes index 1458923..0a6a96d 100644 --- a/python-libcst.changes +++ b/python-libcst.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Sep 9 11:38:15 UTC 2024 - Matej Cepl + +- Add pyo3-022.patch bumping the dependency of pyo3 to 0.22 + (gh#Instagram/LibCST!1180). + ------------------------------------------------------------------- Mon Jul 22 10:24:31 UTC 2024 - Matej Cepl diff --git a/python-libcst.spec b/python-libcst.spec index 1790402..5b77d6e 100644 --- a/python-libcst.spec +++ b/python-libcst.spec @@ -34,6 +34,9 @@ License: MIT URL: https://github.com/Instagram/LibCST Source0: https://files.pythonhosted.org/packages/source/l/libcst/%{modname}-%{version}.tar.gz Source1: vendor.tar.zst +# PATCH-FIX-UPSTREAM pyo3-022.patch gh#Instagram/LibCST!1180 mcepl@suse.com +# updgrade pyo3 to 0.22 version +Patch0: pyo3-022.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module setuptools-rust} BuildRequires: %{python_module setuptools_scm} @@ -72,26 +75,23 @@ A concrete syntax tree with AST-like properties for Python 3.5+ programs. # libcst/metadata/tests/test_full_repo_manager.py \ # libcst/tests/test_pyre_integration.py -%if %{without test} %build export CARGO_NET_OFFLINE=true PROFILE=release %pyproject_wheel -%endif %install -%if %{without test} export CARGO_NET_OFFLINE=true PROFILE=release %pyproject_install # gh#Instagram/LibCST#818 %{python_expand rm -rf %{buildroot}%{$python_sitearch}/libcst/tests %fdupes %{buildroot}%{$python_sitearch} } -%endif %clean %if %{with test} %check +%python_expand find %{buildroot}%{$python_sitearch} -name \*.so\* %pyunittest_arch discover -v libcst/tests %endif diff --git a/vendor.tar.zst b/vendor.tar.zst index 63d277e..f09a60a 100644 --- a/vendor.tar.zst +++ b/vendor.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7d89b1c34b8bc302ff105323671d9089a58e8a59c0d1579bc42379c4f197a28 -size 10695352 +oid sha256:0612f718a0d5f7c7f0a70c6151c9370d6c5d51f9074a11c8c3df5d7bf650b655 +size 30171484