{ "info": { "author": "Joe Cross", "author_email": "joe.mcross@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. image:: https://img.shields.io/travis/numberoverzero/declare/master.svg?style=flat-square\n :target: https://travis-ci.org/numberoverzero/declare\n.. image:: https://img.shields.io/codecov/c/github/numberoverzero/declare/master.svg?style=flat-square\n :target: https://codecov.io/gh/numberoverzero/declare/branch/master\n.. image:: https://img.shields.io/pypi/v/declare.svg?style=flat-square\n :target: https://pypi.python.org/pypi/declare\n.. image:: https://img.shields.io/pypi/status/declare.svg?style=flat-square\n :target: https://pypi.python.org/pypi/declare\n.. image:: https://img.shields.io/github/issues-raw/numberoverzero/declare.svg?style=flat-square\n :target: https://github.com/numberoverzero/declare/issues\n.. image:: https://img.shields.io/pypi/l/declare.svg?style=flat-square\n :target: https://github.com/numberoverzero/declare/blob/master/LICENSE\n\nDeclarative scaffolding for frameworks\n\nInstallation\n============\n\n``pip install declare``\n\nGetting Started\n===============\n\nLet's build a quick model for Minecraft blocks::\n\n from declare import Model, Field, TypeDefinition\n import json\n\n # Wire format is json:\n # {\n # \"type\": int <- maps to enum\n # \"position\": str <- packed x:y:z\n # }\n\n class BlockType(TypeDefinition):\n types = {\n 0: \"Grass\",\n 1: \"Stone\",\n 2: \"Diamond\"\n }\n def load(self, value, context):\n return BlockType.types[value]\n\n def dump(self, value, context):\n # TODO: index types by value for O(1) lookup\n for tid, name in BlockType.types.items():\n if value == name:\n return tid\n\n\n class Position(TypeDefinition):\n ''' [x, y, z] <--> \"x:y:z\" '''\n def load(self, value, context):\n return [int(v) for v in value.split(':')]\n\n def dump(self, value, context):\n return ':'.join(str(v) for v in value)\n\n\n class Block(Model):\n type = Field(BlockType)\n position = Field(Position)\n\n @classmethod\n def load(cls, wire):\n fields = cls.Meta.fields_by_model_name\n engine = cls.Meta.type_engine\n wire = json.loads(wire)\n kwargs = {}\n for name, field in fields.items():\n kwargs[name] = engine.load(field.typedef, wire[name], {})\n return cls(**kwargs)\n\n @classmethod\n def dump(cls, obj):\n fields = cls.Meta.fields_by_model_name\n engine = cls.Meta.type_engine\n kwargs = {}\n for name, field in fields.items():\n kwargs[name] = engine.dump(\n field.typedef, getattr(obj, name), {})\n return json.dumps(kwargs)\n\n\nLet's set up our request handler to use these blocks::\n\n from bottle import route, request\n\n @route('/diamond_check')\n def func():\n wire = request.json\n block = Block.load(wire)\n if block.type == \"Diamond\":\n return {\"diamond\": True, \"position\": block.position}\n return {\"diamond\": False}\n\n\nAlternatively, creating a diamond::\n\n @route('/make_diamond')\n def func():\n wire = request.json\n position = Position.load(wire)\n block = Block(type=\"Diamond\", position=position)\n return Block.dump(block)\n\n\nNested Models\n=============\n\nModels are instances of TypeDefinitions, too. That means models can be used\nas fields, making recursive load/dump easy::\n\n class List(TypeDefinition):\n ''' Adapter for lists of objects '''\n def load(self, value, context):\n return [self.typedef.load(v, context) for v in value]\n def dump(self, value, context):\n return [self.typedef.dump(v, context) for v in value]\n\n\n class Region(Model):\n blocks = Field(List(Block))\n\n @classmethod\n def load(cls, wire):\n fields = cls.Meta.fields_by_model_name\n engine = cls.Meta.type_engine\n wire = json.loads(wire)\n kwargs = {}\n for name, field in fields.items():\n kwargs[name] = engine.load(field.typedef, wire[name], {})\n return cls(**kwargs)\n\n @classmethod\n def dump(cls, obj):\n fields = cls.Meta.fields_by_model_name\n engine = cls.Meta.type_engine\n kwargs = {}\n for name, field in fields.items():\n kwargs[name] = engine.dump(\n field.typedef, getattr(obj, name), {})\n return json.dumps(kwargs)\n\n\nIn fact, the same load/dump code from ``Block`` is usable here, since we're\njust going to be loading/dumping from json. When the type engine looks up the\nload/dump functions for the ``List(Block)`` type, it will iteratively load/dump\neach block using the Block.load and Block.dump methods.\n\n\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/numberoverzero/declare", "keywords": "meta metaclass declarative", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "declare", "package_url": "https://pypi.org/project/declare/", "platform": "any", "project_url": "https://pypi.org/project/declare/", "project_urls": { "Homepage": "https://github.com/numberoverzero/declare" }, "release_url": "https://pypi.org/project/declare/0.9.12/", "requires_dist": null, "requires_python": "", "summary": "Declarative scaffolding for frameworks", "version": "0.9.12" }, "last_serial": 3233550, "releases": { "0.1.0": [], "0.2.0": [ { "comment_text": "", "digests": { "md5": "234894b822bc3e511c91ccd1fb900054", "sha256": "49a7ee44a7ae24dc2581d3cc58d0c0ecf4234affc3d9c0317213ec1a5b99904d" }, "downloads": -1, "filename": "declare-0.2.0.tar.gz", "has_sig": false, "md5_digest": "234894b822bc3e511c91ccd1fb900054", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7739, "upload_time": "2015-01-28T08:42:53", "url": "https://files.pythonhosted.org/packages/b2/85/b612a349c835eb0577eb2f02b4748d70cf16c1421076201d1ddfb310cb8d/declare-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "39ab714b1240b185698968a33cab91ee", "sha256": "cf5937f659280b7cb20fd8187b599031a995e512e63e7cdcea09ec4371a3d4ab" }, "downloads": -1, "filename": "declare-0.2.1.tar.gz", "has_sig": false, "md5_digest": "39ab714b1240b185698968a33cab91ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7728, "upload_time": "2015-01-28T18:04:49", "url": "https://files.pythonhosted.org/packages/61/64/af3472aa82a086357389f7d7bbf18e6e0fbc4aa4d9fc4516343c05e87ec7/declare-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "756e44b4d9e45aafd80da4786b24f345", "sha256": "26fbcca79889b4b5c263afc3ab06565beb690c2fa95ad75446225eb7fe68276c" }, "downloads": -1, "filename": "declare-0.2.2.tar.gz", "has_sig": false, "md5_digest": "756e44b4d9e45aafd80da4786b24f345", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7666, "upload_time": "2015-01-29T11:20:56", "url": "https://files.pythonhosted.org/packages/49/56/b25ca866cebe1c1c16ad04d63ac18cb9ae36fb44d1bf4869b1b9055033fc/declare-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "1d8dc1ff94610a819994b61ee4fcaa28", "sha256": "7f0918a041fae5c47df52d971ee052a15bb8e347fc1eb6e37490f837607fac58" }, "downloads": -1, "filename": "declare-0.3.0.tar.gz", "has_sig": false, "md5_digest": "1d8dc1ff94610a819994b61ee4fcaa28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7606, "upload_time": "2015-01-31T22:51:26", "url": "https://files.pythonhosted.org/packages/97/d9/17ce66b5d167b84d3598d8c67c8f674043431198b9b33f04074c1654ee29/declare-0.3.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "9f4769ad14eaf568584e45b85678f9d7", "sha256": "83735caff6852005151c230196f1b37e40e96716db66a84f165055f6efe6b337" }, "downloads": -1, "filename": "declare-0.6.0.tar.gz", "has_sig": false, "md5_digest": "9f4769ad14eaf568584e45b85678f9d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7126, "upload_time": "2015-02-01T07:52:47", "url": "https://files.pythonhosted.org/packages/27/2c/18334792370996d1617ecae69534fb73025631831bfb0c10c639b569beb4/declare-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "f9780af8f62d89c9ec46a37b4e4e81f2", "sha256": "e1a70f38a5034269d057512e7cfffbd0ba72df6faf5070d18bc7c23248bc904b" }, "downloads": -1, "filename": "declare-0.6.1.tar.gz", "has_sig": false, "md5_digest": "f9780af8f62d89c9ec46a37b4e4e81f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7205, "upload_time": "2015-07-06T18:25:10", "url": "https://files.pythonhosted.org/packages/bf/b7/b62eadee734b43885db3fc733824920a3c4f57cf870165cd559847289a51/declare-0.6.1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "3d53b5ff0217be99386e2077fa863935", "sha256": "b3cb94b1ebeb9aeed133f3b81257f1422d2942665cab9a753d7c7dd6253f784d" }, "downloads": -1, "filename": "declare-0.7.0.tar.gz", "has_sig": false, "md5_digest": "3d53b5ff0217be99386e2077fa863935", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7245, "upload_time": "2015-07-08T01:45:19", "url": "https://files.pythonhosted.org/packages/12/36/e11d111f42acebf40360156ec22a7e54ce0b0a529b1ca6e74039ca771a08/declare-0.7.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "8c65f01a877c424665cc0ec393724e75", "sha256": "3baaa65512f4cfcf78055801603099c9df4d782f1d2f09e2ddfbf5cefbb22ffe" }, "downloads": -1, "filename": "declare-0.9.0.tar.gz", "has_sig": false, "md5_digest": "8c65f01a877c424665cc0ec393724e75", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7270, "upload_time": "2015-07-12T01:46:39", "url": "https://files.pythonhosted.org/packages/5f/e9/3bd99be0b423ca94f78c9b3cc8f4cefe7f7272d6b6689fc6bae29927b4f6/declare-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "8687464e5be7ebd2e2edfef38d24977c", "sha256": "c54d00c0e40933410c51e26b670a483160d02a69794db6048bed909b2a8e03a6" }, "downloads": -1, "filename": "declare-0.9.1.tar.gz", "has_sig": false, "md5_digest": "8687464e5be7ebd2e2edfef38d24977c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7356, "upload_time": "2015-07-12T04:53:19", "url": "https://files.pythonhosted.org/packages/e8/2a/3974172372ad22783e46770acaf540a0ca481a8eedecdadf9846520cddaa/declare-0.9.1.tar.gz" } ], "0.9.10": [ { "comment_text": "", "digests": { "md5": "612114935a5d9c3f332db8c5e7a5c2ed", "sha256": "e79a9e7cdbed69b87eaa802f275e19f7b5273c6e96a5661d90c79bbcab3ecd34" }, "downloads": -1, "filename": "declare-0.9.10.tar.gz", "has_sig": false, "md5_digest": "612114935a5d9c3f332db8c5e7a5c2ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7252, "upload_time": "2015-12-11T02:00:26", "url": "https://files.pythonhosted.org/packages/ac/8d/9c0aef12b5f9c6afdd055112784b513256e0ed75076485430c912b5a1374/declare-0.9.10.tar.gz" } ], "0.9.11": [ { "comment_text": "", "digests": { "md5": "b572777505eee1ebe3a7712636c4c0c1", "sha256": "4b8fe5b70a738f1a6698f919b53564e7ca33edd3e0b1ad8593429ef4d032f84b" }, "downloads": -1, "filename": "declare-0.9.11.tar.gz", "has_sig": false, "md5_digest": "b572777505eee1ebe3a7712636c4c0c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7223, "upload_time": "2016-06-18T08:16:40", "url": "https://files.pythonhosted.org/packages/e2/7c/9268f576f5c5e4f6005efc314b43d5f223c70f1e11e0de9279216a240980/declare-0.9.11.tar.gz" } ], "0.9.12": [ { "comment_text": "", "digests": { "md5": "c77a3a602cb78014fc499dbbf5ce7dfc", "sha256": "f2477867796df9fca59e054999d3c906baa09112da0d4cdf5a3e3910f3f2c75c" }, "downloads": -1, "filename": "declare-0.9.12-py3-none-any.whl", "has_sig": false, "md5_digest": "c77a3a602cb78014fc499dbbf5ce7dfc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9270, "upload_time": "2017-10-08T01:47:50", "url": "https://files.pythonhosted.org/packages/b2/f7/9a6967295377a72add5016b621baba49921af57a82ad8b8b3f407455abee/declare-0.9.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06401452be9574f82137e495d022e1af", "sha256": "2a3cbd801a372116eb8bd986c4245aa9feaca039b5f797cd608061cc3afb0b2d" }, "downloads": -1, "filename": "declare-0.9.12.tar.gz", "has_sig": false, "md5_digest": "06401452be9574f82137e495d022e1af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7308, "upload_time": "2017-10-08T01:47:51", "url": "https://files.pythonhosted.org/packages/02/9b/479214411ced79e22c203e851513fa58db347bfdd70ae8692a30d87e3a1c/declare-0.9.12.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "3ea216807c94e2d64ad7b555a46624e4", "sha256": "2674f95ef2f486cc6e9d1cfd9f1f5470ec393440f49c9ac47b66cf7ee004f3c3" }, "downloads": -1, "filename": "declare-0.9.3.tar.gz", "has_sig": false, "md5_digest": "3ea216807c94e2d64ad7b555a46624e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7458, "upload_time": "2015-07-12T04:59:09", "url": "https://files.pythonhosted.org/packages/24/73/6212dde277fbbbd84c7963ae0efad13d29d2dd0adfca03d4311132b472f0/declare-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "85e0ba9c81fc284d446a697ede996eb1", "sha256": "53267687dc1647dcf847cc479d35d9f1dcc423bc3a3d103f0a7f1dd4eff057dc" }, "downloads": -1, "filename": "declare-0.9.4.tar.gz", "has_sig": false, "md5_digest": "85e0ba9c81fc284d446a697ede996eb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7456, "upload_time": "2015-07-20T22:39:07", "url": "https://files.pythonhosted.org/packages/92/f2/144a74de0fc87f0a746de8528094d902e8c2a52c3b7575596144dc657206/declare-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "66bd2bfd4336610f26877d0a68cacadc", "sha256": "fd2a5e983a4c1f7555f69f40e953024aa5593c7ea28dd0745c546fc39bb87ff7" }, "downloads": -1, "filename": "declare-0.9.5.tar.gz", "has_sig": false, "md5_digest": "66bd2bfd4336610f26877d0a68cacadc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7442, "upload_time": "2015-07-31T01:04:15", "url": "https://files.pythonhosted.org/packages/b0/e2/db5cb2d8f016cfd896686c1c121a6c28276e898eea827dc7e9cf60ded51d/declare-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "c61a08f0016baf0c1cda0f7c5b7f52bb", "sha256": "6f50425eae5d4bfb56493dc7f333ab0d5b3fb2c854ac7e430bf031ff338bf1ab" }, "downloads": -1, "filename": "declare-0.9.6.tar.gz", "has_sig": false, "md5_digest": "c61a08f0016baf0c1cda0f7c5b7f52bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7464, "upload_time": "2015-07-31T01:14:30", "url": "https://files.pythonhosted.org/packages/03/6c/1ac554c495e8d149f7d22d94c3c04030100bcd30c1f693132946d2318ff4/declare-0.9.6.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "1ad114e47f7683c78bc0099b2b9fc31f", "sha256": "f4a8cda7cd1400c48bc574a9eae63f333a794374f690277b44644d3caf3860ec" }, "downloads": -1, "filename": "declare-0.9.7.tar.gz", "has_sig": false, "md5_digest": "1ad114e47f7683c78bc0099b2b9fc31f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7166, "upload_time": "2015-08-07T01:17:54", "url": "https://files.pythonhosted.org/packages/78/c7/18678b9ffc9e702dffa8faae87e075f355c945790766576492a5f86e5ca0/declare-0.9.7.tar.gz" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "2b39e781f6c8d1eef0a354be57e5636c", "sha256": "4dc11719bff04b951ec26b42b8b5c31b23241770bf97a5f1dbe9ca7d56b8e2b7" }, "downloads": -1, "filename": "declare-0.9.8.tar.gz", "has_sig": false, "md5_digest": "2b39e781f6c8d1eef0a354be57e5636c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7205, "upload_time": "2015-08-08T00:43:00", "url": "https://files.pythonhosted.org/packages/77/d1/e18089ee6773fa3dee85fa3bf4386edaee928c6df7c4749bb16f5098aa84/declare-0.9.8.tar.gz" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "a615d75a19b459ebbee2fe95d324ea3a", "sha256": "1bdd83c93c63a990e051890e40707718fe5d8e87eb593f6ce78ae493858457d3" }, "downloads": -1, "filename": "declare-0.9.9.tar.gz", "has_sig": false, "md5_digest": "a615d75a19b459ebbee2fe95d324ea3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7231, "upload_time": "2015-12-11T00:57:23", "url": "https://files.pythonhosted.org/packages/87/33/80eb703ebdbbbedc63da1e92ca5177129cc0641f85a8712891d9bab4fab9/declare-0.9.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c77a3a602cb78014fc499dbbf5ce7dfc", "sha256": "f2477867796df9fca59e054999d3c906baa09112da0d4cdf5a3e3910f3f2c75c" }, "downloads": -1, "filename": "declare-0.9.12-py3-none-any.whl", "has_sig": false, "md5_digest": "c77a3a602cb78014fc499dbbf5ce7dfc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9270, "upload_time": "2017-10-08T01:47:50", "url": "https://files.pythonhosted.org/packages/b2/f7/9a6967295377a72add5016b621baba49921af57a82ad8b8b3f407455abee/declare-0.9.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06401452be9574f82137e495d022e1af", "sha256": "2a3cbd801a372116eb8bd986c4245aa9feaca039b5f797cd608061cc3afb0b2d" }, "downloads": -1, "filename": "declare-0.9.12.tar.gz", "has_sig": false, "md5_digest": "06401452be9574f82137e495d022e1af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7308, "upload_time": "2017-10-08T01:47:51", "url": "https://files.pythonhosted.org/packages/02/9b/479214411ced79e22c203e851513fa58db347bfdd70ae8692a30d87e3a1c/declare-0.9.12.tar.gz" } ] }