diff --git a/dev_scripts/qa.py b/dev_scripts/qa.py index 8bc95b7..956794d 100755 --- a/dev_scripts/qa.py +++ b/dev_scripts/qa.py @@ -3,14 +3,21 @@ import abc import argparse import difflib +import json import logging import re import selectors import subprocess import sys +import urllib.request +from pathlib import Path logger = logging.getLogger(__name__) +PYTHON_VERSION_STR = "3.12" +PYTHON_VERSION = [int(num) for num in PYTHON_VERSION_STR.split(".")] +EOL_PYTHON_URL = "https://endoflife.date/api/python.json" + CONTENT_QA = r"""## QA To ensure that new releases do not introduce regressions, and support existing @@ -776,6 +783,10 @@ class QABase(abc.ABC): self.prompt("Does it pass?", choices=["y", "n"]) logger.info("Successfully completed QA scenarios") + @task("Download Tesseract data", auto=True) + def download_tessdata(self): + self.run("python", str(Path("install", "common", "download-tessdata.py"))) + @classmethod @abc.abstractmethod def get_id(cls): @@ -802,6 +813,31 @@ class QAWindows(QABase): while msvcrt.kbhit(): msvcrt.getch() + @QABase.task( + f"Install the latest version of Python {PYTHON_VERSION_STR}", ref=REF_BUILD + ) + def install_python(self): + cur_version = list(sys.version_info[:3]) + + logger.info("Getting latest Python release") + with urllib.request.urlopen(EOL_PYTHON_URL) as f: + resp = f.read() + releases = json.loads(resp) + for release in releases: + if release["cycle"] == PYTHON_VERSION_STR: + latest_version = [int(num) for num in release["latest"].split(".")] + if latest_version > cur_version: + self.prompt( + f"You need to install the latest Python version ({release['latest']})" + ) + elif latest_version == cur_version: + logger.info( + f"Verified that the latest Python version ({release['latest']}) is installed" + ) + return + + logger.error("Could not verify that the latest Python version is installed") + @QABase.task("Install and Run Docker Desktop", ref=REF_BUILD) def install_docker(self): logger.info("Checking if Docker Desktop is installed and running") @@ -816,7 +852,7 @@ class QAWindows(QABase): ) def install_poetry(self): self.run("python", "-m", "pip", "install", "poetry") - self.run("poetry", "install") + self.run("poetry", "install", "--sync") @QABase.task("Build Dangerzone container image", ref=REF_BUILD, auto=True) def build_image(self): @@ -838,9 +874,11 @@ class QAWindows(QABase): return "windows" def start(self): + self.install_python() self.install_docker() self.install_poetry() self.build_image() + self.download_tessdata() self.run_tests() self.build_dangerzone_exe() @@ -933,6 +971,7 @@ class QALinux(QABase): def start(self): self.build_dev_image() self.build_container_image() + self.download_tessdata() self.run_tests() self.build_package() self.build_qa_image()