diff --git a/my/taplog.py b/my/taplog.py new file mode 100644 index 0000000..0b11508 --- /dev/null +++ b/my/taplog.py @@ -0,0 +1,65 @@ +''' +[[https://play.google.com/store/apps/details?id=com.waterbear.taglog][Taplog]] app data +''' + +from datetime import datetime +from typing import NamedTuple, Dict, Optional, Iterable + +from .core import get_files +from .core.common import fromisoformat + +from my.config import taplog as user_config + + +class Entry(NamedTuple): + row: Dict + + @property + def id(self) -> str: + return str(self.row['_id']) + + @property + def number(self) -> Optional[float]: + ns = self.row['number'] + # TODO ?? + if isinstance(ns, str): + ns = ns.strip() + return None if len(ns) == 0 else float(ns) + else: + return ns + + @property + def note(self) -> str: + return self.row['note'] + + @property + def button(self) -> str: + return self.row['cat1'] + + @property + def timestamp(self) -> datetime: + ts = self.row['timestamp'] + # already with timezone apparently + return fromisoformat(ts) + # TODO also has gps info! + + +def entries() -> Iterable[Entry]: + last = max(get_files(user_config.export_path)) + from .core.dataset import connect_readonly + db = connect_readonly(last) + # todo is it sorted by timestamp? + for row in db['Log'].all(): + yield Entry(row) + + +# I guess worth having as top level considering it would be quite common? +def by_button(button: str) -> Iterable[Entry]: + for e in entries(): + if e.button == button: + yield e + + +from .core import stat, Stats +def stats() -> Stats: + return stat(entries)