summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'coverage')
-rw-r--r--coverage/backward.py12
-rw-r--r--coverage/cmdline.py2
-rw-r--r--coverage/codeunit.py4
-rw-r--r--coverage/config.py2
-rw-r--r--coverage/control.py4
-rw-r--r--coverage/data.py2
-rw-r--r--coverage/execfile.py9
-rw-r--r--coverage/html.py29
-rw-r--r--coverage/parser.py20
-rw-r--r--coverage/phystokens.py2
-rw-r--r--coverage/results.py4
-rw-r--r--coverage/xmlreport.py2
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):