From eab742d5a1f6db8f4f829cfd8f57ade82a1e9561 Mon Sep 17 00:00:00 2001
From: Manuel Weberndorfer <manuel.weberndorfer@id.ethz.ch>
Date: Tue, 8 Feb 2022 15:09:12 +0000
Subject: [PATCH] update versions of python packages

- previous version of black does not support jammy
- perform changes recommended by pylint
---
 .gitlab-ci.yml                                |  4 +-
 cpppetsc/tools/generate_xdmf.py               | 44 ++++++++---------
 docker/Dockerfile                             | 48 +++++++++----------
 .../src/quadrature/generate_quadrature.py     | 15 ++----
 tests/numeric_diff.py                         |  8 ++--
 tests/run.py                                  |  8 ++--
 6 files changed, 59 insertions(+), 68 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9d09813a..752d73b9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -93,8 +93,8 @@ check-script:
     image: $CI_REGISTRY_IMAGE/dev-real:$CI_COMMIT_REF_SLUG
     script:
         - find . -name "*.py" -print0 | xargs -0 python3 -m black --check
-        - find . -name "*.py" -print0 | xargs -0 python3 -m pylint
-        - find . -name "*.py" -print0 | xargs -0 python3 -m mypy --python-version 3.7 --ignore-missing
+        - find . -name "*.py" -print0 | xargs -0 python3 -m pylint --generated-members 'h5py\.File'
+        - find . -name "*.py" -print0 | xargs -0 python3 -m mypy --python-version 3.9 --ignore-missing
         - find . -name "*.py" -print0 | xargs -0 python3 -m doctest
 
 .build-library: &build-library
diff --git a/cpppetsc/tools/generate_xdmf.py b/cpppetsc/tools/generate_xdmf.py
index ce72aa6d..44ee807d 100755
--- a/cpppetsc/tools/generate_xdmf.py
+++ b/cpppetsc/tools/generate_xdmf.py
@@ -246,17 +246,17 @@ def add_sliced_hdf_dataitem(
         "DataItem",
         {"Dimensions": shape_to_xdmf_dimensions((3, item.ndim)), "Format": "XML"},
     )
-    dimensions.text = "{} {} {}".format(
-        shape_to_xdmf_dimensions(
+    dimensions.text = f"""{
+          shape_to_xdmf_dimensions(
             tuple(sliced_dimensions.get(i, 0) for i in range(item.ndim))
-        ),
-        shape_to_xdmf_dimensions(tuple(1 for _ in range(item.ndim))),
-        shape_to_xdmf_dimensions(
-            tuple(
-                1 if i in sliced_dimensions else item.shape[i] for i in range(item.ndim)
-            )
-        ),
-    )
+          )
+          } {
+          shape_to_xdmf_dimensions(tuple(1 for _ in range(item.ndim)))
+          } {
+          shape_to_xdmf_dimensions(
+            tuple(1 if i in sliced_dimensions else item.shape[i] for i in range(item.ndim))
+          )
+          }"""
     add_hdf_dataitem(hyperslab, hdf_file, hdf_path)
     return hyperslab
 
@@ -282,7 +282,7 @@ def add_hdf_dataitem(
             "Rank": str(item.ndim),
         },
     )
-    dataitem.text = "{}:{}".format(hdf_file.filename, hdf_path)
+    dataitem.text = f"{hdf_file.filename}:{hdf_path}"
     return dataitem
 
 
@@ -358,15 +358,13 @@ def add_topology(parent: ET.Element, hdf_file: h5py.File) -> ET.Element:
         {"Format": "XML", "Dimensions": str(dataitem_dimension)},
     )
     dataitem.text = "  ".join(
-        "{} {}".format(
-            " ".join(
-                str(type_)
-                for type_ in number_of_corners_to_type(
-                    len(vertices), topological_dimension
-                )
-            ),
-            " ".join(str(vertex) for vertex in vertices),
-        )
+        f"""{
+          " ".join(str(type_)
+          for type_ in number_of_corners_to_type(len(vertices), topological_dimension))
+        } {
+          " ".join(str(vertex)
+          for vertex in vertices)
+        }"""
         for vertices in read_element_vertices(hdf_file)
     )
 
