]> kaliko git repositories - mpd-sima.git/commitdiff
Add Meta properties to expose serialized strings
authorkaliko <kaliko@azylum.org>
Mon, 11 May 2020 16:47:25 +0000 (18:47 +0200)
committerkaliko <kaliko@azylum.org>
Mon, 11 May 2020 16:47:25 +0000 (18:47 +0200)
sima/lib/meta.py
tests/test_meta.py

index f79ed1dc7fef860e1117782838eef86b44efad60..b19658441725ef84467bf9c04d968d286eaf57d8 100644 (file)
@@ -58,6 +58,14 @@ def mbidfilter(func):
         func(*args, **kwargs)
     return wrapper
 
         func(*args, **kwargs)
     return wrapper
 
+def serialize(func):
+    def wrapper(*args, **kwargs):
+        ans = func(*args, **kwargs)
+        if isinstance(ans, set):
+            return {s.replace("'", r"\'") for s in ans}
+        return ans.replace("'", r"\'")
+    return wrapper
+
 
 class Meta:
     """
 
 class Meta:
     """
@@ -77,7 +85,7 @@ class Meta:
 
     def __init__(self, **kwargs):
         """Meta(name=<str>[, mbid=UUID4])"""
 
     def __init__(self, **kwargs):
         """Meta(name=<str>[, mbid=UUID4])"""
-        self.__name = None #TODO: should be immutable
+        self.__name = None  # TODO: should be immutable
         self.__mbid = None
         self.__aliases = set()
         self.log = logging.getLogger(__name__)
         self.__mbid = None
         self.__aliases = set()
         self.log = logging.getLogger(__name__)
@@ -142,6 +150,11 @@ class Meta:
     def name(self):
         return self.__name
 
     def name(self):
         return self.__name
 
+    @property
+    @serialize
+    def name_sz(self):
+        return self.name
+
     @property
     def mbid(self):
         return self.__mbid
     @property
     def mbid(self):
         return self.__mbid
@@ -150,19 +163,34 @@ class Meta:
     def aliases(self):
         return self.__aliases
 
     def aliases(self):
         return self.__aliases
 
+    @property
+    @serialize
+    def aliases_sz(self):
+        return self.aliases
+
     @property
     def names(self):
         """aliases + name"""
         return self.__aliases | {self.__name,}
 
     @property
     def names(self):
         """aliases + name"""
         return self.__aliases | {self.__name,}
 
+    @property
+    @serialize
+    def names_sz(self):
+        return self.names
+
 
 class Album(Meta):
     """Album object"""
 
 
 class Album(Meta):
     """Album object"""
 
+    @mbidfilter
+    def __init__(self, name=None, mbid=None, **kwargs):
+        super().__init__(name=name, mbid=mbid, **kwargs)
+
     @property
     def album(self):
         return self.name
 
     @property
     def album(self):
         return self.name
 
+
 class Artist(Meta):
     """Artist object deriving from :class:`Meta`.
 
 class Artist(Meta):
     """Artist object deriving from :class:`Meta`.
 
index a615a18e84279034f7dc574fc61502c78af9056a..ed241cf1a04f85f9c2ee4db53d1ad148a1f3ef1d 100644 (file)
@@ -2,7 +2,7 @@
 
 import unittest
 
 
 import unittest
 
-from sima.lib.meta import Meta, Artist, MetaContainer, is_uuid4
+from sima.lib.meta import Meta, Artist, Album, MetaContainer, is_uuid4
 from sima.lib.meta import MetaException, SEPARATOR
 
 VALID = '110e8100-e29b-41d1-a716-116655250000'
 from sima.lib.meta import MetaException, SEPARATOR
 
 VALID = '110e8100-e29b-41d1-a716-116655250000'
@@ -102,6 +102,22 @@ class TestMetaObject(unittest.TestCase):
         art10._Meta__mbid = None
         self.assertTrue(art01 == art10, 'wrong: %r != %r' % (art00, art01))
 
         art10._Meta__mbid = None
         self.assertTrue(art01 == art10, 'wrong: %r != %r' % (art00, art01))
 
+    def test_mpd_serialization(self):
+        """Controls serialization of names"""
+        name = "Heaven's Door"
+        heavens_door = Meta(name=name)
+        target = r"Heaven\'s Door"
+        self.assertEqual(heavens_door.name_sz, target)
+        self.assertEqual(heavens_door.name, name)
+        self.assertEqual(heavens_door.names_sz, {target})
+        heavens_door.add_alias(name+" LP")
+        self.assertEqual(heavens_door.aliases_sz, {target+" LP"})
+        # Controls inheritance
+        heavens_door = Album(name=name)
+        self.assertEqual(heavens_door.name_sz, target)
+        heavens_door = Artist(name=name)
+        self.assertEqual(heavens_door.name_sz, target)
+
 
 class TestArtistObject(unittest.TestCase):
 
 
 class TestArtistObject(unittest.TestCase):