How do I subclass pyCLI's cli.app.CommandLineApp?

The documentation is really vague about subclassing the CommandLineApp, only mentioning one example:

class YourApp(cli.app.CommandLineApp):
    def main(self):
        do_stuff()

So with the information I've found I've pieced together this code:

#!/usr/bin/env python

import os
import sys
from cli.app import CommandLineApp

# Append the parent folder to the python path
sys.path.append(os.path.join(os.path.dirname(__file__), '../'))

import tabulardata
from addrtools import extract_address

class SplitAddressApp(CommandLineApp):
    def main(self):
        """
        Split an address from one column to separate columns.
        """

        table = tabulardata.from_file(self.params.file)

        def for_each_row(i, item):
            addr = extract_address(item['Address'])
            print '%-3d %-75s %s' % (i, item['Address'], repr(addr))

        table.each(for_each_row)

    def setup(self):
        self.add_param('file', metavar='FILE', help='The data file.')
        self.add_param(
            'cols', metavar='ADDRESS_COLUMN', nargs='+',
            help='The name of the address column. If multiple names are ' + \
                 'passed, each column will be checked for an address in order'
        )

if __name__ == '__main__':
    SplitAddressApp().run()

Which seems correct to me. The documentation gives no examples on how to handle the setup method or running the application when using subclassing. I get the error:

Traceback (most recent call last):
  File "bin/split_address_column", line 36, in 
    SplitAddressApp().run()
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 440, in __init__
    Application.__init__(self, main, **kwargs)
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 129, in __init__
    self.setup()
  File "bin/split_address_column", line 28, in setup
    self.add_param('file', metavar='FILE', help='The data file.')
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 385, in add_param
    action = self.argparser.add_argument(*args, **kwargs)
AttributeError: 'SplitAddressApp' object has no attribute 'argparser'

So presumably I'm doing something wrong, but what?

Answers


I figured it out. Reading the source of pyCLI it turns out that the setup function is quite important for the functionality of the whole library, while I thought it was just a function where I could put my setup code. argparser is created in cli.app.CommandLineApp.setup which means I at least have to call

cli.app.CommandLineApp.setup(self)

inside the setup function for it to even work. And now the code works perfectly!


Need Your Help

What are some good SSH Servers for windows?

windows deployment ssh winscp

Trying to setup an SSH server on Windows Server 2003. What are some good ones? Preferably open source. I plan on using WinSCP as a client so a server which supports the advanced features implemente...

numpy nonzero() returns indexes sorted by row index?

python arrays numpy scipy

As in Matlab, the nonzeros return the indexes ordered by columns(http://www.mathworks.com/help/matlab/ref/nonzeros.html). In Numpy, it seems the returned indexes are ordered by rows (for 2d matrix)...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.