Skip to content

Commit 2c832fd

Browse files
committed
Handle YAML scanner errors
1 parent ff47d72 commit 2c832fd

4 files changed

Lines changed: 12 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
## 1.4.3 (2022-08-19)
88

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

1111
## 1.4.2 (2022-07-29)
1212

datafiles/manager.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import log
1414
from parse import parse
1515
from ruamel.yaml.parser import ParserError
16+
from ruamel.yaml.scanner import ScannerError
1617

1718
from . import hooks
1819

@@ -43,8 +44,10 @@ def get(self, *args, **kwargs) -> Model:
4344
instance = self.model(*args, **kwargs)
4445
try:
4546
instance.datafile.load()
46-
except ParserError:
47-
log.critical(f"Deleting unparseable YAML: {instance.datafile.path}")
47+
except (ParserError, ScannerError) as e:
48+
log.critical(
49+
f"Deleting invalid YAML: {instance.datafile.path} ({e.problem})"
50+
)
4851
instance.datafile.path.unlink()
4952
instance.datafile.load()
5053

datafiles/tests/test_manager.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ def when_file_missing(expect, manager):
5252
def when_file_corrupt(expect, manager):
5353
instance = manager.get_or_create(foo=2, bar=1)
5454
instance.datafile.path.write_text("{")
55-
instance = manager.get_or_none(foo=2, bar=2)
56-
expect(instance).is_(None)
55+
instance2 = manager.get_or_none(foo=2, bar=2)
56+
expect(instance2).is_(None)
57+
expect(instance.datafile.path.is_file()).is_(False)
5758

5859
def describe_get_or_create():
5960
@patch("datafiles.mapper.Mapper.save")
@@ -76,8 +77,8 @@ def when_file_missing(mock_save, mock_load, expect, manager):
7677
def when_file_corrupt(expect, manager):
7778
instance = manager.get_or_create(foo=2, bar=1)
7879
instance.datafile.path.write_text("{")
79-
instance = manager.get_or_create(foo=2, bar=2)
80-
expect(instance.bar) == 2
80+
instance2 = manager.get_or_create(foo=2, bar=2)
81+
expect(instance2.bar) == 2
8182

8283
def describe_all():
8384
@patch("datafiles.mapper.Mapper.exists", False)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tool.poetry]
22

33
name = "datafiles"
4-
version = "2.0a1"
4+
version = "2.0"
55
description = "File-based ORM for dataclasses."
66

77
license = "MIT"

0 commit comments

Comments
 (0)