|
|
Changed, Enhanced, or Newly Deprecated Features |
Changed, Enhanced, or Newly Deprecated Features |
|
|
|
- Added new 'version' tool that automatically edits files to update version |
|
information in them. Just execute the 'version' file in the main PEAK |
|
source directory. (Use '--help' for help.) You can use this tool with your |
|
own projects by creating 'version' and 'version.dat' files in your project |
|
directory, similar to the ones used by PEAK. The 'version' file is a ZConfig |
|
file that describes your project's version numbering scheme(s), formats, |
|
and the files that need to be edited, while the 'version.dat' file contains |
|
the current version number values. Source for the tool, including the |
|
configuration file schema, is in the 'peak.running.tools.version' package. |
|
(Error handling and documentation, alas, are still minimal.) |
|
|
|
- Added new 'Alias' command in 'peak.running.commands'. An 'Alias' instance |
|
can be used as a 'peak.running.shortcut' property that expands to another |
|
command with arbitrary arguments inserted before the original command's |
|
arguments. Thus, one might alias 'mycommand' to 'runIni somefile --option', |
|
similar to command aliases in many shells. |
|
|
|
- 'naming.IName' is now derived from 'binding.IComponentKey', so names and |
|
addresses must now support the 'findComponent()' method. All PEAK name and |
|
address types provide support for this. |
|
|
|
- The 'lookup()' method of 'binding.IComponentKey' is now called |
|
'findComponent()', to better distinguish it from 'lookup()' in |
|
'naming.IBasicContext', which does something very different. |
|
|
|
- 'binding.bindTo()' and 'binding.bindSequence()' now pre-adapt their |
|
arguments to 'IComponentKey', to speed lookups at runtime, and to ensure |
|
that errors due to an unusable parameter type occur at class creation time |
|
instead of waiting until lookup time. |
|
|
|
- The following 'binding' forms are now deprecated, and will go away before |
|
0.5 beta is released: |
|
|
|
'bindToProperty(x,y)' -- use 'bindTo(PropertyName(x),default=y)' |
|
|
|
'bindToParent()' -- use 'bindTo("..")' |
|
|
|
'bindToSelf()' -- use 'bindTo(".")' |
|
|
|
'bindToUtilities()' -- no replacement; let me know if you're using this. |
|
|
|
- There's a new 'peak.storage.files' module, with handy classes like |
|
'EditableFile'. 'EditableFile' is a class that lets you edit the contents |
|
of a file "in place", with atomic replacement of the original at transaction |
|
commit. If the transaction is aborted, the original file is left unchanged. |
|
|
|
- 'peak.running.scheduler.UntwistedReactor' now supports a configuration |
|
property ('peak.running.reactor.checkInterval') to determine how long it |
|
should run 'select()' calls for, when there are no scheduled tasks. |
|
|
|
- 'peak.running.scheduler.UntwistedReactor' now supports using a "signal |
|
manager" component (via the 'peak.running.signalManager' property) to |
|
process signals while a 'run()' loop is in progress. Signal managers can |
|
also be added or removed at any time via the new 'peak.util.signal_stack' |
|
module. |
|
|
|
- 'peak.running.commands.AbstractCommand' now offers a '_run()' method that |
|
can be overridden in subclasses, instead of 'run()'. If you override the |
|
new '_run()' method instead, you get the advantage of automatic handling |
|
for invocation errors and 'SystemExit' exceptions, provided for you by the |
|
'run()' method. |
|
|
|
- There is now a 'storage.DMFor(class)' function that returns a configuration |
|
key for registering or looking up data managers by class. You can use the |
|
returned key in a binding's 'offerAs' list, or as the target of a 'bindTo()' |
|
or 'lookupComponent()'. The key is constructed using |
|
'config.ProviderOf(storage.IDataManager,class)'. |
|
|
|
- You can now register utilities that are keyed by the combination of an |
|
interface and one or more classes, using 'config.ProviderOf(iface,*classes)' |
|
as a configuration key. Providers are registered under an '(iface,klass)' |
|
tuple for each specified class, and looked up using the MRO order of the |
|
class specified for lookup. In other words, searching for a provider will |
|
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 |
|
for services like data managers and Specialists. |
|
|
|
- It's now possible to extend .ini file parsing with custom section types, |
|
and PEAK defines its own built-in section types using this extension |
|
mechanism. Custom section types must include at least one space, (e.g. |
|
'[My Section]') or they will be treated as a plain property name. |
|
See the 'peak.config.iniFile.sectionParsers' section in 'peak.ini' for |
|
more details, along with the 'config.ISettingParser' and 'config.IIniParser' |
|
interfaces. |
|
|
|
- When creating a 'PropertyName()', it's now possible to force conversion of |
|
invalid characters to '_', using the 'PropertyName.fromString()' |
|
constructor. (Note that the input must be a plain-ASCII string.) Unless |
|
you request that wildcards ('?' and '*') be kept, they will also be |
|
converted to '_' characters. This can be convenient for converting things |
|
like filenames or text that might contain spaces, to property names. |
|
|
|
- It's now possible to declare an attribute as offering a wildcard property; |
|
such lookups now follow the same rules as other wildcard property lookups. |
|
The 'config.IConfigKey' interface has been changed to cleanly support |
|
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 |
|
configuration lookups. |
|
|
|
- The 'EigenRegistry' class has been moved from 'peak.util.EigenData' to |
|
'peak.config.registries', as it hasn't really been useful outside PEAK for |
|
a while now. |
|
|
|
- .ini files now support "smart property" objects ('config.ISmartProperty'). |
|
If a property rule defined in an .ini file evaluates at runtime to an object |
|
that implements 'ISmartProperty', the object will be given a chance to |
|
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 |
|
the use of helper classes. Also, 'naming.LinkRef' and 'naming.Reference' |
|
(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' |
|
wouldn't do the right thing unless the property was looked up via a |
|
'config:' URL, and 'naming.Reference' didn't exist.) |
|
|
|
- 'peak.util.imports.whenImported()' can now be used even when the specified |
|
module has already been loaded. |
|
|
|
- The naming system no longer has 'objectFactories' and 'stateFactories' as |
|
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 |
|
an address, you must either define a context that processes the address, or |
|
the address must have a 'defaultFactory' attribute, which provides a name |
|
to be imported to get an 'IObjectFactory' that can construct the referenced |
|
object. (This is simpler than it sounds; for URLs that reference |
|
ManagedConnections, for example, all you need to do is provide the fully |
|
qualified name of the connection class.) |
|
|
|
Meanwhile, writable naming contexts must have a 'serializationProtocol' |
|
attribute, specifying what interface an object should be adapted to before |
|
attempting to store it in that context. |
|
|
|
The naming system no longer processes the 'creationName' keyword argument; |
|
this is now considered the sole responsibility of 'peak.binding'. The |
|
'IComponent.lookupComponent()' method still accepts the keyword argument, |
|
and attribute bindings still handle the creation name transparently. It is |
|
just not available via naming system APIs, and naming contexts no longer |
|
have to deal with it. |
|
|
|
The naming system base classes no longer use 'attrs' as an input parameter |
|
or return value. If you've subclassed anything from 'peak.naming.contexts', |
|
note that your '_get()' methods should now just return the lookup value, |
|
rather than a 'state,attrs' tuple. For most naming contexts, this just |
|
means you should change 'return foo, None' statements to just 'return foo'. |
|
|
|
- Property definition rules in an .ini file can now refer to 'rulePrefix' and |
|
'ruleSuffix' variables. 'rulePrefix' is a '.'-terminated string, |
|
representing the name the rule was defined with. For example, if the |
|
rule was defined for '"foo.bar.*"', then 'rulePrefix' will be '"foo.bar."'. |
|
The 'ruleSuffix' will be the portion of the 'propertyName' that follows |
|
'rulePrefix'. So, if looking up property '"foo.bar.baz"', then the |
|
'"foo.bar.*"' rule will execute with a 'ruleSuffix' of '"baz"'. This should |
|
make it easier to work with hierarchical property namespaces. |
|
|
|
- Added simple example scripts and small applications in the 'examples' |
|
directory. |
|
|
|
- There is a new command-line namespace introspection tool, 'n2', which |
|
can be accessed by running 'peak n2'. Type 'peak n2 -h' for help. |
|
|
|
- The PEAK_CONFIG environment variable can now list multiple files, separated |
|
by the platform's 'os.pathsep' (e.g. ':' on Unix, ';' on Windows). |
|
|
|
- It's no longer necessary to provide a '_defaultState()' implementation |
|
for an EntityDM: a default implementation is now supplied. |
|
|
- Added automatic installation of 'datetime' package for Python < 2.3. |
- Added automatic installation of 'datetime' package for Python < 2.3. |
|
|
- CGI support has been moved from 'peak.running.zpublish' into |
- CGI support has been moved from 'peak.running.zpublish' into |
identify active descriptors, so you can now create your own. (Previously, |
identify active descriptors, so you can now create your own. (Previously, |
'peak.binding' used 'isinstance()' to detect active descriptors.) |
'peak.binding' used 'isinstance()' to detect active descriptors.) |
|
|
- 'peak.naming' no longer automatically converts all addresses to the |
|
addressed objects. You must specifically request the interface you want |
|
by adapting the retrieved object to that interface. This can be done by |
|
supplying an 'adaptTo=ISomething' keyword argument to the attribute binding |
|
definition or your 'lookupComponent()' call. |
|
|
|
The naming system no longer has 'objectFactories' and 'stateFactories'; |
|
these have been replaced with adaptation. Writable naming contexts must |
|
have a 'serializationProtocol' attribute specifying what interface an object |
|
should be adapted to before attempting to store it in that context. |
|
|
|
The naming system no longer processes the 'creationName' keyword argument; |
|
this is now considered the sole responsibility of 'peak.binding'. The |
|
'IComponent.lookupComponent()' method still accepts the keyword argument, |
|
and attribute bindings still handle the creation name transparently. It is |
|
just not available via naming system APIs, and naming contexts no longer |
|
have to deal with it. |
|
|
|
The naming system base classes no longer use 'attrs' as an input parameter |
|
or return value. If you've subclassed anything from 'peak.naming.contexts', |
|
note that your '_get()' methods should now just return the lookup value, |
|
rather than a 'state,attrs' tuple. For most naming contexts, this just |
|
means you should change 'return foo, None' statements to just 'return foo'. |
|
|
|
- REMOVED 'naming.ParsedURL'; it was deprecated as of 0.5 alpha 2. |
- REMOVED 'naming.ParsedURL'; it was deprecated as of 0.5 alpha 2. |
|
|
- The 'provides' keyword argument to various 'peak.binding' APIs has been |
- The 'provides' keyword argument to various 'peak.binding' APIs has been |
a binding to suggest a parent component, use 'suggestParent=False' in the |
a binding to suggest a parent component, use 'suggestParent=False' in the |
binding definition. |
binding definition. |
|
|
|
Corrected Problems |
|
|
|
- Transaction participants that raised an error in their 'abortTransaction()' |
|
method, would not receive a 'finishTransaction()' call, the error was |
|
passed through to the transaction service's caller, and later participants |
|
might not have received an 'abortTransaction()' message either. |
|
|
|
- SQL connections didn't close their cursors before aborting a transaction |
|
|
|
- The logging system would raise an error if a log message with no arguments |
|
contained a '%' sign. |
|
|
|
- There was a typo in peak.naming.arithmetic that caused homogeneous non-URL |
|
name subtraction to fail. |
|
|
|
- The default reactor supplied in 'peak.running.scheduler' would consume |
|
CPU continuously if it was waiting for I/O and no tasks were scheduled. |
|
|
|
- The 'peak.util.imports.whenImported' function didn't work. |
|
|
|
|
|
|