From 6ffcb501734053b4e77e060e5baea8b9c9396214 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Mon, 8 Sep 2014 17:28:26 -0700
Subject: [PATCH] Remove 'trialcoverage' plugin and support code

Closes ticket:2281 (trac).

This removes src/allmydata/test/trial_coverage.py, which was a
in-process way to run trial tests under the "coverage" code-coverage
tool. These days, the preferred way to do this is with "coverage run",
although the actual invocation is a bit messy because of the way
bin/trial uses subprocess.call() to invoke the real entrypoint script
with the right PYTHONPATH (see #1698 for details). Hopefully this will
be improved to use a simpler "coverage run .." command in the future.

This patch also removes twisted/plugins/allmydata_trial.py, which
enabled the "--reporter=bwverbose-coverage" option. Finally it modifies
setup.py to stop looking for that option and adding "trialcoverage" to
the dependencies list, which gets us closer to removing "setup_requires"
entirely.
---
 setup.py                             |   7 --
 src/allmydata/test/trial_coverage.py | 110 ---------------------------
 twisted/plugins/allmydata_trial.py   |  41 ----------
 3 files changed, 158 deletions(-)
 delete mode 100644 src/allmydata/test/trial_coverage.py
 delete mode 100644 twisted/plugins/allmydata_trial.py

diff --git a/setup.py b/setup.py
index 04e54c20..469f7c87 100644
--- a/setup.py
+++ b/setup.py
@@ -133,13 +133,6 @@ setup_requires = []
 # https://bugs.launchpad.net/nevow/+bug/812537 has been fixed.
 setup_requires += [req for req in install_requires if req.startswith('Twisted') or req.startswith('zope.interface')]
 
-# trialcoverage is required if you want the "trial" unit test runner to have a
-# "--reporter=bwverbose-coverage" option which produces code-coverage results.
-# The required version is 0.3.3, because that is the latest version that only
-# depends on a version of pycoverage for which binary packages are available.
-if "--reporter=bwverbose-coverage" in sys.argv:
-    setup_requires.append('trialcoverage >= 0.3.3')
-
 # We no longer have any requirements specific to tests.
 tests_require=[]
 
diff --git a/src/allmydata/test/trial_coverage.py b/src/allmydata/test/trial_coverage.py
deleted file mode 100644
index 47569da1..00000000
--- a/src/allmydata/test/trial_coverage.py
+++ /dev/null
@@ -1,110 +0,0 @@
-
-"""A Trial IReporter plugin that gathers coverage.py code-coverage information.
-
-Once this plugin is installed, trial can be invoked a new --reporter option:
-
-  trial --reporter-bwverbose-coverage ARGS
-
-Once such a test run has finished, there will be a .coverage file in the
-top-level directory. This file can be turned into a directory of .html files
-(with index.html as the starting point) by running:
-
- coverage html -d OUTPUTDIR --omit=PREFIX1,PREFIX2,..
-
-The 'coverage' tool thinks in terms of absolute filenames. 'coverage' doesn't
-record data for files that come with Python, but it does record data for all
-the various site-package directories. To show only information for Tahoe
-source code files, you should provide --omit prefixes for everything else.
-This probably means something like:
-
-  --omit=/System/,/Library/,support/,src/allmydata/test/
-
-Before using this, you need to install the 'coverage' package, which will
-provide an executable tool named 'coverage' (as well as an importable
-library). 'coverage report' will produce a basic text summary of the coverage
-data. Our 'misc/coverage2text.py' tool produces a slightly more useful
-summary, and 'misc/coverage2html.py' will produce a more useful HTML report.
-
-"""
-
-from twisted.trial.reporter import TreeReporter, VerboseTextReporter
-
-# These plugins are registered via twisted/plugins/allmydata_trial.py . See
-# the notes there for an explanation of how that works.
-
-# Some notes about how trial Reporters are used:
-# * Reporters don't really get told about the suite starting and stopping.
-# * The Reporter class is imported before the test classes are.
-# * The test classes are imported before the Reporter is created. To get
-#   control earlier than that requires modifying twisted/scripts/trial.py
-# * Then Reporter.__init__ is called.
-# * Then tests run, calling things like write() and addSuccess(). Each test is
-#   framed by a startTest/stopTest call.
-# * Then the results are emitted, calling things like printErrors,
-#   printSummary, and wasSuccessful.
-# So for code-coverage (not including import), start in __init__ and finish
-# in printSummary. To include import, we have to start in our own import and
-# finish in printSummary.
-
-import coverage
-cov = coverage.coverage()
-cov.start()
-
-
-class CoverageTextReporter(VerboseTextReporter):
-    def __init__(self, *args, **kwargs):
-        VerboseTextReporter.__init__(self, *args, **kwargs)
-
-    def stop_coverage(self):
-        cov.stop()
-        cov.save()
-        print "Coverage results written to .coverage"
-    def printSummary(self):
-        # for twisted-2.5.x
-        self.stop_coverage()
-        return VerboseTextReporter.printSummary(self)
-    def done(self):
-        # for twisted-8.x
-        self.stop_coverage()
-        return VerboseTextReporter.done(self)
-
-class sample_Reporter(object):
-    # this class, used as a reporter on a fully-passing test suite, doesn't
-    # trigger exceptions. So it is a guide to what methods are invoked on a
-    # Reporter.
-    def __init__(self, *args, **kwargs):
-        print "START HERE"
-        self.r = TreeReporter(*args, **kwargs)
-        self.shouldStop = self.r.shouldStop
-        self.separator = self.r.separator
-        self.testsRun = self.r.testsRun
-        self._starting2 = False
-
-    def write(self, *args):
-        if not self._starting2:
-            self._starting2 = True
-            print "FIRST WRITE"
-        return self.r.write(*args)
-
-    def startTest(self, *args, **kwargs):
-        return self.r.startTest(*args, **kwargs)
-
-    def stopTest(self, *args, **kwargs):
-        return self.r.stopTest(*args, **kwargs)
-
-    def addSuccess(self, *args, **kwargs):
-        return self.r.addSuccess(*args, **kwargs)
-
-    def printErrors(self, *args, **kwargs):
-        return self.r.printErrors(*args, **kwargs)
-
-    def writeln(self, *args, **kwargs):
-        return self.r.writeln(*args, **kwargs)
-
-    def printSummary(self, *args, **kwargs):
-        print "PRINT SUMMARY"
-        return self.r.printSummary(*args, **kwargs)
-
-    def wasSuccessful(self, *args, **kwargs):
-        return self.r.wasSuccessful(*args, **kwargs)
-
diff --git a/twisted/plugins/allmydata_trial.py b/twisted/plugins/allmydata_trial.py
deleted file mode 100644
index c9ee5b9a..00000000
--- a/twisted/plugins/allmydata_trial.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /usr/bin/env python
-
-from zope.interface import implements
-from twisted.trial.itrial import IReporter
-from twisted.plugin import IPlugin
-
-# register a plugin that can create our CoverageReporter. The reporter itself
-# lives separately, in src/allmydata/test/trial_coverage.py
-
-# note that this allmydata_trial.py file is *not* in a package: there is no
-# __init__.py in our parent directory. This is important, because otherwise
-# ours would fight with Twisted's. When trial looks for plugins, it merely
-# executes all the *.py files it finds in any twisted/plugins/ subdirectories
-# of anything on sys.path . The namespace that results from executing these
-# .py files is examined for instances which provide both IPlugin and the
-# target interface (in this case, trial is looking for IReporter instances).
-# Each such instance tells the application how to create a plugin by naming
-# the module and class that should be instantiated.
-
-# When installing our package via setup.py, arrange for this file to be
-# installed to the system-wide twisted/plugins/ directory.
-
-class _Reporter(object):
-    implements(IPlugin, IReporter)
-
-    def __init__(self, name, module, description, longOpt, shortOpt, klass):
-        self.name = name
-        self.module = module
-        self.description = description
-        self.longOpt = longOpt
-        self.shortOpt = shortOpt
-        self.klass = klass
-
-
-bwcov = _Reporter("Code-Coverage Reporter (colorless)",
-                  "allmydata.test.trial_coverage",
-                  description="Colorless verbose output (with 'coverage' coverage)",
-                  longOpt="bwverbose-coverage",
-                  shortOpt=None,
-                  klass="CoverageTextReporter")
-
-- 
2.45.2