188 lines
7.4 KiB
Python
188 lines
7.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Скрипт для миграции с старой структуры проекта на новую.
|
|
Этот скрипт помогает в процессе перехода на новую архитектуру проекта.
|
|
"""
|
|
|
|
import os
|
|
import shutil
|
|
import json
|
|
from pathlib import Path
|
|
|
|
def backup_old_structure():
|
|
"""Создание резервной копии старой структуры."""
|
|
backup_dir = "backup_old_structure"
|
|
|
|
if os.path.exists(backup_dir):
|
|
print(f"Директория {backup_dir} уже существует. Пропускаем создание резервной копии.")
|
|
return
|
|
|
|
print("Создание резервной копии старой структуры...")
|
|
os.makedirs(backup_dir, exist_ok=True)
|
|
|
|
# Список файлов для резервного копирования
|
|
files_to_backup = [
|
|
"app/__init__.py",
|
|
"app/async_tasks.py",
|
|
"app/audio_processor.py",
|
|
"app/audio_sources.py",
|
|
"app/audio_utils.py",
|
|
"app/cache.py",
|
|
"app/context_managers.py",
|
|
"app/file_manager.py",
|
|
"app/history_logger.py",
|
|
"app/logging_config.py",
|
|
"app/request_logger.py",
|
|
"app/routes.py",
|
|
"app/transcriber_service.py",
|
|
"app/transcriber.py",
|
|
"app/utils.py",
|
|
"app/validators.py"
|
|
]
|
|
|
|
for file_path in files_to_backup:
|
|
if os.path.exists(file_path):
|
|
backup_path = os.path.join(backup_dir, file_path)
|
|
os.makedirs(os.path.dirname(backup_path), exist_ok=True)
|
|
shutil.copy2(file_path, backup_path)
|
|
print(f"Скопирован файл: {file_path} -> {backup_path}")
|
|
|
|
print("Резервная копия создана успешно.")
|
|
|
|
def check_new_structure():
|
|
"""Проверка наличия новой структуры."""
|
|
required_dirs = [
|
|
"app/api",
|
|
"app/core",
|
|
"app/audio",
|
|
"app/infrastructure",
|
|
"app/infrastructure/logging",
|
|
"app/infrastructure/storage",
|
|
"app/infrastructure/async_tasks",
|
|
"app/infrastructure/validation",
|
|
"app/shared"
|
|
]
|
|
|
|
missing_dirs = []
|
|
|
|
for dir_path in required_dirs:
|
|
if not os.path.exists(dir_path):
|
|
missing_dirs.append(dir_path)
|
|
|
|
if missing_dirs:
|
|
print("Отсутствуют следующие директории:")
|
|
for dir_path in missing_dirs:
|
|
print(f" - {dir_path}")
|
|
print("Пожалуйста, сначала создайте новую структуру директорий.")
|
|
return False
|
|
|
|
print("Новая структура директорий присутствует.")
|
|
return True
|
|
|
|
def remove_old_files():
|
|
"""Удаление старых файлов после успешной миграции."""
|
|
old_files = [
|
|
"app/async_tasks.py",
|
|
"app/audio_processor.py",
|
|
"app/audio_sources.py",
|
|
"app/audio_utils.py",
|
|
"app/cache.py",
|
|
"app/context_managers.py",
|
|
"app/file_manager.py",
|
|
"app/history_logger.py",
|
|
"app/logging_config.py",
|
|
"app/request_logger.py",
|
|
"app/routes.py",
|
|
"app/transcriber_service.py",
|
|
"app/transcriber.py",
|
|
"app/utils.py",
|
|
"app/validators.py"
|
|
]
|
|
|
|
print("\nВНИМАНИЕ: Вы собираетесь удалить старые файлы.")
|
|
print("Убедитесь, что новая структура работает корректно.")
|
|
response = input("Продолжить удаление старых файлов? (y/n): ")
|
|
|
|
if response.lower() != 'y':
|
|
print("Удаление отменено.")
|
|
return
|
|
|
|
for file_path in old_files:
|
|
if os.path.exists(file_path):
|
|
os.remove(file_path)
|
|
print(f"Удален файл: {file_path}")
|
|
|
|
print("Старые файлы удалены.")
|
|
|
|
def create_migration_report():
|
|
"""Создание отчета о миграции."""
|
|
report = {
|
|
"migration_status": "completed",
|
|
"old_structure_backed_up": True,
|
|
"new_structure_created": True,
|
|
"files_migrated": [
|
|
"app/__init__.py -> app/__init__.py (обновлен)",
|
|
"app/async_tasks.py -> app/infrastructure/async_tasks/manager.py",
|
|
"app/audio_processor.py -> app/audio/processor.py",
|
|
"app/audio_sources.py -> app/audio/sources.py",
|
|
"app/audio_utils.py -> app/audio/utils.py",
|
|
"app/cache.py -> app/infrastructure/storage/cache.py",
|
|
"app/context_managers.py -> app/shared/context_managers.py",
|
|
"app/file_manager.py -> app/infrastructure/storage/file_manager.py",
|
|
"app/history_logger.py -> app/shared/history_logger.py",
|
|
"app/logging_config.py -> app/infrastructure/logging/config.py",
|
|
"app/request_logger.py -> app/infrastructure/logging/request_logger.py",
|
|
"app/routes.py -> app/api/routes.py",
|
|
"app/transcriber_service.py -> app/core/transcription_service.py",
|
|
"app/transcriber.py -> app/core/transcriber.py",
|
|
"app/utils.py -> app/shared/decorators.py",
|
|
"app/validators.py -> app/infrastructure/validation/validators.py"
|
|
],
|
|
"new_directories": [
|
|
"app/api/",
|
|
"app/core/",
|
|
"app/audio/",
|
|
"app/infrastructure/",
|
|
"app/infrastructure/logging/",
|
|
"app/infrastructure/storage/",
|
|
"app/infrastructure/async_tasks/",
|
|
"app/infrastructure/validation/",
|
|
"app/shared/"
|
|
]
|
|
}
|
|
|
|
with open("migration_report.json", "w", encoding="utf-8") as f:
|
|
json.dump(report, f, ensure_ascii=False, indent=2)
|
|
|
|
print("Отчет о миграции сохранен в файл migration_report.json")
|
|
|
|
def main():
|
|
"""Основная функция миграции."""
|
|
print("=== Скрипт миграции на новую структуру проекта ===\n")
|
|
|
|
# Шаг 1: Создание резервной копии
|
|
backup_old_structure()
|
|
|
|
# Шаг 2: Проверка новой структуры
|
|
if not check_new_structure():
|
|
print("Миграция не может быть продолжена.")
|
|
return
|
|
|
|
# Шаг 3: Создание отчета о миграции
|
|
create_migration_report()
|
|
|
|
print("\n=== Миграция завершена ===")
|
|
print("Новая структура проекта готова к использованию.")
|
|
print("Резервная копия старой структуры находится в директории backup_old_structure/")
|
|
print("\nРекомендации:")
|
|
print("1. Протестируйте новую структуру, запустив приложение.")
|
|
print("2. Убедитесь, что все функции работают корректно.")
|
|
print("3. После успешного тестирования запустите скрипт повторно с флагом --cleanup для удаления старых файлов.")
|
|
|
|
# Проверка флага очистки
|
|
import sys
|
|
if "--cleanup" in sys.argv:
|
|
remove_old_files()
|
|
|
|
if __name__ == "__main__":
|
|
main() |