{ "info": { "author": "Cristiano Cortezia", "author_email": "cristiano.cortezia@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7" ], "description": "[![CircleCI](https://circleci.com/gh/ccortezia/clockrange.svg?style=svg)](https://circleci.com/gh/ccortezia/clockrange)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/d78ce1d72bb1d0b594b8/test_coverage)](https://codeclimate.com/github/ccortezia/clockrange/test_coverage)\n[![Maintainability](https://api.codeclimate.com/v1/badges/d78ce1d72bb1d0b594b8/maintainability)](https://codeclimate.com/github/ccortezia/clockrange/maintainability)\n\n# clockrange\n\nA clock-like periodic sequence generator\n\n## Installation\n\n```shell\npip install clockrange\n```\n\n## Getting Started\n\n`ClockRange` provides clock-like sequences according to the given specification:\n\n```python\nfrom clockrange import ClockRange\n\n# A typical 24h microsecond-granular clock.\nclock = ClockRange((24, 60, 60, 1000, 1000))\n\n# How many microseconds until the clock completes a full cycle?\nlen(clock)\n\n# How does the clock look like when 150000 microseconds have passed?\nclock[150000]\n```\n\nSee more examples below.\n\n## Examples\n\n`ClockRange` accepts different specification formats:\n\n```python\n# These are equivalent:\nClockRange((3, 60))\nClockRange(([0, 1, 2], 60))\nClockRange((range(3), 60))\nClockRange((range(0, 3, 1), 60))\n\n# These result in .counters being different from .rendered:\nClockRange(([\"A\", \"B\", \"Z\"], 60))\nClockRange((range(4, 10, 2), 60))\n```\n\n`ClockRange` instances support random item access with O(1) runtime performance:\n\n```python\nclock = ClockRange((24, 60, 60))\nclock[0] # ClockState(counters=(0, 0, 0), cycles=0, rendered=(0, 0, 0))\nclock[1] # ClockState(counters=(0, 0, 1), cycles=0, rendered=(0, 0, 1))\nclock[86400] # ClockState(counters=(0, 0, 0), cycles=1, rendered=(0, 0, 0))\n```\n\n`ClockRange.__len__` provides the cycle length:\n\n```python\nassert len(ClockRange((12,))) == 12\nassert len(ClockRange((10, 10))) == 100\nassert len(ClockRange((24, 60, 60))) == 86400\n```\n\n`ClockRange` instances can be iterated on:\n\n```python\nclock = ClockRange((24, 60, 60))\nit = iter(clock)\nnext(it) # ClockState(counters=(0, 0, 0), cycles=0, rendered=(0, 0, 0))\nnext(it) # ClockState(counters=(0, 0, 1), cycles=0, rendered=(0, 0, 1))\n```\n\n`ClockRange` iterators never get exhausted, so loop control needs to be performed manually:\n\n```python\nfor state in ClockRange((24, 60, 60):\n if state.cycle == 1:\n break\n```\n\n## Contributing\n\nTo run the test suite locally, clone and setup the repository for local development:\n\n```shell\npipenv install\npytest --cov-report=html\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ccortezia/clockrange/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "clockrange", "package_url": "https://pypi.org/project/clockrange/", "platform": "", "project_url": "https://pypi.org/project/clockrange/", "project_urls": { "Homepage": "https://github.com/ccortezia/clockrange/" }, "release_url": "https://pypi.org/project/clockrange/0.0.1/", "requires_dist": null, "requires_python": "", "summary": "A clock-like periodic sequence generator", "version": "0.0.1" }, "last_serial": 5900204, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "eb6caabdb1a64268fb1230579a31bc5d", "sha256": "0151204e8f65129f8bcc5ab745d19ba79372d0c318bd7a1194d59eff9caf17fd" }, "downloads": -1, "filename": "clockrange-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "eb6caabdb1a64268fb1230579a31bc5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2877, "upload_time": "2019-09-28T17:53:05", "url": "https://files.pythonhosted.org/packages/83/93/3c95254af283d1431b3abcd38be0a202bb8c349b3b872bb06fdc8ae0d841/clockrange-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1520fc4c06d6d6ac61ab758fae6449f0", "sha256": "04ebb0b4f23b5ca71570a4ca7e807c131d1b8001941f422ab6a49587589ebf89" }, "downloads": -1, "filename": "clockrange-0.0.1.tar.gz", "has_sig": false, "md5_digest": "1520fc4c06d6d6ac61ab758fae6449f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2518, "upload_time": "2019-09-28T17:53:10", "url": "https://files.pythonhosted.org/packages/0e/df/8adc4d061d166f51b0cd69270cf40366e38676076e00e535485338df0e9d/clockrange-0.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "eb6caabdb1a64268fb1230579a31bc5d", "sha256": "0151204e8f65129f8bcc5ab745d19ba79372d0c318bd7a1194d59eff9caf17fd" }, "downloads": -1, "filename": "clockrange-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "eb6caabdb1a64268fb1230579a31bc5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2877, "upload_time": "2019-09-28T17:53:05", "url": "https://files.pythonhosted.org/packages/83/93/3c95254af283d1431b3abcd38be0a202bb8c349b3b872bb06fdc8ae0d841/clockrange-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1520fc4c06d6d6ac61ab758fae6449f0", "sha256": "04ebb0b4f23b5ca71570a4ca7e807c131d1b8001941f422ab6a49587589ebf89" }, "downloads": -1, "filename": "clockrange-0.0.1.tar.gz", "has_sig": false, "md5_digest": "1520fc4c06d6d6ac61ab758fae6449f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2518, "upload_time": "2019-09-28T17:53:10", "url": "https://files.pythonhosted.org/packages/0e/df/8adc4d061d166f51b0cd69270cf40366e38676076e00e535485338df0e9d/clockrange-0.0.1.tar.gz" } ] }