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