Skip to main content

A descriptor package

Project description

descriptor

import datetime
import json
import typing

from descriptor import validator
from descriptor.base import Field, ValidatableField, TransientField
from descriptor.error import FieldSetError
from descriptor.support.base import BaseDecoder
from descriptor.support.interface import Serializable
from descriptor.support.json import JSONEncoder, HookFactory


class SubType(Serializable):
    d: int = Field('d')


class DataTest(Serializable):
    a: int = Field('a', 'aaa')
    b: float = ValidatableField('b', '1.1 ≤ bbb ≤ 10').add_validator(validator.MaxMinValidator(1.1, 10))
    c: str = ValidatableField('c', 'ccc not blank').add_validator(validator.NotBlankValidator())
    d: datetime.timedelta = TransientField('d', 'Need to check')
    e: bool = Field('e', 'none')
    f: datetime.datetime = Field('f')
    g: typing.Union[str, int, float] = Field('g')
    h: typing.Optional[typing.Callable[[int], str]] = Field('h')
    i: typing.Any = Field('i')
    j: SubType = Field('j')

    def __init__(self):
        self.a = 1
        self.b = 2.1
        self.d = datetime.datetime.now() - datetime.datetime.min
        self.c = 'c'
        self.f = datetime.datetime.now()
        self.g = 3
        self.h = None
        self.i = {'t': 12}
        self.j = SubType()
        self.j.d = 2


def h(_h: int) -> str:
    return str(_h)


class JSONEncoderTest(JSONEncoder):

    def default(self, o):
        if isinstance(o, datetime.datetime):
            return o.strftime('%Y-%m-%d %H:%M:%S')
        return super().default(o)


class JSONDecoderTest(BaseDecoder):

    def _default(self, t: typing.Union[type, typing.Any], val: typing.Any) -> typing.Any:
        if isinstance(t, type):
            if issubclass(t, datetime.datetime) and isinstance(val, str):
                return datetime.datetime.strptime(val, '%Y-%m-%d %H:%M:%S')
        return super()._default(t, val)


print(json.dumps(DataTest(), cls=JSONEncoderTest))
# 此处解析多层结构时会出现问题
from_hook = json.loads('{"a": 1, "b": 2.1, "c": "c", "f": "2021-12-08 21:53:26", "g": 3, "h": null, "i": 2}',
                       object_hook=HookFactory.make_hook(JSONDecoderTest(DataTest)))
print(JSONEncoderTest().encode(from_hook))
print(json.dumps(from_hook, cls=JSONEncoderTest))
# 多层结构不能使用object_hook
form_decoder = JSONDecoderTest(DataTest).decode(json.loads(
    '{"a": 1, "b": 2.1, "c": "c", "f": "2021-12-08 21:53:26", "g": 3, "i": {"t": 12}, "j": {"d": 2}}'))
print(JSONEncoderTest().encode(form_decoder))
print(json.dumps(form_decoder, cls=JSONEncoderTest))
try:
    DataTest().b = 100.
except FieldSetError as e:
    print(repr(e))
try:
    DataTest().c = 100
except FieldSetError as e:
    print(repr(e))
try:
    DataTest().c = '  '
except FieldSetError as e:
    print(repr(e))
DataTest().g = 2.
DataTest().g = "3"
try:
    DataTest().g = None
except FieldSetError as e:
    print(repr(e))
d = DataTest()
d.h = h
print(d.h(1))
try:
    DataTest().h = 1
except FieldSetError as e:
    print(repr(e))
d.i = None
d.i = 223
d.i = "123"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

field-descriptor-1.0.1.tar.gz (9.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

field_descriptor-1.0.1-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file field-descriptor-1.0.1.tar.gz.

File metadata

  • Download URL: field-descriptor-1.0.1.tar.gz
  • Upload date:
  • Size: 9.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.1

File hashes

Hashes for field-descriptor-1.0.1.tar.gz
Algorithm Hash digest
SHA256 1056d4779a246d6fd333c5d45269d83c8ba9052a121975109bc4ea03a5052fa6
MD5 ddca1332f9ade53c04497223f5e6d256
BLAKE2b-256 74f7e5bb3e674faeab48428f0794ef7f550db5ebbd6fd279db63e5434d69cc75

See more details on using hashes here.

File details

Details for the file field_descriptor-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: field_descriptor-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.1

File hashes

Hashes for field_descriptor-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f23ce9fbab5207d121eec4445cb7be862ca7abd87bd907fb313ca6c254e9914b
MD5 047d7cb3f65c84ab0205978c75675886
BLAKE2b-256 67509cf1f8cb2809b3900fed682eb7e84a31a95956bab42f020a6a495d71b45f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page