Source code for tradssat.tmpl.input
import os
from .file import File
from .vals import ValueSubSection
from .var import HeaderVariableSet
[docs]class InpFile(File):
"""
Parent class for all input files, as well as for `Summary.OUT`.
"""
ext = None # type: str
def __init__(self, file):
self._header_vars = HeaderVariableSet(self._get_header_vars())
super().__init__(file)
def write(self, file, force=False, check=True):
lines = []
write = force or file != self.file or self.changed()
if write:
self._values.write(lines)
with open(file, 'w', encoding=self.encoding) as f:
f.writelines(l + "\n" for l in lines)
def set_value(self, var, val, sect=None, subsect=None, cond=None):
self._values.set_value(var, val, sect=sect, subsect=subsect, cond=cond)
[docs] def changed(self):
"""
Checks whether the file has been edited and needs to be rewritten.
Returns
-------
bool
Whether the file has been edited or not.
"""
return self._values.changed()
def get_var(self, var, sect=None):
try:
return super().get_var(var, sect=sect)
except ValueError:
return self._header_vars.get_var(var, sect=sect)
def _process_section_header(self, lines):
if lines[0][0] == '@': # In case a section header is missing
self._values.add_section('')
return '', lines
header_text = lines[0][1:].strip() # Skip initial "*"
match = self._header_vars.matches(header_text)
if match:
section_name = match.strip()
self._values.add_section(section_name)
header_text = header_text[len(match):]
h_vars = self._header_vars.get_vars(match)
l_vals = []
for vr in h_vars:
size = vr.size + vr.spc
val = header_text[:size].strip()
matr = self._gen_empty_mtrx(str(vr), size=1)
matr[:] = val
l_vals.append(matr)
header_text = header_text[size:]
header_vars_subsect = ValueSubSection(h_vars, l_vals=l_vals)
self._values[section_name].set_header_vars(header_vars_subsect)
return match, lines[1:]
self._values.add_section(header_text)
return header_text, lines[1:]
def _get_header_vars(self):
return {}
[docs] @classmethod
def matches_file(cls, file):
"""
Checks whether a given file can be read by this class.
Parameters
----------
file: str
The filename or full path to be read.
Returns
-------
bool
``True`` if the file matches; ``False`` otherwise.
"""
ext = os.path.splitext(file)[1]
if isinstance(cls.ext, str):
return ext.lower() == cls.ext.lower()
return ext.lower() in [x.lower() for x in cls.ext]
def _get_var_info(self):
raise NotImplementedError