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 |
|
|
|