Source code for eppy3000.modelmaker

# Copyright (c) 2018 Santosh Philip
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
"""same as modelmaker in eppy"""

from io import StringIO
from munch import Munch
from eppy3000.readepj import readepjjson
from eppy3000.epschema import read_epschema_asmunch
from eppy3000.readepj import removeeppykeys
from eppy3000.epschema import EPSchema
from eppy3000.epMunch import EPMunch
from eppy3000.epj_mmapping import EpjMapping
import eppy3000.runner.run_functions as run_functions


[docs]class EPJ(object): def __init__(self, epjname=None, epw=None, epschemaname=None): super(EPJ, self).__init__() self.epjname = epjname self.epw = epw self.epschemaname = epschemaname if self.epschemaname: self.readepschema() self.read()
[docs] def read_epschema_asmunch(self): """Read the epschema file - will become a frozen singleton""" read_epschema_asmunch(self.epschemaname)
# not used ???
[docs] def read(self): """read the epj file""" self.epj = readepjjson(self.epjname) self.epobjects = EpjMapping(self.epj) # { # key: [val1 for val1 in val.values()] for key, val in self.epj.items() # } # TODO: the above line should get the epobjects from the schema # This should happen whenever the schema is read. # in case the schema reading happens far in the future # eppy3000 should partilly work even without the schema # - # insert epj into the epobject # this allows the epobject to access all other objects in the epj for epobjects in self.epobjects.values(): for epobject in epobjects: epobject["eppy_epj"] = self.epj if self.epschemaname: for key in self.epobjects.keys(): for epobject in self.epobjects[key]: epobject["eppy_objepschema"] = self.epschema.epschemaobjects[key]
[docs] def readepschema(self): """read the epschema file""" self.epschema = EPSchema(self.epschemaname)
def __repr__(self): """print this""" return self.epj.__repr__()
[docs] def saveas(self, filename, indent=4): """saveas in filename""" self.epjname = filename self.save(filename, indent=indent)
[docs] def savecopy(self, filename=None, indent=4): """save a copy of the file if filename==None: return copy in StringIO NOT unit TESTED at all. Not even use tested""" if filename: self.save(filename=filename, indent=indent) else: tosave = self.epj.toDict() tosave = Munch.fromDict(tosave) removeeppykeys(tosave) fhandle = StringIO() fhandle.write(tosave.toJSON(indent=indent)) fhandle.seek(0) return fhandle
[docs] def save(self, filename=None, indent=4): """save the file""" if not filename: filename = self.epjname try: with open(filename, "w") as fhandle: tosave = self.epj.toDict() tosave = Munch.fromDict(tosave) removeeppykeys(tosave) fhandle.write(tosave.toJSON(indent=indent)) except TypeError as e: fhandle = filename tosave = self.epj.toDict() tosave = Munch.fromDict(tosave) removeeppykeys(tosave) fhandle.write(tosave.toJSON(indent=indent))
[docs] def jsonstr(self, indent=4): """return a json string of the file""" fhandle = self.savecopy(indent=indent) return "\n".join([line.rstrip() for line in fhandle])
[docs] def newepobject(self, key, objname, defaultvalues=True, **kwargs): """create a new epj object""" # TODO test for dup name # TODO Kwargs strategy for array - # delay implementation for now, throw exception # TODO exceptions for wrong field name # TODO exception for wrong field value type # TODO documentation in usage.rst # should self.epobjects be updated here objepschema = self.epschema.epschemaobjects[key] try: nobj = self.epj[key][objname] = EPMunch() except KeyError as e: self.epj[key] = EPMunch() nobj = self.epj[key][objname] = EPMunch() for fieldname in objepschema.fieldnames(): try: if defaultvalues: fieldfprop = objepschema.fieldproperty(fieldname) nobj[fieldname] = fieldfprop["default"] except KeyError as e: prop = objepschema.fieldproperty(fieldname) # print(fieldname, prop.keys()) if "type" in prop: if prop["type"] == "array": # pprint(prop['items']) pass pass for key1, val1 in kwargs.items(): nobj[key1] = val1 nobj["eppykey"] = key nobj["eppyname"] = objname nobj["eppy_objepschema"] = objepschema return nobj
# def removeepobject(self, key, objname): # """remove an epj object""" # # should self.epobjects be updated here # return self.epj[key].pop(objname)
[docs] def popepobject(self, key, index): """Pop an EPJ object from the EPJ. Parameters ---------- key : str The type of EPJ object. index : int The index of the object to pop. Returns ------- EpBunch object. """ return self.epobjects[key].pop(index)
[docs] def removeepobject(self, epobject): """Remove an EPJ object from the EPJ. Parameters ---------- epobject : EpBunch object The epobject to remove. """ key = epobject.eppykey self.epobjects[key].remove(epobject)
[docs] def removeallepobjects(self, epjkey): """Remove all epobjects of a certain type from the EPJ. Parameters ---------- epjkey : key of the epobjects to remove """ while len(self.epobjects[epjkey]) > 0: self.popepobject(epjkey, 0)
[docs] def copyepobject(self, key, objname, newname): """copy an epj object with a new name""" # don't use the function dict.items() since the json for array has # field name `items` # should self.epobjects be updated here oldobj = self.epj[key][objname] newobj = EPMunch() self.epj[key][newname] = newobj for key1 in oldobj.keys(): if not key1.startswith("eppy"): val1 = oldobj[key1] if isinstance(val1, list): newobj[key1] = list() for item in val1: newobj[key1].append(item.copy()) else: newobj[key1] = val1 newobj["eppyname"] = newname newobj["eppykey"] = key newobj["eppy_objepschema"] = oldobj["eppy_objepschema"] return newobj
[docs] def run(self, **runoptions): return run_functions.run(self, **runoptions)