[Checkins] SVN: z3reload/trunk/ Eggify, buildoutify, and add ZPL.
Tres Seaver
tseaver at palladion.com
Fri Mar 26 10:18:21 EDT 2010
Log message for revision 110196:
Eggify, buildoutify, and add ZPL.
Changed:
_U z3reload/trunk/
A z3reload/trunk/CHANGES.txt
D z3reload/trunk/__init__.py
A z3reload/trunk/bootstrap.py
A z3reload/trunk/buildout.cfg
D z3reload/trunk/configure.zcml
D z3reload/trunk/ftests/
D z3reload/trunk/meta.zcml
D z3reload/trunk/metaconfigure.py
D z3reload/trunk/metadirectives.py
D z3reload/trunk/package-includes/
D z3reload/trunk/reload.py
A z3reload/trunk/setup.py
A z3reload/trunk/src/
A z3reload/trunk/src/z3reload/
A z3reload/trunk/src/z3reload/__init__.py
A z3reload/trunk/src/z3reload/configure.zcml
A z3reload/trunk/src/z3reload/ftests/
A z3reload/trunk/src/z3reload/meta.zcml
A z3reload/trunk/src/z3reload/metaconfigure.py
A z3reload/trunk/src/z3reload/metadirectives.py
A z3reload/trunk/src/z3reload/package-includes/
A z3reload/trunk/src/z3reload/reload.py
A z3reload/trunk/src/z3reload/subscriber.py
D z3reload/trunk/subscriber.py
-=-
Property changes on: z3reload/trunk
___________________________________________________________________
Added: svn:ignore
+ bin
develop-eggs
eggs
parts
.installed.cfg
*.egg-info
Added: z3reload/trunk/CHANGES.txt
===================================================================
--- z3reload/trunk/CHANGES.txt (rev 0)
+++ z3reload/trunk/CHANGES.txt 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,7 @@
+z3reload Changelog
+==================
+
+0.1 (unreleased)
+----------------
+
+- First publis release.
Deleted: z3reload/trunk/__init__.py
===================================================================
--- z3reload/trunk/__init__.py 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/__init__.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,2 +0,0 @@
-# Set this to True to list processed view classes on stderr.
-BLATHER = False
Added: z3reload/trunk/bootstrap.py
===================================================================
--- z3reload/trunk/bootstrap.py (rev 0)
+++ z3reload/trunk/bootstrap.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 73408 2007-03-21 05:53:10Z baijum $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+ez = {}
+exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+ ).read() in ez
+ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+import pkg_resources
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+if sys.platform == 'win32':
+ cmd = '"%s"' % cmd # work around spawn lamosity on windows
+
+ws = pkg_resources.working_set
+assert os.spawnle(
+ os.P_WAIT, sys.executable, sys.executable,
+ '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
+ dict(os.environ,
+ PYTHONPATH=
+ ws.find(pkg_resources.Requirement.parse('setuptools')).location
+ ),
+ ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)
Added: z3reload/trunk/buildout.cfg
===================================================================
--- z3reload/trunk/buildout.cfg (rev 0)
+++ z3reload/trunk/buildout.cfg 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,9 @@
+[buildout]
+develop = .
+parts = test
+index = http://download.zope.org/zope3.4/3.4.0/index
+
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = z3reload
Deleted: z3reload/trunk/configure.zcml
===================================================================
--- z3reload/trunk/configure.zcml 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/configure.zcml 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<configure xmlns="http://namespaces.zope.org/zope">
-
- <subscriber
- for="zope.app.appsetup.interfaces.IDatabaseOpenedEvent"
- handler=".subscriber.database_opened"
- />
-
-</configure>
Deleted: z3reload/trunk/meta.zcml
===================================================================
--- z3reload/trunk/meta.zcml 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/meta.zcml 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,11 +0,0 @@
-<configure xmlns="http://namespaces.zope.org/meta">
-
- <directives namespace="http://namespaces.pov.lt/z3reload">
- <directive
- name="reload"
- schema=".metadirectives.IReloadDirective"
- handler=".metaconfigure.reload"
- />
- </directives>
-
-</configure>
Deleted: z3reload/trunk/metaconfigure.py
===================================================================
--- z3reload/trunk/metaconfigure.py 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/metaconfigure.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,23 +0,0 @@
-import sys
-from zope.configuration.exceptions import ConfigurationError
-
-
-enabled_classes = [] # list of class objects
-enabled_modules = [] # list of module names
-enabled_packages = [] # list of package names
-
-
-def handle_reload(classes, modules, packages):
- """Add provided objects to global registry of reloadable objects."""
- enabled_classes.extend(classes)
- enabled_modules.extend([mod.__name__ for mod in modules])
- enabled_packages.extend([pkg.__name__ for pkg in packages])
-
-
-def reload(_context, classes=[], modules=[], packages=[]):
- """Process the `reload` ZCML directive."""
- if not (classes or modules or packages):
- raise ConfigurationError("You must specify at least one of"
- " `classes`, `modules` or `packages`.")
- _context.action(discriminator=None, callable=handle_reload,
- args=(classes, modules, packages))
Deleted: z3reload/trunk/metadirectives.py
===================================================================
--- z3reload/trunk/metadirectives.py 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/metadirectives.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,40 +0,0 @@
-from zope.interface import Interface
-from zope.configuration.fields import Tokens, GlobalObject
-
-
-class IReloadDirective(Interface):
-
- classes = Tokens(
- title=u"View classes",
- required=False,
- value_type=GlobalObject(
- title=u"View class",
- description=u"""
- A view class for which automatic reload should be enabled.
- """))
-
- modules = Tokens(
- title=u"Modules",
- required=False,
- value_type=GlobalObject(
- title=u"Module",
- description=u"""
- A module containing views for which automatic reload should be
- enabled.
- """))
-
- packages = Tokens(
- title=u"Packages",
- required=False,
- value_type=GlobalObject(
- title=u"Package",
- description=u"""
- A package containing views for which automatic reload should be
- enabled.
-
- `module` only works for a single module, whereas `package` also
- applies for contained modules and packages.
- """))
-
-
-# TODO: reload:omit, reload:all
Deleted: z3reload/trunk/reload.py
===================================================================
--- z3reload/trunk/reload.py 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/reload.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,81 +0,0 @@
-import sys
-from zope.app.pagetemplate.simpleviewclass import simple as SimplePTPage
-from zope.app.publisher.browser.viewmeta import simple as SimplePage
-
-from z3reload import BLATHER
-
-simple_view_classes = (SimplePTPage, SimplePage)
-
-
-class Reloader(object):
- """A mixin to be used on SimpleViewClass instances.
-
- These SimpleViewClass instances are in fact dynamically constructed types
- with either zope.app.pagetemplate.simpleviewclass.simple or
- zope.app.publisher,browser.viewmeta as one of the base classes.
-
- This mixin must be the first superclass, because its __init__ must be
- called on instantiation.
- """
-
- def __init__(self, *args, **kw):
- bases = self.__class__.__bases__
- assert len(bases) >= 2
- reloader2, real_view = bases[:2]
- assert reloader2 is Reloader
-
- rest = bases[2:]
-# for c in rest:
-# if c not in simple_view_classes:
-# print >> sys.stderr, "Warning: %r has base %r" % (self.__class__, c)
-
- clsname = real_view.__name__
- modname = real_view.__module__
- module = sys.modules[modname]
- if hasattr(module, clsname):
- reload(module)
- new_view = getattr(module, clsname)
- self.__class__.__bases__ = (Reloader, new_view) + rest
- else:
- # If the module does not have such an attribute, chances are that
- # the class was dynamically constructed. In this case reloading is
- # likely to break so we don't do it.
- new_view = real_view # just use the old view
-
- self.__sanitize_bases(new_view)
- new_view.__init__(self, *args, **kw)
-
- def __sanitize_bases(self, cls):
- """Make sure that the bases of a class are in the scope.
-
- This works around the problem when a class bases do not correspond
- to the same-named classes in the scope, which could happen after a
- reload. This causes errors when invoking base clases
- """
- modname = cls.__module__
- module = sys.modules[modname]
-
- bases = cls.__bases__
- new_bases = []
- for b in bases:
- bc = getattr(module, b.__name__, None)
- if bc is not None and bc.__module__ != modname:
- # Make sure that the base class comes from a different module.
- new_base = getattr(module, b.__name__)
- self.__sanitize_bases(new_base)
- new_bases.append(new_base)
- else:
- # Couldn't find class in local scope, abort.
- break
- else:
- # All bases checked successfully.
- cls.__bases__ = tuple(new_bases)
-
-
-
-def install_reloader(view_class):
- """Install the Reloader mixin on view_class."""
- assert view_class.__bases__[-1] in simple_view_classes
- if BLATHER:
- print >> sys.stderr, 'Reloader installed for', view_class.__bases__[0]
- view_class.__bases__ = (Reloader, ) + view_class.__bases__
Added: z3reload/trunk/setup.py
===================================================================
--- z3reload/trunk/setup.py (rev 0)
+++ z3reload/trunk/setup.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,44 @@
+##############################################################################
+#
+# Copyright (c) 2006--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.
+#
+##############################################################################
+"""Setup for z3reload package
+"""
+from setuptools import find_packages
+from setuptools import setup
+
+long_description = (open('README.txt').read() +
+ '\n\n' +
+ open('CHANGES.txt').read())
+
+
+setup(name='z3reload',
+ version='0.1dev',
+ license='ZPL 2.1',
+ author='Zope Corporation and Contributors',
+ author_email='zope-dev at zope.org',
+ description="Enables automatic reloading of Zope3 view code.",
+ long_description=long_description,
+
+ packages=find_packages('src'),
+ package_dir={'': 'src'},
+ tests_require=['zope.testing'],
+ install_requires=['setuptools',
+ 'zope.app.pagetemplate',
+ 'zope.app.publisher',
+ 'zope.component',
+ 'zope.configuration',
+ 'zope.publisher',
+ ],
+ include_package_data=True,
+ zip_safe=False,
+ )
Copied: z3reload/trunk/src/z3reload/__init__.py (from rev 110195, z3reload/trunk/__init__.py)
===================================================================
--- z3reload/trunk/src/z3reload/__init__.py (rev 0)
+++ z3reload/trunk/src/z3reload/__init__.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,2 @@
+# Set this to True to list processed view classes on stderr.
+BLATHER = False
Property changes on: z3reload/trunk/src/z3reload/__init__.py
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Copied: z3reload/trunk/src/z3reload/configure.zcml (from rev 110195, z3reload/trunk/configure.zcml)
===================================================================
--- z3reload/trunk/src/z3reload/configure.zcml (rev 0)
+++ z3reload/trunk/src/z3reload/configure.zcml 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope">
+
+ <subscriber
+ for="zope.app.appsetup.interfaces.IDatabaseOpenedEvent"
+ handler=".subscriber.database_opened"
+ />
+
+</configure>
Property changes on: z3reload/trunk/src/z3reload/configure.zcml
___________________________________________________________________
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Property changes on: z3reload/trunk/src/z3reload/ftests
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: z3reload/trunk/src/z3reload/meta.zcml (from rev 110195, z3reload/trunk/meta.zcml)
===================================================================
--- z3reload/trunk/src/z3reload/meta.zcml (rev 0)
+++ z3reload/trunk/src/z3reload/meta.zcml 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/meta">
+
+ <directives namespace="http://namespaces.pov.lt/z3reload">
+ <directive
+ name="reload"
+ schema=".metadirectives.IReloadDirective"
+ handler=".metaconfigure.reload"
+ />
+ </directives>
+
+</configure>
Property changes on: z3reload/trunk/src/z3reload/meta.zcml
___________________________________________________________________
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Copied: z3reload/trunk/src/z3reload/metaconfigure.py (from rev 110195, z3reload/trunk/metaconfigure.py)
===================================================================
--- z3reload/trunk/src/z3reload/metaconfigure.py (rev 0)
+++ z3reload/trunk/src/z3reload/metaconfigure.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,23 @@
+import sys
+from zope.configuration.exceptions import ConfigurationError
+
+
+enabled_classes = [] # list of class objects
+enabled_modules = [] # list of module names
+enabled_packages = [] # list of package names
+
+
+def handle_reload(classes, modules, packages):
+ """Add provided objects to global registry of reloadable objects."""
+ enabled_classes.extend(classes)
+ enabled_modules.extend([mod.__name__ for mod in modules])
+ enabled_packages.extend([pkg.__name__ for pkg in packages])
+
+
+def reload(_context, classes=[], modules=[], packages=[]):
+ """Process the `reload` ZCML directive."""
+ if not (classes or modules or packages):
+ raise ConfigurationError("You must specify at least one of"
+ " `classes`, `modules` or `packages`.")
+ _context.action(discriminator=None, callable=handle_reload,
+ args=(classes, modules, packages))
Property changes on: z3reload/trunk/src/z3reload/metaconfigure.py
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Copied: z3reload/trunk/src/z3reload/metadirectives.py (from rev 110195, z3reload/trunk/metadirectives.py)
===================================================================
--- z3reload/trunk/src/z3reload/metadirectives.py (rev 0)
+++ z3reload/trunk/src/z3reload/metadirectives.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,40 @@
+from zope.interface import Interface
+from zope.configuration.fields import Tokens, GlobalObject
+
+
+class IReloadDirective(Interface):
+
+ classes = Tokens(
+ title=u"View classes",
+ required=False,
+ value_type=GlobalObject(
+ title=u"View class",
+ description=u"""
+ A view class for which automatic reload should be enabled.
+ """))
+
+ modules = Tokens(
+ title=u"Modules",
+ required=False,
+ value_type=GlobalObject(
+ title=u"Module",
+ description=u"""
+ A module containing views for which automatic reload should be
+ enabled.
+ """))
+
+ packages = Tokens(
+ title=u"Packages",
+ required=False,
+ value_type=GlobalObject(
+ title=u"Package",
+ description=u"""
+ A package containing views for which automatic reload should be
+ enabled.
+
+ `module` only works for a single module, whereas `package` also
+ applies for contained modules and packages.
+ """))
+
+
+# TODO: reload:omit, reload:all
Property changes on: z3reload/trunk/src/z3reload/metadirectives.py
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Property changes on: z3reload/trunk/src/z3reload/package-includes
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: z3reload/trunk/src/z3reload/reload.py (from rev 110195, z3reload/trunk/reload.py)
===================================================================
--- z3reload/trunk/src/z3reload/reload.py (rev 0)
+++ z3reload/trunk/src/z3reload/reload.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,81 @@
+import sys
+from zope.app.pagetemplate.simpleviewclass import simple as SimplePTPage
+from zope.app.publisher.browser.viewmeta import simple as SimplePage
+
+from z3reload import BLATHER
+
+simple_view_classes = (SimplePTPage, SimplePage)
+
+
+class Reloader(object):
+ """A mixin to be used on SimpleViewClass instances.
+
+ These SimpleViewClass instances are in fact dynamically constructed types
+ with either zope.app.pagetemplate.simpleviewclass.simple or
+ zope.app.publisher,browser.viewmeta as one of the base classes.
+
+ This mixin must be the first superclass, because its __init__ must be
+ called on instantiation.
+ """
+
+ def __init__(self, *args, **kw):
+ bases = self.__class__.__bases__
+ assert len(bases) >= 2
+ reloader2, real_view = bases[:2]
+ assert reloader2 is Reloader
+
+ rest = bases[2:]
+# for c in rest:
+# if c not in simple_view_classes:
+# print >> sys.stderr, "Warning: %r has base %r" % (self.__class__, c)
+
+ clsname = real_view.__name__
+ modname = real_view.__module__
+ module = sys.modules[modname]
+ if hasattr(module, clsname):
+ reload(module)
+ new_view = getattr(module, clsname)
+ self.__class__.__bases__ = (Reloader, new_view) + rest
+ else:
+ # If the module does not have such an attribute, chances are that
+ # the class was dynamically constructed. In this case reloading is
+ # likely to break so we don't do it.
+ new_view = real_view # just use the old view
+
+ self.__sanitize_bases(new_view)
+ new_view.__init__(self, *args, **kw)
+
+ def __sanitize_bases(self, cls):
+ """Make sure that the bases of a class are in the scope.
+
+ This works around the problem when a class bases do not correspond
+ to the same-named classes in the scope, which could happen after a
+ reload. This causes errors when invoking base clases
+ """
+ modname = cls.__module__
+ module = sys.modules[modname]
+
+ bases = cls.__bases__
+ new_bases = []
+ for b in bases:
+ bc = getattr(module, b.__name__, None)
+ if bc is not None and bc.__module__ != modname:
+ # Make sure that the base class comes from a different module.
+ new_base = getattr(module, b.__name__)
+ self.__sanitize_bases(new_base)
+ new_bases.append(new_base)
+ else:
+ # Couldn't find class in local scope, abort.
+ break
+ else:
+ # All bases checked successfully.
+ cls.__bases__ = tuple(new_bases)
+
+
+
+def install_reloader(view_class):
+ """Install the Reloader mixin on view_class."""
+ assert view_class.__bases__[-1] in simple_view_classes
+ if BLATHER:
+ print >> sys.stderr, 'Reloader installed for', view_class.__bases__[0]
+ view_class.__bases__ = (Reloader, ) + view_class.__bases__
Property changes on: z3reload/trunk/src/z3reload/reload.py
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Copied: z3reload/trunk/src/z3reload/subscriber.py (from rev 110195, z3reload/trunk/subscriber.py)
===================================================================
--- z3reload/trunk/src/z3reload/subscriber.py (rev 0)
+++ z3reload/trunk/src/z3reload/subscriber.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -0,0 +1,52 @@
+import sys
+
+from zope.component import getGlobalSiteManager
+from zope.publisher.interfaces import IRequest
+from zope.component.registry import AdapterRegistration
+
+from z3reload.reload import install_reloader, simple_view_classes
+from z3reload.metaconfigure import enabled_classes, enabled_modules
+from z3reload.metaconfigure import enabled_packages
+
+request_type = IRequest
+
+
+def is_simple_view(reg):
+ """Return True if reg is a registration for a `simple` view.
+
+ A `simple` view is one that subclasses one of simple_view_classes.
+ """
+ if not (isinstance(reg, AdapterRegistration) and
+ len(reg.required) > 0 and
+ reg.required[-1] is not None and
+ reg.required[-1].isOrExtends(IRequest)):
+ return False # this registration does not appear to be a view
+
+ return (type(reg.factory) == type and
+ issubclass(reg.factory, simple_view_classes))
+
+
+def reload_enabled_for(view_class):
+ """Return True if view_class should be made reloadable."""
+ assert view_class.__bases__[-1] in simple_view_classes
+ real_view = view_class.__bases__[0]
+ if real_view in enabled_classes:
+ return True
+ for module in enabled_modules:
+ if real_view.__module__ == module:
+ return True
+ for package in enabled_packages:
+ if real_view.__module__.startswith(package):
+ return True
+ return False
+
+
+def database_opened(event):
+ """Scan adapter registrations and make specified views reloadable.
+
+ Hooks on the DatabaseOpened event.
+ """
+ gsm = getGlobalSiteManager()
+ for reg in gsm.registeredAdapters():
+ if is_simple_view(reg) and reload_enabled_for(reg.factory):
+ install_reloader(reg.factory)
Property changes on: z3reload/trunk/src/z3reload/subscriber.py
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Deleted: z3reload/trunk/subscriber.py
===================================================================
--- z3reload/trunk/subscriber.py 2010-03-26 13:53:30 UTC (rev 110195)
+++ z3reload/trunk/subscriber.py 2010-03-26 14:18:21 UTC (rev 110196)
@@ -1,52 +0,0 @@
-import sys
-
-from zope.component import getGlobalSiteManager
-from zope.publisher.interfaces import IRequest
-from zope.component.registry import AdapterRegistration
-
-from z3reload.reload import install_reloader, simple_view_classes
-from z3reload.metaconfigure import enabled_classes, enabled_modules
-from z3reload.metaconfigure import enabled_packages
-
-request_type = IRequest
-
-
-def is_simple_view(reg):
- """Return True if reg is a registration for a `simple` view.
-
- A `simple` view is one that subclasses one of simple_view_classes.
- """
- if not (isinstance(reg, AdapterRegistration) and
- len(reg.required) > 0 and
- reg.required[-1] is not None and
- reg.required[-1].isOrExtends(IRequest)):
- return False # this registration does not appear to be a view
-
- return (type(reg.factory) == type and
- issubclass(reg.factory, simple_view_classes))
-
-
-def reload_enabled_for(view_class):
- """Return True if view_class should be made reloadable."""
- assert view_class.__bases__[-1] in simple_view_classes
- real_view = view_class.__bases__[0]
- if real_view in enabled_classes:
- return True
- for module in enabled_modules:
- if real_view.__module__ == module:
- return True
- for package in enabled_packages:
- if real_view.__module__.startswith(package):
- return True
- return False
-
-
-def database_opened(event):
- """Scan adapter registrations and make specified views reloadable.
-
- Hooks on the DatabaseOpened event.
- """
- gsm = getGlobalSiteManager()
- for reg in gsm.registeredAdapters():
- if is_simple_view(reg) and reload_enabled_for(reg.factory):
- install_reloader(reg.factory)
More information about the checkins
mailing list