From 77bfb53455865ea739abcd68178821c2e488fdfc Mon Sep 17 00:00:00 2001
From: Max Gautier <mg@max.gautier.name>
Date: Tue, 21 May 2024 21:31:32 +0200
Subject: [PATCH] Fix ci-matrix pre-commit hook

- Remove dependency of pydblite which fails to setup on recent pythons
- Discard shell script and put everything into pre-commit
---
 .gitlab-ci/lint.yml                     |  3 ++-
 .pre-commit-config.yaml                 |  8 ++++--
 tests/scripts/md-table/main.py          | 36 ++++++++++++-------------
 tests/scripts/md-table/requirements.txt |  4 ---
 tests/scripts/md-table/test.sh          | 11 --------
 5 files changed, 26 insertions(+), 36 deletions(-)
 delete mode 100644 tests/scripts/md-table/requirements.txt
 delete mode 100755 tests/scripts/md-table/test.sh

diff --git a/.gitlab-ci/lint.yml b/.gitlab-ci/lint.yml
index 2f96fec5f..658bd35aa 100644
--- a/.gitlab-ci/lint.yml
+++ b/.gitlab-ci/lint.yml
@@ -123,4 +123,5 @@ ci-matrix:
   tags: [light]
   image: python:3
   script:
-    - tests/scripts/md-table/test.sh
+    - tests/scripts/md-table/main.py
+    - git diff --exit-code
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0a4b32681..e4116c1fa 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -77,9 +77,13 @@ repos:
 
       - id: ci-matrix
         name: ci-matrix
-        entry: tests/scripts/md-table/test.sh
-        language: script
+        entry: tests/scripts/md-table/main.py
+        language: python
         pass_filenames: false
+        additional_dependencies:
+          - jinja2
+          - pathlib
+          - pyaml
 
       - id: jinja-syntax-check
         name: jinja-syntax-check
diff --git a/tests/scripts/md-table/main.py b/tests/scripts/md-table/main.py
index 9e0000585..09d5506e9 100755
--- a/tests/scripts/md-table/main.py
+++ b/tests/scripts/md-table/main.py
@@ -4,7 +4,6 @@ import sys
 import glob
 from pathlib import Path
 import yaml
-from pydblite import Base
 import re
 import jinja2
 import sys
@@ -14,6 +13,7 @@ from pprint import pprint
 
 parser = argparse.ArgumentParser(description='Generate a Markdown table representing the CI test coverage')
 parser.add_argument('--dir', default='tests/files/', help='folder with test yml files')
+parser.add_argument('--output', default='docs/developers/ci.md', help='output file')
 
 
 args = parser.parse_args()
@@ -24,25 +24,26 @@ env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=sys.path[0]))
 # Data represents CI coverage data matrix
 class Data:
     def __init__(self):
-        self.db = Base(':memory:')
-        self.db.create('container_manager', 'network_plugin', 'operating_system')
+        self.container_managers = set()
+        self.network_plugins = set()
+        self.os = set()
+        self.combination = set()
 
 
-    def set(self, container_manager, network_plugin, operating_system):
-        self.db.insert(container_manager=container_manager, network_plugin=network_plugin, operating_system=operating_system)
-        self.db.commit()
-    def exists(self, container_manager, network_plugin, operating_system):
-        return len((self.db("container_manager") == container_manager) & (self.db("network_plugin") == network_plugin) & (self.db("operating_system") == operating_system)) > 0
+    def set(self, container_manager, network_plugin, os):
+        self.container_managers.add(container_manager)
+        self.network_plugins.add(network_plugin)
+        self.os.add(os)
+        self.combination.add(container_manager+network_plugin+os)
+
+    def exists(self, container_manager, network_plugin, os):
+        return (container_manager+network_plugin+os) in self.combination
 
     def jinja(self):
         template = env.get_template('table.md.j2')
-        container_engines = list(self.db.get_unique_ids('container_manager'))
-        network_plugins = list(self.db.get_unique_ids("network_plugin"))
-        operating_systems = list(self.db.get_unique_ids("operating_system"))
-
-        container_engines.sort()
-        network_plugins.sort()
-        operating_systems.sort()
+        container_engines = sorted(self.container_managers)
+        network_plugins = sorted(self.network_plugins)
+        operating_systems = sorted(self.os)
 
         return template.render(
             container_engines=container_engines,
@@ -91,6 +92,5 @@ for f in files:
     network_plugin = y.get('kube_network_plugin', 'calico')
     x = re.match(r"^[a-z-]+_([a-z0-9]+).*", f.name)
     operating_system = x.group(1)
-    data.set(container_manager=container_manager, network_plugin=network_plugin, operating_system=operating_system)
-#print(data.markdown())
-print(data.jinja())
+    data.set(container_manager=container_manager, network_plugin=network_plugin, os=operating_system)
+print(data.jinja(), file=open(args.output, 'w'))
diff --git a/tests/scripts/md-table/requirements.txt b/tests/scripts/md-table/requirements.txt
deleted file mode 100644
index 6d4aca36a..000000000
--- a/tests/scripts/md-table/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-jinja2
-pathlib ; python_version < '3.10'
-pyaml
-pydblite
diff --git a/tests/scripts/md-table/test.sh b/tests/scripts/md-table/test.sh
deleted file mode 100755
index cf9df9085..000000000
--- a/tests/scripts/md-table/test.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Install requirements..."
-pip install -r ./tests/scripts/md-table/requirements.txt
-
-echo "Generate current file..."
-./tests/scripts/md-table/main.py > tmp.md
-
-echo "Compare docs/developers/ci.md with actual tests in tests/files/*.yml ..."
-cmp docs/developers/ci.md tmp.md
-- 
GitLab