Skip to content

Commit a5b3906

Browse files
Use input type json when validating a json schema (#1117)
Co-authored-by: sydney-runkle <[email protected]>
1 parent 7fa450d commit a5b3906

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

src/validators/json.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use pyo3::types::PyDict;
55
use jiter::JsonValue;
66

77
use crate::errors::{ErrorType, ErrorTypeDefaults, ValError, ValLineError, ValResult};
8-
use crate::input::{EitherBytes, Input, ValidationMatch};
8+
use crate::input::{EitherBytes, Input, InputType, ValidationMatch};
99
use crate::tools::SchemaDict;
1010

1111
use super::{build_validator, BuildValidator, CombinedValidator, DefinitionsBuilder, ValidationState, Validator};
@@ -58,7 +58,10 @@ impl Validator for JsonValidator {
5858
match self.validator {
5959
Some(ref validator) => {
6060
let json_value = JsonValue::parse(json_bytes, true).map_err(|e| map_json_err(input, e, json_bytes))?;
61-
validator.validate(py, &json_value, state)
61+
let mut json_state = state.rebind_extra(|e| {
62+
e.input_type = InputType::Json;
63+
});
64+
validator.validate(py, &json_value, &mut json_state)
6265
}
6366
None => {
6467
let obj =

tests/validators/test_json.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re
2+
from enum import Enum
23

34
import pytest
45

@@ -152,6 +153,23 @@ def test_dict_key(py_and_json: PyAndJson):
152153
]
153154

154155

156+
def test_enum() -> None:
157+
class MyEnum(Enum):
158+
a = 'a'
159+
b = 'b'
160+
161+
enum_schema = core_schema.lax_or_strict_schema(
162+
core_schema.no_info_after_validator_function(MyEnum, core_schema.str_schema()),
163+
core_schema.is_instance_schema(MyEnum),
164+
)
165+
v = core_schema.json_schema(enum_schema)
166+
v = SchemaValidator(v)
167+
assert v.validate_python('"a"') == MyEnum.a
168+
assert v.validate_python('"b"') == MyEnum.b
169+
with pytest.raises(ValidationError):
170+
v.validate_python('"c"')
171+
172+
155173
def test_any_schema_no_schema():
156174
v = SchemaValidator(core_schema.json_schema())
157175
assert 'validator:None' in plain_repr(v)

0 commit comments

Comments
 (0)