traitscli 0.1.0
traitscli - CLI generator based on class traits
License: BSD License
Keywords: CLI,traits

Traits CLI - CLI generator based on class traits
================================================

Traits CLI is based on `Enthought's Traits library <traits>`_.

Some benefits:

* Automatically set type (int/float/...) of command line argument.
* Help string generation.
* "Deep value"" configuration:
  e.g., ``--dict['a']['b']['c']=1`` is equivalent to
  ``obj.dict['a']['b']['c'] = 1`` in Python code.
* Nested class configuration:
  e.g., ``--sub.attr=val`` is equivalent to
  ``obj.sub.attr = val`` in Python code.
* Parameter file support (ini/conf, json, yaml, etc.).
  Load parameter from file then set attribute.

.. _traits: https://github.com/enthought/traits


Links
-----

* `Documentaions (at Read the Docs) <http://traits-cli.readthedocs.org/>`_
* `Source code repository (at GitHub) <https://github.com/tkf/traitscli>`_
* `Issue tracker (at GitHub) <https://github.com/tkf/traitscli/issues>`_
* `PyPI <http://pypi.python.org/pypi/traitscli>`_
* `Travis CI <https://travis-ci.org/#!/tkf/traitscli>`_


Installation
------------
::

  pip install traitscli


Dependencies
------------

- traits_
- argparse (for Python < 2.7)


Sample
------


Source code::

  from traitscli import TraitsCLIBase
  from traits.api import Bool, Float, Int, Str, Enum


  class SampleCLI(TraitsCLIBase):

      '''
      Sample CLI using `traitscli`.

      Example::

        %(prog)s --yes                # => obj.yes = True
        %(prog)s --string something   # => obj.string = 'string'
        %(prog)s --choice x           # => raise error (x is not in {a, b, c})

      '''

      # These variables are configurable by command line option
      yes = Bool(desc='yes flag for sample CLI', config=True)
      no = Bool(True, config=True)
      fnum = Float(config=True)
      inum = Int(config=True)
      string = Str(config=True)
      choice = Enum(['a', 'b', 'c'], config=True)

      # You can have "internal" attributes which cannot be set via CLI.
      not_configurable_from_cli = Bool()

      def do_run(self):
          names = self.class_trait_names(config=True)
          width = max(map(len, names))
          for na in names:
              print "{0:{1}} : {2!r}".format(na, width, getattr(self, na))


  if __name__ == '__main__':
      # Run command line interface
      SampleCLI.cli()


Example run::

  $ python sample.py --help
  usage: sample.py [-h] [--choice {a,b,c}] [--fnum FNUM] [--inum INUM] [--no]
                   [--string STRING] [--yes]

  Sample CLI using `traitscli`.

  Example::

    sample.py --yes                # => obj.yes = True
    sample.py --string something   # => obj.string = 'string'
    sample.py --choice x           # => raise error (x is not in {a, b, c})

  optional arguments:
    -h, --help        show this help message and exit
    --choice {a,b,c}  (default: a)
    --fnum FNUM       (default: 0.0)
    --inum INUM       (default: 0)
    --no              (default: True)
    --string STRING   (default: )
    --yes             yes flag for sample CLI (default: False)

  $ python sample.py --yes --choice a
  string : ''
  no     : True
  fnum   : 0.0
  choice : 'a'
  inum   : 0
  yes    : True

  $ python sample.py --inum invalid_argument
  usage: sample.py [-h] [--choice {a,b,c}] [--fnum FNUM] [--inum INUM] [--no]
                   [--string STRING] [--yes]
  sample.py: error: argument --inum: invalid int value: 'invalid_argument'