From e221c3e9b47629bab1e5bc7c67ff6634552a95b8 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Fri, 7 Oct 2022 19:48:50 +0000 Subject: [PATCH] filename.py: new classes: File, FileList --- mmgen/filename.py | 70 ++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/mmgen/filename.py b/mmgen/filename.py index e7bf69f6..82e2d711 100755 --- a/mmgen/filename.py +++ b/mmgen/filename.py @@ -26,18 +26,10 @@ from .obj import * from .util import die,get_extension from .seed import * -class Filename(MMGenObject): +class File: - def __init__(self,fn,base_class=None,subclass=None,proto=None,write=False): - """ - 'base_class' - a base class with an 'ext_to_cls' method - 'subclass' - a subclass with an 'ext' attribute + def __init__(self,fn,write=False): - One or the other must be provided, but not both. - - The base class signals support for the Filename API by setting its 'filename_api' - attribute to True. - """ self.name = fn self.dirname = os.path.dirname(fn) self.basename = os.path.basename(fn) @@ -46,18 +38,6 @@ class Filename(MMGenObject): self.ctime = None self.atime = None - assert (subclass or base_class) and not (subclass and base_class), 'Filename chk1' - - if not getattr(subclass or base_class,'filename_api',False): - die(3,f'Class {(subclass or base_class).__name__!r} does not support the Filename API') - - if base_class: - subclass = base_class.ext_to_cls( self.ext, proto ) - if not subclass: - die( 'BadFileExtension', f'{self.ext!r}: not a recognized file extension for {base_class}' ) - - self.subclass = subclass - try: st = os.stat(fn) except: @@ -83,20 +63,54 @@ class Filename(MMGenObject): self.ctime = st.st_ctime self.atime = st.st_atime -class MMGenFileList(list,MMGenObject): +class FileList(list): - def __init__(self,fns,base_class,proto=None): - flist = [Filename( fn, base_class=base_class, proto=proto ) for fn in fns] - return list.__init__(self,flist) + def __init__(self,fns,write=False): + return list.__init__( + self, + [File(fn,write) for fn in fns] ) def names(self): return [f.name for f in self] def sort_by_age(self,key='mtime',reverse=False): - if key not in ('atime','ctime','mtime'): - die(1,f'{key!r}: illegal sort key') + assert key in ('atime','ctime','mtime'), f'{key!r}: invalid sort key' self.sort( key=lambda a: getattr(a,key), reverse=reverse ) +class Filename(File): + + def __init__(self,fn,base_class=None,subclass=None,proto=None,write=False): + """ + 'base_class' - a base class with an 'ext_to_cls' method + 'subclass' - a subclass with an 'ext' attribute + + One or the other must be provided, but not both. + + The base class signals support for the Filename API by setting its 'filename_api' + attribute to True. + """ + + super().__init__(fn,write) + + assert (subclass or base_class) and not (subclass and base_class), 'Filename chk1' + + if not getattr(subclass or base_class,'filename_api',False): + die(3,f'Class {(subclass or base_class).__name__!r} does not support the Filename API') + + if base_class: + subclass = base_class.ext_to_cls( self.ext, proto ) + if not subclass: + die( 'BadFileExtension', f'{self.ext!r}: not a recognized file extension for {base_class}' ) + + self.subclass = subclass + +class MMGenFileList(FileList): + + def __init__(self,fns,base_class,proto=None,write=False): + return list.__init__( + self, + [Filename( fn, base_class=base_class, proto=proto, write=write ) for fn in fns] ) + def find_files_in_dir(subclass,fdir,no_dups=False): assert isinstance(subclass,type), f'{subclass}: not a class'