Source code for fauxfactory.factories.dates

"""Methods related to generating date/time related values."""

import datetime
import random

from fauxfactory.constants import MAX_YEARS, MIN_YEARS


[docs] def gen_date( min_date: datetime.date | None = None, max_date: datetime.date | None = None ) -> datetime.date: """Return a random date value. :param min_date: A valid ``datetime.date`` object. :param max_date: A valid ``datetime.date`` object. :raises: ``ValueError`` if arguments are not valid ``datetime.date`` objects. :returns: Random ``datetime.date`` object. """ _min_value = datetime.date.today() - datetime.timedelta(365 * MIN_YEARS) _max_value = datetime.date.today() + datetime.timedelta(365 * MAX_YEARS) if min_date is None: min_date = _min_value if max_date is None: max_date = _max_value # Validation if not isinstance(min_date, datetime.date): raise ValueError(f"{min_date} is not a valid datetime.date object") if not isinstance(max_date, datetime.date): raise ValueError(f"{max_date} is not a valid datetime.date object") # Check that max_date is not before min_date if min_date >= max_date: raise ValueError( f"min_date ({min_date}) must be less than max_date ({max_date})" ) # Pick a day between min and max dates diff = max_date - min_date days = random.randint(0, diff.days) date = min_date + datetime.timedelta(days=days) return date
[docs] def gen_datetime( min_date: datetime.datetime | None = None, max_date: datetime.datetime | None = None ) -> datetime.datetime: """Return a random datetime value. :param min_date: A valid ``datetime.datetime`` object. :param max_date: A valid ``datetime.datetime`` object. :raises: ``ValueError`` if arguments are not valid ``datetime.datetime`` objects. :returns: Random ``datetime.datetime`` object. """ _min_value = datetime.datetime.now() - datetime.timedelta(365 * MIN_YEARS) _max_value = datetime.datetime.now() + datetime.timedelta(365 * MAX_YEARS) if min_date is None: min_date = _min_value if max_date is None: max_date = _max_value # Validation if not isinstance(min_date, datetime.datetime): raise ValueError(f"{min_date} is not a valid datetime.datetime object") if not isinstance(max_date, datetime.datetime): raise ValueError(f"{max_date} is not a valid datetime.datetime object") # Check that max_date is not before min_date if min_date >= max_date: raise ValueError( f"min_date ({min_date}) must be less than max_date ({max_date})" ) # Pick a time between min and max dates diff = max_date - min_date seconds = random.randint(0, diff.days * 3600 * 24 + diff.seconds) return min_date + datetime.timedelta(seconds=seconds)
[docs] def gen_time() -> datetime.time: """Generate a random time. :returns: A random ``datetime.time`` object. """ return datetime.time( random.randint(0, 23), random.randint(0, 59), random.randint(0, 59), random.randint(0, 999999), )
__all__ = tuple(name for name in locals() if name.startswith("gen_")) def __dir__(): return __all__