complete test and correct errors in construction catalog

This commit is contained in:
Guille Gutierrez 2022-04-11 12:37:46 -04:00
parent 6b86dae410
commit d7f1b46cf5
6 changed files with 120 additions and 68 deletions

View File

@ -10,7 +10,6 @@ class Catalog:
Catalogs base class not implemented instance of the Catalog base class, catalogs will inherit from this class. Catalogs base class not implemented instance of the Catalog base class, catalogs will inherit from this class.
""" """
@property
def names(self, category=None): def names(self, category=None):
""" """
Base property to return the catalog entries names Base property to return the catalog entries names

View File

@ -22,41 +22,52 @@ class NrelCatalog(Catalog):
archetypes_path = str(Path(path / 'us_archetypes.xml').resolve()) archetypes_path = str(Path(path / 'us_archetypes.xml').resolve())
constructions_path = str(Path(path / 'us_constructions.xml').resolve()) constructions_path = str(Path(path / 'us_constructions.xml').resolve())
with open(constructions_path) as xml: with open(constructions_path) as xml:
self._constructions = xmltodict.parse(xml.read(), force_list=('material', 'window', 'construction')) self._constructions = xmltodict.parse(xml.read(), force_list=('material', 'window', 'construction', 'layer'))
with open(archetypes_path) as xml: with open(archetypes_path) as xml:
self._archetypes = xmltodict.parse(xml.read(), force_list=('archetype', 'construction')) self._archetypes = xmltodict.parse(xml.read(), force_list=('archetype', 'construction'))
self._catalog_windows = [] self._catalog_windows = self._load_windows()
self._catalog_materials = [] self._catalog_materials = self._load_materials()
self._catalog_constructions = [] self._catalog_constructions = self._load_constructions()
self._catalog_archetypes = [] self._catalog_archetypes = self._load_archetypes()
# store the full catalog data model in self._content
self._content = Content(self._catalog_archetypes,
self._catalog_constructions,
self._catalog_materials,
self._catalog_windows)
def _load_windows(self):
_catalog_windows = []
windows = self._constructions['library']['windows']['window'] windows = self._constructions['library']['windows']['window']
for window in windows: for window in windows:
frame_ratio = window['frame_ratio'] frame_ratio = window['frame_ratio']['#text']
g_value = window['shgc'] g_value = window['shgc']
overall_u_value = float(window['conductivity']) / float(window['thickness']) overall_u_value = float(window['conductivity']['#text']) / float(window['thickness']['#text'])
construction_name = window['@name'] name = window['@name']
self._catalog_windows.append(Window(frame_ratio, g_value, overall_u_value, construction_name)) _catalog_windows.append(Window(frame_ratio, g_value, overall_u_value, name))
return _catalog_windows
def _load_materials(self):
_catalog_materials = []
materials = self._constructions['library']['materials']['material'] materials = self._constructions['library']['materials']['material']
for material in materials: for material in materials:
material_id = material['@id'] material_id = material['@id']
name = material['@name'] name = material['@name']
solar_absorptance = material['solar_absorptance'] solar_absorptance = material['solar_absorptance']['#text']
thermal_absorptance = material['thermal_absorptance'] thermal_absorptance = material['thermal_absorptance']['#text']
visible_absorptance = material['visible_absorptance'] visible_absorptance = material['visible_absorptance']['#text']
no_mass = True no_mass = True
thermal_resistance = None, thermal_resistance = None,
conductivity = None, conductivity = None,
density = None, density = None,
specific_heat = None specific_heat = None
if material['no_mass'] == 'true': if 'no_mass' in material and material['no_mass'] == 'true':
no_mass = True no_mass = True
thermal_resistance = material['thermal_resistance'] thermal_resistance = material['thermal_resistance']['#text']
else: else:
conductivity = material['conductivity'] conductivity = material['conductivity']['#text']
density = material['density'] density = material['density']['#text']
specific_heat = material['specific_heat'] specific_heat = material['specific_heat']['#text']
_material = Material(material_id, _material = Material(material_id,
name, name,
solar_absorptance, solar_absorptance,
@ -67,8 +78,11 @@ class NrelCatalog(Catalog):
conductivity, conductivity,
density, density,
specific_heat) specific_heat)
self._catalog_materials.append(_material) _catalog_materials.append(_material)
return _catalog_materials
def _load_constructions(self):
_catalog_constructions = []
constructions = self._constructions['library']['constructions']['construction'] constructions = self._constructions['library']['constructions']['construction']
for construction in constructions: for construction in constructions:
construction_id = construction['@id'] construction_id = construction['@id']
@ -77,32 +91,37 @@ class NrelCatalog(Catalog):
layers = [] layers = []
for layer in construction['layers']['layer']: for layer in construction['layers']['layer']:
layer_id = layer['@id'] layer_id = layer['@id']
name = layer['@name'] layer_name = layer['@name']
material_id = layer['material'] material_id = layer['material']
thickness = layer['thickness'] thickness = 0
for material in self._materials: if 'thickness' in layer:
thickness = layer['thickness']['#text']
for material in self._catalog_materials:
if material_id == material.id: if material_id == material.id:
layers.append(Layer(layer_id, name, material, thickness)) layers.append(Layer(layer_id, layer_name, material, thickness))
break break
self._catalog_constructions.append(Construction(construction_id, construction_type, name, layers)) _catalog_constructions.append(Construction(construction_id, construction_type, name, layers))
return _catalog_constructions
def _load_archetypes(self):
_catalog_archetypes = []
archetypes = self._archetypes['archetypes']['archetype'] archetypes = self._archetypes['archetypes']['archetype']
for archetype in archetypes: for archetype in archetypes:
archetype_id = archetype['@id'] archetype_id = archetype['@id']
function = nrel_to_function[archetype['@building_type']] function = nrel_to_function[archetype['@building_type']]
construction_period = reference_standard_to_construction_period[archetype['reference_standard']] construction_period = reference_standard_to_construction_period[archetype['@reference_standard']]
average_storey_height = archetype['average_storey_height'] average_storey_height = archetype['average_storey_height']['#text']
number_of_storeys = archetype['number_of_storeys'] number_of_storeys = archetype['number_of_storeys']['#text']
thermal_capacity = archetype['thermal_capacity'] thermal_capacity = archetype['thermal_capacity']['#text']
extra_loses_due_to_thermal_bridges = archetype['extra_loses_due_to_thermal_bridges'] extra_loses_due_to_thermal_bridges = archetype['extra_loses_due_to_thermal_bridges']['#text']
indirect_heated_ratio = archetype['indirect_heated_ratio'] indirect_heated_ratio = archetype['indirect_heated_ratio']['#text']
infiltration_rate_for_ventilation_system_off = archetype['infiltration_rate_for_ventilation_system_off'] infiltration_rate_for_ventilation_system_off = archetype['infiltration_rate_for_ventilation_system_off']['#text']
infiltration_rate_for_ventilation_system_on = archetype['infiltration_rate_for_ventilation_system_on'] infiltration_rate_for_ventilation_system_on = archetype['infiltration_rate_for_ventilation_system_on']['#text']
archetype_constructions = [] archetype_constructions = []
for archetype_construction in archetype['constructions']['construction']: for archetype_construction in archetype['constructions']['construction']:
for construction in self._constructions: for construction in self._catalog_constructions:
if construction.id == archetype_construction['@id']: if construction.id == archetype_construction['@id']:
window_ratio = archetype_construction['window_ratio'] window_ratio = archetype_construction['window_ratio']['#text']
window = archetype_construction['window'] window = archetype_construction['window']
_construction = Construction(construction.id, _construction = Construction(construction.id,
construction.type, construction.type,
@ -111,7 +130,7 @@ class NrelCatalog(Catalog):
window_ratio, window_ratio,
window) window)
archetype_constructions.append(_construction) archetype_constructions.append(_construction)
self._catalog_archetypes.append(Archetype(archetype_id, _catalog_archetypes.append(Archetype(archetype_id,
function, function,
archetype_constructions, archetype_constructions,
construction_period, construction_period,
@ -122,14 +141,8 @@ class NrelCatalog(Catalog):
indirect_heated_ratio, indirect_heated_ratio,
infiltration_rate_for_ventilation_system_off, infiltration_rate_for_ventilation_system_off,
infiltration_rate_for_ventilation_system_on)) infiltration_rate_for_ventilation_system_on))
return _catalog_archetypes
# store the full catalog data model in self._content
self._content = Content(self._catalog_archetypes,
self._catalog_constructions,
self._catalog_materials,
self._catalog_windows)
@property
def names(self, category=None): def names(self, category=None):
""" """
Get the catalog elements names Get the catalog elements names

