get rid of porg dependency, use orgparse directly

This commit is contained in:
Dima Gerasimov 2020-11-06 04:04:05 +00:00 committed by karlicoss
parent 62e1bdc39a
commit a6e5908e6d
8 changed files with 101 additions and 54 deletions

View file

@ -7,11 +7,11 @@ from typing import Iterable, NamedTuple, Optional
from ..core.common import listify
from ..core.error import Res, echain
from ..core.orgmode import parse_org_datetime
from ..core.orgmode import parse_org_datetime, one_table
import pandas as pd # type: ignore
import porg
import orgparse
from my.config import blood as config
@ -47,14 +47,13 @@ def try_float(s: str) -> Optional[float]:
return None
return float(x)
def glucose_ketones_data() -> Iterable[Result]:
o = porg.Org.from_file(str(config.blood_log))
tbl = o.xpath('//table')
o = orgparse.load(config.blood_log)
tbl = one_table(o)
# todo some sort of sql-like interface for org tables might be ideal?
for l in tbl.lines:
kets = l['ket'].strip()
glus = l['glu'].strip()
for l in tbl.as_dicts:
kets = l['ket']
glus = l['glu']
extra = l['notes']
dt = parse_org_datetime(l['datetime'])
try:
@ -75,9 +74,9 @@ def glucose_ketones_data() -> Iterable[Result]:
def blood_tests_data() -> Iterable[Result]:
o = porg.Org.from_file(str(config.blood_tests_log))
tbl = o.xpath('//table')
for d in tbl.lines:
o = orgparse.load(config.blood_tests_log)
tbl = one_table(o)
for d in tbl.as_dicts:
try:
dt = parse_org_datetime(d['datetime'])
assert isinstance(dt, datetime), dt

View file

@ -9,6 +9,7 @@ from datetime import datetime, timedelta
from typing import Optional
from ...core.pandas import DataFrameT, check_dataframe as cdf
from ...core.orgmode import collect, Table, parse_org_datetime, TypedTable
from my.config import exercise as config
@ -26,11 +27,15 @@ def tzify(d: datetime) -> datetime:
def cross_trainer_data():
# FIXME some manual entries in python
# I guess just convert them to org
import orgparse
# todo should use all org notes and just query from them?
wlog = orgparse.load(config.workout_log)
from porg import Org
# FIXME should use all org notes and just query from them?
wlog = Org.from_file(config.workout_log)
cross_table = wlog.xpath('//org[heading="Cross training"]//table')
[table] = collect(
wlog,
lambda n: [] if n.heading != 'Cross training' else [x for x in n.body_rich if isinstance(x, Table)]
)
cross_table = TypedTable(table)
def maybe(f):
def parse(s):
@ -46,13 +51,12 @@ def cross_trainer_data():
# todo eh. not sure if there is a way of getting around writing code...
# I guess would be nice to have a means of specifying type in the column? maybe multirow column names??
# need to look up org-mode standard..
from ...core.orgmode import parse_org_datetime
mappers = {
'duration': lambda s: parse_mm_ss(s),
'date' : lambda s: tzify(parse_org_datetime(s)),
'comment' : str,
}
for row in cross_table.lines:
for row in cross_table.as_dicts:
# todo make more defensive, fallback on nan for individual fields??
try:
d = {}

View file

@ -45,7 +45,7 @@ def from_orgmode() -> Iterator[Result]:
log.exception(e)
yield e
continue
# todo perhaps, better to use timezone provider
# FIXME use timezone provider
created = config.default_timezone.localize(created)
yield Entry(
dt=created,