summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-07-22 13:39:05 -0400
committerNed Batchelder <ned@nedbatchelder.com>2015-07-22 13:39:05 -0400
commitb39a2750f80d9972c92c81eac65d095c63a5510e (patch)
tree4140dcc8c98182eb4d40228f741a11f8ba29f9a9
parenta9340b38bf152ff49b38df6026624280419ee93f (diff)
downloadpython-coveragepy-git-b39a2750f80d9972c92c81eac65d095c63a5510e.tar.gz
A way to see the raw data in the data file.
-rw-r--r--coverage/cmdline.py15
-rw-r--r--coverage/data.py17
-rw-r--r--coverage/misc.py15
3 files changed, 41 insertions, 6 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index 7d014902..b15eb107 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -8,7 +8,7 @@ import traceback
from coverage import env
from coverage.execfile import run_python_file, run_python_module
-from coverage.misc import CoverageException, ExceptionDuringRun, NoSource
+from coverage.misc import CoverageException, ExceptionDuringRun, NoSource, pretty_data
from coverage.debug import info_formatter, info_header
@@ -589,9 +589,9 @@ class CoverageScript(object):
data = self.coverage.data
print(info_header("data"))
print("path: %s" % self.coverage.data_files.filename)
- print("has_arcs: %r" % data.has_arcs())
- summary = data.line_counts(fullpath=True)
- if summary:
+ if data:
+ print("has_arcs: %r" % data.has_arcs())
+ summary = data.line_counts(fullpath=True)
filenames = sorted(summary.keys())
print("\n%d files:" % len(filenames))
for f in filenames:
@@ -602,6 +602,13 @@ class CoverageScript(object):
print(line)
else:
print("No data collected")
+ elif info == 'rawdata':
+ self.coverage.load()
+ if self.coverage.data:
+ data = self.coverage.data._read_raw_data_file(self.coverage.config.data_file)
+ print(pretty_data(data))
+ else:
+ print("No data collected")
else:
self.help_fn("Don't know what you mean by %r" % info)
return ERR
diff --git a/coverage/data.py b/coverage/data.py
index 3eb51bf3..2f1cf442 100644
--- a/coverage/data.py
+++ b/coverage/data.py
@@ -200,13 +200,21 @@ class CoverageData(object):
__bool__ = __nonzero__
+ def _open_for_reading(self, filename):
+ """Open a file appropriately for reading data."""
+ return open(filename, "r")
+
+ def _read_raw_data(self, file_obj):
+ """Read the raw data from a file object."""
+ return json.load(file_obj)
+
def read(self, file_obj):
"""Read the coverage data from the given file object.
Should only be used on an empty CoverageData object.
"""
- data = json.load(file_obj)
+ data = self._read_raw_data(file_obj)
self._lines = data.get('lines', {})
self._arcs = dict(
@@ -220,7 +228,7 @@ class CoverageData(object):
if self._debug and self._debug.should('dataio'):
self._debug.write("Reading data from %r" % (filename,))
try:
- with open(filename, "r") as f:
+ with self._open_for_reading(filename) as f:
self.read(f)
except Exception as exc:
raise CoverageException(
@@ -229,6 +237,11 @@ class CoverageData(object):
)
)
+ def _read_raw_data_file(self, filename):
+ """Read the raw data from a file, for debugging."""
+ with self._open_for_reading(filename) as f:
+ return self._read_raw_data(f)
+
##
## Writing data
##
diff --git a/coverage/misc.py b/coverage/misc.py
index b99fbb81..ca09be7d 100644
--- a/coverage/misc.py
+++ b/coverage/misc.py
@@ -3,7 +3,9 @@
import errno
import hashlib
import inspect
+import json
import os
+import re
from coverage import env
from coverage.backward import string_class, to_bytes, unicode_class
@@ -170,6 +172,19 @@ def _needs_to_implement(that, func_name):
)
+def pretty_data(data):
+ """Format data as JSON, but as nicely as possible.
+
+ Returns a string.
+
+ """
+ # Start with a basic JSON dump.
+ out = json.dumps(data, indent=4, sort_keys=True)
+ # But pairs of numbers shouldn't be split across lines...
+ out = re.sub(r"\[\s+(-?\d+),\s+(-?\d+)\s+]", r"[\1, \2]", out)
+ return out
+
+
class CoverageException(Exception):
"""An exception specific to Coverage."""
pass