diff --git a/.cmake-format.py b/.cmake-format.py
index 06299106236de92c7574d3784ed289687c283e66..d897b09008eba690c9102fb60632c5654176672f 100644
--- a/.cmake-format.py
+++ b/.cmake-format.py
@@ -2,7 +2,6 @@
 # Options affecting listfile parsing
 # ----------------------------------
 with section("parse"):
-
     # Specify structure for custom cmake functions
     additional_commands = {
         "foo": {
@@ -24,7 +23,6 @@ with section("parse"):
 # Options affecting formatting.
 # -----------------------------
 with section("format"):
-
     # Disable formatting entirely, making cmake-format a no-op
     disable = False
 
@@ -122,7 +120,6 @@ with section("format"):
 # Options affecting comment reflow and formatting.
 # ------------------------------------------------
 with section("markup"):
-
     # What character to use for bulleted lists
     bullet_char = "*"
 
@@ -166,7 +163,6 @@ with section("markup"):
 # Options affecting the linter
 # ----------------------------
 with section("lint"):
-
     # a list of lint codes to disable
     disabled_codes = []
 
@@ -223,7 +219,6 @@ with section("lint"):
 # Options affecting file encoding
 # -------------------------------
 with section("encode"):
-
     # If true, emit the unicode byte-order mark (BOM) at the start of the file
     emit_byteorder_mark = False
 
@@ -238,7 +233,6 @@ with section("encode"):
 # Miscellaneous configurations options.
 # -------------------------------------
 with section("misc"):
-
     # A dictionary containing any per-command configuration overrides. Currently
     # only `command_case` is supported.
     per_command = {}
diff --git a/ci/collect_metrics.py b/ci/collect_metrics.py
index b584917974256a1436df9d6e747707f581177c3b..0be76941d614407073f79fb98d891f75184409e6 100644
--- a/ci/collect_metrics.py
+++ b/ci/collect_metrics.py
@@ -37,7 +37,6 @@ def parse_junit_tree(element, test_summary=None):
 
     # Parse top level <testsuites> or <testsuite> tags.
     if element.tag in ["testsuites", "testsuite"]:
-
         for attr in test_summary[element.tag]:
             test_summary[element.tag][attr] += int(element.get(attr, 0))
 
diff --git a/ddecal/test/integration/tBdaDdeCal.py b/ddecal/test/integration/tBdaDdeCal.py
index 6c6136d68ee09ce153968b9840dd735c066cffda..b44c1a90e1afbf94e2a146037f2d2692c5a7902a 100755
--- a/ddecal/test/integration/tBdaDdeCal.py
+++ b/ddecal/test/integration/tBdaDdeCal.py
@@ -97,7 +97,6 @@ def create_corrupted_data():
 
 @pytest.fixture()
 def create_corrupted_data_from_regular():
-
     """
     Use a lower frequency averaging to ensure the condition on the frequency
     channels is satisfied: channels per chan block >= max averaged channels
diff --git a/ddecal/test/integration/tIDGPredict.py b/ddecal/test/integration/tIDGPredict.py
index 0299bc4bba134ec6fb2480e0beebe2d467769e81..563b7f0ff522ea56f282557f50b31f2dcc0b2c91 100755
--- a/ddecal/test/integration/tIDGPredict.py
+++ b/ddecal/test/integration/tIDGPredict.py
@@ -87,7 +87,6 @@ def test_input_with_four_sources():
 @pytest.mark.parametrize("source", ["center", "ra", "dec", "radec"])
 @pytest.mark.parametrize("offset", ["center", "dl", "dm", "dldm"])
 def test_input_with_single_sources(source, offset):
-
     """
     Test inputs that contain a single source.
     Since these tests take quite some time, they only run locally, and only
@@ -218,7 +217,6 @@ def test_polynomial_frequency_term_corrections():
     )
 
     for ch in range(ch_count - 1):
-
         # The factors 10, 20000 and 30000 match those in tIDGPredict_ref.py
         taql_command = f"select from {MSIN} where not(TERMS_DATA[{ch},0]=0 or near(TERMS_DATA[{ch},0], (select 10+20000*(CHAN_FREQ[{ch}]/CHAN_FREQ[0]-1) +30000*(CHAN_FREQ[{ch}]/CHAN_FREQ[0]-1)**2 from ::SPECTRAL_WINDOW)[0], 1e-3))"
         assert_taql(taql_command)
diff --git a/pythondp3/test/unit/tPyDpInfo.py b/pythondp3/test/unit/tPyDpInfo.py
index e24c4dd0b970f7d038877ccfdba4a63791b7f51b..14be7a7f9d68ea71426f36a9c1e2b87aa1045215 100644
--- a/pythondp3/test/unit/tPyDpInfo.py
+++ b/pythondp3/test/unit/tPyDpInfo.py
@@ -29,7 +29,6 @@ except ImportError:
 
 
 def test_constructor():
-
     # Constructor using only default values for the arguments
     info0 = dp3.DPInfo()
 
@@ -55,7 +54,6 @@ def test_constructor():
 
 
 def test_antenna_properties():
-
     info = dp3.DPInfo()
 
     # Check default values.
diff --git a/pythondp3/test/unit/tPyFields.py b/pythondp3/test/unit/tPyFields.py
index b15491a8b5330c8e38c761d308a2142d13d30d05..c40184a3fc1c1f226a0e97adca96d260092d80c1 100644
--- a/pythondp3/test/unit/tPyFields.py
+++ b/pythondp3/test/unit/tPyFields.py
@@ -48,7 +48,6 @@ def check_fields(fields, set_fields):
 
 
 def test_constructor():
-
     # Test constructor with empty field
     empty_fields = dp3.Fields()
     check_fields(empty_fields, [])
@@ -74,7 +73,6 @@ def test_constructor():
 
 
 def test_or_operator():
-
     test_fields = dp3.Fields()
     test_fields |= dp3.Fields.FLAGS
     check_fields(test_fields, ["flags"])
@@ -89,7 +87,6 @@ def test_or_operator():
 
 
 def test_equality_operator():
-
     left_empty = dp3.Fields()
     right_empty = dp3.Fields()
     left_three = dp3.Fields.DATA | dp3.Fields.FLAGS | dp3.Fields.UVW
@@ -113,7 +110,6 @@ def test_equality_operator():
 
 
 def test_string_operator():
-
     assert str(dp3.Fields()) == "[]"
     assert str(dp3.Fields.DATA) == "[data]"
     assert str(dp3.Fields.FLAGS) == "[flags]"
@@ -130,7 +126,6 @@ def test_string_operator():
 
 
 def test_update_requirements():
-
     check_fields(
         dp3.Fields(dp3.Fields.DATA).update_requirements(
             dp3.Fields(), dp3.Fields.DATA
diff --git a/pythondp3/test/unit/tPyStep.py b/pythondp3/test/unit/tPyStep.py
index c4ff8bf42ec3774363c59b117654166b7fc6b611..94c6fd31179bb8a733099323dbadfa314a8f346e 100644
--- a/pythondp3/test/unit/tPyStep.py
+++ b/pythondp3/test/unit/tPyStep.py
@@ -82,7 +82,6 @@ def test_info():
             dp3.Step.__init__(self)
 
         def _update_info(self, info):
-
             # Modify the info a bit showing that this method is
             # indeed called when set_info() is called.
             # An example of a step that makes actual changes to the info object
diff --git a/steps/test/integration/tBdaPredict.py b/steps/test/integration/tBdaPredict.py
index 5c94400d8eab83713f66f4dba2ecec8be9f4353d..c54cc81c09af8391f03773a4c2f8e968f7e702b7 100755
--- a/steps/test/integration/tBdaPredict.py
+++ b/steps/test/integration/tBdaPredict.py
@@ -129,7 +129,6 @@ def test_bdapredict(create_skymodel, bda_predict_step_type):
 def test_predicted_values_regular_input(
     create_skymodel_in_phase_center, bda_predict_step_type
 ):
-
     check_call(
         [
             tcf.DP3EXE,
diff --git a/steps/test/integration/tGainCal.py b/steps/test/integration/tGainCal.py
index 1de5380503c8b8068ac7f50658c883ee3d5aad19..8e2407eb6a48da600b0b80ebfc7daf76c3b16adf 100755
--- a/steps/test/integration/tGainCal.py
+++ b/steps/test/integration/tGainCal.py
@@ -173,7 +173,6 @@ def test_caltype_fulljones(create_model_data):
 
 
 def test_caltype_diagonal_nchan_2(create_model_data):
-
     check_call(
         [
             tcf.DP3EXE,
@@ -216,7 +215,6 @@ def test_caltype_diagonal_nchan_2(create_model_data):
 
 @pytest.mark.parametrize("caltype", ["tec", "tecandphase"])
 def test_output_parameters(caltype):
-
     check_call(
         [
             tcf.DP3EXE,