raise argparse.ArgumentTypeError(msg)
+def valid_duration(txt: str) -> datetime.timedelta:
+ """If the string is a valid time duration, return a
+ datetime.timedelta representing the period of time. Otherwise
+ maybe raise an ArgumentTypeError or potentially just treat the
+ time window as zero in length.
+
+ >>> valid_duration('3m')
+ datetime.timedelta(seconds=180)
+
+ >>> valid_duration('your mom')
+ datetime.timedelta(seconds=0)
+
+ """
+ from datetime_utils import parse_duration
+ try:
+ secs = parse_duration(txt)
+ except Exception as e:
+ raise argparse.ArgumentTypeError(e)
+ finally:
+ return datetime.timedelta(seconds=secs)
+
+
if __name__ == '__main__':
import doctest
doctest.ELLIPSIS_MARKER = '-ANYTHING-'
return descr
+def describe_timedelta(delta: datetime.timedelta) -> str:
+ """
+ Describe a duration represented by a timedelta object.
+
+ >>> d = datetime.timedelta(1, 600)
+ >>> describe_timedelta(d)
+ '1 day, and 10 minutes'
+
+ """
+ return describe_duration(delta.total_seconds())
+
+
def describe_duration_briefly(seconds: int, *, include_seconds=False) -> str:
"""
Describe a duration briefly.
return descr.strip()
+def describe_timedelta_briefly(delta: datetime.timedelta) -> str:
+ """
+ Describe a duration represented by a timedelta object.
+
+ >>> d = datetime.timedelta(1, 600)
+ >>> describe_timedelta_briefly(d)
+ '1d 10m'
+
+ """
+ return describe_duration_briefly(delta.total_seconds())
+
+
if __name__ == '__main__':
import doctest
doctest.testmod()
def reuse_if_mtime_is_today() -> Callable[[datetime.datetime], bool]:
"""
A helper that returns a lambda appropriate for use in the
- persistent_autoload_singleton decorator's may_reuse_persisted
+ persistent_autoloaded_singleton decorator's may_reuse_persisted
parameter that allows persisted state to be reused as long as it
was persisted on the same day as the load.
) -> Callable[[datetime.datetime], bool]:
"""
A helper that returns a lambda appropriate for use in the
- persistent_autoload_singleton decorator's may_reuse_persisted
+ persistent_autoloaded_singleton decorator's may_reuse_persisted
parameter that allows persisted state to be reused as long as it
was persisted within the past limit_seconds.
return lambda dt: (now - dt).total_seconds() <= limit_seconds
+def dont_reuse_persisted_state_force_refresh(
+) -> Callable[[datetime.datetime], bool]:
+ return lambda dt: False
+
+
class PersistAtShutdown(enum.Enum):
"""
An enum to describe the conditions under which state is persisted
ALWAYS = 2,
-class persistent_autoload_singleton(Persistent):
+class persistent_autoloaded_singleton(Persistent):
"""This class is meant to be used as a decorator around a class that:
1. Is a singleton; one global instance per python program.
Here's and example usage pattern:
- @persistent_autoload_singleton(
+ @persistent_autoloaded_singleton(
filename = "my_cache_file.bin",
may_reuse_persisted = reuse_if_mtime_less_than_limit_sec(60),
persist_at_shutdown = PersistAtShutdown.IF_NOT_INITIALIZED_FROM_DISK,