Skip to content

Commit

Permalink
Fix json validation for NameEmail
Browse files Browse the repository at this point in the history
Fixes #8649
  • Loading branch information
Holi0317 committed Jan 29, 2024
1 parent b785d5b commit ec18bb1
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
14 changes: 9 additions & 5 deletions pydantic/networks.py
Expand Up @@ -479,14 +479,18 @@ def __get_pydantic_core_schema__(
_handler: GetCoreSchemaHandler,
) -> core_schema.CoreSchema:
import_email_validator()

return core_schema.no_info_after_validator_function(
cls._validate,
core_schema.union_schema(
[core_schema.is_instance_schema(cls), core_schema.str_schema()],
custom_error_type='name_email_type',
custom_error_message='Input is not a valid NameEmail',
core_schema.json_or_python_schema(
json_schema=core_schema.str_schema(),
python_schema=core_schema.union_schema(
[core_schema.is_instance_schema(cls), core_schema.str_schema()],
custom_error_type='name_email_type',
custom_error_message='Input is not a valid NameEmail',
),
serialization=core_schema.to_string_ser_schema(),
),
serialization=core_schema.to_string_ser_schema(),
)

@classmethod
Expand Down
8 changes: 8 additions & 0 deletions tests/test_networks.py
Expand Up @@ -850,9 +850,17 @@ class Model(BaseModel):

assert str(Model(v=NameEmail('foo bar', 'foobaR@example.com')).v) == 'foo bar <foobaR@example.com>'
assert str(Model(v='foo bar <foobaR@example.com>').v) == 'foo bar <foobaR@example.com>'
assert str(Model(v='foobaR@example.com').v) == 'foobaR <foobaR@example.com>'
assert NameEmail('foo bar', 'foobaR@example.com') == NameEmail('foo bar', 'foobaR@example.com')
assert NameEmail('foo bar', 'foobaR@example.com') != NameEmail('foo bar', 'different@example.com')

assert Model.model_validate_json('{"v":"foo bar <foobaR@example.com>"}').v == NameEmail(
'foo bar', 'foobaR@example.com'
)
assert (
Model(v=NameEmail('foo bar', 'foobaR@example.com')).model_dump_json() == '{"v":"foo bar <foobaR@example.com>"}'
)

with pytest.raises(ValidationError) as exc_info:
Model(v=1)
assert exc_info.value.errors() == [
Expand Down

0 comments on commit ec18bb1

Please sign in to comment.