Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: spulec/freezegun
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 1.5.0
Choose a base ref
...
head repository: spulec/freezegun
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 1.5.1
Choose a head ref
  • 9 commits
  • 5 files changed
  • 4 contributors

Commits on Apr 25, 2024

  1. Fix tick delta type handling

    ## `FrozenDateTimeFactory.tick`
    The `delta` argument is capable of handling `float`s. In previous versions of
    freezgun, the `.pyi` type annotations were correctly reflecting that. For some
    reason, when moving the type annotations into the `.py` file, this information
    got lost.
    
    Further, checking for `isinstance(delta, numbers.Real)` is probably not what
    was intended as `fraction.Fraction` is a subclass of `Real`, but will cause an
    error when passed into `datetime.timedelta(seconds=delta)`.
    
    ## `StepTickTimeFactory.tick`
    The same issue with the type hint applies here.
    
    Fruther, passing an integer/float `delta` would lead to that number being added
    to the frozen `datetime.datetime`, which is not a valid operation
    (`TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'int'`).
    robsdedude authored Apr 25, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    c963608 View commit details

Commits on May 6, 2024

  1. Fix instance checks

    robsdedude committed May 6, 2024
    Copy the full SHA
    d2872d0 View commit details
  2. Copy the full SHA
    be779f4 View commit details
  3. Copy the full SHA
    023c7a3 View commit details
  4. Copy the full SHA
    aecc78a View commit details
  5. Extend type checking

    robsdedude committed May 6, 2024
    Copy the full SHA
    df263dc View commit details

Commits on May 8, 2024

  1. Merge pull request #546 from robsdedude/patch-1

    Fix `tick` delta type handling
    bblommers authored May 8, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    ea054a3 View commit details

Commits on May 11, 2024

  1. CHANGELOG for 1.5.1

    bblommers authored May 11, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    e0f2c3c View commit details
  2. Increase version number

    bblommers committed May 11, 2024
    Copy the full SHA
    3f9fac4 View commit details
Showing with 70 additions and 11 deletions.
  1. +4 −0 CHANGELOG
  2. +1 −1 freezegun/__init__.py
  3. +15 −9 freezegun/api.py
  4. +12 −0 tests/test_datetimes.py
  5. +38 −1 tests/test_operations.py
4 changes: 4 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
Freezegun Changelog
===================

1.5.1
-----
* Fix the typing of the `tick()` method, and improve it's behaviour.

1.5.0
----
* The default ignore list now contains the `queue`-package
2 changes: 1 addition & 1 deletion freezegun/__init__.py
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
from .config import configure

__title__ = 'freezegun'
__version__ = '1.5.0'
__version__ = '1.5.1'
__author__ = 'Steve Pulec'
__license__ = 'Apache License 2.0'
__copyright__ = 'Copyright 2012 Steve Pulec'
24 changes: 15 additions & 9 deletions freezegun/api.py
Original file line number Diff line number Diff line change
@@ -509,10 +509,11 @@ def __init__(self, time_to_freeze: datetime.datetime, start: datetime.datetime):
def __call__(self) -> datetime.datetime:
return self.time_to_freeze + (real_datetime.now() - self.start)

def tick(self, delta: Union[datetime.timedelta, int]=datetime.timedelta(seconds=1)) -> datetime.datetime:
if isinstance(delta, numbers.Real):
# noinspection PyTypeChecker
self.move_to(self.time_to_freeze + datetime.timedelta(seconds=delta))
def tick(self, delta: Union[datetime.timedelta, float]=datetime.timedelta(seconds=1)) -> datetime.datetime:
if isinstance(delta, numbers.Integral):
self.move_to(self.time_to_freeze + datetime.timedelta(seconds=int(delta)))
elif isinstance(delta, numbers.Real):
self.move_to(self.time_to_freeze + datetime.timedelta(seconds=float(delta)))
else:
self.move_to(self.time_to_freeze + delta) # type: ignore
return self.time_to_freeze
@@ -531,10 +532,11 @@ def __init__(self, time_to_freeze: datetime.datetime):
def __call__(self) -> datetime.datetime:
return self.time_to_freeze

