Mercurial > p > roundup > code
changeset 7690:d17e57220a62 2.3.1a0
fix: close file properly in indexer_dbm.py:save_index()
Fix this error found in debug logs of gentoo packaging of round 2.2.0.
/roundup/backends/indexer_dbm.py:253: ResourceWarning: unclosed file
<_io.BufferedWriter name='test-index/indexes/index.db-'>
open(self.indexdb+'-', 'wb').write(zlib.compress(marshal.dumps(dbfil)))
Also added test that calls save_index(), reloads the index and tests
that the original item. I am not sure how Gentoo hit
this But they were missing a number of backends. So it's possible that
indexer_dbm.py is not getting fully tested depending on what is
installed on the system. Codecov from CI didnt show
indexer_dbm.py:save_index() being covered.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Thu, 02 Nov 2023 18:55:47 -0400 |
| parents | 29dba38a852a |
| children | c95870b2bbab |
| files | CHANGES.txt roundup/backends/indexer_dbm.py test/test_indexer.py |
| diffstat | 3 files changed, 28 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES.txt Mon Oct 30 21:57:21 2023 -0400 +++ b/CHANGES.txt Thu Nov 02 18:55:47 2023 -0400 @@ -73,6 +73,7 @@ Rouillard) - fix repeated password id with user.item.html in all templates except jinja2. (John Rouillard) +- fix unclosed file when saving index in indexer_dbm.py. (John Rouillard) Features:
--- a/roundup/backends/indexer_dbm.py Mon Oct 30 21:57:21 2023 -0400 +++ b/roundup/backends/indexer_dbm.py Thu Nov 02 18:55:47 2023 -0400 @@ -250,7 +250,9 @@ # First write the much simpler filename/fileid dictionaries dbfil = {'WORDS': None, 'FILES': self.files, 'FILEIDS': self.fileids} - open(self.indexdb+'-', 'wb').write(zlib.compress(marshal.dumps(dbfil))) + marshal_fh = open(self.indexdb+'-', 'wb') + marshal_fh.write(zlib.compress(marshal.dumps(dbfil))) + marshal_fh.close() # The hard part is splitting the word dictionary up, of course letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#_"
--- a/test/test_indexer.py Mon Oct 30 21:57:21 2023 -0400 +++ b/test/test_indexer.py Thu Nov 02 18:55:47 2023 -0400 @@ -104,6 +104,30 @@ self.assertSeqEqual(self.dex.find(['blah', 'hello']), []) self.assertSeqEqual(self.dex.find([]), []) + def test_save_load(self): + + # only run for anydbm test + if ( not type(self) is IndexerTest ): + pytest.skip("test_save_load tested only for anydbm backend") + + self.dex.add_text(('test', '1', 'foo'), 'b the hello world') + self.assertSeqEqual(self.dex.find(['hello']), [('test', '1', 'foo')]) + self.dex.save_index() + + # reopen saved db. + from roundup.backends.indexer_dbm import Indexer + self.dex = Indexer(db) + + # verify index is unloaded + self.assertEqual(self.dex.index_loaded(), False) + + # add also calls load_index(), so it should load the first item. + self.dex.add_text(('test', '2', 'foo'), 'b the olleh world') + + # note find also does a load_index() if not loaded. + self.assertSeqEqual(self.dex.find(['hello']), [('test', '1', 'foo')]) + self.assertSeqEqual(self.dex.find(['olleh']), [('test', '2', 'foo')]) + def test_change(self): self.dex.add_text(('test', '1', 'foo'), 'a the hello world') self.dex.add_text(('test', '2', 'foo'), 'blah blah the world')
