Skip to content

Latest commit

 

History

History
321 lines (266 loc) · 12.9 KB

File metadata and controls

321 lines (266 loc) · 12.9 KB

🔧 Улучшения группировки логов экспорта

📋 Описание изменений

Дата: 2024-12-19
Задача: Группировка логов экспорта по умолчанию с опциональным подробным режимом
Статус: ✅ Завершено

🎯 Проблема

До улучшений:

Данные экспортированы в data/max_split\objects\objects_001.json
Данные экспортированы в data/max_split\objects\objects_002.json
Данные экспортированы в data/max_split\objects\objects_003.json
Данные экспортированы в data/max_split\objects\objects_004.json
Данные экспортированы в data/max_split\objects\objects_005.json
Данные экспортированы в data/max_split\objects\objects_006.json
Данные экспортированы в data/max_split\objects\objects_007.json
Данные экспортированы в data/max_split\objects\objects_008.json
Данные экспортированы в data/max_split\objects\objects_009.json
Данные экспортированы в data/max_split\objects\objects_010.json
...

Проблемы:

  • Спам в выводе - сотни строк с экспортом каждого файла
  • Сложность анализа - трудно понять общую картину
  • Потеря важной информации - статистика скрыта в потоке текста
  • Нет контроля - всегда показываются все файлы

✅ Решение

После улучшений:

По умолчанию (группированный режим):

📁 Экспортировано файлов: 57
   📂 functions: 4 файлов
      optimized_functions_001.json
      optimized_functions_002.json
      optimized_functions_003.json
      functions_index.json
   📂 methods: 4 файлов
      optimized_methods_001.json
      optimized_methods_002.json
      optimized_methods_003.json
      methods_index.json
   📂 objects: 44 файлов
      optimized_objects_001.json
      optimized_objects_002.json
      ... (40 файлов) ...
      optimized_objects_043.json
      objects_index.json

Подробный режим (--verbose):

Данные экспортированы в data/optimized_split\objects\optimized_objects_001.json
Данные экспортированы в data/optimized_split\objects\optimized_objects_002.json
Данные экспортированы в data/optimized_split\objects\optimized_objects_003.json
...

Преимущества:

  • Компактный вывод по умолчанию - структурированная информация
  • Группировка по категориям - легко найти нужные файлы
  • Адаптивное отображение - детали для малых групп, статистика для больших
  • Опциональный подробный режим - --verbose для отладки

🔧 Техническая реализация

1. Обновление BaseConverter:

Конструктор с поддержкой verbose:

def __init__(self, input_file: str, verbose: bool = False):
    self.input_file = input_file
    self.data = {}
    self.verbose = verbose
    self.exported_files = []  # Для группировки логов

Модифицированный export_json():

def export_json(self, data: Dict[str, Any], filename: str) -> None:
    try:
        self.ensure_directory(filename)
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        
        # Сохраняем информацию о файле для группировки
        self.exported_files.append(filename)
        
        # Выводим лог в зависимости от режима
        if self.verbose:
            print(f"Данные экспортированы в {filename}")
    except Exception as e:
        print(f"Ошибка при экспорте в JSON: {e}")

Новый метод show_export_summary():

def show_export_summary(self):
    """Показывает сводку экспортированных файлов"""
    if not self.exported_files:
        return
    
    # Группируем файлы по категориям
    categories = {}
    for filename in self.exported_files:
        parts = filename.split(os.sep)
        if len(parts) >= 2:
            category = parts[-2]  # Предпоследняя часть пути
        else:
            category = "other"
        
        if category not in categories:
            categories[category] = []
        categories[category].append(filename)
    
    # Выводим сводку
    print(f"📁 Экспортировано файлов: {len(self.exported_files)}")
    for category, files in sorted(categories.items()):
        print(f"   📂 {category}: {len(files)} файлов")
        
        # Показываем детали для малых категорий
        if len(files) <= 3:
            for file in files:
                filename = os.path.basename(file)
                print(f"      {filename}")
        else:
            # Показываем первые и последние файлы
            for file in files[:2]:
                filename = os.path.basename(file)
                print(f"      {filename}")
            if len(files) > 4:
                print(f"      ... ({len(files)-4} файлов) ...")
            for file in files[-2:]:
                filename = os.path.basename(file)
                print(f"      {filename}")

2. Обновление SplitConverter:

Конструктор с поддержкой verbose:

def __init__(self, input_file: str, max_file_size_kb: int = 50, max_items_per_file: int = 50, verbose: bool = False):
    super().__init__(input_file, verbose)
    self.max_file_size_kb = max_file_size_kb
    self.max_items_per_file = max_items_per_file

Модифицированный export_split():

