| Index: third_party/coverage-3.7.1/coverage/results.py
|
| diff --git a/third_party/coverage-3.6/coverage/results.py b/third_party/coverage-3.7.1/coverage/results.py
|
| similarity index 86%
|
| rename from third_party/coverage-3.6/coverage/results.py
|
| rename to third_party/coverage-3.7.1/coverage/results.py
|
| index 77ff2a2d13e08e8d8d54b4f2387e039e4fd0c47f..db6df0d30b7e389319de83ebaaf11fa4c7806e22 100644
|
| --- a/third_party/coverage-3.6/coverage/results.py
|
| +++ b/third_party/coverage-3.7.1/coverage/results.py
|
| @@ -15,16 +15,10 @@ class Analysis(object):
|
| self.code_unit = code_unit
|
|
|
| self.filename = self.code_unit.filename
|
| - ext = os.path.splitext(self.filename)[1]
|
| - source = None
|
| - if ext == '.py':
|
| - if not os.path.exists(self.filename):
|
| - source = self.coverage.file_locator.get_zip_data(self.filename)
|
| - if not source:
|
| - raise NoSource("No source for code: '%s'" % self.filename)
|
| + actual_filename, source = self.find_source(self.filename)
|
|
|
| self.parser = CodeParser(
|
| - text=source, filename=self.filename,
|
| + text=source, filename=actual_filename,
|
| exclude=self.coverage._exclude_regex('exclude')
|
| )
|
| self.statements, self.excluded = self.parser.parse_source()
|
| @@ -32,7 +26,7 @@ class Analysis(object):
|
| # Identify missing statements.
|
| executed = self.coverage.data.executed_lines(self.filename)
|
| exec1 = self.parser.first_lines(executed)
|
| - self.missing = sorted(set(self.statements) - set(exec1))
|
| + self.missing = self.statements - exec1
|
|
|
| if self.coverage.data.has_arcs():
|
| self.no_branch = self.parser.lines_matching(
|
| @@ -59,6 +53,44 @@ class Analysis(object):
|
| n_missing_branches=n_missing_branches,
|
| )
|
|
|
| + def find_source(self, filename):
|
| + """Find the source for `filename`.
|
| +
|
| + Returns two values: the actual filename, and the source.
|
| +
|
| + The source returned depends on which of these cases holds:
|
| +
|
| + * The filename seems to be a non-source file: returns None
|
| +
|
| + * The filename is a source file, and actually exists: returns None.
|
| +
|
| + * The filename is a source file, and is in a zip file or egg:
|
| + returns the source.
|
| +
|
| + * The filename is a source file, but couldn't be found: raises
|
| + `NoSource`.
|
| +
|
| + """
|
| + source = None
|
| +
|
| + base, ext = os.path.splitext(filename)
|
| + TRY_EXTS = {
|
| + '.py': ['.py', '.pyw'],
|
| + '.pyw': ['.pyw'],
|
| + }
|
| + try_exts = TRY_EXTS.get(ext)
|
| + if not try_exts:
|
| + return filename, None
|
| +
|
| + for try_ext in try_exts:
|
| + try_filename = base + try_ext
|
| + if os.path.exists(try_filename):
|
| + return try_filename, None
|
| + source = self.coverage.file_locator.get_zip_data(try_filename)
|
| + if source:
|
| + return try_filename, source
|
| + raise NoSource("No source for code: '%s'" % filename)
|
| +
|
| def missing_formatted(self):
|
| """The missing line numbers, formatted nicely.
|
|
|
|
|