From af16ef8415f38ff83e33223e3aefdf75d385586d Mon Sep 17 00:00:00 2001 From: KeshavAnandCode Date: Fri, 15 May 2026 18:45:57 -0500 Subject: [PATCH] added packloader and init py --- .../foreignthon/src/foreignthon/__init__.py | 1 + packages/foreignthon/src/foreignthon/pack.py | 53 +++++++++++++++++++ .../langs/es/src/foreignthon_es/__init__.py | 4 ++ 3 files changed, 58 insertions(+) diff --git a/packages/foreignthon/src/foreignthon/__init__.py b/packages/foreignthon/src/foreignthon/__init__.py index e69de29..3dc1f76 100644 --- a/packages/foreignthon/src/foreignthon/__init__.py +++ b/packages/foreignthon/src/foreignthon/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/packages/foreignthon/src/foreignthon/pack.py b/packages/foreignthon/src/foreignthon/pack.py index e69de29..c13940f 100644 --- a/packages/foreignthon/src/foreignthon/pack.py +++ b/packages/foreignthon/src/foreignthon/pack.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import json +from functools import lru_cache +from importlib.metadata import entry_points +from pathlib import Path + +REQUIRED_SECTIONS = {"meta", "keywords", "builtins", "exceptions", "error_messages", "stdlib"} + + +class PackNotFoundError(Exception): + pass + + +class InvalidPackError(Exception): + pass + + +def _discover_packs() -> dict[str, object]: + """Find all installed language packs via entry points.""" + eps = entry_points(group="foreignthon.langs") + return {ep.name: ep.load() for ep in eps} + + +@lru_cache(maxsize=16) +def load_pack(lang_code: str) -> dict: + """Load and validate a language pack by its code (e.g. 'es', 'ta').""" + packs = _discover_packs() + + if lang_code not in packs: + available = ", ".join(packs.keys()) or "none" + raise PackNotFoundError( + f"No language pack found for '{lang_code}'. " + f"Available: {available}. " + f"Try: pip install foreignthon-{lang_code}" + ) + + module = packs[lang_code] + pack_path: Path = module.get_pack_path() + + with open(pack_path, encoding="utf-8") as f: + data = json.load(f) + + _validate(data, lang_code) + return data + + +def _validate(data: dict, lang_code: str) -> None: + missing = REQUIRED_SECTIONS - data.keys() + if missing: + raise InvalidPackError( + f"Language pack '{lang_code}' is missing sections: {missing}" + ) diff --git a/packages/langs/es/src/foreignthon_es/__init__.py b/packages/langs/es/src/foreignthon_es/__init__.py index e69de29..2afb9d8 100644 --- a/packages/langs/es/src/foreignthon_es/__init__.py +++ b/packages/langs/es/src/foreignthon_es/__init__.py @@ -0,0 +1,4 @@ +from importlib.resources import files + +def get_pack_path(): + return files(__name__) / "es.json"