@@ -618,6 +618,40 @@ def permissible_value_parent(self, permissible_value: str, enum_name: ENUM_NAME)
618618 else :
619619 return []
620620
621+ @lru_cache ()
622+ def permissible_value_children (self , permissible_value : str , enum_name : ENUM_NAME ) -> Union [
623+ str , PermissibleValueText , None , ValueError ]:
624+ """
625+ :param enum_name: parent enum name
626+ :param permissible_value: permissible value
627+ :return: all direct child permissible values (is_a)
628+
629+ CAT:
630+ LION:
631+ is_a: CAT
632+ ANGRY_LION:
633+ is_a: LION
634+ TABBY:
635+ is_a: CAT
636+ BIRD:
637+ EAGLE:
638+ is_a: BIRD
639+
640+ """
641+
642+ enum = self .get_enum (enum_name , strict = True )
643+ children = []
644+ if enum :
645+ if permissible_value in enum .permissible_values :
646+ pv = enum .permissible_values [permissible_value ]
647+ for isapv in enum .permissible_values :
648+ isapv_entity = enum .permissible_values [isapv ]
649+ if isapv_entity .is_a and pv .text == isapv_entity .is_a :
650+ children .append (isapv )
651+ return children
652+ else :
653+ raise ValueError (f'No such enum as "{ enum_name } "' )
654+
621655 @lru_cache ()
622656 def slot_parents (self , slot_name : SLOT_NAME , imports = True , mixins = True , is_a = True ) -> List [SlotDefinitionName ]:
623657 """
@@ -719,6 +753,22 @@ def permissible_value_ancestors(self, permissible_value_text: str,
719753 reflexive = reflexive ,
720754 depth_first = depth_first )
721755
756+ @lru_cache ()
757+ def permissible_value_descendants (self , permissible_value_text : str ,
758+ enum_name : ENUM_NAME ,
759+ reflexive = True ,
760+ depth_first = True ) -> List [str ]:
761+ """
762+ Closure of permissible_value_children method
763+ :enum
764+ """
765+
766+
767+ return _closure (lambda x : self .permissible_value_children (x , enum_name ),
768+ permissible_value_text ,
769+ reflexive = reflexive ,
770+ depth_first = depth_first )
771+
722772 @lru_cache ()
723773 def enum_ancestors (self , enum_name : ENUM_NAME , imports = True , mixins = True , reflexive = True , is_a = True ,
724774 depth_first = True ) -> List [EnumDefinitionName ]:
@@ -931,7 +981,6 @@ def get_uri(self, element: Union[ElementName, Element], imports=True, expand=Fal
931981 if schema == None :
932982 raise ValueError (f'Cannot find { e .from_schema } in schema_map' )
933983 else :
934- logging .warning (f'from_schema not populated for element { e .name } ' )
935984 schema = self .schema_map [self .in_schema (e .name )]
936985 pfx = schema .default_prefix
937986 uri = f'{ pfx } :{ e_name } '
0 commit comments