[z3-checkins] r13646 - in z3/zopejam/trunk/src: zcmledit
zcmledit/tests zopejam
hathawsh at codespeak.net
hathawsh at codespeak.net
Tue Jun 21 09:18:21 CEST 2005
Author: hathawsh
Date: Tue Jun 21 09:18:17 2005
New Revision: 13646
Modified:
z3/zopejam/trunk/src/zcmledit/configfile.py
z3/zopejam/trunk/src/zcmledit/exceptions.py
z3/zopejam/trunk/src/zcmledit/include.py
z3/zopejam/trunk/src/zcmledit/tests/test_include.py
z3/zopejam/trunk/src/zopejam/main.py
Log:
Began recognizing directive definition directives (a subset of the meta-directives.)
Modified: z3/zopejam/trunk/src/zcmledit/configfile.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/configfile.py (original)
+++ z3/zopejam/trunk/src/zcmledit/configfile.py Tue Jun 21 09:18:17 2005
@@ -14,12 +14,13 @@
from xml.parsers import expat
from xml.sax.saxutils import quoteattr
-from zcmledit.exceptions import NoPackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
from zcmledit.include import IncludeResolver, join_package
ZCML_CONDITION = (u"http://namespaces.zope.org/zcml", u"condition")
XMLNS_NS = u"http://www.w3.org/2000/xmlns/" # URI for XML NS declarations
+META_NS = u"http://namespaces.zope.org/meta"
class ConfigurationFile:
@@ -39,8 +40,8 @@
"""
self.root = None # A DirectiveElement
self.output = [] # [line, DirectiveElement, line, ...]
- self.resolvers = [] # [IncludeResolver]
- self.metadirs = [] # [DirectiveElement]
+ self.includes = [] # [IncludeResolver]
+ self.definitions = [] # [Definition]
self.error = None
fn = self.filename
@@ -68,10 +69,10 @@
if self.package_name:
self.root._setDefaultPackage(self.package_name)
for e in self.root.flattened():
- if e.isIncludeDirective():
- self.resolvers.append(IncludeResolver(e, pythonpath))
- elif e.isMetaDirective():
- self.metadirs.append(e)
+ if e.isInclude():
+ self.includes.append(IncludeResolver(e, pythonpath))
+ elif e.isDefinition():
+ self.definitions.append(Definition(e))
finally:
f.close()
@@ -93,7 +94,7 @@
attr_order, extra_attrs, condition, prefix_uri):
self.config_file = config_file
self.parent = parent
- self.name = name # (ns, localname)
+ self.name = tuple(name) # (ns, localname)
self.data = data # {localname: value}
self.attr_order = attr_order # list of (ns, localname)
self.extra_attrs = extra_attrs # {(ns, localname): value}
@@ -128,6 +129,13 @@
else:
self._is_include = False
+ if ns == META_NS and localname in (
+ 'directive', 'groupingDirective',
+ 'complexDirective', 'simpleDirective'):
+ self._is_definition = True
+ else:
+ self._is_definition = False
+
def _setDefaultPackage(self, package_name):
if not self._package_name:
self._package_name = package_name
@@ -164,13 +172,13 @@
raise NoPackageError("No absolute package has been set")
return join_package(parent_pn, my_pn)
- def isIncludeDirective(self):
+ def isInclude(self):
"""Returns True if this is an include directive"""
return self._is_include
- def isMetaDirective(self):
+ def isDefinition(self):
"""Returns True if this directive defines a directive type"""
- return False
+ return self._is_definition
def getXMLName(self, ns, localname):
"""Returns the tag or attribute for a given namespace and localname"""
@@ -420,3 +428,44 @@
# no content
return lines
return [line[count:] for line in lines]
+
+
+class Definition:
+ """A directive definition"""
+
+ def __init__(self, element):
+ self.element = element
+ self.update()
+
+ def update(self):
+ self.error = None
+ self.name = self.element.data.get('name')
+ self.schema = self.element.data.get('schema')
+
+ localname = self.element.data.get('name')
+ ns = None
+ parent = self.element.parent
+ while parent is not None:
+ if parent.name == (META_NS, 'directives'):
+ # use the namespace inherited from a 'directives' directive
+ ns = parent.data['namespace']
+ break
+ parent = parent.parent
+ if ns is None:
+ ns = self.element.data.get('namespace')
+
+ self.fullname = (ns, localname)
+ if self.schema:
+ if self.schema.startswith('.'):
+ try:
+ pkg = self.element.getAbsolutePackageName()
+ abs_schema = join_package(pkg, self.schema)
+ except NameResolutionError, e:
+ abs_schema = None
+ self.error = '%s: %s' % (e.__class__.__name__, str(e))
+ else:
+ abs_schema = self.schema
+ else:
+ self.error = "Missing 'schema' attribute"
+ self.abs_schema = abs_schema
+
Modified: z3/zopejam/trunk/src/zcmledit/exceptions.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/exceptions.py (original)
+++ z3/zopejam/trunk/src/zcmledit/exceptions.py Tue Jun 21 09:18:17 2005
@@ -2,14 +2,14 @@
# (c) 2005 Shane Hathaway
# License: ZPL 2.1
-class PackageSpecError(Exception):
- """Failed package specification"""
+class NameResolutionError(Exception):
+ """Failed name resolution"""
-class NoPackageError(PackageSpecError):
+class NoPackageError(NameResolutionError):
"""No absolute package specified for resolving relative package names"""
-class InvalidRelativePackageError(PackageSpecError):
- """A relative package spec is not valid"""
+class InvalidRelativeNameError(NameResolutionError):
+ """A relative name is not valid"""
-class MissingPackageError(PackageSpecError):
+class MissingPackageError(NameResolutionError):
"""Could not find the specified package"""
Modified: z3/zopejam/trunk/src/zcmledit/include.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/include.py (original)
+++ z3/zopejam/trunk/src/zcmledit/include.py Tue Jun 21 09:18:17 2005
@@ -7,8 +7,8 @@
from glob import glob
import os
-from zcmledit.exceptions import PackageSpecError, NoPackageError
-from zcmledit.exceptions import InvalidRelativePackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
+from zcmledit.exceptions import InvalidRelativeNameError
from zcmledit.exceptions import MissingPackageError
@@ -67,7 +67,7 @@
abs_package = join_package(parent, self.package)
else:
abs_package = self.package
- except PackageSpecError, e:
+ except NameResolutionError, e:
abs_package = None
self.error = '%s: %s' % (e.__class__.__name__, str(e))
self.abs_package = abs_package
@@ -79,7 +79,7 @@
if abs_package:
try:
basepath = find_package(abs_package, pythonpath)
- except PackageSpecError, e:
+ except NameResolutionError, e:
basepath = None
self.error = '%s: %s' % (e.__class__.__name__, str(e))
else:
@@ -114,11 +114,11 @@
def join_package(parent, child):
- """Joins an absolute package name with a relative package name."""
+ """Joins an absolute package name with a relative object name."""
if child == '.':
return parent
if child.endswith('.'):
- raise PackageSpecError("Package names must not end with '.'")
+ raise NameResolutionError("Object names must not end with '.'")
if not child.startswith('.'):
return child
if not parent:
@@ -130,9 +130,9 @@
try:
pnames.pop()
except IndexError:
- raise InvalidRelativePackageError(
+ raise InvalidRelativeNameError(
"Can't join absolute package '%s' with "
- "relative package '%s'" % (parent, child))
+ "relative name '%s'" % (parent, child))
return '.'.join(pnames + cnames)
Modified: z3/zopejam/trunk/src/zcmledit/tests/test_include.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/tests/test_include.py (original)
+++ z3/zopejam/trunk/src/zcmledit/tests/test_include.py Tue Jun 21 09:18:17 2005
@@ -9,8 +9,8 @@
import zcmledit
from zcmledit.configfile import ConfigurationFile
from zcmledit.include import join_package, find_package
-from zcmledit.exceptions import PackageSpecError, NoPackageError
-from zcmledit.exceptions import InvalidRelativePackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
+from zcmledit.exceptions import InvalidRelativeNameError
from zcmledit.exceptions import MissingPackageError
tests_dir = os.path.join(os.path.dirname(zcmledit.__file__), 'tests')
@@ -28,8 +28,8 @@
assert join_package('', 'zope') == 'zope'
py.test.raises(NoPackageError, join_package, '', '.foo')
- py.test.raises(PackageSpecError, join_package, 'zope', '.foo.')
- py.test.raises(InvalidRelativePackageError, join_package, 'zope', '...os')
+ py.test.raises(NameResolutionError, join_package, 'zope', '.foo.')
+ py.test.raises(InvalidRelativeNameError, join_package, 'zope', '...os')
def test_find_package():
@@ -60,7 +60,7 @@
fn_list.append(fn)
cf = ConfigurationFile(fn, package_name)
cf.load(sys.path)
- for resolver in cf.resolvers:
+ for resolver in cf.includes:
subpackage = resolver.getAbsolutePackageName()
for include_fn in resolver.listFiles():
assert include_fn not in fn_list
Modified: z3/zopejam/trunk/src/zopejam/main.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/main.py (original)
+++ z3/zopejam/trunk/src/zopejam/main.py Tue Jun 21 09:18:17 2005
@@ -23,9 +23,12 @@
class Project:
- def __init__(self, root_filename, pythonpath=None):
+ def __init__(self, root_filename, interpreter=None, pythonpath=None):
self.root_filename = root_filename # '/path/to/site.zcml'
self.base = os.path.dirname(root_filename)
+ if interpreter is None:
+ interpreter = sys.executable
+ self.interpreter = interpreter
if pythonpath is None:
pythonpath = [os.path.join(self.base, 'src')]
self.pythonpath = pythonpath
@@ -33,6 +36,7 @@
def load(self):
self.packages = {} # {package name: [filename]}
self.files = {} # {filename: config_file}
+ self.definitions = {} # {(ns, localname): Definition}
self.root_config = ConfigurationFile(self.root_filename)
self.files[self.root_filename] = self.root_config
@@ -49,7 +53,7 @@
filenames.append(cfg.filename)
# add to self.files
- for resolver in cfg.resolvers:
+ for resolver in cfg.includes:
for fn in resolver.listFiles():
if not self.files.has_key(fn):
subcfg = ConfigurationFile(
@@ -57,6 +61,30 @@
self.files[fn] = subcfg
todo.append(subcfg)
+ # add to self.definitions
+ for dfn in cfg.definitions:
+ if self.definitions.has_key(dfn.fullname):
+ raise RuntimeError('conflict on %s' % repr(dfn.fullname))
+ self.definitions[dfn.fullname] = dfn
+
+ if 1:
+ print len(self.definitions)
+ items = self.definitions.items()
+ items.sort()
+ for (ns, localname), dfn in items:
+ print '{%s}%s: %s' % (ns, localname, dfn.abs_schema)
+
+ if 0:
+ # profile
+ start = time.time()
+ count = 0
+ for cfg in self.files.values():
+ if cfg.root is not None:
+ count += len(cfg.root.flattened())
+ end = time.time()
+ print '%d directives found in %f seconds' % (count, end - start)
+
+
class PaletteImageList(wx.ImageList):
@@ -254,7 +282,7 @@
image = images.get('zcmlfile', -1)
child = inctree.AppendItem(parent, label, image=image, data=data)
- for resolver in cfg.resolvers:
+ for resolver in cfg.includes:
data = wx.TreeItemData(resolver)
f = resolver.files or resolver.file
if resolver.abs_package:
More information about the z3-checkins
mailing list