Skip to content

Commit 3adf0b0

Browse files
authored
Merge branch 'master' into bugfix/parent_class_collisions
2 parents 8b3c8d3 + 6f8222f commit 3adf0b0

File tree

116 files changed

+218
-181
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+218
-181
lines changed

ci-scripts/genrelnotes.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#
66
# SPDX-License-Identifier: BSD-3-Clause
77

8-
import collections
98
import re
109
import sys
1110
import subprocess
@@ -15,8 +14,8 @@ def usage():
1514
sys.stderr.write('Usage: %s PREV_RELEASE CURR_RELEASE\n' % sys.argv[0])
1615

1716

18-
def extract_release_notes(git_output, tag):
19-
return re.findall(r'pull request (#\d+).*\s*\[%s\] (.*)' % tag, git_output)
17+
def extract_release_notes(git_output):
18+
return re.findall(r'pull request (#\d+).*\s*\[(\S+)\] (.*)', git_output)
2019

2120

2221
if __name__ == '__main__':
@@ -39,21 +38,30 @@ def extract_release_notes(git_output, tag):
3938
sys.stderr.write(e.stdout)
4039
sys.exit(1)
4140

42-
titles = {
43-
'feat': '## New features and enhancements',
41+
tag_mapping = {
42+
'feat': '## New features',
43+
'enhancement': '## Enhancements',
44+
'doc': '## Enhancements',
4445
'bugfix': '## Bug fixes',
4546
'testlib': '## Test library'
4647
}
47-
sections = collections.OrderedDict()
48-
for tag in ['feat', 'bugfix', 'testlib', 'ci', 'doc']:
49-
title_line = titles.get(tag, '## Other')
50-
sections.setdefault(title_line, [])
51-
for pr, descr in extract_release_notes(completed.stdout, tag):
52-
descr_line = '- %s (%s)' % (descr, pr)
53-
sections[title_line].append(descr_line)
48+
sections = {
49+
'## New features': [],
50+
'## Enhancements': [],
51+
'## Bug fixes': [],
52+
'## Test library': [],
53+
'## Other': []
54+
}
55+
for pr, tag, descr in extract_release_notes(completed.stdout):
56+
title_line = tag_mapping.get(tag, '## Other')
57+
descr_line = f'- {descr} ({pr})'
58+
sections[title_line].append(descr_line)
5459

5560
print('# Release Notes')
5661
for sec_title, sec_lines in sections.items():
62+
if not sec_lines:
63+
continue
64+
5765
print()
5866
print(sec_title)
5967
print()

docs/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python3
22
#
3-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
3+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
44
# ReFrame Project Developers. See the top-level LICENSE file for details.
55
#
66
# SPDX-License-Identifier: BSD-3-Clause
@@ -85,7 +85,7 @@
8585

8686
# General information about the project.
8787
project = 'ReFrame'
88-
copyright = '2016-2022, CSCS/ETH Zurich and other ReFrame Project Developers'
88+
copyright = '2016-2023, CSCS/ETH Zurich, ReFrame Project Developers'
8989
author = 'ReFrame Project Developers'
9090

9191
# The version info for the project you're documenting, acts as replacement for

docs/deferrable_functions_reference.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ Currently ReFrame provides three broad categories of deferrable functions:
5858
They include, but are not limited to, functions to iterate over regex matches in a file, extracting and converting values from regex matches, computing statistical information on series of data etc.
5959

6060

61-
.. _deferrable-performance-functions:
61+
.. _deferrable-performance-functions:
6262

6363

6464
--------------------------------

docs/manpage.rst

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ An action must always be specified.
220220
.. versionadded:: 3.10.0
221221
Support for different types of listing is added.
222222

223+
.. versionchanged:: 4.0.5
224+
The variable names to which fixtures are bound are also listed.
225+
See :ref:`test_naming_scheme` for more information.
226+
223227
.. option:: -l, --list[=T|C]
224228

225229
List selected tests and their dependencies.
@@ -234,6 +238,10 @@ An action must always be specified.
234238
.. versionadded:: 3.10.0
235239
Support for different types of listing is added.
236240

241+
.. versionchanged:: 4.0.5
242+
The variable names to which fixtures are bound are also listed.
243+
See :ref:`test_naming_scheme` for more information.
244+
237245
.. option:: --list-tags
238246

239247
List the unique tags of the selected tests.
@@ -510,7 +518,8 @@ Options controlling ReFrame execution
510518

511519
``TEST`` can have the form ``[TEST.][FIXT.]*``, in which case ``VAR`` will be set in fixture ``FIXT`` of ``TEST``.
512520
Note that this syntax is recursive on fixtures, so that a variable can be set in a fixture arbitrarily deep.
513-
``TEST`` prefix refers to the test class name, *not* the test name, but ``FIXT`` refers to the fixture name *inside* the referenced test.
521+
``TEST`` prefix refers to the test class name, *not* the test name and ``FIXT`` refers to the fixture *variable name* inside the referenced test, i.e., the test variable to which the fixture is bound.
522+
The fixture variable name is referred to as ``'<varname>`` when listing tests with the :option:`-l` and :option:`-L` options.
514523

515524
Multiple variables can be set at the same time by passing this option multiple times.
516525
This option *cannot* change arbitrary test attributes, but only test variables declared with the :attr:`~reframe.core.pipeline.RegressionMixin.variable` built-in.
@@ -951,24 +960,29 @@ Here is how this test is listed where the various components of the display name
951960

952961
.. code-block:: console
953962
954-
- TestA %x=4 %l.foo=10 %t.p=2 /1c51609b
955-
^Myfixture %p=1 ~TestA_3 /f027ee75
956-
^MyFixture %p=2 ~TestA_3 /830323a4
957-
^X %foo=10 ~generic:default+builtin /7dae3cc5
958-
- TestA %x=3 %l.foo=10 %t.p=2 /707b752c
959-
^MyFixture %p=1 ~TestA_2 /02368516
960-
^MyFixture %p=2 ~TestA_2 /854b99b5
961-
^X %foo=10 ~generic:default+builtin /7dae3cc5
962-
- TestA %x=4 %l.foo=10 %t.p=1 /c65657d5
963-
^MyFixture %p=2 ~TestA_1 /f0383f7f
964-
^MyFixture %p=1 ~TestA_1 /d07f4281
965-
^X %foo=10 ~generic:default+builtin /7dae3cc5
966-
- TestA %x=3 %l.foo=10 %t.p=1 /1b9f44df
967-
^MyFixture %p=2 ~TestA_0 /b894ab05
968-
^MyFixture %p=1 ~TestA_0 /ca376ca8
969-
^X %foo=10 ~generic:default+builtin /7dae3cc5
963+
- TestA %x=4 %l.foo=10 %t.p=2 /8804be5d
964+
^MyFixture %p=1 ~TestA_3 't 'f /f027ee75
965+
^MyFixture %p=2 ~TestA_3 't 'f /830323a4
966+
^X %foo=10 ~generic:default+builtin 'l /7dae3cc5
967+
- TestA %x=3 %l.foo=10 %t.p=2 /89f6f5d1
968+
^MyFixture %p=1 ~TestA_2 't 'f /02368516
969+
^MyFixture %p=2 ~TestA_2 't 'f /854b99b5
970+
^X %foo=10 ~generic:default+builtin 'l /7dae3cc5
971+
- TestA %x=4 %l.foo=10 %t.p=1 /af9b2941
972+
^MyFixture %p=2 ~TestA_1 't 'f /f0383f7f
973+
^MyFixture %p=1 ~TestA_1 't 'f /d07f4281
974+
^X %foo=10 ~generic:default+builtin 'l /7dae3cc5
975+
- TestA %x=3 %l.foo=10 %t.p=1 /a9e50aa3
976+
^MyFixture %p=2 ~TestA_0 't 'f /b894ab05
977+
^MyFixture %p=1 ~TestA_0 't 'f /ca376ca8
978+
^X %foo=10 ~generic:default+builtin 'l /7dae3cc5
970979
Found 4 check(s)
971980
981+
Notice that the variable name to which every fixture is bound in its parent test is also listed as ``'<varname>``.
982+
This is useful for setting variables down the fixture hierarchy using the :option:`-S` option.
983+
984+
985+
972986
Display names may not always be unique.
973987
Assume the following test:
974988

docs/tutorial_basics.rst

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -429,12 +429,13 @@ For running the benchmark, we need to set the OpenMP number of threads and pin t
429429
You can set environment variables in a ReFrame test through the :attr:`~reframe.core.pipeline.RegressionTest.env_vars` dictionary.
430430

431431
What makes a ReFrame test a performance test is the definition of at least one :ref:`performance function<deferrable-performance-functions>`.
432-
Similarly to a test's :func:`@sanity_function<reframe.core.pipeline.RegressionMixin.sanity_function>`, a performance function is a member function decorated with the :attr:`@performance_function<reframe.core.pipeline.RegressionMixin.performance_function>` decorator, which binds the decorated function to a given unit.
433-
These functions can be used by the regression test to extract, measure or compute a given quantity of interest; where in this context, the values returned by a performance function are referred to as performance variables.
434-
Alternatively, performance functions can also be thought as `tools` available to the regression test for extracting performance variables.
435-
By default, ReFrame will attempt to execute all the available performance functions during the test's ``performance`` stage, producing a single performance variable out of each of the available performance functions.
436-
These default-generated performance variables are defined in the regression test's attribute :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` during class instantiation, and their default name matches the name of their associated performance function.
437-
However, one could customize the default-generated performance variable's name by passing the ``perf-key`` argument to the :attr:`@performance_function<reframe.core.pipeline.RegressionMixin.performance_function>` decorator of the associated performance function.
432+
Similarly to a test's :func:`@sanity_function<reframe.core.builtins.sanity_function>`, a performance function is a member function decorated with the :func:`@performance_function<reframe.core.builtins.performance_function>` decorator that merely extracts or computes a performance metric from the test's output and associates it with a unit.
433+
By default, every performance function defined in the test is assigned to a *performance variable* with the function's name.
434+
A performance variable is a named quantity representing a performance metric that ReFrame will report on, log and can also check against a reference value.
435+
The performance variables of a test are stored in the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` dictionary.
436+
The keys are the names of the metrics, whereas the values are :ref:`performance functions <deferrable-performance-functions>`.
437+
The :func:`@performance_function<reframe.core.builtins.performance_function>` decorator apart from turning an ordinary method into a "performance function", it also creates an entry in the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` dictionary.
438+
The optional ``perf_key`` argument can be used to assign a different name to the newly created performance variable.
438439

439440
In this example, we extract four performance variables, namely the memory bandwidth values for each of the "Copy", "Scale", "Add" and "Triad" sub-benchmarks of STREAM, where each of the performance functions use the :func:`~reframe.utility.sanity.extractsingle` utility function.
440441
For each of the sub-benchmarks we extract the "Best Rate MB/s" column of the output (see below) and we convert that to a float.
@@ -468,9 +469,11 @@ This is especially useful if you run long suites of performance exploration test
468469
Setting explicitly the test's performance variables
469470
---------------------------------------------------
470471

471-
In the above STREAM example, all four performance functions were almost identical except for a small part of the regex pattern, which led to some code repetition.
472-
Even though the performance functions were rather simple and the code repetition was not much in that case, this is still not a good practice and it is certainly an approach that would not scale when using more complex performance functions.
473-
Hence, in this example, we show how to collapse all these four performance functions into a single function and how to reuse this single performance function to create multiple performance variables.
472+
Users are allowed to manipulate the test's :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` dictionary directly.
473+
This is useful to avoid code repetition or in cases that relying on decorated methods to populate the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` is impractical, e.g., creating multiple performance variables in a loop.
474+
475+
You might have noticed that in our STREAM example above, all four performance functions are almost identical except for a small part of the regex pattern.
476+
In the following example, we define a single performance function, :func:`extract_bw`, that can extract any of the requested bandwidth metrics, and we populate the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` ourselves in a pre-performance hook:
474477

475478
.. code-block:: console
476479
@@ -480,28 +483,29 @@ Hence, in this example, we show how to collapse all these four performance funct
480483
:start-at: import reframe
481484
:emphasize-lines: 28-
482485

483-
As shown in the highlighted lines, this example collapses the four performance functions from the previous example into the :func:`extract_bw` function, which is also decorated with the :attr:`@performance_function<reframe.core.pipeline.RegressionMixin.performance_function>` decorator with the units set to ``'MB/s'``.
484-
However, the :func:`extract_bw` function now takes the optional argument ``kind`` which selects the STREAM benchmark to extract.
485-
By default, this argument is set to ``'Copy'`` because functions decorated with :attr:`@performance_function<reframe.core.pipeline.RegressionMixin.performance_function>` are only allowed to have ``self`` as a non-default argument.
486-
Thus, from this performance function definition, ReFrame will default-generate a single performance variable during the test instantiation under the name ``extract_bw``, where this variable will report the performance results from the ``Copy`` benchmark.
487-
With no further action from our side, ReFrame would just report the performance of the test based on this default-generated performance variable, but that is not what we are after here.
488-
Therefore, we must modify these default performance variables so that this version of the STREAM test produces the same results as in the previous example.
489-
As mentioned before, the performance variables (also the default-generated ones) are stored in the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` dictionary, so all we need to do is to redefine this mapping with our desired performance variables as done in the pre-performance pipeline hook :func:`set_perf_variables`.
486+
As mentioned in the previous section the :func:`@performance_function <reframe.core.builtins.performance_function>` decorator performs two tasks:
490487

491-
.. tip::
492-
Performance functions may also be generated inline using the :func:`~reframe.utility.sanity.make_performance_function` utility as shown below.
493-
494-
.. code-block:: python
495-
496-
@run_before('performance')
497-
def set_perf_vars(self):
498-
self.perf_variables = {
499-
'Copy': sn.make_performance_function(
500-
sn.extractsingle(r'Copy:\s+(\S+)\s+.*',
501-
self.stdout, 1, float),
502-
'MB/s'
503-
)
504-
}
488+
1. It converts a test method to *performance function*, i.e., a function that is suitable for extracting a performance metric.
489+
2. It updates the :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` dictionary with the newly created performance function.
490+
491+
In this example, we are only interested in the first functionality and that's why we redefine completely the test's :attr:`~reframe.core.pipeline.RegressionTest.perf_variables` using the :func:`extract_bw` performance function.
492+
If you are inheriting from a base test and you don't want to override completely its performance variables, you could call instead :py:func:`update` on :attr:`~reframe.core.pipeline.RegressionTest.perf_variables`.
493+
494+
Finally, you can convert any arbitrary function or :doc:`deferred expression <deferrable_functions_reference>` into a performance function by calling the :func:`~reframe.utility.sanity.make_performance_function` utility as shown below:
495+
496+
.. code-block:: python
497+
498+
@run_before('performance')
499+
def set_perf_vars(self):
500+
self.perf_variables = {
501+
'Copy': sn.make_performance_function(
502+
sn.extractsingle(r'Copy:\s+(\S+)\s+.*',
503+
self.stdout, 1, float),
504+
'MB/s'
505+
)
506+
}
507+
508+
Note that in this case, the newly created performance function is not assigned to a test's performance variable and you will have to do this independently.
505509

506510
-----------------------
507511
Adding reference values

reframe/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
1+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
22
# ReFrame Project Developers. See the top-level LICENSE file for details.
33
#
44
# SPDX-License-Identifier: BSD-3-Clause

reframe/core/backends.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
1+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
22
# ReFrame Project Developers. See the top-level LICENSE file for details.
33
#
44
# SPDX-License-Identifier: BSD-3-Clause

reframe/core/buildsystems.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
1+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
22
# ReFrame Project Developers. See the top-level LICENSE file for details.
33
#
44
# SPDX-License-Identifier: BSD-3-Clause

reframe/core/builtins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
1+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
22
# ReFrame Project Developers. See the top-level LICENSE file for details.
33
#
44
# SPDX-License-Identifier: BSD-3-Clause

reframe/core/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2016-2022 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
1+
# Copyright 2016-2023 Swiss National Supercomputing Centre (CSCS/ETH Zurich)
22
# ReFrame Project Developers. See the top-level LICENSE file for details.
33
#
44
# SPDX-License-Identifier: BSD-3-Clause

0 commit comments

Comments
 (0)