{ "info": { "author": "John Reese", "author_email": "john@noswap.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Libraries" ], "description": "ent\n===\n\n.. image:: https://travis-ci.org/jreese/ent.svg?branch=master\n :target: https://travis-ci.org/jreese/ent\n\n\n``ent`` is a basic framework for generating attribute-based data structures from\ndictionary-like data sources::\n\n > from ent import Ent\n\n > obj = Ent(foo='foo', bar=None)\n\n > obj.foo\n u'foo'\n\n > obj.bar\n None\n\n``ent`` can contain arbitrarily-nested hierarchies, as long as every node/leaf\nis either a primitive type, or an ent::\n\n > obj = Ent({\n 'foo': 'bar',\n 'list': [1, 2, 3, 4],\n 'inner': {\n 'foo': 'baz',\n 'bar': 'bang',\n },\n 'ent': Ent(foo='bar'),\n })\n\n > obj.foo\n u'bar'\n\n > obj.list[2]\n 3\n\n > obj.inner.foo\n u'baz'\n\n``ent`` can be merged and diffed, and it will even enforce types when merging\nkeys that are shared::\n\n > ent1 = Ent(foo=1, bar=True)\n\n > ent2 = Ent(foo='hi', bar=False, goo='win')\n\n > Ent.merge(ent1, ent2)\n \n\n > Ent.diff(ent1, ent2)\n \n\n``ent`` even provides a stand-in for the ``json`` and ``yaml`` modules to\nautomatically convert to and from Ent objects and raw JSON/YAML::\n\n > from ent import json, yaml\n\n > json.loads('{\"foo\": true, \"bar\": null}')\n \n\n > json.dumps(Ent(foo=True, bar=None))\n u'{\"foo\": true, \"bar\": null}'\n\n > yaml.safe_load('bar: null\\nfoo: true\\n')\n \n\n > yaml.dump(Ent(foo=True, bar=None))\n u'baz: 1\\nfoo: bar\\n'\n\n\nwhy\n---\n\nWhen working with configs, or other content pulled from sources like JSON, it\ncan be really annoying to need to constantly use brackets to access nested\ndata structures.\n\nLet's say we have a small JSON file containing my personal profile::\n\n {\n \"name\": \"John Reese\",\n \"urls\": {\n \"blog\": \"https://noswap.com\",\n \"github\": \"https://github.com/jreese\",\n \"facebook\": \"https://www.facebook.com/nucleareclipse\"\n }\n }\n\nNow let's read in that data and print some of it out using the standard\n``json`` module::\n\n import json\n\n with open(...) as f:\n data = json.load(f)\n\n name = data['name']\n url = data['urls']['github']\n\nWe can do better with ``ent``::\n\n from ent import json\n\n with open(...) as f:\n data = json.load(f)\n\n name = data.name\n url = data.urls.github\n\n\ninstall\n-------\n\nent is compatible with Python 2.7+ and Python 3.3+.\nYou can install it from PyPI with the following command::\n\n $ pip install ent\n\n\nlicense\n-------\n\nent is copyright 2015 John Reese, and is licensed under the MIT license.\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jreese/ent", "keywords": null, "license": "MIT License", "maintainer": null, "maintainer_email": null, "name": "ent", "package_url": "https://pypi.org/project/ent/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/ent/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/jreese/ent" }, "release_url": "https://pypi.org/project/ent/0.3.3/", "requires_dist": null, "requires_python": null, "summary": "library for creating arbitrary data structures", "version": "0.3.3" }, "last_serial": 2092758, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ebd49028563d7dc7e0246573871f7ca5", "sha256": "7a987b46efb4ec3ca1fe31067d676a5a0365a609b077b11cecbd01e7dec605ee" }, "downloads": -1, "filename": "ent-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ebd49028563d7dc7e0246573871f7ca5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3896, "upload_time": "2015-02-05T02:58:51", "url": "https://files.pythonhosted.org/packages/29/df/f581a610caaf319be6373cb378d901de179eb63ee68ebadf0d1824c743de/ent-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "94fc1ae58e1921eb67a853b11386150d", "sha256": "e5aef10e7f519d7ae7c6c01b64f34692bf5d1f3485c82af93a98dce0e6db89ec" }, "downloads": -1, "filename": "ent-0.1.1.tar.gz", "has_sig": false, "md5_digest": "94fc1ae58e1921eb67a853b11386150d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3932, "upload_time": "2015-02-05T03:26:45", "url": "https://files.pythonhosted.org/packages/72/03/481ddbd20a530e85bf249472772987eb546433e8003752c3e3f5bc3d69cc/ent-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "5bcdad08ceb36a5318ecace8859a69f5", "sha256": "0036d48da769cd7c9613ae28043051cc5f632321af817be955a990b0b1a9d566" }, "downloads": -1, "filename": "ent-0.2.0.tar.gz", "has_sig": false, "md5_digest": "5bcdad08ceb36a5318ecace8859a69f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4894, "upload_time": "2015-02-05T07:47:44", "url": "https://files.pythonhosted.org/packages/52/e5/4d1db652524cf58656d02f55cf56f3c3c719193c761406a5d917b31ba153/ent-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "39cad52de271453f205c110050814e0d", "sha256": "426aaf1a4c5f5bb9d85fcf4ef0c62db0e7c19e45b53a914115e541d5014ac5b7" }, "downloads": -1, "filename": "ent-0.2.1.tar.gz", "has_sig": false, "md5_digest": "39cad52de271453f205c110050814e0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4938, "upload_time": "2015-02-05T18:57:36", "url": "https://files.pythonhosted.org/packages/27/32/12407ae61913c01efee3fe31cbd78ab4bb5ac6810e3e99f65a7913953250/ent-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "355253233861bbde8b4f08925ea5ec85", "sha256": "e6728c309b705d2c91b1c70f2e621ea1be9e73a0849d6a4bc544fafddbf72088" }, "downloads": -1, "filename": "ent-0.2.2.tar.gz", "has_sig": false, "md5_digest": "355253233861bbde8b4f08925ea5ec85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4940, "upload_time": "2015-02-05T19:02:30", "url": "https://files.pythonhosted.org/packages/19/57/7eefda44d1fcec83f2a468737fb3383b1263f425f56d514244e278bd6318/ent-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "caa695565ff4248c6730e2f03d451a9b", "sha256": "70afe39076995a91feef471f6d7c9cb956bd1e3c718bd29e000926234eba4e6e" }, "downloads": -1, "filename": "ent-0.2.3.tar.gz", "has_sig": false, "md5_digest": "caa695565ff4248c6730e2f03d451a9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4957, "upload_time": "2015-02-10T00:04:15", "url": "https://files.pythonhosted.org/packages/b0/35/1ac081d4041ca38630bed1b186b5929e2888caf2234da8a54cec6d2d3ffb/ent-0.2.3.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "9f21b313c9ccb6b47ff3e080d9cdb7a8", "sha256": "a019907fb572e240b3b74ed53704b4835a7ee19fd0c5a8989fb4fe51e5d787b6" }, "downloads": -1, "filename": "ent-0.3.0.tar.gz", "has_sig": false, "md5_digest": "9f21b313c9ccb6b47ff3e080d9cdb7a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5294, "upload_time": "2016-01-07T02:20:25", "url": "https://files.pythonhosted.org/packages/be/35/ae57bdef182425c228a5a44a8eb5ac1c57ccb665cdad01c70ceec9eef5d4/ent-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "571e6d7a45a70508a01b8accac9e30f4", "sha256": "efb55d596b4d342284f74699da127d42d21a74c0bff1cbf9c1ec9cbf685b7710" }, "downloads": -1, "filename": "ent-0.3.1.tar.gz", "has_sig": false, "md5_digest": "571e6d7a45a70508a01b8accac9e30f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5305, "upload_time": "2016-01-07T06:20:51", "url": "https://files.pythonhosted.org/packages/db/46/9d3311f163da9342066a77e9dd7e3f70749fb8945c04436dfe8b4474d965/ent-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "199b792594ca10e2540f9663ee564b05", "sha256": "9876dfb2b2da9e7699b1de81763c3f06ea031b0a775617ced8b43662dd153866" }, "downloads": -1, "filename": "ent-0.3.2.tar.gz", "has_sig": false, "md5_digest": "199b792594ca10e2540f9663ee564b05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5394, "upload_time": "2016-01-07T06:46:08", "url": "https://files.pythonhosted.org/packages/17/47/39e48c2394b744acde0ab2a25a726319bd5c7da5c00ab9a6312696ea3f75/ent-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "76ebe626ffbe1270903025675de1d733", "sha256": "fef020d2f7db222fee188e7b6be92c8e0c5f94029848f0a89c9dff057c3bc7bc" }, "downloads": -1, "filename": "ent-0.3.3.tar.gz", "has_sig": false, "md5_digest": "76ebe626ffbe1270903025675de1d733", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5488, "upload_time": "2016-04-30T19:40:38", "url": "https://files.pythonhosted.org/packages/4f/37/ab1179bbd7276a25c37fc442edbb626f12e57ff69c94eaff3a84d7ae7bc0/ent-0.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "76ebe626ffbe1270903025675de1d733", "sha256": "fef020d2f7db222fee188e7b6be92c8e0c5f94029848f0a89c9dff057c3bc7bc" }, "downloads": -1, "filename": "ent-0.3.3.tar.gz", "has_sig": false, "md5_digest": "76ebe626ffbe1270903025675de1d733", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5488, "upload_time": "2016-04-30T19:40:38", "url": "https://files.pythonhosted.org/packages/4f/37/ab1179bbd7276a25c37fc442edbb626f12e57ff69c94eaff3a84d7ae7bc0/ent-0.3.3.tar.gz" } ] }