Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Unified Diff: third_party/twisted_8_1/twisted/trial/runner.py

Issue 12261012: Remove third_party/twisted_8_1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/twisted_8_1/twisted/trial/runner.py
diff --git a/third_party/twisted_8_1/twisted/trial/runner.py b/third_party/twisted_8_1/twisted/trial/runner.py
deleted file mode 100644
index 5743436024633f0ef314a61d36082ff4cd46dd6d..0000000000000000000000000000000000000000
--- a/third_party/twisted_8_1/twisted/trial/runner.py
+++ /dev/null
@@ -1,833 +0,0 @@
-# -*- test-case-name: twisted.trial.test.test_runner -*-
-
-#
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-A miscellany of code used to run Trial tests.
-
-Maintainer: Jonathan Lange <jml@twistedmatrix.com>
-"""
-
-
-import pdb, shutil
-import os, types, warnings, sys, inspect, imp
-import random, doctest, time
-
-from twisted.python import reflect, log, failure, modules
-from twisted.python.util import dsu
-from twisted.python.compat import set
-
-from twisted.internet import defer, interfaces
-from twisted.trial import util, unittest
-from twisted.trial.itrial import ITestCase
-from twisted.trial.reporter import UncleanWarningsReporterWrapper
-
-# These are imported so that they remain in the public API for t.trial.runner
-from twisted.trial.unittest import suiteVisit, TestSuite
-
-from zope.interface import implements
-
-pyunit = __import__('unittest')
-
-
-def isPackage(module):
- """Given an object return True if the object looks like a package"""
- if not isinstance(module, types.ModuleType):
- return False
- basename = os.path.splitext(os.path.basename(module.__file__))[0]
- return basename == '__init__'
-
-
-def isPackageDirectory(dirname):
- """Is the directory at path 'dirname' a Python package directory?
- Returns the name of the __init__ file (it may have a weird extension)
- if dirname is a package directory. Otherwise, returns False"""
- for ext in zip(*imp.get_suffixes())[0]:
- initFile = '__init__' + ext
- if os.path.exists(os.path.join(dirname, initFile)):
- return initFile
- return False
-
-
-def samefile(filename1, filename2):
- """
- A hacky implementation of C{os.path.samefile}. Used by L{filenameToModule}
- when the platform doesn't provide C{os.path.samefile}. Do not use this.
- """
- return os.path.abspath(filename1) == os.path.abspath(filename2)
-
-def filenameToModule(fn):
- """
- Given a filename, do whatever possible to return a module object matching
- that file.
-
- If the file in question is a module in Python path, properly import and
- return that module. Otherwise, load the source manually.
-
- @param fn: A filename.
- @return: A module object.
- @raise ValueError: If C{fn} does not exist.
- """
- if not os.path.exists(fn):
- raise ValueError("%r doesn't exist" % (fn,))
- try:
- ret = reflect.namedAny(reflect.filenameToModuleName(fn))
- except (ValueError, AttributeError):
- # Couldn't find module. The file 'fn' is not in PYTHONPATH
- return _importFromFile(fn)
- # ensure that the loaded module matches the file
- retFile = os.path.splitext(ret.__file__)[0] + '.py'
- # not all platforms (e.g. win32) have os.path.samefile
- same = getattr(os.path, 'samefile', samefile)
- if os.path.isfile(fn) and not same(fn, retFile):
- del sys.modules[ret.__name__]
- ret = _importFromFile(fn)
- return ret
-
-
-def _importFromFile(fn, moduleName=None):
- fn = _resolveDirectory(fn)
- if not moduleName:
- moduleName = os.path.splitext(os.path.split(fn)[-1])[0]
- if moduleName in sys.modules:
- return sys.modules[moduleName]
- fd = open(fn, 'r')
- try:
- module = imp.load_source(moduleName, fn, fd)
- finally:
- fd.close()
- return module
-
-
-def _resolveDirectory(fn):
- if os.path.isdir(fn):
- initFile = isPackageDirectory(fn)
- if initFile:
- fn = os.path.join(fn, initFile)
- else:
- raise ValueError('%r is not a package directory' % (fn,))
- return fn
-
-
-
-class DestructiveTestSuite(TestSuite):
- """
- A test suite which remove the tests once run, to minimize memory usage.
- """
-
- def run(self, result):
- """
- Almost the same as L{TestSuite.run}, but with C{self._tests} being
- empty at the end.
- """
- while self._tests:
- if result.shouldStop:
- break
- test = self._tests.pop(0)
- test(result)
- return result
-
-
-
-# When an error occurs outside of any test, the user will see this string
-# in place of a test's name.
-NOT_IN_TEST = "<not in test>"
-
-
-
-class LoggedSuite(TestSuite):
- """
- Any errors logged in this suite will be reported to the L{TestResult}
- object.
- """
-
- def run(self, result):
- """
- Run the suite, storing all errors in C{result}. If an error is logged
- while no tests are running, then it will be added as an error to
- C{result}.
-
- @param result: A L{TestResult} object.
- """
- observer = unittest._logObserver
- observer._add()
- super(LoggedSuite, self).run(result)
- observer._remove()
- for error in observer.getErrors():
- result.addError(TestHolder(NOT_IN_TEST), error)
- observer.flushErrors()
-
-
-
-class DocTestSuite(TestSuite):
- """
- DEPRECATED in Twisted 8.0.
-
- Behaves like doctest.DocTestSuite, but decorates individual TestCases so
- they support visit and so that id() behaviour is meaningful and consistent
- between Python versions.
- """
-
- def __init__(self, testModule):
- warnings.warn("DocTestSuite is deprecated in Twisted 8.0.",
- category=DeprecationWarning, stacklevel=3)
- TestSuite.__init__(self)
- suite = doctest.DocTestSuite(testModule)
- for test in suite._tests: #yay encapsulation
- self.addTest(ITestCase(test))
-
-
-
-class PyUnitTestCase(object):
- """
- DEPRECATED in Twisted 8.0.
-
- This class decorates the pyunit.TestCase class, mainly to work around the
- differences between unittest in Python 2.3, 2.4, and 2.5. These
- differences are::
-
- - The way doctest unittests describe themselves
- - Where the implementation of TestCase.run is (used to be in __call__)
- - Where the test method name is kept (mangled-private or non-mangled
- private variable)
-
- It also implements visit, which we like.
- """
-
- def __init__(self, test):
- warnings.warn("Deprecated in Twisted 8.0.",
- category=DeprecationWarning)
- self._test = test
- test.id = self.id
-
- def id(self):
- cls = self._test.__class__
- tmn = getattr(self._test, '_TestCase__testMethodName', None)
- if tmn is None:
- # python2.5's 'unittest' module is more sensible; but different.
- tmn = self._test._testMethodName
- return (cls.__module__ + '.' + cls.__name__ + '.' +
- tmn)
-
- def __repr__(self):
- return 'PyUnitTestCase<%r>'%(self.id(),)
-
- def __call__(self, results):
- return self._test(results)
-
-
- def visit(self, visitor):
- """
- Call the given visitor with the original, standard library, test case
- that C{self} wraps. See L{unittest.TestCase.visit}.
-
- Deprecated in Twisted 8.0.
- """
- warnings.warn("Test visitors deprecated in Twisted 8.0",
- category=DeprecationWarning)
- visitor(self._test)
-
-
- def __getattr__(self, name):
- return getattr(self._test, name)
-
-
-
-class DocTestCase(PyUnitTestCase):
- """
- DEPRECATED in Twisted 8.0.
- """
-
- def id(self):
- """
- In Python 2.4, doctests have correct id() behaviour. In Python 2.3,
- id() returns 'runit'.
-
- Here we override id() so that at least it will always contain the
- fully qualified Python name of the doctest.
- """
- return self._test.shortDescription()
-
-
-class TrialSuite(TestSuite):
- """
- Suite to wrap around every single test in a C{trial} run. Used internally
- by Trial to set up things necessary for Trial tests to work, regardless of
- what context they are run in.
- """
-
- def __init__(self, tests=()):
- suite = LoggedSuite(tests)
- super(TrialSuite, self).__init__([suite])
-
-
- def _bail(self):
- from twisted.internet import reactor
- d = defer.Deferred()
- reactor.addSystemEventTrigger('after', 'shutdown',
- lambda: d.callback(None))
- reactor.fireSystemEvent('shutdown') # radix's suggestion
- treactor = interfaces.IReactorThreads(reactor, None)
- if treactor is not None:
- treactor.suggestThreadPoolSize(0)
- # As long as TestCase does crap stuff with the reactor we need to
- # manually shutdown the reactor here, and that requires util.wait
- # :(
- # so that the shutdown event completes
- unittest.TestCase('mktemp')._wait(d)
-
- def run(self, result):
- try:
- TestSuite.run(self, result)
- finally:
- self._bail()
-
-
-def name(thing):
- """
- @param thing: an object from modules (instance of PythonModule,
- PythonAttribute), a TestCase subclass, or an instance of a TestCase.
- """
- if isTestCase(thing):
- # TestCase subclass
- theName = reflect.qual(thing)
- else:
- # thing from trial, or thing from modules.
- # this monstrosity exists so that modules' objects do not have to
- # implement id(). -jml
- try:
- theName = thing.id()
- except AttributeError:
- theName = thing.name
- return theName
-
-
-def isTestCase(obj):
- """
- Returns C{True} if C{obj} is a class that contains test cases, C{False}
- otherwise. Used to find all the tests in a module.
- """
- try:
- return issubclass(obj, pyunit.TestCase)
- except TypeError:
- return False
-
-
-
-class TestHolder(object):
- """
- Placeholder for a L{TestCase} inside a reporter. As far as a L{TestResult}
- is concerned, this looks exactly like a unit test.
- """
-
- implements(ITestCase)
-
- def __init__(self, description):
- """
- @param description: A string to be displayed L{TestResult}.
- """
- self.description = description
-
-
- def id(self):
- return self.description
-
-
- def shortDescription(self):
- return self.description
-
-
-
-class ErrorHolder(TestHolder):
- """
- Used to insert arbitrary errors into a test suite run. Provides enough
- methods to look like a C{TestCase}, however, when it is run, it simply adds
- an error to the C{TestResult}. The most common use-case is for when a
- module fails to import.
- """
-
- def __init__(self, description, error):
- """
- @param description: A string used by C{TestResult}s to identify this
- error. Generally, this is the name of a module that failed to import.
-
- @param error: The error to be added to the result. Can be an exc_info
- tuple or a L{twisted.python.failure.Failure}.
- """
- super(ErrorHolder, self).__init__(description)
- self.error = error
-
-
- def __repr__(self):
- return "<ErrorHolder description=%r error=%r>" % (self.description,
- self.error)
-
-
- def run(self, result):
- result.addError(self, self.error)
-
-
- def __call__(self, result):
- return self.run(result)
-
-
- def countTestCases(self):
- return 0
-
-
- def visit(self, visitor):
- """
- See L{unittest.TestCase.visit}.
- """
- visitor(self)
-
-
-
-class TestLoader(object):
- """
- I find tests inside function, modules, files -- whatever -- then return
- them wrapped inside a Test (either a L{TestSuite} or a L{TestCase}).
-
- @ivar methodPrefix: A string prefix. C{TestLoader} will assume that all the
- methods in a class that begin with C{methodPrefix} are test cases.
-
- @ivar modulePrefix: A string prefix. Every module in a package that begins
- with C{modulePrefix} is considered a module full of tests.
-
- @ivar forceGarbageCollection: A flag applied to each C{TestCase} loaded.
- See L{unittest.TestCase} for more information.
-
- @ivar sorter: A key function used to sort C{TestCase}s, test classes,
- modules and packages.
-
- @ivar suiteFactory: A callable which is passed a list of tests (which
- themselves may be suites of tests). Must return a test suite.
- """
-
- methodPrefix = 'test'
- modulePrefix = 'test_'
-
- def __init__(self):
- self.suiteFactory = TestSuite
- self.sorter = name
- self._importErrors = []
-
- def sort(self, xs):
- """
- Sort the given things using L{sorter}.
-
- @param xs: A list of test cases, class or modules.
- """
- return dsu(xs, self.sorter)
-
- def findTestClasses(self, module):
- """Given a module, return all Trial test classes"""
- classes = []
- for name, val in inspect.getmembers(module):
- if isTestCase(val):
- classes.append(val)
- return self.sort(classes)
-
- def findByName(self, name):
- """
- Return a Python object given a string describing it.
-
- @param name: a string which may be either a filename or a
- fully-qualified Python name.
-
- @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.path.exists(name):
- return filenameToModule(name)
- return reflect.namedAny(name)
-
- def loadModule(self, module):
- """
- Return a test suite with all the tests from a module.
-
- Included are TestCase subclasses and doctests listed in the module's
- __doctests__ module. If that's not good for you, put a function named
- either C{testSuite} or C{test_suite} in your module that returns a
- TestSuite, and I'll use the results of that instead.
-
- If C{testSuite} and C{test_suite} are both present, then I'll use
- C{testSuite}.
- """
- ## XXX - should I add an optional parameter to disable the check for
- ## a custom suite.
- ## OR, should I add another method
- if not isinstance(module, types.ModuleType):
- raise TypeError("%r is not a module" % (module,))
- if hasattr(module, 'testSuite'):
- return module.testSuite()
- elif hasattr(module, 'test_suite'):
- return module.test_suite()
- suite = self.suiteFactory()
- for testClass in self.findTestClasses(module):
- suite.addTest(self.loadClass(testClass))
- if not hasattr(module, '__doctests__'):
- return suite
- docSuite = self.suiteFactory()
- for doctest in module.__doctests__:
- docSuite.addTest(self.loadDoctests(doctest))
- return self.suiteFactory([suite, docSuite])
- loadTestsFromModule = loadModule
-
- def loadClass(self, klass):
- """
- Given a class which contains test cases, return a sorted list of
- C{TestCase} instances.
- """
- if not (isinstance(klass, type) or isinstance(klass, types.ClassType)):
- raise TypeError("%r is not a class" % (klass,))
- if not isTestCase(klass):
- raise ValueError("%r is not a test case" % (klass,))
- names = self.getTestCaseNames(klass)
- tests = self.sort([self._makeCase(klass, self.methodPrefix+name)
- for name in names])
- return self.suiteFactory(tests)
- loadTestsFromTestCase = loadClass
-
- def getTestCaseNames(self, klass):
- """
- Given a class that contains C{TestCase}s, return a list of names of
- methods that probably contain tests.
- """
- return reflect.prefixedMethodNames(klass, self.methodPrefix)
-
- def loadMethod(self, method):
- """
- Given a method of a C{TestCase} that represents a test, return a
- C{TestCase} instance for that test.
- """
- if not isinstance(method, types.MethodType):
- raise TypeError("%r not a method" % (method,))
- return self._makeCase(method.im_class, method.__name__)
-
- def _makeCase(self, klass, methodName):
- return klass(methodName)
-
- def loadPackage(self, package, recurse=False):
- """
- Load tests from a module object representing a package, and return a
- TestSuite containing those tests.
-
- Tests are only loaded from modules whose name begins with 'test_'
- (or whatever C{modulePrefix} is set to).
-
- @param package: a types.ModuleType object (or reasonable facsimilie
- obtained by importing) which may contain tests.
-
- @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.
-
- @raise: TypeError if 'package' is not a package.
-
- @return: a TestSuite created with my suiteFactory, containing all the
- tests.
- """
- if not isPackage(package):
- raise TypeError("%r is not a package" % (package,))
- pkgobj = modules.getModule(package.__name__)
- if recurse:
- discovery = pkgobj.walkModules()
- else:
- discovery = pkgobj.iterModules()
- discovered = []
- for disco in discovery:
- if disco.name.split(".")[-1].startswith(self.modulePrefix):
- discovered.append(disco)
- suite = self.suiteFactory()
- for modinfo in self.sort(discovered):
- try:
- module = modinfo.load()
- except:
- thingToAdd = ErrorHolder(modinfo.name, failure.Failure())
- else:
- thingToAdd = self.loadModule(module)
- suite.addTest(thingToAdd)
- return suite
-
- def loadDoctests(self, module):
- """
- Return a suite of tests for all the doctests defined in C{module}.
-
- @param module: A module object or a module name.
- """
- if isinstance(module, str):
- try:
- module = reflect.namedAny(module)
- except:
- return ErrorHolder(module, failure.Failure())
- if not inspect.ismodule(module):
- warnings.warn("trial only supports doctesting modules")
- return
- return doctest.DocTestSuite(module)
-
- def loadAnything(self, thing, recurse=False):
- """
- Given a Python object, return whatever tests that are in it. Whatever
- 'in' might mean.
-
- @param thing: A Python object. A module, method, class or package.
- @param recurse: Whether or not to look in subpackages of packages.
- Defaults to False.
-
- @return: A C{TestCase} or C{TestSuite}.
- """
- if isinstance(thing, types.ModuleType):
- if isPackage(thing):
- return self.loadPackage(thing, recurse)
- return self.loadModule(thing)
- elif isinstance(thing, types.ClassType):
- return self.loadClass(thing)
- elif isinstance(thing, type):
- return self.loadClass(thing)
- elif isinstance(thing, types.MethodType):
- return self.loadMethod(thing)
- raise TypeError("No loader for %r. Unrecognized type" % (thing,))
-
- def loadByName(self, name, recurse=False):
- """
- Given a string representing a Python object, return whatever tests
- are in that object.
-
- If C{name} is somehow inaccessible (e.g. the module can't be imported,
- there is no Python object with that name etc) then return an
- L{ErrorHolder}.
-
- @param name: The fully-qualified name of a Python object.
- """
- try:
- thing = self.findByName(name)
- except:
- return ErrorHolder(name, failure.Failure())
- return self.loadAnything(thing, recurse)
- loadTestsFromName = loadByName
-
- def loadByNames(self, names, recurse=False):
- """
- Construct a TestSuite containing all the tests found in 'names', where
- names is a list of fully qualified python names and/or filenames. The
- suite returned will have no duplicate tests, even if the same object
- is named twice.
- """
- things = []
- errors = []
- for name in names:
- try:
- things.append(self.findByName(name))
- except:
- errors.append(ErrorHolder(name, failure.Failure()))
- suites = [self.loadAnything(thing, recurse)
- for thing in set(things)]
- suites.extend(errors)
- return self.suiteFactory(suites)
-
-
-
-class DryRunVisitor(object):
- """
- A visitor that makes a reporter think that every test visited has run
- successfully.
- """
-
- def __init__(self, reporter):
- """
- @param reporter: A C{TestResult} object.
- """
- self.reporter = reporter
-
-
- def markSuccessful(self, testCase):
- """
- Convince the reporter that this test has been run successfully.
- """
- self.reporter.startTest(testCase)
- self.reporter.addSuccess(testCase)
- self.reporter.stopTest(testCase)
-
-
-
-class TrialRunner(object):
- """
- A specialised runner that the trial front end uses.
- """
-
- DEBUG = 'debug'
- DRY_RUN = 'dry-run'
-
- def _getDebugger(self):
- dbg = pdb.Pdb()
- try:
- import readline
- except ImportError:
- print "readline module not available"
- hasattr(sys, 'exc_clear') and sys.exc_clear()
- for path in ('.pdbrc', 'pdbrc'):
- if os.path.exists(path):
- try:
- rcFile = file(path, 'r')
- except IOError:
- hasattr(sys, 'exc_clear') and sys.exc_clear()
- else:
- dbg.rcLines.extend(rcFile.readlines())
- return dbg
-
- def _setUpTestdir(self):
- self._tearDownLogFile()
- currentDir = os.getcwd()
- testdir = os.path.normpath(os.path.abspath(self.workingDirectory))
- if os.path.exists(testdir):
- try:
- shutil.rmtree(testdir)
- except OSError, e:
- print ("could not remove %r, caught OSError [Errno %s]: %s"
- % (testdir, e.errno,e.strerror))
- try:
- os.rename(testdir,
- os.path.abspath("_trial_temp_old%s"
- % random.randint(0, 99999999)))
- except OSError, e:
- print ("could not rename path, caught OSError [Errno %s]: %s"
- % (e.errno,e.strerror))
- raise
- os.mkdir(testdir)
- os.chdir(testdir)
- return currentDir
-
- def _makeResult(self):
- reporter = self.reporterFactory(self.stream, self.tbformat,
- self.rterrors)
- if self.uncleanWarnings:
- reporter = UncleanWarningsReporterWrapper(reporter)
- return reporter
-
- def __init__(self, reporterFactory,
- mode=None,
- logfile='test.log',
- stream=sys.stdout,
- profile=False,
- tracebackFormat='default',
- realTimeErrors=False,
- uncleanWarnings=False,
- workingDirectory=None,
- forceGarbageCollection=False):
- self.reporterFactory = reporterFactory
- self.logfile = logfile
- self.mode = mode
- self.stream = stream
- self.tbformat = tracebackFormat
- self.rterrors = realTimeErrors
- self.uncleanWarnings = uncleanWarnings
- self._result = None
- self.workingDirectory = workingDirectory or '_trial_temp'
- self._logFileObserver = None
- self._logFileObject = None
- self._logWarnings = False
- self._forceGarbageCollection = forceGarbageCollection
- if profile:
- self.run = util.profiled(self.run, 'profile.data')
-
- def _setUpLogging(self):
- self._setUpLogFile()
- self._setUpLogWarnings()
-
- def _tearDownLogFile(self):
- if self._logFileObserver is not None:
- log.removeObserver(self._logFileObserver.emit)
- self._logFileObserver = None
- if self._logFileObject is not None:
- self._logFileObject.close()
- self._logFileObject = None
-
- def _setUpLogFile(self):
- self._tearDownLogFile()
- if self.logfile == '-':
- logFile = sys.stdout
- else:
- logFile = file(self.logfile, 'a')
- self._logFileObject = logFile
- self._logFileObserver = log.FileLogObserver(logFile)
- log.startLoggingWithObserver(self._logFileObserver.emit, 0)
-
- def _setUpLogWarnings(self):
- if self._logWarnings:
- return
- def seeWarnings(x):
- if x.has_key('warning'):
- print
- print x['format'] % x
- log.addObserver(seeWarnings)
- self._logWarnings = True
-
- def run(self, test):
- """
- Run the test or suite and return a result object.
- """
- result = self._makeResult()
- test = unittest.decorate(test, ITestCase)
- if self._forceGarbageCollection:
- test = unittest.decorate(
- test, unittest._ForceGarbageCollectionDecorator)
- # decorate the suite with reactor cleanup and log starting
- # This should move out of the runner and be presumed to be
- # present
- suite = TrialSuite([test])
- startTime = time.time()
- if self.mode == self.DRY_RUN:
- suite.visit(DryRunVisitor(result).markSuccessful)
- elif self.mode == self.DEBUG:
- # open question - should this be self.debug() instead.
- debugger = self._getDebugger()
- oldDir = self._setUpTestdir()
- try:
- self._setUpLogging()
- debugger.runcall(suite.run, result)
- finally:
- self._tearDownLogFile()
- os.chdir(oldDir)
- else:
- oldDir = self._setUpTestdir()
- try:
- self._setUpLogging()
- suite.run(result)
- finally:
- self._tearDownLogFile()
- os.chdir(oldDir)
- endTime = time.time()
- done = getattr(result, 'done', None)
- if done is None:
- warnings.warn(
- "%s should implement done() but doesn't. Falling back to "
- "printErrors() and friends." % reflect.qual(result.__class__),
- category=DeprecationWarning, stacklevel=2)
- result.printErrors()
- result.writeln(result.separator)
- result.writeln('Ran %d tests in %.3fs', result.testsRun,
- endTime - startTime)
- result.write('\n')
- result.printSummary()
- else:
- result.done()
- return result
-
- def runUntilFailure(self, test):
- """
- Repeatedly run C{test} until it fails.
- """
- count = 0
- while True:
- count += 1
- self.stream.write("Test Pass %d\n" % (count,))
- result = self.run(test)
- if result.testsRun == 0:
- break
- if not result.wasSuccessful():
- break
- return result
-
« no previous file with comments | « third_party/twisted_8_1/twisted/trial/reporter.py ('k') | third_party/twisted_8_1/twisted/trial/test/__init__.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698