diff --git a/jawbone_provider/__init__.py b/jawbone_provider/__init__.py index 6be3997..67cff7b 100755 --- a/jawbone_provider/__init__.py +++ b/jawbone_provider/__init__.py @@ -1,20 +1,27 @@ -#!/usr/bin/env python3.6 -from kython import * +#!/usr/bin/env python3 +from typing import Dict, Any, List +import json +from datetime import datetime, date, time +from pathlib import Path -from backup_config import SLEEPS_FILE, GRAPHS_DIR, PHASES_FILE +BDIR = Path('/L/backups/jawbone') +PHASES_FILE = BDIR / 'phases.json' +SLEEPS_FILE = BDIR / 'sleeps.json' +GRAPHS_DIR = BDIR / 'graphs' -from datetime import datetime, date, time -fromtimestamp = datetime.fromtimestamp -import os.path +fromtimestamp = datetime.fromtimestamp # TODO careful XID = str # TODO how to shared with backup thing? + + Phases = Dict[XID, Any] -phases: Phases -with open(PHASES_FILE, 'r') as fo: - phases = json_load(fo) +phases: Phases = json.loads(PHASES_FILE.read_text()) + +# TODO namedtuple, cproperty? +# TODO cache? class SleepEntry: def __init__(self, js) -> None: self.js = js @@ -51,8 +58,8 @@ class SleepEntry: return fromtimestamp(self._details()['asleep_time']) @property - def graph(self) -> str: - return os.path.join(GRAPHS_DIR, self.xid + ".png") + def graph(self) -> Path: + return GRAPHS_DIR / (self.xid + ".png") @property def phases(self) -> List[datetime]: @@ -65,15 +72,17 @@ class SleepEntry: return str(self) def load_sleeps() -> List[SleepEntry]: - with open(SLEEPS_FILE, 'r') as fo: - sleeps = json_load(fo) - return [SleepEntry(js) for js in sleeps] + sleeps = json.loads(SLEEPS_FILE.read_text()) + return [SleepEntry(js) for js in sleeps] + + import numpy as np # type: ignore import matplotlib.pyplot as plt # type: ignore from matplotlib.figure import Figure # type: ignore from matplotlib.axes import Axes # type: ignore + # pip install imageio -from imageio import imread # type: ignore +# from imageio import imread # type: ignore from scipy.misc import imresize # type: ignore @@ -152,21 +161,22 @@ def plot_one(sleep: SleepEntry, fig: Figure, axes: Axes, xlims=None, showtext=Tr axes.text(xlims[1] - timedelta(hours=1.5), 20, str(sleep),) # plt.text(sleep.asleep(), 0, hhmm(sleep.asleep())) -sleeps = load_sleeps() - -sleeps = [s for s in sleeps if os.path.lexists(s.graph)] -sleeps_by_date = {s.date_: s for s in sleeps} +from kython import make_dict +def sleeps_by_date() -> Dict[date, SleepEntry]: + sleeps = load_sleeps() + sleeps = [s for s in sleeps if s.graph.exists()] # TODO careful.. + return make_dict(sleeps, key=SleepEntry.date_) # sleeps_count = 35 # len(sleeps) # apparently MPL fails at 298 with outofmemory or something # start = 40 # 65 is arount 1 july # sleeps = sleeps[start: start + sleeps_count] # sleeps = sleeps[:sleeps_count] -import melatonin -dt = melatonin.get_data() # dt = {k: v for k, v in dt.items() if v is not None} -sleeps = list(sleeps_by_date.values()) # [sleeps_by_date[d] for d in dt if d in sleeps_by_date] +# TODO ?? +# import melatonin +# dt = melatonin.get_data() def predicate(sleep: SleepEntry): """ @@ -178,38 +188,40 @@ def predicate(sleep: SleepEntry): return True return False -sleeps = lfilter(predicate, sleeps) -sleeps_count = len(sleeps) -print(sleeps_count) + +def plot(): + # TODO ?? + sleeps = lfilter(predicate, sleeps) + sleeps_count = len(sleeps) + print(sleeps_count) + + fig: Figure = plt.figure(figsize=(15, sleeps_count * 1)) + + axarr = fig.subplots(nrows=len(sleeps)) + for i, (sleep, axes) in enumerate(zip(sleeps, axarr)): + plot_one(sleep, fig, axes, showtext=True) + used = dt.get(sleep.date_, None) + sused: str + color: str + # used = True if used is None else False # TODO? + if used is True: + sused = "YES" + color = 'green' + elif used is False: + sused = "NO" + color = 'red' + else: + sused = "??" + color = 'white' + axes.text(axes.get_xlim()[0], 20, sused) + axes.patch.set_alpha(0.5) + axes.set_facecolor(color) -fig: Figure = plt.figure(figsize=(15, sleeps_count * 1)) - -axarr = fig.subplots(nrows=len(sleeps)) -for i, (sleep, axes) in enumerate(zip(sleeps, axarr)): - plot_one(sleep, fig, axes, showtext=True) - used = dt.get(sleep.date_, None) - sused: str - color: str - # used = True if used is None else False # TODO? - if used is True: - sused = "YES" - color = 'green' - elif used is False: - sused = "NO" - color = 'red' - else: - sused = "??" - color = 'white' - axes.text(axes.get_xlim()[0], 20, sused) - axes.patch.set_alpha(0.5) - axes.set_facecolor(color) - - -plt.tight_layout() -plt.subplots_adjust(hspace=0.0) -# er... this saves with a different aspect ratio for some reason. -# tap 'ctrl-s' on mpl plot window to save.. -# plt.savefig('res.png', asp) -plt.show() + plt.tight_layout() + plt.subplots_adjust(hspace=0.0) + # er... this saves with a different aspect ratio for some reason. + # tap 'ctrl-s' on mpl plot window to save.. + # plt.savefig('res.png', asp) + plt.show()