Skip to content

Releases: yezz123/pyngo

1.2.0 - Supporting `Python 3.11.0-beta.1`

10 May 02:42
d116464
Compare
Choose a tag to compare

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

07 Dec 23:58
3d3b5bf
Compare
Choose a tag to compare

What's Changed

  • Chore(deps-dev): Bump pre-commit from 2.15.0 to 2.16.0 by @dependabot in #4
  • Chore: Define Classes & Functions by adding DocString by @yezz123 in #6
  • Add get_nested function by @yezz123 in #7

Full Changelog: 1.0.0...1.1.0

1.0.0

30 Nov 02:15
31c8963
Compare
Choose a tag to compare

Features 🎉

  • Using Pydantic to Build your Models in Django Project.
  • Using OpenAPI utilities to build params from a basic model.
  • using QueryDictModel to build Pydantic models from a QueryDict 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() and pyngo.QueryDictModel are conveniences for building a pydantic.BaseModel from a django.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))