Skip to main content

How to use DocOpt to generate Command Line Interface (CLI) tools


DocOpt is library that can generate beautiful command line interfaces using python. It is an alternative to ArgParse/OptParse and makes generating CLI interfaces a breeze.

When generating CLI using ArgParse/OptParse we need to create a hierarchy of modules and submodules and link them together.  This process is tedious and debugging the errors is cumbersome.

Instead, DocOpt parses the docstring (__doc__) of the file and generates a parser automatically. The docstring should be defined based on POSIX command description syntax.

An example:

$fincalc -h
Usage:
fincalc (si|simple-interest) -p <principal> -i <interest> -t <tenure> [--daily] [--plot-graph]
fincalc (fd|fixed-deposit) -p <principal> -i <interest> -t <tenure>  [--plot-graph]
fincalc sip -p <principal> -i <interest> -t <tenure>  [--plot-graph]
fincalc emi -p <principal> -i <interest> -t <tenure>
fincalc cagr -p <principal> -r <returns> -t <tenure>
fincalc -h | --help

Options:
-h --help    Show this screen.
-p --principal   Principal
-i --interest   Interest rate per annum
-t --tenure    Tenure in years
-r --ret --returns  Amount returned after investment

import docopt
opts = docopt.docopt(__doc__)

I have defined a financial calculator which can calculate Simple Interest, Compound Interest, SIP, EMI and CAGR. Lets evaluate the first line:


fincalc (si|simple-interest) -p <principal> -i <interest> -t <tenure> [--daily] [--plot-graph]
* fincalc -- name of the tool
* (si|simple-interest) -- we can use the commands si or simple-interest
* -p <principal> -- parameter p whose values are stored in <principal>
  similarly -i <interest> and -t <tenure> define the interest and tenure parameters
* [--daily]  -- indicates an optional flag called daily
* [--plot-graph] -- defines an optional flag called plot-graph


Lets do a few test runs:


I have included the Github gist with the code I have written to make this tool. Try it out and leave me your feedback.

Note: You need to have the following libraries installed to try out this script:
* docopt : pip install docopt
* matplotlib : pip install matplotlib [optional library if you want to generate a graph]

Comments

Popular posts from this blog

Solved: Fix for Git clone failure due to GnuTLS recv error (-9)

My devstack installation was failing with an error reported by the GnuTLS module as shown below: $ git clone https://github.com/openstack/horizon.git /opt/stack/horizon --branch master Cloning into '/opt/stack/horizon'... remote: Counting objects: 154213, done. remote: Compressing objects: 100% (11/11), done. error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received. fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed The following Git config changes fixed the issue for me. Am hoping it will be useful for someone out there: $ git config http.sslVerify false $ git config --global http.postBuffer 1048576000

QuickBite: Tap Vs Veth

Linux supports virtual networking via various artifacts such as: Soft Switches (Linux Bridge, OpenVSwitch) Virtual Network Adapters (tun, tap, veth and a few more) In this blog, we will look at the virtual network adapters tap and veth. From a practical view point, both seem to be having the same functionality and its a bit confusing as to where to use what. A quick definition of tap/veth is as follows: TAP A TAP is a simulated interface which exists only in the kernel and has no physical component associated with it. It can be viewed as a simple Point-to-Point or Ethernet device, which instead of receiving packets from a physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program. When a user space program (in our case the VM) gets attached to the tap interface it gets hold of a file descriptor, reading from which gives it the data being sent on the tap interface. Writing to the file descri...

[Solved] Fixing ping: ***** : Name or service not known issue

I have a Virtualbox VM running Ubuntu 19.05 Desktop version and the network is managed by NetworkManager. It has two interfaces attached to NAT and HostOnly networks. Due to some reason, I was not able to ping my office site and when I looked up in resolv.conf I see that its a symbolic link auto generated by systemd-resolve. One thing that caught my attention was that the name server was set as below: nameserver 127.0.0.53 The following sequence of steps helped me in resolving this issue: UI NetworkManager --> IPV4 --> Set DNS to Manual and add 1.1.1.1, 8.8.8.8 for dns. Then run the below command sudo dhclient Hope this helps someone out there.