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')

Roundup Issue Tracker: http://roundup-tracker.org/