fix for obsolete pydantic parameters

This commit is contained in:
collerek
2021-08-06 16:03:29 +02:00
parent 25adb8378e
commit 521b9e6c12
10 changed files with 89 additions and 34 deletions

View File

@ -41,7 +41,6 @@ from ormar.exceptions import ( # noqa: I100
from ormar.fields import (
BaseField,
BigInteger,
SmallInteger,
Boolean,
DECODERS_MAP,
Date,
@ -57,6 +56,7 @@ from ormar.fields import (
LargeBinary,
ManyToMany,
ManyToManyField,
SmallInteger,
String,
Text,
Time,
@ -77,7 +77,7 @@ class UndefinedType: # pragma no cover
Undefined = UndefinedType()
__version__ = "0.10.15"
__version__ = "0.10.16"
__all__ = [
"Integer",
"BigInteger",

View File

@ -9,7 +9,6 @@ from ormar.fields.foreign_key import ForeignKey, ForeignKeyField, UniqueColumns
from ormar.fields.many_to_many import ManyToMany, ManyToManyField
from ormar.fields.model_fields import (
BigInteger,
SmallInteger,
Boolean,
Date,
DateTime,
@ -18,6 +17,7 @@ from ormar.fields.model_fields import (
Integer,
JSON,
LargeBinary,
SmallInteger,
String,
Text,
Time,

View File

@ -142,10 +142,7 @@ class String(ModelFieldFactory, str):
cls,
*,
max_length: int,
allow_blank: bool = True,
strip_whitespace: bool = False,
min_length: int = None,
curtail_length: int = None,
regex: str = None,
**kwargs: Any
) -> BaseField: # type: ignore
@ -157,7 +154,6 @@ class String(ModelFieldFactory, str):
if k not in ["cls", "__class__", "kwargs"]
},
}
kwargs["allow_blank"] = kwargs.get("nullable", True)
return super().__new__(cls, **kwargs)
@classmethod
@ -244,7 +240,7 @@ class Text(ModelFieldFactory, str):
_sample = "text"
def __new__( # type: ignore
cls, *, allow_blank: bool = True, strip_whitespace: bool = False, **kwargs: Any
cls, **kwargs: Any
) -> BaseField:
kwargs = {
**kwargs,
@ -254,7 +250,6 @@ class Text(ModelFieldFactory, str):
if k not in ["cls", "__class__", "kwargs"]
},
}
kwargs["allow_blank"] = kwargs.get("nullable", True)
return super().__new__(cls, **kwargs)
@classmethod

View File

@ -8,6 +8,7 @@ from ormar.models.helpers.pydantic import (
get_potential_fields,
get_pydantic_base_orm_config,
get_pydantic_field,
merge_or_generate_pydantic_config,
remove_excluded_parent_fields,
)
from ormar.models.helpers.relations import (
@ -33,6 +34,7 @@ __all__ = [
"get_pydantic_field",
"get_potential_fields",
"get_pydantic_base_orm_config",
"merge_or_generate_pydantic_config",
"check_required_meta_parameters",
"sqlalchemy_columns_from_model_fields",
"populate_choices_validators",

View File

@ -1,3 +1,4 @@
import inspect
from typing import Dict, Optional, TYPE_CHECKING, Tuple, Type
import pydantic
@ -5,6 +6,7 @@ from pydantic.fields import ModelField
from pydantic.utils import lenient_issubclass
from ormar.fields import BaseField # noqa: I100, I202
from ormar.exceptions import ModelDefinitionError
if TYPE_CHECKING: # pragma no cover
from ormar import Model
@ -88,6 +90,31 @@ def populate_pydantic_default_values(attrs: Dict) -> Tuple[Dict, Dict]:
return attrs, model_fields
def merge_or_generate_pydantic_config(attrs: Dict, name: str) -> None:
"""
Checks if the user provided pydantic Config,
and if he did merges it with the default one.
Updates the attrs in place with a new config.
:rtype: None
"""
DefaultConfig = get_pydantic_base_orm_config()
if "Config" in attrs:
ProvidedConfig = attrs["Config"]
if not inspect.isclass(ProvidedConfig):
raise ModelDefinitionError(
f"Config provided for class {name} has to be a class."
)
class Config(ProvidedConfig, DefaultConfig): # type: ignore
pass
attrs["Config"] = Config
else:
attrs["Config"] = DefaultConfig
def get_pydantic_base_orm_config() -> Type[pydantic.BaseConfig]:
"""
Returns empty pydantic Config with orm_mode set to True.

View File

@ -1,4 +1,3 @@
import inspect
from typing import (
Any,
Dict,
@ -37,8 +36,8 @@ from ormar.models.helpers import (
expand_reverse_relationships,
extract_annotations_and_default_vals,
get_potential_fields,
get_pydantic_base_orm_config,
get_pydantic_field,
merge_or_generate_pydantic_config,
meta_field_not_set,
populate_choices_validators,
populate_default_options_values,
@ -553,21 +552,7 @@ class ModelMetaclass(pydantic.main.ModelMetaclass):
:param attrs: class namespace
:type attrs: Dict
"""
DefaultConfig = get_pydantic_base_orm_config()
if "Config" in attrs:
ProvidedConfig = attrs["Config"]
if not inspect.isclass(ProvidedConfig):
raise ModelDefinitionError(
f"Config provided for class {name} has to be a class."
)
class Config(ProvidedConfig, DefaultConfig): # type: ignore
pass
attrs["Config"] = Config
else:
attrs["Config"] = DefaultConfig
merge_or_generate_pydantic_config(attrs=attrs, name=name)
attrs["__name__"] = name
attrs, model_fields = extract_annotations_and_default_vals(attrs)
for base in reversed(bases):