aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pyexiv2/metadata.py10
-rw-r--r--test/metadata.py46
2 files changed, 55 insertions, 1 deletions
diff --git a/src/pyexiv2/metadata.py b/src/pyexiv2/metadata.py
index fea6a6f..5ec296d 100644
--- a/src/pyexiv2/metadata.py
+++ b/src/pyexiv2/metadata.py
@@ -31,6 +31,8 @@ Provide the ImageMetadata class.
import os
import sys
from errno import ENOENT
+from collections import MutableMapping
+from itertools import chain
import libexiv2python
@@ -40,7 +42,7 @@ from pyexiv2.xmp import XmpTag
from pyexiv2.preview import Preview
-class ImageMetadata(object):
+class ImageMetadata(MutableMapping):
"""
A container for all the metadata embedded in an image.
@@ -321,6 +323,12 @@ class ImageMetadata(object):
except AttributeError:
raise KeyError(key)
+ def __iter__(self):
+ return chain(self.exif_keys, self.iptc_keys, self.xmp_keys)
+
+ def __len__(self):
+ return len( [ x for x in self ] )
+
def _get_comment(self):
return self._image._getComment()
diff --git a/test/metadata.py b/test/metadata.py
index aea1c72..cb63c71 100644
--- a/test/metadata.py
+++ b/test/metadata.py
@@ -601,3 +601,49 @@ class TestImageMetadata(unittest.TestCase):
self.failUnlessEqual(self.metadata.comment, self.other.comment)
+ #############################
+ # Test MutableMapping methods
+ #############################
+
+ def _set_up_clean(self):
+ self.clean = ImageMetadata.from_buffer(EMPTY_JPG_DATA)
+
+ def test_mutablemapping(self):
+ self._set_up_clean()
+ self.clean.read()
+
+ self.assertEqual(len(self.clean), 0)
+ self.assertTrue('Exif.Image.DateTimeOriginal' not in self.clean)
+
+ key = 'Exif.Image.DateTimeOriginal'
+ correctDate = datetime.datetime(2007,03,11)
+ incorrectDate = datetime.datetime(2009,03,25)
+ tag_date = ExifTag(key,correctDate)
+ false_tag_date = ExifTag(key,incorrectDate)
+ self.clean[key] = tag_date
+
+ self.assertEqual(len(self.clean), 1)
+ self.assertTrue('Exif.Image.DateTimeOriginal' in self.clean)
+ self.assertEqual(self.clean.get('Exif.Image.DateTimeOriginal', false_tag_date), tag_date)
+ self.assertEqual(self.clean.get('Exif.Image.DateTime', tag_date), tag_date)
+
+ key = 'Exif.Photo.UserComment'
+ tag = ExifTag(key,'UserComment')
+ self.clean[key] = tag
+ key = 'Iptc.Application2.Caption'
+ tag = IptcTag(key,['Caption'])
+ self.clean[key] = tag
+ key = 'Xmp.dc.subject'
+ tag = XmpTag(key, ['subject', 'values'])
+ self.clean[key] = tag
+
+ self.assertTrue('Exif.Photo.UserComment' in self.clean)
+ self.assertTrue('Iptc.Application2.Caption' in self.clean)
+ self.assertTrue('Xmp.dc.subject' in self.clean)
+
+ self.clean.clear()
+ self.assertEqual(len(self.clean), 0)
+
+ self.assertTrue('Exif.Photo.UserComment' not in self.clean)
+ self.assertTrue('Iptc.Application2.Caption' not in self.clean)
+ self.assertTrue('Xmp.dc.subject' not in self.clean)