|
|
Changed, Enhanced, or Newly Deprecated Features |
Changed, Enhanced, or Newly Deprecated Features |
|
|
|
- The 'referencedType' of a 'model.StructuralFeature' can now be any |
|
'binding.IComponentKey', not just a type or a string. Types are also now |
|
implicitly component keys, which means you can use 'binding.Obtain(SomeType)' |
|
to look up 'SomeType'. (Right now, this is no different than using 'SomeType' |
|
without the 'binding.Obtain()', but in future releases this will use a |
|
"class replacement service" to allow easy replacement of model and other |
|
collaborator classes, while implementing AOP-like features.) |
|
|
|
- Added 'naming.Indirect(key)', a 'binding.IComponentKey' that can be used to |
|
do an indirect lookup via another 'IComponentKey' (such as a name). Using |
|
'naming.Indirect()', you can replace code like this:: |
|
|
|
socket = binding.Obtain( |
|
lambda self: self.lookupComponent(self.socketURL), |
|
adaptTo = [IListeningSocket] |
|
) |
|
|
|
with code like this:: |
|
|
|
socket = binding.Obtain( |
|
naming.Indirect('socketURL'), adaptTo = [IListeningSocket] |
|
) |
|
|
|
- Added 'peak.running.supervisor', a mini-framework for pre-forking, |
|
multiprocess servers, such as for FastCGI. The framework includes a ZConfig |
|
schema for process supervisors, and support for automatically forking new |
|
children (up to a predefined maximum, with a minimum interval between |
|
launches) when a socket has pending connections and all of its child |
|
processes are busy. With this setup, you can take more advantage of |
|
multiprocessor machines for CPU-intensive services. |
|
|
|
- Standardized these characteristics of name and address syntax: |
|
|
|
* '//' at the beginning of URL bodies is *mandatory* when the URL begins |
|
with an "authority" as described by RFC 2396. When the URL is not |
|
required to contain an authority (e.g. 'peak.storage.SQL.GenericSQL_URL'), |
|
the '//' is *optional*, and the canonical form of the URL will not include |
|
it. |
|
|
|
* Standardized names for RFC 2396 fields: 'user', 'passwd', 'host', and |
|
'port'. |
|
|
|
- Added 'peak.metamodels.ASDL', a metamodel for the Zephyr Abstract Syntax |
|
Description Language. ASDL is a convenient way to describe a domain model |
|
for an abstract syntax tree (AST), and the models generated with the new |
|
ASDL tool can be combined with concrete syntax to create a complete parsing |
|
solution for "mini languages", possibly including the Python language |
|
itself. (Future versions of the Python and Jython compilers are likely to |
|
use AST models based on ASDL, and in the current Python CVS sandbox there's |
|
already an ASDL model of Python's AST available.) |
|
|
|
- Enhanced 'fmtparse' and 'peak.model' to allow using types as syntax rules |
|
for parsing, including abstract types. An abstract type's syntax is the |
|
union (using 'fmtparse.Alternatives') of the syntaxes of its subclasses |
|
(as specified by 'mdl_subclassNames'). |
|
|
|
- Added 'IMainLoop.setExitCode()' and 'IMainLoop.childForked()' methods, to |
|
allow reactor-driven components to control the mainloop's exit code. |
|
|
|
- DEPRECATED 'peak.util.signal_stack'. Instead, bind to a |
|
'running.ISignalManager' and use its 'addHandler()/removeHandler()' methods. |
|
This has the same effect as 'pushSignals()' and 'popSignals()', except that |
|
you do not have to remove handlers in the same order as you add them, and |
|
*all* active handlers are invoked for a given signal that they handle. |
|
|
|
- Added 'IBasicReactor.crash()', which forces an immediate reactor loop exit, |
|
ignoring pending scheduled calls. |
|
|
|
- Added 'peak.running.commands.runMain()', a convenience function for starting |
|
an application's "main" command, that also makes it easy for forked child |
|
processes to exit and replace the parent process' "main". The 'peak' script |
|
has now been shortened to:: |
|
|
|
from peak.running import commands |
|
commands.runMain( commands.Bootstrap ) |
|
|
|
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. |
|
|
|
- Added 'peak.util.mockdb', a "mock object" implementation of a DBAPI 2.0 |
|
driver module. 'mockdb' connections can be told to 'expect()' queries |
|
and 'provide()' data to their callers, and will raise AssertionErrors when |
|
they are used in a way that doesn't conform to your supplied expectations. |
|
This is intended to be used for unit testing components that depend on |
|
a database connection: you can verify that they send the right SQL, and |
|
you can provide them with dummy data to use. There is also a 'mockdb:' URL |
|
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, |
|
however, that 'peak.util.mockdb' is a DBAPI 2.0 driver in itself, and thus |
|
can also be used to test DBAPI usage outside of PEAK. |
|
|
|
- SQL connection objects now provide an 'appConfig' attribute that is a |
|
driver-specific 'config.Namespace()'. This allows you to easily set up |
|
configuration properties that are driver-specific. For example, you could |
|
use properties to configure driver-specific SQL snippets, then access them |
|
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 |
|
connection type (e.g. 'pgdb', 'cx_Oracle', etc.). |
|
|
|
- Added 'config.Namespace()' convenience class for redirecting property |
|
lookups from one namespace to another. See the docstring and 'peak.ini' for |
|
usage examples. 'PropertyName.of()' now returns 'Namespace' instances |
|
instead of 'PropertySet' instances. |
|
|
|
- DEPRECATED the 'config.PropertySet' class; please convert to using |
|
'config.Namespace', as it will disappear in the 0.5alpha4 release cycle. |
|
|
|
- SQL connection objects now get their type converters from a distinct |
|
property namespace for each DBAPI driver. For example a driver using the |
|
'cx_Oracle' module will get its type converters from the |
|
'cx_Oracle.sql_types' property namespace, instead of 'peak.sql_types'. For |
|
backward compatibility, these driver-specific namespaces are set up to |
|
fall back to 'peak.sql_types' for their defaults. Type converter |
|
construction has also been improved, to eliminate conversion overhead |
|
completely when no conversions are required for a specific query. Also, |
|
SQL connections now offer a method that will create a row conversion |
|
function for a given result description and optional postprocessing |
|
function. This new method should now be used in place of direct access to |
|
the 'typeMap' attribute of connection objects. |
|
|
|
- Added 'binding.Require', 'binding.Obtain', 'binding.Make', and |
|
'binding.Delegate'. *ALL* other binding types are now DEPRECATED, and will |
|
go away before 0.5 beta is released: |
|
|
|
'requireBinding("info")' -- use 'Require("info")' |
|
|
|
'delegateTo("attr")' -- use 'Delegate("attr")' |
|
|
|
'New(type)' -- use 'Make(type)' |
|
|
|
'New("module.type")' -- use 'Make("module.type")' |
|
|
|
'bindTo(key)' -- use 'Obtain(key)' |
|
|
|
'Constant(value)' -- use 'Make(lambda: value)' |
|
|
|
'Acquire(key)' -- use 'Obtain(key, offerAs=[key])' |
|
|
|
'Copy(value)' -- use 'Make(lambda: <expr to copy value>)' |
|
|
|
'whenAssembled(func)' -- use 'Make(func, uponAssembly=True)' |
|
|
|
'bindSequence(key1,key2,...)' -- use 'Obtain([key1,key,...])' |
|
|
|
'bindToProperty(x,y)' -- use 'Obtain(PropertyName(x),default=y)' |
|
|
|
'bindToParent()' -- use 'Obtain("..")' |
|
|
|
'bindToSelf()' -- use 'Obtain(".")' |
|
|
|
'bindToUtilities()' -- no replacement; let me know if you're using this. |
|
|
|
Note that 'Make' and 'Obtain' also support sequences of recipes and keys, |
|
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, |
|
where 'Once' always required three-argument functions. This should make it |
|
a lot easier to write short binding functions. |
|
|
|
Also, note that the 'activateUponAssembly' keyword is now 'uponAssembly', |
|
and 'isVolatile' is now 'noCache'. (The old names will work as keyword |
|
arguments until the alpha 4 development cycle begins.) The |
|
'binding.IActiveDescriptor' interface also changed as a result of this. |
|
Last, but not least, a 'binding.IRecipe' interface was added, to support the |
|
new 'binding.Make' type. |
|
|
|
|
|
- Added a 'lockName' attribute to 'runnning.AdaptiveTask', and a 'LockURL' |
|
setting to its ZConfig schema. This allows a lockfile URL to be specified |
|
for adaptive tasks that need exclusive access to some resource while |
|
running. |
|
|
|
- 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 |
|
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. |
|
'binding.bindSequence(key1,key2,...)' can now be replaced with |
|
'binding.Obtain([key1,key,...])', and will produce the same results. |
|
|
|
- 'naming.IBasicContext.lookup()' and 'naming.lookup()' now accept a 'default' |
|
argument, similar to that used by 'lookupComponent()' and most other |
|
lookup-like APIs in PEAK. This change was made so that component lookups |
|
don't need to rely on catching 'exceptions.NameNotFound' errors to tell them |
|
when to use the default value. This could hide 'NameNotFound' errors that |
|
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 |
|
control flow and real errors!) |
|
|
|
- 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.Obtain()' (formerly '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. |
|
|
|
- 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, |
- 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 |
and PEAK defines its own built-in section types using this extension |
mechanism. Custom section types must include at least one space, (e.g. |
mechanism. Custom section types must include at least one space, (e.g. |
|
|
Corrected Problems |
Corrected Problems |
|
|
|
- 'peak.running.commands.CGICommand' could become confused on certain BSD |
|
variants (such as Mac OS/X), and assume it was running under FastCGI, even |
|
if it wasn't. (Because the operating systems in question use socket pairs |
|
to implement pipes.) |
|
|
|
- Fixed some problems with the test suite when running under Python 2.3. |
|
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 |
|
messages about ModuleType needing a parameter, and a test failure for |
|
'checkClassInfo' in the 'FrameInfoTest' test class. |
|
|
|
- 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 |
- There was a typo in peak.naming.arithmetic that caused homogeneous non-URL |
name subtraction to fail. |
name subtraction to fail. |
|
|