|
@@ -26,18 +26,10 @@ from .obj import *
|
|
from .util import die,get_extension
|
|
from .util import die,get_extension
|
|
from .seed import *
|
|
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
|
|
|
|
-
|
|
|
|
- One or the other must be provided, but not both.
|
|
|
|
|
|
+ def __init__(self,fn,write=False):
|
|
|
|
|
|
- The base class signals support for the Filename API by setting its 'filename_api'
|
|
|
|
- attribute to True.
|
|
|
|
- """
|
|
|
|
self.name = fn
|
|
self.name = fn
|
|
self.dirname = os.path.dirname(fn)
|
|
self.dirname = os.path.dirname(fn)
|
|
self.basename = os.path.basename(fn)
|
|
self.basename = os.path.basename(fn)
|
|
@@ -46,18 +38,6 @@ class Filename(MMGenObject):
|
|
self.ctime = None
|
|
self.ctime = None
|
|
self.atime = 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:
|
|
try:
|
|
st = os.stat(fn)
|
|
st = os.stat(fn)
|
|
except:
|
|
except:
|
|
@@ -83,20 +63,54 @@ class Filename(MMGenObject):
|
|
self.ctime = st.st_ctime
|
|
self.ctime = st.st_ctime
|
|
self.atime = st.st_atime
|
|
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):
|
|
def names(self):
|
|
return [f.name for f in self]
|
|
return [f.name for f in self]
|
|
|
|
|
|
def sort_by_age(self,key='mtime',reverse=False):
|
|
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 )
|
|
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):
|
|
def find_files_in_dir(subclass,fdir,no_dups=False):
|
|
|
|
|
|
assert isinstance(subclass,type), f'{subclass}: not a class'
|
|
assert isinstance(subclass,type), f'{subclass}: not a class'
|