You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.3 KiB
91 lines
2.3 KiB
"""
|
|
This module contains several handy functions primarily meant for internal use.
|
|
"""
|
|
|
|
from datetime import date, datetime, timedelta
|
|
from time import mktime
|
|
|
|
__all__ = ('asint', 'asbool', 'convert_to_datetime', 'timedelta_seconds',
|
|
'time_difference', 'datetime_ceil')
|
|
|
|
|
|
def asint(text):
|
|
"""
|
|
Safely converts a string to an integer, returning None if the string
|
|
is None.
|
|
|
|
:type text: str
|
|
:rtype: int
|
|
"""
|
|
if text is not None:
|
|
return int(text)
|
|
|
|
|
|
def asbool(obj):
|
|
"""
|
|
Interprets an object as a boolean value.
|
|
|
|
:rtype: bool
|
|
"""
|
|
if isinstance(obj, str):
|
|
obj = obj.strip().lower()
|
|
if obj in ('true', 'yes', 'on', 'y', 't', '1'):
|
|
return True
|
|
if obj in ('false', 'no', 'off', 'n', 'f', '0'):
|
|
return False
|
|
raise ValueError('Unable to interpret value "%s" as boolean' % obj)
|
|
return bool(obj)
|
|
|
|
|
|
def convert_to_datetime(dateval):
|
|
"""
|
|
Converts a date object to a datetime object.
|
|
If an actual datetime object is passed, it is returned unmodified.
|
|
|
|
:type dateval: date
|
|
:rtype: datetime
|
|
"""
|
|
if isinstance(dateval, datetime):
|
|
return dateval
|
|
elif isinstance(dateval, date):
|
|
return datetime.fromordinal(dateval.toordinal())
|
|
raise TypeError('Expected date, got %s instead' % type(dateval))
|
|
|
|
|
|
def timedelta_seconds(delta):
|
|
"""
|
|
Converts the given timedelta to seconds.
|
|
|
|
:type delta: timedelta
|
|
:rtype: float
|
|
"""
|
|
return delta.days * 24 * 60 * 60 + delta.seconds + \
|
|
delta.microseconds / 1000000.0
|
|
|
|
|
|
def time_difference(date1, date2):
|
|
"""
|
|
Returns the time difference in seconds between the given two
|
|
datetime objects. The difference is calculated as: date1 - date2.
|
|
|
|
:param date1: the later datetime
|
|
:type date1: datetime
|
|
:param date2: the earlier datetime
|
|
:type date2: datetime
|
|
:rtype: float
|
|
"""
|
|
later = mktime(date1.timetuple())
|
|
earlier = mktime(date2.timetuple())
|
|
return int(later - earlier)
|
|
|
|
|
|
def datetime_ceil(dateval):
|
|
"""
|
|
Rounds the given datetime object upwards.
|
|
|
|
:type dateval: datetime
|
|
"""
|
|
if dateval.microsecond > 0:
|
|
return dateval + timedelta(seconds=1,
|
|
microseconds=-dateval.microsecond)
|
|
return dateval
|
|
|