Source code for materia_epd.resources

# src/materia/resources.py
from __future__ import annotations

from functools import lru_cache
from importlib.resources import as_file, files

from materia_epd.io import files as io_files
from materia_epd.io.paths import USER_DATA_DIR


[docs] @lru_cache(maxsize=None) def load_json_from_package(*path_parts): """Load and cache a JSON file from the package data folder.""" resource = files(__package__).joinpath("data", *path_parts) with as_file(resource) as path: data = io_files.read_json_file(path) if data is None: raise ValueError(f"Invalid or missing JSON file: {'/'.join(path_parts)}") return data
[docs] def iter_json_from_package_folder(*folder_parts: str): """Yield (filename, data) from all JSON files in a package folder.""" folder = files(__package__).joinpath("data", *folder_parts) with as_file(folder) as folder_path: yield from io_files.gen_json_objects(folder_path)
[docs] @lru_cache(maxsize=1) def get_regions_mapping(): return load_json_from_package("regions_mapping.json")
[docs] @lru_cache(maxsize=1) def get_indicator_synonyms(): return load_json_from_package("indicator_synonyms.json")
[docs] @lru_cache(maxsize=1) def get_market_shares(loc_code: str, hs_code: str): filename = f"{hs_code}.json" subfolder = f"market_shares/{loc_code}" resource = files(__package__).joinpath("data", subfolder, filename) if resource.is_file(): with as_file(resource) as path: data = io_files.read_json_file(path) if data is not None: return data user_file = USER_DATA_DIR / subfolder / filename if user_file.exists(): data = io_files.read_json_file(user_file) if data is not None: return data from materia_epd.market.market import generate_market data = generate_market(loc_code, hs_code) user_file.parent.mkdir(parents=True, exist_ok=True) io_files.write_json_file(user_file, data) print(f"Market share for imports of {hs_code} to {loc_code} stored in {user_file}.") return data
[docs] def get_comtrade_api_key(): api_file = USER_DATA_DIR / "comtrade_api_key.json" if api_file.exists(): data = io_files.read_json_file(api_file) if data and "apikey" in data: return data["apikey"] api_key = input("Enter your Comtrade API key: ").strip() if not api_key: raise ValueError("API key cannot be empty.") api_file.parent.mkdir(parents=True, exist_ok=True) io_files.write_json_file(api_file, {"apikey": api_key}) print(f"API key stored in {api_file}.") return api_key
[docs] @lru_cache(maxsize=1) def get_location_data(loc_code: str): return load_json_from_package("locations", f"{loc_code}.json")