downstream: logger: reuse logger_or_root, dedupe optional-logger-arg pattern

This commit is contained in:
Andrej730
2026-07-22 16:14:48 +05:00
parent d45174066f
commit 32f2dfd294
5 changed files with 72 additions and 17 deletions
@@ -96,7 +96,18 @@ from .file import rocksdb_lazy_instance
from .sql import sqlite, sqlite_entity from .sql import sqlite, sqlite_entity
get_log = ifcopenshell_wrapper.get_log get_log = ifcopenshell_wrapper.get_log
logger = getattr(ifcopenshell_wrapper, "logger", None) logger = ifcopenshell_wrapper.logger if hasattr(ifcopenshell_wrapper, "logger") else None
if hasattr(ifcopenshell_wrapper, "logger_or_root"):
logger_or_root = ifcopenshell_wrapper.logger_or_root
else:
def logger_or_root(_logger: ifcopenshell_wrapper.logger | None) -> None:
return None
# TODO: drop this function and all callsites after we migrate to the new build.
def optional_logger_args(logger: ifcopenshell_wrapper.logger | None) -> tuple[logger] | tuple[()]:
return (logger,) if logger is not None else ()
# explicitly specify available imported symbols # explicitly specify available imported symbols
# (it's a requirement for a typed library) # (it's a requirement for a typed library)
@@ -209,8 +220,7 @@ def open(
raise FileNotFoundError(f"Path does not exist: '{path}'.") raise FileNotFoundError(f"Path does not exist: '{path}'.")
if format is None: if format is None:
format = guess_format(path) format = guess_format(path)
if logger is None and (logger_type := getattr(ifcopenshell_wrapper, "logger", None)): logger = logger_or_root(logger)
logger = logger_type.root()
if format == ".ifcXML": if format == ".ifcXML":
f = ifcopenshell_wrapper.parse_ifcxml(str(path.absolute()), *((logger,) if logger is not None else ())) f = ifcopenshell_wrapper.parse_ifcxml(str(path.absolute()), *((logger,) if logger is not None else ()))
if f: if f:
@@ -229,11 +239,9 @@ def open(
if should_stream: if should_stream:
return stream(path) return stream(path)
if readonly: # Temporary conditional see #7131. Remove once newer builds don't segfault on Linux. if readonly: # Temporary conditional see #7131. Remove once newer builds don't segfault on Linux.
f = ifcopenshell_wrapper.open(str(path.absolute()), readonly, *((logger,) if logger is not None else ())) f = ifcopenshell_wrapper.open(str(path.absolute()), readonly, *optional_logger_args(logger))
elif bypass_types: elif bypass_types:
f = ifcopenshell_wrapper.file( f = ifcopenshell_wrapper.file(ifcopenshell_wrapper.uninitialized_tag(), *optional_logger_args(logger))
ifcopenshell_wrapper.uninitialized_tag(), *((logger,) if logger is not None else ())
)
for ty in bypass_types: for ty in bypass_types:
f.bypass_type(ty) f.bypass_type(ty)
if mmap: if mmap:
@@ -248,7 +256,7 @@ def open(
kwargs["logger"] = logger kwargs["logger"] = logger
f = ifcopenshell_wrapper.open(str(path.absolute()), **kwargs) # ty: ignore[unknown-argument] f = ifcopenshell_wrapper.open(str(path.absolute()), **kwargs) # ty: ignore[unknown-argument]
else: else:
f = ifcopenshell_wrapper.open(str(path.absolute()), False, *((logger,) if logger is not None else ())) f = ifcopenshell_wrapper.open(str(path.absolute()), False, *optional_logger_args(logger))
f.post_init() f.post_init()
+2 -3
View File
@@ -106,8 +106,7 @@ def main(
progress_function: Callable = DO_NOTHING, progress_function: Callable = DO_NOTHING,
logger=None, logger=None,
): ):
if logger is None and ifcopenshell.logger is not None: logger = ifcopenshell.logger_or_root(logger)
logger = ifcopenshell.logger.root()
def by_guid(g): def by_guid(g):
for f in files: for f in files:
@@ -533,7 +532,7 @@ def main(
arranged = W.arrange_polygons( arranged = W.arrange_polygons(
*filter(None, (ARRANGE_POLYGON_SETTINGS,)), *filter(None, (ARRANGE_POLYGON_SETTINGS,)),
polies, # ty: ignore[too-many-positional-arguments] polies, # ty: ignore[too-many-positional-arguments]
*((logger,) if logger is not None else ()), *ifcopenshell.optional_logger_args(logger),
) )
svg_data_3 = W.polygons_to_svg(arranged, False) svg_data_3 = W.polygons_to_svg(arranged, False)
dom3 = parseString(svg_data_3) dom3 = parseString(svg_data_3)
@@ -23,6 +23,8 @@ from collections.abc import Generator, Iterable
from os import PathLike, fspath from os import PathLike, fspath
from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union, cast, overload from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union, cast, overload
import ifcopenshell
from .. import ifcopenshell_wrapper, open from .. import ifcopenshell_wrapper, open
from .. import entity_instance from .. import entity_instance
from .. import file from .. import file
@@ -303,8 +305,7 @@ class iterator(ifcopenshell_wrapper.Iterator):
logger=None, logger=None,
): ):
self.settings = settings self.settings = settings
if logger is None and (logger_type := getattr(ifcopenshell_wrapper, "logger", None)): logger = ifcopenshell.logger_or_root(logger)
logger = logger_type.root()
if isinstance(file_or_filename, file): if isinstance(file_or_filename, file):
self.file = file self.file = file
file_or_filename = file_or_filename file_or_filename = file_or_filename
@@ -345,10 +346,10 @@ class iterator(ifcopenshell_wrapper.Iterator):
include is not None, include is not None,
num_threads, num_threads,
) )
self.this = initializer(*args, *((logger,) if logger is not None else ())) self.this = initializer(*args, *ifcopenshell.optional_logger_args(logger))
else: else:
args = (geometry_library, self.settings, file_or_filename, num_threads) args = (geometry_library, self.settings, file_or_filename, num_threads)
self.this = ifcopenshell_wrapper.construct_iterator(*args, *((logger,) if logger is not None else ())) self.this = ifcopenshell_wrapper.construct_iterator(*args, *ifcopenshell.optional_logger_args(logger))
if has_occ: if has_occ:
@@ -509,9 +510,9 @@ def create_shape(
return wrap_shape_creation( return wrap_shape_creation(
settings, settings,
( (
ifcopenshell_wrapper.create_shape(settings, inst, repr, geometry_library, *((logger,) if logger is not None else ()),) ifcopenshell_wrapper.create_shape(settings, inst, repr, geometry_library, *ifcopenshell.optional_logger_args(logger),)
if repr if repr
else ifcopenshell_wrapper.create_shape(settings, inst, geometry_library, *((logger,) if logger is not None else ()),) else ifcopenshell_wrapper.create_shape(settings, inst, geometry_library, *ifcopenshell.optional_logger_args(logger),)
), ),
) )
@@ -1074,6 +1074,52 @@ class line_segment:
def size(self): ... def size(self): ...
def swap(self, v): ... def swap(self, v): ...
class log_message:
code: Any
instance: Any
message: Any
product: Any
severity: Any
timestamp: Any
def __init__(self, *args): ...
@property
def severity_string(self): ...
def to_dict(self): ...
def to_tuple(self): ...
class logger:
FMT_PLAIN: Literal[0]
FMT_JSON: Literal[1]
FMT_INMEMORY: Literal[2]
LOG_PERF: Literal[0]
LOG_DEBUG: Literal[1]
LOG_NOTICE: Literal[2]
LOG_WARNING: Literal[3]
LOG_ERROR: Literal[4]
@staticmethod
def root() -> logger: ...
def append(self, other): ...
def count(self, code): ...
def clear(self): ...
def error(self, *args): ...
def get_log(self): ...
def max_severity(self): ...
def message(self, *args): ...
def notice(self, *args): ...
def output_format(self, *args): ...
def print_performance_stats(self): ...
def print_performance_stats_on_element(self, *args): ...
def progress_bar(self, progress): ...
def set_output(self, *args): ...
def set_product(self, *args): ...
def status(self, message, new_line=True): ...
def verbosity(self, *args): ...
def warning(self, *args): ...
def log_messages(self) -> tuple[log_message, ...]: ...
class loft: class loft:
axis: Any axis: Any
def calc_hash(self): ... def calc_hash(self): ...
@@ -217,6 +217,7 @@ def test_iterator():
def test_logging(): def test_logging():
assert ifcopenshell.logger
logger = ifcopenshell.logger() logger = ifcopenshell.logger()
logger.OutputFormat(logger.FMT_INMEMORY) logger.OutputFormat(logger.FMT_INMEMORY)
settings = ifcopenshell.geom.settings() settings = ifcopenshell.geom.settings()