import sqlite3 import re def migrate(db, habitlist, events): c = db.cursor() habitlist = simple_habits_list(c, habitlist) for event in events: text = event["note"] tags = extract_tags(text) for habit in habitlist: 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"]) def extract_tags(text, tagmarker="#"): """Returns 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 '#'. Returns: tags (list): List of tuples in the form [('tag', '3'), ('anothertag', '')]. """ found_tags = re.findall(rf"{tagmarker}(\w+)(?:\((\d+)\))?", text) return found_tags def simple_habits_list(c, habitlist): simple = [] for h in habitlist: simple.append( { "name": h["name"], "description": h["description"], "id": fetch_habit_id(c, h["uuid"]), } ) return simple def fetch_habit_id(c, uuid): c.execute("select id from Habits where uuid = ?", ([uuid])) id = c.fetchone() if id is not None: return id[0] # does not do: # ranges in habits (should check for habit being range, then taking #habit(3) number into account) # also, range trackers: multiply value by 1,000 # non-range habits but still #habit(3) number included, adding multiple? def add_to_database(cursor, habit_id, timestamp, value=2): try: cursor.execute( """ INSERT INTO Repetitions(id, habit, timestamp, value) VALUES (NULL, ?, ?, ?) """, (habit_id, timestamp, value), ) except sqlite3.IntegrityError: # TODO better error handling print("fail to register: not unique") pass