habitmove/habitmove/nomie.py

108 lines
3.2 KiB
Python
Raw Normal View History

2021-08-26 19:57:49 +00:00
#!/usr/bin/env python
import json
2021-12-02 22:08:58 +00:00
import re
from habitmove.nomiedata import Tracker, Event, Activity, NomieImport
2021-08-26 19:57:49 +00:00
def load_file(filename):
with open(filename) as f:
nomie_data = json.load(f)
return nomie_data
2021-08-26 21:13:56 +00:00
# generate a yes/no cli question with a default answer
2021-08-26 19:57:49 +00:00
def confirmation_question(question, default_no=True):
choices = " [y/N]: " if default_no else " [Y/n]: "
default_answer = "n" if default_no else "y"
reply = str(input(question + choices)).lower().strip() or default_answer
if reply[0] == "y":
return True
if reply[0] == "n":
return False
else:
return False if default_no else True
2021-08-26 21:13:56 +00:00
# display stats and ask user to confirm if they seem okay
2021-12-02 22:08:58 +00:00
def verify_continue(data: NomieImport):
2021-08-26 19:57:49 +00:00
trackers = ""
2021-12-02 22:08:58 +00:00
for t in data.trackers:
trackers += t.label + ", "
trackers = trackers[:-2]
2021-12-03 15:22:54 +00:00
activity_count = 0
for e in data.events:
activity_count += len(e.activities) if e.activities else 0
2021-12-02 22:08:58 +00:00
print(f"Exporting from nomie {data.version}:")
2021-08-26 19:57:49 +00:00
print(f"Found trackers: {trackers}")
2021-12-02 22:08:58 +00:00
print(
2021-12-03 15:22:54 +00:00
f"Found events: {len(data.events)} entries, containing {activity_count} individual activities."
2021-12-02 22:08:58 +00:00
)
2021-08-26 19:57:49 +00:00
if not confirmation_question("Do you want to continue?", default_no=False):
print("Aborted.")
exit(0)
2021-12-02 17:54:56 +00:00
2021-12-02 22:08:58 +00:00
def get_trackers(raw_trackers):
tracker_list = list[Tracker]()
for tracker_tuple in raw_trackers.items():
tracker_list.append(Tracker(**tracker_tuple[1]))
return tracker_list
2021-12-03 15:22:54 +00:00
def get_events(raw_events, tracker_list):
events = list[Event]()
for event in raw_events:
event["id"] = event["_id"]
event.pop("_id")
event["text"] = event["note"]
event.pop("note")
activities = get_activities_for_event(event["text"], tracker_list)
events.append(Event(**event, activities=activities))
return events
2021-12-02 22:08:58 +00:00
def extract_tags_from_text(text, tagmarker="#"):
"""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 '#'.
Returns:
tags (list): List of tuples in the form [('tag', '3'), ('anothertag', '')].
"""
string_tags = re.findall(rf"{tagmarker}(\w+)(?:\((\d+)\))?", text)
tags_with_int_counters = []
for tag in string_tags:
tags_with_int_counters.append((tag[0], None if tag[1] == "" else int(tag[1])))
return tags_with_int_counters
2021-12-03 15:22:54 +00:00
def get_activities_for_event(event_text, tracker_list):
2021-12-02 22:08:58 +00:00
activities = []
2021-12-03 15:22:54 +00:00
tag_list = extract_tags_from_text(event_text)
for tracker in tracker_list:
for tag in tag_list:
if tracker.tag in tag[0]:
activities.append(Activity(tracker=tracker, value=tag[1]))
2021-12-02 22:08:58 +00:00
return activities
2021-12-02 17:54:56 +00:00
# return the data belonging to nomie
2021-12-02 22:08:58 +00:00
def get_data(file, interactive=True):
raw_data = load_file(file)
nomie_version = raw_data["nomie"]["number"]
tracker_list = get_trackers(raw_data["trackers"])
2021-12-03 15:22:54 +00:00
event_list = get_events(raw_data["events"], tracker_list)
2021-12-02 22:08:58 +00:00
2021-12-03 15:22:54 +00:00
data = NomieImport(nomie_version, tracker_list, event_list)
2021-12-02 17:54:56 +00:00
if interactive:
2021-12-02 22:08:58 +00:00
verify_continue(data)
return data