summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2009-12-23 21:39:54 -0500
committerNed Batchelder <ned@nedbatchelder.com>2009-12-23 21:39:54 -0500
commite7abaf77929c5f74e3535988a5953c7133263385 (patch)
tree1e8a1db565eaf66683520b9b55b70ced532ee5bc /coverage
parent964019e5df2943b69c4bb503269af2af4a9d1916 (diff)
downloadpython-coveragepy-e7abaf77929c5f74e3535988a5953c7133263385.tar.gz
A way to start coverage when Python starts, to help with measuring coverage in subprocesses.
Diffstat (limited to 'coverage')
-rw-r--r--coverage/__init__.py2
-rw-r--r--coverage/collector.py2
-rw-r--r--coverage/control.py27
3 files changed, 26 insertions, 5 deletions
diff --git a/coverage/__init__.py b/coverage/__init__.py
index 0d202ac..100e0b7 100644
--- a/coverage/__init__.py
+++ b/coverage/__init__.py
@@ -9,7 +9,7 @@ __version__ = "3.3a1" # see detailed history in CHANGES.txt
__url__ = "http://nedbatchelder.com/code/coverage"
-from coverage.control import coverage
+from coverage.control import coverage, measure_process
from coverage.data import CoverageData
from coverage.cmdline import main, CoverageScript
from coverage.misc import CoverageException
diff --git a/coverage/collector.py b/coverage/collector.py
index 29dddf6..1837aae 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -251,7 +251,7 @@ class Collector(object):
line_data = {}
for f, arcs in self.data.items():
line_data[f] = ldf = {}
- for l1, _ in arcs:
+ for l1, _ in list(arcs.keys()):
if l1:
ldf[l1] = None
return line_data
diff --git a/coverage/control.py b/coverage/control.py
index c1d32e9..4acef71 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -1,6 +1,6 @@
"""Core control stuff for Coverage."""
-import atexit, os, socket
+import atexit, os, random, socket
from coverage.annotate import AnnotateReporter
from coverage.backward import string_class
@@ -98,8 +98,10 @@ class coverage(object):
# Create the data file.
if data_suffix:
if not isinstance(data_suffix, string_class):
- # if data_suffix=True, use .machinename.pid
- data_suffix = ".%s.%s" % (socket.gethostname(), os.getpid())
+ # if data_suffix=True, use .machinename.pid.random
+ data_suffix = ".%s.%s.%06d" % (
+ socket.gethostname(), os.getpid(), random.randint(0,999999)
+ )
else:
data_suffix = None
@@ -369,3 +371,22 @@ class coverage(object):
]),
]
return info
+
+
+def measure_process():
+ """Called at Python startup time to perhaps measure coverage.
+
+ If the environment variable COVERAGE_PROCESS_START is defined, coverage
+ measurement is started, and the value of the variable is the data file
+ prefix to use.
+
+ """
+ cps = os.environ.get("COVERAGE_PROCESS_START")
+ if cps:
+ cov = coverage(
+ auto_data=True, data_file=cps, data_suffix=True, branch=True
+ )
+ if os.environ.get("COVERAGE_COVERAGE"):
+ # Measuring coverage within coverage.py takes yet more trickery.
+ cov.cover_prefix = "Please measure coverage.py!"
+ cov.start()