cgilsxml.py: possibilité de classifier des fichiers au sein d'un groupe avec --break-on

This commit is contained in:
Jephté Clain 2016-06-08 16:06:23 +04:00
parent 3a9bf0492e
commit 0204a21aeb
1 changed files with 34 additions and 5 deletions

View File

@ -37,12 +37,14 @@ class Filter:
re_allows = None
ex_vars = None
ex_group = None
ex_break_on = None
def __init__(self, re_spec):
self.re_spec = re.compile(re_spec)
self.re_allows = []
self.ex_vars = []
self.ex_group = None
self.ex_break_on = None
def allow_spec(self, re_allow):
self.re_allows.append(re.compile(re_allow))
@ -56,9 +58,15 @@ class Filter:
def set_group(self, ex_group):
self.ex_group = ex_group
def set_break_on(self, ex_break_on):
self.ex_break_on = ex_break_on
def __repr__(self):
return 'Filter<%s,%s,%s,%s>' % (self.re_spec, repr(self.re_allows),
repr(self.ex_vars), self.ex_group)
return 'Filter<%s,%s,%s,%s,%s>' % \
(self.re_spec, repr(self.re_allows),
repr(self.ex_vars),
self.ex_group, self.ex_break_on,
)
def match_fill(self, file):
mo = self.re_spec.match(file.name)
@ -70,7 +78,15 @@ class Filter:
if self.ex_group is not None:
group = mo.expand(self.ex_group)
if '%' in group: group = group % file.vars
file.group = group
else:
group = None
file.group = group
if self.ex_break_on is not None:
break_on = mo.expand(self.ex_break_on)
if '%' in break_on: break_on = break_on % file.vars
else:
break_on = None
file.break_on = break_on
return True
def match_allow(self, file):
@ -265,8 +281,14 @@ def print_files(files, fgroups=None, select_group=None, script_name=None, xslt=N
if fgroup == select_group:
xfgroup.set('selected', 'selected')
xfiles = ET.SubElement(xresult, "files")
first = True
last_classifier = (None, None)
for file in files:
if file.dontlist: continue
current_classifier = (file.group, file.break_on)
file.break_here = first or current_classifier != last_classifier
last_classifier = current_classifier
first = False
xfile = ET.SubElement(xfiles, "file")
if file.group is not None: xfile.set('group', file.group)
for name, value in file.vars.items():
@ -291,6 +313,9 @@ def run_cgilsxml():
def set_group(option, opt_str, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].set_group(value)
def set_break_on(option, opt_str, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].set_break_on(value)
from optparse import OptionParser
OP = OptionParser(usage=u"\n\t%prog [options] /path/to/dir", description=__doc__)
@ -301,10 +326,14 @@ def run_cgilsxml():
OP.add_option('-E', '--allow-spec', dest='spec', action='callback', callback=allow_spec, type='string',
help=u"Ajouter une spécification de fichier qui peut être demandé avec --cgi-path-info. Ces fichiers ne sont pas inclus dans la liste.")
OP.add_option('-v', '--var', dest='var', action='callback', callback=add_var, type='string',
help=u"Définir la variable NAME à la valeur de l'expression VAR_EXPR. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N et \\g<NAME> pour inclure respective le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
help=u"Définir la variable NAME à la valeur de l'expression VAR_EXPR. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N et \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
+ u"\n Cette option peut être spécifiée plusieurs fois. Elle s'applique à l'expression régulière définie par la dernière option --spec")
OP.add_option('-g', '--group', dest='group', action='callback', callback=set_group, type='string',
help=u"Spécifier l'expression qui permet de construire des ensembles de fichiers sur la base des groupes définis dans l'expression régulière de l'option --spec. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respective le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
help=u"Spécifier l'expression qui permet de construire des ensembles de fichiers sur la base des groupes définis dans l'expression régulière de l'option --spec. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
+ u"\n Cette option ne peut être spécifiée qu'une seule fois par option --spec")
OP.add_option('-b', '--break-on', dest='break_on', action='callback', callback=set_break_on, type='string',
help=u"Spécifier une expression qui permet de partitionner la list des fichiers au sein d'un même groupe. Dans cette expression, il est possible d'utiliser des expressions de la forme %(var)s pour inclure des variables déjà définies, ou \\N ou \\g<NAME> pour inclure respectivement le groupe numéro N et le groupe nommé NAME de l'expression régulière --spec."
+ u"\n Bien que ce ne soit pas une obligation, il est logique de trier la liste sur cette expression pour que les groupes de fichiers soient ensembles dans la liste."
+ u"\n Cette option ne peut être spécifiée qu'une seule fois par option --spec")
OP.add_option('-s', '--sort', dest='sortby',
help=u"Spécifier le champ sur lequel trier ainsi que le type de tri à utiliser. SORT_EXPR est de la forme FIELD:TYPE où FIELD est le nom du champ et TYPE est le type de tri: A, D, C et/ou N pour (A)scendant, (D)escendant, (C)haine, (N)numérique. Si un champ est spécifié mais que le type de tri ne l'est pas, la valeur par défaut est AC. Si cette option n'est pas spécifiée, le tri par défaut est 'mtime:DN'."