From 260400fa34feeb091a2ac6772331e2b940195e06 Mon Sep 17 00:00:00 2001 From: Konstantin Fickel Date: Sun, 1 Feb 2026 12:09:38 +0100 Subject: [PATCH] feat: add overwrite configuration Signed-off-by: Konstantin Fickel --- src/streamer/localize/localize.py | 12 +- .../localize/repository_configuration.py | 1 + test/test_localize.py | 144 ++++++++++++++++++ 3 files changed, 153 insertions(+), 4 deletions(-) diff --git a/src/streamer/localize/localize.py b/src/streamer/localize/localize.py index 5875c87..b241fc9 100644 --- a/src/streamer/localize/localize.py +++ b/src/streamer/localize/localize.py @@ -30,10 +30,14 @@ def localize_shard( value = placement.value or marker - if dimension.propagate: - position[placement.dimension] = value - else: - private_position[placement.dimension] = value + if placement.overwrites or ( + placement.dimension not in position + and placement.dimension not in private_position + ): + if dimension.propagate: + position[placement.dimension] = value + else: + private_position[placement.dimension] = value children = [ localize_shard(child, config, position, adjusted_moment) diff --git a/src/streamer/localize/repository_configuration.py b/src/streamer/localize/repository_configuration.py index a0c7814..f21c556 100644 --- a/src/streamer/localize/repository_configuration.py +++ b/src/streamer/localize/repository_configuration.py @@ -15,6 +15,7 @@ class MarkerPlacement(BaseModel): if_with: set[str] = set() dimension: str value: str | None = None + overwrites: bool = True class Marker(BaseModel): diff --git a/test/test_localize.py b/test/test_localize.py index d539a62..678604b 100644 --- a/test/test_localize.py +++ b/test/test_localize.py @@ -85,3 +85,147 @@ class TestLocalize: "timesheet": "coding", }, ) + + def test_overwrites_true_propagated_dimension_overwrites_existing_value(self): + config = RepositoryConfiguration( + dimensions={ + "project": Dimension(display_name="Project", propagate=True), + }, + markers={ + "A": Marker( + display_name="A", + placements=[MarkerPlacement(dimension="project", value="a")], + ), + "B": Marker( + display_name="B", + placements=[ + MarkerPlacement(dimension="project", value="b", overwrites=True) + ], + ), + }, + ) + + stream_file = StreamFile( + file_name="20260131-210000 Test File.md", + shard=Shard(start_line=1, end_line=1, markers=["A", "B"]), + ) + + assert localize_stream_file(stream_file, config) == LocalizedShard( + moment=datetime(2026, 1, 31, 21, 0, 0, 0), + markers=["A", "B"], + tags=[], + start_line=1, + end_line=1, + children=[], + location={"file": stream_file.file_name, "project": "b"}, + ) + + def test_overwrites_false_propagated_dimension_does_not_overwrite_existing_value( + self, + ): + config = RepositoryConfiguration( + dimensions={ + "project": Dimension(display_name="Project", propagate=True), + }, + markers={ + "A": Marker( + display_name="A", + placements=[MarkerPlacement(dimension="project", value="a")], + ), + "B": Marker( + display_name="B", + placements=[ + MarkerPlacement( + dimension="project", value="b", overwrites=False + ) + ], + ), + }, + ) + + stream_file = StreamFile( + file_name="20260131-210000 Test File.md", + shard=Shard(start_line=1, end_line=1, markers=["A", "B"]), + ) + + assert localize_stream_file(stream_file, config) == LocalizedShard( + moment=datetime(2026, 1, 31, 21, 0, 0, 0), + markers=["A", "B"], + tags=[], + start_line=1, + end_line=1, + children=[], + location={"file": stream_file.file_name, "project": "a"}, + ) + + def test_overwrites_true_non_propagated_dimension_overwrites_private_value(self): + config = RepositoryConfiguration( + dimensions={ + "label": Dimension(display_name="Label", propagate=False), + }, + markers={ + "A": Marker( + display_name="A", + placements=[MarkerPlacement(dimension="label", value="a")], + ), + "B": Marker( + display_name="B", + placements=[ + MarkerPlacement(dimension="label", value="b", overwrites=True) + ], + ), + }, + ) + + stream_file = StreamFile( + file_name="20260131-210000 Test File.md", + shard=Shard(start_line=1, end_line=1, markers=["A", "B"]), + ) + + assert localize_stream_file(stream_file, config) == LocalizedShard( + moment=datetime(2026, 1, 31, 21, 0, 0, 0), + markers=["A", "B"], + tags=[], + start_line=1, + end_line=1, + children=[], + location={"file": stream_file.file_name, "label": "b"}, + ) + + def test_overwrites_false_non_propagated_dimension_does_not_overwrite_private_value( + self, + ): + config = RepositoryConfiguration( + dimensions={ + "label": Dimension(display_name="Label", propagate=False), + }, + markers={ + "A": Marker( + display_name="A", + placements=[ + MarkerPlacement(dimension="label", value="a", overwrites=True) + ], + ), + "B": Marker( + display_name="B", + placements=[ + MarkerPlacement(dimension="label", value="b", overwrites=False) + ], + ), + }, + ) + + stream_file = StreamFile( + file_name="20260131-210000 Test File.md", + shard=Shard(start_line=1, end_line=1, markers=["A", "B"]), + ) + + assert localize_stream_file(stream_file, config) == LocalizedShard( + moment=datetime(2026, 1, 31, 21, 0, 0, 0), + markers=["A", "B"], + tags=[], + start_line=1, + end_line=1, + children=[], + location={"file": stream_file.file_name, "label": "a"}, + )