Skip to main content

Travel through time in your tests.

Project description

https://img.shields.io/github/workflow/status/adamchainz/time-machine/CI/master?style=for-the-badge https://img.shields.io/coveralls/github/adamchainz/django-mysql/master?style=for-the-badge https://img.shields.io/pypi/v/time-machine.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit

Travel through time in your tests.

A quick example:

import datetime as dt
import time_machine

@time_machine.travel("1955-11-05 01:22")
def test_delorean():
    assert dt.date.today().isoformat() == "1955-11-05"

For a bit of background, see the introductory blog post.

Installation

Use pip:

python -m pip install time-machine

Python 3.6 to 3.9 supported. Only CPython is supported at this time because time-machine directly hooks into the C-level API.


Testing a Django project? Check out my book Speed Up Your Django Tests which covers loads of best practices so you can write faster, more accurate tests. I created time-machine whilst writing the book.


Usage

travel(destination, *, tick=True, tz_offset=None)

travel() is a class that allows time travel, to the datetime specified by destination. It does so by mocking all functions from Python’s standard library that return the current date or datetime. It can be used independently, as a function decorator, or as a context manager.

destination specifies the datetime to move to. It may be:

  • A datetime.datetime. If it is naive, it will be assumed to have the UTC timezone.

  • A datetime.date. This will be converted to a UTC datetime with the time 00:00:00.

  • A float or int specifying a Unix timestamp

  • A string, which will be parsed with dateutil.parse and converted to a timestamp.

Additionally, you can provide some more complex types:

  • A generator, in which case next() will be called on it, with the result treated as above.

  • A callable, in which case it will be called with no parameters, with the result treated as above.

tick defines whether time continues to “tick” after travelling, or is frozen. If True, the default, successive calls to mocked functions return values increasing by the elapsed real time since the first call. So after starting travel to 0.0 (the UNIX epoch), the first call to any datetime function will return its representation of 1970-01-01 00:00:00.000000 exactly. The following calls “tick,” so if a call was made exactly half a second later, it would return 1970-01-01 00:00:00.500000.

tz_offset allows you to offset the given destination. It may be a timedelta or a number of seconds, which will be added to destination. It may be negative.

Mocked Functions

All datetime functions in the standard library are mocked to move to the destination current datetime:

  • datetime.datetime.now()

  • datetime.datetime.utcnow()

  • time.gmtime()

  • time.localtime()

  • time.clock_gettime() (only for CLOCK_REALTIME)

  • time.clock_gettime_ns() (only for CLOCK_REALTIME)

  • time.strftime()

  • time.time()

  • time.time_ns()

The mocking is done at the C layer, replacing the function pointers for these built-ins. Therefore, it automatically affects everywhere those functions have been imported, unlike use of unittest.mock.patch().

Usage with start() / stop()

To use independently, create and instance, use start() to move to the destination time, and stop() to move back. For example:

import datetime as dt
import time_machine

traveller = time_machine.travel(dt.datetime(1955, 11, 5))
traveller.start()
# It's the past!
assert dt.date.today() == dt.date(1955, 11, 5)
traveller.stop()
# We've gone back to the future!
assert dt.date.today() > dt.date(2020, 4, 29)

travel() instances are nestable, but you’ll need to be careful when manually managing to call their stop() methods in the correct order, even when exceptions occur. It’s recommended to use the decorator or context manager forms instead, to take advantage of Python features to do this.

Function Decorator

When used as a function decorator, time is mocked during the wrapped function’s duration:

import time
import time_machine

@time_machine.travel("1970-01-01 00:00 +0000")
def test_in_the_deep_past():
    assert 0.0 < time.time() < 1.0

You can also decorate asynchronous functions (coroutines):

import time
import time_machine

@time_machine.travel("1970-01-01 00:00 +0000")
async def test_in_the_deep_past():
    assert 0.0 < time.time() < 1.0

Beware: time is a global state - see below.

Context Manager

When used as a context manager, time is mocked during the with block:

import time
import time_machine

def test_in_the_deep_past():
    with time_machine.travel(0.0):
        assert 0.0 < time.time() < 1.0

Class Decorator

Only unittest.TestCase subclasses are supported. When applied as a class decorator to such classes, time is mocked from the start of setUpClass() to the end of tearDownClass():

import time
import time_machine
import unittest

