diff --git a/loop/repetitions.py b/loop/repetitions.py index fd020a3..c3e52ce 100644 --- a/loop/repetitions.py +++ b/loop/repetitions.py @@ -4,21 +4,35 @@ import re def migrate(db, habitlist, events): c = db.cursor() - habitlist = simple_habits_list(c, habitlist) + habits = simple_habits_list(c, habitlist) + repetitions = extract_all_repetitions(habits, events) + for rep in repetitions: + add_to_database(c, rep["id"], rep["timestamp"]) + + +def extract_all_repetitions(habits, events): + """Return list of all repetitions found of habits in events passed in. + Parameters: + habits (list): Collection of habits, with minimum necessary fields description and id. + events (list): Collection of events, with minimum necessary field end. + Returns: + repetitions (list): Collection of events transformed into Loop repetitions. + Contains fields id, timestamp, value (for ranges). + """ + repetitions = [] for event in events: text = event["note"] tags = extract_tags(text) - for habit in habitlist: + for habit in habits: for tag in tags: if habit["description"] in tag[0]: - print( - f"register event: {habit['name']} in {text} at {event['end']}" - ) - add_to_database(c, habit["id"], event["end"]) + print(f"found event: {habit['name']} in {text} at {event['end']}") + repetitions.append({"id": habit["id"], "timestamp": event["end"]}) + return repetitions def extract_tags(text, tagmarker="#"): - """Returns lists of tuples of all event tags found in text. + """Return lists of tuples of all event tags found in text. Parameters: text (str): The text to search through. tagmarker (str): Optional character marking beginning of tag, defaults to '#'. @@ -30,6 +44,14 @@ def extract_tags(text, tagmarker="#"): def simple_habits_list(c, habitlist): + """Return simplified collection of habits, only carrying name, tag, id. + Parameters: + c (sqlite.db.cursor): SQL cursor of database to query. + habitlist (list): Full habit collection to return a simplified view of. + Returns: + habitlist (list): Simple habitlist, habit name, tag, and id. + Copy of original, changes do not affect original. + """ simple = [] for h in habitlist: simple.append( @@ -43,6 +65,13 @@ def simple_habits_list(c, habitlist): def fetch_habit_id(c, uuid): + """Return sqlite internal id for habit with uuid. + Parameters: + c (sqlite.db.cursor): SQL cursor of database to query. + uuid (str): Unique id of habit to query for. + Returns: + id (int): SQLite internal id for habit queried for. + """ c.execute("select id from Habits where uuid = ?", ([uuid])) id = c.fetchone() if id is not None: @@ -67,5 +96,5 @@ def add_to_database(cursor, habit_id, timestamp, value=2): ) except sqlite3.IntegrityError: # TODO better error handling - print("fail to register: not unique") + print(f"fail to register {habit_id}: timestamp {timestamp} not unique") pass