tailor.py: suivre un fichier est optionnel

This commit is contained in:
Jephté Clain 2017-04-12 06:39:48 +04:00
parent 4593ad8f8e
commit bab9c501e5
1 changed files with 37 additions and 21 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""Afficher des lignes en mettant en surbrillance certains patterns""" u"""Afficher les lignes d'un fichier en mettant en surbrillance certains patterns"""
import sys, subprocess, re import sys, subprocess, re
from collections import OrderedDict from collections import OrderedDict
@ -40,14 +40,23 @@ def strip_nl(s):
elif s.endswith("\r"): s = s[:-1] elif s.endswith("\r"): s = s[:-1]
return s return s
def run_tailor(inputfile=None, patterns=None): def run_tailor(inputfile=None, follow=False, patterns=None):
if inputfile is None: if inputfile is None or not follow:
if inputfile is None:
inf = sys.stdin
close = False
else:
inf = open(inputfile, 'rb')
close = True
def next_line(): def next_line():
while True: try:
try: line = sys.stdin.readline() while True:
except: break try: line = inf.readline()
if line == '': break except: break
yield line if line == '': break
yield line
finally:
if close: inf.close()
else: else:
def next_line(): def next_line():
p = subprocess.Popen( p = subprocess.Popen(
@ -79,22 +88,26 @@ def run_tailor(inputfile=None, patterns=None):
sys.stdout.write('\n') sys.stdout.write('\n')
if __name__ == '__main__': if __name__ == '__main__':
from argparse import ArgumentParser, RawTextHelpFormatter from argparse import ArgumentParser
AP = ArgumentParser( AP = ArgumentParser(
formatter_class=RawTextHelpFormatter, usage=u"%(prog)s [-f] [INPUTFILE]",
usage=u"%(prog)s [-f INPUTFILE]",
description=__doc__, description=__doc__,
) )
AP.set_defaults(inputfile=None, patterns=None, defaults=True) AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True)
AP.add_argument('-f', '--follow', dest='inputfile', pattern_help = u"""\
help=u"Spécifier un fichier dont il faut suivre le contenu") Ajouter une spécification de pattern et le format dans lequel il doit être affiché.
Le format par défaut est red.
Les formats valides sont: %(formats)s""" % {
'formats': ', '.join(FORMATS.keys()),
}
AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT', AP.add_argument('-e', '--pattern', action='append', dest='patterns', metavar='PATTERN:FORMAT',
help=u"""\ help=pattern_help)
Ajouter une spécification de pattern et le format dans lequel il doit être affiché AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults',
Les formats valides sont: %s
Le format par défaut est red""" % ', '.join(FORMATS.keys()))
AP.add_argument('-z', '--no-defaults', action='store_const', dest='defaults', const=False,
help=u"Ne pas ajouter les patterns par défaut") help=u"Ne pas ajouter les patterns par défaut")
AP.add_argument('-f', '--follow', action='store_true', dest='follow',
help=u"Suivre le contenu du fichier spécifié")
AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?',
help=u"Fichier qu'il faut afficher ou dont il faut suivre le contenu")
o = AP.parse_args() o = AP.parse_args()
if o.patterns is None: if o.patterns is None:
@ -109,11 +122,14 @@ Le format par défaut est red""" % ', '.join(FORMATS.keys()))
else: else:
p = pf p = pf
of = 'red' of = 'red'
if p == '': p = None
f = of.lower() f = of.lower()
f = FORMAT_ALIASES.get(f, f) f = FORMAT_ALIASES.get(f, f)
if f not in FORMATS: if f not in FORMATS:
raise ValueError("%s: format invalide" % of) raise ValueError("%s: format invalide" % of)
patterns[p] = FORMATS[f] patterns[p] = FORMATS[f]
if o.defaults: patterns.update(DEFAULT_PATTERNS) if o.defaults:
for p, f in DEFAULT_PATTERNS.items():
patterns.setdefault(p, f)
run_tailor(o.inputfile, patterns) run_tailor(o.inputfile, o.follow, patterns)