{ "info": { "author": "Kevin Beaty", "author_email": "kevin@simplectic.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup" ], "description": "=====\nMedea\n=====\n\nSimple utilities to map JSON to and from Python Objects.\n\n.. image:: https://travis-ci.org/kevinbeaty/medea.png?branch=master \n :target: https://travis-ci.org/kevinbeaty/medea\n\nmedea\n=====\n\n`medea` is a singledispatch function for JSON encoding. \n\nlists, tuples and sequences are converted to lists.\nItems and values of dicts are recursively dispatched.\nOther types should be registered with dispatch function.\n\n.. code-block:: python\n\n medea.register(date, lambda obj: obj.strftime('%Y-%m-%d'))\n\n dob = date(1974, 3, 1)\n assert medea(dob) == '1974-03-01'\n\n bob = {\n 'name': 'Bob',\n 'age': 38,\n 'colors': ('blue', 'red'),\n 'dob': dob}\n\n assert medea(bob) == {\n 'name': 'Bob',\n 'age': 38,\n 'colors': ['blue', 'red'],\n 'dob': '1974-03-01'}\n\n\nCustom objects can be registered with a mapper:\n\n.. code-block:: python\n\n class Pet(object):\n pass\n\n\n class Dog(Pet):\n def __init__(self, name):\n self.name = name\n self.kind = 'Dog'\n\n\n class Cat(Pet):\n def __init__(self, name):\n self.name = name\n self.kind = 'Cat'\n\n\n class PetPerson(Person):\n pass\n\n\n medea.register(PetPerson, MedeaCamelMapper('first_name', 'last_name', 'pets'))\n medea.register(Pet, MedeaCamelMapper('name', 'kind'))\n\n anne = PetPerson('Anne', 'Frank')\n fido = Dog('Fido')\n spot = Dog('Spot')\n garfield = Cat('Garfield')\n anne.pets = [fido, spot, garfield]\n assert medea(anne) == {\n 'firstName': 'Anne',\n 'lastName': 'Frank',\n 'pets': [\n {'kind': 'Dog', 'name': 'Fido'},\n {'kind': 'Dog', 'name': 'Spot'},\n {'kind': 'Cat', 'name': 'Garfield'}]}\n\n\nMedeaEncoder\n============\n\n`MedeaEncoder` is a `JSONEncoder` using the `medea` function.\n\n\nMedeaMapper\n===========\n\nCreate a mapper using Python attribute names as arguments. Attributes that are\nnot whitelisted will not be serialized:\n\n.. code-block:: python\n\n class Person(object):\n def __init__(self, first_name, last_name,\n address='', phone_number='', dob=''):\n self.first_name = first_name\n self.last_name = last_name\n self.address = address\n self.phone_number = phone_number\n self.dob = dob\n\n\n bob = Person('Bob', 'Hope', '123 Main', '123', '1903-05-29')\n\n mapper = MedeaMapper('first_name', 'last_name',\n 'address', 'phone_number', 'dob')\n\n bob_json = {\n 'first_name': 'Bob',\n 'last_name': 'Hope',\n 'address': '123 Main',\n 'phone_number': '123',\n 'dob': '1903-05-29'}\n\n assert mapper.to_json(bob) == bob_json\n\nAttribute names can be overridden using `**kwargs`.\n\n.. code-block:: python\n\n bob = Person('Bob', 'Hope', '123 Main', '123', '1903-05-29')\n\n mapper = MedeaMapper('address', 'dob',\n first_name='firstName', last_name='lastName')\n\n bob_json = {\n 'firstName': 'Bob',\n 'lastName': 'Hope',\n 'address': '123 Main',\n 'dob': '1903-05-29'}\n\n assert mapper.to_json(bob) == bob_json\n\nMedeaCamelMapper may be useful if JSON is camel cased.\n\n.. code-block:: python\n\n bob = Person('Bob', 'Hope', '123 Main', '123', '1903-05-29')\n\n mapper = MedeaCamelMapper('first_name', 'last_name',\n 'address', 'phone_number', 'dob')\n\n bob_json = {\n 'firstName': 'Bob',\n 'lastName': 'Hope',\n 'address': '123 Main',\n 'phoneNumber': '123',\n 'dob': '1903-05-29'}\n\n assert mapper.to_json(bob) == bob_json\n\nA mapper can also map attribues from JSON onto the object:\n\n.. code-block:: python\n\n bob = Person('Bob', 'Hope', '123 Main', '123', '1903-05-29')\n\n bob_json_full = {\n 'firstName': 'Bob',\n 'lastName': 'Hope',\n 'address': '123 Main',\n 'phoneNumber': '123',\n 'DOB': '1903-05-29'}\n\n fred_json = {\n 'firstName': 'Fred',\n 'lastName': 'Rodgers'}\n\n mapper = MedeaCamelMapper('first_name', 'last_name')\n mapper_full = MedeaCamelMapper('first_name', 'last_name',\n 'address', 'phone_number', dob='DOB')\n\n assert mapper.to_json(bob) == bob_json\n assert mapper_full.to_json(bob) == bob_json_full\n\n # Override Bob's name from Fred\n mapper.from_json(fred_json, bob)\n\n # Mapper only serializes names\n assert mapper.to_json(bob) == fred_json\n assert mapper_full.to_json(bob) != bob_json_full\n assert bob.first_name == 'Fred'\n assert bob.last_name == 'Rodgers'\n assert bob.address == '123 Main'\n assert bob.phone_number == '123'\n assert bob.dob == '1903-05-29'\n\n # Revert back to Bob's name\n mapper.from_json(bob_json, bob)\n assert mapper.to_json(bob) == bob_json\n assert mapper_full.to_json(bob) == bob_json_full", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/kevinbeaty/medea", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "Medea", "package_url": "https://pypi.org/project/Medea/", "platform": "any", "project_url": "https://pypi.org/project/Medea/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/kevinbeaty/medea" }, "release_url": "https://pypi.org/project/Medea/0.3.2/", "requires_dist": null, "requires_python": null, "summary": "JSON Object Mapper / Encoder", "version": "0.3.2" }, "last_serial": 955620, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "668867ac76c7e723bf91e07a2f1078f7", "sha256": "329c6738c6eb14540905ac6ff8ecf6aa9c667db227ef322175629db79c39797a" }, "downloads": -1, "filename": "Medea-0.1.tar.gz", "has_sig": false, "md5_digest": "668867ac76c7e723bf91e07a2f1078f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3318, "upload_time": "2013-11-27T01:39:22", "url": "https://files.pythonhosted.org/packages/05/49/33abf45c7f5d23180d9bdbc9ed6ad09bb9782ebb2454dac1a9fd2282cacd/Medea-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "abd6f2462e156e2b15ea9c797d7024fb", "sha256": "3e5f330b6143385465e2fbe8448ad81eea2d7f1107a1ab489f0c69676a93455d" }, "downloads": -1, "filename": "Medea-0.2.tar.gz", "has_sig": false, "md5_digest": "abd6f2462e156e2b15ea9c797d7024fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3485, "upload_time": "2013-12-19T02:16:07", "url": "https://files.pythonhosted.org/packages/15/06/fc268f1b1d0056dfb8f707ada0b4de7f1e443b876f827e6b59ca0af9f1b5/Medea-0.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "02eee0e2356e338dcd887809350d2cfc", "sha256": "9c7d5a134b0215aedd020126e284704bd9becbd9a6e71aed4746ff7fc3f65daa" }, "downloads": -1, "filename": "Medea-0.3.0.tar.gz", "has_sig": false, "md5_digest": "02eee0e2356e338dcd887809350d2cfc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3691, "upload_time": "2013-12-21T03:48:05", "url": "https://files.pythonhosted.org/packages/35/5f/bb28259a5e76f0d25279e184188090a90d4f0c5554954e1de73eb737a1ec/Medea-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "9ce9402d65950f8729038be5f0d63e17", "sha256": "f54a5be53e6e30e3bfe2b6d39e865817bcb34f60c20d3fae552e0d1d63ae5b2e" }, "downloads": -1, "filename": "Medea-0.3.1.tar.gz", "has_sig": false, "md5_digest": "9ce9402d65950f8729038be5f0d63e17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3440, "upload_time": "2013-12-22T15:18:37", "url": "https://files.pythonhosted.org/packages/17/f5/324c43540b655c01f2f44dc8433c92b5bc957e9021c70ef9de9f4b515aa0/Medea-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "db98d9709a4288525d6c3cef8316224f", "sha256": "920598a1d5eba0e82a5e2cc90ee5fc818153611eece98c6d8b3982ec068b2210" }, "downloads": -1, "filename": "Medea-0.3.2.tar.gz", "has_sig": false, "md5_digest": "db98d9709a4288525d6c3cef8316224f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3734, "upload_time": "2013-12-27T23:33:18", "url": "https://files.pythonhosted.org/packages/2e/13/527c53b292a1775b8bb7df5eed863748d6a69a794787653524f027ac4c73/Medea-0.3.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "db98d9709a4288525d6c3cef8316224f", "sha256": "920598a1d5eba0e82a5e2cc90ee5fc818153611eece98c6d8b3982ec068b2210" }, "downloads": -1, "filename": "Medea-0.3.2.tar.gz", "has_sig": false, "md5_digest": "db98d9709a4288525d6c3cef8316224f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3734, "upload_time": "2013-12-27T23:33:18", "url": "https://files.pythonhosted.org/packages/2e/13/527c53b292a1775b8bb7df5eed863748d6a69a794787653524f027ac4c73/Medea-0.3.2.tar.gz" } ] }