{ "info": { "author": "John Thorvald Wodder II", "author_email": "derange@varonathe.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Utilities" ], "description": ".. image:: http://www.repostatus.org/badges/latest/active.svg\n :target: http://www.repostatus.org/#active\n :alt: Project Status: Active \u2014 The project has reached a stable, usable\n state and is being actively developed.\n\n.. image:: https://travis-ci.org/jwodder/derange.svg?branch=master\n :target: https://travis-ci.org/jwodder/derange\n\n.. image:: https://codecov.io/gh/jwodder/derange/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/jwodder/derange\n\n.. image:: https://img.shields.io/pypi/pyversions/derange.svg\n :target: https://pypi.python.org/pypi/derange\n\n.. image:: https://img.shields.io/github/license/jwodder/derange.svg\n :target: https://opensource.org/licenses/MIT\n :alt: MIT License\n\n`GitHub `_\n| `PyPI `_\n| `Issues `_\n\nDo you have a list of integers? Do you want to know what ranges of consecutive\nvalues the list covers? Do you need to solve a `gaps and islands\n`_ problem outside of\nSQL? Maybe you have a list of dates and need to find the longest streak of\nconsecutive days on which something happened. No? Why not? Well, either way,\nthe ``derange`` module is here for you, ready to solve all these problems and a\ncouple more.\n\nFull documentation can be viewed after installation with ``python3 -m pydoc\nderange``.\n\n\nInstallation\n============\n``derange`` is written in pure Python 3 with no dependencies. Just use `pip\n`_ for Python 3 (You have pip, right?) to install::\n\n python3 -m pip install derange\n\n\nExamples\n========\nCondense commit years obtained from ``git log`` or the like into ``range``\nobjects::\n\n >>> import derange\n >>> derange.derange([2015, 2015, 2015, 2014, 2014, 2011, 2010, 2010, 2009, 2009])\n [range(2009, 2012), range(2014, 2016)]\n\nIf the input is already sorted, you can condense it slightly faster with\n``derange_sorted``::\n\n >>> derange.derange_sorted([2009, 2009, 2010, 2010, 2011, 2014, 2014, 2015, 2015, 2015])\n [range(2009, 2012), range(2014, 2016)]\n\nOrganize non-integer values into closed intervals (represented as pairs of\nendpoints) with ``deinterval``::\n\n >>> import datetime\n >>> # deinterval() requires a callable for determining when two values are \"adjacent\":\n >>> def within_24_hours(a,b):\n ... return abs(a-b) <= datetime.timedelta(hours=24)\n ...\n >>> timestamps = [\n ... datetime.datetime(2017, 11, 2, 12, 0),\n ... datetime.datetime(2017, 11, 3, 11, 0),\n ... datetime.datetime(2017, 11, 4, 10, 0),\n ... datetime.datetime(2017, 11, 5, 9, 0),\n ... datetime.datetime(2017, 11, 6, 9, 0),\n ... datetime.datetime(2017, 11, 7, 10, 0),\n ... ]\n >>> derange.deinterval(within_24_hours, timestamps)\n [(datetime.datetime(2017, 11, 2, 12, 0), datetime.datetime(2017, 11, 6, 9, 0)), (datetime.datetime(2017, 11, 7, 10, 0), datetime.datetime(2017, 11, 7, 10, 0))]\n\n... which also has a ``deinterval_sorted`` variant::\n\n >>> derange.deinterval_sorted(within_24_hours, timestamps)\n [(datetime.datetime(2017, 11, 2, 12, 0), datetime.datetime(2017, 11, 6, 9, 0)), (datetime.datetime(2017, 11, 7, 10, 0), datetime.datetime(2017, 11, 7, 10, 0))]\n >>> derange.deinterval_sorted(within_24_hours, reversed(timestamps))\n Traceback (most recent call last):\n ...\n ValueError: sequence not in ascending order\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/jwodder/derange", "keywords": "range,interval,compression,consecutive,sequential,sorting,distribution sort,gaps and islands,streak,sparse array,connected component", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "derange", "package_url": "https://pypi.org/project/derange/", "platform": "", "project_url": "https://pypi.org/project/derange/", "project_urls": { "Homepage": "https://github.com/jwodder/derange" }, "release_url": "https://pypi.org/project/derange/0.1.0/", "requires_dist": null, "requires_python": "~=3.3", "summary": "Compress lists of integers to range objects", "version": "0.1.0" }, "last_serial": 3366224, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "cec7a6b3ba1471960fc6295a7d276022", "sha256": "45c79cb5f02fa6757f355f80c7448fb7cb7a4c34b287387f11ca11d6918cda2f" }, "downloads": -1, "filename": "derange-0.1.0-py3-none-any.whl", "has_sig": true, "md5_digest": "cec7a6b3ba1471960fc6295a7d276022", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.3", "size": 7829, "upload_time": "2017-11-26T23:00:50", "url": "https://files.pythonhosted.org/packages/31/34/85d9c54057c3098716b77651f3cb796fd29da631976f1635644c38348245/derange-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0309d3d1dffc7327d3bd1c01f9cb791c", "sha256": "3c559514b70a8a92a3e520c995eba3adf58fbcc7ab58bd3697c56073fe6ccccc" }, "downloads": -1, "filename": "derange-0.1.0.tar.gz", "has_sig": true, "md5_digest": "0309d3d1dffc7327d3bd1c01f9cb791c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.3", "size": 6720, "upload_time": "2017-11-26T23:00:53", "url": "https://files.pythonhosted.org/packages/b4/23/12eb99d8b3550578ce6ab1f21655836a185264da5c66aa3b313d558937f4/derange-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "cec7a6b3ba1471960fc6295a7d276022", "sha256": "45c79cb5f02fa6757f355f80c7448fb7cb7a4c34b287387f11ca11d6918cda2f" }, "downloads": -1, "filename": "derange-0.1.0-py3-none-any.whl", "has_sig": true, "md5_digest": "cec7a6b3ba1471960fc6295a7d276022", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.3", "size": 7829, "upload_time": "2017-11-26T23:00:50", "url": "https://files.pythonhosted.org/packages/31/34/85d9c54057c3098716b77651f3cb796fd29da631976f1635644c38348245/derange-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0309d3d1dffc7327d3bd1c01f9cb791c", "sha256": "3c559514b70a8a92a3e520c995eba3adf58fbcc7ab58bd3697c56073fe6ccccc" }, "downloads": -1, "filename": "derange-0.1.0.tar.gz", "has_sig": true, "md5_digest": "0309d3d1dffc7327d3bd1c01f9cb791c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.3", "size": 6720, "upload_time": "2017-11-26T23:00:53", "url": "https://files.pythonhosted.org/packages/b4/23/12eb99d8b3550578ce6ab1f21655836a185264da5c66aa3b313d558937f4/derange-0.1.0.tar.gz" } ] }