Fixes and Enhancements since Version 0.5 alpha 1 |
Fixes and Enhancements since Version 0.5 alpha 3 |
|
|
Changed, Enhanced, or Newly Deprecated Features |
- Fixed several 'peak.events' bugs, as reported by Vladimir Iliev, Yaroslav |
|
Samchuk, and Alexander Smishlajev: |
|
|
- DEPRECATED use of '__implements__' and '__class_implements__' to declare |
* 'events.AnyOf' could hold multiple references to a single event source, |
support for interfaces. Use 'implements()', 'classProvides()', |
and nesting 'AnyOf()' calls could leak references to the nested events. |
'directlyProvides()', 'moduleProvides()', etc. to do this now; they |
|
are now available automatically from 'peak.api'. |
|
|
|
- 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.) |
|
|
|
- 'EigenRegistry' and 'PropertyMap' no longer attempt to figure out whether |
|
implied (i.e. inherited) interfaces are more or less general with respect |
|
to a previous registration. This was behavior that emulated Zope adapter |
|
registries, but what we really wanted was more akin to a Zope "type" |
|
registry. The only parts of the test suite that used the old behavior |
|
were the tests specifically written to ensure that behavior! |
|
|
|
- '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. |
|
|
|
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 '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 |
* 'events.subscribe()' had a potential race condition wherein a callback |
constructor argument. |
could be invoked after its weak reference was garbage collected, leading |
|
to bizarre error messages about 'self' being 'None'. |
|
|
|
* 'select()' could be called on select event objects even if there were |
|
no current subscribers to the event, potentially leading to calling |
|
'select()' on a closed socket. |
|
|
|
* Non-default signal handlers were remaining installed even when there |
|
were no current subscribers to the applicable event, as long as a |
|
reference to the event object existed. |
|
|
|
As a result of these changes, certain I/O event types (esp. signals and |
|
stream readable/writeable events) are now longer-lived. For example, |
|
signal event objects are now immortal, and the read/write event for a |
|
particular 'fileno()' will be reused for as long as its supplying |
|
'Selector' or 'EventLoop' instance exists. (Previously, weak references |
|
were used so that these objects would be recycled when not in use.) |
|
|
|
- Added 'config.registeredProtocol()' API, that supports defining named and |
|
local protocols. This allows easy emulation of Zope 3's "named" and "local" |
|
adapters and views. |
|
|
|
- 'binding.Component' objects no longer support instance configuration at |
|
runtime (i.e., they no longer implement 'config.IConfigurable'). If you |
|
need a component to be configurable at runtime, you must now derive from |
|
(or mix in) 'binding.Configurable' instead. If you get errors about |
|
a missing 'registerProvider' attribute, or about being unable to adapt to |
|
'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 |
|
'config.IConfigMap', only 'config.IConfigSource'. This means that |
|
'IComponent' no longer guarantees or requires the presence of the |
|
'registerProvider()' method: now only 'config.IConfigurable' does that. |
|
|
|
- The 'config.IConfigMap' interface is now DEPRECATED. Use |
|
'config.IConfigurable' instead. The '_configKeysMatching()' method |
|
of 'IConfigMap' was moved to 'config.IConfigSource', so if you've |
|
implemented a custom 'IConfigSource', be sure to add this method. |
|
|
|
- 'web.ISkinService' and 'web.ILayerService' were consolidated into |
|
'web.IInteractionPolicy', because the need to have configurable |
|
implementations of these services is negligible. That is, the |
|
corresponding property namespaces ('peak.web.skins' and 'peak.web.layers') |
|
are more than adequate as registries. |
|
|
|
- Removed 'peak.running.timers' and 'peak.util.dispatch'. Neither was in |
|
active use, and both are being replaced by the new generic functions |
|
package in PyProtocols. |
|
|
|
- The 'config.iterParents' API is now moved to 'binding.iterParents', and all |
|
'binding' functions that walk the component hierarchy use it. It has also |
|
been changed to avoid infinite loops in the case of a pathological |
|
component structure. |
|
|
|
- The 'persistence' package has been moved to 'peak.persistence' to avoid |
|
conflicts with ZODB3 and the latest version of Zope 3. It will eventually |
|
be phased out, but for now this move is the simplest way to get it out of |
|
the way. |
|
|
|
- The 'peak.util.SOX' module now uses only one parser, based directly on |
|
'expat', instead of using SAX. The new parser expects a new node interface, |
|
'IXMLBuilder', but adapters from the previous interfaces ('ISOXNode' and |
|
'ISOXNode_NS') are supplied for backward compatibility. All of PEAK's |
|
direct XML handling (currently just 'peak.storage.xmi' and |
|
'peak.web.templates') have been refactored to use the new interface. Some |
|
parsing classes (such as 'ObjectMakingHandler', 'NSHandler', and |
|
'DOMletParser') are no longer available. |
|
|
|
- '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 |
|
See also "more on the architecture":http://www.eby-sarna.com/pipermail/peak/2004-June/001482.html |
|
and subsequent posts in that thread. |
|
|
|
As a consequence, "various features have been removed":http://www.eby-sarna.com/pipermail/peak/2004-June/001500.html |
|
from 'peak.web', for possible return at a future date. Here is a rough |
|
outline of the changes made so far: |
|
|
|
* The 'pageProtocol', 'pathProtocol', and 'errorProtocol' machinery are |
|
gone. They will be replaced in the future with an explicit "controller" |
|
wrapping mechanism to allow application-specific renderings of the same |
|
underlying components. |
|
|
|
* The Zope 'request' and 'response' objects are gone, along with all of |
|
their special handling for cookies, character sets, form variables, |
|
automatically marshalling parameters to functions, etc. These items of |
|
functionality will be gradually replaced by functions in 'peak.web.api'. |
|
|
|
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 |
|
use the same inputs and outputs as the 'IHTTPHandler.handle_http()' |
|
method. |
|
|
|
* The 'IWebPage', 'IWebInteraction', 'ITraversalContext', 'Traversal', |
|
'TraversalContext', and 'Interaction' interfaces and classes no longer |
|
exist, as they are unneeded in the new architecture. Instead of |
|
having a central 'IWebInteraction' that's referenced by numerous |
|
'ITraversalContext' objects, the new approach uses an 'environ' mapping |
|
for most functions. For access control, a 'security.IInteraction' is |
|
now used, whose function is limited to security checks. Most |
|
functions previously performed by 'IWebInteraction' have moved to |
|
'IInteractionPolicy' or to 'peak.web.api' functions operating on |
|
'environ' mappings. |
|
|
|
* Web exceptions can define a 'levelName' attribute that determines the |
|
severity level with which the exception will be logged. This allows |
|
one to e.g. avoid logging tracebacks for 'NotFound' errors. |
|
|
|
* Various interface calling signatures have changed slightly. For example, |
|
'IAuthService.getUser()' now accepts an 'environ' mapping instead of |
|
an interaction. 'IInteractionPolicy.newInteraction()' now takes keyword |
|
arguments, but not a 'request'. The 'IWebTraversable' interface no longer |
|
has a 'getObject()' method, and the 'IWebException.handleException()' |
|
method signature has changed as well. Finally, all methods that |
|
previously accepted 'ITraversalContext' (such as |
|
'IDOMletState.renderFor()') now expect 'environ' mappings. |
|
|
|
* 'web.TestInteraction' was replaced with 'web.TestPolicy', and |
|
'web.Interaction' was removed, since 'IWebInteraction' is no longer part |
|
of the architecture. |
|
|
|
- The 'log()' method of PEAK loggers ('logs.ILogger') now accepts a level name |
|
*or* a number, for convenient invocation. |
|
|
|
- SQL transaction semantics have changed. Now, issuing an SQL statement |
|
*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 |
|
be issued outside of the *database* transaction, but not outside of the |
|
PEAK transaction. This simplifies the overall processing model for dealing |
|
with "untransacted" SQL such as Sybase DDL or read-only Oracle transactions. |
|
(In particular, the requirement that triggered this change was to allow |
|
Oracle read-only transactions to be released at the end of the current PEAK |
|
transaction.) Also, got rid of the now-meaningless 'begin' command in n2. |
|
|
|
- The 'events.IEventSource' interface now returns a 'canceller' function from |
|
the 'addCallback()' method, allowing you to cancel a previously-scheduled |
|
callback. This fixes a memory leak and performance problem with |
|
'events.AnyOf()', which previously could accumulate unneeded callbacks on |
|
the sources it was monitoring. Note that if you have developed any custom |
|
event sources with 'addCallback()' methods, you must make sure that they |
|
return a canceller from now on. |
|
|
|
- Added 'ref:factory@addr1||addr2' URL scheme that maps to a corresponding |
|
'naming.Reference("factory",["addr1","addr2"])'. 'factory' can be either a |
|
dotted import string referencing a 'naming.IObjectFactory', or you can |
|
define a factory in the 'peak.naming.factories' property space. |
|
|
|
- Added a 'zconfig.schema' factory, so that 'ref:zconfig.schema@streamURL' |
|
will load a schema loader. Schema loaders are themselves object factories, |
|
so you can do something like: |
|
|
|
[Named Services] |
|
peak.naming.factories.myschema = \ |
|
naming.LinkRef('ref:zconfig.schema@pkgfile:mypkg/Schema.xml') |
|
|
|
in order to make URLs like 'ref:myschema@filename' work. Note, by the way, |
|
that the above could also read: |
|
|
|
[Named Services] |
|
peak.naming.factories.myschema = \ |
|
naming.Reference('zconfig.schema',['pkgfile:mypkg/Schema.xml']) |
|
|
|
which runs somewhat faster at lookup time. Similarly, one can also use |
|
'naming.Reference("myschema",["somefile"])' in place of a |
|
'naming.LinkRef("ref:myschema@filename")'. As well as being faster, for |
|
some use cases it's easier to 'Reference' directly than to glue together |
|
a 'ref:' URL string. |
|
|
- Fixed property/utility lookups not working correctly on model.* |
|
objects. |
|
|
|
- Fixed IndentedStream generating all-whitespace lines |
|
|
|