parameters: (self,
                            context: interfaces.context.ContextInterface,
                            config_path: str,
                            requirement_root: interfaces.configuration.RequirementInterface,
                            requirement_type: Union[Tuple[Type[interfaces.configuration.RequirementInterface], ...],
                                                    Type[interfaces.configuration.RequirementInterface]],
                            shortcut: bool = True)
return_statement: return results
docstring: Determines if there is actually an unfulfilled `Requirement`
          waiting.
  
          This ensures we do not carry out an expensive search when there is no need for a particular `Requirement`
  
          Args:
              context: Context on which to operate
              config_path: Configuration path of the top-level requirement
              requirement_root: Top-level requirement whose subrequirements will all be searched
              requirement_type: Type of requirement to find
              shortcut: Only returns requirements that live under unsatisfied requirements
  
          Returns:
              A list of tuples containing the config_path, sub_config_path and requirement identifying the unsatisfied `Requirements`
docstring_summary: Determines if there is actually an unfulfilled `Requirement`
          waiting.
docstring_tokens: Determines if there is actually an unfulfilled Requirement waiting .
function: def find_requirements(self,
                            context: interfaces.context.ContextInterface,
                            config_path: str,
                            requirement_root: interfaces.configuration.RequirementInterface,
                            requirement_type: Union[Tuple[Type[interfaces.configuration.RequirementInterface], ...],
                                                    Type[interfaces.configuration.RequirementInterface]],
                            shortcut: bool = True) -> List[Tuple[str, interfaces.configuration.RequirementInterface]]:
          """Determines if there is actually an unfulfilled `Requirement`
          waiting.
  
          This ensures we do not carry out an expensive search when there is no need for a particular `Requirement`
  
          Args:
              context: Context on which to operate
              config_path: Configuration path of the top-level requirement
              requirement_root: Top-level requirement whose subrequirements will all be searched
              requirement_type: Type of requirement to find
              shortcut: Only returns requirements that live under unsatisfied requirements
  
          Returns:
              A list of tuples containing the config_path, sub_config_path and requirement identifying the unsatisfied `Requirements`
          """
          sub_config_path = interfaces.configuration.path_join(config_path, requirement_root.name)
          results = []  # type: List[Tuple[str, interfaces.configuration.RequirementInterface]]
          recurse = not shortcut
          if isinstance(requirement_root, requirement_type):
              if recurse or requirement_root.unsatisfied(context, config_path):
                  results.append((sub_config_path, requirement_root))
          else:
              recurse = True
          if recurse:
              for subreq in requirement_root.requirements.values():
                  results += self.find_requirements(context, sub_config_path, subreq, requirement_type, shortcut)
          return results
function_tokens: def find_requirements ( self , context : interfaces . context . ContextInterface , config_path : str , requirement_root : interfaces . configuration . RequirementInterface , requirement_type : Union [ Tuple [ Type [ interfaces . configuration . RequirementInterface ] , ... ] , Type [ interfaces . configuration . RequirementInterface ] ] , shortcut : bool = True ) -> List [ Tuple [ str , interfaces . configuration . RequirementInterface ] ] : sub_config_path = interfaces . configuration . path_join ( config_path , requirement_root . name ) results = [ ] # type: List[Tuple[str, interfaces.configuration.RequirementInterface]] recurse = not shortcut if isinstance ( requirement_root , requirement_type ) : if recurse or requirement_root . unsatisfied ( context , config_path ) : results . append ( ( sub_config_path , requirement_root ) ) else : recurse = True if recurse : for subreq in requirement_root . requirements . values ( ) : results += self . find_requirements ( context , sub_config_path , subreq , requirement_type , shortcut ) return results