diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2014-05-19 19:12:50 +0200 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2014-05-19 19:12:50 +0200 |
commit | 0bd38b14b668bff168aeac3cc6c90e2c7ced8c92 (patch) | |
tree | 9a391b08e50aea9643ffca5c9503116d0773b856 /utils_prog.py | |
parent | 5bf6a22f94302070fdae0335aeb30eee1a8cc495 (diff) | |
download | clufter-0bd38b14b668bff168aeac3cc6c90e2c7ced8c92.tar.gz clufter-0bd38b14b668bff168aeac3cc6c90e2c7ced8c92.tar.xz clufter-0bd38b14b668bff168aeac3cc6c90e2c7ced8c92.zip |
utils_prog: new program-specific unit incl. some moves from utils
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'utils_prog.py')
-rw-r--r-- | utils_prog.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/utils_prog.py b/utils_prog.py new file mode 100644 index 0000000..591ebae --- /dev/null +++ b/utils_prog.py @@ -0,0 +1,80 @@ +# -*- coding: UTF-8 -*- +# Copyright 2014 Red Hat, Inc. +# Part of clufter project +# Licensed under GPLv2+ (a copy included | http://gnu.org/licenses/gpl-2.0.txt) +"""Program-specific commons""" +__author__ = "Jan Pokorný <jpokorny @at@ Red Hat .dot. com>" + +import logging +from optparse import make_option +from os import environ, path, pathsep +from subprocess import Popen +from sys import stderr, stdin + +from .error import ClufterError + + +# +# command-line options related +# + +# dashes recommended by 5 of 4 terminal fanboys +# NB underscores -> dashes swap is idempotent in regards to the member +# name of where optparse stores respective option value, but here +# the list of possible operations to preserve such property stops! +# + also to preserve reversibility/bijection, original ought to be +# free of the substituting character +cli_decor = lambda x: x.replace('_', '-') +cli_undecor = lambda x: x.replace('-', '_') + +# prioritize consonants, deprioritize vowels (except for the first letter +# overall), which seems to be widely adopted technique for selecting short +# options based on their long counterparts ;) +# XXX could eventually also resort to using upper-case chars +longopt_letters_reprio = \ + lambda longopt: \ + (lambda lo: \ + lo[0] + ''.join(sorted(lo[1:], + key=lambda x: int(x.lower() in 'aeiouy'))) + )(filter(lambda c: c.isalpha(), longopt)) + +# extrapolate optparse.make_option to specifically-encoded "plural" +make_options = lambda opt_decl: [make_option(*a, **kw) for a, kw in opt_decl] + + +class OneoffWrappedStdinPopen(object): + """Singleton to watch for atmost one use of stdin in Popen context""" + def __init__(self): + self._used = False + + def __call__(self, args, **kwargs): + if not 'stdin' in kwargs and '-' in args: + if self._used: + raise ClufterError(self, 'repeated use detected') + kwargs['stdin'] = stdin + # only the first '-' substituted + args[args.index('-')] = '/dev/stdin' + self._used |= True + return Popen(args, **kwargs) + +OneoffWrappedStdinPopen = OneoffWrappedStdinPopen() + + +# +# misc +# + +def which(name, *where): + """Mimic `which' UNIX utility""" + where = tuple(path.abspath(i) for i in where) + if 'PATH' in environ: + use_path = tuple(i for i in environ['PATH'].split(pathsep) + if len(i.strip())) + else: + use_path = () + for p in where + use_path: + check = path.join(p, name) + if path.exists(check): + return check + else: + return None |