def tick(self, delta: Union[datetime.timedelta, int]=datetime.timedelta(seconds=1)) -> datetime.datetime:
if isinstance(delta, numbers.Real):
# noinspection PyTypeChecker
self.time_to_freeze += datetime.timedelta(seconds=delta)
def tick(self, delta: Union[datetime.timedelta, float]=datetime.timedelta(seconds=1)) -> datetime.datetime:
if isinstance(delta, numbers.Integral):
self.move_to(self.time_to_freeze + datetime.timedelta(seconds=int(delta)))
elif isinstance(delta, numbers.Real):
self.move_to(self.time_to_freeze + datetime.timedelta(seconds=float(delta)))
else:
self.time_to_freeze += delta # type: ignore
return self.time_to_freeze
@@ -557,9 +559,13 @@ def __call__(self) -> datetime.datetime:
self.tick()
return return_time

def tick(self, delta: Union[datetime.timedelta, int, None]=None) -> datetime.datetime:
def tick(self, delta: Union[datetime.timedelta, float, None]=None) -> datetime.datetime:
if not delta:
delta = datetime.timedelta(seconds=self.step_width)
elif isinstance(delta, numbers.Integral):
delta = datetime.timedelta(seconds=int(delta))
elif isinstance(delta, numbers.Real):
delta = datetime.timedelta(seconds=float(delta))
self.time_to_freeze += delta # type: ignore
return self.time_to_freeze

12 changes: 12 additions & 0 deletions tests/test_datetimes.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import time
import calendar
import datetime
import fractions
import unittest
import locale
import sys
@@ -180,6 +181,17 @@ def test_manual_increment() -> None:
assert frozen_datetime.tick(delta=datetime.timedelta(seconds=10)) == expected
assert frozen_datetime() == expected

expected = initial_datetime + datetime.timedelta(seconds=22.5)
ticked_time = frozen_datetime.tick(
delta=fractions.Fraction(3, 2) # type: ignore
# type hints follow the recommendation of
# https://peps.python.org/pep-0484/#the-numeric-tower
# which means for instance `Fraction`s work at runtime, but not
# during static type analysis
)
assert ticked_time == expected
assert frozen_datetime() == expected


def test_move_to() -> None:
initial_datetime = datetime.datetime(year=1, month=7, day=12,
39 changes: 38 additions & 1 deletion tests/test_operations.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import datetime
import fractions
import pytest
from freezegun import freeze_time
from dateutil.relativedelta import relativedelta
from datetime import timedelta, tzinfo
from tests import utils
from typing import Any
from typing import Any, Union


@freeze_time("2012-01-14")
@@ -102,3 +104,38 @@ def test_auto_tick() -> None:
auto_incremented_time = datetime.datetime.now()
assert first_time + datetime.timedelta(seconds=15) == auto_incremented_time


@pytest.mark.parametrize(
"tick,expected_diff",
(
(datetime.timedelta(milliseconds=1500), 1.5),
(1, 1),
(1.5, 1.5),
(fractions.Fraction(3, 2), 1.5),
)
)
def test_auto_and_manual_tick(
tick: Union[
datetime.timedelta,
int,
float,
# fractions.Fraction,
# Fraction works at runtime, but not at type-checking time
# cf. https://peps.python.org/pep-0484/#the-numeric-tower
],
expected_diff: float
) -> None:
first_time = datetime.datetime(2020, 1, 14, 0, 0, 0, 1)

with freeze_time(first_time, auto_tick_seconds=2) as frozen_time:
frozen_time.tick(tick)
incremented_time = datetime.datetime.now()
expected_time = first_time + datetime.timedelta(seconds=expected_diff)
assert incremented_time == expected_time

expected_time += datetime.timedelta(seconds=2) # auto_tick_seconds

frozen_time.tick(tick)
incremented_time = datetime.datetime.now()
expected_time += datetime.timedelta(seconds=expected_diff)
assert incremented_time == expected_time