From 5710a1e88bf669227959ca950b56d1072520b255 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 11 Dec 2015 11:21:46 -0500 Subject: [PATCH] - Added support for the ``dict.pop()`` and ``dict.popitem()`` methods to the :class:`.mutable.MutableDict` class. fixes #3605 --- doc/build/changelog/changelog_10.rst | 8 +++++++ lib/sqlalchemy/ext/mutable.py | 10 +++++++++ test/ext/test_mutable.py | 32 ++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index f271832774..723e8b2909 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,14 @@ .. changelog:: :version: 1.0.10 + .. change:: + :tags: bug, ext + :tickets: 3605 + :versions: 1.1.0b1 + + Added support for the ``dict.pop()`` and ``dict.popitem()`` methods + to the :class:`.mutable.MutableDict` class. + .. change:: :tags: change, tests :versions: 1.1.0b1 diff --git a/lib/sqlalchemy/ext/mutable.py b/lib/sqlalchemy/ext/mutable.py index 501b18f399..88b653f602 100644 --- a/lib/sqlalchemy/ext/mutable.py +++ b/lib/sqlalchemy/ext/mutable.py @@ -658,6 +658,16 @@ class MutableDict(Mutable, dict): dict.update(self, *a, **kw) self.changed() + def pop(self, key): + result = dict.pop(self, key) + self.changed() + return result + + def popitem(self): + result = dict.popitem(self) + self.changed() + return result + def clear(self): dict.clear(self) self.changed() diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py index a6bcdc47f0..ed97a0d92b 100644 --- a/test/ext/test_mutable.py +++ b/test/ext/test_mutable.py @@ -136,6 +136,38 @@ class _MutableDictTestBase(_MutableDictTestFixture): eq_(f1.data, {'a': 'z'}) + def test_pop(self): + sess = Session() + + f1 = Foo(data={'a': 'b', 'c': 'd'}) + sess.add(f1) + sess.commit() + + eq_(f1.data.pop('a'), 'b') + sess.commit() + + eq_(f1.data, {'c': 'd'}) + + def test_popitem(self): + sess = Session() + + orig = {'a': 'b', 'c': 'd'} + + # the orig dict remains unchanged when we assign, + # but just making this future-proof + data = dict(orig) + f1 = Foo(data=data) + sess.add(f1) + sess.commit() + + k, v = f1.data.popitem() + assert k in ('a', 'c') + orig.pop(k) + + sess.commit() + + eq_(f1.data, orig) + def test_setdefault(self): sess = Session() -- 2.47.2