From 84f70f69c5e3f7117d219f842ef66ec037478bc9 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 21 May 2022 07:39:16 -0400 Subject: [PATCH] fix: CoverageData(no_disk=True).update() now works. #1323 --- CHANGES.rst | 3 +++ coverage/sqldata.py | 12 +++++++----- tests/test_data.py | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index cd90a1f47..c483ed391 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -39,7 +39,10 @@ Unreleased - On Python 3.11, the ``[toml]`` extra no longer installs tomli, instead using tomllib from the standard library. Thanks `Shantanu `_. +- In-memory CoverageData objects now properly update(), closing `issue 1323`_. + .. _issue 1310: https://github.com/nedbat/coveragepy/issues/1310 +.. _issue 1323: https://github.com/nedbat/coveragepy/issues/1323 .. _issue 1351: https://github.com/nedbat/coveragepy/issues/1351 .. _pull 1354: https://github.com/nedbat/coveragepy/pull/1354 .. _pull 1359: https://github.com/nedbat/coveragepy/pull/1359 diff --git a/coverage/sqldata.py b/coverage/sqldata.py index c8594a453..58b82d2f5 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -253,10 +253,10 @@ def _choose_filename(self): def _reset(self): """Reset our attributes.""" - if self._dbs: + if not self._no_disk: for db in self._dbs.values(): db.close() - self._dbs = {} + self._dbs = {} self._file_map = {} self._have_used = False self._current_context_id = None @@ -679,6 +679,7 @@ def update(self, other_data, aliases=None): path: id for id, path in conn.execute("select id, path from file") } + self._file_map.update(file_ids) conn.executemany( "insert or ignore into context (context) values (?)", ((context,) for context in contexts) @@ -752,9 +753,10 @@ def update(self, other_data, aliases=None): ((file_ids[filename], tracer) for filename, tracer in tracer_map.items()) ) - # Update all internal cache data. - self._reset() - self.read() + if not self._no_disk: + # Update all internal cache data. + self._reset() + self.read() def erase(self, parallel=False): """Erase the data in this object. diff --git a/tests/test_data.py b/tests/test_data.py index f8bff2eb0..d20e3ff04 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -891,3 +891,19 @@ def test_misfed_serialization(self): ) with pytest.raises(DataError, match=msg): covdata.loads(bad_data) + + +class NoDiskTest(CoverageTest): + """Tests of in-memory CoverageData.""" + + run_in_temp_dir = False + + def test_updating(self): + # https://github.com/nedbat/coveragepy/issues/1323 + a = CoverageData(no_disk=True) + a.add_lines({'foo.py': [10, 20, 30]}) + assert a.measured_files() == {'foo.py'} + + b = CoverageData(no_disk=True) + b.update(a) + assert b.measured_files() == {'foo.py'}