From 5f217f299591d384582042c68285344d7dedcf6d Mon Sep 17 00:00:00 2001 From: voldemort <5692900+yell0wsuit@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:29:29 +0700 Subject: [PATCH] refactor Python checks for improved validation --- custom_functions/prechecks/python_checks.py | 114 +++++++++++--------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/custom_functions/prechecks/python_checks.py b/custom_functions/prechecks/python_checks.py index 0cf1fce..63c32cb 100644 --- a/custom_functions/prechecks/python_checks.py +++ b/custom_functions/prechecks/python_checks.py @@ -1,33 +1,26 @@ +"""Module to check for the Python version and environment.""" + import sys import os import subprocess import venv +import importlib.util def version_check(): - major_version = sys.version_info.major - minor_version = sys.version_info.minor - - if major_version >= 3: - if minor_version >= 12: - return - else: - exit("Python version 3.12 or higher is required") - else: - exit("Python 2 detected, Python version 3.12 or higher is required") + """Check for the Python version.""" + if sys.version_info < (3, 12): + sys.exit("Python version 3.12 or higher is required") def pip_check(): - try: - import pip - - return - except ImportError: - exit("Pip is not installed") + """Check for the pip installation.""" + if importlib.util.find_spec("pip") is None: + sys.exit("Pip is not installed") def venv_check(): - # Check if we're already inside a virtual environment + """Check for the virtual environment.""" if hasattr(sys, "real_prefix") or ( hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix ): @@ -40,20 +33,20 @@ def venv_check(): else os.path.join(venv_path, "Scripts", "python.exe") ) - # If venv already exists, restart script using its Python if os.path.exists(venv_path): subprocess.call([venv_python] + sys.argv) sys.exit() - # Ask user for permission to create a virtual environment - answer = "" - while not answer or answer[0].upper() not in {"Y", "N"}: - answer = input( - "Program is not running from a venv. To maintain compatibility and dependencies, this program must be run from one.\n" - "Would you like me to create one for you? (Y/N): " + answer = ( + input( + "Program is not running from a virtual environment. To maintain " + "compatibility, this program must be run from one.\n" + "Would you like to create one? (Y/N): " ) - - if answer[0].upper() == "Y": + .strip() + .upper() + ) + if answer.startswith("Y"): print("Creating virtual environment...") venv.create(venv_path, with_pip=True) subprocess.call([venv_python] + sys.argv) @@ -64,37 +57,54 @@ def venv_check(): def requirements_check(): - try: - import pywidevine - import pyplayready - import flask - import flask_cors - import yaml - import mysql.connector - + """Check for the requirements.""" + required_packages = [ + "pywidevine", + "pyplayready", + "flask", + "flask_cors", + "yaml", + "mysql.connector", + ] + missing = [] + for pkg in required_packages: + if "." in pkg: + parent, _ = pkg.split(".", 1) + if ( + importlib.util.find_spec(parent) is None + or importlib.util.find_spec(pkg) is None + ): + missing.append(pkg) + else: + if importlib.util.find_spec(pkg) is None: + missing.append(pkg) + if not missing: return - except ImportError: - while True: - user_input = ( - input("Missing packages. Do you want to install them? (Y/N): ") - .strip() - .upper() + + while True: + user_input = ( + input( + f"Missing packages: {', '.join(missing)}. Do you want to install them? (Y/N): " ) - if user_input == "Y": - print("Installing packages from requirements.txt...") - subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "requirements.txt"] - ) - print("Installation complete.") - break - elif user_input == "N": - print("Dependencies required, please install them and run again.") - sys.exit() - else: - print("Invalid input. Please enter 'Y' to install or 'N' to exit.") + .strip() + .upper() + ) + if user_input == "Y": + print("Installing packages from requirements.txt...") + subprocess.check_call( + [sys.executable, "-m", "pip", "install", "-r", "requirements.txt"] + ) + print("Installation complete.") + break + if user_input == "N": + print("Dependencies required, please install them and run again.") + sys.exit() + else: + print("Invalid input. Please enter 'Y' to install or 'N' to exit.") def run_python_checks(): + """Run the Python checks.""" if getattr(sys, "frozen", False): # Check if running from PyInstaller return version_check()