@@ -277,6 +277,67 @@ def toXMLEnd(self):
277277 memoRepr += ">"
278278 return memoRepr
279279
280+ def valueMap (self ):
281+ # type: () -> Union[dict, None]
282+ """Map each relation in a dict.
283+ Property and value are swapped to make the result a lookup
284+ table where the key is the user-facing caption.
285+ """
286+ mapMemo = self .getChildByTag ("map" )
287+ if mapMemo is None :
288+ return None
289+ results = OrderedDict ()
290+ for childRelation in mapMemo .children :
291+ if childRelation .tag != "relation" :
292+ logger .warning (f"expected relation got { childRelation .tag } " )
293+ continue
294+ keyMemo = childRelation .getChildByTag ("property" )
295+ valueMemo = childRelation .getChildByTag ("value" )
296+ if not keyMemo :
297+ logger .warning ("expected property in relation for"
298+ f" { self .getChildContent ('name' )} " )
299+ continue
300+ if not valueMemo :
301+ logger .warning ("expected value in relation for"
302+ f" { self .getChildContent ('name' )} " )
303+ continue
304+ prop = keyMemo .content .strip () if keyMemo .content else None
305+ value = valueMemo .content .strip () if valueMemo .content else None
306+ if not prop :
307+ logger .warning ("expected content for property in relation for"
308+ f" { self .getChildContent ('name' )} " )
309+ continue
310+ if not value :
311+ logger .warning ("expected content for value in relation for"
312+ f" { self .getChildContent ('name' )} " )
313+ continue
314+ if value in results :
315+ logger .warning (f"expected only one value { repr (value )} "
316+ f" (property { repr (prop )} ) in relation for"
317+ f" { self .getChildContent ('name' )} " )
318+ results [value ] = prop # reverse to make it a lookup by caption
319+ return results
320+
321+ def keyMap (self ):
322+ # type: () -> Union[dict, None]
323+ """Map each relation in a dict where property is key.
324+ NOTE: As per CDI, value is the visible caption.
325+ """
326+ tmp = self .valueMap ()
327+ if not tmp :
328+ return None
329+ results = OrderedDict ()
330+ for k , v in tmp .items ():
331+ results [v ] = k
332+ return results
333+
334+ def getChildByTag (self , tag ):
335+ # type: (str) -> Union[CDIMemo, None]
336+ for child in self .children :
337+ if child .tag == tag :
338+ return child
339+ return None
340+
280341 def toCDIVar (self ):
281342 # type: () -> CDIVar
282343 """Create a CDIVar from descriptors (child elements of self).
0 commit comments