[Distutils] Making commands extensible by default
Toshio Kuratomi
a.badger at gmail.com
Fri Apr 17 00:10:21 CEST 2009
Tarek Ziadé wrote:
> Hello,
>
> This is a side discussion but quiet important ihmo.
>
> == Problem ==
>
> Some people complained about the fact that is was hard to extend
> Distutils commands.
> You end up rewriting the whole command most of the time.
>
> So what's a command ? It's a class that is used by the distribution
> instance when you run Distutils.
>
> roughly:
>
> cmd = Command(distribution)
> cmd.initialize_options()
> cmd.finalize_options() <--- allows to check the options if
> subcommands where run
> cmd.run() <--- runs the code
>
> each command can define sub commands, but most of the time it's a
> harcoded list, so you need to inherit the command
> if you want to add a new behavior.
>
> == work in progress, ==
>
> What we want to do here is being able to define subsets in run(),
> sharing the same options environment.
>
> so basically, a rough, generic run() method could be:
>
> def run():
> for func in some_funcs:
> func(self, options)
>
> If "some_funcs" could be defined by a registery with simple names,
> anyone could provide new functions
> and configure the registery to run a sequence of function.
>
> Given a command name, Distutils can get this list of function, through
> a registery.
> Each function could register itself into Distutils, like in what I
> have started to work here for the manifest file:
> see http://wiki.python.org/moin/Distutils/ManifestPluginSystem
>
> The ordering would be configurable through the setup.cfg file.
>
> Any opinion, idea for this part ?
>
Have you looked at paver? It's syntax makes extension easy.
@task
def run():
function1()
function2()
function3()
or
@task
@needs([function1, function2, function3])
def run():
pass
So if I want to do everything that setuptools.command.install does and
also install locale files using my own function I do:
@task
def install_locales():
# My code to install locales goes here
pass
@task
def install():
# A new install task that overrides the system install task
# Note that I control ordering just by changing the order
# subtasks get called
call_task('setuptools.command.install')
call_task('install_locales')
-Toshio
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/distutils-sig/attachments/20090416/820371e8/attachment.pgp>
More information about the Distutils-SIG
mailing list