README
author Alexander Solovyov <piranha@piranha.org.ua>
Mon, 13 Jul 2009 00:48:07 +0300 (2009-07-12)
changeset 30 1fc9a029d760
parent 28 1a90a706e10d
child 33 e82b3f5c36d9
permissions -rw-r--r--
refactoring of api and internals to be more consistent
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     1
.. -*- mode: rst -*-
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     2
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     3
==========
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     4
 Fancycmd
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     5
==========
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     6
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     7
Fancycmd is a command line parser, indented to make writing command line
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     8
applications easy and painless. It uses built-in Python types (lists,
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
     9
dictionaries, etc) to define options (or subcommands in case you need them),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    10
which makes configuration clear and concise.
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    11
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    12
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    13
Options
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    14
-------
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    15
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    16
Configuration of option parser is a list of tuples::
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    17
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    18
    opts = [('l', 'listen', 'localhost', 'ip to listen on'),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    19
            ('p', 'port', 8000, 'port to listen on'),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    20
            ('d', 'daemonize', False, 'daemonize process'),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    21
            ('', 'pid-file', '', 'name of file to write process ID to')]
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    22
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    23
Each tuple is a definition of some option, consisting of 4 elements:
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    24
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    25
 1. short name
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    26
 2. long name
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    27
 3. default value
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    28
 4. help string
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    29
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    30
If a short name renders to False (for example, empty string), then it's not used
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    31
at all. Long name is pretended to be available in any case. Default value also
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    32
determines how supplied argument should be parsed:
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    33
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    34
 - function: return value of function called with a specified value is passed
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    35
 - integer: value is convert to integer
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    36
 - string: value is passed as is
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    37
 - list: value is appended to this list
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    38
 - boolean/None: ``not default`` is passed and option takes no argument
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    39
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    40
Usage is easy like that::
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    41
27
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    42
    from fancycmd import fancyopts
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    43
    def main(dirname, **opts):
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    44
        '''write some help here'''
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    45
        pass
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    46
    parser = fancyopts(main, opts, usage='%s [-l HOST] DIR' % sys.argv[0])
3908a489c02e examples in help
Alexander Solovyov <piranha@piranha.org.ua>
parents: 22
diff changeset
    47
    parser(sys.argv[1:])
22
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    48
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    49
Subcommands
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    50
-----------
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    51
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    52
It's pretty usual for complex application to have some system of subcommands,
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    53
and fancycmd provides facility for handling them. Configuration is simple as
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    54
well::
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    55
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    56
    cmdtable = {
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    57
        '^simple':
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    58
            (simple,
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    59
             [('t', 'test', False, 'just test execution')],
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    60
             '[-t] ...'),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    61
        'complex|hard':
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    62
            (complex_,
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    63
             [('p', 'pass', False, 'don\'t run the command'),
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    64
              ('', 'exit', 0, 'exit with supplied code (default: 0)')],
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    65
             '[-p] [--exit value] ...')}
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    66
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    67
Keys in this dictionary are subcommand names. You can add aliases for
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    68
subcommands, separating them with the ``|`` sign (of course, there can be few
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    69
aliases). Marking command with preceding ``^`` means that this commands should
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    70
be included in short help (more on that later).
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    71
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    72
Values here are tuples, consisting of 3 elements:
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    73
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    74
 1. function, which will handle this subcommand
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    75
 2. list of options
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    76
 3. usage string (used by help generator)
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    77
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    78
Your application will also always have ``help`` command, when it uses subcommand
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    79
system.
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    80
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    81
You can define your functions for subcommands like this::
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    82
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    83
    def simple(ui, *args, **opts):
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    84
        '''some descriptive text here
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    85
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    86
        more help, I'd said a lot of help here ;-)
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    87
        '''
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    88
        pass
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    89
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    90
Naturally ``args`` is a list, containing all arguments to command, and ``opts``
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    91
is a dictionary, containing every option. ``ui`` is an UI_ instance.
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    92
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    93
Usage::
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    94
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    95
   describe api here
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    96
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    97
UI
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    98
--
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
    99
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   100
``UI`` is a special object intended to ease output handling in your
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   101
application. There are two global options added, which are used by this object:
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   102
``-v/--verbose`` and ``-q/--quiet``. And then you are encouraged to use ``UI``
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   103
instance to output instead of directly printing messages, which is possible by
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   104
using one of following methods:
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   105
28
1a90a706e10d better name for ui status method
Alexander Solovyov <piranha@piranha.org.ua>
parents: 27
diff changeset
   106
  - ``UI.info`` prints by default, but hides output with quiet option
22
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   107
  - ``UI.note`` prints only if verbose option supplied
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   108
  - ``UI.write`` prints in any case
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   109
  - ``UI.warn`` prints to stderr (in any case)
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   110
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   111
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   112
Help generation
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   113
---------------
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   114
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   115
Help is generated automatically and is available by the ``--help`` command line
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   116
option or by ``help`` subcommand (if you're using subcommand system).
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   117
8e56f2a8b90a initial version of readme
Alexander Solovyov <piranha@piranha.org.ua>
parents:
diff changeset
   118
Help is wrapped to length of 70 characters.