{ "info": { "author": "egon", "author_email": "egon@gb.com", "bugtrack_url": null, "classifiers": [], "description": "====\npilo\n====\n\n.. image:: https://travis-ci.org/bninja/pilo.png\n :target: https://travis-ci.org/bninja/pilo\n\n.. image:: https://coveralls.io/repos/bninja/pilo/badge.png\n :target: https://coveralls.io/r/bninja/pilo\n\nYet another form parser.\n\ndev\n---\n\n.. code:: bash\n\n $ git clone git@github.com:bninja/pilo.git\n $ cd pilo\n $ mkvirtualenv pilo\n (pilo)$ pip install -e .[tests]\n (pilo)$ py.test tests/ --cov=pilo --cov-report term-missing\n\nrelease\n-------\n\nAll is well:\n\n.. code:: bash\n\n (pilo)$ py.test tests/ --cov=pilo --cov-report term-missing\n\nso update ``__version__`` in:\n\n- ``pilo/__init__.py``\n\nthen commit and tag it (`travis `_ will publish it to `pypi `_):\n\n.. code:: bash\n\n $ git commit -am \"release v{version}\"\n $ git tag -a v{version} -m \"release v{version}\"\n $ git push --tags\n\nusage\n-----\n\nValidation\n~~~~~~~~~~\n\nHere we validate that a message has acceptable headers and body.\n\n.. code:: python\n\n from pilo import Form\n from pilo.fields import Dict, String\n\n\n class Message(Form):\n headers = Dict(String(choices=['to', 'from', 'content-type']), String())\n body = String(max_length=20)\n\n\n >>> print Message(headers={'to': 'William III'}, body='ha'*10)\n {'body': 'hahahahahahahahahaha', 'headers': {'to': 'William III'}}\n\n >>> print Message(headers={'send-to': 'William III'}, body='ha'*10)\n Invalid: headers - \"send-to\" is not one of \"to\", \"from\", \"content-type\"\n\n >>> print Message(headers={'to': 'William III'}, body='ha'*11)\n Invalid: body - \"hahahahahahahahahahaha\" must have length <= 20\n\n\nHooks\n~~~~~\n\nOverride-able mechanism allowing users to inject functions to customize these\nbehaviors:\n\n- compute\n- resolve\n- parse\n- default\n- munge\n- filter\n- validate\n\ne.g.:\n\n.. code:: python\n\n import pilo\n\n\n class ExtraCurricular(pilo.Form):\n\n category = pilo.fields.String(\n choices=['athletics', 'academics', 'social', 'service']\n )\n\n name = pilo.fields.String(max_length=40)\n\n description = pilo.fields.String(max_length=140)\n\n role = pilo.fields.String(choices=['member', 'leader'])\n\n\n class CollegeApplication(pilo.Form):\n\n high_school_name = pilo.fields.String()\n\n sat_score = pilo.fields.Integer()\n\n gpa = pilo.fields.Float()\n\n extra_curriculars = pilo.fields.List(pilo.fields.SubForm(ExtraCurricular))\n\n score = pilo.fields.Float(default=pilo.NONE)\n\n accepted = pilo.fields.Bool(default=False)\n\n @score.compute\n def score(self):\n leadership_roles = [\n ec for ec in self.extra_curriculars if ec.role == 'leader'\n ]\n relevant_extra_curriculars =[\n ec for ec in self.extra_curriculars\n if ec.category in ['academics', 'service']\n ]\n score = (\n 10 * (self.sat_score / 1600.0) +\n 10 * (self.gpa / 4.0) +\n 5 * len(leadership_roles) +\n 5 * len(relevant_extra_curriculars)\n )\n return score\n\n @accepted.compute\n def accepted(self):\n if self.score > 30:\n return True\n return False\n\n @high_school_name.munge\n def high_school_name(self, value):\n return value.upper()\n\n\n application = CollegeApplication(\n high_school_name='Bodega High',\n sat_score=1400,\n gpa=4.0,\n extra_curriculars=[\n dict(category='athletics', role='leader', name='hockey', description=''),\n dict(category='academics', role='member', name='chess club', description=''),\n ]\n )\n\n\n >>> print application.high_school_name\n BODEGA HIGH\n\n >>> print application.score\n 28.75\n\n >>> print application.accepted\n False\n\n\nForm polymorphism and type downcasting\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the following example, a user has an address, but the address schema is\npolymorphic on the country abbreviation.\n\n.. code:: python\n\n import pilo\n import uuid\n\n\n class Address(pilo.Form):\n\n guid = pilo.fields.UUID(default=uuid.uuid4)\n country = pilo.fields.Type.abstract()\n\n\n class UnitedKingdomAddress(Address):\n\n country = pilo.fields.Type.constant('UK')\n name = pilo.fields.String()\n street = pilo.fields.String()\n locality = pilo.fields.String()\n post_town = pilo.fields.String()\n postcode = pilo.fields.String()\n\n\n class UnitedStatesAddress(Address):\n\n country = pilo.fields.Type.constant('USA')\n name = pilo.fields.String()\n street = pilo.fields.String()\n unit = pilo.fields.String(default=None)\n city = pilo.fields.String()\n state = pilo.fields.String()\n zip = pilo.fields.String(length=5)\n\n\n class User(pilo.Form):\n\n guid = pilo.fields.UUID(default=uuid.uuid4)\n name = pilo.fields.String()\n address = pilo.fields.PolymorphicSubForm(Address.country)\n\n\n mikey_representation = dict(\n name='Michael Pikey',\n address=dict(\n country='UK',\n name='Mikey Pikey',\n street='351 Meagre Lane',\n locality='Hedge End',\n post_town='Southampton',\n postcode='SO31 4NG',\n )\n )\n\n\n bart_representation = dict(\n name='Bartholomew Simpson',\n address=dict(\n country='USA',\n name='Bite Me',\n street='742 Evergreen Terrace',\n city='Springfield',\n state='???',\n zip='12345',\n )\n )\n\n\n mikey = User(**mikey_representation)\n\n\n bart = User(**bart_representation)\n\n\n >>> print dict(mikey)\n {\n 'address': {\n 'country': 'UK',\n 'guid': UUID('8c73752c-69a2-4832-99f8-c5354cbeec59'),\n 'locality': 'Hedge End',\n 'name': 'Mikey Pikey',\n 'post_town': 'Southampton',\n 'postcode': 'SO31 4NG',\n 'street': '351 Meagre Lane'\n },\n 'guid': UUID('eee0953c-1b5a-4bd0-893d-f513b1cf24f4'),\n 'name': 'Michael Pikey'\n }\n\n >>> print dict(bart)\n {\n 'address': {\n 'city': 'Springfield',\n 'country': 'USA',\n 'guid': UUID('a321bedd-8b94-46b8-830e-ea137b08a608'),\n 'name': 'Bite Me',\n 'state': '???',\n 'street': '742 Evergreen Terrace',\n 'unit': None,\n 'zip': '12345'\n },\n 'guid': UUID('3155a3dd-4b5a-4990-aaea-439359bb36a9'),\n 'name': 'Bartholomew Simpson'\n }\n\n >>> print mikey.address.postcode\n SO31 4NG\n\n >>> print bart.address.zip\n 12345\n\n >>> print type(mikey.address).__name__\n UnitedKingdomAddress\n\n >>> print type(bart.address).__name__\n UnitedStatesAddress\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bninja/pilo/", "keywords": "", "license": "Copyright (c) 2014 terrans.", "maintainer": "", "maintainer_email": "", "name": "pilo", "package_url": "https://pypi.org/project/pilo/", "platform": null, "project_url": "https://pypi.org/project/pilo/", "project_urls": { "Homepage": "https://github.com/bninja/pilo/" }, "release_url": "https://pypi.org/project/pilo/0.6.2/", "requires_dist": null, "requires_python": "", "summary": "Yet another form parser.", "version": "0.6.2" }, "last_serial": 1842491, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "d2cfee482d5ef44dc84c3965c8019c40", "sha256": "744e2b9be46b25a2adce6be42a854e9023e12e8ac2e3f44511b33c1ed6ae650b" }, "downloads": -1, "filename": "pilo-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d2cfee482d5ef44dc84c3965c8019c40", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10311, "upload_time": "2014-03-07T23:58:43", "url": "https://files.pythonhosted.org/packages/45/70/c79a2fe0456c67d6475d5b8dac98509c92d9d2e37f2efaf333f35563167f/pilo-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "29c06881b4f410c28fc35e5b30a3dc99", "sha256": "279fd664798b0d076325d49e096515fae4aca735304a67ed45d11b8a67d04fd1" }, "downloads": -1, "filename": "pilo-0.2.1.tar.gz", "has_sig": false, "md5_digest": "29c06881b4f410c28fc35e5b30a3dc99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8893, "upload_time": "2014-03-10T20:46:44", "url": "https://files.pythonhosted.org/packages/6d/34/f29f1f18f3cd840c3b9a0adc2ff3e58d4eefb57da84c584b9b79ba68169d/pilo-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "460fae03ddea7dc53d62b82ec2145bac", "sha256": "5a3641f1ab007cbcf9f2e1e0ead585179d0854edad287da2482534f429d76cc0" }, "downloads": -1, "filename": "pilo-0.2.2.tar.gz", "has_sig": false, "md5_digest": "460fae03ddea7dc53d62b82ec2145bac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11615, "upload_time": "2014-03-10T21:50:21", "url": "https://files.pythonhosted.org/packages/d4/f2/b26df126cdbffc3013c594528d4c52ca0810dc004f23f14854c2afbb4e9c/pilo-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "de6ebcbebcf3d791e0be65ee43693c20", "sha256": "490947cbdb7b070d72d89418310c10b3a0574c8e4397569c643aa836d767d065" }, "downloads": -1, "filename": "pilo-0.2.3.tar.gz", "has_sig": false, "md5_digest": "de6ebcbebcf3d791e0be65ee43693c20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11815, "upload_time": "2014-03-11T01:03:05", "url": "https://files.pythonhosted.org/packages/ce/b0/c96a0a77ae7feb482b00265edb4d12c3cc174d97b54f397274491c0b099e/pilo-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "e1f2e091b5fdb400ae3f2365c74a3b1a", "sha256": "6733202100271dd2fb50d356d84f5f29dd76fa304c541454b38b6b6ea1b1558b" }, "downloads": -1, "filename": "pilo-0.2.4.tar.gz", "has_sig": false, "md5_digest": "e1f2e091b5fdb400ae3f2365c74a3b1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11836, "upload_time": "2014-03-11T02:08:33", "url": "https://files.pythonhosted.org/packages/34/77/56070663977c6009d4325c1df85369cec78308f07edac66b76938f74d9f1/pilo-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "e94a33790462436a5c9ed6e9640d46e2", "sha256": "bed6273e1842105b38b6312b10beda839656ecb47734aaa2a4c32abbba844428" }, "downloads": -1, "filename": "pilo-0.2.5.tar.gz", "has_sig": false, "md5_digest": "e94a33790462436a5c9ed6e9640d46e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11997, "upload_time": "2014-03-11T03:03:27", "url": "https://files.pythonhosted.org/packages/bb/6e/8925bfef762c03dd0294712a25daa220cfcf7c0590bf7a30b8cedcc355ed/pilo-0.2.5.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "1d4b53ee36068f921162f799bebea92f", "sha256": "f6aa7aa901e57f64d80b5365b2d74b2731ff1ea2f7d3f30a24c0d599da6c5dd7" }, "downloads": -1, "filename": "pilo-0.3.1.tar.gz", "has_sig": false, "md5_digest": "1d4b53ee36068f921162f799bebea92f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15028, "upload_time": "2014-06-10T11:30:07", "url": "https://files.pythonhosted.org/packages/2a/b9/8529f0e3341f2e335e25bf6ba46b461ee09956f6f2d5e223220585dbbe15/pilo-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "700f081659d70e93583eb5d0fecbcf47", "sha256": "ff5073d6c3e5bb686a1a2a8d6ba5e2cf59b2c89ccc719a74e6b3f1152c426021" }, "downloads": -1, "filename": "pilo-0.3.2.tar.gz", "has_sig": false, "md5_digest": "700f081659d70e93583eb5d0fecbcf47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15028, "upload_time": "2014-06-10T11:39:31", "url": "https://files.pythonhosted.org/packages/2b/dd/05aa18f9f52f692686c6e1044e4af1828d4560bb72138bad2b0d4e110aa8/pilo-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "7412ad669eab87553bdf9bdd0315b42a", "sha256": "e4f17cc4bfaccad3b929b798ebd030795e81cf38df72ab85d5dfa4ff5bfb0bed" }, "downloads": -1, "filename": "pilo-0.3.3.tar.gz", "has_sig": false, "md5_digest": "7412ad669eab87553bdf9bdd0315b42a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15386, "upload_time": "2014-06-27T20:25:16", "url": "https://files.pythonhosted.org/packages/07/7d/2ac62bae9192702e3bcd784bd404fd2104aa023a5f19be13c2e65977680d/pilo-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "cfc0a05dac72bc5e7d4a2e7b64746442", "sha256": "690781f56796c0b2c4a4017f5522310147f6453f3b00e30d170f2720b87b0786" }, "downloads": -1, "filename": "pilo-0.3.4.tar.gz", "has_sig": false, "md5_digest": "cfc0a05dac72bc5e7d4a2e7b64746442", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15704, "upload_time": "2014-07-10T23:41:30", "url": "https://files.pythonhosted.org/packages/33/e5/2eed3f147c7b370963f13bd95d8b2fd636b7e093c76c613530516162c545/pilo-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "4296b9ff54f9805af85ef7a68e28c05f", "sha256": "15a331503308074c89e111c1a20a7a5d98df7c7eef0c44ea9a6f159d4368b540" }, "downloads": -1, "filename": "pilo-0.3.5.tar.gz", "has_sig": false, "md5_digest": "4296b9ff54f9805af85ef7a68e28c05f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15868, "upload_time": "2014-07-15T22:46:44", "url": "https://files.pythonhosted.org/packages/d1/fe/aa3fc3ba0c1d49fa275b841109602f56735140915fe4d0d82f3052bd1227/pilo-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "96d2092e13ccffa43ba60ef572a953df", "sha256": "8497380f78e91c4f308e521f038aa998ccbc453dae59a5474299d08e3965bd41" }, "downloads": -1, "filename": "pilo-0.3.6.tar.gz", "has_sig": false, "md5_digest": "96d2092e13ccffa43ba60ef572a953df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17787, "upload_time": "2014-07-28T13:38:31", "url": "https://files.pythonhosted.org/packages/e1/b8/7e440ed17e54fe3b2d0948ee4bff838d9062cad50bf68e7acc9a3cad8055/pilo-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "dd5e9d3fbbf6ad390f1c7f3ac5cbcba5", "sha256": "6293b51f9712ba570f15bd6fc65df0434fee2efa6d3e3fe196a634b2fa05cb80" }, "downloads": -1, "filename": "pilo-0.3.7.tar.gz", "has_sig": false, "md5_digest": "dd5e9d3fbbf6ad390f1c7f3ac5cbcba5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17170, "upload_time": "2014-07-30T09:31:06", "url": "https://files.pythonhosted.org/packages/e2/b3/a357eafc55277192b8b82ae0be5f8020aa27ffec9a37b3f0bd44cb23d870/pilo-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "dfa200ca2e4b0e2fd4c9d7571ea7fc78", "sha256": "38cc8f176bf2e9d6de86c33a837145b5890f9ca5cce2206e2e47a7c11df462af" }, "downloads": -1, "filename": "pilo-0.3.8.tar.gz", "has_sig": false, "md5_digest": "dfa200ca2e4b0e2fd4c9d7571ea7fc78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17351, "upload_time": "2014-08-01T01:46:29", "url": "https://files.pythonhosted.org/packages/33/cd/b3e21e29fce6163fa0c945d1513191f04d710eaa06e76853aa5284d5b9cb/pilo-0.3.8.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "ca20d364b8338f34c97446495d6a231c", "sha256": "0948d4bc35d9e57bfeba407c88e3f0124594a3f36ed16716087bc2aeaf2f93ab" }, "downloads": -1, "filename": "pilo-0.4.0.tar.gz", "has_sig": false, "md5_digest": "ca20d364b8338f34c97446495d6a231c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18325, "upload_time": "2014-09-09T09:36:52", "url": "https://files.pythonhosted.org/packages/53/36/fdad8203d159b64da4b56c6a0cbb79d56149cae04ac2e9cb92df334dcc42/pilo-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "3898c28ac7be5d101993f02929efabea", "sha256": "a6e1b6b740fc2e3e3ab443af1f811b1efbc2661c150e79beb6ae4ea0dcc7e588" }, "downloads": -1, "filename": "pilo-0.5.0.tar.gz", "has_sig": false, "md5_digest": "3898c28ac7be5d101993f02929efabea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20378, "upload_time": "2014-10-07T03:27:37", "url": "https://files.pythonhosted.org/packages/a9/b2/b18bf2162ae4ce03dda38a3357f1bc645f431a97cdeb364249038a386bfb/pilo-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "9439552fc21f4eb5a21da765409e840b", "sha256": "5cc53629460fd1ce617d1e175dba47feb0615929dbdb4398bb2662b4e6ef6897" }, "downloads": -1, "filename": "pilo-0.5.1.tar.gz", "has_sig": false, "md5_digest": "9439552fc21f4eb5a21da765409e840b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19726, "upload_time": "2014-10-07T04:21:18", "url": "https://files.pythonhosted.org/packages/46/ea/e3bd842c98783c96717a2b1b1623ab237c4950db9f6bae8b5c174d8875e4/pilo-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "369bd227282da9d831f24c866d79270b", "sha256": "fded66d2c5bfaf5224bfe9ef6b39a0721bfa75b5444b03041951154605180582" }, "downloads": -1, "filename": "pilo-0.5.2.tar.gz", "has_sig": false, "md5_digest": "369bd227282da9d831f24c866d79270b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19785, "upload_time": "2014-10-09T01:38:56", "url": "https://files.pythonhosted.org/packages/ac/0d/e2d7606f1144d31623bb4b6e5a130e4e2e9bcaab9123724bb332f8b22af9/pilo-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "ce720147e7134e274e1916bfbbc0a81d", "sha256": "15e1cc4048e35a4ec55c3352d11e5e9d18626276465b0334807fb06569bd707b" }, "downloads": -1, "filename": "pilo-0.6.0.tar.gz", "has_sig": false, "md5_digest": "ce720147e7134e274e1916bfbbc0a81d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22340, "upload_time": "2015-06-02T21:52:47", "url": "https://files.pythonhosted.org/packages/8e/d7/98ad99d4477b429e38deb332670ca6d19ee04ad1868488b65b579d7b9dbc/pilo-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "befc282073e30262f8aa1c870c55f3c6", "sha256": "561cb552965171bc7b5a893eeae148fa367fb93da5e91ce2b8fe000b121836ed" }, "downloads": -1, "filename": "pilo-0.6.1.tar.gz", "has_sig": false, "md5_digest": "befc282073e30262f8aa1c870c55f3c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22694, "upload_time": "2015-11-23T19:53:35", "url": "https://files.pythonhosted.org/packages/5d/3c/bf791879302f8acab55add33729f355aa3fa14b2d445a799c1878c1a3412/pilo-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "5a5602b1319a9cff0eebbe4b61b63c08", "sha256": "845878be066ea675327e569e608d45e06f51025ff2dae39e7642fbeaf53f2c12" }, "downloads": -1, "filename": "pilo-0.6.2.tar.gz", "has_sig": false, "md5_digest": "5a5602b1319a9cff0eebbe4b61b63c08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22538, "upload_time": "2015-12-01T23:23:49", "url": "https://files.pythonhosted.org/packages/88/96/eb3161000cc8d7b35a054291cd4d257f1b5d122316307507a8eb8c091bf3/pilo-0.6.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5a5602b1319a9cff0eebbe4b61b63c08", "sha256": "845878be066ea675327e569e608d45e06f51025ff2dae39e7642fbeaf53f2c12" }, "downloads": -1, "filename": "pilo-0.6.2.tar.gz", "has_sig": false, "md5_digest": "5a5602b1319a9cff0eebbe4b61b63c08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22538, "upload_time": "2015-12-01T23:23:49", "url": "https://files.pythonhosted.org/packages/88/96/eb3161000cc8d7b35a054291cd4d257f1b5d122316307507a8eb8c091bf3/pilo-0.6.2.tar.gz" } ] }