diff --git a/src/photools3/metadata_writer.py b/src/photools3/metadata_writer.py index 06d5fd2..9f8c318 100644 --- a/src/photools3/metadata_writer.py +++ b/src/photools3/metadata_writer.py @@ -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) diff --git a/test/test_metadata_writer.py b/test/test_metadata_writer.py index 4c7405b..7597d59 100644 --- a/test/test_metadata_writer.py +++ b/test/test_metadata_writer.py @@ -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)