Update obsidian parser

Made it to state where it parses notes to pydantic models
This commit is contained in:
pro100ton 2025-01-12 01:25:26 +03:00
parent 44c569867b
commit a8d18e7cbc
4 changed files with 25 additions and 50 deletions

View file

@ -1,5 +1,3 @@
from obsidian.notes_parser import parse_training_data from obsidian.notes_parser import parse_training_data
from pprint import pprint
parse_training_data()
pprint(parse_training_data()[1:])

View file

@ -1,8 +1,8 @@
import copy
import os import os
import re import re
from pprint import pprint from pprint import pprint
from typing import Dict, List, Tuple from typing import List, Tuple
from datetime import datetime
from obsidian.py_models import Approach, Exercise, Training from obsidian.py_models import Approach, Exercise, Training
@ -65,17 +65,14 @@ def parse_training_exercises(exercise_line: str) -> Exercise:
raise ValueError raise ValueError
if len(stripped) != 3: if len(stripped) != 3:
raise ValueError raise ValueError
# return {
# "name": stripped[0],
# "weight": stripped[1],
# "reps": stripped[2],
# }
return serialize_exercise( return serialize_exercise(
name=stripped[0], weight=stripped[1], reps=stripped[2] name=stripped[0], weight=stripped[1], reps=stripped[2]
) )
def parse_training_header(training_data_line: str) -> Tuple[bool, str, str, str]: def parse_training_header(
training_data_line: str,
) -> Tuple[bool, str, str, str]:
pattern: str = r"#\s(?P<date>\d+.\d+.\d+)\s\((?P<trainer>.+)-(?P<year_counter>.+)\)" pattern: str = r"#\s(?P<date>\d+.\d+.\d+)\s\((?P<trainer>.+)-(?P<year_counter>.+)\)"
match = re.search(pattern, training_data_line) match = re.search(pattern, training_data_line)
if match: if match:
@ -83,7 +80,7 @@ def parse_training_header(training_data_line: str) -> Tuple[bool, str, str, str]
trainer = match.group("trainer").strip() trainer = match.group("trainer").strip()
year_count = match.group("year_counter").strip() year_count = match.group("year_counter").strip()
return True, date, trainer, year_count return True, date, trainer, year_count
return False, None, None, None return False, "", "", ""
def filter_training_data(training_data: str): def filter_training_data(training_data: str):
@ -92,47 +89,28 @@ def filter_training_data(training_data: str):
def parse_training_data(): def parse_training_data():
training_data: str = filter_training_data(read_example_file("notes.txt")) training_data: str = filter_training_data(read_example_file("full.txt"))
training_template: Dict = {
"date": None,
"trainer": None,
"year_count": None,
"exercises": [],
}
parsed_trainings: List[List[str]] = []
current_training: Dict = {}
lines = training_data.splitlines() lines = training_data.splitlines()
current_training = None
trains = []
for index, line in enumerate(lines): for index, line in enumerate(lines):
# Check for last line
if index == len(lines) - 1:
current_training["exercises"] = current_training["exercises"][1:]
parsed_trainings.append(current_training)
break
header_parsed, date, trainer, year_count = parse_training_header(line) header_parsed, date, trainer, year_count = parse_training_header(line)
if index == len(lines) - 1:
trains.append(current_training)
if header_parsed: if header_parsed:
if not current_training: trains.append(current_training)
pass current_training = Training(
else: date=datetime.strptime(date, "%d.%m.%Y").date(), exercises=[]
current_training["exercises"] = current_training["exercises"][1:] )
parsed_trainings.append(current_training) continue
current_training = copy.deepcopy(training_template)
current_training["date"] = date
current_training["trainer"] = trainer
current_training["year_count"] = year_count
try: try:
exr = parse_training_exercises(line) exr = parse_training_exercises(line)
current_training["exercises"].append(exr) current_training.exercises.append(exr)
except ValueError: except ValueError:
pass pass
trainings: List[Training] = [] for t in trains:
for training in parsed_trainings: pprint(t)
if not training: print("\n")
continue return trains
pprint(training)
print("-" * 10)
train = Training(date=training.get("date"), exercises=training.get("exercises"))
return trainings
pprint(parse_training_data()[1:]) pprint(parse_training_data()[1:])

View file

@ -1,4 +1,4 @@
from typing import List from typing import List, Optional
from pydantic import BaseModel from pydantic import BaseModel
from datetime import date from datetime import date
@ -16,7 +16,7 @@ class Exercise(BaseModel):
class Training(BaseModel): class Training(BaseModel):
date: date date: date
exercises: List[Exercise] exercises: Optional[List[Exercise]]
class Coach(BaseModel): class Coach(BaseModel):
name: str name: str

View file

@ -1,6 +1,5 @@
from datetime import date, datetime
from obsidian.notes_parser import serialize_exercise from obsidian.notes_parser import serialize_exercise
from obsidian.py_models import Approach, Exercise, Training from obsidian.py_models import Approach, Exercise
import pytest import pytest