tailor.py et chrono.py: améliorer l'affichage de l'aide
This commit is contained in:
parent
6f1d5e5947
commit
e4b7714799
55
chrono.py
55
chrono.py
|
@ -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',
|
||||||
|
|
44
tailor.py
44
tailor.py
|
@ -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='?',
|
||||||
|
|
Loading…
Reference in New Issue