Fixes and Enhancements since Version 0.5 alpha 1 |
Fixes and Enhancements since Version 0.5 alpha 3 |
|
|
Changed, Enhanced, or Newly Deprecated Features |
- The 'log()' method of PEAK loggers ('logs.ILogger') now accepts a level name |
|
*or* a number, for convenient invocation. |
|
|
- Added 'zconfig.schema' URL scheme that loads an enhanced ZConfig schema |
- SQL transaction semantics have changed. Now, issuing an SQL statement |
object that can act as a command line interpreter using the 'peak' script. |
*always* causes the connection to join the active PEAK transaction, even if |
To use it, run 'peak zconfig.schema:urlToSchema urlOfConfig'. Or, add |
you request that the SQL be issued "outside" a transaction. Such SQL will |
a line like this:: |
be issued outside of the *database* transaction, but not outside of the |
|
PEAK transaction. This simplifies the overall processing model for dealing |
#!/usr/bin/env peak zconfig.schema:pkgfile:some.package/schema.xml |
with "untransacted" SQL such as Sybase DDL or read-only Oracle transactions. |
|
(In particular, the requirement that triggered this change was to allow |
to the top of a configuration file, and make the configuration file |
Oracle read-only transactions to be released at the end of the current PEAK |
executable. Note that the schema specified must convert to an object |
transaction.) Also, got rid of the now-meaningless 'begin' command in n2. |
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 'events.IEventSource' interface now returns a 'canceller' function from |
entry to shorten the URL reference in your #! line. E.g.:: |
the 'addCallback()' method, allowing you to cancel a previously-scheduled |
|
callback. This fixes a memory leak and performance problem with |
#!/usr/bin/env peak mySchema |
'events.AnyOf()', which previously could accumulate unneeded callbacks on |
|
the sources it was monitoring. Note that if you have developed any custom |
will suffice if you have defined 'peak.running.shortcuts.mySchema' as |
event sources with 'addCallback()' methods, you must make sure that they |
'naming.LinkRef("zconfig.schema:pkgfile:some.package/schema.xml")'. |
return a canceller from now on. |
|
|
There is also a 'peak ZConfig urlOfSchema urlOfConfig' variant, that was |
- Added 'ref:factory@addr1||addr2' URL scheme that maps to a corresponding |
added to support putting '#!/usr/bin/env peak ZConfig' at the top of |
'naming.Reference("factory",["addr1","addr2"])'. 'factory' can be either a |
schema files, but unfortunately that's not valid XML. |
dotted import string referencing a 'naming.IObjectFactory', or you can |
|
define a factory in the 'peak.naming.factories' property space. |
- Standardized file-based URL syntaxes (e.g logfiles and lockfiles) to |
|
follow RFC 1738/2396, and Python 'urllib'. This shouldn't affect much |
- Added a 'zconfig.schema' factory, so that 'ref:zconfig.schema@streamURL' |
besides the canonical forms of the URLs. Added 'pkgfile:some.pkg/filepath' |
will load a schema loader. Schema loaders are themselves object factories, |
URL syntax for ease of referring to files near modules. (A convenience |
so you can do something like: |
intended mainly for referencing ZConfig schemas.) |
|
|
[Named Services] |
- Added the UML 1.4 metamodel, and thus the ability to load UML 1.4 |
peak.naming.factories.myschema = \ |
models encoded in XMI 1.1. |
naming.LinkRef('ref:zconfig.schema@pkgfile:mypkg/Schema.xml') |
|
|
- Added support in the mof2py code generator for "unprefixing" enumerated |
in order to make URLs like 'ref:myschema@filename' work. Note, by the way, |
values, so that UML and other metamodels' enumerations work correctly |
that the above could also read: |
when loading from XMI. |
|
|
[Named Services] |
- 'binding.Acquire()' now accepts a 'default' value argument, and |
peak.naming.factories.myschema = \ |
'binding.New()' no longer accepts the 'bindToOwner' flag. |
naming.Reference('zconfig.schema',['pkgfile:mypkg/Schema.xml']) |
|
|
- There is a new 'binding.IComponentKey' interface that is used to implement |
which runs somewhat faster at lookup time. Similarly, one can also use |
'IComponent.lookupComponent()'. Now you can implement this interface, |
'naming.Reference("myschema",["somefile"])' in place of a |
or create an adapter for it, in order to make an object usable as an |
'naming.LinkRef("ref:myschema@filename")'. As well as being faster, for |
argument to 'binding.lookupComponent()' - and therefore usable as a key |
some use cases it's easier to 'Reference' directly than to glue together |
for 'binding.bindTo()' or 'binding.bindToSequence()'. Not that it's |
a 'ref:' URL string. |
necessarily very useful to do so; you're probably better off simply |
|
creating a naming scheme. But it might be useful for lookups done |
|
in the context of classes, since naming schemes aren't usable there. |
|
(It was actually added in order to factor out all the type testing that |
|
'lookupComponent' used to do, so it doesn't matter if it's useful for |
|
much else.) |
|
|
|
- PEAK has been refactored to avoid the use of 'isImplementedBy()' and |
|
similar introspection, in favor of 'adapt()'. As a result, some |
|
'peak.naming' interfaces have changed. This should not affect you |
|
if you are only subclassing PEAK-provided naming components and not |
|
implementing these interfaces "from scratch". However, the various |
|
'isAddress', 'isAddressClass', 'isResolver', and 'isName' APIs have |
|
also been removed, as they were based on 'isImplementedBy()'. |
|
|
|
- REMOVED ability to use '__implements__' and '__class_implements__' to |
|
declare support for interfaces. Use 'protocols.advise()' or a related |
|
API to do this now. The 'protocols' package is available automatically |
|
from 'peak.api'. |
|
|
|
Similarly, the ability to use 'isImplementedBy()' with interfaces declared |
|
by PEAK is REMOVED. You can still use 'isImplementedBy()' with Zope |
|
interfaces, of course, but we recommend you switch to 'adapt()', which |
|
should work with both PEAK and Zope interfaces. |
|
|
|
- Replaced all use of 'zope.interface' with 'protocols' package because |
|
the 'protocols' package: |
|
|
|
* is considerably smaller and simpler than 'zope.interface' |
|
|
|
* produces Interface objects that can be inspected with the Python |
|
'pydoc' and 'help()' tools |
|
|
|
* supports and implements the PEP 246 'adapt()' protocol |
|
|
|
* 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.) |
|
|
|
- '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. 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 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 '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 |
|
|
|