Сценарий 19: Проверка стандартов на основе справочных документов

Сценарий 19: Проверка стандартов на основе справочных документов

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

Содержание

Быстрый старт

/select 19

Обзор

Сценарий 19 предоставляет анализ кода на основе стандартов с использованием конфигурационных файлов YAML. В отличие от обычного линтинга, он позволяет командам определять собственные стандарты кодирования со ссылками на официальные руководства, документы лучших практик или внутренние политики.

Документ стандартов (YAML) → Извлечение правил → Анализ кода → Отчёт о нарушениях
                                    ↓
                          ┌─────────┴─────────┐
                          ↓                   ↓
                    База правил        Ссылки на документы

Документы стандартов

Спецификация формата YAML

Документы стандартов определяют правила с категориями, серьёзностью и ссылками:

# company_standards.yaml
name: "Корпоративные стандарты кодирования v2.0"
version: "2.0.0"
last_updated: "2024-12-09"
author: "Инженерная команда"

categories:
  - naming
  - security
  - style
  - documentation
  - error_handling

rules:
  - id: "SEC-001"
    title: "Использовать параметризованные запросы для операций с БД"
    category: security
    severity: error
    description: |
      Все запросы к базе данных должны использовать параметризованные
      запросы или подготовленные выражения для предотвращения SQL-инъекций.
    pattern: "execute\\s*\\(.*%s.*\\)|execute\\s*\\(.*.format\\("
    reference:
      url: "https://owasp.org/Top10/A03_2021-Injection/"
      document: "OWASP Top 10 2021"
      section: "A03:2021  Injection"
    suggestion: "Использовать cursor.execute(query, params) с плейсхолдерами"
    examples:
      bad: 'cursor.execute("SELECT * FROM users WHERE id = %s" % user_id)'
      good: 'cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))'

  - id: "NAME-001"
    title: "Имена функций должны использовать snake_case"
    category: naming
    severity: warning
    description: "Имена функций должны следовать конвенции snake_case."
    pattern: "def\\s+[a-z]+[A-Z]"
    reference:
      url: "https://peps.python.org/pep-0008/#function-and-variable-names"
      document: "PEP 8"
      section: "Function and Variable Names"
    suggestion: "Переименовать функцию в snake_case"

  - id: "DOC-001"
    title: "Публичные функции должны иметь docstrings"
    category: documentation
    severity: info
    description: "Все публичные функции должны иметь документацию."
    pattern: "^def\\s+[^_].*:\\s*$\\n\\s*[^\\\"']"
    reference:
      document: "Внутренние руководства"
      section: "Стандарты документации"

Импорт и валидация документов

> Импортировать документ стандартов company_standards.yaml

╭─────────────── Импорт стандартов ────────────────────────╮
│                                                            │
│  Документ: Корпоративные стандарты кодирования v2.0        │
│  Версия: 2.0.0                                             │
│  Импортировано правил: 15                                  │
│                                                            │
│  Категории:                                                │
│    - naming: 4 правила                                     │
│    - security: 5 правил                                    │
│    - style: 3 правила                                      │
│    - documentation: 2 правила                              │
│    - error_handling: 1 правило                             │
│                                                            │
│  Статус: УСПЕШНО                                           │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Категории правил

Категория Описание Примеры правил
naming Соглашения об именовании snake_case, CONSTANT_CASE
security Практики безопасности Валидация ввода, SQL-инъекции
style Стиль кода Длина строки, отступы
documentation Документация Docstrings, комментарии
error_handling Обработка ошибок Обработка исключений, логирование

Уровни серьёзности

Серьёзность Описание Действие
error Необходимо исправить перед слиянием Блокирует CI/CD
warning Следует исправить Пометка при ревью
info Рассмотреть исправление Информационное

Анализ кода

Проверка по правилам

> Проверить src/api/ на соответствие стандартам

╭─────────────── Результаты проверки стандартов ───────────╮
│                                                            │
│  Итого:                                                    │
│  - Всего нарушений: 23                                     │
│  - Ошибок: 5                                               │
│  - Предупреждений: 12                                      │
│  - Информация: 6                                           │
│                                                            │
│  Нарушения:                                                │
│                                                            │
│  - **SEC-001**: Риск SQL-инъекции                          │
│    `src/api/user_handler.py:67`                            │
│    *Рекомендация: Использовать cursor.execute(query, params)*│
│                                                            │
│  - **SEC-001**: Риск SQL-инъекции                          │
│    `src/api/data_handler.py:34`                            │
│    *Рекомендация: Использовать cursor.execute(query, params)*│
│                                                            │
│  - **NAME-001**: Функция использует camelCase              │
│    `src/api/helpers.py:23`                                 │
│    *Рекомендация: Переименовать функцию в snake_case*      │
│                                                            │
│  - **DOC-001**: Отсутствует docstring                      │
│    `src/api/utils.py:45`                                   │
│    *Рекомендация: Добавить документацию функции*           │
│                                                            │
│  ... и ещё 19 нарушений                                    │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Отчёт о нарушении со ссылками

> Показать детали нарушения SEC-001 в user_handler.py:67

╭─────────────── Детали нарушения ─────────────────────────╮
│                                                            │
│  Правило: SEC-001                                          │
│  Название: Использовать параметризованные запросы          │
│  Серьёзность: ОШИБКА                                       │
│  Категория: security                                       │
│                                                            │
│  Расположение: src/api/user_handler.py:67                  │
│                                                            │
│  Нарушение:                                                │
│  ```python                                                 │
│  cursor.execute("SELECT * FROM users WHERE id = %s" % id)  │
│  ```                                                       │
│                                                            │
│  Рекомендация:                                             │
│  Использовать cursor.execute(query, params) с плейсхолдерами│
│                                                            │
│  Ссылка:                                                   │
│  OWASP Top 10 2021 - A03:2021 – Injection                  │
│  https://owasp.org/Top10/A03_2021-Injection/               │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Фильтрация по категории или серьёзности

