{ "info": { "author": "prior", "author_email": "mprior@hubspot.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database", "Topic :: Internet", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Physics", "Topic :: Software Development", "Topic :: Software Development :: Internationalization", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Localization", "Topic :: Utilities" ], "description": "# sanetime\n\n**A sane date/time python interface:** better epoch time, timezones, and deltas, django support as well\n\n## intro\n\n**sanetime** was written to DRY up all the common date/time manipulations we all do constantly in our code while offering the most simple, versatile, and intuitive client possible.\n\nWe've all learned that the only sane way to store times is using epoch time. (You have, haven't you?) \nUnfortunately, manipulating epoch time and timezones with the standard python toolset requires getting up to speed on a managerie of python modules and concepts: datetime, date, time, calendar, pytz, dateutils, timedelta, time tuples, localize, normalize.\n\n**sanetime** seeks to bring more sanity to the manipulations of epoch time, timezone, time delta, and time generally.\n\n``` python\n>>> from sanetime import time,delta # a tiny taste\n\n>>> time('2012-05-01 22:31',tz='America/New_York').millis\n1335925860000\n\n>>> str(time(tz='Europe/London')) # now in London\n'2012-05-29 15:28:05.178741 +Europe/London'\n\n>>> (time(2012,6,1) - time('2012-05-01')).hours\n744\n\n>>> (time() + delta(h=12)).s # epoch seconds 12 hours from now\n1338344977\n```\n\n## concepts\n\n### time\n\nThe `time` class represents a moment in time, internally stored as microseconds since epoch.\nA `time` object also has an associated timezone (UTC by default), however the timezone will never be considered during hashing, comparison or equality checks,\ni.e. A moment in `time` experienced in America/New\\_York is equal to the same moment in `time` experienced in Europe/Dublin.\n\n### tztime\n\nThe `tztime` class is exactly like the `time` object, except that timezone **does** factor into equality, comparison, and hashing.\nA moment in `tztime` experienced in America/New\\_York is **not** the same as the same `tztime` moment experienced in Europe/Dublin.\n\n### delta\n\nThe `delta` class represents a period of time, and provides easy access to all the different ways you might slice and dice this:\nmicros, millis, seconds, minutes, hours, mean\\_days, mean\\_weeks, mean\\_months, mean\\_years.\nThere are also many different flavors of these: rounded, floored, floated, positional, rounded\\_positional.\nThere is no attempt made in delta yet to be calendar aware (hence the 'mean' prefixes in some cases).\n\n### span\n\nThe `span` class represents a window of time ranging from one specific moment in time to another specific moment in time.\nYou can think of it as a start `time` with a `delta`, or as a start `time` and a stop `time`.\n\n### django\n\nA django model field is also provided: `SaneTimeField`, that makes it super simple to store a sanetime.\nThey honor the auto\\_add and auto\\_add\\_now features to easily turn your sanetimes into updated\\_at or created\\_at fields.\nAnd they even work with south out of the box.\n\n## details\n\n### time `from sanetime import time`\n\n#### construction\n\nYou can construct a sanetime object from epoch times, datetimes, date/time parts, or from a parseable string.\n\nEpoch microseconds are assumed when no keyword is given.\nIntuitive aliases exists for kwargs, be as terse or verbose as you want (us = micros = epoch\\_micros = epoch\\_microseconds):\n\n``` python\n>>> time(1338508800000000)\nSaneTime(1338508800000000,)\n\n>>> time(micros=1338508800000000)\nSaneTime(1338508800000000,)\n\n>>> time(millis=1338508800000)\nSaneTime(1338508800000000,)\n\n>>> time(seconds=1338508800)\nSaneTime(1338508800000000,)\n\n>>> time(minutes=22308480, tz='America/New_York')\nSaneTime(1338508800000000,)\n```\n\nIf you have the calendar parameters, then construct just as you would a datetime:\n\n``` python\n>>> time(2012,1,1)\nSaneTime(1325376000000000,)\n\n>>> time(2012,1,1,12,30,1)\nSaneTime(1325421001000000,)\n\n>>> time(2012,1,1,12,30,1,1, tz='America/New_York')\nSaneTime(1325421001000001,)\n```\n\n\nIf you already have a datetime object, just construct from that:\n\n``` python\n>>> dt = datetime(2012,1,1)\n>>> time(dt)\nSaneTime(1325376000000000,)\n```\n\n\nOr construct from a parsable string:\n\n``` python\n>>> time('January 1st, 2012 12:30:01pm')\nSaneTime(1325421001000000,)\n\n>>> time('January 1st, 2012 12:30:01pm', tz='America/New_York')\nSaneTime(1325421001000000,)\n```\n\n\n#### arithmetic\n\nAdding any int/long assumes it to be in microseconds. You can also add any `delta`:\n\n``` python\n>>> time(2012,1,1) + 5\nSaneTime(1325376000000005,)\n\n>>> time(2012,1,1) + delta(hours=5)\nSaneTime(1325394000000000,)\n```\n\n\nSubtracting two sanetimes produces a `delta`:\n\n``` python\n>>> time() - time(2012,1,1) # time since new year\nSaneDelta(15131339063956)\n\n>>> abs(time() - time()).micros # microseconds to construct a time\n30\n```\n\n\n#### conversion\n\nYou can easily convert to a timezone-aware datetime or to a \"naive\" datetime. They are accessed as properties.\n\n``` python\n>>> time(2012,1,1,tz='America/Los_Angeles').datetime\ndatetime.datetime(2012, 1, 1, 0, 0, tzinfo=)\n\n>>> time(2012,1,1,tz='America/Los_Angeles').naive_datetime\ndatetime.datetime(2012, 1, 1, 0, 0)\n```\n\nThere are other convenience datetime timezone conversions as well.\n\n``` python\n>>> time(2012,1,1,tz='America/Los_Angeles').utc_datetime\ndatetime.datetime(2012, 1, 1, 8, 0, tzinfo=)\n\n>>> time(2012,1,1,tz='America/Los_Angeles').utc_naive_datetime\ndatetime.datetime(2012, 1, 1, 8, 0)\n\n>>> time(2012,1,1,tz='America/Los_Angeles').ny_datetime\ndatetime.datetime(2012, 1, 1, 3, 0, tzinfo=)\n\n>>> time(2012,1,1,tz='America/Los_Angeles').ny_naive_datetime\ndatetime.datetime(2012, 1, 1, 3, 0)\n```\n\nTo epoch times:\n\n``` python\n>>> time(2012,1,1).minutes\n22089600\n\n>>> time(2012,1,1).seconds\n1325376000\n\n>>> time(2012,1,1).millis\n1325376000000\n\n>>> time(2012,1,1).micros\n1325376000000000\n```\n\nlong and int conversion just bring back the epoch microseconds\n\n``` python\n>>> int(time(2012,1,1))\n1325376000000000\n\n>>> long(time(2012,1,1))\n1325376000000000L\n```\n\n\n##### date/time parts\n\nYou can get at any of the date parts just as you might with datetime properties. Be careful-- these properties are all singular. Do not confuse with the plural epoch possiblities of the previous section. (this ambiguity will be fixed in future versions)\n\n``` python\n>>> time().year\n2012\n>>> time().month\n6\n>>> time().day\n24\n>>> time().hour\n3\n>>> time().minute\n42\n>>> time().second\n12\n>>> time().micro\n664819\n```\n\n### tztime `from sanetime import time`\n\n#### construction\n\nYou construct a sanetztime object with all the same possibilities as a sanetime object, but remember, now the timezone matters for equality, comparison, and hashing.\nTimezone defaults to UTC if not specified.\n\n``` python\n>>> tztime()\nSaneTzTime(1358919880245463,) # now\n\n>>> tztime(tz='America/New_York') # now in New York\nSaneTzTime(1358919987623544,)\n\n>>> tztime(ms=1325376000000, tz='America/New_York') \nSaneTzTime(1325376000000000,)\n\n>>> tztime(2012,1,1, tz='America/New_York')\nSaneTzTime(1325394000000000,)\n```\n\n### delta `from sanetime import delta`\n\n#### construction\n\nPassing no parameters specifies a 0 delta:\n\n``` python\n>>> delta()\nSaneDelta(0)\n```\n\na raw arg is assumed to be in microseconds:\n``` python\n>>> delta(1000)\nSaneDelta(1000)\n```\n\nthere are many keyword possibilities -- be as verbose or terse as you want to be -- but whatever you think it should be likely works:\n``` python\n>>> delta(hours=30)\nSaneDelta(108000000000)\n\n>>> delta(s=30)\nSaneDelta(30000000)\n\n>>> delta(seconds=30)\nSaneDelta(30000000)\n\n>>> delta(secs=30)\nSaneDelta(30000000)\n```\n\nweeks and beyond can only be specified as \"mean\\_\" weeks, months, etc.\nThat is because the specific delta of a specific week could be different depending on when the week falls, and the sanetime library and made no attempt to accomodate this yet.\nA \"mean\\_week\" is exactly 7*24 hours. A \"mean_month\" is exactly (365*4+1)/4/12*24 hours. A \"mean_year\" is exactly(365*4+1)/4*24 hours.\n\n``` python\n>>> delta(mean_months=30)\nSaneDelta(18144000000000)\n```\n\n#### arithmetic\n\nsanedeltas can be added and subtracted from any sanetime or sanetztime as described above.\nsanedeltas can also be added and subtracted from one another.\nif a raw number is added or subtracted from a delta it is assumed to be in micros.\n\n``` python\n>>> delta(h=1) - delta(m=1,s=1)\nSaneDelta(3539000000)\n\n>>> delta(ms=1000) - 1000\nSaneDelta(999000)\n```\n\n#### conversion\n\ndelta's can be converted to any epoch number in a number of ways (rounded, whole (i.e. floored), or floated). When unspecified, they are rounded:\n\n``` python\n>>> from sanetime import delta\n>>> delta(ms=9482923939).minutes # rounded\n158049\n>>> delta(ms=9482923939).rounded_minutes\n158049\n>>> delta(ms=9482923939).whole_minutes # floored\n158048\n>>> delta(ms=9482923939).float_minutes\n158048.73231666666\n```\n\nyou can also slice up deltas into their positional components -- that is, if you wanted to have a delta of 150 seconds show up as 2 minutes and 30 seconds:\n\n``` python\n>>> d = delta(s=150)\n>>> d.positional_minutes\n2\n>>> d.positional_seconds\n30\n```\n\n### span `from sanetime import span`\n\n#### construction\n\nYou can construct from either a start and delta or a start and stop time. You must provide a kwarg to do the latter.\n\n``` python\n>>> span(time(), delta(s=90))\nSaneSpan(start=SaneTime(1358925692752574,),delta=SaneDelta(90000000))\n\n>>> span(time(),end=time())\nSaneSpan(start=SaneTime(1358925841490454,),delta=SaneDelta(37))\n```\n\n#### methods\n\n``` python\n>>> span(time(), delta(s=90)).overlaps(span(time(),end=time())) # test for overlap\nTrue\n```\n\n### django\nTODO: write docs (functionality is solid and used without issue in production systems -- just no time for docs yet -- please feel free to help out here)\n\n## notes\n\n### docs\nMany nice little features are not documented in these pages, and are lying in the code awaiting your discovery. One day we'll get everything documented...\n\n### faq\nWhy is everything stored internally as microseconds?\n\nPython's datetime gives us access to microseconds, and since milliseconds would already have us cross the 32bit integer boundary, we might as well capture everything we can and take on microseconds as well.\nThere are plenty of helpers on the time, tztime, and delta that make using epoch seconds or milis just as easy as using micros.\n\n### design principles\n* simple: simplify usecases to single method/property\n* intuitive: easy to remember methods/properties, with guessable aliases - be as verbose (and communicative) or as terse (and efficient) as you want to be. for example t = time(); t.ms == t.millis == t.milliseconds\n* properties whenever sensible: properties are especially useful for django, cuz you can use them directly in templates without having to stage them first in the views.\n\n### links\n\n[sanetime in github](https://github.com/HubSpot/sanetime)\n[sanetime in travis](https://travis-ci.org/HubSpot/sanetime)\n[sanetime in pypi](http://pypi.python.org/pypi/sanetime)", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/HubSpot/sanetime/tarball/v4.2.3", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://hubspot.github.com/sanetime/", "keywords": null, "license": "Copyright (c) 2012 HubSpot, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "maintainer": null, "maintainer_email": null, "name": "sanetime", "package_url": "https://pypi.org/project/sanetime/", "platform": "any", "project_url": "https://pypi.org/project/sanetime/", "project_urls": { "Download": "https://github.com/HubSpot/sanetime/tarball/v4.2.3", "Homepage": "http://hubspot.github.com/sanetime/" }, "release_url": "https://pypi.org/project/sanetime/4.2.3/", "requires_dist": null, "requires_python": null, "summary": "A sane date/time python interface: better epoch time, timezones, and deltas -- django support as well", "version": "4.2.3" }, "last_serial": 799203, "releases": { "2.0.1": [], "3.0.2": [], "4.0.1": [ { "comment_text": "", "digests": { "md5": "6611e6061f8c3ce1736f6f8981e75b8f", "sha256": "91fbdcfc5b83e58ef37f0c3dd096942e89853307ef90b3397a3c9aff89557647" }, "downloads": -1, "filename": "sanetime-4.0.1.tar.gz", "has_sig": false, "md5_digest": "6611e6061f8c3ce1736f6f8981e75b8f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12293, "upload_time": "2012-05-04T18:12:13", "url": "https://files.pythonhosted.org/packages/09/df/8d382db3d0467a20b3bef274a26d6e1cc0b0b551f216f1deb4eb1e711642/sanetime-4.0.1.tar.gz" } ], "4.0.2": [ { "comment_text": "", "digests": { "md5": "36d757730cbc1000594274f5c46fbe1b", "sha256": "b8f6d945b795f9eb0d240edd0a127a45da885cebfd8546ece9538317964156f5" }, "downloads": -1, "filename": "sanetime-4.0.2.tar.gz", "has_sig": false, "md5_digest": "36d757730cbc1000594274f5c46fbe1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9003, "upload_time": "2012-05-04T22:49:11", "url": "https://files.pythonhosted.org/packages/ca/1d/264f72dc835997ba066cc14f74cb2bb1c736d41277a96c241129fd42999c/sanetime-4.0.2.tar.gz" } ], "4.0.3": [ { "comment_text": "", "digests": { "md5": "9efa2b4297f7b6abc8810891174dc6e5", "sha256": "be18d0a437df717fb194348ccb4dce0b645f43082967f6ee0b2fc599fff66150" }, "downloads": -1, "filename": "sanetime-4.0.3.tar.gz", "has_sig": false, "md5_digest": "9efa2b4297f7b6abc8810891174dc6e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9001, "upload_time": "2012-05-04T22:53:39", "url": "https://files.pythonhosted.org/packages/98/a7/defb044e2082f5c324dc912072a5cc45b1d4e441b5e3a799e8ce76d51d74/sanetime-4.0.3.tar.gz" } ], "4.0.4": [ { "comment_text": "", "digests": { "md5": "51153ef5eafce80d6f544b1ab3a75408", "sha256": "71c5e592f7a884a9514a64ff96a22c83d9e43ec799fa285e95059dfe94fdf92a" }, "downloads": -1, "filename": "sanetime-4.0.4.tar.gz", "has_sig": false, "md5_digest": "51153ef5eafce80d6f544b1ab3a75408", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8809, "upload_time": "2012-05-09T04:44:00", "url": "https://files.pythonhosted.org/packages/10/72/74e835cb4baae1c8b08151685a50f164f584cd7579a0607914c4a2046d8b/sanetime-4.0.4.tar.gz" } ], "4.0.5": [ { "comment_text": "", "digests": { "md5": "743cbab3627926bae4aa2faa5a0d6ea2", "sha256": "9c16f75cc4826269531505c0accccdfa47c4590c8a8818e7d183c117541f2acc" }, "downloads": -1, "filename": "sanetime-4.0.5.tar.gz", "has_sig": false, "md5_digest": "743cbab3627926bae4aa2faa5a0d6ea2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8782, "upload_time": "2012-05-10T00:15:05", "url": "https://files.pythonhosted.org/packages/5b/a1/05394dc9f7c1dd3e26ece6cdb409e2acbfb841c81f3845bd407df0c4e6a7/sanetime-4.0.5.tar.gz" } ], "4.0.6": [ { "comment_text": "", "digests": { "md5": "4d3d71b8963495f5a52dee668c6f0bfc", "sha256": "6248d74271782b58290231fe048c3b000547b4c51e1d2a8a12b799c747e237c9" }, "downloads": -1, "filename": "sanetime-4.0.6.tar.gz", "has_sig": false, "md5_digest": "4d3d71b8963495f5a52dee668c6f0bfc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11120, "upload_time": "2012-05-10T17:36:57", "url": "https://files.pythonhosted.org/packages/06/e6/cfc5efa14cb437196e060070d10362757e29526b4499031c901b7a5c6b4e/sanetime-4.0.6.tar.gz" } ], "4.0.7": [ { "comment_text": "", "digests": { "md5": "c3d66a11b0791ef6f9e572d6d2bf457b", "sha256": "d58f3a6cc2687f7fbd8bd39abe085b28d01c02a4bbdc8464433b2d9717d846a3" }, "downloads": -1, "filename": "sanetime-4.0.7.tar.gz", "has_sig": false, "md5_digest": "c3d66a11b0791ef6f9e572d6d2bf457b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11132, "upload_time": "2012-05-11T17:41:37", "url": "https://files.pythonhosted.org/packages/6b/77/2dc58425b78a31fc45ec995ee35e184784f6866970b8c7ff8106e36ff2bf/sanetime-4.0.7.tar.gz" } ], "4.0.8": [ { "comment_text": "", "digests": { "md5": "c08d2412cc58c95bff94a7ede64ddc28", "sha256": "e23536147819c9d6d3e8772c19a06bca834d8b2be7f20729ab9ae624a9e0f031" }, "downloads": -1, "filename": "sanetime-4.0.8.tar.gz", "has_sig": false, "md5_digest": "c08d2412cc58c95bff94a7ede64ddc28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12406, "upload_time": "2012-05-18T06:46:16", "url": "https://files.pythonhosted.org/packages/d5/9a/8dd30c7d27d00671e44c96fcccf04c731ab04615f479d74a61d7c7484eef/sanetime-4.0.8.tar.gz" } ], "4.0.9": [ { "comment_text": "", "digests": { "md5": "08d1d816c57ca2fda3c73e7a7ec584bd", "sha256": "0999cdab7cba682a0bd59df0afd6053f7b9ec87e69ecce38c001a347c6ae2bcd" }, "downloads": -1, "filename": "sanetime-4.0.9.tar.gz", "has_sig": false, "md5_digest": "08d1d816c57ca2fda3c73e7a7ec584bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12436, "upload_time": "2012-05-29T16:48:06", "url": "https://files.pythonhosted.org/packages/4f/46/1536547f4905acb64c1bcec4b2f54f8127936becad1514c978a43cc0cb3e/sanetime-4.0.9.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "a0ac2e70dd771e7e3c109a5761647b38", "sha256": "10033fa9dfad9175817f85e5d7b18f7a15e81fd7166c271c7ed31bea2609b776" }, "downloads": -1, "filename": "sanetime-4.1.0.tar.gz", "has_sig": false, "md5_digest": "a0ac2e70dd771e7e3c109a5761647b38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12526, "upload_time": "2012-06-01T00:23:54", "url": "https://files.pythonhosted.org/packages/7f/19/a23d2276209377e01c2d03a66c53836d3fc1e5a580ea4a1b7aa77ccca84e/sanetime-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "68df57119548b0725229d5bfea947080", "sha256": "eddf5a07d397281ea791ed725fd3933e51f656a93013bc9099225d356332a2ee" }, "downloads": -1, "filename": "sanetime-4.1.1.tar.gz", "has_sig": false, "md5_digest": "68df57119548b0725229d5bfea947080", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12543, "upload_time": "2012-06-01T05:23:11", "url": "https://files.pythonhosted.org/packages/3c/1b/95b5be0fe5b1bc164ef90e736c1dcfbd14821af6788d17e6c05719fc2d20/sanetime-4.1.1.tar.gz" } ], "4.1.2": [ { "comment_text": "", "digests": { "md5": "7ed9851e7078bd51f34f8fe03865b0a3", "sha256": "7aeeecd0bb4ecc58dfa54329f2ecd5a65b0524c1459f3173ec9bbf0a6a277382" }, "downloads": -1, "filename": "sanetime-4.1.2.tar.gz", "has_sig": false, "md5_digest": "7ed9851e7078bd51f34f8fe03865b0a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15313, "upload_time": "2012-06-02T17:40:24", "url": "https://files.pythonhosted.org/packages/70/d6/c7e42738916071cbf4bea7bb8b0dc207ae05e063a855b6ff0ff66e6eadc8/sanetime-4.1.2.tar.gz" } ], "4.1.3": [ { "comment_text": "", "digests": { "md5": "1cbfebce49e7e5097176094192497e25", "sha256": "0530a2e6e1aeb62c0348ecee63889db033a010d115c9d8b46babf13ada10f728" }, "downloads": -1, "filename": "sanetime-4.1.3.tar.gz", "has_sig": false, "md5_digest": "1cbfebce49e7e5097176094192497e25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14932, "upload_time": "2012-06-04T04:26:13", "url": "https://files.pythonhosted.org/packages/c6/93/a5ebb0fdfb70b1dfca0f6c05e849086e64276d3525cf3e257eceac1ed963/sanetime-4.1.3.tar.gz" } ], "4.1.4": [ { "comment_text": "", "digests": { "md5": "69ce718595051777932e417052cdf088", "sha256": "90a1d1512351ba852b46071fb9e70f0bd3f8f5f2a00cccfd8109ee4781bc7c96" }, "downloads": -1, "filename": "sanetime-4.1.4.tar.gz", "has_sig": false, "md5_digest": "69ce718595051777932e417052cdf088", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14936, "upload_time": "2012-06-04T04:33:59", "url": "https://files.pythonhosted.org/packages/43/8f/888c59e96ea0c80aac581d17cbeaac6b9469706f7c99ea97b37099a5379d/sanetime-4.1.4.tar.gz" } ], "4.1.5": [ { "comment_text": "", "digests": { "md5": "02eb4f4ad7dc5431195b44c0fc0a8f00", "sha256": "1d6448e9927072094092c113ebf315444cdf753ff725a6b01793b576e537cced" }, "downloads": -1, "filename": "sanetime-4.1.5.tar.gz", "has_sig": false, "md5_digest": "02eb4f4ad7dc5431195b44c0fc0a8f00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14937, "upload_time": "2012-06-04T04:54:50", "url": "https://files.pythonhosted.org/packages/23/fb/1144b0821434e8d167cfa98809a303d5b895110ff353532a46ee18ec24f6/sanetime-4.1.5.tar.gz" } ], "4.1.6": [ { "comment_text": "", "digests": { "md5": "9fd93857b958602a0b505618dc057101", "sha256": "23f05f0c8022f9e0355f85a39381052476163199831d0ee90ea3614ed06d59a6" }, "downloads": -1, "filename": "sanetime-4.1.6.tar.gz", "has_sig": false, "md5_digest": "9fd93857b958602a0b505618dc057101", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15102, "upload_time": "2012-06-04T04:58:33", "url": "https://files.pythonhosted.org/packages/98/9c/ca0e6d92e9e0289d6d501adf92f8639076a22b096d04f32151199ae1b48e/sanetime-4.1.6.tar.gz" } ], "4.1.8": [ { "comment_text": "", "digests": { "md5": "cf5b56d23fea2de9833d74d66e98e0ea", "sha256": "a3fec1d2150a14c1769daae3e0ad84a38624e7658c047718684b96a94e61c5bc" }, "downloads": -1, "filename": "sanetime-4.1.8.tar.gz", "has_sig": false, "md5_digest": "cf5b56d23fea2de9833d74d66e98e0ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17134, "upload_time": "2012-07-12T22:32:26", "url": "https://files.pythonhosted.org/packages/f4/0d/6e6983ca9ca93387d4308c931a5dd6158c37a00baa8be939d25e1471f7b3/sanetime-4.1.8.tar.gz" } ], "4.1.9": [ { "comment_text": "", "digests": { "md5": "ee03f16cb47abe7eda2eadff3c30acf7", "sha256": "36144e930ccba3cf36639f9b7c8762f2743893a0ad882dd20bcfff103ea5ceca" }, "downloads": -1, "filename": "sanetime-4.1.9.tar.gz", "has_sig": false, "md5_digest": "ee03f16cb47abe7eda2eadff3c30acf7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13852, "upload_time": "2012-07-13T23:32:55", "url": "https://files.pythonhosted.org/packages/22/de/a9e4d0d554575a5033f910323b31840d848c444ef54c94184f2441fd3273/sanetime-4.1.9.tar.gz" } ], "4.2.2": [ { "comment_text": "", "digests": { "md5": "5686ea741ea32caaaa3a95a1055d6ab6", "sha256": "f6c44b591c5bbfb7b5d3c036f94d53c2aea32eb34f8e268218510edfa0c2316a" }, "downloads": -1, "filename": "sanetime-4.2.2.tar.gz", "has_sig": false, "md5_digest": "5686ea741ea32caaaa3a95a1055d6ab6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19837, "upload_time": "2013-01-23T04:30:20", "url": "https://files.pythonhosted.org/packages/c1/78/095589f9a6fb34f20bf64d05b15ff97fc95ba263bd07463948e7cf87a1a2/sanetime-4.2.2.tar.gz" } ], "4.2.3": [ { "comment_text": "", "digests": { "md5": "0223b42c59b9f3488677d7feaec52bb8", "sha256": "ec69cc3494a98954b90b4c0659355194873eacca86adaf655518cee3ccc79fb9" }, "downloads": -1, "filename": "sanetime-4.2.3.tar.gz", "has_sig": false, "md5_digest": "0223b42c59b9f3488677d7feaec52bb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22179, "upload_time": "2013-01-23T07:35:54", "url": "https://files.pythonhosted.org/packages/e5/74/070e17caf676193b2b7ae8c908c8c4d9a573cfe0f128a14f31ac699a0a92/sanetime-4.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0223b42c59b9f3488677d7feaec52bb8", "sha256": "ec69cc3494a98954b90b4c0659355194873eacca86adaf655518cee3ccc79fb9" }, "downloads": -1, "filename": "sanetime-4.2.3.tar.gz", "has_sig": false, "md5_digest": "0223b42c59b9f3488677d7feaec52bb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22179, "upload_time": "2013-01-23T07:35:54", "url": "https://files.pythonhosted.org/packages/e5/74/070e17caf676193b2b7ae8c908c8c4d9a573cfe0f128a14f31ac699a0a92/sanetime-4.2.3.tar.gz" } ] }