{ "info": { "author": "Alin Panaitiu", "author_email": "alin.p32@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "# pyorderby\n\nPython key functions for multi-field ordering in SQL ORDER BY fashion\n\n[![image]]\n\nMeant to be used with built-in `sorted()` *key function*.\n\nSupports also `list.sort()` doing *in-place sorting*.\n\nImplementation uses `operator.itemgetter()` + some internal helper classes to allow descending sorting order.\n\nSo far this is tested and used on *lists of dictionaries*. Adding support for named tuples and others would be possible (using `operator.attrgetter()`).\n\n## Usage\n\n- SQL-like: `orderby('foo ASC, bar DESC')`\n- eval like: `orderby('$foo - $bar * 10')`\n- chained: `asc('foo').desc('bar')` usage\n- multiple fields at once: `asc('foo', 'bar')`\n\n## Examples\n\n#### `orderby()` string syntax:\n\n``` python\n>>> from orderby import orderby\n>>> import json\n>>> files = [\n... {'size': 1234, 'path': 'foo/bar.txt'},\n... {'size': 0, 'path': '/dev/null'},\n... {'size': 1234, 'path': 'foo/abc.bin'},\n... ]\n>>> print(json.dumps(sorted(files, key=orderby('size DESC, path')), indent=2))\n[\n {\n \"size\": 1234,\n \"path\": \"foo/abc.bin\"\n },\n {\n \"size\": 1234,\n \"path\": \"foo/bar.txt\"\n },\n {\n \"size\": 0,\n \"path\": \"/dev/null\"\n }\n]\n```\n\n#### Chained asc() and desc() usage:\n\n``` python\n>>> from orderby import asc, desc\n>>> print(json.dumps(sorted(files, key=desc('size').asc('path')), indent=2))\n[\n {\n \"size\": 1234,\n \"path\": \"foo/abc.bin\"\n },\n {\n \"size\": 1234,\n \"path\": \"foo/bar.txt\"\n },\n {\n \"size\": 0,\n \"path\": \"/dev/null\"\n }\n]\n```\n\n#### In-place sorting of a list:\n\n``` python\n>>> files.sort(key=desc('path'))\n>>> print(json.dumps(files, indent=2))\n[\n {\n \"size\": 1234,\n \"path\": \"foo/bar.txt\"\n },\n {\n \"size\": 1234,\n \"path\": \"foo/abc.bin\"\n },\n {\n \"size\": 0,\n \"path\": \"/dev/null\"\n }\n]\n>>> files.sort(key=desc('size').asc('path'))\n>>> print(json.dumps(files, indent=2))\n[\n {\n \"size\": 1234,\n \"path\": \"foo/abc.bin\"\n },\n {\n \"size\": 1234,\n \"path\": \"foo/bar.txt\"\n },\n {\n \"size\": 0,\n \"path\": \"/dev/null\"\n }\n]\n```\n\n#### Works also with [SortedContainers]:\n\n``` python\n>>> from sortedcontainers import SortedList\n>>> from orderby import desc\n>>> mylist = SortedList(key=desc('value'))\n>>> mylist\nSortedListWithKey([], key=, load=1000)\n>>> mylist.add({'value': 13})\n>>> mylist.add({'value': 2})\n>>> mylist.add({'value': 1000})\n>>> mylist\nSortedListWithKey([{'value': 1000}, {'value': 13}, {'value': 2}], key=, load=1000)\n```\n\n [image]: https://img.shields.io/pypi/v/orderby.svg\n [![image]]: https://pypi.python.org/pypi/orderby\n [SortedContainers]: http://www.grantjenks.com/docs/sortedcontainers/\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/alin23/pyorderby", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pyorderby", "package_url": "https://pypi.org/project/pyorderby/", "platform": "", "project_url": "https://pypi.org/project/pyorderby/", "project_urls": { "Homepage": "https://github.com/alin23/pyorderby" }, "release_url": "https://pypi.org/project/pyorderby/1.0.0/", "requires_dist": null, "requires_python": "", "summary": "", "version": "1.0.0" }, "last_serial": 3242784, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "f40b12274b77bd1d98cae4e22e9862d1", "sha256": "d8a8a2bd8caed9a08590c22d7c3c1d69a6099b89d0f73cf0b6d84347baea3248" }, "downloads": -1, "filename": "pyorderby-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f40b12274b77bd1d98cae4e22e9862d1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7272, "upload_time": "2017-10-11T17:12:38", "url": "https://files.pythonhosted.org/packages/b0/1e/f38586266a517043c0daf9461b6f713f5fb4fff4865bcd74c1f79239076f/pyorderby-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cf825907c086ecac067152050640495", "sha256": "aab25f809454f23c37cc016453b8acbd9962d1c7a37659ca25a2ccb866cfa406" }, "downloads": -1, "filename": "pyorderby-1.0.0.tar.gz", "has_sig": false, "md5_digest": "9cf825907c086ecac067152050640495", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5352, "upload_time": "2017-10-11T17:12:40", "url": "https://files.pythonhosted.org/packages/4f/b8/a77c9a773a4fe17a69d3866bf2de259f72a9afef6393cf8a660fd4ccb558/pyorderby-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f40b12274b77bd1d98cae4e22e9862d1", "sha256": "d8a8a2bd8caed9a08590c22d7c3c1d69a6099b89d0f73cf0b6d84347baea3248" }, "downloads": -1, "filename": "pyorderby-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f40b12274b77bd1d98cae4e22e9862d1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7272, "upload_time": "2017-10-11T17:12:38", "url": "https://files.pythonhosted.org/packages/b0/1e/f38586266a517043c0daf9461b6f713f5fb4fff4865bcd74c1f79239076f/pyorderby-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cf825907c086ecac067152050640495", "sha256": "aab25f809454f23c37cc016453b8acbd9962d1c7a37659ca25a2ccb866cfa406" }, "downloads": -1, "filename": "pyorderby-1.0.0.tar.gz", "has_sig": false, "md5_digest": "9cf825907c086ecac067152050640495", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5352, "upload_time": "2017-10-11T17:12:40", "url": "https://files.pythonhosted.org/packages/4f/b8/a77c9a773a4fe17a69d3866bf2de259f72a9afef6393cf8a660fd4ccb558/pyorderby-1.0.0.tar.gz" } ] }