> Проверить src/ только на ошибки безопасности

╭─────────────── Ошибки безопасности ──────────────────────╮
│                                                            │
│  Фильтр: category=security, severity=error                 │
│  Всего нарушений: 5                                        │
│                                                            │
│  - **SEC-001**: SQL-инъекция в user_handler.py:67          │
│  - **SEC-001**: SQL-инъекция в data_handler.py:34          │
│  - **SEC-002**: Отсутствует валидация ввода в api.py:89    │
│  - **SEC-003**: Жёстко заданные учётные данные в config.py:12│
│  - **SEC-004**: Небезопасная десериализация в parser.py:56 │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Композитный режим (Оркестратор)

Сценарий 19 может работать как композитный оркестратор, объединяя проверку соответствия с редактированием файлов:

┌─────────────────────────────────────────────────────────────┐
│              КОМПОЗИТНЫЙ ОРКЕСТРАТОР S19                    │
│                                                              │
│  ┌────────────────────────────────────────────────────────┐ │
│  │              ДОКУМЕНТ СТАНДАРТОВ                        │ │
│  │                 (правила YAML)                          │ │
│  └────────────────────────────────────────────────────────┘ │
│                         ↓                                   │
│  ┌────────────────────────────────────────────────────────┐ │
│  │             ВЫЗОВ СЦЕНАРИЕВ                             │ │
│  │       ┌─────────┐           ┌─────────┐                │ │
│  │       │   S08   │           │   S17   │                │ │
│  │       │Соответ. │           │  Правка │                │ │
│  │       └────┬────┘           └────┬────┘                │ │
│  └────────────┼─────────────────────┼─────────────────────┘ │
│               │                     │                       │
│               ↓                     ↓                       │
│  ┌────────────────────────────────────────────────────────┐ │
│  │               ОБОГАЩЕНИЕ ДОКУМЕНТАМИ                    │ │
│  │   (Нарушения связаны с официальными ссылками)           │ │
│  └────────────────────────────────────────────────────────┘ │
│                         ↓                                   │
│                  ДЕЙСТВЕННЫЙ ОТЧЁТ                          │
└─────────────────────────────────────────────────────────────┘

Подсценарии

Сценарий Вклад
S08 (Соответствие) Правила соответствия стандартам
S17 (Редактирование файлов) Применение исправлений

Запуск композитного режима

# CLI
codegraph composition run "Проверить по company_standards.yaml" -o s19

# API
POST /api/v1/composition/query
{
  "query": "Проверить по company_standards.yaml",
  "orchestrator": "scenario_19",
  "context": {
    "document_path": "company_standards.yaml",
    "file_paths": ["src/"]
  }
}

Команды CLI

# Импортировать документ стандартов
codegraph standards import company_standards.yaml

# Валидировать синтаксис документа
codegraph standards validate company_standards.yaml

# Список импортированных правил
codegraph standards list

# Список правил по категории
codegraph standards list --category security

# Проверить код на соответствие стандартам
codegraph standards check src/

# Проверить с фильтрами
codegraph standards check src/ --severity error
codegraph standards check src/ --category security

# Экспортировать отчёт о нарушениях
codegraph standards report src/ --output violations.json

# Очистить импортированные правила
codegraph standards clear

Команды TUI

Команда Описание
/standards import <файл> Импортировать документ стандартов
/standards list Список доступных правил
/standards check <путь> Проверить код на соответствие правилам
/standards report Сгенерировать отчёт о нарушениях
/standards clear Очистить импортированные правила

Примеры вопросов

  • “Импортировать стандарты из company_standards.yaml”
  • “Проверить src/ на соответствие импортированным стандартам”
  • “Показать все правила категории security”
  • “Показать только нарушения серьёзности error”
  • “Какие правила относятся к категории naming?”
  • “Сгенерировать отчёт о соответствии для src/api/”

Создание собственных стандартов

Минимальный документ

name: "Мои стандарты"
version: "1.0.0"

rules:
  - id: "CUSTOM-001"
    title: "Избегать магических чисел"
    category: style
    severity: warning
    pattern: "\\b\\d{3,}\\b"
    suggestion: "Выделить в именованную константу"

Полный шаблон документа

name: "Полный шаблон стандартов"
version: "1.0.0"
last_updated: "2024-12-09"
author: "Ваша команда"
description: |
  Комплексные стандарты кодирования для проекта.

# Категории, используемые в документе
categories:
  - naming
  - security
  - style
  - documentation
  - error_handling
  - performance

# Глобальная конфигурация
config:
  default_severity: warning
  file_patterns:
    - "*.py"
    - "*.js"
  exclude_patterns:
    - "*_test.py"
    - "test_*.py"

rules:
  - id: "RULE-001"
    title: "Название правила"
    category: security
    severity: error  # error, warning, info
    description: "Подробное описание правила."
    pattern: "regex pattern"  # Опционально: regex для обнаружения
    reference:
      url: "https://example.com/doc"
      document: "Название документа"
      section: "Раздел 3.2"
    suggestion: "Как исправить нарушение"
    examples:
      bad: "Пример нарушения"
      good: "Пример правильного кода"
    tags:
      - "owasp"
      - "critical"

Интеграция с CI/CD

# .github/workflows/standards.yml
name: Проверка стандартов
on: [pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Запуск проверки стандартов
        run: |
          codegraph standards import standards.yaml
          codegraph standards check src/ --severity error --exit-code

Связанные сценарии