cliget/cliget.py

64 lines
1.6 KiB
Python

"""Cliget - install cli tools in you user profile
Usage:
cliget [-c URL] list
cliget [-c URL] search PAT
cliget [-c URL] update [--all] [TOOL ...]
list list all installed tools
search search for tools in the catalog with the given pattenr
update list all updatable tools
update TOOL update tools
update --all update all updatable tools
Options:
-h, --help
-c, --catalog URL
"""
from yaml import load, SafeLoader
import semver
from docopt import docopt
from subprocess import run, CalledProcessError, TimeoutExpired
class DotDict(dict):
def __getattr__(self, name):
return self[name] if name in self else None
def loadcatalog(options)->dict:
catalog=options.get('--catalog', 'catalog.yaml')
return load(open(catalog),SafeLoader)
ver = semver.VersionInfo.parse('1.2.3-pre.2+build.4')
#print(ver.major, ver.minor, ver.patch)
_version = lambda cmd: run([cmd, '--version'], input='', text=True, capture_output=True, check=True, timeout=0.1).stdout.split('\n')[0]
def debug(mess):
#print(mess)
pass
def dolist(options):
ctl = loadcatalog(options)
for cli,_ in ctl.items():
# search in path
try:
debug(cli, _version(cli))
except CalledProcessError:
debug(cli, "call error")
except TimeoutExpired:
debug(cli, "timeout")
except FileNotFoundError:
debug(cli, "not found")
if __name__ == '__main__':
options = docopt(__doc__, version='Cliget 0.1.0')
print(options)
options = DotDict(options)
if options.list:
dolist(options)
elif options.search:
dosearch(options)