summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-01-01 08:39:40 -0500
committerNed Batchelder <ned@nedbatchelder.com>2015-01-01 08:39:40 -0500
commit17d7b2265c5a2d239e5c114cb86c00be0a30bdf2 (patch)
treea19f8f07684cc3d2f03a0802bd7e1f629900480c
parent464a8d3c7a0c2b608b52e40499a9fa0680880e17 (diff)
downloadpython-coveragepy-git-17d7b2265c5a2d239e5c114cb86c00be0a30bdf2.tar.gz
Be a little clearer about when we expect one thing, and when we expect a list
-rw-r--r--coverage/codeunit.py60
-rw-r--r--coverage/control.py2
-rw-r--r--coverage/report.py6
-rw-r--r--tests/test_codeunit.py52
4 files changed, 74 insertions, 46 deletions
diff --git a/coverage/codeunit.py b/coverage/codeunit.py
index 8265a786..dc9a7ee6 100644
--- a/coverage/codeunit.py
+++ b/coverage/codeunit.py
@@ -10,10 +10,10 @@ from coverage.parser import PythonParser
from coverage.phystokens import source_token_lines, source_encoding
-def code_unit_factory(morfs, file_locator, get_plugin=None):
- """Construct a list of CodeUnits from polymorphic inputs.
+def code_units_factory(morfs, file_locator, get_plugin=None):
+ """Construct a list of CodeUnits from modules or filenames.
- `morfs` is a module or a filename, or a list of same.
+ `morfs` is a module or filename, or a list of the same.
`file_locator` is a FileLocator that can help resolve filenames.
@@ -30,24 +30,45 @@ def code_unit_factory(morfs, file_locator, get_plugin=None):
code_units = []
for morf in morfs:
- plugin = None
- if isinstance(morf, string_class) and get_plugin:
- plugin = get_plugin(morf)
- if plugin:
- file_reporter = plugin.file_reporter(morf)
- if file_reporter is None:
- raise CoverageException(
- "Plugin %r did not provide a file reporter for %r." % (
- plugin.plugin_name, morf
- )
- )
- else:
- file_reporter = PythonCodeUnit(morf, file_locator)
+ file_reporter = code_unit_factory(morf, file_locator, get_plugin)
code_units.append(file_reporter)
return code_units
+def code_unit_factory(morf, file_locator, get_plugin=None):
+ """Construct a CodeUnit from a module or filename.
+
+ `morfs` is a module or a filename.
+
+ `file_locator` is a FileLocator that can help resolve filenames.
+
+ `get_plugin` is a function taking a filename, and returning a plugin
+ responsible for the file. It can also return None if there is no plugin
+ claiming the file.
+
+ Returns a CodeUnit object.
+
+ """
+ plugin = None
+
+ if isinstance(morf, string_class) and get_plugin:
+ plugin = get_plugin(morf)
+
+ if plugin:
+ file_reporter = plugin.file_reporter(morf)
+ if file_reporter is None:
+ raise CoverageException(
+ "Plugin %r did not provide a file reporter for %r." % (
+ plugin.plugin_name, morf
+ )
+ )
+ else:
+ file_reporter = PythonCodeUnit(morf, file_locator)
+
+ return file_reporter
+
+
class CodeUnit(object):
"""Code unit: a filename or module.
@@ -96,14 +117,19 @@ class CodeUnit(object):
def __lt__(self, other):
return self.name < other.name
+
def __le__(self, other):
return self.name <= other.name
+
def __eq__(self, other):
return self.name == other.name
+
def __ne__(self, other):
return self.name != other.name
+
def __gt__(self, other):
return self.name > other.name
+
def __ge__(self, other):
return self.name >= other.name
@@ -157,7 +183,7 @@ class PythonCodeUnit(CodeUnit):
# .pyc files should always refer to a .py instead.
if fname.endswith(('.pyc', '.pyo')):
fname = fname[:-1]
- elif fname.endswith('$py.class'): # Jython
+ elif fname.endswith('$py.class'): # Jython
fname = fname[:-9] + ".py"
return fname
diff --git a/coverage/control.py b/coverage/control.py
index ef430150..95592508 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -760,7 +760,7 @@ class Coverage(object):
self._harvest_data()
if not isinstance(it, CodeUnit):
- it = code_unit_factory(it, self.file_locator, get_plugin)[0]
+ it = code_unit_factory(it, self.file_locator, get_plugin)
return Analysis(self, it)
diff --git a/coverage/report.py b/coverage/report.py
index b93749c8..85d552e1 100644
--- a/coverage/report.py
+++ b/coverage/report.py
@@ -1,10 +1,12 @@
"""Reporter foundation for Coverage."""
import os
-from coverage.codeunit import code_unit_factory
+
+from coverage.codeunit import code_units_factory
from coverage.files import prep_patterns, FnmatchMatcher
from coverage.misc import CoverageException, NoSource, NotPython
+
class Reporter(object):
"""A base class for all reporters."""
@@ -34,7 +36,7 @@ class Reporter(object):
morfs = morfs or self.coverage.data.measured_files()
file_locator = self.coverage.file_locator
get_plugin = self.coverage.data.plugin_data().get
- self.code_units = code_unit_factory(morfs, file_locator, get_plugin)
+ self.code_units = code_units_factory(morfs, file_locator, get_plugin)
if self.config.include:
patterns = prep_patterns(self.config.include)
diff --git a/tests/test_codeunit.py b/tests/test_codeunit.py
index b90ac2e8..b3b188b4 100644
--- a/tests/test_codeunit.py
+++ b/tests/test_codeunit.py
@@ -3,7 +3,7 @@
import os
import sys
-from coverage.codeunit import code_unit_factory
+from coverage.codeunit import code_unit_factory, code_units_factory
from coverage.files import FileLocator
from tests.coveragetest import CoverageTest
@@ -27,36 +27,36 @@ class CodeUnitTest(CoverageTest):
acu = code_unit_factory("aa/afile.py", FileLocator())
bcu = code_unit_factory("aa/bb/bfile.py", FileLocator())
ccu = code_unit_factory("aa/bb/cc/cfile.py", FileLocator())
- self.assertEqual(acu[0].name, "aa/afile")
- self.assertEqual(bcu[0].name, "aa/bb/bfile")
- self.assertEqual(ccu[0].name, "aa/bb/cc/cfile")
- self.assertEqual(acu[0].flat_rootname(), "aa_afile")
- self.assertEqual(bcu[0].flat_rootname(), "aa_bb_bfile")
- self.assertEqual(ccu[0].flat_rootname(), "aa_bb_cc_cfile")
- self.assertEqual(acu[0].source(), "# afile.py\n")
- self.assertEqual(bcu[0].source(), "# bfile.py\n")
- self.assertEqual(ccu[0].source(), "# cfile.py\n")
+ self.assertEqual(acu.name, "aa/afile")
+ self.assertEqual(bcu.name, "aa/bb/bfile")
+ self.assertEqual(ccu.name, "aa/bb/cc/cfile")
+ self.assertEqual(acu.flat_rootname(), "aa_afile")
+ self.assertEqual(bcu.flat_rootname(), "aa_bb_bfile")
+ self.assertEqual(ccu.flat_rootname(), "aa_bb_cc_cfile")
+ self.assertEqual(acu.source(), "# afile.py\n")
+ self.assertEqual(bcu.source(), "# bfile.py\n")
+ self.assertEqual(ccu.source(), "# cfile.py\n")
def test_odd_filenames(self):
acu = code_unit_factory("aa/afile.odd.py", FileLocator())
bcu = code_unit_factory("aa/bb/bfile.odd.py", FileLocator())
b2cu = code_unit_factory("aa/bb.odd/bfile.py", FileLocator())
- self.assertEqual(acu[0].name, "aa/afile.odd")
- self.assertEqual(bcu[0].name, "aa/bb/bfile.odd")
- self.assertEqual(b2cu[0].name, "aa/bb.odd/bfile")
- self.assertEqual(acu[0].flat_rootname(), "aa_afile_odd")
- self.assertEqual(bcu[0].flat_rootname(), "aa_bb_bfile_odd")
- self.assertEqual(b2cu[0].flat_rootname(), "aa_bb_odd_bfile")
- self.assertEqual(acu[0].source(), "# afile.odd.py\n")
- self.assertEqual(bcu[0].source(), "# bfile.odd.py\n")
- self.assertEqual(b2cu[0].source(), "# bfile.py\n")
+ self.assertEqual(acu.name, "aa/afile.odd")
+ self.assertEqual(bcu.name, "aa/bb/bfile.odd")
+ self.assertEqual(b2cu.name, "aa/bb.odd/bfile")
+ self.assertEqual(acu.flat_rootname(), "aa_afile_odd")
+ self.assertEqual(bcu.flat_rootname(), "aa_bb_bfile_odd")
+ self.assertEqual(b2cu.flat_rootname(), "aa_bb_odd_bfile")
+ self.assertEqual(acu.source(), "# afile.odd.py\n")
+ self.assertEqual(bcu.source(), "# bfile.odd.py\n")
+ self.assertEqual(b2cu.source(), "# bfile.py\n")
def test_modules(self):
import aa
import aa.bb
import aa.bb.cc
- cu = code_unit_factory([aa, aa.bb, aa.bb.cc], FileLocator())
+ cu = code_units_factory([aa, aa.bb, aa.bb.cc], FileLocator())
self.assertEqual(cu[0].name, "aa")
self.assertEqual(cu[1].name, "aa.bb")
self.assertEqual(cu[2].name, "aa.bb.cc")
@@ -72,7 +72,7 @@ class CodeUnitTest(CoverageTest):
import aa.bb.bfile
import aa.bb.cc.cfile
- cu = code_unit_factory(
+ cu = code_units_factory(
[aa.afile, aa.bb.bfile, aa.bb.cc.cfile],
FileLocator()
)
@@ -87,10 +87,10 @@ class CodeUnitTest(CoverageTest):
self.assertEqual(cu[2].source(), "# cfile.py\n")
def test_comparison(self):
- acu = code_unit_factory("aa/afile.py", FileLocator())[0]
- acu2 = code_unit_factory("aa/afile.py", FileLocator())[0]
- zcu = code_unit_factory("aa/zfile.py", FileLocator())[0]
- bcu = code_unit_factory("aa/bb/bfile.py", FileLocator())[0]
+ acu = code_unit_factory("aa/afile.py", FileLocator())
+ acu2 = code_unit_factory("aa/afile.py", FileLocator())
+ zcu = code_unit_factory("aa/zfile.py", FileLocator())
+ bcu = code_unit_factory("aa/bb/bfile.py", FileLocator())
assert acu == acu2 and acu <= acu2 and acu >= acu2
assert acu < zcu and acu <= zcu and acu != zcu
assert zcu > acu and zcu >= acu and zcu != acu
@@ -108,6 +108,6 @@ class CodeUnitTest(CoverageTest):
# in the path is actually the .egg zip file.
self.assert_doesnt_exist(egg1.__file__)
- cu = code_unit_factory([egg1, egg1.egg1], FileLocator())
+ cu = code_units_factory([egg1, egg1.egg1], FileLocator())
self.assertEqual(cu[0].source(), u"")
self.assertEqual(cu[1].source().split("\n")[0], u"# My egg file!")