diff options
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/backward.py | 12 | ||||
-rw-r--r-- | coverage/cmdline.py | 2 | ||||
-rw-r--r-- | coverage/codeunit.py | 4 | ||||
-rw-r--r-- | coverage/config.py | 2 | ||||
-rw-r--r-- | coverage/control.py | 4 | ||||
-rw-r--r-- | coverage/data.py | 2 | ||||
-rw-r--r-- | coverage/execfile.py | 9 | ||||
-rw-r--r-- | coverage/html.py | 29 | ||||
-rw-r--r-- | coverage/parser.py | 20 | ||||
-rw-r--r-- | coverage/phystokens.py | 2 | ||||
-rw-r--r-- | coverage/results.py | 4 | ||||
-rw-r--r-- | coverage/xmlreport.py | 2 |
12 files changed, 61 insertions, 31 deletions
diff --git a/coverage/backward.py b/coverage/backward.py index 425bcc6..c363f21 100644 --- a/coverage/backward.py +++ b/coverage/backward.py @@ -1,7 +1,7 @@ """Add things to old Pythons so I can pretend they are newer.""" # This file does lots of tricky stuff, so disable a bunch of lintisms. -# pylint: disable-msg=F0401,W0611,W0622 +# pylint: disable=F0401,W0611,W0622 # F0401: Unable to import blah # W0611: Unused import blah # W0622: Redefining built-in blah @@ -71,3 +71,13 @@ try: import configparser except ImportError: import ConfigParser as configparser + +# Python 3.2 provides `tokenize.open`, the best way to open source files. +try: + import tokenize + open_source = tokenize.open # pylint: disable=E1101 +except AttributeError: + def open_source(fname): + """Open a source file the best way.""" + return open(fname, "rU") + diff --git a/coverage/cmdline.py b/coverage/cmdline.py index e5d6bb8..18715b7 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -2,7 +2,7 @@ import optparse, re, sys, traceback -from coverage.backward import sorted # pylint: disable-msg=W0622 +from coverage.backward import sorted # pylint: disable=W0622 from coverage.execfile import run_python_file from coverage.misc import CoverageException, ExceptionDuringRun diff --git a/coverage/codeunit.py b/coverage/codeunit.py index dfc4560..55f44a2 100644 --- a/coverage/codeunit.py +++ b/coverage/codeunit.py @@ -2,7 +2,7 @@ import glob, os -from coverage.backward import string_class, StringIO +from coverage.backward import open_source, string_class, StringIO from coverage.misc import CoverageException @@ -104,7 +104,7 @@ class CodeUnit(object): """Return an open file for reading the source of the code unit.""" if os.path.exists(self.filename): # A regular text file: open it. - return open(self.filename) + return open_source(self.filename) # Maybe it's in a zip file? source = self.file_locator.get_zip_data(self.filename) diff --git a/coverage/config.py b/coverage/config.py index 1f6a879..eda3c1c 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -1,7 +1,7 @@ """Config file for coverage.py""" import os -from coverage.backward import configparser # pylint: disable-msg=W0622 +from coverage.backward import configparser # pylint: disable=W0622 class CoverageConfig(object): diff --git a/coverage/control.py b/coverage/control.py index 4fae198..8961a3c 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -269,7 +269,7 @@ class coverage(object): # To log what should_trace returns, change this to "if 1:" if 0: _real_should_trace = _should_trace - def _should_trace(self, filename, frame): # pylint: disable-msg=E0102 + def _should_trace(self, filename, frame): # pylint: disable=E0102 """A logging decorator around the real _should_trace function.""" ret = self._real_should_trace(filename, frame) print("should_trace: %r -> %r" % (filename, ret)) @@ -496,7 +496,7 @@ class coverage(object): return Analysis(self, it) def report(self, morfs=None, show_missing=True, ignore_errors=None, - file=None, # pylint: disable-msg=W0622 + file=None, # pylint: disable=W0622 omit=None, include=None ): """Write a summary report to `file`. diff --git a/coverage/data.py b/coverage/data.py index 3d750c4..5d482ea 100644 --- a/coverage/data.py +++ b/coverage/data.py @@ -2,7 +2,7 @@ import os -from coverage.backward import pickle, sorted # pylint: disable-msg=W0622 +from coverage.backward import pickle, sorted # pylint: disable=W0622 class CoverageData(object): diff --git a/coverage/execfile.py b/coverage/execfile.py index 333163f..c61556a 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -2,7 +2,7 @@ import imp, os, sys -from coverage.backward import exec_code_object +from coverage.backward import exec_code_object, open_source from coverage.misc import NoSource, ExceptionDuringRun @@ -38,10 +38,15 @@ def run_python_file(filename, args): try: # Open the source file. try: - source = open(filename, 'rU').read() + source_file = open_source(filename) except IOError: raise NoSource("No file to run: %r" % filename) + try: + source = source_file.read() + finally: + source_file.close() + # We have the source. `compile` still needs the last line to be clean, # so make sure it is, then compile a code object from it. if source[-1] != '\n': diff --git a/coverage/html.py b/coverage/html.py index 76e2890..87edad4 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -2,7 +2,7 @@ import os, re, shutil -from coverage import __url__, __version__ # pylint: disable-msg=W0611 +from coverage import __url__, __version__ # pylint: disable=W0611 from coverage.misc import CoverageException from coverage.phystokens import source_token_lines from coverage.report import Reporter @@ -10,7 +10,7 @@ from coverage.templite import Templite # Disable pylint msg W0612, because a bunch of variables look unused, but # they're accessed in a Templite context via locals(). -# pylint: disable-msg=W0612 +# pylint: disable=W0612 def data_filename(fname): """Return the path to a data file of ours.""" @@ -18,7 +18,11 @@ def data_filename(fname): def data(fname): """Return the contents of a data file of ours.""" - return open(data_filename(fname)).read() + data_file = open(data_filename(fname)) + try: + return data_file.read() + finally: + data_file.close() class HtmlReporter(Reporter): @@ -68,8 +72,11 @@ class HtmlReporter(Reporter): def html_file(self, cu, analysis): """Generate an HTML file for one source file.""" - - source = cu.source_file().read() + source_file = cu.source_file() + try: + source = source_file.read() + finally: + source_file.close() nums = analysis.numbers @@ -138,8 +145,10 @@ class HtmlReporter(Reporter): html_path = os.path.join(self.directory, html_filename) html = spaceless(self.source_tmpl.render(locals())) fhtml = open(html_path, 'w') - fhtml.write(html) - fhtml.close() + try: + fhtml.write(html) + finally: + fhtml.close() # Save this file's information for the index file. self.files.append({ @@ -159,8 +168,10 @@ class HtmlReporter(Reporter): totals = sum([f['nums'] for f in files]) fhtml = open(os.path.join(self.directory, "index.html"), "w") - fhtml.write(index_tmpl.render(locals())) - fhtml.close() + try: + fhtml.write(index_tmpl.render(locals())) + finally: + fhtml.close() # Helpers for templates and generating HTML diff --git a/coverage/parser.py b/coverage/parser.py index ae618ce..8ad4e05 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -2,7 +2,8 @@ import glob, opcode, os, re, sys, token, tokenize -from coverage.backward import set, sorted, StringIO # pylint: disable-msg=W0622 +from coverage.backward import set, sorted, StringIO # pylint: disable=W0622 +from coverage.backward import open_source from coverage.bytecode import ByteCodes, CodeObjects from coverage.misc import nice_pair, CoverageException, NoSource, expensive @@ -22,15 +23,16 @@ class CodeParser(object): self.text = text if not self.text: try: - sourcef = open(self.filename, 'rU') - self.text = sourcef.read() - sourcef.close() + sourcef = open_source(self.filename) + try: + self.text = sourcef.read() + finally: + sourcef.close() except IOError: _, err, _ = sys.exc_info() raise NoSource( "No source for code: %r: %s" % (self.filename, err) ) - self.text = self.text.replace('\r\n', '\n') self.exclude = exclude @@ -302,9 +304,11 @@ class ByteParser(object): else: if not text: assert filename, "If no code or text, need a filename" - sourcef = open(filename, 'rU') - text = sourcef.read() - sourcef.close() + sourcef = open_source(filename) + try: + text = sourcef.read() + finally: + sourcef.close() try: # Python 2.3 and 2.4 don't like partial last lines, so be sure diff --git a/coverage/phystokens.py b/coverage/phystokens.py index 60b8793..fc4f2c9 100644 --- a/coverage/phystokens.py +++ b/coverage/phystokens.py @@ -1,7 +1,7 @@ """Better tokenizing for coverage.py.""" import keyword, re, token, tokenize -from coverage.backward import StringIO # pylint: disable-msg=W0622 +from coverage.backward import StringIO # pylint: disable=W0622 def phys_tokens(toks): """Return all physical tokens, even line continuations. diff --git a/coverage/results.py b/coverage/results.py index 85071fe..a7ec0fd 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -2,7 +2,7 @@ import os -from coverage.backward import set, sorted # pylint: disable-msg=W0622 +from coverage.backward import set, sorted # pylint: disable=W0622 from coverage.misc import format_lines, NoSource from coverage.parser import CodeParser @@ -230,4 +230,4 @@ class Numbers(object): # Implementing 0+Numbers allows us to sum() a list of Numbers. if other == 0: return self - raise NotImplemented + return NotImplemented diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 5eabac7..5f6cc87 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -4,7 +4,7 @@ import os, sys, time import xml.dom.minidom from coverage import __url__, __version__ -from coverage.backward import sorted # pylint: disable-msg=W0622 +from coverage.backward import sorted # pylint: disable=W0622 from coverage.report import Reporter def rate(hit, num): |