Implement Edit Feature #28
3 changed files with 61 additions and 14 deletions
|
|
@ -22,16 +22,18 @@ def localize_shard(
|
||||||
adjusted_moment: datetime = extract_datetime_from_marker_list(shard.markers, moment)
|
adjusted_moment: datetime = extract_datetime_from_marker_list(shard.markers, moment)
|
||||||
|
|
||||||
for marker in shard.markers:
|
for marker in shard.markers:
|
||||||
normalized_marker = marker.lower()
|
if marker in config.markers:
|
||||||
|
marker_definition = config.markers[marker]
|
||||||
|
for placement in marker_definition.placements:
|
||||||
|
if set(placement.if_with) <= set(shard.markers):
|
||||||
|
dimension = config.dimensions[placement.dimension]
|
||||||
|
|
||||||
if marker_definition := config.markers[normalized_marker]:
|
value = placement.value or marker
|
||||||
dimension_name = marker_definition.dimension
|
|
||||||
dimension = config.dimensions[marker_definition.dimension]
|
|
||||||
|
|
||||||
if dimension.propagate:
|
if dimension.propagate:
|
||||||
position[dimension_name] = normalized_marker
|
position[placement.dimension] = value
|
||||||
else:
|
else:
|
||||||
private_position[dimension_name] = normalized_marker
|
private_position[placement.dimension] = value
|
||||||
|
|
||||||
children = [
|
children = [
|
||||||
localize_shard(child, config, position, adjusted_moment)
|
localize_shard(child, config, position, adjusted_moment)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -8,9 +9,15 @@ class Dimension(BaseModel):
|
||||||
propagate: bool = False
|
propagate: bool = False
|
||||||
|
|
||||||
|
|
||||||
|
class MarkerPlacement(BaseModel):
|
||||||
|
if_with: list[str] = []
|
||||||
|
dimension: str
|
||||||
|
value: str | None = None
|
||||||
|
|
||||||
|
|
||||||
class Marker(BaseModel):
|
class Marker(BaseModel):
|
||||||
display_name: str
|
display_name: str
|
||||||
dimension: str
|
placements: list[MarkerPlacement]
|
||||||
|
|
||||||
|
|
||||||
class RepositoryConfiguration(BaseModel):
|
class RepositoryConfiguration(BaseModel):
|
||||||
|
|
@ -18,4 +25,4 @@ class RepositoryConfiguration(BaseModel):
|
||||||
markers: dict[str, Marker]
|
markers: dict[str, Marker]
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["Dimension", "Marker", "RepositoryConfiguration"]
|
__all__ = ["Dimension", "Marker", "MarkerPlacement", "RepositoryConfiguration"]
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ from streamer.localize.localized_shard import LocalizedShard
|
||||||
from streamer.localize.repostory_configuration import (
|
from streamer.localize.repostory_configuration import (
|
||||||
Dimension,
|
Dimension,
|
||||||
Marker,
|
Marker,
|
||||||
|
MarkerPlacement,
|
||||||
RepositoryConfiguration,
|
RepositoryConfiguration,
|
||||||
)
|
)
|
||||||
from streamer.parse.shard import Shard, StreamFile
|
from streamer.parse.shard import Shard, StreamFile
|
||||||
|
|
@ -21,15 +22,30 @@ repository_configuration = RepositoryConfiguration(
|
||||||
comment="Timestamp this entry was created at",
|
comment="Timestamp this entry was created at",
|
||||||
propagate=True,
|
propagate=True,
|
||||||
),
|
),
|
||||||
|
"timesheet": Dimension(
|
||||||
|
display_name="Timesheet",
|
||||||
|
comment="Time Cards for Time Tracking",
|
||||||
|
propagate=True,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
markers={
|
markers={
|
||||||
"streamer": Marker(display_name="Streamer", dimension="project"),
|
"Streamer": Marker(
|
||||||
"jobhunting": Marker(display_name="JobHunting", dimension="project"),
|
display_name="Streamer",
|
||||||
|
placements=[
|
||||||
|
MarkerPlacement(dimension="project"),
|
||||||
|
MarkerPlacement(
|
||||||
|
if_with=["Timesheet"], dimension="timesheet", value="coding"
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
"JobHunting": Marker(
|
||||||
|
display_name="JobHunting", placements=[MarkerPlacement(dimension="project")]
|
||||||
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestExtractDateTime:
|
class TestLocalize:
|
||||||
def test_project_simple_stream_file(self):
|
def test_project_simple_stream_file(self):
|
||||||
stream_file = StreamFile(
|
stream_file = StreamFile(
|
||||||
file_name="20250622-121000 Test File.md",
|
file_name="20250622-121000 Test File.md",
|
||||||
|
|
@ -45,5 +61,27 @@ class TestExtractDateTime:
|
||||||
start_line=1,
|
start_line=1,
|
||||||
end_line=1,
|
end_line=1,
|
||||||
children=[],
|
children=[],
|
||||||
location={"project": "streamer", "file": stream_file.file_name},
|
location={"project": "Streamer", "file": stream_file.file_name},
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_timesheet_use_case(self):
|
||||||
|
stream_file = StreamFile(
|
||||||
|
file_name="20260131-210000 Test File.md",
|
||||||
|
shard=Shard(start_line=1, end_line=1, markers=["Timesheet", "Streamer"]),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert localize_stream_file(
|
||||||
|
stream_file, repository_configuration
|
||||||
|
) == LocalizedShard(
|
||||||
|
moment=datetime(2026, 1, 31, 21, 0, 0, 0),
|
||||||
|
markers=["Timesheet", "Streamer"],
|
||||||
|
tags=[],
|
||||||
|
start_line=1,
|
||||||
|
end_line=1,
|
||||||
|
children=[],
|
||||||
|
location={
|
||||||
|
"file": stream_file.file_name,
|
||||||
|
"project": "Streamer",
|
||||||
|
"timesheet": "coding",
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue