From a5f04d414183a4592547763b947b57b4cbc00678 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Sun, 24 Feb 2019 22:12:24 +0100 Subject: [PATCH] Revert "Revert "Allow ResultsCondition to compare timedelta"" This reverts commit 780ffa98101b5ded1344c955dcfad32669456cf7. --- tools/make_man.py | 2 +- weboob/tools/application/results.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/make_man.py b/tools/make_man.py index cb45580b89..0dc9824821 100755 --- a/tools/make_man.py +++ b/tools/make_man.py @@ -173,7 +173,7 @@ def analyze_application(app, script_name): script_name, app.VERSION.replace('.', '\\&.')) name = ".SH NAME\n%s \- %s" % (script_name, application.SHORT_DESCRIPTION) condition = """.SH CONDITION -The \-c and \-\-condition is a flexible way to filter and get only interesting results. It supports conditions on numerical values, dates, and strings. Dates are given in YYYY\-MM\-DD or YYYY\-MM\-DD HH:MM format. +The \-c and \-\-condition is a flexible way to filter and get only interesting results. It supports conditions on numerical values, dates, durations and strings. Dates are given in YYYY\-MM\-DD or YYYY\-MM\-DD HH:MM format. Durations look like XhYmZs where X, Y and Z are integers. Any of them may be omitted. For instance, YmZs, XhZs or Ym are accepted. The syntax of one expression is "\\fBfield operator value\\fR". The field to test is always the left member of the expression. .LP The field is a member of the objects returned by the command. For example, a bank account has "balance", "coming" or "label" fields. diff --git a/weboob/tools/application/results.py b/weboob/tools/application/results.py index 9c91537e01..8166fc2849 100644 --- a/weboob/tools/application/results.py +++ b/weboob/tools/application/results.py @@ -100,7 +100,8 @@ def __init__(self, condition_str): def is_valid(self, obj): import weboob.tools.date as date_utils - from datetime import date, datetime + import re + from datetime import date, datetime, timedelta d = obj.to_dict() # We evaluate all member of a list at each iteration. for _or in self.condition: @@ -123,6 +124,12 @@ def is_valid(self, obj): splitted_datetime = condition.right.split(' ') tocompare = datetime(*([int(x) for x in splitted_datetime[0].split('-')] + [int(x) for x in splitted_datetime[1].split(':')])) + elif isinstance(d[condition.left], timedelta): + time_dict = re.match('^\s*((?P\d+)\s*h)?\s*((?P\d+)\s*m)?\s*((?P\d+)\s*s)?\s*$', + condition.right).groupdict() + tocompare = timedelta(seconds=int(time_dict['seconds'] or "0"), + minutes=int(time_dict['minutes'] or "0"), + hours=int(time_dict['hours'] or "0")) else: tocompare = typed(condition.right) myeval = functions[condition.op](tocompare, d[condition.left]) -- GitLab