Skip to content

Commit

Permalink
Merge 1e2c2c7 into 1a6c814
Browse files Browse the repository at this point in the history
  • Loading branch information
sheepsy90 committed Jun 8, 2018
2 parents 1a6c814 + 1e2c2c7 commit 35edc23
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 6 deletions.
16 changes: 16 additions & 0 deletions README.rst
Expand Up @@ -132,6 +132,22 @@ parameters which will keep time stopped.
def test_nice_datetime():
assert datetime.datetime.now() > datetime.datetime(2020, 1, 14)
``auto_tick_seconds`` argument
~~~~~~~~~~~~~~~~~

FreezeGun has an additional ``auto_tick_seconds`` argument which will autoincrement the
value every time by the given amount from the start value. This is alternative to the default
parameters which will keep time stopped. Note that given ``auto_tick_seconds`` the ``tick`` parameter will be ignored.

.. code-block:: python
@freeze_time("Jan 14th, 2020", auto_tick_seconds=15)
def test_nice_datetime():
first_time = datetime.datetime.now()
auto_incremented_time = datetime.datetime.now()
assert first_time + datetime.timedelta(seconds=15) == auto_incremented_time
Manual ticks
~~~~~~~~~~~~

Expand Down
44 changes: 38 additions & 6 deletions freezegun/api.py
Expand Up @@ -416,14 +416,41 @@ def move_to(self, target_datetime):
self.tick(delta=delta)


class StepTickTimeFactory(object):

def __init__(self, time_to_freeze, step_width):
self.time_to_freeze = time_to_freeze
self.step_width = step_width

def __call__(self):
return_time = self.time_to_freeze
self.tick()
return return_time

def tick(self, delta=None):
if not delta:
delta = datetime.timedelta(seconds=self.step_width)
self.time_to_freeze += delta

def update_step_width(self, step_width):
self.step_width = step_width

def move_to(self, target_datetime):
"""Moves frozen date to the given ``target_datetime``"""
target_datetime = _parse_time_to_freeze(target_datetime)
delta = target_datetime - self.time_to_freeze
self.tick(delta=delta)


class _freeze_time(object):

def __init__(self, time_to_freeze_str, tz_offset, ignore, tick, as_arg):

def __init__(self, time_to_freeze_str, tz_offset, ignore, tick, as_arg, auto_tick_seconds):
self.time_to_freeze = _parse_time_to_freeze(time_to_freeze_str)
self.tz_offset = _parse_tz_offset(tz_offset)
self.ignore = tuple(ignore)
self.tick = tick
self.auto_tick_seconds = auto_tick_seconds
self.undo_changes = []
self.modules_at_start = set()
self.as_arg = as_arg
Expand Down Expand Up @@ -489,7 +516,10 @@ def __exit__(self, *args):
self.stop()

def start(self):
if self.tick:

if self.auto_tick_seconds:
time_to_freeze = StepTickTimeFactory(self.time_to_freeze, self.auto_tick_seconds)
elif self.tick:
time_to_freeze = TickingDateTimeFactory(self.time_to_freeze, real_datetime.now())
else:
time_to_freeze = FrozenDateTimeFactory(self.time_to_freeze)
Expand Down Expand Up @@ -634,7 +664,8 @@ def wrapper(*args, **kwargs):
return wrapper


def freeze_time(time_to_freeze=None, tz_offset=0, ignore=None, tick=False, as_arg=False):

def freeze_time(time_to_freeze=None, tz_offset=0, ignore=None, tick=False, as_arg=False, auto_tick_seconds=0):
# Python3 doesn't have basestring, but it does have str.
try:
string_type = basestring
Expand All @@ -655,10 +686,10 @@ def freeze_time(time_to_freeze=None, tz_offset=0, ignore=None, tick=False, as_ar
raise SystemError('Calling freeze_time with tick=True is only compatible with CPython')

if isinstance(time_to_freeze, types.FunctionType):
return freeze_time(time_to_freeze(), tz_offset, ignore, tick)
return freeze_time(time_to_freeze(), tz_offset, ignore, tick, auto_tick_seconds)

if isinstance(time_to_freeze, types.GeneratorType):
return freeze_time(next(time_to_freeze), tz_offset, ignore, tick)
return freeze_time(next(time_to_freeze), tz_offset, ignore, tick, auto_tick_seconds)

if MayaDT is not None and isinstance(time_to_freeze, MayaDT):
return freeze_time(time_to_freeze.datetime(), tz_offset, ignore,
Expand All @@ -672,7 +703,8 @@ def freeze_time(time_to_freeze=None, tz_offset=0, ignore=None, tick=False, as_ar
ignore.append('google.gax')
ignore.append('threading')
ignore.append('Queue')
return _freeze_time(time_to_freeze, tz_offset, ignore, tick, as_arg)

return _freeze_time(time_to_freeze, tz_offset, ignore, tick, as_arg, auto_tick_seconds)


# Setup adapters for sqlite
Expand Down
8 changes: 8 additions & 0 deletions tests/test_operations.py
Expand Up @@ -93,3 +93,11 @@ def test_replace():
today = datetime.date.today()
modified_date = today.replace(year=2013)
assert utils.is_fake_date(modified_date)


@freeze_time("Jan 14th, 2020", auto_tick_seconds=15)
def test_auto_tick():
first_time = datetime.datetime.now()
auto_incremented_time = datetime.datetime.now()
assert first_time + datetime.timedelta(seconds=15) == auto_incremented_time

0 comments on commit 35edc23

Please sign in to comment.