View File

@ -8,7 +8,7 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from catalogs.construction.nrel_catalog import NrelCatalog from catalogs.construction.nrel_catalog import NrelCatalog
from catalogs.construction.nrcan_catalog import NrcanCatalog # from catalogs.construction.nrcan_catalog import NrcanCatalog
Catalog = TypeVar('Catalog') Catalog = TypeVar('Catalog')
class ConstructionCatalogFactory: class ConstructionCatalogFactory:
@ -28,7 +28,7 @@ class ConstructionCatalogFactory:
""" """
Retrieve NRCAN catalog Retrieve NRCAN catalog
""" """
return NrcanCatalog(self._city, self._base_path) # return NrcanCatalog(self._city, self._base_path)
@property @property
def catalog(self) -> Catalog: def catalog(self) -> Catalog:
@ -37,3 +37,11 @@ class ConstructionCatalogFactory:
:return: Catalog :return: Catalog
""" """
return getattr(self, self._catalog_type, lambda: None) return getattr(self, self._catalog_type, lambda: None)
@property
def catalog_debug(self) -> Catalog:
"""
Enrich the city given to the class using the class given handler
:return: Catalog
"""
return NrelCatalog(self._path)

View File

@ -6,11 +6,19 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
class Window: class Window:
def __init__(self, frame_ratio, g_value, overall_u_value, construction_name): def __init__(self, frame_ratio, g_value, overall_u_value, name):
self._frame_ratio = frame_ratio self._frame_ratio = frame_ratio
self._g_value = g_value self._g_value = g_value
self._overall_u_value = overall_u_value self._overall_u_value = overall_u_value
self._construction_name = construction_name self._name = name
@property
def name(self):
"""
Get window name
:return: str
"""
return self._name
@property @property
def frame_ratio(self): def frame_ratio(self):
@ -35,11 +43,3 @@ class Window:
:return: float :return: float
""" """
return self._overall_u_value return self._overall_u_value
@property
def construction_name(self):
"""
Get thermal opening construction name
:return: str
"""
return self._construction_name

