Skip to main content

Travel through time in your tests.

Project description

https://github.com/adamchainz/time-machine/workflows/CI/badge.svg?branch=master https://coveralls.io/repos/adamchainz/time-machine/badge.svg https://img.shields.io/pypi/v/time-machine.svg https://img.shields.io/badge/code%20style-black-000000.svg

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.8 supported (CPython only).

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:

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_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_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.2.0.tar.gz (44.5 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.2.0-cp39-cp39-manylinux2010_x86_64.whl (31.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

time_machine-1.2.0-cp39-cp39-manylinux1_x86_64.whl (31.3 kB view details)

Uploaded CPython 3.9

time_machine-1.2.0-cp39-cp39-manylinux1_i686.whl (24.9 kB view details)

Uploaded CPython 3.9

time_machine-1.2.0-cp39-cp39-macosx_10_14_x86_64.whl (12.3 kB view details)

Uploaded CPython 3.9macOS 10.14+ x86-64

time_machine-1.2.0-cp38-cp38-manylinux2010_x86_64.whl (32.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

time_machine-1.2.0-cp38-cp38-manylinux1_x86_64.whl (32.6 kB view details)

Uploaded CPython 3.8

time_machine-1.2.0-cp38-cp38-manylinux1_i686.whl (25.0 kB view details)

Uploaded CPython 3.8

time_machine-1.2.0-cp38-cp38-macosx_10_14_x86_64.whl (12.2 kB view details)

Uploaded CPython 3.8macOS 10.14+ x86-64

time_machine-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl (30.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

time_machine-1.2.0-cp37-cp37m-manylinux1_x86_64.whl (30.7 kB view details)

Uploaded CPython 3.7m

time_machine-1.2.0-cp37-cp37m-manylinux1_i686.whl (23.4 kB view details)

Uploaded CPython 3.7m

time_machine-1.2.0-cp37-cp37m-macosx_10_14_x86_64.whl (12.1 kB view details)

Uploaded CPython 3.7mmacOS 10.14+ x86-64

time_machine-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl (28.5 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

time_machine-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (28.5 kB view details)

Uploaded CPython 3.6m

time_machine-1.2.0-cp36-cp36m-manylinux1_i686.whl (22.2 kB view details)

Uploaded CPython 3.6m

time_machine-1.2.0-cp36-cp36m-macosx_10_14_x86_64.whl (11.9 kB view details)

Uploaded CPython 3.6mmacOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: time-machine-1.2.0.tar.gz
  • Upload date:
  • Size: 44.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time-machine-1.2.0.tar.gz
Algorithm Hash digest
SHA256 4cf55114414ad3537c78239718453cf523c794b4b655f2c70353518bf373b94f
MD5 d6644167a447ebdbe67ae04749ae9304
BLAKE2b-256 d6acc6cb2796a614615c584103d19fa7677b8e15be716972071b51e03961032d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 31.3 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e33cead110ae75c6e1d680fbbba6d506fa48f8635c585be085d162981e5b17ea
MD5 989b25141a620c90f24c95c5a5c89ea5
BLAKE2b-256 d700b75db20acbe42b3594e1a5c2b6663ef320967db534efee0af6e46349923e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 31.3 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 20a2147d80ca81631780a7a157951a422e189083974c5a364407ac4b254cde11
MD5 d2b2a5328137521bbf092549a39875d0
BLAKE2b-256 3ba04b1456047d33742d0b87fe3cdad63cfa5a884e31ec9ea58473bbed4e7fb6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp39-cp39-manylinux1_i686.whl
  • Upload date:
  • Size: 24.9 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 ac4217946a13f5c9bc5102193498f75b7d50067ee64c5e3cf3d99fb92d146cb3
MD5 6876a732f349c0c8c3e066fb376dc9f6
BLAKE2b-256 93c0f8c787e45bdc20c6159a8681b133c56f651de25110cc824f04c0fe1b16d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.3 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6f70528cd47f54c10ad52e7296d661bf0ec766e49fa9497f2005dc774504e03d
MD5 37b6013ff100edd95ce48ffad2063035
BLAKE2b-256 029c0b60f435e98f4def5b97db224f24ec7d0238c73a4e57a6f23eb8aa92eda1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 32.6 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 bec8efa0c039f384735c8823dbea8f09ddc69e7b27bbb93b456bafa9f1bb0014
MD5 dc945ad650daebd074ae9f776c6e67f6
BLAKE2b-256 f86baf391688bd95644ea1a12f798ca8df019f87478561e4dc253e1cb379f658

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 32.6 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 391382fbeb6e79fa1cb77c35df95bf343976543c2fb1172e6338a807b46230a9
MD5 0ebfecf58908613a7dea1451e1ba2b4f
BLAKE2b-256 4d557acfd4876a2bea1ac70b00c2a67cfaac7abb4187ffe7a5df3c154e3bd472

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 5fdf5af4afb83cbcdcd94c13d8b2292628ae77a22991d341d46bf2465f37e88f
MD5 fe1f35cf14583ed2b5fd71fab1339269
BLAKE2b-256 07836b847614f38c5bdf2f017317b9425dfdad21df8e16b16d0118eccf895f71

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.2 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6ebbaf985edd872f908c6a50451f6f6fb4799dbc439beb58e204d6a1359b9ebe
MD5 e7c4abc3c1e560aff56956f4b4ed15b4
BLAKE2b-256 82cce97408587f64d8d1ca141ec2386058bf30e9f1a79e0ac7d5a50539912925

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 30.7 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 63a6ce0628f19107c72f17042bb5f29a78008661bbcb80895ff1d7f93dc0ba61
MD5 b2842ccf729470034d352ffbc91177bd
BLAKE2b-256 9763c5c1a5336c59faed2313b0e0bfeacd17771487ac1148a9cd3601daca68d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 30.7 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 07b227365a693a3d0f99772b49ee2dd44ee10cbd83211f28bb1a3cba64393962
MD5 5aa4b501127451c3f2ba73d1f337753d
BLAKE2b-256 327d2946c53cede88b4ff239d044215d3a42b8b111f24b0eb7ad7c8fa41b8716

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 23.4 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 99a5d0a7fc525069488db979bb02fdf5b878ff1fc3e413736ec07fdec982c31a
MD5 b1994035e0fef46af50658bb4ceaf7a4
BLAKE2b-256 975875f00dcbb28bc4900663444edf2c7c2e76bc6b4ebd267bd99dcdbcd4718d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 12.1 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 8df0157bf0b56c911f9f8aaf2c067a82dd614a6d2e9b2d022cd70e3707144200
MD5 d48ad442abdd1d9f65288aa0ec6c0e69
BLAKE2b-256 8c2f971dcd403f7cfa3482cd097d2ffcf1abf51f6bc7843c4ac2552be778a2c3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 28.5 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 76a48e8ed02bedcd597aaa8b0a3b0d93756b0e0a4195b3cc18a98d44aca6897a
MD5 cd288f0b98941d397f6a0fe2281d632d
BLAKE2b-256 a5396b343417743fb73ad9764532e2c6e71f135056f42a31331418ad3cd51b92

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e325f1f2093dd798a44c45533bae2e5d479afad6d48309b9dd19a325ab4c0a54
MD5 6d0d7609ebd32d3ceb0ef8dafef16bad
BLAKE2b-256 efe5bccbcdcb519a937811835506e006e83b2621c12a4dd836f724a3326f7f35

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 22.2 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 9b067ea6e63dfe5b8cb9911f7cf240a31dccb6a5a1e64bc90ffd586d186c781b
MD5 5c095d44a0d8f268075c1fc675d61559
BLAKE2b-256 a4eafa94999dda69cc103e1cb40f3f09507ea285806dbf8859d055bdcc057eaa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: time_machine-1.2.0-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 11.9 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.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for time_machine-1.2.0-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ef2847a8d68d514733a39de5a5540a84b37621b8d298d9b371acec1f2a54a6fc
MD5 e3099f394858cb13848decebc1ed6f16
BLAKE2b-256 25f6aa6936348f8aeb47a4f30333d11ecda99c577c46bc30739863edf12adc79

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