Hey Steve, Thanks for the input!
I think this would fit in with the namespacing ideas (http://code.fabfile.org/issues/show/56), since that's basically what it is -- printing out the "namespace" created by putting tasks into multiple modules. IOW I think this makes more sense as part of the namespace feature than as a standalone thing, which would likely get subsumed into namespacing later anyways. While your patch is concerned with printing out and not accepting task names, the same tactic (taking the existing commands dict and 'processing' it to discover the module each function is in) could be used for both sides of the equation, and it's a different approach from the ones already taken in that ticket. So I think it'd be great to add it to #56 and when I get back into things I'll be able to compare the multiple approaches to see which seems to work best. Thoughts? -Jeff On Sat, Jan 23, 2010 at 8:07 PM, sstein...@gmail.com <sstein...@gmail.com> wrote: > I apologize if this turns out to be a repost -- gmail subscription oddities > today. S > > Hey! > > I was having trouble seeing where things came from in a complex > fabfile/fabkit setup and wrote the following list command to display commands > by module. > > Output looks like this (excuse any mail-induced funkiness, please): > > Available commands: > > fabfile: > install_pido_python_support > base_system_setup Only Needed Once, But Needed! Get all the > pre-requisite... > test Run all unit tests and doctests. > fabkit.cpanel: > restart_mail_servers Gives the mail server a whack by > restarting all of: ima... > fabkit.fab_cfg_install: > install_from_config Install specified packages as per config > file. Default... > fabkit.python: > py_install_basic_tools Installs distribute, pip, and virtualenv. > fabkit.ubuntu: > install_working_toolset RUN FIRST! Installs all compilers, VCS > tools, Python bu... > install_PIL Install PIL without Ubuntu incompatible > extensions > fabkit.utils: > remote_mkdir_p Safely create a directory, including > intermediate dirs ... > run_multiple This chains a bunch of commands with '&&' > so, for examp... > local_mkdir_p > unarchive > url_to_legal_pathname Convert a URL to a legal pathname by > replacing cruft wi... > remove_archive_extensions Strip off all of the compression > extensions until there... > sudocmd A general execute function for running > specified comman... > download_and_unarchive_package > urlparse: > urlparse Parse a URL into 6 components: > > The order the functions come out within each module is controlled by > the order they arrive in the main commands list so it seems somewhat > arbitrary but useful nonetheless. > > If there's any interest, I'll submit a patch. > > What should the command line switch be? --list-by-module would work > for me (with no short command unless we're using argparse, then -lm). > > You can just copy the code below into main.py, and it will replace the > default list_commands with this function. > > Thanks, > > S > > def list_commands_by_module(): > """ > Print all found commands/tasks, BY MODULE then exit. Invoked with -l/--list. > """ > print("Available commands:\n") > # Want separator between name, description to be straight col > cmd_keys = commands.keys() # we need this more than once > > max_len = reduce(lambda a, b: max(a, len(b)), cmd_keys, 0) > sep = ' ' > trail = '...' > modules = {} > for name in cmd_keys: > func = commands[name] > module = func.__module__ > if module in modules: > modules[module].append(func) > else: > modules[module] = [func] > module_names = sorted(modules.keys()) > for module_name in module_names: > print module_name + ':' > # TBD: ? this prints in the order they're found in the commands > # list, not sure how to order it better... > for func in modules[module_name]: > output = None > name = func.func_name > if func.__doc__: > lines = filter(None, func.__doc__.splitlines()) > first_line = lines[0].strip() > # Truncate it if it's longer than N chars > size = 75 - (max_len + len(sep) + len(trail)) > if len(first_line) > size: > first_line = first_line[:size] + trail > # + "\n (%s)"%(func.__module__,) > output = name.ljust(max_len) + sep + ' ' + first_line > # Or nothing (so just the name) > else: > output = name > print(indent(output)) > > sys.exit(0) > > list_commands = list_commands_by_module > > > > > > _______________________________________________ > Fab-user mailing list > Fab-user@nongnu.org > http://lists.nongnu.org/mailman/listinfo/fab-user > -- Jeff Forcier Unix sysadmin; Python/Ruby developer http://bitprophet.org _______________________________________________ Fab-user mailing list Fab-user@nongnu.org http://lists.nongnu.org/mailman/listinfo/fab-user