{"id":14974185,"url":"https://github.com/freelancer/pavlova","last_synced_at":"2025-10-27T06:31:56.105Z","repository":{"id":57451147,"uuid":"145371231","full_name":"freelancer/pavlova","owner":"freelancer","description":"A python deserialisation library built on top of dataclasses","archived":false,"fork":false,"pushed_at":"2018-11-18T22:26:13.000Z","size":43,"stargazers_count":32,"open_issues_count":0,"forks_count":2,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-02-01T03:22:18.271Z","etag":null,"topics":["dataclasses","deserialization","flask","python","python37"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freelancer.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":null,"license":"COPYING.LESSER","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-20T05:43:01.000Z","updated_at":"2022-06-05T14:47:07.000Z","dependencies_parsed_at":"2022-09-26T17:31:28.381Z","dependency_job_id":null,"html_url":"https://github.com/freelancer/pavlova","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2Fpavlova","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2Fpavlova/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2Fpavlova/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freelancer%2Fpavlova/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freelancer","download_url":"https://codeload.github.com/freelancer/pavlova/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238455088,"owners_count":19475376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dataclasses","deserialization","flask","python","python37"],"created_at":"2024-09-24T13:50:07.379Z","updated_at":"2025-10-27T06:31:55.777Z","avatar_url":"https://github.com/freelancer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"*****************************************************\npavlova: simplified deserialization using dataclasses\n*****************************************************\n\n**pavlova** is a library that assists in mapping an unknown input into a\ndataclass.\n\n.. code-block:: python\n\n    from datetime import datetime\n    from dataclasses import dataclass\n\n    from pavlova import Pavlova\n\n\n    @dataclass\n    class Input:\n        id: int\n        name: str\n        date: datetime\n\n\n    Pavlova().from_mapping({\n        'id': 10,\n        'name': 100\n        'date': '2018-08-10',\n    }, Input)\n    # Input(id=10, name='100', date=datetime.datetime(2018, 8, 10, 0, 0))\n\n\nPavlova was born out of frustration with the lack of typing support for\nexisting deserialization libraries. With the introduction of dataclasses in\nPython 3.7, they seemed like the perfect use for defining a deserialization\nschema.\n\n\nSupported functionality\n#######################\n\nParsing of booleans, datetimes, floats, ints, strings, decimals, dictionaries,\nenums, lists are currently supported.\n\nThere are more parsers to come, however to implement your own custom parser,\nsimply implement `PavlovaParser` in `pavlova.parsers`, and register it with the\nPavlova object with the `register_parser` method.\n\nInstallation\n############\n\n.. code-block:: shell\n\n    pip install pavlova\n\nUsage with Flask\n################\n\n.. code-block:: python\n\n    from dataclasses import dataclass, asdict\n\n    from flask import Flask, jsonify\n    from pavlova.flask import FlaskPavlova\n\n    pavlova = FlaskPavlova()\n    app = Flask(__name__)\n\n    @dataclass\n    class SampleInput:\n        id: int\n        name: str\n\n    @app.route('/post', methods=['POST'])\n    @pavlova.use(SampleInput)\n    def data(data: SampleInput):\n        data.id = data.id * len(data.name)\n        return jsonify(asdict(data))\n\n\n    app.run()\n\nAdding Custom Types\n###################\n\nThere are a couple of different ways to implement new types for parsing in\npavlova. In general, the process is to add a parser a specific type. For\nvalidation you should raise a TypeError or ValueError.\n\nThe first one, is creating a new type that extends an existing base type. Here\nis an example on how to implement an Email type, which is a string but performs\nvalidation.\n\n.. code-block:: python\n\n    from pavlova import Pavlova\n    from pavlova.parsers import GenericParser\n\n    class Email(str):\n        def __new__(cls, input_value: typing.Any) -\u003e str:\n            if isinstance(input_value, str):\n                if '@' in input_value:\n                    return str(input_value)\n                raise ValueError()\n            raise TypeError()\n\n    pavlova = Pavlova()\n    pavlova.register_parser(Email, GenericParser(pavlova, Email))\n\nAnother way, is to implement your own pavlova parser, rather than using your\nthe built in `GenericParser` parser.\n\n.. code-block:: python\n\n    import datetime\n    from typing import Any, Tuple\n\n    import dateparser\n    from pavlova import Pavlova\n    from pavlova.parsers import PavlovaParser\n\n    class DatetimeParser(PavlovaParser[datetime.datetime]):\n        \"Parses a datetime\"\n\n        def parse_input(self,\n                        input_value: Any,\n                        field_type: Type,\n                        path: Tuple[str, ...]) -\u003e datetime.datetime:\n            return dateparser.parse(input_value)\n\n    pavlova = Pavlova()\n    pavlova.register_parser(datetime.DateTime, DatetimeParser(pavlova))\n\nRequirements\n############\n\nPavlova is only supported on Python 3.6 and higher. With Python 3.6, it will\ninstall the `dataclasses \u003chttps://github.com/ericvsmith/dataclasses\u003e`__ module.\nWith Python 3.7 and higher, it will use the built-in dataclasses module.\n\nLicense\n~~~~~~~\n\nGNU LGPLv3. Please see `LICENSE \u003cLICENSE\u003e`__ and\n`COPYING.LESSER \u003cCOPYING.LESSER\u003e`__.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreelancer%2Fpavlova","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreelancer%2Fpavlova","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreelancer%2Fpavlova/lists"}