Compare commits

7 Commits

Author SHA1 Message Date
toucan_dev 8ce78103d0 🎨 code format 2026-07-26 15:38:04 +02:00
toucan_dev 5cffcba502 🐛 fix UI not propagated 2026-07-26 15:33:12 +02:00
toucan_dev 3d7a03fb2b list log levels in CLI 2026-07-26 15:26:45 +02:00
toucan_dev 7e26db26c7 ♻️ use entrypoint to load UI 2026-07-26 15:24:44 +02:00
toucan_dev 732afb65c5 test entrypoint class 2026-07-26 15:15:32 +02:00
toucan_dev 2c2e3b0597 entrypoint class 2026-07-26 15:15:23 +02:00
toucan_dev 181b928c25 🔧 define UI entrypoint 2026-07-26 14:46:22 +02:00
4 changed files with 57 additions and 3 deletions
+3
View File
@@ -30,6 +30,9 @@ build-backend = "setuptools.build_meta"
[project.scripts]
elironwars = "elironwars.app:app"
[project.entry-points."elironwars.ui"]
console = "elironwars.console:ConsoleUi"
[tool.isort]
profile = "black"
src_paths = ["src", "tests"]
+11 -3
View File
@@ -2,14 +2,18 @@ import argparse
import logging
import os
import sys
from typing import Any
from .console import UI
from .entrypoints import Entrypoints
from .level import Level
from .menu import Action
from .mob import BaseMob, load_character
logger = logging.getLogger(__name__)
# FIXME replace this global declaration
UI: Any = None
def play_room(room: list[BaseMob], level: Level) -> int:
if room is None:
@@ -55,13 +59,15 @@ def play_donjon(level: Level) -> None:
def app() -> None:
entrypoints = Entrypoints()
parser = argparse.ArgumentParser(
prog='elironwars',
description='elironwars CLI',
)
parser.add_argument('--player', default='Jamin')
parser.add_argument('--ui', default='cli')
parser.add_argument('--log-level', default='ERROR')
parser.add_argument('--ui', default='console', choices=entrypoints.ui.names)
parser.add_argument('--log-level', default='ERROR', choices=logging.getLevelNamesMapping().keys())
args = parser.parse_args()
os.makedirs('logs', exist_ok=True)
@@ -72,6 +78,8 @@ def app() -> None:
if not loaded_character:
sys.exit(-1)
global UI
UI = entrypoints.load_ui(args.ui)
UI.select_player(loaded_character)
# Créer des instances de BaseMob
+18
View File
@@ -0,0 +1,18 @@
import logging
from importlib.metadata import entry_points
logger = logging.getLogger(__name__)
class Entrypoints:
def __init__(self):
self.ui = entry_points(group='elironwars.ui')
def load_ui(self, ui):
logger.info('Loading ui %s', ui)
try:
ui_class = self.ui[ui].load()
return ui_class()
except KeyError:
logger.critical('Unable to load ui %s', ui)
+25
View File
@@ -0,0 +1,25 @@
import unittest
from elironwars.console import ConsoleUi
from elironwars.entrypoints import Entrypoints
class TestEntrypoints(unittest.TestCase):
def test_load_console_ui(self):
console_ep = 'console'
ep = Entrypoints()
self.assertIn(console_ep, ep.ui.names)
self.assertIsInstance(ep.load_ui(console_ep), ConsoleUi)
def test_load_unknown_ui(self):
unknown_ep = 'unknown'
ep = Entrypoints()
self.assertNotIn(unknown_ep, ep.ui.names)
self.assertIsNone(ep.load_ui(unknown_ep), ConsoleUi)
if __name__ == "__main__":
unittest.main()