♻️ dynamic import of loader

This commit is contained in:
anthony-melin
2026-05-19 23:43:20 +02:00
parent a4a1771aef
commit 7c2c929966
+49 -10
View File
@@ -1,11 +1,18 @@
from base_mob import BaseMob import importlib.util
import json import json
import os import os
import sys
from typing import Callable
from base_mob import BaseMob
class CharacterBuilder: class CharacterBuilder:
@staticmethod save_character_impl: Callable[[BaseMob], str]
def build_character(): load_character_impl: Callable[[str], None]
@classmethod
def build_character(cls):
"""Demande à l'utilisateur de saisir les attributs du personnage.""" """Demande à l'utilisateur de saisir les attributs du personnage."""
print("Création d'un nouveau personnage :") print("Création d'un nouveau personnage :")
name = input("Nom du personnage : ") name = input("Nom du personnage : ")
@@ -16,8 +23,22 @@ class CharacterBuilder:
mob_type = 0 mob_type = 0
return BaseMob(name, max_pv, strength, protection, speed, mob_type) return BaseMob(name, max_pv, strength, protection, speed, mob_type)
@staticmethod @classmethod
def save_character(character): def save_character(cls, character: BaseMob) -> None:
"""Enregistre un personnage dans un fichier JSON."""
filename = cls.save_character_impl(character)
print(f"Personnage enregistré dans {filename}.")
@classmethod
def load_character(cls, name: str) -> BaseMob | None:
"""Charge un personnage à partir d'un fichier JSON."""
try:
return cls.load_character_impl(name)
except Exception as e:
return None
def save_character(character: BaseMob) -> str:
"""Enregistre un personnage dans un fichier JSON.""" """Enregistre un personnage dans un fichier JSON."""
character_data = { character_data = {
"name": character.name, "name": character.name,
@@ -29,12 +50,12 @@ class CharacterBuilder:
"mob_type": character.mob_type "mob_type": character.mob_type
} }
filename = character.name + ".json" filename = character.name + ".json"
with open(filename, "w",encoding='UTF-8') as file: with open(filename, "w", encoding='UTF-8') as file:
json.dump(character_data, file, indent=4) json.dump(character_data, file, indent=4)
print(f"Personnage enregistré dans {filename}.") return filename
@staticmethod
def load_character(name): def load_character(name: str) -> BaseMob | None:
"""Charge un personnage à partir d'un fichier JSON.""" """Charge un personnage à partir d'un fichier JSON."""
filename = name + ".json" filename = name + ".json"
if not os.path.exists(filename): if not os.path.exists(filename):
@@ -42,7 +63,7 @@ class CharacterBuilder:
return None return None
try: try:
with open(filename, "r",encoding='UTF-8') as file: with open(filename, "r", encoding='UTF-8') as file:
character_data = json.load(file) character_data = json.load(file)
# Vérification des clés essentielles dans le JSON pour éviter les erreurs # Vérification des clés essentielles dans le JSON pour éviter les erreurs
@@ -64,3 +85,21 @@ class CharacterBuilder:
except json.JSONDecodeError: except json.JSONDecodeError:
print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.") print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.")
return None return None
pydantic = None
name = 'pydantic'
if name in sys.modules:
pydantic = sys.modules[name]
elif (spec := importlib.util.find_spec(name)) is not None:
pydantic = importlib.util.module_from_spec(spec)
sys.modules[name] = pydantic
spec.loader.exec_module(pydantic)
if pydantic and os.environ.get('ELIRON_BUILDER') == 'pydantic':
pydantic_character_builder = importlib.import_module('pydantic_character_builder')
CharacterBuilder.save_character_impl = pydantic_character_builder.save_character
CharacterBuilder.load_character_impl = pydantic_character_builder.load_character
else:
CharacterBuilder.save_character_impl = save_character
CharacterBuilder.load_character_impl = load_character