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 pprint import pprint
pprint(parse_training_data()[1:])
parse_training_data()

View file

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

View file

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