@@ -552,13 +552,17 @@ def run(self) -> tuple[list[Node], list[system_message]]:
552552 return result , messages
553553
554554 def get_inventory_and_name_suffix (self , name : str ) -> tuple [str | None , str ]:
555+ """Extract an inventory name (if any) and ``domain+name`` suffix from a role *name*.
556+ and the domain+name suffix.
557+
558+ The role name is expected to be of one of the following forms:
559+
560+ - ``external+inv:name`` -- explicit inventory and name, any domain.
561+ - ``external+inv:domain:name`` -- explicit inventory, domain and name.
562+ - ``external:name`` -- any inventory and domain, explicit name.
563+ - ``external:domain:name`` -- any inventory, explicit domain and name.
564+ """
555565 assert name .startswith ('external' ), name
556- # either we have an explicit inventory name, i.e,
557- # :external+inv:role: or
558- # :external+inv:domain:role:
559- # or we look in all inventories, i.e.,
560- # :external:role: or
561- # :external:domain:role:
562566 suffix = name [9 :]
563567 if name [8 ] == '+' :
564568 inv_name , suffix = suffix .split (':' , 1 )
@@ -570,34 +574,56 @@ def get_inventory_and_name_suffix(self, name: str) -> tuple[str | None, str]:
570574 raise ValueError (msg )
571575
572576 def get_role_name (self , name : str ) -> tuple [str , str ] | None :
577+ """Find (if any) the corresponding ``(domain, role name)`` for *name*.
578+
579+ The *name* can be either a role name (e.g., ``py:function`` or ``function``)
580+ given as ``domain:role`` or ``role``, or its corresponding object name
581+ (in this case, ``py:func`` or ``func``) given as ``domain:objname`` or ``objname``.
582+
583+ If no domain is given, or the object/role name is not found for the requested domain,
584+ the 'std' domain is used.
585+ """
573586 names = name .split (':' )
574587 if len (names ) == 1 :
575- # role
576588 default_domain = self .env .temp_data .get ('default_domain' )
577589 domain = default_domain .name if default_domain else None
578- role = names [0 ]
590+ name = names [0 ]
579591 elif len (names ) == 2 :
580- # domain:role:
581592 domain = names [0 ]
582- role = names [1 ]
593+ name = names [1 ]
583594 else :
584595 return None
585596
586- if domain and self .is_existent_role (domain , role ):
597+ if domain and ( role := self .get_role_name_from_domain (domain , name ) ):
587598 return (domain , role )
588- elif self .is_existent_role ('std' , role ):
599+ elif ( role := self .get_role_name_from_domain ('std' , name ) ):
589600 return ('std' , role )
590601 else :
591602 return None
592603
593- def is_existent_role (self , domain_name : str , role_name : str ) -> bool :
604+ def is_existent_role (self , domain_name : str , role_or_obj_name : str ) -> bool :
605+ """Check if the given role or object exists in the given domain."""
606+ return self .get_role_name_from_domain (domain_name , role_or_obj_name ) is not None
607+
608+ def get_role_name_from_domain (self , domain_name : str , role_or_obj_name : str ) -> str | None :
609+ """Check if the given role or object exists in the given domain,
610+ and return the related role name if it exists, otherwise return None.
611+ """
594612 try :
595613 domain = self .env .get_domain (domain_name )
596- return role_name in domain .roles
597614 except ExtensionError :
598- return False
615+ return None
616+ if role_or_obj_name in domain .roles :
617+ return role_or_obj_name
618+ if (
619+ (role_name := domain .role_for_objtype (role_or_obj_name ))
620+ and role_name in domain .roles
621+ ):
622+ return role_name
623+ return None
599624
600625 def invoke_role (self , role : tuple [str , str ]) -> tuple [list [Node ], list [system_message ]]:
626+ """Invoke the role described by a ``(domain, role name)`` pair."""
601627 domain = self .env .get_domain (role [0 ])
602628 if domain :
603629 role_func = domain .role (role [1 ])
0 commit comments