[Subversion] / PEAK / CHANGES.txt  

Diff of /PEAK/CHANGES.txt

Parent Directory | Revision Log

version 1196, Wed Jun 18 23:39:51 2003 UTC version 1350, Tue Aug 19 23:07:30 2003 UTC
Line 2 
Line 2 
   
  Changed, Enhanced, or Newly Deprecated Features   Changed, Enhanced, or Newly Deprecated Features
   
  - 'peak.naming' no longer automatically converts all addresses to the   - 'naming.IName' is now derived from 'binding.IComponentKey', so names and
    addressed objects.  You must specifically request the interface you want     addresses must now support the 'findComponent()' method.  All PEAK name and
    by adapting the retrieved object to that interface.  This can be done by     address types provide support for this.
    supplying an 'adaptTo=ISomething' keyword argument to the attribute binding  
    definition or your 'lookupComponent()' call.   - The 'lookup()' method of 'binding.IComponentKey' is now called
      'findComponent()', to better distinguish it from 'lookup()' in
    The naming system no longer has 'objectFactories' and 'stateFactories';     'naming.IBasicContext', which does something very different.
    these have been replaced with adaptation.  Writable naming contexts must  
    have a 'serializationProtocol' attribute specifying what interface an object   - 'binding.bindTo()' and 'binding.bindSequence()' now pre-adapt their
    should be adapted to before attempting to store it in that context.     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;     The naming system no longer processes the 'creationName' keyword argument;
    this is now considered the sole responsibility of 'peak.binding'.  The     this is now considered the sole responsibility of 'peak.binding'.  The
Line 20 
Line 124 
    just not available via naming system APIs, and naming contexts no longer     just not available via naming system APIs, and naming contexts no longer
    have to deal with it.     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.
   
    - CGI support has been moved from 'peak.running.zpublish' into
      'peak.running.commands' (for "raw" CGI/FastCGI) and 'peak.web' (for the
      PEAK high-level publishing framework).  You can use 'peak CGI someName' to
      adapt 'someName' to a 'running.IRerunnableCGI' and run it as a CGI/FastCGI.
   
    - There is now a 'peak.security' package, available from 'peak.api' as
      'security'.  It provides permission management functions: you can define
      abstract permissions by subclassing 'security.Permission', then create
      permission checking rules by subclassing 'security.RuleSet', and declare
      the permissions needed to access attributes of a class with
      'security.allow()'.  The test suite demonstrates a complex application
      ruleset with dynamic, data-driven permissions.
   
    - There is now an interface for "Active Descriptors":
      'binding.IActiveDescriptor'.  'peak.binding' now uses this interface to
      identify active descriptors, so you can now create your own.  (Previously,
      'peak.binding' used 'isinstance()' to detect active descriptors.)
   
  - 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
Line 50 
Line 201 
    words, ordinary attributes of a component do not receive "suggested parent"     words, ordinary attributes of a component do not receive "suggested parent"
    notices, even when set via constructor keyword arguments.  If you want an     notices, even when set via constructor keyword arguments.  If you want an
    attribute to do this, you must define the attribute with the binding API;     attribute to do this, you must define the attribute with the binding API;
    e.g. via 'requireBinding()' or 'binding.Constant()'.     e.g. via 'requireBinding()' or 'binding.Constant()'.  If you do *not* want
      a binding to suggest a parent component, use 'suggestParent=False' in the
      binding definition.
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
    Corrected Problems
   
     - 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.
   
   
   


Generate output suitable for use with a patch program
Legend:
Removed from v.1196  
changed lines
  Added in v.1350

cvs-admin@eby-sarna.com

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help