18574: Adds 'preferred_label' virtual attribute. Avoids storing the voc twice.
authorLucas Di Pentima <lucas.dipentima@curii.com>
Mon, 28 Feb 2022 18:50:37 +0000 (15:50 -0300)
committerLucas Di Pentima <lucas.dipentima@curii.com>
Mon, 28 Feb 2022 21:34:47 +0000 (18:34 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas.dipentima@curii.com>

sdk/python/arvados/vocabulary.py
sdk/python/tests/test_vocabulary.py

index 643e167e6bfcb724ae1839ae45b24d76a6cfa19b..1791566b584fda1bf05dd18542b665edb9bb9c53 100644 (file)
@@ -15,8 +15,7 @@ def load_vocabulary(api_client=api('v1')):
 
 class Vocabulary(object):
     def __init__(self, voc_definition={}):
-        self._definition = voc_definition
-        self.strict_keys = self._definition.get('strict_tags', False)
+        self.strict_keys = voc_definition.get('strict_tags', False)
         self.key_aliases = {}
 
         for key_id, val in voc_definition.get('tags', {}).items():
@@ -39,6 +38,11 @@ class VocabularyData(object):
         self.identifier = identifier
         self.aliases = aliases
 
+    def __getattribute__(self, name):
+        if name == 'preferred_label':
+            return self.aliases[0]
+        return super(VocabularyData, self).__getattribute__(name)
+
 class VocabularyValue(VocabularyData):
     def __init__(self, identifier, aliases=[]):
         super(VocabularyValue, self).__init__(identifier, aliases)
index 49fd601262be0aa1616f7389b7af33ddff55e9cb..ccaa7fe88d68889c8103d995f8179848dc94261d 100644 (file)
@@ -74,14 +74,18 @@ class VocabularyTest(unittest.TestCase):
         self.assertEqual(vk.strict, False)
         self.assertEqual(vk.identifier, 'IDTAGANIMALS')
         self.assertEqual(vk.aliases, ['Animal', 'Creature'])
+        self.assertEqual(vk.preferred_label, 'Animal')
 
         vv = vk.value_aliases['human']
         self.assertEqual(vv.identifier, 'IDVALANIMAL1')
         self.assertEqual(vv.aliases, ['Human', 'Homo sapiens'])
+        self.assertEqual(vv.preferred_label, 'Human')
 
         self.assertEqual(voc['creature']['human'].identifier, vv.identifier)
         self.assertEqual(voc['Creature']['Human'].identifier, vv.identifier)
         self.assertEqual(voc['CREATURE']['HUMAN'].identifier, vv.identifier)
+        with self.assertRaises(KeyError):
+            inexistant = voc['foo']
 
     def test_empty_vocabulary(self):
         voc = vocabulary.Vocabulary()