log exceptions on get_info method

these exceptions currently are actively being hidden, which is
intransparent / could make debugging challenging

improved formatting tot pep8
This commit is contained in:
Jelle Feringa
2017-01-04 09:15:52 +01:00
committed by Thomas Krijnen
parent 37905c6725
commit 5d6160b47a
@@ -17,47 +17,65 @@
# # # #
############################################################################### ###############################################################################
import numbers
import functools import functools
import numbers
import logging
import itertools import itertools
from . import ifcopenshell_wrapper from . import ifcopenshell_wrapper
log = logging.getLogger(__name__)
class entity_instance(object): class entity_instance(object):
def __init__(self, e): def __init__(self, e):
super(entity_instance, self).__setattr__('wrapped_data', e) super(entity_instance, self).__setattr__('wrapped_data', e)
def __getattr__(self, name): def __getattr__(self, name):
INVALID, FORWARD, INVERSE = range(3) INVALID, FORWARD, INVERSE = range(3)
attr_cat = self.wrapped_data.get_attribute_category(name) attr_cat = self.wrapped_data.get_attribute_category(name)
if attr_cat == FORWARD: if attr_cat == FORWARD:
return entity_instance.wrap_value(self.wrapped_data.get_argument(self.wrapped_data.get_argument_index(name))) return entity_instance.wrap_value(
self.wrapped_data.get_argument(self.wrapped_data.get_argument_index(name)))
elif attr_cat == INVERSE: elif attr_cat == INVERSE:
return entity_instance.wrap_value(self.wrapped_data.get_inverse(name)) return entity_instance.wrap_value(self.wrapped_data.get_inverse(name))
else: raise AttributeError("entity instance of type '%s' has no attribute '%s'"%(self.wrapped_data.is_a(), name)) else:
raise AttributeError(
"entity instance of type '%s' has no attribute '%s'" % (self.wrapped_data.is_a(), name))
@staticmethod @staticmethod
def walk(f, g, value): def walk(f, g, value):
if isinstance(value, (tuple, list)): return tuple(map(functools.partial(entity_instance.walk, f, g), value)) if isinstance(value, (tuple, list)):
elif f(value): return g(value) return tuple(map(functools.partial(entity_instance.walk, f, g), value))
else: return value elif f(value):
return g(value)
else:
return value
@staticmethod @staticmethod
def wrap_value(v): def wrap_value(v):
wrap = lambda e: entity_instance(e) wrap = lambda e: entity_instance(e)
is_instance = lambda e: isinstance(e, ifcopenshell_wrapper.entity_instance) is_instance = lambda e: isinstance(e, ifcopenshell_wrapper.entity_instance)
return entity_instance.walk(is_instance, wrap, v) return entity_instance.walk(is_instance, wrap, v)
@staticmethod @staticmethod
def unwrap_value(v): def unwrap_value(v):
unwrap = lambda e: e.wrapped_data unwrap = lambda e: e.wrapped_data
is_instance = lambda e: isinstance(e, entity_instance) is_instance = lambda e: isinstance(e, entity_instance)
return entity_instance.walk(is_instance, unwrap, v) return entity_instance.walk(is_instance, unwrap, v)
def attribute_type(self, attr): def attribute_type(self, attr):
attr_idx = attr if isinstance(attr, numbers.Integral) else self.wrapped_data.get_argument_index(attr) attr_idx = attr if isinstance(attr, numbers.Integral) else self.wrapped_data.get_argument_index(attr)
return self.wrapped_data.get_argument_type(attr_idx) return self.wrapped_data.get_argument_type(attr_idx)
def attribute_name(self, attr_idx): def attribute_name(self, attr_idx):
return self.wrapped_data.get_argument_name(attr_idx) return self.wrapped_data.get_argument_name(attr_idx)
def __setattr__(self, key, value): def __setattr__(self, key, value):
self[self.wrapped_data.get_argument_index(key)] = value self[self.wrapped_data.get_argument_index(key)] = value
def __getitem__(self, key): def __getitem__(self, key):
return entity_instance.wrap_value(self.wrapped_data.get_argument(key)) return entity_instance.wrap_value(self.wrapped_data.get_argument(key))
def __setitem__(self, idx, value): def __setitem__(self, idx, value):
if value is None: if value is None:
self.wrapped_data.setArgumentAsNull(idx) self.wrapped_data.setArgumentAsNull(idx)
@@ -67,35 +85,49 @@ class entity_instance(object):
attr_type = attr_type.replace('Enumeration', 'String') attr_type = attr_type.replace('Enumeration', 'String')
try: try:
if isinstance(value, unicode): value = value.encode("utf-8") if isinstance(value, unicode): value = value.encode("utf-8")
except: pass except:
pass
getattr(self.wrapped_data, "setArgumentAs%s" % attr_type)(idx, entity_instance.unwrap_value(value)) getattr(self.wrapped_data, "setArgumentAs%s" % attr_type)(idx, entity_instance.unwrap_value(value))
return value return value
def __len__(self): return len(self.wrapped_data)
def __repr__(self): return repr(self.wrapped_data) def __len__(self):
def is_a(self, *args): return self.wrapped_data.is_a(*args) return len(self.wrapped_data)
def id(self): return self.wrapped_data.id()
def __repr__(self):
return repr(self.wrapped_data)
def is_a(self, *args):
return self.wrapped_data.is_a(*args)
def id(self):
return self.wrapped_data.id()
def __eq__(self, other): def __eq__(self, other):
if type(self) != type(other): return False if type(self) != type(other): return False
return self.wrapped_data == other.wrapped_data return self.wrapped_data == other.wrapped_data
def __hash__(self): def __hash__(self):
return hash((self.id(), self.wrapped_data.file_pointer())) return hash((self.id(), self.wrapped_data.file_pointer()))
def __dir__(self): def __dir__(self):
return sorted(set(itertools.chain( return sorted(set(itertools.chain(
dir(type(self)), dir(type(self)),
self.wrapped_data.get_attribute_names(), self.wrapped_data.get_attribute_names(),
self.wrapped_data.get_inverse_attribute_names() self.wrapped_data.get_inverse_attribute_names()
))) )))
def get_info(self): def get_info(self):
_info = {} _info = {}
try: try:
_info["id"] = self.id() _info["id"] = self.id()
_info["type"] = self.is_a() _info["type"] = self.is_a()
except: except:
pass log.exception("unhandled exception while getting id / type info on {}".format(self))
for i in range(len(self)): for i in range(len(self)):
try: try:
_info[self.attribute_name(i)] = self[i] _info[self.attribute_name(i)] = self[i]
except: except:
pass log.exception("unhandled exception occured setting attribute name for {}".format(self))
return _info return _info
__dict__ = property(get_info)
__dict__ = property(get_info)