View File

@ -0,0 +1,33 @@
"""
TestConstructionCatalog
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
"""
from unittest import TestCase
from catalogs.construction_catalog_factory import ConstructionCatalogFactory
class TestConstructionCatalog(TestCase):
def test_nrel_catalog(self):
catalog = ConstructionCatalogFactory('nrel').catalog_debug
catalog_categories = catalog.names()
constructions = catalog.names('constructions')
windows = catalog.names('windows')
materials = catalog.names('materials')
self.assertTrue(len(constructions['constructions']), 24)
self.assertTrue(len(windows['windows']), 4)
self.assertTrue(len(materials['materials']), 19)
with self.assertRaises(ValueError):
catalog.names('unknown')
# retrieving all the entries should not raise any exceptions
for category in catalog_categories:
for value in catalog_categories[category]:
catalog.get_entry(value)
with self.assertRaises(IndexError):
catalog.get_entry('unknown')

View File

@ -6,13 +6,12 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
from unittest import TestCase from unittest import TestCase
from catalogs.greenery_catalog_factory import GreeneryCatalogFactory from catalogs.greenery_catalog_factory import GreeneryCatalogFactory
class TestGreeneryCatalog(TestCase): class TestGreeneryCatalog(TestCase):
def test_catalog(self): def test_catalog(self):
catalog = GreeneryCatalogFactory('nrel').catalog_debug catalog = GreeneryCatalogFactory('nrel').catalog
catalog_categories = catalog.names() catalog_categories = catalog.names()
vegetations = catalog.names('vegetations') vegetations = catalog.names('vegetations')
plants = catalog.names('plants') plants = catalog.names('plants')