[Checkins] SVN: z3ext.skintool/tags/1.1.1/ tag
Nikolay Kim
fafhrd at datacom.kz
Wed Dec 3 10:48:40 EST 2008
Log message for revision 93576:
tag
Changed:
A z3ext.skintool/tags/1.1.1/
D z3ext.skintool/tags/1.1.1/CHANGES.txt
A z3ext.skintool/tags/1.1.1/CHANGES.txt
D z3ext.skintool/tags/1.1.1/setup.py
A z3ext.skintool/tags/1.1.1/setup.py
D z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
A z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
D z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
A z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
D z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py
A z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py
-=-
Deleted: z3ext.skintool/tags/1.1.1/CHANGES.txt
===================================================================
--- z3ext.skintool/trunk/CHANGES.txt 2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/CHANGES.txt 2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,61 +0,0 @@
-=======
-CHANGES
-=======
-
-1.1.0 (2008-11-21)
-------------------
-
-- Added z3ext:skin directive
-
-- API refactored
-
-- Added translations: nl, ru
-
-
-1.0.2 (2008-08-07)
-------------------
-
-- Added INoSkinSwitching for skin that does not allow skin switching
-
-
-1.0.1 (2008-05-16)
-------------------
-
-- Replace 'autoinclude' with 'includeDependendcies'
-
-
-1.0.0 (2008-03-28)
-------------------
-
-- Code cleanup
-
-- Added tests
-
-- Code moved to svn.zope.org
-
-
-0.13 (2008-02-28)
-----------------
-
-- Use z3c.autoinclude
-
-- Do not generate InterfaceClass object, just apply list of layers
-
-
-0.12 (2008-02-08)
------------------
-
-- Code cleanup
-
-
-0.11 (2008-02-06)
-------------------
-
-- Added ISkinable marker interface.
- Now object should implement ISkinable implicitly to support skintool
-
-
-0.10 (2008-02-01)
-------------------
-
-- Initial release.
Copied: z3ext.skintool/tags/1.1.1/CHANGES.txt (from rev 93575, z3ext.skintool/trunk/CHANGES.txt)
===================================================================
--- z3ext.skintool/tags/1.1.1/CHANGES.txt (rev 0)
+++ z3ext.skintool/tags/1.1.1/CHANGES.txt 2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,67 @@
+=======
+CHANGES
+=======
+
+1.1.1 (2008-12-03)
+------------------
+
+- Do not use _v_skin attribute
+
+
+1.1.0 (2008-11-21)
+------------------
+
+- Added z3ext:skin directive
+
+- API refactored
+
+- Added translations: nl, ru
+
+
+1.0.2 (2008-08-07)
+------------------
+
+- Added INoSkinSwitching for skin that does not allow skin switching
+
+
+1.0.1 (2008-05-16)
+------------------
+
+- Replace 'autoinclude' with 'includeDependendcies'
+
+
+1.0.0 (2008-03-28)
+------------------
+
+- Code cleanup
+
+- Added tests
+
+- Code moved to svn.zope.org
+
+
+0.13 (2008-02-28)
+----------------
+
+- Use z3c.autoinclude
+
+- Do not generate InterfaceClass object, just apply list of layers
+
+
+0.12 (2008-02-08)
+-----------------
+
+- Code cleanup
+
+
+0.11 (2008-02-06)
+------------------
+
+- Added ISkinable marker interface.
+ Now object should implement ISkinable implicitly to support skintool
+
+
+0.10 (2008-02-01)
+------------------
+
+- Initial release.
Deleted: z3ext.skintool/tags/1.1.1/setup.py
===================================================================
--- z3ext.skintool/trunk/setup.py 2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/setup.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,75 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Setup for z3ext.skintool package
-
-$Id$
-"""
-import sys, os
-from setuptools import setup, find_packages
-
-def read(*rnames):
- return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-
-version = '1.1.1dev'
-
-
-setup(name='z3ext.skintool',
- version=version,
- description="Tool for merging skin layers at runtime",
- long_description=(
- 'Detailed Documentation\n' +
- '======================\n'
- + '\n\n' +
- read('src', 'z3ext', 'skintool', 'README.txt')
- + '\n\n' +
- read('CHANGES.txt')
- ),
- classifiers=[
- 'Development Status :: 5 - Production/Stable',
- 'Environment :: Web Environment',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: Zope Public License',
- 'Programming Language :: Python',
- 'Natural Language :: English',
- 'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- 'Framework :: Zope3'],
- author='Nikolay Kim',
- author_email='fafhrd91 at gmail.com',
- url='http://z3ext.net/',
- license='ZPL 2.1',
- packages=find_packages('src'),
- package_dir = {'':'src'},
- namespace_packages=['z3ext'],
- install_requires = ['setuptools',
- 'zope.schema',
- 'zope.proxy',
- 'zope.component',
- 'zope.interface',
- 'zope.security',
- 'zope.configuration',
- 'zope.lifecycleevent',
- 'zope.app.component',
- 'zope.app.publication',
- 'zope.i18nmessageid',
- 'zope.i18n',
- 'z3c.autoinclude',
- 'z3ext.controlpanel',
- ],
- extras_require = dict(test=['zope.app.testing',
- 'zope.testing',
- ]),
- include_package_data = True,
- zip_safe = False
- )
Copied: z3ext.skintool/tags/1.1.1/setup.py (from rev 93575, z3ext.skintool/trunk/setup.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/setup.py (rev 0)
+++ z3ext.skintool/tags/1.1.1/setup.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,76 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Setup for z3ext.skintool package
+
+$Id$
+"""
+import sys, os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+ return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+version = '1.1.1dev'
+
+
+setup(name='z3ext.skintool',
+ version=version,
+ description="Tool for merging skin layers at runtime",
+ long_description=(
+ 'Detailed Documentation\n' +
+ '======================\n'
+ + '\n\n' +
+ read('src', 'z3ext', 'skintool', 'README.txt')
+ + '\n\n' +
+ read('CHANGES.txt')
+ ),
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Web Environment',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Zope Public License',
+ 'Programming Language :: Python',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ 'Topic :: Internet :: WWW/HTTP',
+ 'Framework :: Zope3'],
+ author='Nikolay Kim',
+ author_email='fafhrd91 at gmail.com',
+ url='http://z3ext.net/',
+ license='ZPL 2.1',
+ packages=find_packages('src'),
+ package_dir = {'':'src'},
+ namespace_packages=['z3ext'],
+ install_requires = ['setuptools',
+ 'zope.schema',
+ 'zope.proxy',
+ 'zope.component',
+ 'zope.interface',
+ 'zope.security',
+ 'zope.configuration',
+ 'zope.lifecycleevent',
+ 'zope.app.intid',
+ 'zope.app.component',
+ 'zope.app.publication',
+ 'zope.i18nmessageid',
+ 'zope.i18n',
+ 'z3c.autoinclude',
+ 'z3ext.controlpanel',
+ ],
+ extras_require = dict(test=['zope.app.testing',
+ 'zope.testing',
+ ]),
+ include_package_data = True,
+ zip_safe = False
+ )
Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/subscribers.py 2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,48 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$Id$
-"""
-from zope import component
-from zope.proxy import removeAllProxies
-from zope.component import getUtility
-from zope.interface import directlyProvides
-from zope.app.component.interfaces import ISite
-from zope.app.publication.interfaces import IBeforeTraverseEvent
-
-from interfaces import ISkinTool, ISkinable, INoSkinSwitching
-
-
- at component.adapter(ISite, IBeforeTraverseEvent)
-def threadServiceSubscriber(site, event,
- ISkinable = ISkinable,
- removeAllProxies=removeAllProxies,
- directlyProvides=directlyProvides):
-
- if INoSkinSwitching.providedBy(event.request):
- return
-
- site = removeAllProxies(site)
-
- if not ISkinable.providedBy(site):
- return
-
- skin = getattr(site, '_v_skin', None)
- if skin is None:
- skin = getUtility(ISkinTool).generate()
- site._v_skin = skin
-
- if skin:
- directlyProvides(event.request, *skin)
Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/subscribers.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+from zope import component
+from zope.proxy import removeAllProxies
+from zope.component import getUtility
+from zope.interface import directlyProvides
+from zope.app.intid.interfaces import IIntIds
+from zope.app.component.interfaces import ISite
+from zope.app.publication.interfaces import IBeforeTraverseEvent
+
+from tool import cache
+from interfaces import ISkinTool, ISkinable, INoSkinSwitching
+
+
+ at component.adapter(ISite, IBeforeTraverseEvent)
+def threadServiceSubscriber(site, event,
+ ISkinable = ISkinable,
+ removeAllProxies=removeAllProxies,
+ directlyProvides=directlyProvides):
+
+ if INoSkinSwitching.providedBy(event.request):
+ return
+
+ site = removeAllProxies(site)
+
+ if not ISkinable.providedBy(site):
+ return
+
+ id = getUtility(IIntIds).queryId(site)
+ if id not in cache:
+ skin = getUtility(ISkinTool).generate()
+ cache[id] = skin
+ else:
+ skin = cache[id]
+
+ if skin:
+ directlyProvides(event.request, *skin)
Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/tests.py 2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,46 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED 'AS IS' AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$Id$
-"""
-import unittest, doctest
-from zope import interface, component
-from zope.app.testing import setup
-
-from tool import SkinTool
-
-
-def setUp(test):
- setup.placefulSetUp(site=True)
- setup.setUpTestAsModule(test, 'z3ext.skintool.README')
-
- # register utility
- tool = SkinTool()
- component.provideUtility(tool)
-
-
-def tearDown(test):
- setup.placefulTearDown()
- setup.tearDownTestAsModule(test)
-
-
-def test_suite():
- return unittest.TestSuite((
- doctest.DocFileSuite(
- 'README.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
- ),
- ))
Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/tests.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,51 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED 'AS IS' AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+import unittest, doctest
+from zope import interface, component
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+from zope.app.testing import setup
+
+from tool import SkinTool
+
+
+def setUp(test):
+ site = setup.placefulSetUp(site=True)
+ setup.setUpTestAsModule(test, 'z3ext.skintool.README')
+
+ site['intid'] = IntIds()
+ component.provideUtility(site['intid'], IIntIds)
+
+ # register utility
+ tool = SkinTool()
+ component.provideUtility(tool)
+
+
+def tearDown(test):
+ setup.placefulTearDown()
+ setup.tearDownTestAsModule(test)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ doctest.DocFileSuite(
+ 'README.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ ))
Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/tool.py 2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,84 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" skintool implementation
-
-$Id$
-"""
-from zope import interface, component
-from zope.component import getSiteManager, getAdapters, getUtilitiesFor
-from zope.security.proxy import removeSecurityProxy
-from zope.lifecycleevent.interfaces import IObjectModifiedEvent
-from zope.publisher.interfaces.browser import \
- IDefaultSkin, IBrowserRequest, IDefaultBrowserLayer
-from zope.app.component.hooks import getSite
-
-from interfaces import IDefaultLayer, IDefaultLayers, ISkinTool
-
-skins_byname = {}
-skins_registry = {}
-layers_byname = {}
-layers_registry = {}
-
-
-class SkinTool(object):
- interface.implements(ISkinTool)
-
- def generate(self):
- bases = []
-
- # first add default layers
- for name, adapter in getAdapters((getSite(),), IDefaultLayers):
- for layer in adapter.layers:
- if layer not in bases:
- bases.append(layer)
-
- for name, layer in getUtilitiesFor(IDefaultLayer):
- if layer not in bases:
- bases.append(layer)
-
- # second add skin
- if self.skin:
- skin = skins_byname.get(self.skin)
- if skin:
- bases.append(skin)
- info = skins_registry.get(skin)
- if info:
- for layer in info[4]:
- if layer not in bases:
- bases.append(layer)
-
- #third add layers
- for name in self.layers:
- layer = layers_byname.get(name)
- if layer and layer not in bases:
- bases.append(layer)
-
- # get base skin
- adapters = getSiteManager().adapters
- skin = adapters.lookup((IBrowserRequest,), IDefaultSkin, name='')
- if skin is not None:
- bases.insert(0, skin)
- else:
- bases.insert(0, IDefaultBrowserLayer)
-
- bases.reverse()
- return bases
-
-
- at component.adapter(ISkinTool, IObjectModifiedEvent)
-def skinToolModified(*args):
- try:
- del removeSecurityProxy(getSite())._v_skin
- except:
- pass
Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/tool.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py 2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,88 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" skintool implementation
+
+$Id$
+"""
+from zope import interface, component
+from zope.component import getSiteManager
+from zope.component import getUtility, getAdapters, getUtilitiesFor
+from zope.security.proxy import removeSecurityProxy
+from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+from zope.publisher.interfaces.browser import \
+ IDefaultSkin, IBrowserRequest, IDefaultBrowserLayer
+from zope.app.component.hooks import getSite
+from zope.app.intid.interfaces import IIntIds
+
+from interfaces import IDefaultLayer, IDefaultLayers, ISkinTool
+
+cache = {}
+skins_byname = {}
+skins_registry = {}
+layers_byname = {}
+layers_registry = {}
+
+
+class SkinTool(object):
+ interface.implements(ISkinTool)
+
+ def generate(self):
+ bases = []
+
+ # first add default layers
+ for name, adapter in getAdapters((getSite(),), IDefaultLayers):
+ for layer in adapter.layers:
+ if layer not in bases:
+ bases.append(layer)
+
+ for name, layer in getUtilitiesFor(IDefaultLayer):
+ if layer not in bases:
+ bases.append(layer)
+
+ # second add skin
+ if self.skin:
+ skin = skins_byname.get(self.skin)
+ if skin:
+ bases.append(skin)
+ info = skins_registry.get(skin)
+ if info:
+ for layer in info[4]:
+ if layer not in bases:
+ bases.append(layer)
+
+ #third add layers
+ for name in self.layers:
+ layer = layers_byname.get(name)
+ if layer and layer not in bases:
+ bases.append(layer)
+
+ # get base skin
+ adapters = getSiteManager().adapters
+ skin = adapters.lookup((IBrowserRequest,), IDefaultSkin, name='')
+ if skin is not None:
+ bases.insert(0, skin)
+ else:
+ bases.insert(0, IDefaultBrowserLayer)
+
+ bases.reverse()
+ return bases
+
+
+ at component.adapter(ISkinTool, IObjectModifiedEvent)
+def skinToolModified(*args):
+ global cache
+
+ id = getUtility(IIntIds).queryId(getSite())
+ if id in cache:
+ del cache[id]
More information about the Checkins
mailing list