{ "info": { "author": "Ethan Jucovy", "author_email": "ethan@boldprogressives.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: BSD License" ], "description": ">>> import datetime\n>>> from timelines import timespan, timelayer\n\nA timespan object has a start time and an end time. It can be created either by specifying a start time and an elapsed time, or by specifying both start and end times:\n\n>>> span1 = timespan(datetime.datetime(1984, 11, 26), datetime.timedelta(1))\n>>> span2 = timespan(datetime.datetime(1984, 11, 26) + datetime.timedelta(2), datetime.datetime(1984, 11, 26) + datetime.timedelta(2, 50))\n>>> span1.start\ndatetime.datetime(1984, 11, 26, 0, 0)\n>>> span1.elapsed\ndatetime.timedelta(1)\n\nThe elapsed time of a timespan is the timedelta between its start and end times:\n\n>>> span1.elapsed == span1.end - span1.start\nTrue\n\nA timelayer object is a sorted bag of non-overlapping timespans which know the order in which they occur:\n\n>>> layer = timelayer(span2, span1)\n>>> list(layer) == [span1, span2]\nTrue\n\nJust like a timespan, a timelayer knows its own start and end times:\n\n>>> layer.start == span1.start\nTrue\n>>> layer.end == span2.end\nTrue\n\nThe elapsed duration of a timelayer is the sum of the elapsed durations of the timespans it contains, NOT the delta between its start and end times:\n\n>>> layer.elapsed == span1.elapsed + span2.elapsed\nTrue\n>>> layer.elapsed == layer.end - layer.start\nFalse\n\nYou can add new timespans to a timelayer:\n\n>>> layer.start\ndatetime.datetime(1984, 11, 26, 0, 0)\n>>> layer.end\ndatetime.datetime(1984, 11, 28, 0, 0, 50)\n\n>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(1), datetime.timedelta(0, 600)))\n>>> layer.start\ndatetime.datetime(1984, 11, 25, 0, 0)\n>>> layer.end\ndatetime.datetime(1984, 11, 28, 0, 0, 50)\n\nHowever, you cannot add new timespans which overlap any existing timespans:\n\n>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(2), datetime.timedelta(2)))\nTraceback (most recent call last):\n...\nRuntimeError: datetime.datetime(1984, 11, 26, 0, 0) (contains 1 timespans)> overlaps datetime.datetime(1984, 11, 25, 0, 10)>\n\n>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(1) + datetime.timedelta(0, 300), datetime.timedelta(0, 600)))\nTraceback (most recent call last):\n...\nRuntimeError: datetime.datetime(1984, 11, 25, 0, 15) (contains 1 timespans)> overlaps datetime.datetime(1984, 11, 25, 0, 10)>\n\n>>> layer.add(timespan(datetime.datetime(1984, 11, 26) + datetime.timedelta(0, 300), datetime.timedelta(0, 1200)))\nTraceback (most recent call last):\n...\nRuntimeError: datetime.datetime(1984, 11, 26, 0, 25) (contains 1 timespans)> overlaps datetime.datetime(1984, 11, 27, 0, 0)>\n\nYou can also add constraints to a timelayer. Constraints allow you to freeze the start time and/or end time of a timelayer, or to put an upper bound on the total elapsed time of a layer.\nNew timespans cannot be added to a layer if they fail its constraints:\n\n>>> layer.freeze_start()\n>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(4), datetime.timedelta(2)))\nTraceback (most recent call last):\n...\nRuntimeError: datetime.datetime(1984, 11, 22, 0, 0) is earlier than frozen start datetime.datetime(1984, 11, 25, 0, 0)\n\n>>> layer.freeze_elapsed(datetime.timedelta(3))\n>>> layer.add(timespan(datetime.datetime(1985, 11, 26), datetime.datetime(1985, 11, 29)))\nTraceback (most recent call last):\n...\nRuntimeError: Total elapsed time datetime.timedelta(4, 650) is greater than frozen allowed elapsed time datetime.timedelta(3)\n\n>>> layer.freeze_end(datetime.datetime(1985, 11, 27))\n>>> layer.add(timespan(datetime.datetime(1985, 11, 26, 23), datetime.datetime(1985, 11, 27, 1)))\nTraceback (most recent call last):\n...\nRuntimeError: datetime.datetime(1985, 11, 27, 1, 0) is later than frozen end datetime.datetime(1985, 11, 27, 0, 0)\n\nChangelog\n=========\n\n0.2 (2012-06-15)\n----------------\n\n* Implement timelayer.freeze_elapsed constraint, allowing the user to cap the total allowed\n elapsed time of a layer to a given timedelta\n* Fix a bug in the guaranteed-sortedness of timelayers, by implementing timespan.__cmp___\n* Fix a bug in the collision detection of timelayer.add, by checking collisions against each\n timespan in the existing layer independently, instead of just checking against the layer's\n boundaries\n* Exceptions during timelayer.add now provide more information about why the operation failed\n\n0.1 (2012-06-13)\n----------------\n\n* Initial release, everything is new!", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": "", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "timelines", "package_url": "https://pypi.org/project/timelines/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/timelines/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/timelines/0.2/", "requires_dist": null, "requires_python": null, "summary": "timespan and scheduling helpers for Python", "version": "0.2" }, "last_serial": 800687, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "a92c1a20f151a68f3fc55ebd3b3c0c09", "sha256": "134ff7ef8eb21a1afc085613b4ad84b5b6d1043862f98c664e008dc2eb58a74e" }, "downloads": -1, "filename": "timelines-0.1.tar.gz", "has_sig": false, "md5_digest": "a92c1a20f151a68f3fc55ebd3b3c0c09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2184, "upload_time": "2012-06-13T16:02:09", "url": "https://files.pythonhosted.org/packages/0f/8d/1406149660089c5451f9e7adb37b46f96b14a45d1e098d10ac110f1b7f12/timelines-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "025a194fda70ddaea54b1619d8564572", "sha256": "817b9456604106522ab87a69a4072add006ca20789ee71478a9cb685012fe016" }, "downloads": -1, "filename": "timelines-0.2.tar.gz", "has_sig": false, "md5_digest": "025a194fda70ddaea54b1619d8564572", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3037, "upload_time": "2012-06-15T15:09:16", "url": "https://files.pythonhosted.org/packages/2c/e3/184a2264728c2de4a93ce8c18c7c7df9bfc69b831b92d61194735a5ba2cd/timelines-0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "025a194fda70ddaea54b1619d8564572", "sha256": "817b9456604106522ab87a69a4072add006ca20789ee71478a9cb685012fe016" }, "downloads": -1, "filename": "timelines-0.2.tar.gz", "has_sig": false, "md5_digest": "025a194fda70ddaea54b1619d8564572", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3037, "upload_time": "2012-06-15T15:09:16", "url": "https://files.pythonhosted.org/packages/2c/e3/184a2264728c2de4a93ce8c18c7c7df9bfc69b831b92d61194735a5ba2cd/timelines-0.2.tar.gz" } ] }