Acute 0.2.2 – Integrate Help Commands to Single Interface – pydoc3, puppet describe and man in GoldenDict

Access all documentation commands and dictionaries trough a single interface.

Acute(1) suppresses output if it’s just “documentation not found”, so your interface stays clean.

With GoldenDict and acute, you can see real time queries to help commands along offline programmer’s dictionaries and regular dictionaries.

By using ‘grep’ as a command, you can quickly add any one-thing-per-line as a dictionary.

Configure GoldenDict

Save acute to a text file, give execute permission and copy it to /usr/local/bin/acute. You can find acute source code at the end of the page.

$ nano acute  # copy-paste, ctrl-X y enter
$ chmod ugo+x acute
$ sudo cp acute /usr/local/bin/acute

Add commands to GoldenDict. Here are some examples for Python 3, manual pages and Puppet.

In GoldenDict: Edit: Dictionaries: Programs

acute -d -f "^No Python documentation " pydoc3 "%GDWORD%"
acute puppet help "%GDWORD%"
acute -f "^Unknown type" puppet describe "%GDWORD%"
acute man "%GDWORD%"
acute apt-cache show "%GDWORD%"
acute grep -C 2 "%GDWORD%" /home/tero/botbook-commands.txt

Acute 0.2.2 – run command, discard output if it fails

Yes, you can almost nail it in a one-liner. Almost. After edge cases, help, proper argument parsing… it’s a program.

#!/usr/bin/python3
"""acute - run command, discard output if it fails

Copyright 2017 Tero Karvinen http://TeroKarvinen.com GPL 3 or later

Use for querying multiple external sources, without error messages
cluttering output. For example, GoldenDict: Dictionaries: Programs.

Examples:

$ acute -d man bash		# prints manpage of bash

This prints nothing:
$ acute -v --fail-string '^No Python documentation found' pydoc3 asdf

This prints Python documentation for re.sub:
$ acute -v --fail-string '^No Python documentation found' pydoc3 re.sub

More examples:
$ acute -d -f '^Unknown type' puppet describe file
"""
__copyright__ = "Copyright 2017 Tero Karvinen http://TeroKarvinen.com"
__license__ = "GNU General Public License, version 3 or later"
__version__ = "0.2.2"

import argparse
import textwrap
from logging import basicConfig, info, debug, warning, error, INFO, DEBUG, WARNING
import subprocess
import os
import sys
import re

def parseArgs():
	parser = argparse.ArgumentParser(fromfile_prefix_chars="@",
		description=__doc__, epilog="acute "+__version__+"\n"+__copyright__,
		formatter_class=argparse.RawTextHelpFormatter)

	parser.add_argument("command", nargs=argparse.REMAINDER)
	parser.add_argument("-f", "--fail-string",
		help="Discard output and consider command failed if output\n"
			"contains FAIL_STRING. Regular expressions allowed, and \n"
			"it's commont to start with line start mark '^'. ")

	parser.add_argument("-v", "--verbose", action="store_const",
		dest="log_level", const=INFO, default=WARNING)
	parser.add_argument("-d", "--debug", action="store_const",
		dest="log_level", const=DEBUG)
	args = parser.parse_args()
	args.command = " ".join(args.command)
	if "" == args.command:
		parser.error("External command can't be empty.")
	return args

def main():
	args = parseArgs()
	logformat = "%(funcName)s():%(lineno)i: %(message)s %(levelname)s"
	basicConfig(level=args.log_level, format=logformat)

	info("Running: '%s'", args.command)
	(status, out) = subprocess.getstatusoutput(args.command)

	debug("Status: %i, Output start: %s" % (status, out[:20].replace('\n', '\\n')))

	if status != os.EX_OK:
		info("Failed status returned by external command. Exiting...")
		sys.exit()
	if args.fail_string and re.match(args.fail_string, out):
		info("Fail string in command output. Exiting...")
		sys.exit()

	try:
		print(out)
	except (BrokenPipeError):
		info("Broken pipe caused error to acute, e.g. 'head' terminated reading of output. ")
	except (IOError):
		info("External command '%s' had IO error because of broken pipe, e.g. 'head'. ", args.command)

	debug("Done.")

if __name__ == "__main__":
	main()
Posted in Uncategorized | Leave a comment

Leave a Reply

Your email address will not be published. Required fields are marked *

*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  • Picks

  • Boxing Clock for AndroidOcton8 Diving T-ShirtsShaking Tower Panda Android GameLearn Chinese with Android
  • Student projects