Releases: yezz123/pyngo
Releases · yezz123/pyngo
1.2.0 - Supporting `Python 3.11.0-beta.1`
What's Changed
- Chore(deps): Bump pydantic from 1.8.2 to 1.9.0 by @dependabot in #8
- Chore(deps-dev): Bump pre-commit from 2.16.0 to 2.17.0 by @dependabot in #10
- Chore(deps-dev): Bump pytest from 6.2.5 to 7.0.0 by @dependabot in #14
- Chore(deps-dev): Bump pytest from 7.0.0 to 7.0.1 by @dependabot in #15
- chore(feat): Migrate to Flit Dependencies Manager by @yezz123 in #26
Full Changelog: 1.1.0...1.2.0
1.1.0
1.0.0
Features 🎉
- Using Pydantic to Build your Models in Django Project.
- Using
OpenAPI
utilities to build params from a basic model. - using
QueryDictModel
to buildPydantic
models from aQueryDict
object. - propagate any errors from Pydantic in Django Rest Framework.
- Tested in Python 3.6 and up.
Examples 📚
OpenAPI
pyngo.openapi_params()
can build params from a basic model
from pydantic import BaseModel
from pyngo import openapi_params
class Model(BaseModel):
bingo: int
print(openapi_params(Model))
pyngo.ParameterDict.required
is set according to the type of the variable
from typing import Optional
from pydantic import BaseModel
from pyngo import openapi_params
class Model(BaseModel):
required_param: int
optional_param: Optional[int]
print(openapi_params(Model))
Other fields can be set through the field’s info:
from pydantic import BaseModel, Field
from pyngo import openapi_params
class WithDescription(BaseModel):
described_param: str = Field(
description="Hello World Use Me!"
)
class InPath(BaseModel):
path_param: str = Field(location="path")
class WithDeprecated(BaseModel):
deprecated_field: bool = Field(deprecated=True)
class WithNoAllowEmpty(BaseModel):
can_be_empty: bool = Field(allowEmptyValue=False)
print(openapi_params(WithDescription)[0]["description"])
print(openapi_params(InPath)[0]["in"])
print(openapi_params(WithDeprecated)[0]["deprecated"])
print(openapi_params(WithNoAllowEmpty)[0]["allowEmptyValue"])
Django
pyngo.querydict_to_dict()
andpyngo.QueryDictModel
are conveniences for building apydantic.BaseModel
from adjango.QueryDict
.
from typing import List
from django.http import QueryDict
from pydantic import BaseModel
from pyngo import QueryDictModel, querydict_to_dict
class Model(BaseModel):
single_param: int
list_param: List[str]
class QueryModel(QueryDictModel):
single_param: int
list_param: List[str]
query_dict = QueryDict("single_param=20&list_param=Life")
print(Model.parse_obj(querydict_to_dict(query_dict, Model)))
print(QueryModel.parse_obj(query_dict))
Note: Don't forget to Setup the Django Project.
Django Rest Framework
pyngo.drf_error_details()
will propagate any errors from Pydantic.
from pydantic import BaseModel, ValidationError
from pyngo import drf_error_details
class Model(BaseModel):
foo: int
bar: str
data = {"foo": "Cat"}
try:
Model.parse_obj(data)
except ValidationError as e:
print(drf_error_details(e))
Errors descend into nested fields:
from typing import List
from pydantic import BaseModel, ValidationError
from pyngo import drf_error_details
class Framework(BaseModel):
frm_id: int
class Language(BaseModel):
framework: List[Framework]
data = {"Framework": [{"frm_id": "not_a_number"}, {}]}
expected_details = {
"framework": {
"0": {"frm_id": ["value is not a valid integer"]},
"1": {"frm_id": ["field required"]},
}
}
try:
Framework.parse_obj(data)
except ValidationError as e:
print(drf_error_details(e))