Fixes and Enhancements since Version 0.5 alpha 3 |
Fixes and Enhancements since Version 0.5 alpha 3 |
|
|
- 'config.fileNearModule()' is DEPRECATED, in favor of 'config.packageFile()'. |
- Changed 'running.lookupCommand()' to use the command's 'getCommandParent()' |
The latter returns a 'naming.IStreamFactory', which is more suitable for |
method, so that commands using the '--config' option will utilize the |
working with e.g. module data files compressed in a zipfile. Uses of |
specified configuration(s) to lookup subcommands. |
'fileNearModule()' that were being passed to 'config.loadConfigFile()' can |
|
be safely changed to 'config.packageFile()' without needing any other code |
- Added a '-c/--config' option to PEAK bootstrap commands to load an .ini |
changes, but if you were directly using 'fileNearModule()' as a filename, |
configuration file in a new service area before executing any subcommands. |
you will need to rewrite appropriately. |
|
|
This allows you to do things like:: |
- 'config.loadConfigFile()' and 'config.loadConfigFiles()' now accept URLs, |
|
'naming.IStreamFactory' objects, and 'config.IStreamSource' objects as well |
peak launch -c bulletins ref:sitemap@sitemap.xml |
as filenames. This was primarily added to support use of |
|
'config.packageFile()' or 'pkgfile:' URLs, in place of using |
which loads the 'bulletins' configuration file before launching the sitemap. |
'config.fileNearModule()'. |
Note that if you are subclassing 'commands.Bootstrap' you can suppress this |
|
option using 'options.reject_inheritance("-c","--config")' in the body of |
- There is a new 'config.IStreamSource' protocol, to make it easy to accept |
your subclass' class definition. You may wish to do this if your |
URLs, filenames, or 'naming.IStreamFactory' objects as the source of a |
application's subcommands must run in the same service area as the parent |
"file". |
command. (E.g. if the parent command expects the subcommand to partake in |
|
a transaction controlled by the parent command.) |
|
|
|
- Added a 'value' property to 'model.Enumeration', so that you can access |
|
an enumeration instance's value (i.e., the value it hashes and compares |
|
equal to) |
|
|
|
- Added a 'binding.hasParent(component,parent)' API function, which is |
|
specially optimized for use with generic functions, so that you can |
|
define generic function methods that apply only within some part of a |
|
component hierarchy. |
|
|
|
- PEAK no longer supports Python 2.2; Python 2.3.4 or better is required. |
|
|
|
- The kjbuckets extension module is no longer built and installed by default; |
|
you must explicitly enable it with a '--with-kjbuckets' flag passed to |
|
'setup.py'. Please port your code as soon as practical, this option will |
|
go away soon. |
|
|
|
- Use of the included 'kjbuckets' module is now DEPRECATED, due to increasing |
|
bitrot. Aaron Watters originally wrote this extension for Python 1.2, and |
|
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 |
|
the 'kjGraph' type, use the new 'Graph' type in 'peak.util.Graph'. Some |
|
porting effort may be required, as these types are not precisely the same |
|
in signature as the originals. |
|
|
|
- The '_setNS()' method of the 'peak.util.SOX.ISOXNode_NS' interface has |
|
changed signature, due to a lack of use of the second argument in the code |
|
base, and its dependency on 'kjbuckets'. |
|
|
|
- The old 'peak.security' implementation has been removed, and replaced with |
|
a simpler, more flexible implementation based on generic functions (using |
|
less than half the code and seven fewer interfaces). Complete documentation |
|
and API tests for the new implementation can be found in 'rules.txt' in the |
|
'peak.security' package directory. |
|
|
|
Also, the new implemetation does not require redundant |
|
'security.allow(security.Anybody)' declarations just because you've declared |
|
other permissions for a class, so these declarations have been removed from |
|
``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 |
|
of the deprecated 'security.allow()'. |
|
|
|
- 'security.allow()' is now DEPRECATED; please use 'binding.metadata()' |
|
instead. (There is no change to the calling signature, but |
|
'binding.metadata' accepts any metadata, not just permissions.) |
|
|
|
- Added 'peak.running.options', a new option-parsing framework that extends |
|
'optparse' to support the PEAK 'commands' framework. Command instances |
|
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 |
|
their raw arguments from 'self.argv'. See 'options.txt' in the |
|
'peak.running' package directory for a complete tutorial. |
|
|
|
- There is now a 'binding.initAttrs()' function that can be used to initialize |
|
an object's attributes from e.g. constructor keyword arguments, similar to |
|
how 'binding.Component' and 'binding.Attribute' constructors work. |
|
|
|
- Security permissions can now be declared as attribute metadata. |
|
|
|
That is, instead of doing declarations like this:: |
|
|
|
class Foo: |
|
bar = binding.Require("Something", permissionNeeded=SomePerm) |
|
|
|
class AnElement(model.Element): |
|
class someFeature(model.Attribute): |
|
permissionNeeded = SomePerm |
|
|
|
you can (and should) now do them like this:: |
|
|
|
class Foo: |
|
bar = binding.Require("Something", [SomePerm]) |
|
|
|
class AnElement(model.Element): |
|
class someFeature(model.Attribute): |
|
metadata = [SomePerm] |
|
|
|
or this:: |
|
|
|
class Foo: |
|
binding.metadata(bar = [SomePerm]) |
|
|
|
class AnElement(model.Element): |
|
|
|
binding.metadata(someFeature = [SomePerm]) |
|
|
|
class someFeature(model.Attribute): |
|
# ... |
|
|
|
It isn't necessary to enclose metadata in brackets, but it helps to |
|
emphasize its annotational nature. Also note that e.g. 'web.bindResource()' |
|
needs 'metadata' to be a keyword argument. |
|
|
|
- The 'permissionNeeded' attribute of 'model.Feature' and 'binding.Attribute' |
|
objects is now DEPRECATED. See examples above for how to upgrade, and please |
|
switch to using metadata as soon as practical. In addition the |
|
'security.IGuardedDescriptor' interface has been removed, because it was |
|
only used in connection with the 'permissionNeeded' attribute mechanism. |
|
|
|
- Added a new "attribute metadata" mini-framework to 'peak.binding'. This |
|
framework makes it possible to declare arbitrary metadata about attributes, |
|
using either a class advisor ('binding.metadata()', similar in form and |
|
function to the existing 'security.allow()') or using a 'metadata' attribute |
|
of attribute bindings (which is the second positional parameter in all |
|
the standard bindings like 'Make', 'Obtain', etc.). Over time, existing |
|
metadata mechanisms will be refactored to use this new mini-framework, |
|
instead of the various integrated ad-hoc mechanisms that exist now (like |
|
the 'permissionNeeded' attribute). For more information on how the new |
|
metadata hooks work, including doctest examples, see the 'attributes.txt' |
|
file in the 'peak.binding' package, under the heading "Attribute Metadata". |
|
|
|
- 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 |
|
subclassing a PEAK base class or using a PEAK metaclass. In future, this |
|
will be integrated into PEAK attribute descriptors such that defining a |
|
descriptor within a class' body is sufficient to cause this function to be |
|
invoked. |
|
|
|
- 'binding.IBindingNode' was REMOVED, consolidated into 'binding.IComponent', |
|
as its various individual methods have been replaced with generic functions |
|
in the existing 'binding' API. For example, 'binding.getParentComponent(x)' |
|
should be used in preference to 'x.getParentComponent()' unless it is |
|
a requirement that 'x' implement the full 'binding.IComponent' interface. |
|
This makes it easier to define what 'binding.getParentComponent()' and |
|
'binding.getComponentName()' will mean for non-component types, as you do |
|
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 |
|
properly implement the full 'IBindingNode' interface anyway. |
|
|
|
In addition, 'binding.suggestParentComponent()' is now also a generic |
|
function, dispatching on the target (i.e. child) object. |
|
|
|
- 'naming.IReferenceable' was REMOVED, as it is not in use anywhere in PEAK. |
|
This will be replaced with a generic function when we do actually need this |
|
functionality. |
|
|
|
- There is a new 'config.getStreamFactory' generic function, to make it easy |
|
to accept URLs, filenames, or 'naming.IStreamFactory' objects as the source |
|
of a "file". |
|
|
Its typical usage is just:: |
Its typical usage is just:: |
|
|
factory = config.IStreamSource(data).getFactory(self) |
factory = config.getStreamFactory(self,source) |
stream = factory.open('t') # open for reading in text mode |
stream = factory.open('t') # open for reading in text mode |
|
|
where 'data' is a string or a 'naming.IStreamFactory', and 'self' is a |
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 |
component to be used as lookup context. The returned 'factory' is a |
'naming.IStreamFactory' that can then be '.open()'-ed for reading, or used |
'naming.IStreamFactory' that can then be '.open()'-ed for reading, or used |
in other ways as needed. |
in other ways as needed. |
|
|
|
If you have special objects that you'd like to be able to treat as stream |
|
sources, you can register them by defining an extension, e.g.:: |
|
|
|
[config.getStreamFactory.when(MyType)] |
|
def getStreamFactory(context,source): |
|
"""Return a naming.IStreamFactory for 'source' (a 'MyType' instance)""" |
|
|
Wherever practical, as we encounter them, we'll be changing PEAK API's that |
Wherever practical, as we encounter them, we'll be changing PEAK API's that |
take filenames to also accept stream sources. |
take filenames to also accept stream sources. |
|
|
|
- Added an optional 'base' argument to 'naming.parseURL()', to allow parsing |
|
URLs relative to a base URL. For a URL scheme to support this, it must |
|
implement the new 'naming.IBaseURL' interface. See the |
|
'peak.naming.factories.openable' module for example implementations. |
|
|
|
- Added a 'data:' URL scheme, implementing RFC 2397 (although it's not as |
|
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, |
|
since a 'data:' URL can be a 'config.getStreamFactory()' source. |
|
|
|
- Added 'config.processXML()', a function that provides a high-level, |
|
configuration-driven interface to 'peak.util.SOX.NegotiatingParser'. This |
|
simple front-end lets you supply as little as a configuration context and |
|
a stream source, to do XML processing of arbitrary complexity, controlled by |
|
the configuration of the context. |
|
|
|
- Added 'config.XMLKey()', an 'IConfigKey' type that can be used to register |
|
configuration values for XML attribute and element names under specified |
|
XML namespace URI's. Also, there are now '[XML Attributes for nsuri]' and |
|
'[XML Elements for nsuri]' section types available for use in .ini files. |
|
(Replace 'nsuri' with the appropriate XML namespace URI, or use '*' for a |
|
wildcard.) |
|
|
|
- 'web.IResource' is gone, replaced by 'web.IPlace'. The notion of a place is |
|
broader than the notion of a resource, and we will soon need to have |
|
other "location" objects that implement 'IPlace'. |
|
|
|
- In order to support obtaining the line and column locations of problems in |
|
XML files, we are now using Python 2.4's version of the 'pyexpat' module, |
|
built as 'peak.util.pyexpat'. |
|
|
|
- There's a new class, 'config.IniLoader', that can be used to lazily load |
|
.ini files as configuration. 'IniLoader' instances have an 'iniFiles' |
|
attribute that lists the configuration sources (filenames/URLs/factories) |
|
to be used, and automatically load the .ini files as soon as you try to get |
|
any configuration data for them. Previously, similar functionality was only |
|
available via 'config.makeRoot()'. |
|
|
|
Also, there's now an 'ini' reference type that instantiates an 'IniLoader' |
|
for one or more addresses. You can use it like this:: |
|
|
|
[Named Services] |
|
|
|
some.example = naming.Reference('ini', |
|
['pkgfile:peak/peak.ini', '/etc/something.ini'] |
|
) |
|
|
|
another.example = naming.LinkRef( |
|
'ref:ini@pkgfile:peak/peak.ini||/etc/something.ini' |
|
) |
|
|
|
The two examples above will each load the same pair of specified .ini files. |
|
You can also directly instantiate an 'IniLoader', as in:: |
|
|
|
cfg = config.IniLoader(self, iniFiles=['pkgfile:peak/peak.ini']) |
|
|
|
Attempting to look up any configuration properties via the 'cfg' object |
|
will cause it to load the specified .ini file. |
|
|
|
- 'config.fileNearModule()' is DEPRECATED, in favor of 'config.packageFile()'. |
|
The latter returns a 'naming.IStreamFactory', which is more suitable for |
|
working with e.g. module data files compressed in a zipfile. Uses of |
|
'fileNearModule()' that were being passed to 'config.loadConfigFile()' can |
|
be safely changed to 'config.packageFile()' without needing any other code |
|
changes, but if you were directly using 'fileNearModule()' as a filename, |
|
you will need to rewrite appropriately. |
|
|
|
- 'config.loadConfigFile()' and 'config.loadConfigFiles()' now accept URLs, |
|
'naming.IStreamFactory' objects, and other 'config.getStreamFactory()' |
|
targets as well as filenames. This was primarily added to support use of |
|
'config.packageFile()' or 'pkgfile:' URLs, in place of using |
|
'config.fileNearModule()'. |
|
|
- The 'naming.IStreamFactory' interface now has an 'address' attribute, which |
- The 'naming.IStreamFactory' interface now has an 'address' attribute, which |
is the string form of the canonical URL of the target stream. This was |
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 |
added to make it easier to e.g. report errors in a stream that's being |