summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2019-07-09 11:58:54 -0400
committerNed Batchelder <ned@nedbatchelder.com>2019-07-09 11:58:54 -0400
commite16eb5245857db6574a0c0fdcf76879708a316c4 (patch)
tree0d0996c12051281cfe8c0520651d8b30866abe26
parent190d8257ec9c4b2e13561edce02dacdaa8a658f2 (diff)
downloadpython-coveragepy-git-e16eb5245857db6574a0c0fdcf76879708a316c4.tar.gz
Properly close the sqldata object
-rw-r--r--coverage/control.py17
-rw-r--r--coverage/sqldata.py10
-rw-r--r--tests/test_debug.py4
3 files changed, 24 insertions, 7 deletions
diff --git a/coverage/control.py b/coverage/control.py
index 250bc137..fbf4455c 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -4,6 +4,7 @@
"""Core control stuff for coverage.py."""
import atexit
+import contextlib
import os
import os.path
import platform
@@ -479,6 +480,7 @@ class Coverage(object):
self._instances.pop()
if self._started:
self._collector.stop()
+ self._data.close()
self._started = False
def _atexit(self):
@@ -503,6 +505,7 @@ class Coverage(object):
self._collector.reset()
self._init_data(suffix=None)
self._data.erase(parallel=self.config.parallel)
+ self._data.close()
self._data = None
def switch_context(self, new_context):
@@ -574,6 +577,7 @@ class Coverage(object):
"""Save the collected coverage data to the data file."""
data = self.get_data()
data.write()
+ data.close()
def combine(self, data_paths=None, strict=False):
"""Combine together a number of similarly-named coverage data files.
@@ -611,6 +615,7 @@ class Coverage(object):
aliases.add(pattern, result)
combine_parallel_data(self._data, aliases=aliases, data_paths=data_paths, strict=strict)
+ self._data.close()
def get_data(self):
"""Get the collected data.
@@ -785,7 +790,8 @@ class Coverage(object):
report_contexts=contexts,
)
reporter = SummaryReporter(self)
- return reporter.report(morfs, outfile=file)
+ with contextlib.closing(self._data):
+ return reporter.report(morfs, outfile=file)
def annotate(
self, morfs=None, directory=None, ignore_errors=None,
@@ -806,7 +812,8 @@ class Coverage(object):
report_include=include, report_contexts=contexts,
)
reporter = AnnotateReporter(self)
- reporter.report(morfs, directory=directory)
+ with contextlib.closing(self._data):
+ reporter.report(morfs, directory=directory)
def html_report(self, morfs=None, directory=None, ignore_errors=None,
omit=None, include=None, extra_css=None, title=None,
@@ -840,7 +847,8 @@ class Coverage(object):
skip_covered=skip_covered, show_contexts=show_contexts, report_contexts=contexts,
)
reporter = HtmlReporter(self)
- return reporter.report(morfs)
+ with contextlib.closing(self._data):
+ return reporter.report(morfs)
def xml_report(
self, morfs=None, outfile=None, ignore_errors=None,
@@ -880,7 +888,8 @@ class Coverage(object):
file_to_close = outfile
try:
reporter = XmlReporter(self)
- return reporter.report(morfs, outfile=outfile)
+ with contextlib.closing(self._data):
+ return reporter.report(morfs, outfile=outfile)
except CoverageException:
delete_file = True
raise
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index d35bb36a..2589d1b8 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -118,7 +118,7 @@ class CoverageSqliteData(SimpleReprMixin):
def _reset(self):
for db in self._dbs.values():
db.close()
- self._dbs = {}
+ self._dbs.clear()
self._file_map = {}
self._have_used = False
self._current_context_id = None
@@ -525,8 +525,14 @@ class CoverageSqliteData(SimpleReprMixin):
def write(self):
"""Write the collected coverage data to a file."""
+ pass
+
+ def close(self):
+ if self._debug.should('dataop'):
+ self._debug.write("Closing {!r}".format(self._filename))
for db in self._dbs.values():
db.close()
+ self._dbs.clear()
def _start_using(self):
if self._pid != os.getpid():
@@ -712,6 +718,8 @@ class SqliteDb(SimpleReprMixin):
def close(self):
if self.con is not None:
+ if self.debug:
+ self.debug.write("Closing connection")
self.con.close()
self.con = None
diff --git a/tests/test_debug.py b/tests/test_debug.py
index 351ef919..2e741dca 100644
--- a/tests/test_debug.py
+++ b/tests/test_debug.py
@@ -146,8 +146,8 @@ class DebugTraceTest(CoverageTest):
self.assertRegex(real_messages[-1], r"^\s*\d+\.\w{4}: Writing data")
self.assertRegex(last_line, r"\s+_write_file : .*coverage[/\\]data.py @\d+$")
else:
- self.assertRegex(real_messages[-1], r"^\s*\d+\.\w{4}: Adding file tracers: 0 files")
- self.assertRegex(last_line, r"\s+add_file_tracers : .*coverage[/\\]sqldata.py @\d+$")
+ self.assertRegex(real_messages[-1], r"^\s*\d+\.\w{4}: Closing ")
+ self.assertRegex(last_line, r"\s+close : .*coverage[/\\]sqldata.py @\d+$")
def test_debug_config(self):
out_lines = self.f1_debug_output(["config"])