diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2015-01-01 08:39:40 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2015-01-01 08:39:40 -0500 |
commit | 17d7b2265c5a2d239e5c114cb86c00be0a30bdf2 (patch) | |
tree | a19f8f07684cc3d2f03a0802bd7e1f629900480c | |
parent | 464a8d3c7a0c2b608b52e40499a9fa0680880e17 (diff) | |
download | python-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.py | 60 | ||||
-rw-r--r-- | coverage/control.py | 2 | ||||
-rw-r--r-- | coverage/report.py | 6 | ||||
-rw-r--r-- | tests/test_codeunit.py | 52 |
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!") |