summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/data.py36
-rw-r--r--coverage/debug.py17
-rw-r--r--tests/test_data.py12
3 files changed, 37 insertions, 28 deletions
diff --git a/coverage/data.py b/coverage/data.py
index 9a636358..c19b5c64 100644
--- a/coverage/data.py
+++ b/coverage/data.py
@@ -5,14 +5,16 @@
import glob
import json
+import optparse
import os
import os.path
import random
+import re
import socket
from coverage import env
from coverage.backward import iitems, string_class
-from coverage.debug import _TEST_NAME_FILE, pretty_data
+from coverage.debug import _TEST_NAME_FILE
from coverage.files import PathAliases
from coverage.misc import CoverageException, file_be_gone
@@ -699,6 +701,29 @@ class CoverageDataFiles(object):
file_be_gone(f)
+def canonicalize_json_data(data):
+ """Canonicalize our JSON data so it can be compared."""
+ for fname, lines in iitems(data.get('lines', {})):
+ data['lines'][fname] = sorted(lines)
+ for fname, arcs in iitems(data.get('arcs', {})):
+ data['arcs'][fname] = sorted(arcs)
+
+
+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)
+ # Trailing spaces mess with tests, get rid of them.
+ out = re.sub(r"(?m)\s+$", "", out)
+ return out
+
+
def debug_main(args):
"""Dump the raw data from data files.
@@ -707,9 +732,18 @@ def debug_main(args):
$ python -m coverage.data [FILE]
"""
+ parser = optparse.OptionParser()
+ parser.add_option(
+ "-c", "--canonical", action="store_true",
+ help="Sort data into a canonical order",
+ )
+ options, args = parser.parse_args(args)
+
for filename in (args or [".coverage"]):
print("--- {0} ------------------------------".format(filename))
data = CoverageData._read_raw_data_file(filename)
+ if options.canonical:
+ canonicalize_json_data(data)
print(pretty_data(data))
diff --git a/coverage/debug.py b/coverage/debug.py
index 8ae087d7..8d6892bb 100644
--- a/coverage/debug.py
+++ b/coverage/debug.py
@@ -4,9 +4,7 @@
"""Control of and utilities for debugging."""
import inspect
-import json
import os
-import re
import sys
@@ -100,18 +98,3 @@ def dump_stack_frames(out=None): # pragma: debugging
out = out or sys.stdout
out.write(short_stack())
out.write("\n")
-
-
-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)
- # Trailing spaces mess with tests, get rid of them.
- out = re.sub(r"(?m)\s+$", "", out)
- return out
diff --git a/tests/test_data.py b/tests/test_data.py
index ec3a6786..93e482d7 100644
--- a/tests/test_data.py
+++ b/tests/test_data.py
@@ -11,8 +11,8 @@ import re
import mock
-from coverage.backward import iitems, StringIO
-from coverage.data import CoverageData, CoverageDataFiles, debug_main
+from coverage.backward import StringIO
+from coverage.data import CoverageData, CoverageDataFiles, debug_main, canonicalize_json_data
from coverage.files import PathAliases, canonical_filename
from coverage.misc import CoverageException
@@ -493,14 +493,6 @@ class CoverageDataTestInTempDir(DataTestHelpers, CoverageTest):
self.assertEqual(expected[name], json_got)
-def canonicalize_json_data(data):
- """Canonicalize our JSON data so it can be compared."""
- for fname, lines in iitems(data.get('lines', {})):
- data['lines'][fname] = sorted(lines)
- for fname, arcs in iitems(data.get('arcs', {})):
- data['arcs'][fname] = sorted(arcs)
-
-
class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
"""Tests of CoverageDataFiles."""