[spambayes-dev] proposal for more uniform option setting from the command line

Skip Montanaro skip at pobox.com
Wed Nov 12 13:05:21 EST 2003


Our command lines still seem to be a mish mash of little hacks.  Everything
of interest can be set via the INI file, but there are only a few options
which can be set via the command line, and not (I don't believe) in a
consistent way across SB apps.

How about instead of only allowing specific options to be overridden on the
command line we use a consistent syntax for overriding *any* option from the
command line?  For example, to set the ["Storage",
"persistent_storage_file"] we could use something like

    -o Storage:persistent_storage_file:~/.hammiedb

or

    --option=Storage:persistent_storage_file:~/.hammiedb

The general syntax of an option setting command line arg would then be
section:field:value.  The post-getopt.getopt() code might look something
like:

    from spambayes.Options import options

    for opt, arg in opts:
        ...
        elif opt in ('-o', '--option'):
            options.set(*arg.split(':'))
        ...

We would then deprecate any command line args used to twiddle options using
any other syntax.  Use of those args would trigger a message to stderr like:

    Deprecated form: "-d ~/hammie.db" found.
    Use "-o Storage:persistent_storage_file:~/hammie.db" instead.

This could be extended further.  Should the user give an incomplete -o flag
such as "-o Storage" or "-o Storage:spam_cache", help about that section or
variable could be emitted:

    saw_help = False
    for opt, arg in opts:
        ...
        elif opt in ('-o', '--option'):
            # this would probably be folded into an OptionsClass method
            val = arg.split(':')
            if len(val) < 3:
                options.help(sys.stderr, *val)
                saw_help = True
            else:           
                options.set(*arg.split(':'))
        ...
    if saw_help:
        raise SystemExit

where OptionsClass.OptionsClass.help() would look something like:

    def help(self, stream, sect=None, opt=None):
        if sect is None:
            # dump help about all options
        elif opt is None:
            # dump help about sect
        else:
            # dump help about options[sect, opt]

Skip



More information about the spambayes-dev mailing list