From 3d43f3ee663ed77a076c612587c2bc8ad3874075 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:36:19 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20wip=20refactoring=20builde?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 5 +- src/elironwars/mob/__init__.py | 19 ++++ src/elironwars/mob/character_builder.py | 105 ------------------ src/elironwars/mob/default_builder.py | 65 +++++++++++ ...aracter_builder.py => pydantic_builder.py} | 0 tests/test_character_builder.py | 2 +- 6 files changed, 87 insertions(+), 109 deletions(-) delete mode 100644 src/elironwars/mob/character_builder.py create mode 100644 src/elironwars/mob/default_builder.py rename src/elironwars/mob/{pydantic_character_builder.py => pydantic_builder.py} (100%) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 413cc28..51cad90 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -2,8 +2,7 @@ import sys from .level import Level from .menu import Action, action_menu -from .mob.base_mob import BaseMob -from .mob.character_builder import CharacterBuilder +from .mob import BaseMob, load_character, save_character def play_room(room: list[BaseMob], level: Level) -> int: @@ -44,7 +43,7 @@ def play_donjon(level: Level) -> None: def app() -> None: - loaded_character = CharacterBuilder.load_character(sys.argv[1] if len(sys.argv) > 1 else "Jamin") + loaded_character = load_character(sys.argv[1] if len(sys.argv) > 1 else "Jamin") if not loaded_character: sys.exit(-1) diff --git a/src/elironwars/mob/__init__.py b/src/elironwars/mob/__init__.py index e69de29..9a8ab10 100644 --- a/src/elironwars/mob/__init__.py +++ b/src/elironwars/mob/__init__.py @@ -0,0 +1,19 @@ +import importlib.util +import os +import sys + +from .base_mob import BaseMob + +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': + from .pydantic_builder import load_character, save_character +else: + from .default_builder import load_character, save_character diff --git a/src/elironwars/mob/character_builder.py b/src/elironwars/mob/character_builder.py deleted file mode 100644 index 713f7e3..0000000 --- a/src/elironwars/mob/character_builder.py +++ /dev/null @@ -1,105 +0,0 @@ -import importlib.util -import json -import os -import sys -from typing import Callable - -from .base_mob import BaseMob - - -class CharacterBuilder: - save_character_impl: Callable[[BaseMob], str] - load_character_impl: Callable[[str], None] - - @classmethod - def build_character(cls): - """Demande à l'utilisateur de saisir les attributs du personnage.""" - print("Création d'un nouveau personnage :") - name = input("Nom du personnage : ") - max_pv = int(input("Points de vie maximum : ")) - strength = int(input("Force : ")) - protection = int(input("Protection : ")) - speed = int(input("Vitesse : ")) - mob_type = 0 - return BaseMob(name, max_pv, strength, protection, speed, mob_type) - - @classmethod - 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.""" - character_data = { - "name": character.name, - "max_pv": character.max_pv, - "current_pv": character.current_pv, - "strength": character.strength, - "protection": character.protection, - "speed": character.speed, - "mob_type": character.mob_type - } - filename = character.name + ".json" - with open(filename, "w", encoding='UTF-8') as file: - json.dump(character_data, file, indent=4) - return filename - - -def load_character(name: str) -> BaseMob | None: - """Charge un personnage à partir d'un fichier JSON.""" - filename = name + ".json" - if not os.path.exists(filename): - print(f"Erreur : Le fichier {filename} n'existe pas.") - return None - - try: - with open(filename, "r", encoding='UTF-8') as file: - character_data = json.load(file) - - # Vérification des clés essentielles dans le JSON pour éviter les erreurs - required_keys = ["name", "max_pv", "current_pv", - "strength", "protection", "speed", "mob_type"] - if not all(key in character_data for key in required_keys): - print(f"Erreur : Le fichier {filename} ne contient pas toutes les clés nécessaires.") - return None - - # Construction du personnage - return BaseMob( - name=character_data["name"], - max_pv=character_data["max_pv"], - strength=character_data["strength"], - protection=character_data["protection"], - speed=character_data["speed"], - mob_type=character_data["mob_type"] - ) - except json.JSONDecodeError: - print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.") - 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 diff --git a/src/elironwars/mob/default_builder.py b/src/elironwars/mob/default_builder.py new file mode 100644 index 0000000..a8f29c9 --- /dev/null +++ b/src/elironwars/mob/default_builder.py @@ -0,0 +1,65 @@ +import json +import os + +from .base_mob import BaseMob + + +def build_character(): + """Demande à l'utilisateur de saisir les attributs du personnage.""" + print("Création d'un nouveau personnage :") + name = input("Nom du personnage : ") + max_pv = int(input("Points de vie maximum : ")) + strength = int(input("Force : ")) + protection = int(input("Protection : ")) + speed = int(input("Vitesse : ")) + mob_type = 0 + return BaseMob(name, max_pv, strength, protection, speed, mob_type) + + +def save_character(character: BaseMob) -> str: + """Enregistre un personnage dans un fichier JSON.""" + character_data = { + "name": character.name, + "max_pv": character.max_pv, + "current_pv": character.current_pv, + "strength": character.strength, + "protection": character.protection, + "speed": character.speed, + "mob_type": character.mob_type + } + filename = character.name + ".json" + with open(filename, "w", encoding='UTF-8') as file: + json.dump(character_data, file, indent=4) + return filename + + +def load_character(name: str) -> BaseMob | None: + """Charge un personnage à partir d'un fichier JSON.""" + filename = name + ".json" + if not os.path.exists(filename): + print(f"Erreur : Le fichier {filename} n'existe pas.") + return None + + try: + with open(filename, "r", encoding='UTF-8') as file: + character_data = json.load(file) + + # Vérification des clés essentielles dans le JSON pour éviter les erreurs + required_keys = ["name", "max_pv", "current_pv", + "strength", "protection", "speed", "mob_type"] + if not all(key in character_data for key in required_keys): + print(f"Erreur : Le fichier {filename} ne contient pas toutes les clés nécessaires.") + return None + + # Construction du personnage + return BaseMob( + name=character_data["name"], + max_pv=character_data["max_pv"], + strength=character_data["strength"], + protection=character_data["protection"], + speed=character_data["speed"], + mob_type=character_data["mob_type"] + ) + except json.JSONDecodeError: + print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.") + return None diff --git a/src/elironwars/mob/pydantic_character_builder.py b/src/elironwars/mob/pydantic_builder.py similarity index 100% rename from src/elironwars/mob/pydantic_character_builder.py rename to src/elironwars/mob/pydantic_builder.py diff --git a/tests/test_character_builder.py b/tests/test_character_builder.py index 18518d9..e3e0414 100644 --- a/tests/test_character_builder.py +++ b/tests/test_character_builder.py @@ -4,7 +4,7 @@ import unittest from unittest.mock import patch from elironwars.mob.base_mob import BaseMob -from elironwars.mob.character_builder import CharacterBuilder +from elironwars.mob.default_builder import CharacterBuilder ARTHUR_JSON = """{ "name": "Arthur",