[Dev] Parcel namespaces and the schema API
Phillip J. Eby
pje at telecommunity.com
Tue May 10 17:26:36 PDT 2005
While working today on integrating the fledgling Python Schema API with the
parcel loading system, I discovered that there are three parcels that do
not conform to the current convention for specifying parcel namespaces:
FAIL: core http://osafoundation.org/parcels/core
OK: osaf.contentmodel
OK: osaf.contentmodel.mail
OK: osaf.contentmodel.calendar
OK: osaf.contentmodel.contacts
OK: osaf.contentmodel.tasks
OK: osaf.framework.sharing
OK: osaf.framework.blocks
OK: osaf.framework.wakeup
FAIL: examples.zaobao.schema
http://osafoundation.org/examples/zaobao/schema
OK: osaf.framework.blocks.detail
OK: osaf.views.main
OK: osaf.framework.blocks.calendar
OK: osaf.framework.attributeEditors
OK: osaf.framework.webserver
OK: osaf.framework.webserver.servlets.blog
OK: osaf.framework.webserver.servlets.photos
OK: osaf.views.repositoryviewer
OK: osaf.views.demo
OK: osaf.examples.zaobao.blocks
OK: osaf.current
FAIL: osaf.framework.webserver.servers
http://osafoundation.org/parcels/osaf/framework/webserver/servers
OK: osaf.mail
Of these, the problem with 'core' and 'osaf/framework/webserver/servers' is
simply that they lack an __init__.py, making them not parcels. The problem
with ZaoBao is that it creates a custom namespace, for no apparent
reason. I'm guessing that it's probably either some sort of legacy code
issue, or else it was intended as an example for other parcel developers
not to use a namespace URI under NS_ROOT ("http://osafoundation.org/parcels").
As a practical matter, however, using a custom namespace URI doesn't
provide a parcel developer with any real benefit, versus simply following
the existing convention. This is because parcels' top-level directory name
is already required to be unique -- both because the repository paths are
based on directory names, and because Python package namespaces don't
overlap the way Java namespace packages do. I can't create a parcel whose
top-level directory name is 'osaf', no matter what XML namespace I
use! So, it would seem that eliminating the extra step of defining a
parcel namespace would help to further reduce parcel development overhead.
Therefore, I propose to formalize the existing state of affairs by making a
parcel's namespace equal to
"http://osafoundation.org/parcels/path/to/parcel", such that changing
'path/to/parcel' to 'path.to.parcel' will allow you to import the Python
package or module that corresponds to the parcel. This means two minor
changes to the existing setup:
* The '<namespace>' tag in parcel.xml would be deprecated and phased out
* Parcel directories would be required to contain an __init__.py, or
else a module of the correct name must exist in the parent parcel (e.g. the
presence of 'blocks.py' in 'examples/zaobao' means that no
'examples/zaobao/blocks/__init__.py' is needed.)
Per discussion with Morgen, I am going to go ahead and begin phasing in the
uncontroversial parts of this proposal. First, I'm adding empty
'__init__.py' files where needed, and making ZaoBao's namespaces conform to
the convention used by all other parcels. Second, I'll add default
namespace support to application.Parcel so that the remaining two uses of
'<namespace>' can also be removed. None of these changes should affect
existing code or parcels in any way, but will enable integration of the
Schema API with the parcel loader.
At that point, if '<namespace>' can be given an adequate deprecation period
for third parties to update any parcels currently using it, it should be
possible to eliminate one of the parcel loader's three passes over
parcel.xml files, which should result in some degree of performance
improvement for parcel loading. Currently, the '__scanParcels()' pass is
only needed because of the need to process '<namespace>'; Morgen and I
believe that the processing of '<namespaceMap>' can then be moved to the
'__loadParcel()' pass, thereby eliminating one full round of XML parsing
for each parcel.xml file.
Removing <namespace> is of course the potentially controversial bit, so if
you know of any reasons why it should remain, or have any input as to what
the deprecation period before its removal should be, please respond. Thanks!
More information about the Dev
mailing list