fix: improve error handling when frontmatter malformed

This commit is contained in:
Nathaniel Landau
2023-03-03 21:02:32 -05:00
parent bd4b94aefa
commit bf869cfc15
5 changed files with 53 additions and 13 deletions

View File

@@ -240,7 +240,11 @@ class Frontmatter:
return {} return {}
yaml = YAML(typ="safe") yaml = YAML(typ="safe")
frontmatter: dict = yaml.load(frontmatter_block) yaml.allow_unicode = False
try:
frontmatter: dict = yaml.load(frontmatter_block)
except Exception as e: # noqa: BLE001
raise AttributeError(e) from e
for k in frontmatter: for k in frontmatter:
if frontmatter[k] is None: if frontmatter[k] is None:

View File

@@ -53,7 +53,12 @@ class Note:
alerts.error(f"Note {self.note_path} not found. Exiting") alerts.error(f"Note {self.note_path} not found. Exiting")
raise typer.Exit(code=1) from e raise typer.Exit(code=1) from e
self.frontmatter: Frontmatter = Frontmatter(self.file_content) try:
self.frontmatter: Frontmatter = Frontmatter(self.file_content)
except AttributeError as e:
alerts.error(f"Note {self.note_path} has invalid frontmatter.\n{e}")
raise typer.Exit(code=1) from e
self.inline_tags: InlineTags = InlineTags(self.file_content) self.inline_tags: InlineTags = InlineTags(self.file_content)
self.inline_metadata: InlineMetadata = InlineMetadata(self.file_content) self.inline_metadata: InlineMetadata = InlineMetadata(self.file_content)
self.original_file_content: str = self.file_content self.original_file_content: str = self.file_content
@@ -113,11 +118,10 @@ class Note:
) )
else: else:
self.sub(f"{_k}::", f"{value_1}::") self.sub(f"{_k}::", f"{value_1}::")
else: elif re.search(key, _k) and re.search(value_1, _v):
if re.search(key, _k) and re.search(value_1, _v): _k = re.escape(_k)
_k = re.escape(_k) _v = re.escape(_v)
_v = re.escape(_v) self.sub(f"{_k}:: ?{_v}", f"{_k}:: {value_2}", is_regex=True)
self.sub(f"{_k}:: ?{_v}", f"{_k}:: {value_2}", is_regex=True)
def add_metadata( # noqa: C901 def add_metadata( # noqa: C901
self, self,
@@ -151,9 +155,8 @@ class Note:
new_values = [] new_values = []
if isinstance(value, list): if isinstance(value, list):
new_values = [_v for _v in value if self.inline_metadata.add(key, _v)] new_values = [_v for _v in value if self.inline_metadata.add(key, _v)]
else: elif self.inline_metadata.add(key, value):
if self.inline_metadata.add(key, value): new_values = [value]
new_values = [value]
if new_values: if new_values:
for value in new_values: for value in new_values:
@@ -164,9 +167,8 @@ class Note:
new_values = [] new_values = []
if isinstance(value, list): if isinstance(value, list):
new_values = [_v for _v in value if self.inline_tags.add(_v)] new_values = [_v for _v in value if self.inline_tags.add(_v)]
else: elif self.inline_tags.add(value):
if self.inline_tags.add(value): new_values = [value]
new_values = [value]
if new_values: if new_values:
for value in new_values: for value in new_values:

6
tests/fixtures/broken_frontmatter.md vendored Normal file
View File

@@ -0,0 +1,6 @@
---
tags:
invalid = = "content"
---
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est la

View File

@@ -88,6 +88,22 @@ def test_frontmatter_create() -> None:
} }
def test_frontmatter_create_error() -> None:
"""Test frontmatter creation error.
GIVEN frontmatter content
WHEN frontmatter is invalid
THEN raise ValueError
"""
fn = """---
tags: tag
invalid = = "content"
---
"""
with pytest.raises(AttributeError):
Frontmatter(fn)
def test_frontmatter_contains() -> None: def test_frontmatter_contains() -> None:
"""Test frontmatter contains.""" """Test frontmatter contains."""
frontmatter = Frontmatter(FRONTMATTER_CONTENT) frontmatter = Frontmatter(FRONTMATTER_CONTENT)

View File

@@ -175,6 +175,18 @@ def test_add_metadata_frontmatter(sample_note) -> None:
} }
def test_add_metadata_frontmatter_error() -> None:
"""Test adding metadata.
GIVEN a note with broken frontmatter
WHEN the note is initialized
THEN a typer exit is raised
"""
broken_fm = Path("tests/fixtures/broken_frontmatter.md")
with pytest.raises(typer.Exit):
Note(note_path=broken_fm)
def test_add_metadata_tag(sample_note) -> None: def test_add_metadata_tag(sample_note) -> None:
"""Test adding inline tags.""" """Test adding inline tags."""
note = Note(note_path=sample_note) note = Note(note_path=sample_note)