Update obsidian parser
Made it to state where it parses notes to pydantic models
This commit is contained in:
parent
44c569867b
commit
a8d18e7cbc
4 changed files with 25 additions and 50 deletions
4
main.py
4
main.py
|
@ -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:])
|
|
||||||
|
|
|
@ -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:])
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue