From: Floris Bruynooghe Date: Mon, 15 Jun 2020 21:55:53 +0000 (+0200) Subject: python config access: fix style and KeyError bug X-Git-Tag: archive/debian/0.30_rc2-1~7 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=1bca41698a03980b701558fb5c481ef0a340460d python config access: fix style and KeyError bug This fixes some minor style/pep8 things and adds tests for the new config support. Also fixes a bug where KeyError was never raised on a missing key. --- diff --git a/bindings/python-cffi/notmuch2/_config.py b/bindings/python-cffi/notmuch2/_config.py index 58383c16..29de6495 100644 --- a/bindings/python-cffi/notmuch2/_config.py +++ b/bindings/python-cffi/notmuch2/_config.py @@ -4,9 +4,12 @@ import notmuch2._base as base import notmuch2._capi as capi import notmuch2._errors as errors + __all__ = ['ConfigMapping'] + class ConfigIter(base.NotmuchIter): + def __init__(self, parent, iter_p): super().__init__( parent, iter_p, @@ -19,6 +22,7 @@ class ConfigIter(base.NotmuchIter): item = super().__next__() return base.BinString.from_cffi(item) + class ConfigMapping(base.NotmuchObject, collections.abc.MutableMapping): """The config key/value pairs stored in the database. @@ -50,11 +54,10 @@ class ConfigMapping(base.NotmuchObject, collections.abc.MutableMapping): ret = capi.lib.notmuch_database_get_config(self._ptr(), key, val_pp) if ret != capi.lib.NOTMUCH_STATUS_SUCCESS: raise errors.NotmuchError(ret) - if val_pp[0] == "": - capi.lib.free(val_pp[0]) - raise KeyError val = base.BinString.from_cffi(val_pp[0]) capi.lib.free(val_pp[0]) + if val == '': + raise KeyError return val def __setitem__(self, key, val): diff --git a/bindings/python-cffi/tests/test_config.py b/bindings/python-cffi/tests/test_config.py new file mode 100644 index 00000000..1b2695f5 --- /dev/null +++ b/bindings/python-cffi/tests/test_config.py @@ -0,0 +1,56 @@ +import collections.abc + +import pytest + +import notmuch2._database as dbmod + +import notmuch2._config as config + + +class TestIter: + + @pytest.fixture + def db(self, maildir): + with dbmod.Database.create(maildir.path) as db: + yield db + + def test_type(self, db): + assert isinstance(db.config, collections.abc.MutableMapping) + assert isinstance(db.config, config.ConfigMapping) + + def test_alive(self, db): + assert db.config.alive + + def test_set_get(self, maildir): + # Ensure get-set works from different db objects + with dbmod.Database.create(maildir.path) as db0: + db0.config['spam'] = 'ham' + with dbmod.Database(maildir.path) as db1: + assert db1.config['spam'] == 'ham' + + def test_get_keyerror(self, db): + with pytest.raises(KeyError): + val = db.config['not-a-key'] + print(repr(val)) + + def test_iter(self, db): + assert list(db.config) == [] + db.config['spam'] = 'ham' + db.config['eggs'] = 'bacon' + assert set(db.config) == {'spam', 'eggs'} + assert set(db.config.keys()) == {'spam', 'eggs'} + assert set(db.config.values()) == {'ham', 'bacon'} + assert set(db.config.items()) == {('spam', 'ham'), ('eggs', 'bacon')} + + def test_len(self, db): + assert len(db.config) == 0 + db.config['spam'] = 'ham' + assert len(db.config) == 1 + db.config['eggs'] = 'bacon' + assert len(db.config) == 2 + + def test_del(self, db): + db.config['spam'] = 'ham' + assert db.config.get('spam') == 'ham' + del db.config['spam'] + assert db.config.get('spam') is None