tailor.py et chrono.py: améliorer l'affichage de l'aide

This commit is contained in:
Jephté Clain 2017-05-01 13:39:40 +04:00
parent 6f1d5e5947
commit e4b7714799
2 changed files with 82 additions and 17 deletions

View File

@ -273,26 +273,55 @@ def run_chronometre(timeout=None, autostart=False):
Application(timeout, autostart).mainloop() Application(timeout, autostart).mainloop()
if __name__ == '__main__': if __name__ == '__main__':
from argparse import ArgumentParser, RawTextHelpFormatter from argparse import ArgumentParser, HelpFormatter
if sys.argv[1:2] == ['--compat']:
# Avec l'argument --compat, désactiver la classe FancyHelpFormatter qui
# se base sur une API non documentée
sys.argv = sys.argv[0:1] + sys.argv[2:]
FancyHelpFormatter = HelpFormatter
else:
class FancyHelpFormatter(HelpFormatter):
"""Comme HelpFormatter, mais ne touche pas aux lignes qui commencent par les
caractères '>>>'. Cela permet de mixer du texte formaté et du texte non
formaté.
"""
def _fill_text(self, text, width, indent):
return ''.join([indent + line for line in text.splitlines(True)])
def _split_lines(self, text, width):
lines = ['']
for line in text.splitlines():
if line.startswith('>>>'):
lines.append(line)
lines.append('')
else:
lines[-1] += '\n' + line
lines = filter(None, lines)
texts = []
for line in lines:
if line.startswith('>>>'):
texts.append(line[3:])
else:
texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width))
return texts
AP = ArgumentParser( AP = ArgumentParser(
formatter_class=RawTextHelpFormatter,
usage=u"%(prog)s [options] [TIMEOUT]", usage=u"%(prog)s [options] [TIMEOUT]",
description=u"Afficher un chronomètre", description=u"Afficher un chronomètre",
epilog=u"Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement." epilog=u"Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement.",
formatter_class=FancyHelpFormatter,
) )
AP.set_defaults(autostart=None, timeout=None) AP.set_defaults(autostart=None, timeout=None)
AP.add_argument('timeout', metavar='TIMEOUT', nargs='?', AP.add_argument('timeout', metavar='TIMEOUT', nargs='?',
help=u"""\ help=u"""\
(valeur vide) >>> (valeur vide)
chronomètre qui démarre à 0:00 et ne s'arrête pas chronomètre qui démarre à 0:00 et ne s'arrête pas
H:M:S (heures:minutes:secondes) >>> H:M:S (heures:minutes:secondes)
ou M:S (minutes:secondes) >>> ou M:S (minutes:secondes)
ou M (minutes) >>> ou M (minutes)
minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin
du décompte, une sonnerie retentit. du décompte, une sonnerie retentit.
@H[:M[:S]] >>> @H[:M[:S]]
minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure
d'arrivée, et que la durée est calculée automatiquement""") d'arrivée, et que la durée est calculée automatiquement""")
AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false', AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false',
help=u"Ne pas démarrer automatiquement le décompte même si TIMEOUT est spécifié.") help=u"Ne pas démarrer automatiquement le décompte même si TIMEOUT est spécifié.")
AP.add_argument('-s', '--autostart', dest='autostart', action='store_true', AP.add_argument('-s', '--autostart', dest='autostart', action='store_true',

View File

@ -88,22 +88,58 @@ def run_tailor(inputfile=None, follow=False, patterns=None):
sys.stdout.write('\n') sys.stdout.write('\n')
if __name__ == '__main__': if __name__ == '__main__':
from argparse import ArgumentParser from argparse import ArgumentParser, HelpFormatter
if sys.argv[1:2] == ['--compat']:
# Avec l'argument --compat, désactiver la classe FancyHelpFormatter qui
# se base sur une API non documentée
sys.argv = sys.argv[0:1] + sys.argv[2:]
FancyHelpFormatter = HelpFormatter
else:
class FancyHelpFormatter(HelpFormatter):
"""Comme HelpFormatter, mais ne touche pas aux lignes qui commencent par les
caractères '>>>'. Cela permet de mixer du texte formaté et du texte non
formaté.
"""
def _fill_text(self, text, width, indent):
return ''.join([indent + line for line in text.splitlines(True)])
def _split_lines(self, text, width):
lines = ['']
for line in text.splitlines():
if line.startswith('>>>'):
lines.append(line)
lines.append('')
else:
lines[-1] += '\n' + line
lines = filter(None, lines)
texts = []
for line in lines:
if line.startswith('>>>'):
texts.append(line[3:])
else:
texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width))
return texts
AP = ArgumentParser( AP = ArgumentParser(
usage=u"%(prog)s [-f] [INPUTFILE]", usage=u"%(prog)s [-f] [INPUTFILE]",
description=__doc__, description=__doc__,
formatter_class=FancyHelpFormatter,
) )
AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True) AP.set_defaults(inputfile=None, follow=False, patterns=None, defaults=True)
pattern_help = u"""\ pattern_help = u"""\
Ajouter une spécification de pattern et le format dans lequel il doit être affiché. Ajouter une spécification de pattern et le format dans lequel il doit être affiché.
Le format par défaut est red. Le format par défaut est red. Les formats valides sont:
Les formats valides sont: %(formats)s""" % { >>> %(formats)s""" % {
'formats': ', '.join(FORMATS.keys()), '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=pattern_help) help=pattern_help)
default_patterns = [u"%s:%s" % (p or '', f.__name__[:-1]) for (p, f) in DEFAULT_PATTERNS.items()]
no_defaults_help = u"""\
Ne pas ajouter les patterns par défaut. Sans cette option, les patterns par défaut sont:
%(default_patterns)s""" % {
'default_patterns': '\n'.join([u">>> %s" % pattern for pattern in default_patterns]),
}
AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults', AP.add_argument('-z', '--no-defaults', action='store_false', dest='defaults',
help=u"Ne pas ajouter les patterns par défaut") help=no_defaults_help)
AP.add_argument('-f', '--follow', action='store_true', dest='follow', AP.add_argument('-f', '--follow', action='store_true', dest='follow',
help=u"Suivre le contenu du fichier spécifié") help=u"Suivre le contenu du fichier spécifié")
AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?', AP.add_argument('inputfile', metavar='INPUTFILE', nargs='?',