view docs/unfreefeatures.rst @ 414:731f2c93c1cd

begin work on v 0.6.3
author Catherine Devlin <catherine.devlin@gmail.com>
date Fri, 12 Nov 2010 20:05:46 -0500
parents f16f444a4d10
children
line wrap: on
line source

======================================
Features requiring application changes
======================================

Multiline commands
==================

Command input may span multiple lines for the
commands whose names are listed in the 
parameter ``app.multilineCommands``.  These
commands will be executed only
after the user has entered a *terminator*.
By default, the command terminators is
``;``; replacing or appending to the list
``app.terminators`` allows different 
terminators.  A blank line
is *always* considered a command terminator
(cannot be overridden).

Parsed statements
=================

``cmd2`` passes ``arg`` to a ``do_`` method (or
``default`) as a ParsedString, a subclass of 
string that includes an attribute ``parsed``.
``parsed`` is a ``pyparsing.ParseResults``
object produced by applying a pyparsing_ 
grammar applied to ``arg``.  It may include:

command
    Name of the command called

raw
    Full input exactly as typed.  

terminator
    Character used to end a multiline command

suffix
    Remnant of input after terminator

::

    def do_parsereport(self, arg):
        self.stdout.write(arg.parsed.dump() + '\n')

::

    (Cmd) parsereport A B /* C */ D; E
    ['parsereport', 'A B  D', ';', 'E']
    - args: A B  D
    - command: parsereport
    - raw: parsereport A B /* C */ D; E
    - statement: ['parsereport', 'A B  D', ';']
        - args: A B  D
        - command: parsereport
        - terminator: ;
    - suffix: E
    - terminator: ;

If ``parsed`` does not contain an attribute,
querying for it will return ``None``.  (This
is a characteristic of ``pyparsing.ParseResults``.)

ParsedString was developed to support sqlpython_
and reflects its needs.  The parsing grammar and
process are painfully complex and should not be
considered stable; future ``cmd2`` releases may
change it somewhat (hopefully reducing complexity).

(Getting ``arg`` as a ``ParsedString`` is 
technically "free", in that it requires no application
changes from the cmd_ standard, but there will 
be no result unless you change your application
to *use* ``arg.parsed``.)

.. _sqlpython: http://pypi.python.org/pypi/sqlpython/

.. _cmd: http://docs.python.org/library/cmd.html#module-cmd

.. _pyparsing: http://pyparsing.wikispaces.com/

Environment parameters
======================

Your application can define user-settable parameters 
which your code can reference.  Create them as class attributes
with their default values, and add them (with optional
documentation) to ``settable``.

::

    from cmd2 import Cmd
    class App(Cmd):
        degrees_c = 22
        sunny = False
        settable = Cmd.settable + '''degrees_c temperature in Celsius
            sunny'''
        def do_sunbathe(self, arg):
            if self.degrees_c < 20:
                result = "It's {temp} C - are you a penguin?".format(temp=self.degrees_c)
            elif not self.sunny:
                result = 'Too dim.'
            else:
                result = 'UV is bad for your skin.'
            self.stdout.write(result + '\n')
    app = App()
    app.cmdloop()

::

    (Cmd) set --long
    degrees_c: 22                  # temperature in Celsius
    sunny: False                   # 
    (Cmd) sunbathe
    Too dim.
    (Cmd) set sunny yes
    sunny - was: False
    now: True
    (Cmd) sunbathe
    UV is bad for your skin.
    (Cmd) set degrees_c 13
    degrees_c - was: 22
    now: 13
    (Cmd) sunbathe
    It's 13 C - are you a penguin?


Commands with flags
===================

All ``do_`` methods are responsible for interpreting
the arguments passed to them.  However, ``cmd2`` lets
a ``do_`` methods accept Unix-style *flags*.  It uses optparse_
to parse the flags, and they work the same way as for
that module.

Flags are defined with the ``options`` decorator, 
which is passed a list of optparse_-style options,
each created with ``make_option``.  The method
should accept a second argument, ``opts``, in
addition to ``args``; the flags will be stripped
from ``args``.

::

    @options([make_option('-p', '--piglatin', action="store_true", help="atinLay"),
        make_option('-s', '--shout', action="store_true", help="N00B EMULATION MODE"),
        make_option('-r', '--repeat', type="int", help="output [n] times")
    ])
    def do_speak(self, arg, opts=None):
        """Repeats what you tell me to."""
        arg = ''.join(arg)
        if opts.piglatin:
            arg = '%s%say' % (arg[1:].rstrip(), arg[0])
        if opts.shout:
            arg = arg.upper()
        repetitions = opts.repeat or 1
        for i in range(min(repetitions, self.maxrepeats)):
            self.stdout.write(arg)
            self.stdout.write('\n')

::

    (Cmd) say goodnight, gracie
    goodnight, gracie
    (Cmd) say -sp goodnight, gracie
    OODNIGHT, GRACIEGAY
    (Cmd) say -r 2 --shout goodnight, gracie
    GOODNIGHT, GRACIE
    GOODNIGHT, GRACIE

``options`` takes an optional additional argument, ``arg_desc``.
If present, ``arg_desc`` will appear in place of ``arg`` in
the option's online help.

::

    @options([make_option('-t', '--train', action='store_true', help='by train')],
             arg_desc='(from city) (to city)')
    def do_travel(self, arg, opts=None):
        'Gets you from (from city) to (to city).'
    

::

    (Cmd) help travel
    Gets you from (from city) to (to city).
    Usage: travel [options] (from-city) (to-city)
        
    Options:
      -h, --help   show this help message and exit
      -t, --train  by train
        
.. _optparse: 

.. _outputters:

poutput, pfeedback, perror
==========================

Standard ``cmd`` applications produce their output with ``self.stdout.write('output')`` (or with ``print``,
but ``print`` decreases output flexibility).  ``cmd2`` applications can use 
``self.poutput('output')``, ``self.pfeedback('message')``, and ``self.perror('errmsg')``
instead.  These methods have these advantages:

- More concise
    - ``.pfeedback()`` destination is controlled by :ref:`quiet` parameter.
    
color
=====

Text output can be colored by wrapping it in the ``colorize`` method.  

.. automethod:: cmd2.Cmd.colorize

.. _quiet:

quiet
=====

Controls whether ``self.pfeedback('message')`` output is suppressed;
useful for non-essential feedback that the user may not always want
to read.  ``quiet`` is only relevant if 
``app.pfeedback`` is sometimes used.

``select``
==========

Presents numbered options to user, as bash ``select``.

``app.select`` is called from within a method (not by the user directly; it is ``app.select``, not ``app.do_select``).

.. automethod:: cmd2.Cmd.select

::
    
    def do_eat(self, arg):
        sauce = self.select('sweet salty', 'Sauce? ')
        result = '{food} with {sauce} sauce, yum!'
        result = result.format(food=arg, sauce=sauce)
        self.stdout.write(result + '\n')
            
::

    (Cmd) eat wheaties
        1. sweet
        2. salty
    Sauce? 2
    wheaties with salty sauce, yum!