@time_machine.travel(0.0)
class DeepPastTests(TestCase):
    def test_in_the_deep_past(self):
        assert 0.0 < time.time() < 1.0

Note this is different to unittest.mock.patch()'s behaviour, which is to mock only during the test methods.

Coordinates

The start() method and entry of the context manager both return a Coordinates object that corresponds to the given “trip” in time. This has a couple methods that can be used to travel to other times.

move_to(destination)

move_to() moves the current time to a new destination. destination may be any of the types supported by travel.

For example:

import datetime as dt
import time
import time_machine

with time_machine.travel(0, tick=False) as traveller:
    assert time.time() == 0

    traveller.move_to(234)
    assert time.time() == 234

shift(delta)

shift() takes one argument, delta, which moves the current time by the given offset. delta may be a timedelta or a number of seconds, which will be added to destination. It may be negative, in which case time will move to an earlier point.

For example:

import datetime as dt
import time
import time_machine

with time_machine.travel(0, tick=False) as traveller:
    assert time.time() == 0

    traveller.shift(dt.timedelta(seconds=100))
    assert time.time() == 100

    traveller.shift(-dt.timedelta(seconds=10))
    assert time.time() == 90

Caveats

Time is a global state. Any concurrent threads or asynchronous functions are also be affected. Some aren’t ready for time to move so rapidly or backwards, and may crash or produce unexpected results.

Also beware that other processes are not affected. For example, if you use SQL datetime functions on a database server, they will return the real time.

Comparison

There are some prior libraries that try to achieve the same thing. They have their own strengths and weaknesses. Here’s a quick comparison.

unittest.mock

The standard library’s unittest.mock can be used to target imports of datetime and time to change the returned value for current time. Unfortunately, this is fragile as it only affects the import location the mock targets. Therefore, if you have several modules in a call tree requesting the date/time, you need several mocks. This is a general problem with unittest.mock - see Why Your Mock Doesn’t Work.

It’s also impossible to mock certain references, such as function default arguments:

def update_books(_now=time.time):  # set as default argument so faster lookup
    for book in books:
        ...

Although this is rare, it’s often used to optimize repeat loops.

freezegun

Steve Pulec’s freezegun library is a popular solution. It provides a clear API which was much of the inspiration for time-machine.

The main drawback is its slow implementation. It essentially does a find-and-replace mock of all the places that the datetime and time modules have been imported. This gets around the problems with using unittest.mock, but it means the time it takes to do the mocking is proportional to the number of loaded modules. In large projects, this can take several seconds, an impractical overhead for an individual test.

It’s also not a perfect search, since it searches only module-level imports. Such imports are definitely the most common way projects use date and time functions, but they’re not the only way. freezegun won’t find functions that have been “hidden” inside arbitrary objects, such as class-level attributes.

It also can’t affect C extensions that call the standard library functions, including (I believe) Cython-ized Python code.

python-libfaketime

Simon Weber’s python-libfaketime wraps the libfaketime library. libfaketime replaces all the C-level system calls for the current time with its own wrappers. It’s therefore a “perfect” mock for the current process, affecting every single point the current time might be fetched, and performs much faster than freezegun.

Unfortunately python-libfaketime comes with the limitations of LD_PRELOAD. This is a mechanism to replace system libraries for a program as it loads (explanation). This causes two issues in particular when you use python-libfaketime.

First, LD_PRELOAD is only available on Unix platforms, which prevents you from using it on Windows. This can be a complete blocker for many teams.

Second, you have to help manage LD_PRELOAD. You either use python-libfaketime’s reexec_if_needed() function, which restarts (re-execs) your test process while loading, or manually manage the LD_PRELOAD environment variable. Neither is ideal. Re-execing breaks anything that might wrap your test process, such as profilers, debuggers, and IDE test runners. Manually managing the environment variable is a bit of overhead, and must be done for each environment you run your tests in, including each developer’s machine.

time-machine

time-machine is intended to combine the advantages of freezegun and libfaketime. It works without LD_PRELOAD but still mocks the standard library functions everywhere they may be referenced. Its weak point is that other libraries using date/time system calls won’t be mocked. Thankfully this is rare. It’s also possible such python libraries can be added to the set mocked by time-machine.

One drawback is that it only works with CPython, so can’t be used with other Python interpreters like PyPy. However it may possible to extend it to support other interpreters through different mocking mechanisms.

Migrating from libfaketime or freezegun

