From 664b87e63155f61103d2f801e7b15c3cf9941c66 Mon Sep 17 00:00:00 2001 From: 24_ChernovaSS <24_ChernovaSS@iux.local> Date: Thu, 7 May 2026 23:59:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83=20search=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mypkg/cli/main.py | 31 ++++++++++++++++++++++---- mypkg/core/package_manager.py | 42 ++++++++++++++++++++++------------- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/mypkg/cli/main.py b/mypkg/cli/main.py index 9e9460f..872e568 100644 --- a/mypkg/cli/main.py +++ b/mypkg/cli/main.py @@ -1,8 +1,9 @@ # mypkg/cli/main.py +#!/usr/bin/env python3 import argparse import sys from ..core.package_manager import PackageManager -from ..utils.colors import print_info, print_package, print_error +from ..utils.colors import print_info, print_package, print_error, print_step def main(): @@ -21,7 +22,7 @@ def main(): install_parser = subparsers.add_parser('install', help='Установить пакет') install_parser.add_argument('package', help='Имя пакета') - # remove (НОВАЯ КОМАНДА) + # remove remove_parser = subparsers.add_parser('remove', help='Удалить пакет') remove_parser.add_argument('package', help='Имя пакета') remove_parser.add_argument('--force', action='store_true', @@ -29,8 +30,15 @@ def main(): # list list_parser = subparsers.add_parser('list', help='Список установленных пакетов') + + # info info_parser = subparsers.add_parser('info', help='Информация о пакете') info_parser.add_argument('package', help='Имя пакета') + + # search (НОВАЯ КОМАНДА) + search_parser = subparsers.add_parser('search', help='Поиск пакетов в репозитории') + search_parser.add_argument('keyword', help='Ключевое слово для поиска') + args = parser.parse_args() if not args.command: @@ -54,19 +62,34 @@ def main(): for pkg in packages: print(f" {pkg.name} ({pkg.version})") sys.exit(0) + elif args.command == 'info': info = pm.info(args.package) if info: - print(f"📦 Пакет: {info['name']}") + print_package(f"Пакет: {info['name']}") print(f" Версия: {info['version']}") print(f" Описание: {info['description']}") - if info['depends']: + if info.get('depends'): print(f" Зависимости: {', '.join(info['depends'])}") else: print(f" Зависимости: нет") print(f" Файлы ({len(info['files'])}):") for f in info['files']: print(f" {f['destination']}") + if info.get('installed'): + print(f" ✅ Установлен") + else: + print(f" ❌ Не установлен") + + elif args.command == 'search': # НОВАЯ КОМАНДА + results = pm.search(args.keyword) + if not results: + print_info(f"Ничего не найдено по запросу '{args.keyword}'") + else: + print(f"🔍 Найдено пакетов: {len(results)}") + for pkg in results: + print(f" 📦 {pkg.name} ({pkg.version}) - {pkg.description}") + sys.exit(0) if __name__ == '__main__': diff --git a/mypkg/core/package_manager.py b/mypkg/core/package_manager.py index 53da5ed..e01c884 100644 --- a/mypkg/core/package_manager.py +++ b/mypkg/core/package_manager.py @@ -66,7 +66,6 @@ class PackageManager: return True def remove(self, package_name: str, force: bool = False) -> bool: - """Удаляет пакет""" print_step(f"Поиск пакета {package_name}...") if not self.db.is_installed(package_name): @@ -77,30 +76,21 @@ class PackageManager: print_step(f"Удаление {pkg.full_name()}...") - # Удаляем файлы for file_info in pkg.files: dst = os.path.join(self.root, file_info["destination"].lstrip("/")) if os.path.exists(dst): os.remove(dst) print_step(f" Удалён: {dst}") - # Удаляем из базы данных self.db.remove_package(package_name) - print_success(f"Пакет {package_name} удалён") return True - def list_installed(self) -> List[Package]: - return list(self.db.installed.values()) - def info(self, package_name: str): - """Показывает информацию о пакете""" - from ..utils.colors import print_error, print_info + from ..utils.colors import print_error - # Сначала ищем в установленных pkg = self.db.get_package(package_name) - # Если не установлен, ищем в репозитории if not pkg: meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json") if not os.path.exists(meta_path): @@ -109,9 +99,6 @@ class PackageManager: with open(meta_path, 'r') as f: pkg_data = json.load(f) pkg = Package(**pkg_data) - else: - # Это установленный пакет - pass return { 'name': pkg.name, @@ -121,4 +108,29 @@ class PackageManager: 'files': pkg.files, 'installed': pkg.installed, 'install_date': pkg.install_date - } \ No newline at end of file + } + + def search(self, keyword: str): + """Ищет пакеты в репозитории по ключевому слову""" + results = [] + packages_dir = os.path.join(self.repo_path, "packages") + + if not os.path.exists(packages_dir): + return results + + for pkg_name in os.listdir(packages_dir): + meta_path = os.path.join(packages_dir, pkg_name, "meta.json") + if os.path.exists(meta_path): + with open(meta_path, 'r') as f: + pkg_data = json.load(f) + + keyword_lower = keyword.lower() + if (keyword_lower in pkg_data.get('name', '').lower() or + keyword_lower in pkg_data.get('description', '').lower()): + pkg = Package(**pkg_data) + results.append(pkg) + + return results + + def list_installed(self) -> List[Package]: + return list(self.db.installed.values()) \ No newline at end of file