Source code for i3pystatus.timewarrior

from i3pystatus import IntervalModule
from json import loads
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
from datetime import datetime, timezone
import subprocess


[docs]class Timewarrior(IntervalModule): """ Show current Timewarrior tracking Requires `json` `dateutil` Formaters: * `{tags}` — contains tags of current track * `{start}` - contains start of track * `{duration}` — contains time of current track """ format = '{duration}' duration_format = '{years}y{months}m{days}d{hours}h{minutes}m{seconds}s' enable_stop = True enable_continue = True color_running = '#00FF00' color_stopped = '#F00000' on_rightclick = 'stop_or_continue' track = None settings = ( ('format', 'format string'), ('duration_format', 'duration format string'), ('enable_stop', 'Allow right click to stop tracking'), ('enable_continue', 'ALlow right click to continue tracking'), ('color_running', '#00FF00'), ('color_stopped', '#F00000'), ) def loadTrack(self): try: tracks_json = subprocess.check_output(['timew', 'export']) tracks = loads(tracks_json.decode("utf-8")) self.track = tracks[-1] except ValueError as error: self.logger.exception('Decoding JSON has failed') raise error def stop_or_continue(self): self.loadTrack() if 'end' in self.track and self.enable_continue: subprocess.check_output(['timew', 'continue']) elif self.enable_stop: subprocess.check_output(['timew', 'stop']) def run(self): self.loadTrack() start = parse(self.track['start']) end = parse(self.track['end']) if 'end' in self.track else datetime.now(timezone.utc) duration = relativedelta(end, start) format_values = dict( tags=", ".join(self.track['tags'] if 'tags' in self.track else []), start=start, duration=self.duration_format.format( years=duration.years, months=duration.months, days=duration.days, hours=duration.hours, minutes=duration.minutes, seconds=duration.seconds, ) ) self.output = { 'full_text': self.format.format(**format_values), 'color': self.color_stopped if 'end' in self.track else self.color_running }