From 2e2411d61ec17b6183cc805bff528f8c2f34f9a1 Mon Sep 17 00:00:00 2001 From: Michael Howitz Date: Thu, 10 Sep 2020 09:15:03 +0200 Subject: [PATCH] On removal of site remove the sub of its site manager from parent site manager (#14) Fixes #1. The implementation was originally taken from https://github.com/zopefoundation/grokcore.site/blob/fc945c90c5093de8f7ff958cf498eb6305b9c068/src/grokcore/site/subscriber.py#L35-L46 but changed in the review process of this PR. Co-authored-by: Jason Madden --- CHANGES.rst | 6 ++++-- setup.py | 2 +- src/zope/site/site.py | 7 +++++-- src/zope/site/site.rst | 13 ++++++++++++- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 0a9d8e0..ce74c6d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,10 +2,12 @@ Changes ========= -4.3.1 (unreleased) +4.4.0 (unreleased) ================== -- Nothing changed yet. +- On removal of a site, clear the bases of its site manager. This fixes a reference leak + from a parent site manager. See + `issue 1 `_. 4.3.0 (2020-04-01) diff --git a/setup.py b/setup.py index bd183a8..5bc325d 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ def read(*rnames): ] setup(name='zope.site', - version='4.3.1.dev0', + version='4.4.0.dev0', author='Zope Foundation and Contributors', author_email='zope-dev@zope.org', description='Local registries for zope component architecture', diff --git a/src/zope/site/site.py b/src/zope/site/site.py index 4e72ebb..cbec17a 100644 --- a/src/zope/site/site.py +++ b/src/zope/site/site.py @@ -242,16 +242,19 @@ def SiteManagerAdapter(ob): def changeSiteConfigurationAfterMove(site, event): """ - After a site is moved, its site manager links have to be + After a site is (re-)moved, its site manager links have to be updated. Subscriber to :class:`~.ISite` objects in a :class:`~.IObjectMovedEvent`. """ + local_sm = site.getSiteManager() if event.newParent is not None: next = _findNextSiteManager(site) if next is None: next = zope.component.getGlobalSiteManager() - site.getSiteManager().__bases__ = (next, ) + local_sm.__bases__ = (next, ) + else: + local_sm.__bases__ = () @zope.component.adapter( diff --git a/src/zope/site/site.rst b/src/zope/site/site.rst index b8acc07..8132f53 100644 --- a/src/zope/site/site.rst +++ b/src/zope/site/site.rst @@ -278,7 +278,7 @@ site hierarchy is as follows: _____ global site _____ / \ - myfolder1 myfolder2 + myfolder myfolder2 | myfolder11 @@ -352,3 +352,14 @@ sitemanager's bases should be set to global site manager. >>> nosm['root'] = myfolder11 >>> myfolder11.getSiteManager().__bases__ == (gsm, ) True + +Deleting a site unregisters its site manger from its parent site manager: + + >>> del myfolder2['myfolder21'] + >>> myfolder2.getSiteManager().subs + () + +The removed site manager now has no bases: + + >>> myfolder21.getSiteManager().__bases__ + ()