/usr/lib/python2.7/dist-packages/circuits/core/timers.py is in python-circuits 3.1.0+ds1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | # Module: timers
# Date: 04th August 2004
# Author: James Mills <prologic@shortcircuit.net.au>
"""Timer component to facilitate timed events."""
from circuits.core.handlers import handler
from time import time, mktime
from datetime import datetime
from .components import BaseComponent
class Timer(BaseComponent):
"""Timer Component
A timer is a component that fires an event once after a certain
delay or periodically at a regular interval.
"""
def __init__(self, interval, event, *channels, **kwargs):
"""
:param interval: the delay or interval to wait for until
the event is fired. If interval is specified as
datetime, the interval is recalculated as the
time span from now to the given datetime.
:type interval: ``datetime`` or number of seconds as a ``float``
:param event: the event to fire.
:type event: :class:`~.events.Event`
:param persist: An optional keyword argument which if ``True``
will cause the event to be fired repeatedly
once per configured interval until the timer
is unregistered. **Default:** ``False``
:type persist: ``bool``
"""
super(Timer, self).__init__()
self.expiry = None
self.interval = None
self.event = event
self.channels = channels
self.persist = kwargs.get("persist", False)
self.reset(interval)
@handler("generate_events")
def _on_generate_events(self, event):
if self.expiry is None:
return
now = time()
if now >= self.expiry:
if self.unregister_pending:
return
self.fire(self.event, *self.channels)
if self.persist:
self.reset()
else:
self.unregister()
event.reduce_time_left(0)
else:
event.reduce_time_left(self.expiry - now)
def reset(self, interval=None):
"""
Reset the timer, i.e. clear the amount of time already waited
for.
"""
if interval is not None and isinstance(interval, datetime):
self.interval = mktime(interval.timetuple()) - time()
elif interval is not None:
self.interval = interval
self.expiry = time() + self.interval
@property
def expiry(self):
return getattr(self, "_expiry", None)
@expiry.setter
def expiry(self, seconds):
self._expiry = seconds
|