@@ -411,7 +409,7 @@ def add_field(
         - 3 columns: A vector field will be added.
         - otherwise: The field is split into scalar fields, and those are added.
     """
-    hdf_path = "/fields/{}".format(field_name)
+    hdf_path = "/fields/{field_name}"
 
     item = hdf_file[hdf_path]
     shape = item.shape
@@ -456,7 +454,7 @@ def add_field(
                 parent,
                 "Attribute",
                 {
-                    "Name": "{}[{}]{}".format(field_name, column, postfix),
+                    "Name": f"{field_name}[{column}]{postfix}",
                     "Center": center,
                     "AttributeType": "Scalar",
                 },
@@ -519,7 +517,7 @@ def main() -> None:
     XDMF to file.
     """
     filename = parse_input_filename()
-    with open(filename.stem + ".xdmf", "w") as xdmf_file:
+    with open(filename.stem + ".xdmf", "w", encoding="utf-8") as xdmf_file:
         xdmf_file.write(hdf_to_xdmf_string(h5py.File(filename, "r")))
 
 
diff --git a/docker/Dockerfile b/docker/Dockerfile
index ce80ab90..f513cde5 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -19,31 +19,31 @@ FROM $BASE_IMAGE
 ARG PETSC_SCALAR_TYPE=real
 
 RUN apt-get update && \
-        DEBIAN_FRONTEND="noninteractive" \
-        TZ="Europe/Zurich" \
-        apt-get install -y \
-        clang-format \
-        cmake \
-        g++ \
-        git \
-        googletest \
-        libboost-program-options-dev \
-        libeigen3-dev \
-        librange-v3-dev \
-        ninja-build \
-        python3 python3-pip \
-        python3-h5py \
-        gdb
+  DEBIAN_FRONTEND="noninteractive" \
+  TZ="Europe/Zurich" \
+  apt-get install -y \
+  clang-format \
+  cmake \
+  g++ \
+  git \
+  googletest \
+  libboost-program-options-dev \
+  libeigen3-dev \
+  librange-v3-dev \
+  ninja-build \
+  python3 python3-pip \
+  python3-h5py \
+  gdb
 
 RUN pip3 install \
-        mypy==0.790 \
-        black==20.8b1 \
-        pylint==2.6.0 \
-        sympy==1.7.1 \
-        gcovr
+  mypy==0.931 \
+  black==22.1.0 \
+  pylint==2.12.2 \
+  sympy==1.7.1 \
+  gcovr==5.0
 
 RUN apt-get update && \
-        DEBIAN_FRONTEND="noninteractive" \
-        apt-get install -y \
-        libpetsc-${PETSC_SCALAR_TYPE}-dev \
-        libslepc-${PETSC_SCALAR_TYPE}3.15-dev
+  DEBIAN_FRONTEND="noninteractive" \
+  apt-get install -y \
+  libpetsc-${PETSC_SCALAR_TYPE}-dev \
+  libslepc-${PETSC_SCALAR_TYPE}3.15-dev
diff --git a/elements/src/quadrature/generate_quadrature.py b/elements/src/quadrature/generate_quadrature.py
index 66cbedb1..fa863e0f 100755
--- a/elements/src/quadrature/generate_quadrature.py
+++ b/elements/src/quadrature/generate_quadrature.py
@@ -54,7 +54,7 @@ def compute_gaussian_weights(order: int) -> List[Any]:
 
     return [
         2
-        / (1 - node ** 2)
+        / (1 - node**2)
         / sympy.diff(
             sympy.legendre_poly(order, sympy.Symbol("x"), polys=True), sympy.Symbol("x")
         ).eval(node)
@@ -133,7 +133,7 @@ def to_initializer_list(values: Any) -> str:
     if isinstance(values, (list, tuple)):
         result = ", ".join([to_initializer_list(element) for element in values])
         return "{{" + result + (", " if result.endswith("}") else "") + "}}"
-    return "{:+.16f}".format(float(values))
+    return f"{float(values):+.16f}"
 
 
 def quadrature_definition(order: int, dimension: int) -> str:
@@ -149,14 +149,9 @@ def quadrature_definition(order: int, dimension: int) -> str:
     weights = compute_gaussian_weights_in_dimension(order, dimension)
     return (
         "AE108_ELEMENTS_QUADRATURE_DEFINE("
-        "QuadratureType::Cube, {}, {}, {}, {{{}, {}}}"
-        ");".format(
-            dimension,
-            2 * order - 1,
-            len(nodes),
-            to_initializer_list(nodes),
-            to_initializer_list(weights),
-        )
+        f"QuadratureType::Cube, {dimension}, {2 * order - 1}, {len(nodes)}, "
+        f"{{{to_initializer_list(nodes)}, {to_initializer_list(weights)}}}"
+        ");"
     )
 
 
diff --git a/tests/numeric_diff.py b/tests/numeric_diff.py
index 4947d12b..1e210876 100755
--- a/tests/numeric_diff.py
+++ b/tests/numeric_diff.py
@@ -83,9 +83,7 @@ def diff_iterables(
             math.isclose(values[0], values[1], rel_tol=rel_tol, abs_tol=abs_tol)
             or (math.isnan(values[0]) and math.isnan(values[1]))
         ):
-            yield "Line {} differs: '{}' is not '{}'".format(
-                index, strings[0].strip(), strings[1].strip()
-            )
+            yield f"Line {index} differs: '{strings[0].strip()}' is not '{strings[1].strip()}'"
 
 
 def main():
@@ -119,8 +117,8 @@ def main():
 
     arguments = parser.parse_args()
 
-    with open(str(arguments.filename_1), "r") as file_1:
-        with open(str(arguments.filename_2), "r") as file_2:
+    with open(str(arguments.filename_1), "r", encoding="utf-8") as file_1:
+        with open(str(arguments.filename_2), "r", encoding="utf-8") as file_2:
             return sum(
                 1
                 for _ in map(
diff --git a/tests/run.py b/tests/run.py
index 693eda6f..7ea16eaa 100755
--- a/tests/run.py
+++ b/tests/run.py
@@ -197,8 +197,8 @@ def diff_files(
         ComparisonType.NUMERIC: diff_numeric_string,
     }
 
-    with open(value, "r") as value_file:
-        with open(reference, "r") as reference_file:
+    with open(value, "r", encoding="utf-8") as value_file:
+        with open(reference, "r", encoding="utf-8") as reference_file:
             comparison_to_function.get(comparison, lambda _0, _1, _2: None)(
                 value_file.read(), reference_file.read(), case
             )
@@ -326,7 +326,7 @@ def load_tests(
             lambda processes, name=test_name: f"test_{name}_with_{processes}_mpi_processes"
         )
 
-        with open(path, "r") as file:
+        with open(path, "r", encoding="utf-8") as file:
             test_case_definitions = as_test_case_definitions(
                 path.parent, json.load(file)
             )
@@ -365,7 +365,7 @@ def run_testcase(
             mpi_processes=definition.mpi_processes,
         )
 
-        with open(directory_path / "stdout.txt", "w") as file:
+        with open(directory_path / "stdout.txt", "w", encoding="utf-8") as file:
             file.write(result.stdout)
 
         diff_files(
-- 
GitLab