1212import log
1313from parse import parse
1414
15+ from . import hooks
16+
1517
1618if 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