From 55c96b9953650e0e19a4d99ac5ef6a64f5a5db75 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Fri, 30 Mar 2018 05:56:06 -0700 Subject: [PATCH 1/2] Make SlapdObject a context manager Allows for automatic cleanup of resources using the with statement. For example: with slapdtest.SlapdObject() as server: server.ldapadd(...) ... When using SlapdObject in a function, it is more convenient and concise than using try/finally pattern. --- Lib/slapdtest/_slapdtest.py | 11 +++++++++++ Tests/t_slapdobject.py | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 Tests/t_slapdobject.py diff --git a/Lib/slapdtest/_slapdtest.py b/Lib/slapdtest/_slapdtest.py index f248ff68..03ad8d89 100644 --- a/Lib/slapdtest/_slapdtest.py +++ b/Lib/slapdtest/_slapdtest.py @@ -164,6 +164,10 @@ class SlapdObject(object): When a reference to an instance of this class is lost, the slapd server is shut down. + + An instance can be used as a context manager. When exiting the context + manager, the slapd server is shut down and the temporary data store is + removed. """ slapd_conf_template = SLAPD_CONF_TEMPLATE database = 'mdb' @@ -553,6 +557,13 @@ def ldapdelete(self, dn, recursive=False, extra_args=None): extra_args.append(dn) self._cli_popen(self.PATH_LDAPDELETE, extra_args=extra_args) + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.stop() + class SlapdTestCase(unittest.TestCase): """ diff --git a/Tests/t_slapdobject.py b/Tests/t_slapdobject.py new file mode 100644 index 00000000..e1cc971b --- /dev/null +++ b/Tests/t_slapdobject.py @@ -0,0 +1,18 @@ +import unittest + +import slapdtest + + +class TestSlapdObject(unittest.TestCase): + def test_context_manager(self): + with slapdtest.SlapdObject() as server: + self.assertIsNotNone(server._proc) + self.assertIsNone(server._proc) + + def test_context_manager_after_start(self): + server = slapdtest.SlapdObject() + server.start() + self.assertIsNotNone(server._proc) + with server: + self.assertIsNotNone(server._proc) + self.assertIsNone(server._proc) From ca705aaa5e66c6eeec8b2dc152646b7f7e1636a2 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 3 Apr 2018 13:23:35 +0200 Subject: [PATCH 2/2] Add versionchanged entry in slapdtest docs about context manager --- Lib/slapdtest/_slapdtest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/slapdtest/_slapdtest.py b/Lib/slapdtest/_slapdtest.py index 03ad8d89..f1885caf 100644 --- a/Lib/slapdtest/_slapdtest.py +++ b/Lib/slapdtest/_slapdtest.py @@ -168,6 +168,10 @@ class SlapdObject(object): An instance can be used as a context manager. When exiting the context manager, the slapd server is shut down and the temporary data store is removed. + + .. versionchanged:: 3.1 + + Added context manager functionality """ slapd_conf_template = SLAPD_CONF_TEMPLATE database = 'mdb'