[Chandler-dev] Restructuring Chandler Quick Entry code

Phillip J. Eby pje at telecommunity.com
Wed Jun 20 14:41:07 PDT 2007


At 09:38 PM 6/19/2007 -0400, Phil Jones wrote:
>Hi,
>
>I'm Phil Jones, Google Summer of Code student, and I am working on 
>restructuring the Chandler quick entry code to be able to more 
>easily add commands and functionality.
>
>There are a couple of different approaches that JeffreyH and I have 
>been discussing, and I am just looking for some feedback.
>
>Also, if anyone has any good reasons why to use one approach over 
>the other, please share your thoughts.
>
>Approach 1:
>Restructure the quick entry commands code into a parcel and 
>persistently install into a known location in Chandler.
>Extending would create a persistent command parcel and hook into 
>this quick entry code.
>Quick entry would iterate through the commands to determine what 
>commands are available.

Have a look at the osaf.startup module for an example of how this can 
be done, using a custom Item type:

http://chandler.osafoundation.org/docs/0.7/running-code-at-startup.html

In the case of osaf.startup, there aren't any keys to the extensions 
(Startup objects), but of course there could be.


>Approach 2:
>Use a standard dictionary that is in a known location in Chandler to 
>add new keys with a callback function.
>Each of these additions can be performed in a parcel, and work 
>similar to the first approach but are not stored using the same 
>persistent mechanism.

If all you need is an ASCII key, and that key doesn't need to contain 
any '=' signs, you can also use entry points:

http://peak.telecommunity.com/DevCenter/setuptools#extensible-applications-and-frameworks
http://peak.telecommunity.com/DevCenter/PkgResources#entry-points

This would work by adding entry_points to a plugin's setup.py:

     setup(
         ...
         entry_points = {'chandler.quick_entry': ['xyz = 
some.module:some_callback']}
     )

An individual plugin (or the main Chandler setup.py) can list as many 
keys as it wants to support.

Then, the lookup code can simply use something like:

     for ep in pkg_resources.iter_entry_points('chandler.quick_entry', key):
         callback = ep.load()
         # do something with callback here
         break  # only call the first callback for this key
     else:
         # no callback found


I would recommend that you either use this approach, or the approach 
of defining a specialized Item class (ala osaf.startup.Startup), 
rather than creating a special dictionary.



More information about the chandler-dev mailing list