feat(common/pakfile): impl??mentation initiale de la classe Pakfile
This commit is contained in:
parent
7a9fe18463
commit
b27f877f8b
2 changed files with 182 additions and 0 deletions
0
src/erminig/common/__init__.py
Normal file
0
src/erminig/common/__init__.py
Normal file
182
src/erminig/common/pakfile.py
Normal file
182
src/erminig/common/pakfile.py
Normal file
|
|
@ -0,0 +1,182 @@
|
||||||
|
#
|
||||||
|
# Erminig - Librairie Pakfile
|
||||||
|
# Copyright (C) 2025 L0m1g
|
||||||
|
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
|
||||||
|
#
|
||||||
|
# Ce fichier fait partie du projet Erminig.
|
||||||
|
# Libre comme l’air, stable comme un menhir, et salé comme le beurre.
|
||||||
|
#
|
||||||
|
|
||||||
|
import os
|
||||||
|
import toml
|
||||||
|
|
||||||
|
class Pakfile:
|
||||||
|
"""
|
||||||
|
Représente un fichier de description de paquet (pakfile.toml)
|
||||||
|
dans le système de gestion de paquets Erminig.
|
||||||
|
|
||||||
|
Cette classe offre les opérations essentielles pour manipuler,
|
||||||
|
vérifier et modifier les pakfiles.
|
||||||
|
"""
|
||||||
|
|
||||||
|
BASE_PATH = "/var/govel"
|
||||||
|
|
||||||
|
def __init__(self, package: str):
|
||||||
|
"""
|
||||||
|
Initialise la gestion du pakfile pour un paquet donné.
|
||||||
|
|
||||||
|
:param package: Nom du paquet
|
||||||
|
"""
|
||||||
|
self.package = package
|
||||||
|
self.data = {}
|
||||||
|
|
||||||
|
def _load(self):
|
||||||
|
"""
|
||||||
|
Charge le contenu du pakfile en mémoire
|
||||||
|
Appelé automatiquement à l'initialisation si le fichier existe
|
||||||
|
"""
|
||||||
|
package_dir, pakfile_path = self._get_paths(package)
|
||||||
|
if not os.path.exists(pakfile_path):
|
||||||
|
raise FileNotFoundError(f"Pakfile introuvable pour {self.package} dans {pakfile_path}")
|
||||||
|
|
||||||
|
with open(pakfile_path, "r", encoding="utf-8") as f:
|
||||||
|
self.data = toml.load(f)
|
||||||
|
|
||||||
|
def _get_paths(self, package: str) -> tuple[str, str]:
|
||||||
|
"""
|
||||||
|
Retourne le chemin du dossier du paquet et du pakfile associé.
|
||||||
|
"""
|
||||||
|
package_dir = f"{self.BASE_PATH}/{package}"
|
||||||
|
pakfile_path = f"{package_dir}/pakfile.toml"
|
||||||
|
return package_dir, pakfile_path
|
||||||
|
|
||||||
|
def new(self, package: str):
|
||||||
|
"""
|
||||||
|
Crée un nouveau pakfile avec un squelette de base prêt à être édité.
|
||||||
|
Soulève une erreur si le pakfile existe déjà.
|
||||||
|
"""
|
||||||
|
package_dir, pakfile_path = self._get_paths(package)
|
||||||
|
|
||||||
|
if os.path.exists(pakfile_path):
|
||||||
|
raise FileExistsError(f"Le pakfile existe déjà pour {package}")
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"header": {
|
||||||
|
"copyright": "Copyright (C) 2025 L0m1g",
|
||||||
|
"license": "Sous licence DOUARN - Voir le fichier LICENCE pour les détails",
|
||||||
|
"author": "L0m1g",
|
||||||
|
"maintainer": "L0m1g",
|
||||||
|
"description": "Description à compléter"
|
||||||
|
},
|
||||||
|
"name": package,
|
||||||
|
"ver": "",
|
||||||
|
"rev": 1,
|
||||||
|
"src": [],
|
||||||
|
"build": "# Ajouter les commandes de construction ici",
|
||||||
|
"check": "# Ajouter les commandes check ou équivalentes ici",
|
||||||
|
"install": "# Ajouter les commandes d’installation ici"
|
||||||
|
}
|
||||||
|
|
||||||
|
os.makedirs(package_dir, exist_ok=True)
|
||||||
|
|
||||||
|
with open(pakfile_path, "w", encoding="utf-8") as f:
|
||||||
|
toml.dump(data, f)
|
||||||
|
|
||||||
|
def set(self, key: str, value):
|
||||||
|
"""
|
||||||
|
Définit une valeur dans le pakfile et sauvegarde immédiatement
|
||||||
|
"""
|
||||||
|
self.data[key] = value
|
||||||
|
self._save()
|
||||||
|
|
||||||
|
def _save(self):
|
||||||
|
"""
|
||||||
|
Ecrit le contenu actuel de self.data dans le pakfile correspondant
|
||||||
|
Créé le répertoire s'il n'existe pas.
|
||||||
|
"""
|
||||||
|
package_dir, pakfile_path = self._get_paths(self.package)
|
||||||
|
|
||||||
|
os.makedirs(package_dir, exist_ok=True)
|
||||||
|
with open(pakfile_path, "w", encoding="utf-8") as f:
|
||||||
|
toml.dump(self.data, f)
|
||||||
|
|
||||||
|
def get(self, key: str):
|
||||||
|
"""
|
||||||
|
Récupère la valeur d'une clé dans le pakfile
|
||||||
|
Redirige vers de getters spécifiques
|
||||||
|
|
||||||
|
:param key: Clé à récupérer
|
||||||
|
:return: Valeur associée ou None
|
||||||
|
"""
|
||||||
|
match key:
|
||||||
|
case "name" | "ver" | "rev":
|
||||||
|
return self._get(key)
|
||||||
|
case "src" | "deps" | "bdeps":
|
||||||
|
return self._get_list(key)
|
||||||
|
case _:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get(self, key: str) -> str | None:
|
||||||
|
"""
|
||||||
|
Getter générique pour les chaines
|
||||||
|
"""
|
||||||
|
return self.data.get(key)
|
||||||
|
|
||||||
|
def _get_list(self, key: str) -> list[str]:
|
||||||
|
"""
|
||||||
|
Getter spécifique aux listes
|
||||||
|
"""
|
||||||
|
return self.data.get(key,[])
|
||||||
|
|
||||||
|
def delete(self, package: str) -> bool:
|
||||||
|
"""
|
||||||
|
Supprime un paquet non installé et son répertoire associé.
|
||||||
|
|
||||||
|
:param package: Nom du paquet à supprimer
|
||||||
|
:return: True si la suppression a réussi, False sinon
|
||||||
|
"""
|
||||||
|
package_dir, pakfile_path = self._get_paths(package)
|
||||||
|
|
||||||
|
if not os.path.exists(package_dir):
|
||||||
|
print(f"Le paquet '{package}' n'existe pas. Rien à supprimer.")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# On vire tout le répertoire et son contenu
|
||||||
|
for root, dirs, files in os.walk(package_dir, topdown=False):
|
||||||
|
for file in files:
|
||||||
|
os.remove(os.path.join(root, file))
|
||||||
|
for dir in dirs:
|
||||||
|
os.rmdir(os.path.join(root, dir))
|
||||||
|
os.rmdir(package_dir)
|
||||||
|
|
||||||
|
print(f"Paquet '{package}' supprimé avec succès.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Erreur lors de la suppression de '{package}': {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check(self):
|
||||||
|
"""
|
||||||
|
Vérifie la validité de la structure du pakfile.
|
||||||
|
Contrôle la présence et la cohérence des clés obligatoires.
|
||||||
|
Ne vérifie PAS la disponibilité des sources ou la qualité du code, juste la structure.
|
||||||
|
"""
|
||||||
|
required_keys = {"name", "ver", "rev", "src"}
|
||||||
|
optional_keys = {"deps", "bdeps", "build", "make", "install"}
|
||||||
|
|
||||||
|
all_keys = set(self.data.keys())
|
||||||
|
unknown_keys = all_keys - required_keys - optional_keys
|
||||||
|
|
||||||
|
missing_keys = required_keys - all_keys
|
||||||
|
|
||||||
|
if missing_keys:
|
||||||
|
print(f"Clés manquantes dans {self.package}: {', '.join(missing_keys)}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if unknown_keys:
|
||||||
|
print(f"Clés inconnues dans {self.package}: {', '.join(unknown_keys)}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
Loading…
Add table
Add a link
Reference in a new issue