/
hyperruss
/
ku2
Обзор
Документация
Войти
/
hyperruss
/
ku2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
cli.py
177 строк
6 KB
Игорь Грибунов
Реализован парсер CLI
08 ноя 2025, 12:03
08 ноя 2025, 12:03
377dc01
Код
Авторство
О чём код?
""" Этап 1: Минимальный прототип с конфигурацией Парсер параметров командной строки для CLI-приложения """ import argparse import sys from typing import Optional def parse_args() -> argparse.Namespace: """ Парсит аргументы командной строки Требуемые параметры: - --package: имя анализируемого пакета (обязательно) Опциональные параметры: - --repo: URL репозитория или путь к тестовому файлу - --test: режим работы с тестовым репозиторием - --output: имя файла с изображением (по умолчанию: graph.png) - --ascii-tree: вывод зависимостей в формате ASCII-дерева - --max-depth: максимальная глубина анализа """ parser = argparse.ArgumentParser( description='Инструмент визуализации графа зависимостей NuGet' ) # Обязательный параметр parser.add_argument( '--package', required=True, help='Имя анализируемого пакета' ) # Опциональные параметры parser.add_argument( '--repo', default=None, help='URL репозитория или путь к файлу тестового репозитория' ) parser.add_argument( '--test', action='store_true', help='Включить режим работы с тестовым репозиторием' ) parser.add_argument( '--output', default='graph.png', help='Имя сгенерированного файла с изображением графа (по умолчанию: graph.png)' ) parser.add_argument( '--ascii-tree', action='store_true', help='Вывод зависимостей в формате ASCII-дерева' ) parser.add_argument( '--max-depth', type=int, default=None, help='Максимальная глубина анализа зависимостей' ) parser.add_argument( '--version', action='version', version='%(prog)s 1.0' ) args = parser.parse_args() # Валидация параметров _validate_args(args) return args def _validate_args(args: argparse.Namespace) -> None: """ Валидирует аргументы командной строки Args: args: Распарсенные аргументы Raises: SystemExit: При ошибках валидации """ errors = [] # Проверка имени пакета if not args.package or not isinstance(args.package, str): errors.append("❌ Ошибка: --package должен быть непустой строкой") elif len(args.package.strip()) == 0: errors.append("❌ Ошибка: --package не может быть пустой строкой") # Проверка режимов репозитория if args.test and not args.repo: errors.append("❌ Ошибка: при --test необходимо указать --repo (путь к файлу)") if not args.test and not args.repo: errors.append("❌ Ошибка: необходимо указать --repo или включить --test режим") # Проверка расширения файла вывода valid_extensions = ('.png', '.d2') if args.output and not args.output.lower().endswith(valid_extensions): errors.append(f"❌ Ошибка: --output должен заканчиваться на {valid_extensions}") # Проверка max-depth if args.max_depth is not None: if args.max_depth < 0: errors.append("❌ Ошибка: --max-depth должен быть положительным числом") elif args.max_depth == 0: errors.append("❌ Ошибка: --max-depth должен быть >= 1") # Если есть ошибки, выводим их и выходим if errors: print("\n".join(errors)) sys.exit(1) def print_config(args: argparse.Namespace) -> None: """ Выводит все настроенные параметры в формате ключ-значение Args: args: Распарсенные аргументы """ print("\n" + "="*50) print("📋 ПАРАМЕТРЫ КОНФИГУРАЦИИ") print("="*50) params = { "package": args.package, "repo": args.repo if args.repo else "не указан", "test_mode": "✓ включен" if args.test else "✗ отключен", "output_file": args.output, "ascii_tree": "✓ включен" if args.ascii_tree else "✗ отключен", "max_depth": args.max_depth if args.max_depth else "не ограничена", } for key, value in params.items(): print(f"{key:.<30} {value}") print("="*50 + "\n") def main(): """Основная функция для демонстрации этапа 1""" try: # Парсим аргументы args = parse_args() # Выводим конфигурацию print_config(args) print("✅ Этап 1 завершен успешно!\n") print("Параметры успешно загружены и валидированы.") print("Переход к этапу 2: Сбор данных о зависимостях...\n") return 0 except KeyboardInterrupt: print("\n\n⚠️ Прервано пользователем") return 130 except Exception as e: print(f"\n❌ Непредвиденная ошибка: {e}") import traceback traceback.print_exc() return 1 if __name__ == '__main__': sys.exit(main())