captions improvements
Tests / test_and_lint (push) Successful in 24s

This commit is contained in:
2026-10-09 23:27:28 +01:00
parent 05e202cd31
commit 05021baac9
2 changed files with 60 additions and 11 deletions
+21 -7
View File
@@ -48,6 +48,11 @@ def _is_prefixed(txt: str) -> bool:
return txt.startswith(settings.metadata_prefix)
def _separate_prefixed_caption(txt: str) -> tuple[str, str | None]:
separated = [x.strip() for x in txt.split(settings.metadata_prefix)]
return (separated[0], separated[1] if len(separated) > 1 else None)
class MetadataWriter:
"""
Write metadata (captions and keywords) to image files.
@@ -112,14 +117,23 @@ class MetadataWriter:
def write_caption(
self, caption: Caption, include_prefix: bool = True, override: bool = True
):
if include_prefix:
caption = _prefixed(caption)
existing = self.get_caption()
is_existing_prefixed = _is_prefixed(existing)
if existing and is_existing_prefixed and not override:
existing_no_prefix, existing_prefix = _separate_prefixed_caption(
self.get_caption()
)
if existing_no_prefix:
existing_no_prefix = (
f"{existing_no_prefix}."
if not existing_no_prefix.endswith(".")
else existing_no_prefix
)
existing_no_prefix = f"{existing_no_prefix} "
if include_prefix and existing_prefix and not override:
return
elif existing and not is_existing_prefixed:
caption = f"{existing}. {_prefixed(caption)}"
if not include_prefix and existing_no_prefix and not override:
return
if include_prefix:
caption = settings.metadata_prefix.join([existing_no_prefix, f" {caption}"])
metadata_tags = {key: caption for key in XMP_KEYS_CAPTION}
self.set_metadata(metadata_tags)
+39 -4
View File
@@ -21,6 +21,16 @@ def make_dng_file(tmp_path):
return _make
@pytest.fixture
def metadata_writer_on_existing(make_dng_file):
metadata_writer = MetadataWriter(make_dng_file(PATHS_DNG_EXAMPLES[0]))
metadata_writer.write_caption(
"Let's pretend this is the caption of the original image",
include_prefix=False,
)
return metadata_writer
@pytest.mark.parametrize("pic", PATHS_DNG_EXAMPLES)
def test_read_metadata(make_dng_file, pic):
"""primitive test for `MetadataWriter`"""
@@ -49,22 +59,47 @@ def test_is_prefixed():
def test_read_metadata_sidecar_path(make_dng_file, pic):
file_path = make_dng_file(pic)
metadata_writer = MetadataWriter(file_path)
print(metadata_writer.sidecar_path)
assert isinstance(metadata_writer.sidecar_path, Path)
assert str(metadata_writer.sidecar_path).lower().endswith(".dng.xmp")
# file does not exits yet, only the name
assert not metadata_writer.sidecar_path.exists()
@pytest.mark.parametrize("pic", PATHS_DNG_EXAMPLES)
def test_set_caption(make_dng_file, pic):
metadata_writer = MetadataWriter(make_dng_file(pic))
assert not metadata_writer.sidecar_path.exists() # sidecar does not exist yet ...
metadata_writer.write_caption("This is a test")
assert metadata_writer.sidecar_path.exists() # ... but now!
result = metadata_writer.get_caption()
assert result
assert result == "photools: This is a test"
def test_set_caption_on_existing():
# TODO
...
def test_set_caption_on_existing(metadata_writer_on_existing):
assert (
metadata_writer_on_existing.get_caption()
== "Let's pretend this is the caption of the original image"
)
metadata_writer_on_existing.write_caption("Another caption")
assert (
metadata_writer_on_existing.get_caption()
== "Let's pretend this is the caption of the original image. photools: Another caption"
)
metadata_writer_on_existing.write_caption("Updated caption")
assert (
metadata_writer_on_existing.get_caption()
== "Let's pretend this is the caption of the original image. photools: Updated caption"
)
metadata_writer_on_existing.write_caption("Don't do this!", override=False)
assert (
metadata_writer_on_existing.get_caption()
== "Let's pretend this is the caption of the original image. photools: Updated caption"
)
@pytest.mark.parametrize("pic", PATHS_DNG_EXAMPLES)