{ "info": { "author": "Ross MacArthur", "author_email": "ross@macarthur.io", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "Serde\n=====\n\n.. image:: https://img.shields.io/pypi/v/serde.svg?style=flat-square&colorB=4c1\n :target: https://pypi.org/project/serde/\n :alt: PyPI Version\n\n.. image:: https://img.shields.io/badge/docs-passing-brightgreen.svg?style=flat-square\n :target: https://ross.macarthur.io/project/serde/\n :alt: Documentation Status\n\n.. image:: https://img.shields.io/travis/rossmacarthur/serde/master.svg?style=flat-square\n :target: https://travis-ci.org/rossmacarthur/serde\n :alt: Build Status\n\n.. image:: https://img.shields.io/codecov/c/github/rossmacarthur/serde.svg?style=flat-square\n :target: https://codecov.io/gh/rossmacarthur/serde\n :alt: Code Coverage\n\nSerde is a lightweight, general-purpose framework for defining, serializing,\ndeserializing, and validating data structures in Python.\n\n.. contents::\n :backlinks: none\n :local:\n :depth: 2\n\nGetting started\n---------------\n\nInstallation\n^^^^^^^^^^^^\n\nSerde is available on PyPI, you can install it using\n\n.. code-block:: sh\n\n pip install serde\n\n\nExtended features can be installed with the ``ext`` feature.\n\n.. code-block:: sh\n\n pip install serde[ext]\n\nIntroduction\n^^^^^^^^^^^^\n\nIn Serde *models* are containers for *fields*. Data structures are defined by\nsubclassing ``Model`` and assigning ``Field`` instances as class annotations.\nThese fields handle serialization, deserialization, normalization, and\nvalidation for the corresponding model attributes.\n\n.. code-block:: python\n\n from datetime import date\n from serde import Model, fields\n\n class Artist(Model):\n name: fields.Str()\n\n class Album(Model):\n title: fields.Str()\n release_date: fields.Optional(fields.Date)\n artist: fields.Nested(Artist)\n\n album = Album(\n title='Dangerously in Love',\n release_date=date(2003, 6, 23),\n artist=Artist(name='Beyonc\u00e9')\n )\n assert album.to_dict() == {\n 'title': 'Dangerously in Love',\n 'release_date': '2003-06-23',\n 'artist': {\n 'name': 'Beyonc\u00e9'\n }\n }\n\n album = Album.from_json(\"\"\"{\n \"title\": \"Lemonade\",\n \"artist\": {\"name\": \"Beyonc\u00e9\"}}\"\n \"\"\")\n assert album == Album(title='Lemonade', artist=Artist(name='Beyonc\u00e9'))\n\nBasic usage\n-----------\n\nBelow we create a ``User`` model by subclassing ``Model`` and adding the\n``name`` and ``email`` fields.\n\n.. code-block:: python\n\n >>> from datetime import datetime\n >>> from serde import Model, fields\n >>>\n >>> class User(Model):\n ... name: fields.Str(rename='username')\n ... email: fields.Email()\n\nThe corresponding attribute names are used to instantiate the model object and\naccess the values on the model instance.\n\n.. code-block:: python\n\n >>> user = User(name='Linus Torvalds', email='torvalds@linuxfoundation.org')\n >>> user.name\n 'Linus Torvalds'\n >>> user.email\n 'torvalds@linuxfoundation.org'\n\nModels are validated when they are instantiated and an ``InstantiationError`` is\nraised if you provide invalid values.\n\n.. code-block:: python\n\n >>> User(name='Linus Torvalds', email='not an email')\n Traceback (most recent call last):\n ...\n serde.exceptions.InstantiationError: 'not an email' is not a valid email\n\nModels are serialized into primitive Python types using the ``to_dict()`` method\non the model instance.\n\n.. code-block:: python\n\n >>> user.to_dict()\n OrderedDict([('username', 'Linus Torvalds'), ('email', 'torvalds@linuxfoundation.org')])\n\nOr to JSON using the ``to_json()`` method.\n\n.. code-block:: python\n\n >>> user.to_json()\n '{\"username\": \"Linus Torvalds\", \"email\": \"torvalds@linuxfoundation.org\"}'\n\nModels are also validated when they are deserialized. Models are deserialized\nfrom primitive Python types using the reciprocal ``from_dict()`` class method.\n\n.. code-block:: python\n\n >>> user = User.from_dict({\n ... 'username': 'Donald Knuth',\n ... 'email': 'noreply@stanford.edu'\n ... })\n\nOr from JSON using the ``from_json()`` method.\n\n.. code-block:: python\n\n >>> user = User.from_json('''{\n ... \"username\": \"Donald Knuth\",\n ... \"email\": \"noreply@stanford.edu\"\n ... }''')\n\nAttempting to deserialize invalid data will result in a\n``DeserializationError``.\n\n.. code-block:: python\n\n >>> User.from_dict({'username': 'Donald Knuth'})\n Traceback (most recent call last):\n ...\n serde.exceptions.DeserializationError: expected field 'email'\n\nModels\n------\n\nModels can be nested and used in container-like fields. Below we create a\n``Blog`` with an author and a list of subscribers which must all be ``User``\ninstances.\n\n.. code-block:: python\n\n >>> class Blog(Model):\n ... title: fields.Str()\n ... author: fields.Nested(User)\n ... subscribers: fields.List(User)\n\nWhen instantiating you have to supply instances of the nested models.\n\n.. code-block:: python\n\n >>> blog = Blog(\n ... title=\"sobolevn's personal blog\",\n ... author=User(name='Nikita Sobolev', email='mail@sobolevn.me'),\n ... subscribers=[\n ... User(name='Ned Batchelder', email='ned@nedbatchelder.com')\n ... ]\n ... )\n\nSerializing a ``Blog`` would serialize the entire nested structure.\n\n.. code-block:: python\n\n >>> print(blog.to_json(indent=2))\n {\n \"title\": \"sobolevn's personal blog\",\n \"author\": {\n \"username\": \"Nikita Sobolev\",\n \"email\": \"mail@sobolevn.me\"\n },\n \"subscribers\": [\n {\n \"username\": \"Ned Batchelder\",\n \"email\": \"ned@nedbatchelder.com\"\n }\n ]\n }\n\nSimiliarly deserializing a ``Blog`` would deserialize the entire nested\nstructure, and create instances of all the submodels.\n\nSubclassed models\n^^^^^^^^^^^^^^^^^\n\nModels can be subclassed. The subclass will have all the fields of the parent\nand any additional ones. Consider the case where we define a ``SuperUser`` model\nwhich is a subclass of a ``User``. Simply a ``User`` that has an extra ``level``\nfield.\n\n.. code-block:: python\n\n >>> class SuperUser(User):\n ... # inherits name and email fields from User\n ... level: fields.Choice(['admin', 'read-only'])\n\nWe instantiate a subclassed model as normal by passing in each field value.\n\n.. code-block:: python\n\n >>> superuser = SuperUser(\n ... name='Linus Torvalds',\n ... email='torvalds@linuxfoundation.org',\n ... level='admin'\n ... )\n\nThis is great for many cases, however, a commonly desired paradigm is to be able\nto have the ``User.from_dict()`` class method be able to deserialize a\n``SuperUser`` as well. This can be made possible through *model tagging*.\n\nModel tagging\n-------------\n\nModel tagging is a way to mark serialized data in order to show that it is a\nparticular *variant* of a model. Serde provides three types of model tagging,\nbut you can also define you own custom ``Tag``. A ``Tag`` can be thought of in\nthe same way as a ``Field`` but instead of deserializing data into an attribute\non a model instance, it deserializes data into a model class.\n\nInternally tagged\n^^^^^^^^^^^^^^^^^\n\nInternally tagged data stores a tag value inside the serialized data.\n\nLet us consider an example where we define a ``Pet`` model with a ``tag``. We\ncan then subclass this model and deserialize arbitrary subclasses using the\ntagged model.\n\n.. code-block:: python\n\n >>> from serde import Model, fields, tags\n >>>\n >>> class Pet(Model):\n ... name: fields.Str()\n ...\n ... class Meta:\n ... tag = tags.Internal(tag='species')\n ...\n >>> class Dog(Pet):\n ... hates_cats: fields.Bool()\n ...\n >>> class Cat(Pet):\n ... hates_dogs: fields.Bool()\n\nWe refer to the ``Dog`` and ``Cat`` subclasses as *variants* of ``Pet``. When\nserializing all parent model tag serialization is done after field\nserialization.\n\n.. code-block:: python\n\n >>> Cat(name='Fluffy', hates_dogs=True).to_dict()\n OrderedDict([('name', 'Fluffy'), ('hates_dogs', True), ('species', 'Cat')])\n\nWhen deserializing, tag deserialization is done first to determine which model\nto use for the deserialization.\n\n.. code-block:: python\n\n >>> milo = Pet.from_dict({\n ... 'name': 'Milo',\n ... 'hates_cats': False,\n ... 'species': 'Dog'\n ... })\n >>> milo.__class__\n \n >>> milo.name\n 'Milo'\n >>> milo.hates_cats\n False\n\nAn invalid or missing tag will raise a ``DeserializationError``.\n\n.. code-block:: python\n\n >>> Pet.from_dict({'name': 'Milo', 'hates_cats': False})\n Traceback (most recent call last):\n ...\n serde.exceptions.DeserializationError: expected tag 'species'\n >>>\n >>> Pet.from_dict({'name': 'Duke', 'species': 'Horse'})\n Traceback (most recent call last):\n ...\n serde.exceptions.DeserializationError: no variant found for tag 'Horse'\n\nExternally tagged\n^^^^^^^^^^^^^^^^^\n\nExternally tagged data uses the tag value as a key and nests the content\nunderneath that key. All other processes behave similarly to the internally\ntagged example above.\n\n.. code-block:: python\n\n >>> class Pet(Model):\n ... name: fields.Str()\n ...\n ... class Meta:\n ... tag = tags.External()\n ...\n >>> class Dog(Pet):\n ... hates_cats: fields.Bool()\n ...\n >>> Dog(name='Max', hates_cats=True).to_dict()\n OrderedDict([('Dog', OrderedDict([('name', 'Max'), ('hates_cats', True)]))])\n\nAdjacently tagged\n^^^^^^^^^^^^^^^^^\n\nAdjacently tagged data data stores the tag value and the content underneath two\nseparate keys. All other processes behave similarly to the internally tagged\nexample.\n\n.. code-block:: python\n\n >>> class Pet(Model):\n ... name: fields.Str()\n ...\n ... class Meta:\n ... tag = tags.Adjacent(tag='species', content='data')\n ...\n >>> class Dog(Pet):\n ... hates_cats: fields.Bool()\n ...\n >>> Dog(name='Max', hates_cats=True).to_dict()\n OrderedDict([('species', 'Dog'), ('data', OrderedDict([('name', 'Max'), ('hates_cats', True)]))])\n\nAbstract models\n^^^^^^^^^^^^^^^\n\nBy default model tagging still allows deserialization of the base model. It is\ncommon to have this model be abstract. You can do this by setting the\n``abstract`` Meta field to ``True``. This will make it uninstantiatable and it\nwon't be included in the variant list during deserialization.\n\n.. code-block:: python\n\n >>> class Fruit(Model):\n ... class Meta:\n ... abstract = True\n ...\n >>> Fruit()\n Traceback (most recent call last):\n ...\n serde.exceptions.InstantiationError: unable to instantiate abstract Model 'Fruit'\n\nCustom tags\n^^^^^^^^^^^\n\nIt is possible to create your own custom tag class by subclassing any of\n``tags.External``, ``tags.Internal``, ``tags.Adjacent`` or even the base\n``tags.Tag``. This will allow customization of how the variants are looked up,\nhow the tag values are generated for variants, and how the data is serialized.\n\nConsider an example where we use a class attribute ``code`` as the tag value.\n\n.. code-block:: python\n\n >>> class Custom(tags.Internal):\n ... def lookup_tag(self, variant):\n ... return variant.code\n ...\n >>> class Pet(Model):\n ... name: fields.Str()\n ...\n ... class Meta:\n ... abstract = True\n ... tag = Custom(tag='code')\n ...\n >>> class Dog(Pet):\n ... code = 1\n ... hates_cats: fields.Bool()\n ...\n >>> Dog(name='Max', hates_cats=True).to_dict()\n OrderedDict([('name', 'Max'), ('hates_cats', True), ('code', 1)])\n >>> max = Pet.from_dict({'name': 'Max', 'hates_cats': True, 'code': 1})\n >>> max.__class__\n \n >>> max.name\n 'Max'\n >>> max.hates_cats\n True\n\nFields\n------\n\nFields do the work of serializing, deserializing, normalizing, and validating\nthe input values. Fields are always assigned to a model as *instances* , and\nthey support extra serialization, deserialization, normalization, and validation\nof values without having to subclass ``Field``. For example\n\n.. code-block:: python\n\n from serde import Model, fields, validators\n\n class Album(Model):\n title: fields.Str(normalizers=[str.strip])\n released: fields.Date(\n rename='release_date',\n validators=[validators.Min(datetime.date(1912, 4, 15))]\n )\n\nIn the above example we define an ``Album`` class. The ``title`` field is of\ntype `str` , and we apply the ``str.strip`` normalizer to automatically strip\nthe input value when instantiating or deserializing the ``Album``. The\n``released`` field is of type ``datetime.date`` and we apply an extra validator\nto only accept dates after 15th April 1912. Note: the ``rename`` argument only\napplies to the serializing and deserializing of the data, the ``Album`` class\nwould still be instantiated using ``Album(released=...)``.\n\nThe ``create()`` method can be used to generate a new ``Field`` class from\narbitrary functions without having to manually subclass a ``Field``. For example\nif we wanted a ``Percent`` field we would do the following.\n\n.. code-block:: python\n\n >>> from serde import fields, validators\n >>>\n >>> Percent = fields.create(\n ... 'Percent',\n ... fields.Float,\n ... validators=[validators.Between(0.0, 100.0)]\n ... )\n >>>\n >>> issubclass(Percent, fields.Float)\n True\n\nIf these methods of creating custom ``Field`` classes are not satisfactory, you\ncan always subclass a ``Field`` and override the relevant methods.\n\n.. code-block:: python\n\n >>> class Percent(fields.Float):\n ... def validate(self, value):\n ... super().validate(value)\n ... validators.Between(0.0, 100.0)(value)\n\nPython 2.7 and Python 3.5 compatibility\n---------------------------------------\n\nClass annotations were only added in Python 3.6, for this reason class\nattributes can be used for ``Field`` definitions for projects that require\ncompatibility for these versions. For example\n\n.. code-block:: python\n\n class Artist(Model):\n name: fields.Str()\n\n class Album(Model):\n title: fields.Str()\n release_date: fields.Optional(fields.Date)\n artist: fields.Nested(Artist)\n\nis equivalent to\n\n.. code-block:: python\n\n class Artist(Model):\n name = fields.Str()\n\n class Album(Model):\n title = fields.Str()\n release_date = fields.Optional(fields.Date)\n artist = fields.Nested(Artist)\n\nModel states and processes\n--------------------------\n\nIn Serde, there are two states that the data can be in:\n\n* Serialized data\n* Model instance\n\nThere are five different processes that the data structure can go through when\nmoving between these two states.\n\n* Deserialization happens when you create a model instance from a serialized\n version using ``from_dict()`` or similar.\n* Instantiation happens when you construct a model instance in Python using the\n ``__init__()`` constructor.\n* Normalization happens after instantiation and after deserialization. This is\n usually a way to transform things before they are validated. For example: this\n is where an ``Optional`` field sets default values.\n* Validation is where the model and fields values are validated. This happens\n after normalization.\n* Serialization is when you serialize a model instance to a supported\n serialization format using ``to_dict()`` or similar.\n\nThe diagram below shows how the stages (uppercase) and processes (lowercase) fit\nin with each other.\n\n.. code-block:: text\n\n\n +---------------+\n | Instantiation |\n +---------------+\n |\n v\n +---------------+ +---------------+\n |Deserialization|-->| Normalization |\n +---------------+ +---------------+\n ^ |\n | v\n | +---------------+\n | | Validation |\n | +---------------+\n | |\n | v\n +-------+-------+ +---------------+\n |SERIALIZED DATA| | MODEL INSTANCE|\n +---------------+ +---------------+\n ^ |\n | |\n +-------+-------+ |\n | Serialization |<----------+\n +---------------+\n\nLicense\n-------\n\nThis project is licensed under the MIT License.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/rossmacarthur/serde/archive/0.7.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/rossmacarthur/serde", "keywords": "serde serialization deserialization validation schema json", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "serde", "package_url": "https://pypi.org/project/serde/", "platform": "", "project_url": "https://pypi.org/project/serde/", "project_urls": { "Documentation": "https://ross.macarthur.io/project/serde/", "Download": "https://github.com/rossmacarthur/serde/archive/0.7.1.tar.gz", "Homepage": "https://github.com/rossmacarthur/serde", "Issue Tracker": "https://github.com/rossmacarthur/serde/issues" }, "release_url": "https://pypi.org/project/serde/0.7.1/", "requires_dist": [ "isodate (<0.7.0,>=0.6.0)", "six (<2.0.0,>=1.0.0)", "chardet (<4.0.0,>=3.0.0) ; extra == 'ext'", "validators (<0.15.0,>=0.12.0) ; extra == 'ext'" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "summary": "Define, serialize, deserialize, and validate Python data structures.", "version": "0.7.1" }, "last_serial": 5888844, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "67277c7ec52c32c6558e2fa09c488d92", "sha256": "b23ee67f50bb898f5ceaefd63455b120f88083a1568be2b63e62cad4b49cafaf" }, "downloads": -1, "filename": "serde-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "67277c7ec52c32c6558e2fa09c488d92", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 14999, "upload_time": "2018-10-27T15:06:25", "url": "https://files.pythonhosted.org/packages/7c/ba/83fd35e6503e68d9970c9e712538fd171e95f934162ceb120bc98069c58e/serde-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c1aff4b63c5c3d23191234272a0563a", "sha256": "3647b4fbc7805d96fbda424958ee20bbae5230cd3c982b14c410dea04fba4df6" }, "downloads": -1, "filename": "serde-0.1.1.tar.gz", "has_sig": false, "md5_digest": "3c1aff4b63c5c3d23191234272a0563a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 21649, "upload_time": "2018-10-27T15:06:27", "url": "https://files.pythonhosted.org/packages/b8/c3/b29785e1d1dcabfdf5673f776836b6578c680979653aba8f436b05ec1e4f/serde-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "cffd5a9c7c6106b6c2ffe3d5acf014a7", "sha256": "9e18d2d594805ef1c456b65098ef5b137021f68edc47272671daf7f6caf53ba0" }, "downloads": -1, "filename": "serde-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "cffd5a9c7c6106b6c2ffe3d5acf014a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 15278, "upload_time": "2018-10-28T13:17:20", "url": "https://files.pythonhosted.org/packages/32/b2/3c46c171e5534ff8b9806a1f9f9fc26d39ea84e60c7cff242fe24f12b211/serde-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "951dfcb5af27eb108e3b3eb4289914f4", "sha256": "524bfd8b7094496ff2d1ef9d32a677b7ed5f6b142725d865a35faf3ac3ca29ba" }, "downloads": -1, "filename": "serde-0.1.2.tar.gz", "has_sig": false, "md5_digest": "951dfcb5af27eb108e3b3eb4289914f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 22138, "upload_time": "2018-10-28T13:17:22", "url": "https://files.pythonhosted.org/packages/ec/36/a2dbd28a3418f2ddc3c4d61d903a189d0428953a7e87c211b9ce9a0f7c79/serde-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "119a8c76242d8cfcdab8933ef94fec01", "sha256": "9cf1262a2f1484eed9ac6e8371dfe2e52bc1f5eb9bdb2414ec122ae4a627fd36" }, "downloads": -1, "filename": "serde-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "119a8c76242d8cfcdab8933ef94fec01", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 17222, "upload_time": "2018-11-16T13:15:44", "url": "https://files.pythonhosted.org/packages/48/f6/8c08e02e08541e7988d0c9ea04695e0f14f31eb9ddc7c24d082b7e011f8d/serde-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eccd5781fde2af1544c5d90d4bf97eb0", "sha256": "5d73d1a1d79c5a10c68ce69dfba9a5a5d72a1258589a994d57678a61a88528a8" }, "downloads": -1, "filename": "serde-0.2.0.tar.gz", "has_sig": false, "md5_digest": "eccd5781fde2af1544c5d90d4bf97eb0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 24711, "upload_time": "2018-11-16T13:15:46", "url": "https://files.pythonhosted.org/packages/fc/13/ef6fdfc0367464a443b134ff3b4ef33d7d570b04047731d1eb9a38f232a1/serde-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a91078085a77168a28d49b359f362b4e", "sha256": "77c8e28729874c19cdd7cfc14dd1cacb381e0a7b7adadffc79ea637aed952b2b" }, "downloads": -1, "filename": "serde-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a91078085a77168a28d49b359f362b4e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 18117, "upload_time": "2018-11-21T13:09:37", "url": "https://files.pythonhosted.org/packages/e6/9e/81c4324bf2709f5af6d5602df7f24077155787f1a47c22a48265213c31c0/serde-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "135004c07b0f74abb63d99e5e0b9df79", "sha256": "9c10b99885094b3c298387b7f5d92b6917513199e70ec8b64953a32ea3180811" }, "downloads": -1, "filename": "serde-0.2.1.tar.gz", "has_sig": false, "md5_digest": "135004c07b0f74abb63d99e5e0b9df79", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 26337, "upload_time": "2018-11-21T13:09:39", "url": "https://files.pythonhosted.org/packages/b4/d8/d2d33c3c58bd5a6be7238418183d9935e013ab9623eff3833d9260876abd/serde-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "479b5783c7006bff031a1bcdf4d98f5d", "sha256": "b2d088f9a6cc7161c598efe159e8b3a2b921d095830518f386e4bb5016b67219" }, "downloads": -1, "filename": "serde-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "479b5783c7006bff031a1bcdf4d98f5d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 17663, "upload_time": "2018-12-09T12:30:11", "url": "https://files.pythonhosted.org/packages/13/97/2987a026421aae4411d8ea97f03c2473cb51b19d9b645ea4ed567943d445/serde-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9aa38b4ada771dd220a9a32fb2685e34", "sha256": "0825b41a01658c1b3979458a35b14a514ad89acf683d05dabacaada91c577041" }, "downloads": -1, "filename": "serde-0.3.0.tar.gz", "has_sig": false, "md5_digest": "9aa38b4ada771dd220a9a32fb2685e34", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 26472, "upload_time": "2018-12-09T12:30:14", "url": "https://files.pythonhosted.org/packages/f2/e2/ffddde1a0b40f0e9f93055c358c442551eee820b6630c0a9193b2a15622e/serde-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "b1fe20a4d8d49a3e5398d474e74e73ae", "sha256": "975ed4b4a2d664a844afb9e60204d164f6fb076238fa5b7be0edfa5a91056702" }, "downloads": -1, "filename": "serde-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b1fe20a4d8d49a3e5398d474e74e73ae", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 17915, "upload_time": "2018-12-17T11:07:52", "url": "https://files.pythonhosted.org/packages/97/8a/6f20938d367bc72a63b8ec6affdd65e68e33d9ea1b73f1fd168cdb3c9b69/serde-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "853062f9c5210348bb85577f2e8b5fc3", "sha256": "5c65dc40e279c06358b7180eb9615383a3612e34a5b5112f24a99476ab849c91" }, "downloads": -1, "filename": "serde-0.3.1.tar.gz", "has_sig": false, "md5_digest": "853062f9c5210348bb85577f2e8b5fc3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 28044, "upload_time": "2018-12-17T11:08:01", "url": "https://files.pythonhosted.org/packages/2c/45/c1151212816a35cce0ba1384d3f75effa2439bf97cf39df4f51f7c2d9757/serde-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "d404db45125ed39f827c1b74407c36f6", "sha256": "d4ed5ed5081382f580faadcd9ba0af9f8bcbd6a3196d66fe594bceb7fdcc14d3" }, "downloads": -1, "filename": "serde-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d404db45125ed39f827c1b74407c36f6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 17943, "upload_time": "2018-12-19T15:06:13", "url": "https://files.pythonhosted.org/packages/9b/8e/a7ed81888191574aac3e855d48848ab6fdf0b269f338687853bef85e6500/serde-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c77221dbbb5cfe2b7e1ac04d44c3edc7", "sha256": "9ab1f85d8b71c8bf1a4cdc1254d344a41229784b2db727e72d1829d6ec8963f1" }, "downloads": -1, "filename": "serde-0.3.2.tar.gz", "has_sig": false, "md5_digest": "c77221dbbb5cfe2b7e1ac04d44c3edc7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 28170, "upload_time": "2018-12-19T15:06:23", "url": "https://files.pythonhosted.org/packages/33/94/404d81b6905709555f0417cf888e9335a3d1ab3aa71d9cfc5995f7a6062b/serde-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "4c1d5e2fc36b9cfe37acb25b260112dd", "sha256": "19e5f4b191ce06709028781c5f08fa0294deb1e5738c82e94f47b8a24c7996aa" }, "downloads": -1, "filename": "serde-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4c1d5e2fc36b9cfe37acb25b260112dd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 18525, "upload_time": "2019-01-06T16:41:08", "url": "https://files.pythonhosted.org/packages/09/34/5909d6215f4122e7b34a37d912758f2a6f73701160deea172a03183386ec/serde-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc48d04989d435100bbc47642efcbc09", "sha256": "fd4d91228ab2ae58fb766403c8e2f1b688c3989677a5980606c393de70044c3c" }, "downloads": -1, "filename": "serde-0.4.0.tar.gz", "has_sig": false, "md5_digest": "bc48d04989d435100bbc47642efcbc09", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 29052, "upload_time": "2019-01-06T16:41:11", "url": "https://files.pythonhosted.org/packages/e9/42/a246f3bd3a8a94942966b505c27223bdc4b95fa9978f6a55220fa30dfe98/serde-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "53979bd048adfedb0c2d9dad608820af", "sha256": "758631a1d5e2c3dd1f2906033e9c38b233888ca8fa940ac10df701ae90fd7de9" }, "downloads": -1, "filename": "serde-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "53979bd048adfedb0c2d9dad608820af", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 18587, "upload_time": "2019-01-23T13:38:34", "url": "https://files.pythonhosted.org/packages/62/59/3403cb27e28709d6cec676801b64cf2c6ce105593e5f1008da0f3f9fedd5/serde-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4ee9a20b0d7f9aaa64f471978924d708", "sha256": "048a9772c3dd63a4e15f3c7a17bba13921eda540f0427a6cab06048f4554b156" }, "downloads": -1, "filename": "serde-0.4.1.tar.gz", "has_sig": false, "md5_digest": "4ee9a20b0d7f9aaa64f471978924d708", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 29334, "upload_time": "2019-01-23T13:38:36", "url": "https://files.pythonhosted.org/packages/73/b1/b846eda64eedbe26cfc12673c671c5835aae59d684d59116f05a4cc6e761/serde-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "d53a52331325fbd2e1422f16ca701c21", "sha256": "39228438cfc187a10c7399a50df283bad2b01f659c2330036eddf0d30f814af2" }, "downloads": -1, "filename": "serde-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d53a52331325fbd2e1422f16ca701c21", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 19529, "upload_time": "2019-01-29T13:22:11", "url": "https://files.pythonhosted.org/packages/6c/e6/a07a524d837947f55a43b021d2bbf0486a8e35185a0ed01a206fdd08ab61/serde-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e60127352bd7bed5648b9aa44944b08", "sha256": "b9d0eee45f186cda052df0dd7ab520d70011b3727da7f11b50ebbd7b1276c02e" }, "downloads": -1, "filename": "serde-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6e60127352bd7bed5648b9aa44944b08", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 31099, "upload_time": "2019-01-29T13:22:13", "url": "https://files.pythonhosted.org/packages/3a/80/01538b0ec5fbf8461f6c717a71405819c5d94f99edbbc233a4a44b52732b/serde-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "5f6bc0f88ae03571793da8dcff2106d6", "sha256": "e9f3cb11d6d762f09bff99e08acca0c4e602a47386ceb0d6288862d45668b982" }, "downloads": -1, "filename": "serde-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5f6bc0f88ae03571793da8dcff2106d6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 19763, "upload_time": "2019-01-29T14:06:00", "url": "https://files.pythonhosted.org/packages/5d/2c/c9fca0881df51f035e64defae41bcc56bc2748bb6dc7b1e1dcf4e136dd3b/serde-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "97cfac309cb849902f5f8d921944d16f", "sha256": "b9b5469312974f6d40707e9208a718cf2f42adc18393cba7b7c8eed681f82088" }, "downloads": -1, "filename": "serde-0.5.1.tar.gz", "has_sig": false, "md5_digest": "97cfac309cb849902f5f8d921944d16f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 31382, "upload_time": "2019-01-29T14:06:03", "url": "https://files.pythonhosted.org/packages/84/b4/a663000964280f0ce4ce9458a9f9cbd9101a429d85d4e63a9291f652e429/serde-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "c6041ad5ab642bef54085c3d867c5870", "sha256": "f7177359c4dbe02b9b27320c9f4afd0f22b5f78a31602edbb6c2a0d19849ae7a" }, "downloads": -1, "filename": "serde-0.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c6041ad5ab642bef54085c3d867c5870", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 19849, "upload_time": "2019-02-04T06:19:55", "url": "https://files.pythonhosted.org/packages/e9/d6/1667623f9bdc158a0e30d5b6d23cd11a30d26c719a1bbd6fbd8aa9546784/serde-0.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fe6db7b81ac4894819c4ebf5895fe1a", "sha256": "5481ef3bf8d9c4ace3fca8401a7021f52c0fd60350f0407163e6088042661bb2" }, "downloads": -1, "filename": "serde-0.5.2.tar.gz", "has_sig": false, "md5_digest": "6fe6db7b81ac4894819c4ebf5895fe1a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 31737, "upload_time": "2019-02-04T06:19:58", "url": "https://files.pythonhosted.org/packages/41/08/a30f295bacbd2d85d9ec258a2b40509e72bb4abd9e9bed5647465475c824/serde-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "bbcd37090e42c130097584f0df82a047", "sha256": "fb04810b7a8a71c55fe212e1c48d045c636bb2418001842a07a410c0281a9675" }, "downloads": -1, "filename": "serde-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bbcd37090e42c130097584f0df82a047", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 23179, "upload_time": "2019-03-30T10:23:59", "url": "https://files.pythonhosted.org/packages/ae/17/1bc94a4c156f676e227650427c3c05236022b3e55baa7df527e3d75cd81c/serde-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6896ec20a56d8608e5ff8bf9f32ee810", "sha256": "a32f33d68e1f86566e60622b83c684b4fe6e73e280faa3fb58063b10ef4511d7" }, "downloads": -1, "filename": "serde-0.6.0.tar.gz", "has_sig": false, "md5_digest": "6896ec20a56d8608e5ff8bf9f32ee810", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 21985, "upload_time": "2019-03-30T10:24:01", "url": "https://files.pythonhosted.org/packages/30/96/b5f1770d41bb4a53de3566b18a95c86f7951b88bef171fee63bc6c095cfd/serde-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "93d82fbc745adea6b2160ed3d2a7d8dd", "sha256": "ead230d7f5258edd46dffe4a68afb3bd619c17f02a91520c38cfac9474df2db5" }, "downloads": -1, "filename": "serde-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "93d82fbc745adea6b2160ed3d2a7d8dd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 24117, "upload_time": "2019-04-04T10:52:22", "url": "https://files.pythonhosted.org/packages/a7/9b/2b3f264736b34782152b47379c1e8032be9db56319eecaf9182489a598b2/serde-0.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5034c4565c3beca027371a4288755b0", "sha256": "38af0d57c4ad82540c6e0218ac84251427d0dba2f23de3975ba093352d96a418" }, "downloads": -1, "filename": "serde-0.6.1.tar.gz", "has_sig": false, "md5_digest": "b5034c4565c3beca027371a4288755b0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 22854, "upload_time": "2019-04-04T10:52:24", "url": "https://files.pythonhosted.org/packages/5f/43/64bb6623524301cab69c521d9c4d9d0f5fe7a2451a9757eab2662feefa15/serde-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "d49b97bd76485bf0c6ff9df19048de35", "sha256": "065b0742e8bf5fc517c8fe93864ab5d46b6c3b8c726a5c6826b56464ee1903ea" }, "downloads": -1, "filename": "serde-0.6.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d49b97bd76485bf0c6ff9df19048de35", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 24451, "upload_time": "2019-07-20T15:53:03", "url": "https://files.pythonhosted.org/packages/9e/29/89e92e533a3a9d22efbf6663006ba1fab24e722b345ba095668faa3df65a/serde-0.6.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa1c704183c85a0393c38be3bf5e39d7", "sha256": "8aa308e93004cd98cd9cfffd619bfbe0585e5cfab02bfa6da10a1ebf518d943d" }, "downloads": -1, "filename": "serde-0.6.2.tar.gz", "has_sig": false, "md5_digest": "aa1c704183c85a0393c38be3bf5e39d7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 23301, "upload_time": "2019-07-20T15:53:06", "url": "https://files.pythonhosted.org/packages/28/b4/2aa5c0fe876a0c435f3698749e8df9bad529e0a8c882d9da33ecbde5739d/serde-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "8346257caa85db79e8d487b713366a89", "sha256": "c31b3a7968d00b4c73af37283681f924c8724ebac90a8f976ec504686df8267c" }, "downloads": -1, "filename": "serde-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8346257caa85db79e8d487b713366a89", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 23271, "upload_time": "2019-09-08T13:02:26", "url": "https://files.pythonhosted.org/packages/15/b6/a131df3ddd954531cfc8ba8fe1a6b3518d11666d7d1378c9d41c9f065f40/serde-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a117ca2cc6a0ab77f01626df9a6c79af", "sha256": "bd43c8368a7fd122ce57031c1c53f2739761b0a19c02c25b3ac5299f7156c632" }, "downloads": -1, "filename": "serde-0.7.0.tar.gz", "has_sig": false, "md5_digest": "a117ca2cc6a0ab77f01626df9a6c79af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 26453, "upload_time": "2019-09-08T12:58:25", "url": "https://files.pythonhosted.org/packages/e2/e6/be0e32b72d85fb6efd504e8d6d586c233f0d0c28a96f37e933e910f0ddd2/serde-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "3e75479d9473a22e3a2b5153c3f37d61", "sha256": "57e0fa4e6cd48f22620cccb6d5ba5a75d7ec59879af90544baa516cdfd460c67" }, "downloads": -1, "filename": "serde-0.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3e75479d9473a22e3a2b5153c3f37d61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 24044, "upload_time": "2019-09-26T06:46:01", "url": "https://files.pythonhosted.org/packages/cf/9a/6723785a05868e780decac567981e949cc09bf275f9c33546705a592b204/serde-0.7.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e3beb803f79db9be565e3024cbbca1ec", "sha256": "7a4820b17914c65afc1772fed7c5112018c32dec123b36b9d87b4be06a3821ba" }, "downloads": -1, "filename": "serde-0.7.1.tar.gz", "has_sig": false, "md5_digest": "e3beb803f79db9be565e3024cbbca1ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 27448, "upload_time": "2019-09-26T06:46:03", "url": "https://files.pythonhosted.org/packages/3f/e6/c38dcf653521e4666d0e787b5bd40026b099d4c27f25416b6528f9ebf366/serde-0.7.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3e75479d9473a22e3a2b5153c3f37d61", "sha256": "57e0fa4e6cd48f22620cccb6d5ba5a75d7ec59879af90544baa516cdfd460c67" }, "downloads": -1, "filename": "serde-0.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3e75479d9473a22e3a2b5153c3f37d61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 24044, "upload_time": "2019-09-26T06:46:01", "url": "https://files.pythonhosted.org/packages/cf/9a/6723785a05868e780decac567981e949cc09bf275f9c33546705a592b204/serde-0.7.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e3beb803f79db9be565e3024cbbca1ec", "sha256": "7a4820b17914c65afc1772fed7c5112018c32dec123b36b9d87b4be06a3821ba" }, "downloads": -1, "filename": "serde-0.7.1.tar.gz", "has_sig": false, "md5_digest": "e3beb803f79db9be565e3024cbbca1ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 27448, "upload_time": "2019-09-26T06:46:03", "url": "https://files.pythonhosted.org/packages/3f/e6/c38dcf653521e4666d0e787b5bd40026b099d4c27f25416b6528f9ebf366/serde-0.7.1.tar.gz" } ] }