From 3322b9750b12d70a980da9ab3cc982fdf36f1732 Mon Sep 17 00:00:00 2001 From: ktro2828 Date: Wed, 6 Aug 2025 01:56:37 +0900 Subject: [PATCH] fix: resolve the case if the adjacent entity paths are duplicate Signed-off-by: ktro2828 --- t4_devkit/viewer/viewer.py | 22 +++++++++++----------- tests/viewer/test_viewer.py | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/t4_devkit/viewer/viewer.py b/t4_devkit/viewer/viewer.py index ee7feca..355cc70 100644 --- a/t4_devkit/viewer/viewer.py +++ b/t4_devkit/viewer/viewer.py @@ -30,11 +30,10 @@ __all__ = ["RerunViewer", "format_entity"] -def format_entity(root: str, *entities: Sequence[str]) -> str: +def format_entity(*entities: Sequence[str]) -> str: """Format entity path. Args: - root (str): Root entity path. *entities: Entity path(s). Returns: @@ -48,15 +47,16 @@ def format_entity(root: str, *entities: Sequence[str]) -> str: >>> format_entity("map", "map/base_link", "camera") "map/base_link/camera" """ - if len(entities) == 0: - return root - - flattened = [s for t in entities for s in t.split("/")] - - if osp.basename(root) == flattened[0]: - return osp.join(root, "/".join(flattened[1:])) if len(flattened) > 1 else root - else: - return osp.join(root, "/".join(entities)) + if not entities: + return "" + + flattened = [] + for entity in entities: + for part in entity.split("/"): + if part and flattened and flattened[-1] == part: + continue + flattened.append(part) + return "/".join(flattened) class RerunViewer: diff --git a/tests/viewer/test_viewer.py b/tests/viewer/test_viewer.py index f1cfa14..8dfbfa9 100644 --- a/tests/viewer/test_viewer.py +++ b/tests/viewer/test_viewer.py @@ -14,6 +14,7 @@ def test_format_entity() -> None: assert "map/base_link" == format_entity("map", "base_link") assert "map/base_link" == format_entity("map", "map/base_link") assert "map/base_link/camera" == format_entity("map", "map/base_link", "camera") + assert "map/base_link/camera" == format_entity("map", "map/base_link", "base_link/camera") def test_render_box3ds(dummy_viewer, dummy_box3ds) -> None: