def findByName(self, _name, recurse=False): """ Find and load tests, given C{name}. @param name: The qualified name of the thing to load. @param recurse: A boolean. If True, inspect modules within packages within the given package (and so on), otherwise, only inspect modules in the package itself. @return: If C{name} is a filename, return the module. If C{name} is a fully-qualified Python name, return the object it refers to. """ if os.sep in _name: # It's a file, try and get the module name for this file. name = reflect.filenameToModuleName(_name) try: # Try and import it, if it's on the path. # CAVEAT: If you have two twisteds, and you try and import the # one NOT on your path, it'll load the one on your path. But # that's silly, nobody should do that, and existing Trial does # that anyway. __import__(name) except ImportError: # If we can't import it, look for one NOT on the path. return self.loadFile(_name, recurse=recurse) else: name = _name obj = parent = remaining = None for searchName, remainingName in _qualNameWalker(name): # Walk down the qualified name, trying to import a module. For # example, `twisted.test.test_paths.FilePathTests` would try # the full qualified name, then just up to test_paths, and then # just up to test, and so forth. # This gets us the highest level thing which is a module. try: obj = reflect.namedModule(searchName) # If we reach here, we have successfully found a module. # obj will be the module, and remaining will be the remaining # part of the qualified name. remaining = remainingName break except ImportError: # Check to see where the ImportError happened. If it happened # in this file, ignore it. tb = sys.exc_info()[2] # Walk down to the deepest frame, where it actually happened. while tb.tb_next is not None: tb = tb.tb_next # Get the filename that the ImportError originated in. filenameWhereHappened = tb.tb_frame.f_code.co_filename # If it originated in the reflect file, then it's because it # doesn't exist. If it originates elsewhere, it's because an # ImportError happened in a module that does exist. if filenameWhereHappened != reflect.__file__: raise if remaining == "": raise reflect.ModuleNotFound( "The module {} does not exist.".format(name)) if obj is None: # If it's none here, we didn't get to import anything. # Try something drastic. obj = reflect.namedAny(name) remaining = name.split(".")[len(".".split(obj.__name__)) + 1:] try: for part in remaining: # Walk down the remaining modules. Hold on to the parent for # methods, as on Python 3, you can no longer get the parent # class from just holding onto the method. parent, obj = obj, getattr(obj, part) except AttributeError: raise AttributeError("{} does not exist.".format(name)) return self.loadAnything(obj, parent=parent, qualName=remaining, recurse=recurse)
def findByName(self, _name, recurse=False): """ Find and load tests, given C{name}. This partially duplicates the logic in C{unittest.loader.TestLoader}. @param name: The qualified name of the thing to load. @param recurse: A boolean. If True, inspect modules within packages within the given package (and so on), otherwise, only inspect modules in the package itself. """ if os.sep in _name: # It's a file, try and get the module name for this file. name = reflect.filenameToModuleName(_name) try: # Try and import it, if it's on the path. # CAVEAT: If you have two twisteds, and you try and import the # one NOT on your path, it'll load the one on your path. But # that's silly, nobody should do that, and existing Trial does # that anyway. __import__(name) except ImportError: # If we can't import it, look for one NOT on the path. return self.loadFile(_name, recurse=recurse) else: name = _name obj = parent = remaining = None for searchName, remainingName in _qualNameWalker(name): # Walk down the qualified name, trying to import a module. For # example, `twisted.test.test_paths.FilePathTests` would try # the full qualified name, then just up to test_paths, and then # just up to test, and so forth. # This gets us the highest level thing which is a module. try: obj = reflect.namedModule(searchName) # If we reach here, we have successfully found a module. # obj will be the module, and remaining will be the remaining # part of the qualified name. remaining = remainingName break except ImportError: if remaining == "": raise reflect.ModuleNotFound( "The module {} does not exist.".format(name)) if obj is None: # If it's none here, we didn't get to import anything. # Try something drastic. obj = reflect.namedAny(name) remaining = name.split(".")[len(".".split(obj.__name__)) + 1:] try: for part in remaining: # Walk down the remaining modules. Hold on to the parent for # methods, as on Python 3, you can no longer get the parent # class from just holding onto the method. parent, obj = obj, getattr(obj, part) except AttributeError: raise AttributeError("{} does not exist.".format(name)) return self.loadAnything(obj, parent=parent, qualName=remaining, recurse=recurse)