Fix rule compilation regarding indeterminate #7529

This commit is contained in:
Thomas Krijnen
2026-01-23 14:35:23 +01:00
parent cc542ad074
commit 1137e7b77b
13 changed files with 23406 additions and 23359 deletions
@@ -750,6 +750,14 @@ class AttributeGetattrTransformer(ast.NodeTransformer):
if node.attr == "create_entity":
return node
if node.attr.startswith("__"):
return node
# Don't rewrite at module scope (top-level, no indent)
enclosing_stmt = next((p for p in parents if isinstance(p, ast.stmt)), None)
if enclosing_stmt is not None and isinstance(getattr(enclosing_stmt, "parent", None), ast.Module):
return node
new_value = self.visit(node.value)
# Replace the Attribute node with a call to the built-in `getattr` function
@@ -842,18 +850,21 @@ if __name__ == "__main__":
print(
"""
def is_indeterminate(v):
return v is None or type(v).__name__ == 'indeterminate_type'
def exists(v):
if callable(v):
try: return v() is not None
except IndexError as e: return False
else: return v is not None
else: return not is_indeterminate(v)
""",
"\n",
file=output,
sep="\n",
)
print(
"def nvl(v, default): return v if v is not None else default",
"def nvl(v, default): return v if not is_indeterminate(v) else default",
"\n",
file=output,
sep="\n",
@@ -871,14 +882,14 @@ def is_entity(inst):
def express_len(v):
if isinstance(v, ifcopenshell.entity_instance) and not is_entity(v):
v = v[0]
elif v is None or v is INDETERMINATE:
elif is_indeterminate(v):
return INDETERMINATE
return len(v)
old_range = range
def range(*args):
if INDETERMINATE in args:
if any(map(is_indeterminate, args)):
return
yield from old_range(*args)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff