Skip to content

Commit 1b10489

Browse files
committed
fix: to_str not available on all abi3 builds
1 parent 5c456a8 commit 1b10489

File tree

5 files changed

+16
-8
lines changed

5 files changed

+16
-8
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ jobs:
6868
- name: Test
6969
run: cargo test --verbose
7070

71+
- name: Test (abi3)
72+
run: cargo test --verbose --features pyo3/abi3-py37
73+
7174
env:
7275
RUST_BACKTRACE: 1
7376

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.21.1 - 2024-04-02
2+
3+
- Fix compile error when using PyO3 `abi3` feature targeting a minimum version below 3.10
4+
15
## 0.21.0 - 2024-04-01
26

37
- Bump edition to 2021

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pyo3 = { version = "0.21.0", default-features = false }
1717

1818
[dev-dependencies]
1919
serde = { version = "1.0", default-features = false, features = ["derive"] }
20-
pyo3 = { version = "0.21.0", default-features = false, features = ["auto-initialize", "macros"] }
20+
pyo3 = { version = "0.21.1", default-features = false, features = ["auto-initialize", "macros"] }
2121
serde_json = "1.0"
2222
maplit = "1.0.2"
2323
serde_path_to_error = "0.1.15"

src/de.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ impl<'a, 'py, 'de> de::Deserializer<'de> for &'a mut Depythonizer<'py> {
130130
where
131131
V: de::Visitor<'de>,
132132
{
133-
let s = self.input.downcast::<PyString>()?.to_str()?;
133+
let s = self.input.downcast::<PyString>()?.to_cow()?;
134134
if s.len() != 1 {
135135
return Err(PythonizeError::invalid_length_char());
136136
}
@@ -153,7 +153,7 @@ impl<'a, 'py, 'de> de::Deserializer<'de> for &'a mut Depythonizer<'py> {
153153
V: de::Visitor<'de>,
154154
{
155155
let s = self.input.downcast::<PyString>()?;
156-
visitor.visit_str(s.to_str()?)
156+
visitor.visit_str(&s.to_cow()?)
157157
}
158158

159159
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
@@ -283,7 +283,7 @@ impl<'a, 'py, 'de> de::Deserializer<'de> for &'a mut Depythonizer<'py> {
283283
let mut de = Depythonizer::from_object_bound(value);
284284
visitor.visit_enum(PyEnumAccess::new(&mut de, variant))
285285
} else if let Ok(s) = item.downcast::<PyString>() {
286-
visitor.visit_enum(s.to_str()?.into_deserializer())
286+
visitor.visit_enum(s.to_cow()?.into_deserializer())
287287
} else {
288288
Err(PythonizeError::invalid_enum_type())
289289
}
@@ -297,7 +297,7 @@ impl<'a, 'py, 'de> de::Deserializer<'de> for &'a mut Depythonizer<'py> {
297297
.input
298298
.downcast::<PyString>()
299299
.map_err(|_| PythonizeError::dict_key_not_string())?;
300-
visitor.visit_str(s.to_str()?)
300+
visitor.visit_str(&s.to_cow()?)
301301
}
302302

303303
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
@@ -405,8 +405,8 @@ impl<'a, 'py, 'de> de::EnumAccess<'de> for PyEnumAccess<'a, 'py> {
405405
where
406406
V: de::DeserializeSeed<'de>,
407407
{
408-
let de: de::value::StrDeserializer<'_, PythonizeError> =
409-
self.variant.to_str()?.into_deserializer();
408+
let cow = self.variant.to_cow()?;
409+
let de: de::value::StrDeserializer<'_, PythonizeError> = cow.as_ref().into_deserializer();
410410
let val = seed.deserialize(de)?;
411411
Ok((val, self))
412412
}

src/ser.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,7 @@ mod test {
478478
use super::pythonize;
479479
use maplit::hashmap;
480480
use pyo3::prelude::*;
481+
use pyo3::pybacked::PyBackedStr;
481482
use pyo3::types::PyDict;
482483
use serde::Serialize;
483484

@@ -497,7 +498,7 @@ mod test {
497498
Some(&locals),
498499
)?;
499500
let result = locals.get_item("result")?.unwrap();
500-
let result = result.extract::<&str>()?;
501+
let result = result.extract::<PyBackedStr>()?;
501502

502503
assert_eq!(result, expected);
503504
assert_eq!(serde_json::to_string(&src).unwrap(), expected);

0 commit comments

Comments
 (0)