Skip to content

Commit cfe0756

Browse files
fix
1 parent e853b46 commit cfe0756

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

pyrefly/lib/alt/class/pydantic_lax.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,24 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
161161
None
162162
}
163163

164+
fn get_regex_pattern_lax_conversion(
165+
&self,
166+
class_obj: &Class,
167+
ty: &Type,
168+
targs: &[Type],
169+
) -> Option<Type> {
170+
if class_obj.has_toplevel_qname(ModuleName::from_str("re").as_str(), "Pattern")
171+
|| class_obj.has_toplevel_qname(ModuleName::typing().as_str(), "Pattern")
172+
{
173+
let pattern_input = targs
174+
.first()
175+
.cloned()
176+
.unwrap_or_else(|| self.heap.mk_any_implicit());
177+
return Some(self.union(ty.clone(), pattern_input));
178+
}
179+
None
180+
}
181+
164182
fn get_tuple_element_type(&self, tuple: &Tuple) -> Type {
165183
match tuple {
166184
Tuple::Unbounded(elem) => self.expand_type_for_lax_mode(elem),
@@ -209,6 +227,11 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
209227
.mk_class_type(self.stdlib.mapping(key_ty, expanded_val));
210228
}
211229

230+
if let Some(converted) = self.get_regex_pattern_lax_conversion(class_obj, ty, targs)
231+
{
232+
return converted;
233+
}
234+
212235
let expanded_targs = self.expand_types(targs);
213236

214237
// Check for container type conversions

pyrefly/lib/test/pydantic/strictness.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,23 @@ Model(parameters=d)
339339
"#,
340340
);
341341

342+
pydantic_testcase!(
343+
test_lax_mode_pattern_field,
344+
r#"
345+
import re
346+
from typing import reveal_type
347+
from pydantic import BaseModel
348+
349+
class RegexSignature(BaseModel):
350+
signature: re.Pattern[str]
351+
352+
reveal_type(RegexSignature.__init__) # E: revealed type: (self: RegexSignature, *, signature: Pattern[str] | str, **Unknown) -> None
353+
RegexSignature(signature=re.compile(r"needle"))
354+
RegexSignature(signature="needle")
355+
RegexSignature(signature=b"needle") # E: Argument `Literal[b'needle']` is not assignable to parameter `signature`
356+
"#,
357+
);
358+
342359
pydantic_testcase!(
343360
test_lax_mode_other,
344361
r#"

0 commit comments

Comments
 (0)