добавила команду search для поиска пакетов
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
# mypkg/cli/main.py
|
# mypkg/cli/main.py
|
||||||
|
#!/usr/bin/env python3
|
||||||
import argparse
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
from ..core.package_manager import PackageManager
|
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():
|
def main():
|
||||||
@@ -21,7 +22,7 @@ def main():
|
|||||||
install_parser = subparsers.add_parser('install', help='Установить пакет')
|
install_parser = subparsers.add_parser('install', help='Установить пакет')
|
||||||
install_parser.add_argument('package', help='Имя пакета')
|
install_parser.add_argument('package', help='Имя пакета')
|
||||||
|
|
||||||
# remove (НОВАЯ КОМАНДА)
|
# remove
|
||||||
remove_parser = subparsers.add_parser('remove', help='Удалить пакет')
|
remove_parser = subparsers.add_parser('remove', help='Удалить пакет')
|
||||||
remove_parser.add_argument('package', help='Имя пакета')
|
remove_parser.add_argument('package', help='Имя пакета')
|
||||||
remove_parser.add_argument('--force', action='store_true',
|
remove_parser.add_argument('--force', action='store_true',
|
||||||
@@ -29,8 +30,15 @@ def main():
|
|||||||
|
|
||||||
# list
|
# list
|
||||||
list_parser = subparsers.add_parser('list', help='Список установленных пакетов')
|
list_parser = subparsers.add_parser('list', help='Список установленных пакетов')
|
||||||
|
|
||||||
|
# info
|
||||||
info_parser = subparsers.add_parser('info', help='Информация о пакете')
|
info_parser = subparsers.add_parser('info', help='Информация о пакете')
|
||||||
info_parser.add_argument('package', 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()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if not args.command:
|
if not args.command:
|
||||||
@@ -54,19 +62,34 @@ def main():
|
|||||||
for pkg in packages:
|
for pkg in packages:
|
||||||
print(f" {pkg.name} ({pkg.version})")
|
print(f" {pkg.name} ({pkg.version})")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
elif args.command == 'info':
|
elif args.command == 'info':
|
||||||
info = pm.info(args.package)
|
info = pm.info(args.package)
|
||||||
if info:
|
if info:
|
||||||
print(f"📦 Пакет: {info['name']}")
|
print_package(f"Пакет: {info['name']}")
|
||||||
print(f" Версия: {info['version']}")
|
print(f" Версия: {info['version']}")
|
||||||
print(f" Описание: {info['description']}")
|
print(f" Описание: {info['description']}")
|
||||||
if info['depends']:
|
if info.get('depends'):
|
||||||
print(f" Зависимости: {', '.join(info['depends'])}")
|
print(f" Зависимости: {', '.join(info['depends'])}")
|
||||||
else:
|
else:
|
||||||
print(f" Зависимости: нет")
|
print(f" Зависимости: нет")
|
||||||
print(f" Файлы ({len(info['files'])}):")
|
print(f" Файлы ({len(info['files'])}):")
|
||||||
for f in info['files']:
|
for f in info['files']:
|
||||||
print(f" {f['destination']}")
|
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__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ class PackageManager:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def remove(self, package_name: str, force: bool = False) -> bool:
|
def remove(self, package_name: str, force: bool = False) -> bool:
|
||||||
"""Удаляет пакет"""
|
|
||||||
print_step(f"Поиск пакета {package_name}...")
|
print_step(f"Поиск пакета {package_name}...")
|
||||||
|
|
||||||
if not self.db.is_installed(package_name):
|
if not self.db.is_installed(package_name):
|
||||||
@@ -77,30 +76,21 @@ class PackageManager:
|
|||||||
|
|
||||||
print_step(f"Удаление {pkg.full_name()}...")
|
print_step(f"Удаление {pkg.full_name()}...")
|
||||||
|
|
||||||
# Удаляем файлы
|
|
||||||
for file_info in pkg.files:
|
for file_info in pkg.files:
|
||||||
dst = os.path.join(self.root, file_info["destination"].lstrip("/"))
|
dst = os.path.join(self.root, file_info["destination"].lstrip("/"))
|
||||||
if os.path.exists(dst):
|
if os.path.exists(dst):
|
||||||
os.remove(dst)
|
os.remove(dst)
|
||||||
print_step(f" Удалён: {dst}")
|
print_step(f" Удалён: {dst}")
|
||||||
|
|
||||||
# Удаляем из базы данных
|
|
||||||
self.db.remove_package(package_name)
|
self.db.remove_package(package_name)
|
||||||
|
|
||||||
print_success(f"Пакет {package_name} удалён")
|
print_success(f"Пакет {package_name} удалён")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def list_installed(self) -> List[Package]:
|
|
||||||
return list(self.db.installed.values())
|
|
||||||
|
|
||||||
def info(self, package_name: str):
|
def info(self, package_name: str):
|
||||||
"""Показывает информацию о пакете"""
|
from ..utils.colors import print_error
|
||||||
from ..utils.colors import print_error, print_info
|
|
||||||
|
|
||||||
# Сначала ищем в установленных
|
|
||||||
pkg = self.db.get_package(package_name)
|
pkg = self.db.get_package(package_name)
|
||||||
|
|
||||||
# Если не установлен, ищем в репозитории
|
|
||||||
if not pkg:
|
if not pkg:
|
||||||
meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json")
|
meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json")
|
||||||
if not os.path.exists(meta_path):
|
if not os.path.exists(meta_path):
|
||||||
@@ -109,9 +99,6 @@ class PackageManager:
|
|||||||
with open(meta_path, 'r') as f:
|
with open(meta_path, 'r') as f:
|
||||||
pkg_data = json.load(f)
|
pkg_data = json.load(f)
|
||||||
pkg = Package(**pkg_data)
|
pkg = Package(**pkg_data)
|
||||||
else:
|
|
||||||
# Это установленный пакет
|
|
||||||
pass
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'name': pkg.name,
|
'name': pkg.name,
|
||||||
@@ -121,4 +108,29 @@ class PackageManager:
|
|||||||
'files': pkg.files,
|
'files': pkg.files,
|
||||||
'installed': pkg.installed,
|
'installed': pkg.installed,
|
||||||
'install_date': pkg.install_date
|
'install_date': pkg.install_date
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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())
|
||||||
Reference in New Issue
Block a user