import uuid from pathlib import Path from modelspace.Essentials import SetsDict from modelspace.ModelPackage import ModelPackage class ModelPackageSubRepository: def __init__(self, path, seed): path.mkdir(exist_ok=True) self.path = Path(path) self.seed = seed self.packages: dict[str, ModelPackage] | None = None self.resources: SetsDict | None = None self.reload() # Completed def _reload_packages(self): self.packages = dict() try: dirs = [item.name for item in self.path.iterdir() if item.is_dir()] except OSError as e: print(f"Ошибка доступа к директории: {e}") dirs = [] for d in dirs: package = ModelPackage.load(str(self.path / d)) self.packages[package.uuid] = package # Completed def _reload_resources(self): self.resources = SetsDict() for pkg_id, package in self.packages.items(): for resource in package.provides: self.resources.add(resource, pkg_id) def reload(self): self._reload_packages() self._reload_resources() # debugged def resources_from_pkg_list(self, uuids: list[str]): selected_packages = [] for pkg_id in uuids: package = self.packages.get(pkg_id, None) selected_packages.append(package) resources = SetsDict() for package in selected_packages: for resource in package.provides: resources.add(resource, package.uuid) return resources @staticmethod def deps_from_pkg_list(packages: list[ModelPackage]) -> set[str]: res = set() for package in packages: res = res | set(package.dependencies) return res # debugged def packages_by_resource(self, resource): packages_ids = self.resources.by_key(resource) if not packages_ids or len(packages_ids) == 0: raise RuntimeError(f"{resource}: There are no packages in the repository that provide this resource") else: packages_ids = list(packages_ids) packages: set[ModelPackage] = set() for pkg_id in packages_ids: packages.add(self.package_by_id(pkg_id)) return packages # debugged def package_by_id(self, pkg_id): package = self.packages.get(pkg_id, None) if not package: raise RuntimeError(f"{pkg_id}: Something went wrong while reading package info") return package def add_package_interactive(self) -> ModelPackage: """Добавляет новый пакет модели интерактивно""" # Генерируем новый UUID package_uuid = str(uuid.uuid4()) # Создаем путь к новому пакету package_path = self.path / package_uuid # Вызываем интерактивное создание пакета package = ModelPackage.interactive(str(package_path), package_uuid) loaded_package = ModelPackage.load(str(package_path)) self.packages[loaded_package.uuid] = loaded_package return package