A fast alternative to freezegun that wraps libfaketime.
Project description
python-libfaketime is a wrapper of libfaketime for python. It serves as a fast drop-in replacement for freezegun.
Installation
Install with pip:
$ pip install libfaketime
Requirements
Some brief details:
Works with Linux and OS X, Pythons 2 and 3.
Microsecond resolution.
Accepts datetimes and strings that can be parsed by dateutil.
Not threadsafe.
Breaks profiling. To workaround this, use libfaketime.{begin, end}_callback to disable/enable your profiler.
Usage
import datetime
from libfaketime import fake_time, reexec_if_needed
# libfaketime needs to be preloaded by the dynamic linker.
# This will exec the same command, but with the proper environment variables set.
# You can also skip this and manually manage your env (see "How to avoid re-exec").
reexec_if_needed()
def get_tomorrow():
return datetime.date.today() + datetime.timedelta(days=1)
@fake_time('2014-01-01 00:00:00')
def test_get_tomorrow():
assert get_tomorrow() == datetime.date(2014, 1, 2)
By default, reexec_if_needed removes the LD_PRELOAD variable after the re-execution, to keep your environment as clean as possible. You might want it to stick around, for example when using parallelized tests that use subprocess like pytest-xdist. To keep them around, pass remove_vars=False like:
reexec_if_needed(remove_vars=False)
Benchmark against freezegun
Here’s the output of a totally unscientific benchmark on my laptop:
$ python benchmark.py
re-exec with libfaketime dependencies
timing 1000 executions of <class 'libfaketime.fake_time'>
0.021755 seconds
$ python benchmark.py freezegun
timing 1000 executions of <function freeze_time at 0x10aaa1140>
6.561472 seconds
Use with py.test
It’s easiest to reexec from inside the pytest_configure hook:
# conftest.py
from libfaketime import reexec_if_needed
def pytest_configure():
reexec_if_needed()
How to avoid re-exec
Sometimes, re-exec does unexpected things. You can avoid those problems by preloading libfaketime yourself. The environment variables you need can be found by running python-libfaketime on the command line:
$ python-libfaketime
export LD_PRELOAD="/home/foo/<snip>/vendor/libfaketime/src/libfaketime.so.1"
export FAKETIME_DID_REEXEC=true
You can use them as such:
$ eval $(python-libfaketime)
$ nosetests # ...or any other code that imports libfaketime
Known Issues
It was found that calling uuid.uuid1() multiple times while in a fake_time context could result in a deadlock. This situation only occured for users with a system level uuid1 library. In order to combat this issue, python-libfaketime temporarily disables the system level library by patching _uuid_generate_time to None while in the fake_time context.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for libfaketime-tz-wrapper-0.1.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8a98221e7d5e47ac93b931f241cbd48ced244209c4040dbf2ecd66ebbd80b4af |
|
MD5 | 61840e1f7e51abee1a5e1d2526b5908c |
|
BLAKE2b-256 | 6387bf6677cc5f93239c2cbf5386c971ed8ce0556159680339ef9b21c7e2e501 |