summaryrefslogtreecommitdiff
path: root/coverage/data.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-08-24 07:42:48 -0400
committerNed Batchelder <ned@nedbatchelder.com>2015-08-24 07:42:48 -0400
commit7602b24930c45c097ec4c5266905a64a0e41f839 (patch)
treef26d3a36f01ba46d6b7ccba2d921271d80bde5b4 /coverage/data.py
parent90f41ed049431bee8f5e5c09380823eb3c73c121 (diff)
downloadpython-coveragepy-git-7602b24930c45c097ec4c5266905a64a0e41f839.tar.gz
Data dumps can be canonicalized for comparison
Diffstat (limited to 'coverage/data.py')
-rw-r--r--coverage/data.py36
1 files changed, 35 insertions, 1 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))