mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 09:32:37 +00:00
ifcopenshell.validate - check json_logger more explicitly
This commit is contained in:
@@ -301,7 +301,7 @@ def assert_valid(
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def log_internal_cpp_errors(f: ifcopenshell.file, filename: str, logger: Logger) -> None:
|
def log_internal_cpp_errors(f: ifcopenshell.file, filename: str, logger: Union[Logger, json_logger]) -> None:
|
||||||
import re
|
import re
|
||||||
import bisect
|
import bisect
|
||||||
|
|
||||||
@@ -325,7 +325,7 @@ def log_internal_cpp_errors(f: ifcopenshell.file, filename: str, logger: Logger)
|
|||||||
line = lines[bisect.bisect_left(cs, int(offsets[0]))].decode("ascii", errors="ignore").rstrip()
|
line = lines[bisect.bisect_left(cs, int(offsets[0]))].decode("ascii", errors="ignore").rstrip()
|
||||||
m = chr_offset_re.sub("", msg["message"])
|
m = chr_offset_re.sub("", msg["message"])
|
||||||
|
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", line)
|
logger.set_state("instance", line)
|
||||||
logger.set_state("attribute", None)
|
logger.set_state("attribute", None)
|
||||||
logger.error("%s:\n\n%s" % (m, line))
|
logger.error("%s:\n\n%s" % (m, line))
|
||||||
@@ -341,7 +341,7 @@ def log_internal_cpp_errors(f: ifcopenshell.file, filename: str, logger: Logger)
|
|||||||
inst = f[int(instid[0])]
|
inst = f[int(instid[0])]
|
||||||
except:
|
except:
|
||||||
inst = None
|
inst = None
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", inst)
|
logger.set_state("instance", inst)
|
||||||
logger.set_state("attribute", None)
|
logger.set_state("attribute", None)
|
||||||
logger.error(m)
|
logger.error(m)
|
||||||
@@ -368,7 +368,7 @@ def get_entity_attributes(schema: schema_definition, entity: str) -> tuple[entit
|
|||||||
return entity_attrs
|
return entity_attrs
|
||||||
|
|
||||||
|
|
||||||
def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=False) -> None:
|
def validate(f: Union[ifcopenshell.file, str], logger: Union[Logger, json_logger], express_rules=False) -> None:
|
||||||
"""
|
"""
|
||||||
For an IFC population model `f` (or filepath to such a file) validate whether the entity attribute values are correctly supplied. As this
|
For an IFC population model `f` (or filepath to such a file) validate whether the entity attribute values are correctly supplied. As this
|
||||||
is a function that is applied after a file has been parsed, certain types of errors in syntax, duplicate
|
is a function that is applied after a file has been parsed, certain types of errors in syntax, duplicate
|
||||||
@@ -406,7 +406,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
|
|
||||||
filename = None
|
filename = None
|
||||||
|
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("type", "schema")
|
logger.set_state("type", "schema")
|
||||||
|
|
||||||
if not isinstance(f, ifcopenshell.file):
|
if not isinstance(f, ifcopenshell.file):
|
||||||
@@ -441,7 +441,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
used_guids: dict[str, ifcopenshell.entity_instance] = dict()
|
used_guids: dict[str, ifcopenshell.entity_instance] = dict()
|
||||||
|
|
||||||
for inst in f:
|
for inst in f:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", inst)
|
logger.set_state("instance", inst)
|
||||||
|
|
||||||
guid: Union[str, None, EllipsisType]
|
guid: Union[str, None, EllipsisType]
|
||||||
@@ -476,7 +476,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
|
|
||||||
if entity.is_abstract():
|
if entity.is_abstract():
|
||||||
e = "Entity %s is abstract" % entity.name()
|
e = "Entity %s is abstract" % entity.name()
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", None)
|
logger.set_state("attribute", None)
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
else:
|
else:
|
||||||
@@ -489,7 +489,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
values[i] = inst[i]
|
values[i] = inst[i]
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", f"{entity.name()}.{attrs[i].name()}")
|
logger.set_state("attribute", f"{entity.name()}.{attrs[i].name()}")
|
||||||
logger.error("Invalid attribute value")
|
logger.error("Invalid attribute value")
|
||||||
else:
|
else:
|
||||||
@@ -505,7 +505,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
if not has_invalid_value:
|
if not has_invalid_value:
|
||||||
for i, (attr, val, is_derived) in enumerate(zip(attrs, values, entity.derived())):
|
for i, (attr, val, is_derived) in enumerate(zip(attrs, values, entity.derived())):
|
||||||
if is_derived and not isinstance(val, ifcopenshell.ifcopenshell_wrapper.attribute_value_derived):
|
if is_derived and not isinstance(val, ifcopenshell.ifcopenshell_wrapper.attribute_value_derived):
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
||||||
logger.error("Attribute is derived in subtype")
|
logger.error("Attribute is derived in subtype")
|
||||||
else:
|
else:
|
||||||
@@ -517,7 +517,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
)
|
)
|
||||||
|
|
||||||
if val is None and not attr.optional() and not is_derived:
|
if val is None and not attr.optional() and not is_derived:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
||||||
logger.error("Attribute not optional")
|
logger.error("Attribute not optional")
|
||||||
else:
|
else:
|
||||||
@@ -533,7 +533,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
try:
|
try:
|
||||||
assert_valid(attr_type, val, schema, attr=attr)
|
assert_valid(attr_type, val, schema, attr=attr)
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", e.attribute)
|
logger.set_state("attribute", e.attribute)
|
||||||
logger.error(str(e))
|
logger.error(str(e))
|
||||||
else:
|
else:
|
||||||
@@ -548,7 +548,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
try:
|
try:
|
||||||
val = getattr(inst, attr.name())
|
val = getattr(inst, attr.name())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
||||||
logger.error(str(e))
|
logger.error(str(e))
|
||||||
else:
|
else:
|
||||||
@@ -557,7 +557,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
try:
|
try:
|
||||||
assert_valid_inverse(attr, val, schema)
|
assert_valid_inverse(attr, val, schema)
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
logger.set_state("attribute", f"{entity.name()}.{attr.name()}")
|
||||||
logger.error(str(e))
|
logger.error(str(e))
|
||||||
else:
|
else:
|
||||||
@@ -575,7 +575,7 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal
|
|||||||
ifcopenshell.ifcopenshell_wrapper.set_feature("use_attribute_value_derived", attribute_value_derived_org)
|
ifcopenshell.ifcopenshell_wrapper.set_feature("use_attribute_value_derived", attribute_value_derived_org)
|
||||||
|
|
||||||
if express_rules:
|
if express_rules:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", None)
|
logger.set_state("instance", None)
|
||||||
logger.set_state("attribute", None)
|
logger.set_state("attribute", None)
|
||||||
ifcopenshell.express.rule_executor.run(f, logger)
|
ifcopenshell.express.rule_executor.run(f, logger)
|
||||||
@@ -616,7 +616,9 @@ def to_string_header_entity(header_entity):
|
|||||||
raise TypeError(f"Cannot stringify header_entity of type {type(header_entity)}")
|
raise TypeError(f"Cannot stringify header_entity of type {type(header_entity)}")
|
||||||
|
|
||||||
|
|
||||||
def validate_ifc_header(f: Union[ifcopenshell.file, ifcopenshell.simple_spf.file], logger: Logger) -> None:
|
def validate_ifc_header(
|
||||||
|
f: Union[ifcopenshell.file, ifcopenshell.simple_spf.file], logger: Union[Logger, json_logger]
|
||||||
|
) -> None:
|
||||||
header: Union[W.IfcSpfHeader, types.SimpleNamespace] = f.header
|
header: Union[W.IfcSpfHeader, types.SimpleNamespace] = f.header
|
||||||
AGGREGATE_TYPE = "LIST [ 1 : ? ] OF STRING (256)"
|
AGGREGATE_TYPE = "LIST [ 1 : ? ] OF STRING (256)"
|
||||||
STRING_TYPE = "STRING (256)"
|
STRING_TYPE = "STRING (256)"
|
||||||
@@ -677,7 +679,7 @@ def validate_ifc_header(f: Union[ifcopenshell.file, ifcopenshell.simple_spf.file
|
|||||||
validate_attribute(file_name, "authorization", 6)
|
validate_attribute(file_name, "authorization", 6)
|
||||||
|
|
||||||
|
|
||||||
def validate_ifc_applications(f: ifcopenshell.file, logger: Logger) -> None:
|
def validate_ifc_applications(f: ifcopenshell.file, logger: Union[Logger, json_logger]) -> None:
|
||||||
used_names: dict[str, ifcopenshell.entity_instance] = dict()
|
used_names: dict[str, ifcopenshell.entity_instance] = dict()
|
||||||
used_ids: dict[str, ifcopenshell.entity_instance] = dict()
|
used_ids: dict[str, ifcopenshell.entity_instance] = dict()
|
||||||
|
|
||||||
@@ -689,7 +691,7 @@ def validate_ifc_applications(f: ifcopenshell.file, logger: Logger) -> None:
|
|||||||
if app_name not in used_names:
|
if app_name not in used_names:
|
||||||
used_names[app_name] = inst
|
used_names[app_name] = inst
|
||||||
else:
|
else:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", inst)
|
logger.set_state("instance", inst)
|
||||||
rule = "Rule IfcApplication.UR2:\n The attribute ApplicationFullName should be unique"
|
rule = "Rule IfcApplication.UR2:\n The attribute ApplicationFullName should be unique"
|
||||||
previous_element = used_names[app_name]
|
previous_element = used_names[app_name]
|
||||||
@@ -706,7 +708,7 @@ def validate_ifc_applications(f: ifcopenshell.file, logger: Logger) -> None:
|
|||||||
if app_id not in used_ids:
|
if app_id not in used_ids:
|
||||||
used_ids[app_id] = inst
|
used_ids[app_id] = inst
|
||||||
else:
|
else:
|
||||||
if hasattr(logger, "set_state"):
|
if isinstance(logger, json_logger):
|
||||||
logger.set_state("instance", inst)
|
logger.set_state("instance", inst)
|
||||||
rule = "Rule IfcApplication.UR1:\n The attribute ApplicationIdentifier should be unique"
|
rule = "Rule IfcApplication.UR1:\n The attribute ApplicationIdentifier should be unique"
|
||||||
previous_element = used_ids[app_id]
|
previous_element = used_ids[app_id]
|
||||||
|
|||||||
Reference in New Issue
Block a user