add save_dt computation to Save
This commit is contained in:
parent
1ad2a5bffa
commit
6e7029b74d
1 changed files with 24 additions and 20 deletions
|
@ -32,7 +32,8 @@ def _get_backups(all_=True) -> List[Path]:
|
||||||
Sid = str
|
Sid = str
|
||||||
|
|
||||||
class Save(NamedTuple):
|
class Save(NamedTuple):
|
||||||
dt: datetime
|
dt: datetime # TODO misleading name... this is creation dt, not saving dt
|
||||||
|
backup_dt: datetime
|
||||||
title: str
|
title: str
|
||||||
sid: Sid
|
sid: Sid
|
||||||
json: Any = None
|
json: Any = None
|
||||||
|
@ -40,6 +41,11 @@ class Save(NamedTuple):
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.sid)
|
return hash(self.sid)
|
||||||
|
|
||||||
|
@cproperty
|
||||||
|
def save_dt(self) -> datetime:
|
||||||
|
assert self.dt <= self.backup_dt
|
||||||
|
return max(self.dt, self.backup_dt)
|
||||||
|
|
||||||
@cproperty
|
@cproperty
|
||||||
def url(self) -> str:
|
def url(self) -> str:
|
||||||
# pylint: disable=unsubscriptable-object
|
# pylint: disable=unsubscriptable-object
|
||||||
|
@ -95,6 +101,11 @@ Url = str
|
||||||
# TODO shit. there does seem to be a difference...
|
# TODO shit. there does seem to be a difference...
|
||||||
# TODO do it in multiple threads??
|
# TODO do it in multiple threads??
|
||||||
def get_state(bfile: Path) -> Dict[Sid, Save]:
|
def get_state(bfile: Path) -> Dict[Sid, Save]:
|
||||||
|
RE = re.compile(r'reddit-(\d{14})')
|
||||||
|
match = RE.search(bfile.stem)
|
||||||
|
assert match is not None
|
||||||
|
bdt = pytz.utc.localize(datetime.strptime(match.group(1), "%Y%m%d%H%M%S"))
|
||||||
|
|
||||||
saves: List[Save] = []
|
saves: List[Save] = []
|
||||||
with kompress.open(bfile) as fo:
|
with kompress.open(bfile) as fo:
|
||||||
jj = json.load(fo)
|
jj = json.load(fo)
|
||||||
|
@ -107,6 +118,7 @@ def get_state(bfile: Path) -> Dict[Sid, Save]:
|
||||||
title = get_some(s, 'link_title', 'title')
|
title = get_some(s, 'link_title', 'title')
|
||||||
save = Save(
|
save = Save(
|
||||||
dt=dt,
|
dt=dt,
|
||||||
|
backup_dt=bdt,
|
||||||
title=title,
|
title=title,
|
||||||
sid=s['id'],
|
sid=s['id'],
|
||||||
json=s,
|
json=s,
|
||||||
|
@ -137,26 +149,17 @@ def get_events(all_=True, parallel=True) -> List[Event]:
|
||||||
# also make it lazy...
|
# also make it lazy...
|
||||||
states = map(get_state, backups)
|
states = map(get_state, backups)
|
||||||
|
|
||||||
RE = re.compile(r'reddit-(\d{14})')
|
for i, saves in enumerate(states): # TODO when date...
|
||||||
for i, (b, saves) in enumerate(zip(backups, states)): # TODO when date...
|
|
||||||
match = RE.search(b.stem)
|
|
||||||
assert match is not None
|
|
||||||
btime = pytz.utc.localize(datetime.strptime(match.group(1), "%Y%m%d%H%M%S"))
|
|
||||||
|
|
||||||
first = i == 0
|
first = i == 0
|
||||||
|
|
||||||
def etime(dt: datetime):
|
|
||||||
if first:
|
|
||||||
return dt
|
|
||||||
else:
|
|
||||||
return btime
|
|
||||||
|
|
||||||
for key in set(prev_saves.keys()).symmetric_difference(set(saves.keys())):
|
for key in set(prev_saves.keys()).symmetric_difference(set(saves.keys())):
|
||||||
ps = prev_saves.get(key, None)
|
ps = prev_saves.get(key, None)
|
||||||
if ps is not None:
|
if ps is not None:
|
||||||
# TODO use backup date, that is more precise...
|
# TODO use backup date, that is more precise...
|
||||||
|
# eh. I guess just take max and it will always be correct?
|
||||||
events.append(Event(
|
events.append(Event(
|
||||||
dt=etime(ps.dt),
|
dt=ps.save_dt,
|
||||||
text=f"unfavorited",
|
text=f"unfavorited",
|
||||||
kind=ps,
|
kind=ps,
|
||||||
eid=f'unf-{ps.sid}',
|
eid=f'unf-{ps.sid}',
|
||||||
|
@ -166,8 +169,8 @@ def get_events(all_=True, parallel=True) -> List[Event]:
|
||||||
else: # in saves
|
else: # in saves
|
||||||
s = saves[key]
|
s = saves[key]
|
||||||
events.append(Event(
|
events.append(Event(
|
||||||
dt=etime(s.dt),
|
dt=s.save_dt,
|
||||||
text=f"favorited {'[initial]' if first else ''}",
|
text=f"favorited{' [initial]' if first else ''}",
|
||||||
kind=s,
|
kind=s,
|
||||||
eid=f'fav-{s.sid}',
|
eid=f'fav-{s.sid}',
|
||||||
url=s.url,
|
url=s.url,
|
||||||
|
@ -203,20 +206,21 @@ def test():
|
||||||
|
|
||||||
|
|
||||||
# TODO fuck. pytest is broken??
|
# TODO fuck. pytest is broken??
|
||||||
|
# right, apparently I need pytest.ini file...
|
||||||
def test_unfav():
|
def test_unfav():
|
||||||
events = get_events(all_=True)
|
events = get_events(all_=True)
|
||||||
url = 'https://reddit.com/r/QuantifiedSelf/comments/acxy1v/personal_dashboard/'
|
url = 'https://reddit.com/r/QuantifiedSelf/comments/acxy1v/personal_dashboard/'
|
||||||
uevents = [e for e in events if e.url == url]
|
uevents = [e for e in events if e.url == url]
|
||||||
assert len(uevents) == 2
|
assert len(uevents) == 2
|
||||||
ff = uevents[0]
|
ff = uevents[0]
|
||||||
assert ff.text == 'favorited [initial]'
|
assert ff.text == 'favorited'
|
||||||
uf = uevents[1]
|
uf = uevents[1]
|
||||||
assert uf.text == 'unfavorited'
|
assert uf.text == 'unfavorited'
|
||||||
|
|
||||||
def test_get_all_saves():
|
# def test_get_all_saves():
|
||||||
saves = get_saves(all_=True)
|
# saves = get_saves(all_=True)
|
||||||
# just check that they are unique..
|
# # just check that they are unique..
|
||||||
make_dict(saves, key=lambda s: s.sid)
|
# make_dict(saves, key=lambda s: s.sid)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
Loading…
Add table
Reference in a new issue