Skip to content

Commit

Permalink
Handle YAML scanner errors
Browse files Browse the repository at this point in the history
  • Loading branch information
jacebrowning committed Aug 20, 2022
1 parent ff47d72 commit 2c832fd
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Expand Up @@ -6,7 +6,7 @@

## 1.4.3 (2022-08-19)

- Fixed handling of unparseable YAML files in manager methods.
- Fixed handling of invalid YAML files in manager methods.

## 1.4.2 (2022-07-29)

Expand Down
7 changes: 5 additions & 2 deletions datafiles/manager.py
Expand Up @@ -13,6 +13,7 @@
import log
from parse import parse
from ruamel.yaml.parser import ParserError
from ruamel.yaml.scanner import ScannerError

from . import hooks

Expand Down Expand Up @@ -43,8 +44,10 @@ def get(self, *args, **kwargs) -> Model:
instance = self.model(*args, **kwargs)
try:
instance.datafile.load()
except ParserError:
log.critical(f"Deleting unparseable YAML: {instance.datafile.path}")
except (ParserError, ScannerError) as e:
log.critical(
f"Deleting invalid YAML: {instance.datafile.path} ({e.problem})"
)
instance.datafile.path.unlink()
instance.datafile.load()

Expand Down
9 changes: 5 additions & 4 deletions datafiles/tests/test_manager.py
Expand Up @@ -52,8 +52,9 @@ def when_file_missing(expect, manager):
def when_file_corrupt(expect, manager):
instance = manager.get_or_create(foo=2, bar=1)
instance.datafile.path.write_text("{")
instance = manager.get_or_none(foo=2, bar=2)
expect(instance).is_(None)
instance2 = manager.get_or_none(foo=2, bar=2)
expect(instance2).is_(None)
expect(instance.datafile.path.is_file()).is_(False)

def describe_get_or_create():
@patch("datafiles.mapper.Mapper.save")
Expand All @@ -76,8 +77,8 @@ def when_file_missing(mock_save, mock_load, expect, manager):
def when_file_corrupt(expect, manager):
instance = manager.get_or_create(foo=2, bar=1)
instance.datafile.path.write_text("{")
instance = manager.get_or_create(foo=2, bar=2)
expect(instance.bar) == 2
instance2 = manager.get_or_create(foo=2, bar=2)
expect(instance2.bar) == 2

def describe_all():
@patch("datafiles.mapper.Mapper.exists", False)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
@@ -1,7 +1,7 @@
[tool.poetry]

name = "datafiles"
version = "2.0a1"
version = "2.0"
description = "File-based ORM for dataclasses."

license = "MIT"
Expand Down

0 comments on commit 2c832fd

Please sign in to comment.