summaryrefslogtreecommitdiff
path: root/coverage/collector.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/collector.py')
-rw-r--r--coverage/collector.py19
1 files changed, 12 insertions, 7 deletions
diff --git a/coverage/collector.py b/coverage/collector.py
index 72ab32b6..fa3eaaa4 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -1,5 +1,5 @@
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
-# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
"""Raw data collector for coverage.py."""
@@ -9,6 +9,7 @@ import sys
from coverage import env
from coverage.backward import litems, range # pylint: disable=redefined-builtin
from coverage.debug import short_stack
+from coverage.disposition import FileDisposition
from coverage.files import abs_file
from coverage.misc import CoverageException, isolate_module
from coverage.pytracer import PyTracer
@@ -33,11 +34,6 @@ except ImportError:
CTracer = None
-class FileDisposition(object):
- """A simple value type for recording what to do with a file."""
- pass
-
-
def should_start_context(frame):
"""Who-Tests-What hack: Determine whether this frame begins a new who-context."""
fn_name = frame.f_code.co_name
@@ -107,6 +103,7 @@ class Collector(object):
self.origin = short_stack()
self.concur_id_func = None
+ self.abs_file_cache = {}
# We can handle a few concurrency options here, but only one at a time.
these_concurrencies = self.SUPPORTED_CONCURRENCIES.intersection(concurrency)
@@ -373,6 +370,14 @@ class Collector(object):
for tracer in self.tracers:
tracer.data = data
+ def cached_abs_file(self, filename):
+ """A locally cached version of `abs_file`."""
+ key = (type(filename), filename)
+ try:
+ return self.abs_file_cache[key]
+ except KeyError:
+ return self.abs_file_cache.setdefault(key, abs_file(filename))
+
def save_data(self, covdata):
"""Save the collected data to a `CoverageData`.
@@ -398,7 +403,7 @@ class Collector(object):
else:
raise runtime_err # pylint: disable=raising-bad-type
- return dict((abs_file(k), v) for k, v in items)
+ return dict((self.cached_abs_file(k), v) for k, v in items)
if self.branch:
covdata.add_arcs(abs_file_dict(self.data))