[Subversion] / PEAK / CHANGES.txt  

Diff of /PEAK/CHANGES.txt

Parent Directory | Revision Log

version 1453, Fri Nov 21 19:04:57 2003 UTC version 2107, Mon Nov 21 04:21:13 2005 UTC
Line 1 
Line 1 
 Fixes and Enhancements since Version 0.5 alpha 2  Fixes and Enhancements since Version 0.5 alpha 3
   
  Changed, Enhanced, or Newly Deprecated Features   - The 'peak' script is now an .exe on Windows, using setuptools' "entry point"
      system.
   
  - DEPRECATED 'peak.util.signal_stack'.  Instead, bind to a   - PEAK no longer bundles any software that can be obtained automatically from
    'running.ISignalManager' and use its 'addHandler()/removeHandler()' methods.     PyPI.  Running PEAK's setup script will attempt to download and install
    This has the same effect as 'pushSignals()' and 'popSignals()', except that     the needed packages.  (Note that development snapshots of PEAK may require
    you do not have to remove handlers in the same order as you add them, and     development snapshots of related packages.)
    *all* active handlers are invoked for a given signal that they handle.  
    - Added a series of new QueryDM and EntityDM convenience features.  See
  - Added 'IBasicReactor.crash()', which forces an immediate reactor loop exit,     "Making Data Managers easier to use":http://www.eby-sarna.com/pipermail/peak/2005-May/002296.html
    ignoring pending scheduled calls.     for a complete list and explanatory documentation.
   
  - Added 'peak.running.commands.runMain()', a convenience function for starting   - Changed 'running.lookupCommand()' to use the command's 'getCommandParent()'
    an application's "main" command, that also makes it easy for forked child     method, so that commands using the '--config' option will utilize the
    processes to exit and replace the parent process' "main".  The 'peak' script     specified configuration(s) to lookup subcommands.
    has now been shortened to::  
    - Added a '-c/--config' option to PEAK bootstrap commands to load an .ini
        from peak.running import commands     configuration file in a new service area before executing any subcommands.
        commands.runMain( commands.Bootstrap )  
      This allows you to do things like::
    so it's now much easier to create alternative startup scripts, if you need  
    to, or to add an 'if __name__=="__main__"' clause to a module.          peak launch -c bulletins ref:sitemap@sitemap.xml
   
  - Added 'peak.util.mockdb', a "mock object" implementation of a DBAPI 2.0     which loads the 'bulletins' configuration file before launching the sitemap.
    driver module.  'mockdb' connections can be told to 'expect()' queries     Note that if you are subclassing 'commands.Bootstrap' you can suppress this
    and 'provide()' data to their callers, and will raise AssertionErrors when     option using 'options.reject_inheritance("-c","--config")' in the body of
    they are used in a way that doesn't conform to your supplied expectations.     your subclass' class definition.  You may wish to do this if your
    This is intended to be used for unit testing components that depend on     application's subcommands must run in the same service area as the parent
    a database connection: you can verify that they send the right SQL, and     command.  (E.g. if the parent command expects the subcommand to partake in
    you can provide them with dummy data to use.  There is also a 'mockdb:' URL     a transaction controlled by the parent command.)
    and peak.storage driver, so you can easily use a mock DB connection in place  
    of a real one within a PEAK application, for testing purposes.  Note,   - Added a 'value' property to 'model.Enumeration', so that you can access
    however, that 'peak.util.mockdb' is a DBAPI 2.0 driver in itself, and thus     an enumeration instance's value (i.e., the value it hashes and compares
    can also be used to test DBAPI usage outside of PEAK.     equal to)
   
  - SQL connection objects now provide an 'appConfig' attribute that is a   - Added a 'binding.hasParent(component,parent)' API function, which is
    driver-specific 'config.Namespace()'.  This allows you to easily set up     specially optimized for use with generic functions, so that you can
    configuration properties that are driver-specific.  For example, you could     define generic function methods that apply only within some part of a
    use properties to configure driver-specific SQL snippets, then access them     component hierarchy.
    via the connection's 'appConfig' namespace.  The namespaces are of the form  
    'DRIVER.appConfig', where 'DRIVER' is the name of the DBAPI module for that   - PEAK no longer supports Python 2.2; Python 2.3.4 or better is required.
    connection type (e.g. 'pgdb', 'cx_Oracle', etc.).  
    - The kjbuckets extension module is no longer built and installed by default;
  - Added 'config.Namespace()' convenience class for redirecting property     you must explicitly enable it with a '--with-kjbuckets' flag passed to
    lookups from one namespace to another.  See the docstring and 'peak.ini' for     'setup.py'.  Please port your code as soon as practical, this option will
    usage examples.  'PropertyName.of()' now returns 'Namespace' instances     go away soon.
    instead of 'PropertySet' instances.  
    - Use of the included 'kjbuckets' module is now DEPRECATED, due to increasing
  - DEPRECATED the 'config.PropertySet' class; please convert to using     bitrot.  Aaron Watters originally wrote this extension for Python 1.2, and
    'config.Namespace', as it will disappear in the 0.5alpha4 release cycle.     it has not been well-maintained for newer versions of the Python/C API.
      Instead of 'kjSet' objects, use the Python 2.3 'Set' type, and instead of
  - SQL connection objects now get their type converters from a distinct     the 'kjGraph' type, use the new 'Graph' type in 'peak.util.Graph'.  Some
    property namespace for each DBAPI driver.  For example a driver using the     porting effort may be required, as these types are not precisely the same
    'cx_Oracle' module will get its type converters from the     in signature as the originals.
    'cx_Oracle.sql_types' property namespace, instead of 'peak.sql_types'.  For  
    backward compatibility, these driver-specific namespaces are set up to   - The '_setNS()' method of the 'peak.util.SOX.ISOXNode_NS' interface has
    fall back to 'peak.sql_types' for their defaults.  Type converter     changed signature, due to a lack of use of the second argument in the code
    construction has also been improved, to eliminate conversion overhead     base, and its dependency on 'kjbuckets'.
    completely when no conversions are required for a specific query.  Also,  
    SQL connections now offer a method that will create a row conversion   - The old 'peak.security' implementation has been removed, and replaced with
    function for a given result description and optional postprocessing     a simpler, more flexible implementation based on generic functions (using
    function.  This new method should now be used in place of direct access to     less than half the code and seven fewer interfaces).  Complete documentation
    the 'typeMap' attribute of connection objects.     and API tests for the new implementation can be found in 'rules.txt' in the
      'peak.security' package directory.
  - Added 'binding.Require', 'binding.Obtain', 'binding.Make', and  
    'binding.Delegate'.  *ALL* other binding types are now DEPRECATED, and will     Also, the new implemetation does not require redundant
    go away before 0.5 beta is released:     'security.allow(security.Anybody)' declarations just because you've declared
      other permissions for a class, so these declarations have been removed from
    'requireBinding("info")' -- use 'Require("info")'     ``peak.web``.  They don't do any harm, however, so you can leave them in
      your own code as long as you change them to use 'binding.metadata()' instead
    'delegateTo("attr")' -- use 'Delegate("attr")'     of the deprecated 'security.allow()'.
   
    'New(type)' -- use 'Make(type)'   - 'security.allow()' is now DEPRECATED; please use 'binding.metadata()'
      instead.  (There is no change to the calling signature, but
    'New("module.type")' -- use 'Make("module.type")'     'binding.metadata' accepts any metadata, not just permissions.)
   
    'bindTo(key)' -- use 'Obtain(key)'   - Added 'peak.running.options', a new option-parsing framework that extends
      'optparse' to support the PEAK 'commands' framework.  Command instances
    'Constant(value)' -- use 'Make(lambda: value)'     can now refer to 'self.parsed_args' to find their non-option arguments,
      and to trigger setting of their attributes (or calling of methods) based on
    'Acquire(key)' -- use 'Obtain(key, offerAs=[key])'     their raw arguments from 'self.argv'.  See 'options.txt' in the
      'peak.running' package directory for a complete tutorial.
    'Copy(value)' -- use 'Make(lambda: <expr to copy value>)'  
    - There is now a 'binding.initAttrs()' function that can be used to initialize
    'whenAssembled(func)' -- use 'Make(func, uponAssembly=True)'     an object's attributes from e.g. constructor keyword arguments, similar to
      how 'binding.Component' and 'binding.Attribute' constructors work.
    'bindSequence(key1,key2,...)' -- use 'Obtain([key1,key,...])'  
    - Security permissions can now be declared as attribute metadata.
    'bindToProperty(x,y)' -- use 'Obtain(PropertyName(x),default=y)'  
      That is, instead of doing declarations like this::
    'bindToParent()' -- use 'Obtain("..")'  
           class Foo:
    'bindToSelf()'  -- use 'Obtain(".")'              bar = binding.Require("Something", permissionNeeded=SomePerm)
   
    'bindToUtilities()' -- no replacement; let me know if you're using this.          class AnElement(model.Element):
               class someFeature(model.Attribute):
    Note that 'Make' and 'Obtain' also support sequences of recipes and keys,                  permissionNeeded = SomePerm
    and in those cases will produce a sequence of the results from those recipes  
    or keys.  Also, 'Make' will accept no-argument and one-argument callables,     you can (and should) now do them like this::
    where 'Once' always required three-argument functions.  This should make it  
    a lot easier to write short binding functions.          class Foo:
               bar = binding.Require("Something", [SomePerm])
    Also, note that the 'activateUponAssembly' keyword is now 'uponAssembly',  
    and 'isVolatile' is now 'noCache'.  (The old names will work as keyword          class AnElement(model.Element):
    arguments until the alpha 4 development cycle begins.)  The              class someFeature(model.Attribute):
    'binding.IActiveDescriptor' interface also changed as a result of this.                  metadata = [SomePerm]
    Last, but not least, a 'binding.IRecipe' interface was added, to support the  
    new 'binding.Make' type.     or this::
   
           class Foo:
  - Added a 'lockName' attribute to 'runnning.AdaptiveTask', and a 'LockURL'              binding.metadata(bar = [SomePerm])
    setting to its ZConfig schema.  This allows a lockfile URL to be specified  
    for adaptive tasks that need exclusive access to some resource while          class AnElement(model.Element):
    running.  
               binding.metadata(someFeature = [SomePerm])
  - A list or tuple of 'IComponentKey' instances is now treated as a single  
    component key, that returns a tuple of the values returned by each              class someFeature(model.Attribute):
    constituent component key.  This means that 'binding.Obtain()' and                  # ...
    'lookupComponent()' can now accept a list or tuple of component keys.  This  
    makes 'bindSequence()' obsolete, so 'bindSequence()' is now DEPRECATED.     It isn't necessary to enclose metadata in brackets, but it helps to
    'binding.bindSequence(key1,key2,...)' can now be replaced with     emphasize its annotational nature.  Also note that e.g. 'web.bindResource()'
    'binding.Obtain([key1,key,...])', and will produce the same results.     needs 'metadata' to be a keyword argument.
   
  - 'naming.IBasicContext.lookup()' and 'naming.lookup()' now accept a 'default'   - The 'permissionNeeded' attribute of 'model.Feature' and 'binding.Attribute'
    argument, similar to that used by 'lookupComponent()' and most other     objects is now DEPRECATED.  See examples above for how to upgrade, and please
    lookup-like APIs in PEAK.  This change was made so that component lookups     switch to using metadata as soon as practical.  In addition the
    don't need to rely on catching 'exceptions.NameNotFound' errors to tell them     'security.IGuardedDescriptor' interface has been removed, because it was
    when to use the default value.  This could hide 'NameNotFound' errors that     only used in connection with the 'permissionNeeded' attribute mechanism.
    were actually from a broken component somewhere in the lookup process.  (In  
    general, it's probably a bad idea to have an exception that's used for both   - Added a new "attribute metadata" mini-framework to 'peak.binding'.  This
    control flow and real errors!)     framework makes it possible to declare arbitrary metadata about attributes,
      using either a class advisor ('binding.metadata()', similar in form and
  - Added new 'version' tool that automatically edits files to update version     function to the existing 'security.allow()') or using a 'metadata' attribute
    information in them.  Just execute the 'version' file in the main PEAK     of attribute bindings (which is the second positional parameter in all
    source directory.  (Use '--help' for help.)  You can use this tool with your     the standard bindings like 'Make', 'Obtain', etc.).  Over time, existing
    own projects by creating 'version' and 'version.dat' files in your project     metadata mechanisms will be refactored to use this new mini-framework,
    directory, similar to the ones used by PEAK.  The 'version' file is a ZConfig     instead of the various integrated ad-hoc mechanisms that exist now (like
    file that describes your project's version numbering scheme(s), formats,     the 'permissionNeeded' attribute).  For more information on how the new
    and the files that need to be edited, while the 'version.dat' file contains     metadata hooks work, including doctest examples, see the 'attributes.txt'
    the current version number values.  Source for the tool, including the     file in the 'peak.binding' package, under the heading "Attribute Metadata".
    configuration file schema, is in the 'peak.running.tools.version' package.  
    (Error handling and documentation, alas, are still minimal.)   - Added a new function, 'binding.activateClass()', that can be used to
      activate any bindings in the class.  This can now be used in place of
  - Added new 'Alias' command in 'peak.running.commands'.  An 'Alias' instance     subclassing a PEAK base class or using a PEAK metaclass.  In future, this
    can be used as a 'peak.running.shortcut' property that expands to another     will be integrated into PEAK attribute descriptors such that defining a
    command with arbitrary arguments inserted before the original command's     descriptor within a class' body is sufficient to cause this function to be
    arguments.  Thus, one might alias 'mycommand' to 'runIni somefile --option',     invoked.
    similar to command aliases in many shells.  
    - 'binding.IBindingNode' was REMOVED, consolidated into 'binding.IComponent',
  - 'naming.IName' is now derived from 'binding.IComponentKey', so names and     as its various individual methods have been replaced with generic functions
    addresses must now support the 'findComponent()' method.  All PEAK name and     in the existing 'binding' API.  For example, 'binding.getParentComponent(x)'
    address types provide support for this.     should be used in preference to 'x.getParentComponent()' unless it is
      a requirement that 'x' implement the full 'binding.IComponent' interface.
  - The 'lookup()' method of 'binding.IComponentKey' is now called     This makes it easier to define what 'binding.getParentComponent()' and
    'findComponent()', to better distinguish it from 'lookup()' in     'binding.getComponentName()' will mean for non-component types, as you do
    'naming.IBasicContext', which does something very different.     not have to define an adapter class with all of the 'IBindingNode' methods.
      Also, this makes PEAK itself cleaner, as we often weren't bothering to
  - 'binding.Obtain()' (formerly 'binding.bindTo()' and 'binding.bindSequence()')     properly implement the full 'IBindingNode' interface anyway.
    now pre-adapt their arguments to 'IComponentKey', to speed lookups at  
    runtime, and to ensure that errors due to an unusable parameter type occur     In addition, 'binding.suggestParentComponent()' is now also a generic
    at class creation time instead of waiting until lookup time.     function, dispatching on the target (i.e. child) object.
   
  - There's a new 'peak.storage.files' module, with handy classes like   - 'naming.IReferenceable' was REMOVED, as it is not in use anywhere in PEAK.
    'EditableFile'.  'EditableFile' is a class that lets you edit the contents     This will be replaced with a generic function when we do actually need this
    of a file "in place", with atomic replacement of the original at transaction     functionality.
    commit.  If the transaction is aborted, the original file is left unchanged.  
    - There is a new 'config.getStreamFactory' generic function, to make it easy
  - 'peak.running.scheduler.UntwistedReactor' now supports a configuration     to accept URLs, filenames, or 'naming.IStreamFactory' objects as the source
    property ('peak.running.reactor.checkInterval') to determine how long it     of a "file".
    should run 'select()' calls for, when there are no scheduled tasks.  
      Its typical usage is just::
  - 'peak.running.scheduler.UntwistedReactor' now supports using a "signal  
    manager" component (via the 'peak.running.signalManager' property) to         factory = config.getStreamFactory(self,source)
    process signals while a 'run()' loop is in progress.  Signal managers can         stream = factory.open('t')  # open for reading in text mode
    also be added or removed at any time via the new 'peak.util.signal_stack'  
    module.     where 'source' is a string or a 'naming.IStreamFactory', and 'self' is a
      component to be used as lookup context.  The returned 'factory' is a
  - 'peak.running.commands.AbstractCommand' now offers a '_run()' method that     'naming.IStreamFactory' that can then be '.open()'-ed for reading, or used
    can be overridden in subclasses, instead of 'run()'.  If you override the     in other ways as needed.
    new '_run()' method instead, you get the advantage of automatic handling  
    for invocation errors and 'SystemExit' exceptions, provided for you by the     If you have special objects that you'd like to be able to treat as stream
    'run()' method.     sources, you can register them by defining an extension, e.g.::
   
  - There is now a 'storage.DMFor(class)' function that returns a configuration      [config.getStreamFactory.when(MyType)]
    key for registering or looking up data managers by class.  You can use the      def getStreamFactory(context,source):
    returned key in a binding's 'offerAs' list, or as the target of a 'bindTo()'          """Return a naming.IStreamFactory for 'source' (a 'MyType' instance)"""
    or 'lookupComponent()'.  The key is constructed using  
    'config.ProviderOf(storage.IDataManager,class)'.     Wherever practical, as we encounter them, we'll be changing PEAK API's that
      take filenames to also accept stream sources.
  - You can now register utilities that are keyed by the combination of an  
    interface and one or more classes, using 'config.ProviderOf(iface,*classes)'   - Added an optional 'base' argument to 'naming.parseURL()', to allow parsing
    as a configuration key.  Providers are registered under an '(iface,klass)'     URLs relative to a base URL.  For a URL scheme to support this, it must
    tuple for each specified class, and looked up using the MRO order of the     implement the new 'naming.IBaseURL' interface.  See the
    class specified for lookup.  In other words, searching for a provider will     'peak.naming.factories.openable' module for example implementations.
    find a provider for the requested class, or one of its base classes, with  
    precedence given to the more-specific provider.  This is primarily intended   - Added a 'data:' URL scheme, implementing RFC 2397 (although it's not as
    for services like data managers and Specialists.     strict in its parsing of the content type and parameters as the RFC calls
      for).  This is a semi-convenient way to provide configuration data in-line,
  - It's now possible to extend .ini file parsing with custom section types,     since a 'data:' URL can be a 'config.getStreamFactory()' source.
    and PEAK defines its own built-in section types using this extension  
    mechanism.  Custom section types must include at least one space, (e.g.   - Added 'config.processXML()', a function that provides a high-level,
    '[My Section]') or they will be treated as a plain property name.     configuration-driven interface to 'peak.util.SOX.NegotiatingParser'.  This
    See the 'peak.config.iniFile.sectionParsers' section in 'peak.ini' for     simple front-end lets you supply as little as a configuration context and
    more details, along with the 'config.ISettingParser' and 'config.IIniParser'     a stream source, to do XML processing of arbitrary complexity, controlled by
    interfaces.     the configuration of the context.
   
  - When creating a 'PropertyName()', it's now possible to force conversion of   - Added 'config.XMLKey()', an 'IConfigKey' type that can be used to register
    invalid characters to '_', using the 'PropertyName.fromString()'     configuration values for XML attribute and element names under specified
    constructor.  (Note that the input must be a plain-ASCII string.)  Unless     XML namespace URI's.  Also, there are now '[XML Attributes for nsuri]' and
    you request that wildcards ('?' and '*') be kept, they will also be     '[XML Elements for nsuri]' section types available for use in .ini files.
    converted to '_' characters.  This can be convenient for converting things     (Replace 'nsuri' with the appropriate XML namespace URI, or use '*' for a
    like filenames or text that might contain spaces, to property names.     wildcard.)
   
  - It's now possible to declare an attribute as offering a wildcard property;   - 'web.IResource' is gone, replaced by 'web.IPlace'.  The notion of a place is
    such lookups now follow the same rules as other wildcard property lookups.     broader than the notion of a resource, and we will soon need to have
    The 'config.IConfigKey' interface has been changed to cleanly support     other "location" objects that implement 'IPlace'.
    implied keys at both registration and lookup time, so you can implement  
    your own key types that work the way interfaces or property names do for   - In order to support obtaining the line and column locations of problems in
    configuration lookups.     XML files, we are now using Python 2.4's version of the 'pyexpat' module,
      built as 'peak.util.pyexpat'.
  - The 'EigenRegistry' class has been moved from 'peak.util.EigenData' to  
    'peak.config.registries', as it hasn't really been useful outside PEAK for   - There's a new class, 'config.IniLoader', that can be used to lazily load
    a while now.     .ini files as configuration.  'IniLoader' instances have an 'iniFiles'
      attribute that lists the configuration sources (filenames/URLs/factories)
  - .ini files now support "smart property" objects ('config.ISmartProperty').     to be used, and automatically load the .ini files as soon as you try to get
    If a property rule defined in an .ini file evaluates at runtime to an object     any configuration data for them.  Previously, similar functionality was only
    that implements 'ISmartProperty', the object will be given a chance to     available via 'config.makeRoot()'.
    compute a value for the property, in place of being used itself.  This helps  
    to simplify definition of complex property rules in .ini files, by allowing     Also, there's now an 'ini' reference type that instantiates an 'IniLoader'
    the use of helper classes.  Also, 'naming.LinkRef' and 'naming.Reference'     for one or more addresses.  You can use it like this::
    (indirectly) support this interface, so you can now use them in .ini files  
    to refer to an object via the naming system.  (Previously, 'naming.LinkRef'       [Named Services]
    wouldn't do the right thing unless the property was looked up via a  
    'config:' URL, and 'naming.Reference' didn't exist.)       some.example = naming.Reference('ini',
            ['pkgfile:peak/peak.ini', '/etc/something.ini']
  - 'peak.util.imports.whenImported()' can now be used even when the specified        )
    module has already been loaded.  
        another.example = naming.LinkRef(
  - The naming system no longer has 'objectFactories' and 'stateFactories' as           'ref:ini@pkgfile:peak/peak.ini||/etc/something.ini'
    utilities; they have been replaced with new mechanisms involving adaptation.        )
    Previously, addresses had a 'retrieve()' method that could be used to  
    retrieve the object defined by the address.  Now, to retrieve an object for     The two examples above will each load the same pair of specified .ini files.
    an address, you must either define a context that processes the address, or     You can also directly instantiate an 'IniLoader', as in::
    the address must have a 'defaultFactory' attribute, which provides a name  
    to be imported to get an 'IObjectFactory' that can construct the referenced       cfg = config.IniLoader(self, iniFiles=['pkgfile:peak/peak.ini'])
    object.  (This is simpler than it sounds; for URLs that reference  
    ManagedConnections, for example, all you need to do is provide the fully     Attempting to look up any configuration properties via the 'cfg' object
    qualified name of the connection class.)     will cause it to load the specified .ini file.
   
    Meanwhile, writable naming contexts must have a 'serializationProtocol'   - 'config.fileNearModule()' is DEPRECATED, in favor of 'config.packageFile()'.
    attribute, specifying what interface an object should be adapted to before     The latter returns a 'naming.IStreamFactory', which is more suitable for
    attempting to store it in that context.     working with e.g. module data files compressed in a zipfile.  Uses of
      'fileNearModule()' that were being passed to 'config.loadConfigFile()' can
    The naming system no longer processes the 'creationName' keyword argument;     be safely changed to 'config.packageFile()' without needing any other code
    this is now considered the sole responsibility of 'peak.binding'.  The     changes, but if you were directly using 'fileNearModule()' as a filename,
    'IComponent.lookupComponent()' method still accepts the keyword argument,     you will need to rewrite appropriately.
    and attribute bindings still handle the creation name transparently.  It is  
    just not available via naming system APIs, and naming contexts no longer   - 'config.loadConfigFile()' and 'config.loadConfigFiles()' now accept URLs,
    have to deal with it.     'naming.IStreamFactory' objects, and other 'config.getStreamFactory()'
      targets as well as filenames.  This was primarily added to support use of
    The naming system base classes no longer use 'attrs' as an input parameter     'config.packageFile()' or 'pkgfile:' URLs, in place of using
    or return value.  If you've subclassed anything from 'peak.naming.contexts',     'config.fileNearModule()'.
    note that your '_get()' methods should now just return the lookup value,  
    rather than a 'state,attrs' tuple.  For most naming contexts, this just   - The 'naming.IStreamFactory' interface now has an 'address' attribute, which
    means you should change 'return foo, None' statements to just 'return foo'.     is the string form of the canonical URL of the target stream.  This was
      added to make it easier to e.g. report errors in a stream that's being
  - Property definition rules in an .ini file can now refer to 'rulePrefix' and     parsed, since the parser only needs the factory in order to report the
    'ruleSuffix' variables.  'rulePrefix' is a '.'-terminated string,     location of an error.  (Note: if you implement 'naming.IStreamFactory', be
    representing the name the rule was defined with.  For example, if the     sure to add this attribute to your implementations.)
    rule was defined for '"foo.bar.*"', then 'rulePrefix' will be '"foo.bar."'.  
    The 'ruleSuffix' will be the portion of the 'propertyName' that follows   - The 'peak.util.WSGIServer' module has been moved to the
    'rulePrefix'.  So, if looking up property '"foo.bar.baz"', then the     'wsgiref.simple_server' module.  The 'wsgiref' reference library for WSGI
    '"foo.bar.*"' rule will execute with a 'ruleSuffix' of '"baz"'.  This should     (aka PEP 333) is now distributed with PEAK.
    make it easier to work with hierarchical property namespaces.  
    - Added a 'WSGI' command to the 'peak' script, to allow you to run "foreign"
  - Added simple example scripts and small applications in the 'examples'     (i.e. non-PEAK) PEP 333 applications in PEAK's various servers and
    directory.     launchers.  Basically, by prefixing 'WSGI' before the import specifier, you
      can now run such foreign apps.
  - There is a new command-line namespace introspection tool, 'n2', which  
    can be accessed by running 'peak n2'.  Type 'peak n2 -h' for help.     For example::
   
  - The PEAK_CONFIG environment variable can now list multiple files, separated         peak launch WSGI import:some_app.application
    by the platform's 'os.pathsep' (e.g. ':' on Unix, ';' on Windows).  
      will run 'some_app.application' in the local web browser, and::
  - It's no longer necessary to provide a '_defaultState()' implementation  
    for an EntityDM: a default implementation is now supplied.         peak CGI WSGI import:some_app.application
   
  - Added automatic installation of 'datetime' package for Python < 2.3.     will run it under the CGI/FastCGI runner.  Similarly, you can use this in
      the "Command" spec for the "peak supervise" pre-forking FastCGI supervisor
  - CGI support has been moved from 'peak.running.zpublish' into     subsystem.
    'peak.running.commands' (for "raw" CGI/FastCGI) and 'peak.web' (for the  
    PEAK high-level publishing framework).  You can use 'peak CGI someName' to   - There is a new 'running.IWSGIApplication' interface, for PEP 333-compliant
    adapt 'someName' to a 'running.IRerunnableCGI' and run it as a CGI/FastCGI.     "application" objects, and all of PEAK's provided applications now implement
      it instead of 'running.IRerunnableCGI'.  If you write your apps to the newer
  - There is now a 'peak.security' package, available from 'peak.api' as     interface, they'll be portable to any PEP 333-compliant web server, not just
    'security'.  It provides permission management functions: you can define     the PEAK CGI, FastCGI, and "supervisor" containers.  There is a simple
    abstract permissions by subclassing 'security.Permission', then create     adapter that allows 'IWSGIApplication' objects to run in the CGI-based
    permission checking rules by subclassing 'security.RuleSet', and declare     containers, but not the other way around, so using 'IRerunnableCGI' directly
    the permissions needed to access attributes of a class with     now limits your portability.  (For example, the "peak launch" and "peak
    'security.allow()'.  The test suite demonstrates a complex application     serve" commands will soon require 'IWSGIApplication', and will not support
    ruleset with dynamic, data-driven permissions.     'IRerunnableCGI' any more.)
   
  - There is now an interface for "Active Descriptors":     Of course, if you use the 'peak.web' framework, you don't need to worry
    'binding.IActiveDescriptor'.  'peak.binding' now uses this interface to     about any of this; your apps will automatically be wrapped as
    identify active descriptors, so you can now create your own.  (Previously,     'IWSGIApplication', and run in any PEAK server or gateway.
    'peak.binding' used 'isinstance()' to detect active descriptors.)  
    - Most 'peak.web' interfaces have changed significantly.  If you implemented
  - REMOVED 'naming.ParsedURL'; it was deprecated as of 0.5 alpha 2.     anything based on the older interfaces, and it still works, it's sheer
      bloody luck.  In particular, note that every method in 'web.IWebTraversable'
  - The 'provides' keyword argument to various 'peak.binding' APIs has been     now has different inputs and/or outputs than before.  Please read the new
    renamed to 'offerAs', and it must be a sequence of configuration keys.     interface docs and update your code!  The changed interfaces offer much
    (Previously, it accepted either a single key or a tuple of keys.)     more flexibility and functionality than before, but they will require you to
    The signature of 'binding.Constant()' was changed as well; the first     update your code.
    positional argument is now the constant value, and 'offerAs' is now a  
    keyword argument.  (Previously, 'provides' was the first positional argument   - 'web.ContainerAsTraversable' has been removed.  It was redundant, since the
    of 'binding.Constant()'.)  The 'registerProvider()' method of     new default traversal mechanism used by 'Traversable' and 'Decorator' now
    'config.IConfigurable()' also now accepts only a single configuration key,     handles getitem, getattr, and views.
    as does 'EigenRegistry.register()'.  
    - Added Zope 3-like "namespaces" to 'peak.web'.  Path segments in a URL
    Also, all 'peak.binding' APIs now only accept positional parameters for     may be prefixed with '"++some_id++"' in order to invoke a corresponding
    items unique to that API.  Items common to multiple APIs (such as 'offerAs',     namespace handler registered under '"peak.web.namespaces.some_id"'.
    'doc', 'attrName', etc.) should now be supplied as keyword arguments.     Namespace handlers must implement 'web.INamespaceHandler', and they are
      supplied with the original path segment as well as the separated namespace
    Bindings also now automatically "suggest" the containing object as a parent     and name.  Also, as in Zope 3, '"@@foo"' is a shortcut for '"++view++foo"'.
    component for the contained object, whenever a value is assigned to them or     Builtin namespaces at this time include 'view', 'item', 'attr', 'skin', and
    computed.  If a non-None 'adaptTo' is set on the binding, the value assigned     'resources'.  'skin' treats the rest of its path segment as a skin name,
    or computed will be adapted to the specified protocol before the parent     and sets the current skin, while 'resources' begins traversal to resources
    component is suggested.  'binding.New()' no longer relies on the     found in the current skin.  The other namespaces are as described at:
    'IComponentFactory' interface, but instead uses the new adapt/suggest  
    mechanisms.     "Resources and traversal in peak.web":http://www.eby-sarna.com/pipermail/peak/2004-August/001712.html
   
    Previously, parent components were only "suggested" when a binding was set   - Fixed several 'peak.events' bugs, as reported by Vladimir Iliev, Yaroslav
    via component constructor keyword arguments.  Now, this is done at any time     Samchuk, and Alexander Smishlajev:
    bindings are set, but *not* for non-binding keyword arguments.  In other  
    words, ordinary attributes of a component do not receive "suggested parent"     * 'events.AnyOf' could hold multiple references to a single event source,
    notices, even when set via constructor keyword arguments.  If you want an       and nesting 'AnyOf()' calls could leak references to the nested events.
    attribute to do this, you must define the attribute with the binding API;  
    e.g. via 'requireBinding()' or 'binding.Constant()'.  If you do *not* want     * 'events.subscribe()' had a potential race condition wherein a callback
    a binding to suggest a parent component, use 'suggestParent=False' in the       could be invoked after its weak reference was garbage collected, leading
    binding definition.       to bizarre error messages about 'self' being 'None'.
   
  Corrected Problems     * 'select()' could be called on select event objects even if there were
        no current subscribers to the event, potentially leading to calling
   - Fixed some problems with the test suite when running under Python 2.3.       'select()' on a closed socket.
     PEAK itself worked fine, but the test suite was bitten by two minor  
     semantic changes that took effect in 2.3, resulting in lots of error     * Non-default signal handlers were remaining installed even when there
     messages about ModuleType needing a parameter, and a test failure for       were no current subscribers to the applicable event, as long as a
     'checkClassInfo' in the 'FrameInfoTest' test class.       reference to the event object existed.
   
   - Transaction participants that raised an error in their 'abortTransaction()'     As a result of these changes, certain I/O event types (esp. signals and
     method, would not receive a 'finishTransaction()' call, the error was     stream readable/writeable events) are now longer-lived.  For example,
     passed through to the transaction service's caller, and later participants     signal event objects are now immortal, and the read/write event for a
     might not have received an 'abortTransaction()' message either.     particular 'fileno()' will be reused for as long as its supplying
      'Selector' or 'EventLoop' instance exists.  (Previously, weak references
   - SQL connections didn't close their cursors before aborting a transaction     were used so that these objects would be recycled when not in use.)
   
   - The logging system would raise an error if a log message with no arguments   - Added 'config.registeredProtocol()' API, that supports defining named and
     contained a '%' sign.     local protocols.  This allows easy emulation of Zope 3's "named" and "local"
      adapters and views.
   - There was a typo in peak.naming.arithmetic that caused homogeneous non-URL  
     name subtraction to fail.   - 'binding.Component' objects no longer support instance configuration at
      runtime (i.e., they no longer implement 'config.IConfigurable').  If you
   - The default reactor supplied in 'peak.running.scheduler' would consume     need a component to be configurable at runtime, you must now derive from
     CPU continuously if it was waiting for I/O and no tasks were scheduled.     (or mix in) 'binding.Configurable' instead.  If you get errors about
      a missing 'registerProvider' attribute, or about being unable to adapt to
   - The 'peak.util.imports.whenImported' function didn't work.     'IConfigurable', try changing your base class from 'binding.Component'
      to 'binding.Configurable', or add it as a mixin if you're deriving from
      a class that uses 'binding.Component' as its base.
   
    - 'binding.IComponent' no longer derives from 'config.IConfigurable' or
 Fixes and Enhancements since Version 0.5 alpha 1     'config.IConfigMap', only 'config.IConfigSource'.  This means that
      'IComponent' no longer guarantees or requires the presence of the
  Changed, Enhanced, or Newly Deprecated Features     'registerProvider()' method: now only 'config.IConfigurable' does that.
   
  - Added a 'shellcmd:'  URL scheme that returns a function that calls   - The 'config.IConfigMap' interface is now DEPRECATED.  Use
    'os.system()' on the body of the URL.  It's intended for use as a command     'config.IConfigurable' instead.  The '_configKeysMatching()' method
    factory, as is needed by the 'URLChecker' periodic task.     of 'IConfigMap' was moved to 'config.IConfigSource', so if you've
      implemented a custom 'IConfigSource', be sure to add this method.
  - You can now define adapters from arbitrary types to 'binding.IBindingNode',  
    and thus be able to use them as part of a component hierarchy - without   - 'web.ISkinService' and 'web.ILayerService' were consolidated into
    needing to directly add 'getParentComponent()' or 'getComponentName()'     'web.IInteractionPolicy', because the need to have configurable
    methods to them.     implementations of these services is negligible.  That is, the
      corresponding property namespaces ('peak.web.skins' and 'peak.web.layers')
  - Added experimental 'invoke.c' script for POSIX-ish platforms with funky     are more than adequate as registries.
    '#!' support, or lack thereof.  
    - Removed 'peak.running.timers' and 'peak.util.dispatch'.  Neither was in
    'invoke' is designed to be used like this::     active use, and both are being replaced by the new generic functions
      package in PyProtocols.
      #!/usr/local/bin/invoke peak somearg otherarg...  
    - The 'config.iterParents' API is now moved to 'binding.iterParents', and all
    This should work on most sane platforms with a long-enough commandline.     'binding' functions that walk the component hierarchy use it.  It has also
    (See "this page":http://homepages.cwi.nl/~aeb/std/hashexclam-1.html for     been changed to avoid infinite loops in the case of a pathological
    details on the insanely incompatible ways different Unixes interpret '#!'     component structure.
    lines.)  
    - The 'persistence' package has been moved to 'peak.persistence' to avoid
    The script is not currently built or installed by setup.py.  On the     conflicts with ZODB3 and the latest version of Zope 3.  It will eventually
    platforms it's targeted at, you should be able to build it with::     be phased out, but for now this move is the simplest way to get it out of
      the way.
      gcc -o invoke invoke.c  
    - The 'peak.util.SOX' module now uses only one parser, based directly on
    (Yes, it really is that simple of a script.)     'expat', instead of using SAX.  The new parser expects a new node interface,
      'IXMLBuilder', but adapters from the previous interfaces ('ISOXNode' and
  - Added a ZConfig schema for 'running.commands.EventDriven' applications,     'ISOXNode_NS') are supplied for backward compatibility.  All of PEAK's
    a ZConfig component definition for adaptive tasks, and a running shortcut     direct XML handling (currently just 'peak.storage.xmi' and
    called 'EventDriven'.     'peak.web.templates') have been refactored to use the new interface.  Some
      parsing classes (such as 'ObjectMakingHandler', 'NSHandler', and
    It should now be possible to do this::     'DOMletParser') are no longer available.
   
      #!/usr/bin/env peak EventDriven   - 'peak.web' no longer uses Zope X3 for HTTP publishing support; it has been
      refactored to use a "simpler, more uniform architecture":http://www.eby-sarna.com/pipermail/peak/2004-May/001462.html
    at the top of a ZConfig file formatted according to the new schema, and     See also "more on the architecture":http://www.eby-sarna.com/pipermail/peak/2004-June/001482.html
    have it run.  There are two periodic tasks that can be configured and     and subsequent posts in that thread.
    run from such a file: 'CleanupFiles' and 'URLChecker'.  'CleanupFiles' will  
    delete files matching a pattern that are older than a certain age, while     As a consequence, "various features have been removed":http://www.eby-sarna.com/pipermail/peak/2004-June/001500.html
    'URLChecker' will check to see if the target of a naming system URL is     from 'peak.web', for possible return at a future date.  Here is a rough
    up/available/working, and if not, runs a command to restart it.  As an     outline of the changes made so far:
    amusing demo, try specifying a 'file:' URL with a 'shellcmd:touch theFile'  
    to recreate the file, then add a 'CleanupFiles' that deletes the file the      * The 'pageProtocol', 'pathProtocol', and 'errorProtocol' machinery are
    checker looks for.  This can be hours (well, minutes) of exciting fun as you        gone.  They will be replaced in the future with an explicit "controller"
    watch the dueling daemons undoing each others' work.        wrapping mechanism to allow application-specific renderings of the same
         underlying components.
  - Added 'zconfig.schema' URL scheme that loads an enhanced ZConfig schema  
    object that can act as a command line interpreter using the 'peak' script.      * The Zope 'request' and 'response' objects are gone, along with all of
         their special handling for cookies, character sets, form variables,
    To use it, run 'peak zconfig.schema:urlToSchema urlOfConfig'.  Or, add        automatically marshalling parameters to functions, etc.  These items of
    a line like this::        functionality will be gradually replaced by functions in 'peak.web.api'.
   
      #!/usr/bin/env peak zconfig.schema:pkgfile:some.package/schema.xml        As a result of this, arbitrary functions and methods can no longer be
         used as web pages; instead, functions and methods to be published must
    to the top of a configuration file, and make the configuration file        use the same inputs and outputs as the 'IHTTPHandler.handle_http()'
    executable.  Note that the schema specified must convert to an object        method.
    that's usable with the commands bootstrap framework.  Also note that  
    if you have a local PEAK_CONFIG file, you can add a 'peak.running.shortcuts'      * The 'IWebPage', 'IWebInteraction', 'ITraversalContext', 'Traversal',
    entry to shorten the URL reference in your #! line.  E.g.::        'TraversalContext', and 'Interaction' interfaces and classes no longer
         exist, as they are unneeded in the new architecture.  Instead of
      #!/usr/bin/env peak mySchema        having a central 'IWebInteraction' that's referenced by numerous
         'ITraversalContext' objects, the new approach uses an 'environ' mapping
    will suffice if you have defined 'peak.running.shortcuts.mySchema' as        for most functions.  For access control, a 'security.IInteraction' is
    'naming.LinkRef("zconfig.schema:pkgfile:some.package/schema.xml")'.        now used, whose function is limited to security checks.  Most
         functions previously performed by 'IWebInteraction' have moved to
    There is also a 'peak ZConfig urlOfSchema urlOfConfig' variant, that was        'IInteractionPolicy' or to 'peak.web.api' functions operating on
    added to support putting '#!/usr/bin/env peak ZConfig' at the top of        'environ' mappings.
    schema files, but unfortunately that's not valid XML.  
       * Web exceptions can define a 'levelName' attribute that determines the
  - Standardized file-based URL syntaxes (e.g logfiles and lockfiles) to        severity level with which the exception will be logged.  This allows
    follow RFC 1738/2396, and Python 'urllib'.  This shouldn't affect much        one to e.g. avoid logging tracebacks for 'NotFound' errors.
    besides the canonical forms of the URLs.  Added 'pkgfile:some.pkg/filepath'  
    URL syntax for ease of referring to files near modules.  (A convenience      * Various interface calling signatures have changed slightly.  For example,
    intended mainly for referencing ZConfig schemas.)        'IAuthService.getUser()' now accepts an 'environ' mapping instead of
         an interaction.  'IInteractionPolicy.newInteraction()' now takes keyword
  - Added the UML 1.4 metamodel, and thus the ability to load UML 1.4        arguments, but not a 'request'.  The 'IWebTraversable' interface no longer
    models encoded in XMI 1.1.        has a 'getObject()' method, and the 'IWebException.handleException()'
         method signature has changed as well.  Finally, all methods that
  - Added support in the mof2py code generator for "unprefixing" enumerated        previously accepted 'ITraversalContext' (such as
    values, so that UML and other metamodels' enumerations work correctly        'IDOMletState.renderFor()') now expect 'environ' mappings.
    when loading from XMI.  Also, mof2py no longer emits 'config.setupModule()'  
    calls in generated code, as in practice they are not needed.      * 'web.TestInteraction' was replaced with 'web.TestPolicy', and
         'web.Interaction' was removed, since 'IWebInteraction' is no longer part
  - Running 'peak test' from the command line is roughly equivalent to running        of the architecture.
    'unittest.py', except that the test suite defaults to the PEAK test suite.  
    You can, however run any test suite from the command line with a dotted   - The 'log()' method of PEAK loggers ('logs.ILogger') now accepts a level name
    module/attribute path, e.g 'peak test foo.bar.test_suite'.     *or* a number, for convenient invocation.
   
  - 'binding.Acquire()' now accepts a 'default' value argument, and   - SQL transaction semantics have changed.  Now, issuing an SQL statement
    'binding.New()' no longer accepts the 'bindToOwner' flag.     *always* causes the connection to join the active PEAK transaction, even if
      you request that the SQL be issued "outside" a transaction.  Such SQL will
  - There is a new 'binding.IComponentKey' interface that is used to implement     be issued outside of the *database* transaction, but not outside of the
    'IComponent.lookupComponent()'.  Now you can implement this interface,     PEAK transaction.  This simplifies the overall processing model for dealing
    or create an adapter for it, in order to make an object usable as an     with "untransacted" SQL such as Sybase DDL or read-only Oracle transactions.
    argument to 'binding.lookupComponent()' - and therefore usable as a key     (In particular, the requirement that triggered this change was to allow
    for 'binding.bindTo()' or 'binding.bindToSequence()'.  Not that it's     Oracle read-only transactions to be released at the end of the current PEAK
    necessarily very useful to do so; you're probably better off simply     transaction.)  Also, got rid of the now-meaningless 'begin' command in n2.
    creating a naming scheme.  But it might be useful for lookups done  
    in the context of classes, since naming schemes aren't usable there.   - The 'events.IEventSource' interface now returns a 'canceller' function from
    (It was actually added in order to factor out all the type testing that     the 'addCallback()' method, allowing you to cancel a previously-scheduled
    'lookupComponent' used to do, so it doesn't matter if it's useful for     callback.  This fixes a memory leak and performance problem with
    much else.)     'events.AnyOf()', which previously could accumulate unneeded callbacks on
      the sources it was monitoring.  Note that if you have developed any custom
  - PEAK has been refactored to avoid the use of 'isImplementedBy()' and     event sources with 'addCallback()' methods, you must make sure that they
    similar introspection, in favor of 'adapt()'.  As a result, some     return a canceller from now on.
    'peak.naming' interfaces have changed.  This should not affect you  
    if you are only subclassing PEAK-provided naming components and not   - Added 'ref:factory@addr1||addr2' URL scheme that maps to a corresponding
    implementing these interfaces "from scratch".  However, the various     'naming.Reference("factory",["addr1","addr2"])'.  'factory' can be either a
    'isAddress', 'isAddressClass', 'isResolver', and 'isName' APIs have     dotted import string referencing a 'naming.IObjectFactory', or you can
    also been removed, as they were based on 'isImplementedBy()'.     define a factory in the 'peak.naming.factories' property space.
   
  - REMOVED ability to use '__implements__' and '__class_implements__' to   - Added a 'zconfig.schema' factory, so that 'ref:zconfig.schema@streamURL'
    declare support for interfaces.  Use 'protocols.advise()' or a related     will load a schema loader.  Schema loaders are themselves object factories,
    API to do this now.  The 'protocols' package is available automatically     so you can do something like::
    from 'peak.api'.  
        [Named Services]
    Similarly, the ability  to use 'isImplementedBy()' with interfaces declared       peak.naming.factories.myschema = \
    by PEAK is REMOVED.  You can still use 'isImplementedBy()' with Zope           naming.LinkRef('ref:zconfig.schema@pkgfile:mypkg/Schema.xml')
    interfaces, of course, but we recommend you switch to 'adapt()', which  
    should work with both PEAK and Zope interfaces.     in order to make URLs like 'ref:myschema@filename' work.  Note, by the way,
      that the above could also read::
  - Replaced all use of 'zope.interface' with 'protocols' package because  
    the 'protocols' package:       [Named Services]
        peak.naming.factories.myschema = \
    * is considerably smaller and simpler than 'zope.interface'           naming.Reference('zconfig.schema',['pkgfile:mypkg/Schema.xml'])
   
    * produces Interface objects that can be inspected with the Python     which runs somewhat faster at lookup time.  Similarly, one can also use
      'pydoc' and 'help()' tools     'naming.Reference("myschema",["somefile"])' in place of a
      'naming.LinkRef("ref:myschema@filename")'.  As well as being faster, for
    * supports and implements the PEP 246 'adapt()' protocol     some use cases it's easier to 'Reference' directly than to glue together
      a 'ref:' URL string.
    * transparently supports transitive adaptation - i.e. if adapter AB  
      adapts from A to B, and adapter BC adapts from B to C, then an adapt(x,C)  
      where 'x' is an 'A', will be implemented as BC(AB(x)).  
   
    * Supports "open protocols" that allow you to "superclass" a protocol  
      to create a subset protocol; objects that support the first protocol  
      will automatically support the subset protocol.  For example, if one  
      person defines a "dictionary" protocol, someone else can create a  
      "read-only dictionary" protocol, and all objects supporting the  
      "dictionary protocol" will be considered to implement the "read-only  
      dictionary" protocol.  
   
    * can interoperate with other interface packages, including Zope's, but  
      does not require them  
   
    * works with module inheritance (for everything but moduleProvides(), and  
      we should get to that by 0.5a2)  
   
    * lets you use Interfaces as abstract base classes (i.e., you can  
      inherit from an interface and turn it into an implementation, and  
      you can define default attribute values or method implementations in  
      your interfaces  
   
    * Lets you mix interface declarations from any number of frameworks and  
      any number of interface types, in a single 'implements()' or  
      'classProvides()'  
   
    * uses adaptation as the fundamental approach to dealing with interfaces,  
      and avoids the use of 'isImplementedBy()'.  In the *rare* case that you  
      need to introspect rather than adapt, you can always call adapt() and  
      check the result.  (But introspection usually means that you're using  
      interfaces as a form of metadata; it's better to create an explicit  
      interface that provides the metadata you seek, and adapt to that  
      interface, than to use interfaces as data.)  
   
    Most of these features are unavailable in 'zope.interface', and some have  
    been declared by the Zope Pope to be unacceptable or undesirable features  
    for Zope interfaces.  (Others may be available in some form in future  
    versions of Zope X3.)  So, we no longer require or distribute  
    'zope.interface'.  
   
  - The signatures of the 'getObjectInstance()', 'getStateToBind()', and  
    'getURLContext()' methods in the 'peak.naming' package have changed, to  
    place the context or parent component as the first, non-optional argument.  
    (If you don't know what these methods are for, you don't need to do anything  
    about this, as they are part of the naming package's extensibility  
    framework.)  
   
  - 'binding.bindTo()' now accepts a 'default=' argument, whose value will be  
    used in case of a 'NameNotFound' error.  
   
  - DEPRECATED 'naming.ParsedURL'.  It will disappear in 0.5 alpha 3 or beta.  
    It is replaced by the new 'naming.URL.Base'.  The 'naming.URL' package  
    provides a new URL parsing framework based on 'peak.model'.  Upgrading from  
    'ParsedURL' to 'URL.Base' is trivial for ParsedURL subclasses that used  
    only the 'scheme' and 'body' fields, and in fact may not require any  
    changes except for the choice of base class.  Also, the 'retrieve()' method  
    of URLs is deprecated; please begin defining the 'getObjectInstance()'  
    method instead.  This is to cut down a bit on the number of ways that the  
    naming package spells the idea of retrieving something!  
   
    For more complex URL classes, the '__init__' methods go away, 'parse'  
    methods change slightly, and explicit field definitions (using  
    'model.structField' or similar) are required.  See PEAK's 'URL.Base'  
    subclasses for examples.  There is also a sophisticated parsing and  
    formatting framework (see the 'peak.naming.URL' and 'peak.util.fmtparse'  
    modules) that can be used in place of the old regex-based approach.  
   
  - Added 'peak.util.fmtparse', a parsing and formatting framework, and  
    integrated it with 'peak.model' so that any element type can have a  
    syntax for parsing from, or formatting to, a string.  
   
  - Added 'binding.whenAssembled(...)' as syntax sugar for  
    'binding.Once(...,activateUponAssembly=True)'.  
   
  - Removed 'LOG_XYZ' convenience functions from 'peak.api', and refactored  
    'peak.running.logs' to use a PEP 282-like interface, 'running.ILogger'.  
    Under the new scheme, messages must be sent to a specific entry point  
    (e.g. 'self.logger.warning("foo")').  Components can bind an attribute  
    directly to a logger object, or via configuration properties or utilities.  
    PEAK components that do logging all define a 'logger' attribute, bound  
    to a configuration property in the 'peak.logs' property namespace.  By  
    a default in 'peak.ini', 'peak.logs.*' is configured to output messages  
    of 'WARNING' priority or higher to 'sys.stderr'.  
   
    For compatibility with the PEP 282 logging package, a 'logging.logger:'  
    URL scheme has been added; looking up the URL '"logging.logger:foo.bar"'  
    is equivalent to 'logging.getLogger("foo.bar")', unless the 'logging'  
    package is not available, in which case the configuration property  
    'peak.logs.foo.bar' will be looked up in the target context of the  
    lookup.  Optionally, you can configure the 'logging.logger' URL scheme so  
    that it only uses PEAK loggers, and never uses the PEP 282 loggers.  
   
  - Added 'binding.metamethod()' wrapper for metaclass methods that might  
    not be accessible from their instances if the instances (classes) also  
    defined the method for *their* instances.  You must now use this wrapper  
    on any such metaclass-defined methods, as PEAK no longer works around  
    this via the 'x.__class__.foo(x,...)' trick that was used previously.  
    In particular, if you have metaclass definitions of 'getParentComponent',  
    '_getConfigData', 'getComponentName', or 'notifyUponAssembly', you need  
    to wrap them with 'binding.metamethod' now.  
   
  - Made 'NOT_GIVEN' and 'NOT_FOUND' recognizable by humans (they 'repr'  
    and 'str' to their names) and by Python (they can be pickled, and  
    when restored they come back as the same object).  
   
   
  Corrected Problems  
   
  - Fixed a problem in ZConfig 'schema.dtd'; I used 'PCDATA' where I should've  
    used 'CDATA'.  
   
  - Fixed a problem with 'binding.supertype()' not working correctly if the MRO  
    it was searching contained a "classic" class.  Now 'supertype()' skips any  
    classic classes it finds.  (It probably should be rewritten entirely.)  
   
  - Fixed misc. problems with 'fromZConfig()' component constructor  
   
  - Fixed source distributions missing essential setup files  
   
  - Fixed a problem with assembly events, where a parent component that didn't  
    need assembly notification, wouldn't ever notify its children of assembly  
    if they requested the notification after the parent had already received  
    it.  
   
  - Fixed a bug in automatic metaclass generation that caused extra unneeded  
    metaclasses to be generated.  
   
  - Fixed 'naming.lookup()' and related APIs not setting the parent component  
    of created objects without an explicitly supplied 'creationParent' keyword  
    argument.  This used to "sort of work" when we had implicit configuration  
    parents, but was broken when we went "all explicit" for 0.5 alpha 1.  
   
  - Fixed a problem where initializing single-valued immutable fields of  
   'peak.model' types did not perform type/value normalization.  
   
  - Fixed a problem where bindTo would use the attribute name as the  
    default value for a lookup, if the requested name/property/utility  
    was not found.  
   
  - Fixed 'mof2py' generator script not working  
   
  - Fixed model.Element not getting parent component set when passed as a  
    constructor argument.  
   
  - Fixed property/utility lookups not working correctly on model.*  
    objects.  
   
  - Fixed IndentedStream generating all-whitespace lines  
   


Generate output suitable for use with a patch program
Legend:
Removed from v.1453  
changed lines
  Added in v.2107

cvs-admin@eby-sarna.com

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help