Clom is a Python Command Line Object Mapper. It's intended to make generating commands and escaping arguments
easier for command line interaction. It's particularly useful when used with Fabric or subprocess
.
Install with pip
or easy_install
.
pip install clom
Import:
>>> from clom import clom
Build a command:
>>> clom.echo("Don't test me") "echo 'Don'\\''t test me'"
Augment with arguments:
>>> clom.ls.with_opts('-a', '-t', l=True).with_args('~/') "ls -a -t -l '~/'" >>> clom.curl('http://dev.host', X='POST', data='message=hello') 'curl -X POST --data=message=hello http://dev.host'
Use sub commands:
>>> clom.git.checkout('mybranch') 'git checkout mybranch'
Execute with ease:
>>> clom.seq(5).shell.all() ['1', '2', '3', '4', '5'] >>> clom.seq.shell('5').first() '1'
Iterate over results:
>>> for i in clom.seq(3).shell(): ... print(i) ... 1 2 3
Handle errors:
>>> clom.touch('/not/a/thing').shell() # doctest:+IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... CommandError: Error while executing "touch /not/a/thing" (1): touch: cannot touch ‘/not/a/thing’: No such file or directory
Group commands:
>>> from clom import AND, OR >>> OR(clom.vagrant.up, clom.echo('Vagrant up failed')) "( vagrant up || echo 'Vagrant up failed' )" >>> OR(clom.vagrant.up, clom.echo('Vagrant up failed')).shell() <CommandResult return_code=0, stdout=18 bytes, stderr=... bytes> >>> print(OR(clom.false, clom.echo('Vagrant up failed')).shell()) Vagrant up failed
Re-use commands:
>>> echo = clom.echo >>> echo.one.two 'echo one two' >>> echo.three.four.shell.all() ['three four'] >>> echo.foo.bar.shell.all() ['foo bar']
Background tasks:
>>> clom.VBoxHeadless.with_opts(startvm="Windows Base").background() "nohup VBoxHeadless --startvm='Windows Base' &> /dev/null &" >>> clom.VBoxHeadless.with_opts(startvm="Windows Base").background().shell() <CommandResult return_code=0, stdout=0 bytes, stderr=0 bytes>
Works great with fabric:
>>> from fabric.api import run, local # doctest: +SKIP >>> local(clom.ls) # doctest: +SKIP [localhost] local: ls clom clom.egg-info docs nohup.out tests ''
Can even create fab commands:
>>> clom.fab.test('doctest', 'unit').deploy('dev') 'fab test:doctest,unit deploy:dev' >>> clom.fab.with_opts('-a', hosts='dev.host').deploy.with_args('dev','test') 'fab -a --hosts=dev.host deploy:dev,test'
See more examples and the API in the Clom Documentation
Test are run using pytest:
pip install pytest
./runtests -v