def export_split(self, data: List[Dict], output_dir: str, prefix: str = ""):
    # ... экспорт файлов ...
    
    # Показываем сводку экспорта (если не verbose режим)
    if not self.verbose:
        self.show_export_summary()

3. Обновление CLI аргументов:

Новый параметр --verbose:

parser.add_argument("--verbose", "-v", action="store_true", 
                   help="Подробный вывод (показывать каждый экспортированный файл)")

Обновленные функции:

def create_max_split_version(max_file_size_kb=50, max_items_per_file=50, verbose=False):
    # ...
    converter = MaxSplitConverter("data/1c_context.json", max_file_size_kb, max_items_per_file, verbose)
    # ...

def create_optimized_split_version(max_file_size_kb=50, max_items_per_file=50, verbose=False):
    # ...
    converter = OptimizedSplitConverter("data/1c_context.json", max_file_size_kb, max_items_per_file, verbose)
    # ...

📊 Результаты тестирования

Тест 1: Группированный режим (по умолчанию)

python run.py --mode optimized-split --max-file-size 50 --max-items-per-file 50

Результат:

📁 Экспортировано файлов: 57
   📂 functions: 4 файлов
      optimized_functions_001.json
      optimized_functions_002.json
      optimized_functions_003.json
      functions_index.json
   📂 methods: 4 файлов
      optimized_methods_001.json
      optimized_methods_002.json
      optimized_methods_003.json
      methods_index.json
   📂 objects: 44 файлов
      optimized_objects_001.json
      optimized_objects_002.json
      ... (40 файлов) ...
      optimized_objects_043.json
      objects_index.json

Тест 2: Подробный режим (--verbose)

python run.py --mode optimized-split --max-file-size 50 --max-items-per-file 50 --verbose

Результат:

Данные экспортированы в data/optimized_split\objects\optimized_objects_001.json
Данные экспортированы в data/optimized_split\objects\optimized_objects_002.json
Данные экспортированы в data/optimized_split\objects\optimized_objects_003.json
...

🎯 Логика группировки

Правила отображения:

  1. ≤3 файла в категории: Показываются все файлы
  2. >3 файла в категории: Показываются первые 2, "..." с количеством, последние 2
  3. Категории: Группировка по папкам (objects, functions, methods, etc.)
  4. Индексные файлы: Включаются в подсчет

Примеры вывода:

Мало файлов (≤3):

📂 functions: 4 файлов
   optimized_functions_001.json
   optimized_functions_002.json
   optimized_functions_003.json
   functions_index.json

Много файлов (>3):

📂 objects: 44 файлов
   optimized_objects_001.json
   optimized_objects_002.json
   ... (40 файлов) ...
   optimized_objects_043.json
   objects_index.json

📈 Преимущества улучшений

1. Читаемость

  • Компактный вывод по умолчанию - вместо сотен строк структурированная информация
  • Быстрый анализ - сразу видно количество файлов по категориям
  • Логическая группировка - по категориям с адаптивным отображением

2. Гибкость

  • Два режима - группированный по умолчанию, подробный по запросу
  • Отладка - --verbose для детального анализа
  • Производительность - меньше вывода = быстрее выполнение

3. Практичность

  • Быстрое понимание - сразу понятно, что создалось
  • Фокус на важном - внимание на структуре, а не на каждом файле
  • Масштабируемость - работает с любым количеством файлов

🔮 Возможные дальнейшие улучшения

1. Цветной вывод

# Добавить цветовую индикацию для разных категорий
print(f"\033[34m📂 {category}\033[0m: {len(files)} файлов")

2. Прогресс-бар

# Показывать прогресс экспорта
from tqdm import tqdm
for chunk in tqdm(chunks, desc="Экспорт файлов"):
    # экспорт

3. Экспорт статистики

# Сохранение статистики экспорта в JSON
def export_statistics(self, output_file: str):
    """Экспортирует статистику экспорта в файл"""

4. Интерактивный режим

# Запрос подтверждения для больших экспортов
if len(items) > 1000 and not verbose:
    confirm = input("Экспортировать много файлов? (y/n): ")

✅ Заключение

Улучшения группировки логов успешно реализованы:

  1. ✅ Группированный вывод по умолчанию - компактный и информативный
  2. ✅ Подробный режим по запросу - --verbose для отладки
  3. ✅ Адаптивное отображение - детали для малых групп, статистика для больших
  4. ✅ Обратная совместимость - все существующие команды работают

Результат: Теперь по умолчанию получаем структурированный отчет вместо спама, а при необходимости можем включить подробный режим для отладки.

Команды:

# Группированный режим (по умолчанию)
python run.py --mode optimized-split

# Подробный режим
python run.py --mode optimized-split --verbose