def makeabunch(commdct, obj, obj_i, debugidd=True, block=None): """make a bunch from the object""" objidd = commdct[obj_i] objfields = [comm.get("field") for comm in commdct[obj_i]] objfields[0] = ["key"] objfields = [field[0] for field in objfields] obj_fields = [bunchhelpers.makefieldname(field) for field in objfields] bobj = EpBunch(obj, obj_fields, objidd) # TODO : test for len(obj) > len(obj_fields) # that will be missing fields in idd file # do we throw an exception here ????? YES !!!!! if debugidd: if len(obj) > len(obj_fields): n = len(obj) - len(obj_fields) extlst = extension_of_extensible(commdct[obj_i], block[obj_i], n) errortext = "idfobject with key '{}' & first field '{}' has {} fields while the idd for '{}' has only {} fields. Add the following fields to the object '{}' in file Energy+.idd '{};'".format( obj[0].upper(), obj[1], len(obj) - 1, obj[0].upper(), len(obj_fields) - 1, obj[0].upper(), ", ".join(extlst), ) # "idfobject with key 'TIMESTEP' & first field '44' has 2 fields while the idd for 'TIMESTEP' has only 1 fields. Add the following fields to object 'TIMESTEP' in file Energy+.idd A5, A6;'" # print(block[obj_i]) # print(errortext) print(extlst) raise NoIDDFieldsError(errortext) return bobj
def makeabunch(commdct, obj, obj_i): """make a bunch from the object""" objidd = commdct[obj_i] objfields = [comm.get('field') for comm in commdct[obj_i]] objfields[0] = ['key'] objfields = [field[0] for field in objfields] obj_fields = [bunchhelpers.makefieldname(field) for field in objfields] bobj = EpBunch(obj, obj_fields, objidd) return bobj
def test_makefieldname(): """py.test for makefieldname""" data = (('aname', 'aname'), # namefromidd, bunchname ('a name', 'a_name'), # namefromidd, bunchname ('a name #1', 'a_name_1'), # namefromidd, bunchname ) for namefromidd, bunchname in data: result = bunchhelpers.makefieldname(namefromidd) assert result == bunchname
def test_makefieldname(): """py.test for makefieldname""" data = ( ('aname', 'aname'), # namefromidd, bunchname ('a name', 'a_name'), # namefromidd, bunchname ('a name #1', 'a_name_1'), # namefromidd, bunchname ) for namefromidd, bunchname in data: result = bunchhelpers.makefieldname(namefromidd) assert result == bunchname
def test_makefieldname(): """py.test for makefieldname""" data = ( ("aname", "aname"), # namefromidd, bunchname ("a name", "a_name"), # namefromidd, bunchname ("a name #1", "a_name_1"), # namefromidd, bunchname ) for namefromidd, bunchname in data: result = bunchhelpers.makefieldname(namefromidd) assert result == bunchname
def makeabunch( commdct, # type: List[List[Dict[str, Any]]] obj, # type: Union[List[Union[float, str]], List[str]] obj_i, # type: int ): # type: (...) -> EpBunch """Make a bunch from the object. :param commdct: Descriptions of IDF fields from the IDD. :param obj: List of field values in an object. :param obj_i: Index of the object in commdct. :returns: EpBunch object. """ objidd = commdct[obj_i] objfields = [comm.get("field") for comm in commdct[obj_i]] # type: List objfields[0] = ["key"] objfields = [field[0] for field in objfields] obj_fields = [bunchhelpers.makefieldname(field) for field in objfields] bobj = EpBunch(obj, obj_fields, objidd) return bobj
def test_EpBunch(): """py.test for EpBunch""" iddfile = StringIO(iddtxt) fname = StringIO(idftxt) block, data, commdct = readidf.readdatacommdct1(fname, iddfile=iddfile) # setup code walls - can be generic for any object ddtt = data.dt dtls = data.dtls wall_i = dtls.index('BuildingSurface:Detailed'.upper()) wallkey = 'BuildingSurface:Detailed'.upper() wallidd = commdct[wall_i] dwalls = ddtt[wallkey] dwall = dwalls[0] wallfields = [comm.get('field') for comm in commdct[wall_i]] wallfields[0] = ['key'] wallfields = [field[0] for field in wallfields] wall_fields = [bunchhelpers.makefieldname(field) for field in wallfields] assert wall_fields[:20] == [ 'key', 'Name', 'Surface_Type', 'Construction_Name', 'Zone_Name', 'Outside_Boundary_Condition', 'Outside_Boundary_Condition_Object', 'Sun_Exposure', 'Wind_Exposure', 'View_Factor_to_Ground', 'Number_of_Vertices', 'Vertex_1_Xcoordinate', 'Vertex_1_Ycoordinate', 'Vertex_1_Zcoordinate', 'Vertex_2_Xcoordinate', 'Vertex_2_Ycoordinate', 'Vertex_2_Zcoordinate', 'Vertex_3_Xcoordinate', 'Vertex_3_Ycoordinate', 'Vertex_3_Zcoordinate' ] bwall = EpBunch(dwall, wall_fields, wallidd) # print bwall.Name # print data.dt[wallkey][0][1] assert bwall.Name == data.dt[wallkey][0][1] bwall.Name = 'Gumby' # print bwall.Name # print data.dt[wallkey][0][1] # print assert bwall.Name == data.dt[wallkey][0][1] # set aliases bwall.__aliases = {'Constr': 'Construction_Name'} # print "wall.Construction_Name = %s" % (bwall.Construction_Name, ) # print "wall.Constr = %s" % (bwall.Constr, ) # print assert bwall.Construction_Name == bwall.Constr # print "change wall.Constr" bwall.Constr = 'AnewConstr' # print "wall.Constr = %s" % (bwall.Constr, ) # print "wall.Constr = %s" % (data.dt[wallkey][0][3], ) # print assert bwall.Constr == data.dt[wallkey][0][3] # add functions bwall.__functions = {'svalues': bunch_subclass.somevalues} # print bwall.svalues assert bwall.svalues == ('Gumby', 'AnewConstr', [ 'BuildingSurface:Detailed', 'Gumby', 'Wall', 'AnewConstr', 'West Zone', 'Outdoors', '', 'SunExposed', 'WindExposed', '0.5000000', '4', '0', '0', '3.048000', '0', '0', '0', '6.096000', '0', '0', '6.096000', '0', '3.048000' ]) # print bwall.__functions # test __getitem__ assert bwall["Name"] == data.dt[wallkey][0][1] # test __setitem__ newname = "loofah" bwall["Name"] = newname assert bwall.Name == newname assert bwall["Name"] == newname assert data.dt[wallkey][0][1] == newname # test functions and alias again assert bwall.Constr == data.dt[wallkey][0][3] assert bwall.svalues == (newname, 'AnewConstr', [ 'BuildingSurface:Detailed', newname, 'Wall', 'AnewConstr', 'West Zone', 'Outdoors', '', 'SunExposed', 'WindExposed', '0.5000000', '4', '0', '0', '3.048000', '0', '0', '0', '6.096000', '0', '0', '6.096000', '0', '3.048000' ]) # test bunch_subclass.BadEPFieldError with pytest.raises(bunch_subclass.BadEPFieldError): bwall.Name_atypo = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall.Name_atypo with pytest.raises(bunch_subclass.BadEPFieldError): bwall["Name_atypo"] = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall["Name_atypo"] # test where constr["obj"] has to be extended # more items are added to an extendible field constr_i = dtls.index('Construction'.upper()) constrkey = 'Construction'.upper() constridd = commdct[constr_i] dconstrs = ddtt[constrkey] dconstr = dconstrs[0] constrfields = [comm.get('field') for comm in commdct[constr_i]] constrfields[0] = ['key'] constrfields = [field[0] for field in constrfields] constr_fields = [ bunchhelpers.makefieldname(field) for field in constrfields ] bconstr = EpBunch(dconstr, constr_fields, constridd) assert bconstr.Name == "Dbl Clr 3mm/13mm Air" bconstr.Layer_4 = "butter" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter' ] bconstr.Layer_7 = "cheese" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter', '', '', 'cheese' ] bconstr["Layer_8"] = "jam" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter', '', '', 'cheese', 'jam' ] # retrieve a valid field that has no value assert bconstr.Layer_10 == '' assert bconstr["Layer_10"] == ''
def test_EpBunch(): """py.test for EpBunch""" iddfile = StringIO(iddtxt) fname = StringIO(idftxt) block, data, commdct, idd_index = readidf.readdatacommdct1(fname, iddfile=iddfile) # setup code walls - can be generic for any object ddtt = data.dt dtls = data.dtls wall_i = dtls.index("BuildingSurface:Detailed".upper()) wallkey = "BuildingSurface:Detailed".upper() wallidd = commdct[wall_i] dwalls = ddtt[wallkey] dwall = dwalls[0] wallfields = [comm.get("field") for comm in commdct[wall_i]] wallfields[0] = ["key"] wallfields = [field[0] for field in wallfields] wall_fields = [bunchhelpers.makefieldname(field) for field in wallfields] assert wall_fields[:20] == [ "key", "Name", "Surface_Type", "Construction_Name", "Zone_Name", "Outside_Boundary_Condition", "Outside_Boundary_Condition_Object", "Sun_Exposure", "Wind_Exposure", "View_Factor_to_Ground", "Number_of_Vertices", "Vertex_1_Xcoordinate", "Vertex_1_Ycoordinate", "Vertex_1_Zcoordinate", "Vertex_2_Xcoordinate", "Vertex_2_Ycoordinate", "Vertex_2_Zcoordinate", "Vertex_3_Xcoordinate", "Vertex_3_Ycoordinate", "Vertex_3_Zcoordinate", ] bwall = EpBunch(dwall, wall_fields, wallidd) # print bwall.Name # print data.dt[wallkey][0][1] assert bwall.Name == data.dt[wallkey][0][1] bwall.Name = "Gumby" # print bwall.Name # print data.dt[wallkey][0][1] # print assert bwall.Name == data.dt[wallkey][0][1] # set aliases bwall.__aliases = {"Constr": "Construction_Name"} # print "wall.Construction_Name = %s" % (bwall.Construction_Name, ) # print "wall.Constr = %s" % (bwall.Constr, ) # print assert bwall.Construction_Name == bwall.Constr # print "change wall.Constr" bwall.Constr = "AnewConstr" # print "wall.Constr = %s" % (bwall.Constr, ) # print "wall.Constr = %s" % (data.dt[wallkey][0][3], ) # print assert bwall.Constr == data.dt[wallkey][0][3] # add functions bwall.__functions = {"svalues": bunch_subclass.somevalues} assert "svalues" in bwall.__functions # print bwall.svalues assert bwall.svalues == ( "Gumby", "AnewConstr", [ "BuildingSurface:Detailed", "Gumby", "Wall", "AnewConstr", "West Zone", "Outdoors", "", "SunExposed", "WindExposed", "0.5000000", "4", "0", "0", "3.048000", "0", "0", "0", "6.096000", "0", "0", "6.096000", "0", "3.048000", ], ) # print bwall.__functions # test __getitem__ assert bwall["Name"] == data.dt[wallkey][0][1] # test __setitem__ newname = "loofah" bwall["Name"] = newname assert bwall.Name == newname assert bwall["Name"] == newname assert data.dt[wallkey][0][1] == newname # test functions and alias again assert bwall.Constr == data.dt[wallkey][0][3] assert bwall.svalues == ( newname, "AnewConstr", [ "BuildingSurface:Detailed", newname, "Wall", "AnewConstr", "West Zone", "Outdoors", "", "SunExposed", "WindExposed", "0.5000000", "4", "0", "0", "3.048000", "0", "0", "0", "6.096000", "0", "0", "6.096000", "0", "3.048000", ], ) # test bunch_subclass.BadEPFieldError with pytest.raises(bunch_subclass.BadEPFieldError): bwall.Name_atypo = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall.Name_atypo with pytest.raises(bunch_subclass.BadEPFieldError): bwall["Name_atypo"] = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall["Name_atypo"] # test where constr["obj"] has to be extended # more items are added to an extendible field constr_i = dtls.index("Construction".upper()) constrkey = "Construction".upper() constridd = commdct[constr_i] dconstrs = ddtt[constrkey] dconstr = dconstrs[0] constrfields = [comm.get("field") for comm in commdct[constr_i]] constrfields[0] = ["key"] constrfields = [field[0] for field in constrfields] constr_fields = [bunchhelpers.makefieldname(field) for field in constrfields] bconstr = EpBunch(dconstr, constr_fields, constridd) assert bconstr.Name == "Dbl Clr 3mm/13mm Air" bconstr.Layer_4 = "butter" assert bconstr.obj == [ "Construction", "Dbl Clr 3mm/13mm Air", "CLEAR 3MM", "AIR 13MM", "CLEAR 3MM", "butter", ] bconstr.Layer_7 = "cheese" assert bconstr.obj == [ "Construction", "Dbl Clr 3mm/13mm Air", "CLEAR 3MM", "AIR 13MM", "CLEAR 3MM", "butter", "", "", "cheese", ] bconstr["Layer_8"] = "jam" assert bconstr.obj == [ "Construction", "Dbl Clr 3mm/13mm Air", "CLEAR 3MM", "AIR 13MM", "CLEAR 3MM", "butter", "", "", "cheese", "jam", ] # retrieve a valid field that has no value assert bconstr.Layer_10 == "" assert bconstr["Layer_10"] == ""
def test_EpBunch(): """py.test for EpBunch""" iddfile = StringIO(iddtxt) fname = StringIO(idftxt) block, data, commdct, idd_index = readidf.readdatacommdct1(fname, iddfile=iddfile) # setup code walls - can be generic for any object ddtt = data.dt dtls = data.dtls wall_i = dtls.index('BuildingSurface:Detailed'.upper()) wallkey = 'BuildingSurface:Detailed'.upper() wallidd = commdct[wall_i] dwalls = ddtt[wallkey] dwall = dwalls[0] wallfields = [comm.get('field') for comm in commdct[wall_i]] wallfields[0] = ['key'] wallfields = [field[0] for field in wallfields] wall_fields = [bunchhelpers.makefieldname(field) for field in wallfields] assert wall_fields[:20] == [ 'key', 'Name', 'Surface_Type', 'Construction_Name', 'Zone_Name', 'Outside_Boundary_Condition', 'Outside_Boundary_Condition_Object', 'Sun_Exposure', 'Wind_Exposure', 'View_Factor_to_Ground', 'Number_of_Vertices', 'Vertex_1_Xcoordinate', 'Vertex_1_Ycoordinate', 'Vertex_1_Zcoordinate', 'Vertex_2_Xcoordinate', 'Vertex_2_Ycoordinate', 'Vertex_2_Zcoordinate', 'Vertex_3_Xcoordinate', 'Vertex_3_Ycoordinate', 'Vertex_3_Zcoordinate'] bwall = EpBunch(dwall, wall_fields, wallidd) # print bwall.Name # print data.dt[wallkey][0][1] assert bwall.Name == data.dt[wallkey][0][1] bwall.Name = 'Gumby' # print bwall.Name # print data.dt[wallkey][0][1] # print assert bwall.Name == data.dt[wallkey][0][1] # set aliases bwall.__aliases = {'Constr':'Construction_Name'} # print "wall.Construction_Name = %s" % (bwall.Construction_Name, ) # print "wall.Constr = %s" % (bwall.Constr, ) # print assert bwall.Construction_Name == bwall.Constr # print "change wall.Constr" bwall.Constr = 'AnewConstr' # print "wall.Constr = %s" % (bwall.Constr, ) # print "wall.Constr = %s" % (data.dt[wallkey][0][3], ) # print assert bwall.Constr == data.dt[wallkey][0][3] # add functions bwall.__functions = {'svalues':bunch_subclass.somevalues} assert 'svalues' in bwall.__functions # print bwall.svalues assert bwall.svalues == ( 'Gumby', 'AnewConstr', [ 'BuildingSurface:Detailed', 'Gumby', 'Wall', 'AnewConstr', 'West Zone', 'Outdoors', '', 'SunExposed', 'WindExposed', '0.5000000', '4', '0', '0', '3.048000', '0', '0', '0', '6.096000', '0', '0', '6.096000', '0', '3.048000']) # print bwall.__functions # test __getitem__ assert bwall["Name"] == data.dt[wallkey][0][1] # test __setitem__ newname = "loofah" bwall["Name"] = newname assert bwall.Name == newname assert bwall["Name"] == newname assert data.dt[wallkey][0][1] == newname # test functions and alias again assert bwall.Constr == data.dt[wallkey][0][3] assert bwall.svalues == ( newname, 'AnewConstr', [ 'BuildingSurface:Detailed', newname, 'Wall', 'AnewConstr', 'West Zone', 'Outdoors', '', 'SunExposed', 'WindExposed', '0.5000000', '4', '0', '0', '3.048000', '0', '0', '0', '6.096000', '0', '0', '6.096000', '0', '3.048000']) # test bunch_subclass.BadEPFieldError with pytest.raises(bunch_subclass.BadEPFieldError): bwall.Name_atypo = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall.Name_atypo with pytest.raises(bunch_subclass.BadEPFieldError): bwall["Name_atypo"] = "newname" with pytest.raises(bunch_subclass.BadEPFieldError): thename = bwall["Name_atypo"] # test where constr["obj"] has to be extended # more items are added to an extendible field constr_i = dtls.index('Construction'.upper()) constrkey = 'Construction'.upper() constridd = commdct[constr_i] dconstrs = ddtt[constrkey] dconstr = dconstrs[0] constrfields = [comm.get('field') for comm in commdct[constr_i]] constrfields[0] = ['key'] constrfields = [field[0] for field in constrfields] constr_fields = [bunchhelpers.makefieldname(field) for field in constrfields] bconstr = EpBunch(dconstr, constr_fields, constridd) assert bconstr.Name == "Dbl Clr 3mm/13mm Air" bconstr.Layer_4 = "butter" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter'] bconstr.Layer_7 = "cheese" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter', '', '', 'cheese'] bconstr["Layer_8"] = "jam" assert bconstr.obj == [ 'Construction', 'Dbl Clr 3mm/13mm Air', 'CLEAR 3MM', 'AIR 13MM', 'CLEAR 3MM', 'butter', '', '', 'cheese', 'jam'] # retrieve a valid field that has no value assert bconstr.Layer_10 == '' assert bconstr["Layer_10"] == ''