Skip to content

feat(web): endpoint /api/code-terms — AST-разбор кода → термины глоссария #322

Description

@ArtVsMark

Часть эпика #315.

Задача

Endpoint, принимающий код решения и возвращающий термины глоссария, задействованные в этом коде, — фундамент для мини-карточек «Функции в коде» (режимы 1/2 и песочница #314).

Scope

  • glossary/: публичная функция поверх _CodeScanner/detect_from_code (glossary/detector.py:194), возвращающая ВСЕ распознанные термины (а не только отсутствующие в базе): builtins из DEFAULT_NOTABLE_BUILTINS (detector.py:39-55 — расширить базовыми: print/input/len/int/str/float/list/dict/set/tuple/range/open/...), вызовы stdlib через импорты, конструкция match/case; каждый термин сопоставляется с карточкой базы (JsonGlossaryProvider.known_terms/get).
  • Расширение анализатора на методы (s.split(), lst.append()): эвристика по известным именам методов встроенных типов; допустимы false positives — помечать полем confidence.
  • web/server.py + web/viewmodels.py: POST /api/code-terms (тело {code} либо {path}; лимит тела как fix(web): лимиты на входные данные API — тело запроса и числовые параметры #259) → [{id, title, summary, kind, has_card, url}].
  • Побочный эффект: нераспознанные-но-заметные термины попадают в очередь GlossaryMissingEntry — это включает practice-driven AST-канал пополнения, который сейчас в web не задействован (детектор вызывается только для ошибок, viewmodels.py:180).

Non-goals

  • НЕ исполнять код (только ast.parse); НЕ UI (отдельная подзадача).

Acceptance criteria

  • Код с sorted, functools.reduce, match/case, s.split() → соответствующие термины; пользовательские имена (свои функции/переменные) не попадают
  • SyntaxError во входном коде → пустой список + message_id, не 500
  • pytest + ruff + mypy зелёные; docs/api.md обновлён

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions