From 90a2b6bfe37da8883aa25360bc916450cd9dbc72 Mon Sep 17 00:00:00 2001 From: Samuel Colvin Date: Thu, 11 May 2017 22:19:11 +0100 Subject: [PATCH] fix enum validators ignore_extra on settings, fix #13 --- pydantic/env_settings.py | 1 + pydantic/validators.py | 4 ++-- pydantic/version.py | 2 +- tests/test_complex.py | 15 +++++++++++++++ tests/test_settings.py | 5 +++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pydantic/env_settings.py b/pydantic/env_settings.py index b5edc2c..da6d6ad 100644 --- a/pydantic/env_settings.py +++ b/pydantic/env_settings.py @@ -34,3 +34,4 @@ class BaseSettings(BaseModel): class Config: env_prefix = 'APP_' validate_all = True + ignore_extra = False diff --git a/pydantic/validators.py b/pydantic/validators.py index ff2a9fb..46424ea 100644 --- a/pydantic/validators.py +++ b/pydantic/validators.py @@ -89,11 +89,11 @@ def enum_validator(v, field, **kwargs) -> Enum: # order is important here, for example: bool is a subclass of int so has to come first, datetime before date same _VALIDATORS = [ + (Enum, [enum_validator]), + (str, [not_none_validator, str_validator, anystr_length_validator]), (bytes, [not_none_validator, bytes_validator, anystr_length_validator]), - (Enum, [enum_validator]), - (bool, [bool_validator]), (int, [int, number_size_validator]), (float, [float, number_size_validator]), diff --git a/pydantic/version.py b/pydantic/version.py index bb31ffc..8c5fcee 100644 --- a/pydantic/version.py +++ b/pydantic/version.py @@ -2,4 +2,4 @@ from distutils.version import StrictVersion __all__ = ['VERSION'] -VERSION = StrictVersion('0.0.4') +VERSION = StrictVersion('0.0.5') diff --git a/tests/test_complex.py b/tests/test_complex.py index 27a8380..61e1a89 100644 --- a/tests/test_complex.py +++ b/tests/test_complex.py @@ -1,3 +1,4 @@ +from enum import Enum from typing import Dict, List, Union import pytest @@ -313,3 +314,17 @@ def test_recursive_lists(): assert len(Model.__fields__['v'].sub_fields[0].sub_fields) == 1 assert Model.__fields__['v'].sub_fields[0].sub_fields[0].sub_fields[1].name == '__v_float' assert len(Model.__fields__['v'].sub_fields[0].sub_fields[0].sub_fields) == 2 + + +def test_str_enum(): + class StrEnum(str, Enum): + a = 'a10' + b = 'b10' + + class Model(BaseModel): + v: StrEnum = ... + + assert Model(v='a10').v is StrEnum.a + + with pytest.raises(ValidationError): + Model(v='different') diff --git a/tests/test_settings.py b/tests/test_settings.py index 3558eec..a93d7e3 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -27,3 +27,8 @@ def test_sub_env_missing(): apple: None is not an allow value (error_type=TypeError track=str)\ """ == str(exc_info.value) + + +def test_other_setting(env): + with pytest.raises(ValidationError): + SimpleSettings(apple='a', foobar=42)