Source code for omfit_classes.omfit_dir
try:
# framework is running
from .startup_choice import *
except ImportError as _excp:
# class is imported by itself
if (
'attempted relative import with no known parent package' in str(_excp)
or 'No module named \'omfit_classes\'' in str(_excp)
or "No module named '__main__.startup_choice'" in str(_excp)
):
from startup_choice import *
else:
raise
from omfit_classes.omfit_path import OMFITpath
from omfit_classes.omfit_ascii import OMFITascii
__all__ = ['OMFITdir']
[docs]class OMFITdir(SortedDict, OMFITobject):
r"""
OMFIT class used to interface with directories
:param filename: directory path passed to OMFITobject class
:param extensions: dictionary mapping filename expression to OMFIT classes, for example: {'*.dat': 'OMFITnamelist', '*.xml': 'OMFITxml'}
:param \**kw: keyword dictionary passed to OMFITobject class
"""
def __init__(self, filename, extensions={}, **kw):
SortedDict.__init__(self)
kw['file_type'] = 'dir'
if len(extensions):
kw['extensions'] = extensions
for item in extensions:
assert isinstance(extensions[item], str), 'OMFITdir extensions can only be string'
OMFITobject.__init__(self, filename, **kw)
self.OMFITproperties.pop('file_type', 'dir')
self.update_dir()
def __call__(self):
return self.update_dir()
[docs] def update_dir(self):
"""
populate current object with folders and files from self.filename directory
"""
self.clear()
if os.path.exists(self.filename) and os.path.isdir(self.filename):
tmp = dir2dict(self.filename)
self.update(tmp[list(tmp.keys())[0]])
for key in list(self.keys()):
filename = self.filename + os.sep + key
if os.path.isdir(filename):
self[key] = OMFITdir(filename, extensions=self.OMFITproperties.get('extensions', {}), noCopyToCWD=True)
else:
match = False
for ext in self.OMFITproperties.get('extensions', {}):
import fnmatch
if fnmatch.fnmatch(filename, ext):
exec('from omfit_classes.omfit_python import ' + self.OMFITproperties['extensions'][ext])
self[key] = eval(self.OMFITproperties['extensions'][ext])(filename, noCopyToCWD=True)
match = True
break
if not match:
if is_binary_file(filename):
self[key] = OMFITpath(filename, noCopyToCWD=True)
else:
self[key] = OMFITascii(filename, noCopyToCWD=True)
[docs] def add(self, key, obj):
"""
Deploy OMFITojbect obj to current OMFITdir directory
:param key: key where to add the object (NOTE: this key can have `/` separators to indicate subdirectories)
:param obj: OMFITobject to add
:return: OMFITobject deployed to directory
"""
keys = key.split(os.sep)
filename = os.sep.join([self.filename] + keys)
obj.deploy(filename)
# build subtree items
loc = self
for k, d in enumerate(keys[:-1]):
if d not in loc:
loc[d] = OMFITdir(os.sep.join([self.filename] + keys[: k + 1]), noCopyToCWD=True)
loc = loc[d]
loc[keys[-1]] = OMFITpath(filename, noCopyToCWD=True)
return loc[keys[-1]]
[docs] def importDir(self, subfolder=None):
"""
This method adds the directory (possibly a specific subfolder) to the sys.path (i.e. PYTHONPATH)
so that the python functions contained in this folder can be called from within OMFIT
:param subfolder: subfolder under the OMFITdir object
:return: None
"""
if os.path.isdir(self.filename):
if not os.path.exists(self.filename + os.sep + '__init__.py'):
open(self.filename + os.sep + '__init__.py', 'w').close()
tmp = self.filename
if subfolder is not None:
tmp = self.filename + os.sep + subfolder
if tmp in sys.path:
sys.path.remove(tmp)
sys.path.insert(0, tmp)
def __delitem__(self, key):
filename = self.filename + os.sep + key
if os.path.exists(filename):
if os.path.isdir(filename):
shutil.rmtree(filename)
else:
os.remove(filename)
super().__delitem__(key)
############################################
if '__main__' == __name__:
test_classes_main_header()
tmp = OMFITdir('asd')
tmp.add('bla/zzz/aaa.py', OMFITpath('test.py'))
print(tmp.filename)
assert tmp['bla']['zzz']['aaa.py'].filename.split(os.sep)[-3:] == ['bla', 'zzz', 'aaa.py']
tmp1 = OMFITdir(tmp.filename, extensions={'*.py': 'OMFITascii'})
print(tmp1)