Skip to content

Commit aaf5097

Browse files
Fix filter behavior (#851)
* Fix "created" filter * Catch filter parsing errors * Progress towards fixing filters * Fix state and has_state filters * Undo earlier change --------- Co-authored-by: Paul Ferrell <51765748+Paul-Ferrell@users.noreply.github.com>
1 parent 3fc5be5 commit aaf5097

File tree

4 files changed

+44
-19
lines changed

4 files changed

+44
-19
lines changed

lib/pavilion/cmd_utils.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -140,23 +140,40 @@ def arg_filtered_tests(pav_cfg: "PavConfig", args: argparse.Namespace,
140140

141141
args.tests = ids
142142

143-
if 'all' in args.tests:
144-
for arg, default in filters.TEST_FILTER_DEFAULTS.items():
145-
if hasattr(args, arg) and default != getattr(args, arg):
146-
break
143+
has_filter_defaults = False
144+
145+
for arg, default in filters.TEST_FILTER_DEFAULTS.items():
146+
if hasattr(args, arg) and default != getattr(args, arg):
147+
has_filter_defaults = True
148+
break
149+
150+
# "all" takes priority over everything else
151+
if "all" in args.tests:
152+
args.tests = ["all"]
153+
elif "last" in args.tests:
154+
args.tests = ["last"]
155+
elif len(args.tests) == 0:
156+
if has_filter_defaults or args.filter is not None:
157+
args.tests = ["all"]
147158
else:
148-
output.fprint(verbose, "Using default search filters: The current system, user, and "
149-
"created less than 1 day ago.", color=output.CYAN)
150-
args.filter = make_filter_query()
159+
args.tests = ["last"]
160+
161+
if "all" in args.tests and args.filter is not None and not has_filter_defaults:
162+
output.fprint(verbose, "Using default search filters: The current system, user, and "
163+
"created less than 1 day ago.", color=output.CYAN)
164+
args.filter = make_filter_query()
151165

152166
if args.filter is None:
153167
filter_func = filters.const(True) # Always return True
154168
else:
155-
filter_func = filters.parse_query(args.filter)
169+
try:
170+
filter_func = filters.parse_query(args.filter)
171+
except filters.FilterParseError:
172+
raise PavilionError(f"Invalid syntax in filter query: {args.filter}")
156173

157174
order_func, order_asc = filters.get_sort_opts(sort_by, "TEST")
158175

159-
if 'all' in args.tests:
176+
if "all" in args.tests:
160177
tests = dir_db.SelectItems([], [])
161178
working_dirs = set(map(lambda cfg: cfg['working_dir'],
162179
pav_cfg.configs.values()))
@@ -177,9 +194,6 @@ def arg_filtered_tests(pav_cfg: "PavConfig", args: argparse.Namespace,
177194

178195
return tests
179196

180-
if not args.tests:
181-
args.tests.append('last')
182-
183197
test_paths = test_list_to_paths(pav_cfg, args.tests, verbose)
184198

185199
return dir_db.select_from(
@@ -194,13 +208,15 @@ def arg_filtered_tests(pav_cfg: "PavConfig", args: argparse.Namespace,
194208

195209

196210
def make_filter_query() -> str:
197-
template = 'user={} and created<{}'
211+
"""Construct the default filter query, which targets tests created
212+
by the current user on the current system more recently than 1 day ago."""
213+
214+
template = 'user={} and created>1 day'
198215

199216
user = utils.get_login()
200-
time = (dt.datetime.now() - dt.timedelta(days=1)).isoformat()
201217
sysname = sys_vars.get_vars(defer=True).get('sys_name')
202218

203-
fargs = [user, time]
219+
fargs = [user]
204220

205221
if sysname is not None and len(sysname) > 0:
206222
template += ' and sys_name={}'
@@ -250,7 +266,10 @@ def arg_filtered_series(pav_cfg: config.PavConfig, args: argparse.Namespace,
250266
if args.filter is None:
251267
filter_func = filters.const(True) # Always return True
252268
else:
253-
filter_func = filters.parse_query(args.filter)
269+
try:
270+
filter_func = filters.parse_query(args.filter)
271+
except filters.FilterParseError:
272+
raise PavilionError(f"Invalid syntax in filter query: {args.filter}")
254273

255274
found_series = dir_db.select(
256275
pav_cfg=pav_cfg,

lib/pavilion/commands/status.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from pavilion import filters
88
from pavilion import output
99
from pavilion import status_utils
10+
from pavilion.errors import PavilionError
1011
from .base_classes import Command
1112

1213

@@ -53,7 +54,7 @@ def run(self, pav_cfg, args):
5354
series."""
5455
try:
5556
test_paths = cmd_utils.arg_filtered_tests(pav_cfg, args, verbose=self.errfile).paths
56-
except ValueError as err:
57+
except (ValueError, PavilionError) as err:
5758
output.fprint(self.errfile, err, color=output.RED)
5859
return errno.EINVAL
5960

lib/pavilion/filters/filters.lark

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ keyword: NAME
3030
| duration
3131

3232
// Lark's INTs are restricted to non-negative values
33-
duration: INT [WS] unit ["s"]
33+
duration: INT unit ["s"]
3434

35-
unit: SECOND
35+
?unit: SECOND
3636
| MINUTE
3737
| HOUR
3838
| DAY

lib/pavilion/test_run/test_attrs.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ class TestAttributes(Mapping):
4747
"""
4848

4949
serializers = {
50+
"status": lambda s: s.path.as_posix(),
5051
'suite_path': lambda p: p.as_posix(),
5152
}
5253

5354
deserializers = {
5455
'created': utils.deserialize_datetime,
5556
'finished': utils.deserialize_datetime,
5657
'started': utils.deserialize_datetime,
58+
"status": lambda s: TestStatusFile(Path(s)),
5759
'suite_path': lambda p: Path(p) if p is not None else None,
5860
}
5961

@@ -383,6 +385,9 @@ def _get_status_file(self) -> Optional[TestStatusFile]:
383385
started = basic_attr(
384386
name='started',
385387
doc="The start time for this test run.")
388+
status = basic_attr(
389+
name='status',
390+
doc="The status file associated with the test")
386391
suite_path = basic_attr(
387392
name='suite_path',
388393
doc="Path to the suite_file that defined this test run."

0 commit comments

Comments
 (0)