freezegun has a useful API, and python-libfaketime copies some of it, with a different function name. time-machine also copies some of freezegun’s API, in travel()'s destination, tick, and tz_offset arguments, and the shift() method. There are a few differences:

  • time-machine’s tick argument defaults to True, because code tends to make the (reasonable) assumption that time progresses between function calls, and should normally be tested as such. Testing with time frozen can make it easy to write complete assertions, but it’s quite artificial.

  • freezegun’s tick() method has been implemented as shift(), to avoid confusion with the tick argument. It also requires an explicit delta rather than defaulting to 1 second.

Some features aren’t supported like the auto_tick_seconds argument, or the move_to() method. These may be added in a future release.

If you are only fairly simple function calls, you should be able to migrate by replacing calls to freezegun.freeze_time() and libfaketime.fake_time() with time_machine.travel().

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

time-machine-1.3.0.tar.gz (45.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

time_machine-1.3.0-cp39-cp39-manylinux2010_x86_64.whl (31.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

time_machine-1.3.0-cp39-cp39-manylinux1_x86_64.whl (31.7 kB view details)

Uploaded CPython 3.9

time_machine-1.3.0-cp39-cp39-manylinux1_i686.whl (25.2 kB view details)

Uploaded CPython 3.9

time_machine-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl (12.7 kB view details)

Uploaded CPython 3.9macOS 10.14+ x86-64

time_machine-1.3.0-cp38-cp38-manylinux2010_x86_64.whl (33.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

time_machine-1.3.0-cp38-cp38-manylinux1_x86_64.whl (33.0 kB view details)

Uploaded CPython 3.8

time_machine-1.3.0-cp38-cp38-manylinux1_i686.whl (25.4 kB view details)

Uploaded CPython 3.8

time_machine-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl (12.7 kB view details)

Uploaded CPython 3.8macOS 10.14+ x86-64

time_machine-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl (31.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

time_machine-1.3.0-cp37-cp37m-manylinux1_x86_64.whl (31.1 kB view details)

Uploaded CPython 3.7m

time_machine-1.3.0-cp37-cp37m-manylinux1_i686.whl (23.8 kB view details)

Uploaded CPython 3.7m

time_machine-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl (12.7 kB view details)

Uploaded CPython 3.7mmacOS 10.14+ x86-64

time_machine-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl (28.9 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

time_machine-1.3.0-cp36-cp36m-manylinux1_x86_64.whl (28.9 kB view details)

Uploaded CPython 3.6m

time_machine-1.3.0-cp36-cp36m-manylinux1_i686.whl (22.6 kB view details)

Uploaded CPython 3.6m

time_machine-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl (12.4 kB view details)

Uploaded CPython 3.6mmacOS 10.14+ x86-64

File details

Details for the file time-machine-1.3.0.tar.gz.

File metadata

  • Download URL: time-machine-1.3.0.tar.gz
  • Upload date:
  • Size: 45.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time-machine-1.3.0.tar.gz
Algorithm Hash digest
SHA256 9505228f98321acbeaa38b4208275b9214e630e05ece9e602847dbc4fd318cc2
MD5 32867345c2cdeb03fade71588f21dadd
BLAKE2b-256 7f8438bebfd734abc3648af675557e0a7e5256100c9357ec6260581706a30029

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 31.7 kB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 bce9e572cf980c2d03bd5871c66969ae3e15ca91f27949dcf1f12b6545d7ffb3
MD5 87e8314d6df4c1790b20665435cfa4d1
BLAKE2b-256 f13c21b7a1be827a9a4c51812d7d2fcff1f49d9cd008ae6e6e1531d5850ec4ed

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp39-cp39-manylinux1_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 31.7 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a8588ae01f0a71deafade8f08788efb53fa5840dd3c0ae9c95a4a8cc4f8d074d
MD5 63d7b238bae02bfc093d649f72778299
BLAKE2b-256 bf9db798c77a4b67ee274ec5c5f12b97b22b35c78930d563a064fb343a5745a2

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp39-cp39-manylinux1_i686.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp39-cp39-manylinux1_i686.whl
  • Upload date:
  • Size: 25.2 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 2202cc741b8f4b03dfe83be073bb94d19729255d89a12abf991558dbb74f686b
MD5 6fb558df02b96c27e13defdd88ffb3b6
BLAKE2b-256 c7da3cf40dafffc729d405b5148d6d527a3fb374dc6517416a13ca2de2a909ec

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e1a467012c5db77e220af84a26d4cc482a700bd895641ebc1aeddf049ae1a35a
MD5 13e147a3ae795ba9113b6ace80f24751
BLAKE2b-256 19843208aacc4666dec64982c61d068e8f4d553ac9818fe6a70c68cb09a1c8fd

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 33.0 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 bddab1bb4179fd4ae5d9ad3fcbfd5b04903c96df7717606da3004195d6902c9c
MD5 6801e8326b878e90e052b0f6bc97236e
BLAKE2b-256 2e50d61cfe96c2066be077d82c4d8ca1dc8c7682537876e588fa40bc08008f6c

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 33.0 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 356cf634e3a1a2f3b8c27991ab179bae5cc7188b3872c43fc2e5cd425058cda7
MD5 3d13aa8803f5df433232a8c8bfdfb2ae
BLAKE2b-256 435cc00eccd6b7d7658a0805350ec7584fef68e322bba25a7c4d5bc8c94bd061

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp38-cp38-manylinux1_i686.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 25.4 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 e397ce0d1b06cf63445ecf0cbbd5b4a31b87f15a919d53481868026d1a24bddc
MD5 d9bbe674f83e45c08f8ce844256d24fa
BLAKE2b-256 2bbbe83c358b57c13b42cb1cbd344ec7e3663715639c1144d044b1e0dc9dced8

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6f09ea989748f87479f2bf566a9874ebc9111bfc47374dac517e54196f9efcd9
MD5 7fae01a5bc52259424ada0690448237b
BLAKE2b-256 1f21e85d61e8371888a69cc2bc38aa0c6d851f08e3346c00bc5c3a0a77932fe2

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 31.1 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c5d0ddb900c058764b4852ca455b2afa7f96d67cc3d2a8e5a69b028578533001
MD5 993b57d68b2705552d35c6a0fc3a9be4
BLAKE2b-256 1d9e41d887635c82afe41985ebf2786266bf98846fa3de75f6edf43dcc8dc08d

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 31.1 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8694d487e5a382b23de738c78e2bc27e337513128094208f8f69ad8789ca2a7c
MD5 bfdefc3b4985bdd508643721524efa98
BLAKE2b-256 4ea8aae293606489078c5c2505cb58a939312ebd383fbb9c45364773f328b0d5

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp37-cp37m-manylinux1_i686.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 23.8 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 2f63b7eee63724efafd2c567158e54d6987f4e3d52df3b3699db2408889c09eb
MD5 2c4d8df0ff2fcf7840757ad241e392df
BLAKE2b-256 81529ce2f828ed718017f72a9896aaf80ccb95ca5435972f58fc37231b844400

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 3cf91cfe761d96827ee63ea5b31a08811e50ea275f589ccceff6dd8dfae3f5fb
MD5 a83aa72420e6acbc4f3e3bdb6bf5009e
BLAKE2b-256 cf2fb7c3da0628af69ce934a7351f977f95136bc9b5853422e6fb9628566a892

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 25fa6bf663e152d08f20fdcaedf535613811b2adc1a217fa690141cba08bf611
MD5 783afac6bbde4ee7f72891cfffa0089c
BLAKE2b-256 ef4635f27507676110b88439f9e306f0d4754c745e46802195e19f9d1316f23d

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2f20cac8477d6f6f21be5cce1f60c342ebb50f9e88238bfc24a389a74b46433f
MD5 d25fd1abc77d373c07fa0afdc3983327
BLAKE2b-256 6f256dcc4e4bde6d9b5855b09a58b357559183a58b0e3bfcbfe86a7c5a5c1d82

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp36-cp36m-manylinux1_i686.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 83772b58641d76ca307fffd961fc0705a53cf687b1e0e04f8155aa004a4d0b05
MD5 80368af7214d3227de89c9fb828b044a
BLAKE2b-256 e2649953056878615f3f7e86be576509830e2166ff4c6cb8b034f5861bb29259

See more details on using hashes here.

File details

Details for the file time_machine-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: time_machine-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for time_machine-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 c534ae6db31c8d69975c1b3a3ea194d2873da7addba0ac69fda7e37ef89f6608
MD5 4e6990a624522332f8512591b6d0c9eb
BLAKE2b-256 2f5b153c7f65957d9751c0f5a2393c86d9054c2e8b02b9bd5ac81ea9417db1ea

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page