Skip to main content

Simplified deserialization using dataclasses

Project description

pavlova is a library that assists in mapping an unknown input into a dataclass.

from datetime import datetime
from dataclasses import dataclass

from pavlova import Pavlova


@dataclass
class Input:
    id: int
    name: str
    date: datetime


Pavlova().from_mapping({
    'id': 10,
    'name': 100
    'date': '2018-08-10',
}, Input)
# Input(id=10, name='100', date=datetime.datetime(2018, 8, 10, 0, 0))

Pavlova was born out of frustration with the lack of typing support for existing deserialization libraries. With the introduction of dataclasses in Python 3.7, they seemed like the perfect use for defining a deserialization schema.

Supported functionality

Parsing of booleans, datetimes, floats, ints, strings, decimals, dictionaries, enums, lists are currently supported.

There are more parsers to come, however to implement your own custom parser, simply implement PavlovaParser in pavlova.parsers, and register it with the Pavlova object with the register_parser method.

Installation

pip install pavlova

Usage with Flask

from dataclasses import dataclass, asdict

from flask import Flask, jsonify
from pavlova.flask import FlaskPavlova

pavlova = FlaskPavlova()
app = Flask(__name__)

@dataclass
class SampleInput:
    id: int
    name: str

@app.route('/post', methods=['POST'])
@pavlova.use(SampleInput)
def data(data: SampleInput):
    data.id = data.id * len(data.name)
    return jsonify(asdict(data))


app.run()

Adding Custom Types

There are a couple of different ways to implement new types for parsing in pavlova. In general, the process is to add a parser a specific type. For validation you should raise a TypeError or ValueError.

The first one, is creating a new type that extends an existing base type. Here is an example on how to implement an Email type, which is a string but performs validation.

from pavlova import Pavlova
from pavlova.parsers import GenericParser

class Email(str):
    def __new__(cls, input_value: typing.Any) -> str:
        if isinstance(input_value, str):
            if '@' in input_value:
                return str(input_value)
            raise ValueError()
        raise TypeError()

pavlova = Pavlova()
pavlova.register_parser(Email, GenericParser(pavlova, Email))

Another way, is to implement your own pavlova parser, rather than using your the built in GenericParser parser.

import datetime
from typing import Any, Tuple

import dateparser
from pavlova import Pavlova
from pavlova.parsers import PavlovaParser

class DatetimeParser(PavlovaParser[datetime.datetime]):
    "Parses a datetime"

    def parse_input(self,
                    input_value: Any,
                    field_type: Type,
                    path: Tuple[str, ...]) -> datetime.datetime:
        return dateparser.parse(input_value)

pavlova = Pavlova()
pavlova.register_parser(datetime.DateTime, DatetimeParser(pavlova))

Requirements

Pavlova is only supported on Python 3.6 and higher. With Python 3.6, it will install the dataclasses module. With Python 3.7 and higher, it will use the built-in dataclasses module.

License

GNU LGPLv3. Please see LICENSE and COPYING.LESSER.

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

pavlova-0.1.3.tar.gz (6.2 kB view details)

Uploaded Source

Built Distribution

pavlova-0.1.3-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file pavlova-0.1.3.tar.gz.

File metadata

  • Download URL: pavlova-0.1.3.tar.gz
  • Upload date:
  • Size: 6.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for pavlova-0.1.3.tar.gz
Algorithm Hash digest
SHA256 baf36f3f0d5a1cc6dc3829492b3cbd3f0ddfd3601d85ab2a1e47c2ccd457e5d4
MD5 7b110f8eb8a325b095c76fb52c54e04a
BLAKE2b-256 aed0493a65b4f57c0f1034d4592958cfa1709fcaf1da3ddb9af3bec8bc029d6f

See more details on using hashes here.

File details

Details for the file pavlova-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: pavlova-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 22.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.1

File hashes

Hashes for pavlova-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1a5acb53c288dc50b2eeb594dfc07a3af3bb8b0a7066e195d257d05c7c2ee1c8
MD5 78e530ca2d735d4f7b28350c8db2cd7b
BLAKE2b-256 c1b1e90445013016ebdb2adc9c62ae4e67479e4b3d9f97cabb372015444fb2f1

See more details on using hashes here.

Supported by

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