Skip to content

Commit 4914d61

Browse files
authored
Merge pull request #142 from ramnes/consistent-manager-methods
Use a new Manager.get() method to make manager's getters consistent
2 parents 7a2dd89 + 18dbd4d commit 4914d61

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

datafiles/manager.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import log
1313
from parse import parse
1414

15+
from . import hooks
16+
1517

1618
if TYPE_CHECKING:
1719
from .mapper import Mapper
@@ -33,31 +35,32 @@ def all(self) -> Iterator[HasDatafile]:
3335
for filename in iglob(splatted):
3436
log.debug(f'Found matching path: {filename}')
3537
results = parse(pattern, filename)
36-
fields = dataclasses.fields(self.model)
37-
args = list(results.named.values())
38-
args += [Missing] * (len(fields) - len(args))
39-
yield self.model(*args)
38+
yield self.get(*results.named.values())
4039

41-
def get_or_none(self, *args, **kwargs) -> Optional[HasDatafile]:
42-
original_manual = self.model.Meta.datafile_manual
40+
def get(self, *args, **kwargs) -> HasDatafile:
41+
fields = dataclasses.fields(self.model)
42+
missing_args = [Missing] * (len(fields) - len(args) - len(kwargs))
43+
args = (*args, *missing_args)
4344

44-
self.model.Meta.datafile_manual = True
45-
instance = self.model(*args, **kwargs)
46-
self.model.Meta.datafile_manual = original_manual
45+
with hooks.disabled():
46+
instance = self.model(*args, **kwargs)
47+
instance.datafile.load()
4748

48-
if instance.datafile.exists:
49-
instance.datafile._manual = original_manual
50-
return instance
49+
return instance
5150

52-
return None
51+
def get_or_none(self, *args, **kwargs) -> Optional[HasDatafile]:
52+
try:
53+
return self.get(*args, **kwargs)
54+
except FileNotFoundError:
55+
log.info("File not found")
56+
return None
5357

5458
def get_or_create(self, *args, **kwargs) -> HasDatafile:
55-
instance = self.model(*args, **kwargs)
56-
57-
if not instance.datafile.exists:
58-
instance.datafile.save()
59-
60-
return instance
59+
try:
60+
return self.get(*args, **kwargs)
61+
except FileNotFoundError:
62+
log.info(f"File not found, creating '{self.model.__name__}' object")
63+
return self.model(*args, **kwargs)
6164

6265
def filter(self, **query):
6366
for item in self.all():

0 commit comments

Comments
 (0)