Перейти к содержанию

Python: классы и функции

AST-каталог содержит 35 modules и 265 top-level/class symbols. Private helpers включены: они важны для чтения реального execution path.

src/tender_lens/__init__.py

TenderLens: мониторинг закупок и локальный RAG.

Imports:

Символ Вид Сигнатура Ответственность Исходник
module Модуль не объявляет classes/functions. файл

src/tender_lens/ai.py

Минимальные providers для embeddings и grounded generation.

Imports: __future__, hashlib, httpx, math, re, tender_lens.errors, tender_lens.schemas, typing

Символ Вид Сигнатура Ответственность Исходник
AIProvider class class AIProvider(Protocol) Реализует внутреннюю операцию AIProvider; точный contract виден в сигнатуре. L18–L23
AIProvider.embed async method async def embed(self, texts: list[str]) -> list[list[float]] Реализует внутреннюю операцию embed; точный contract виден в сигнатуре. L19–L19
AIProvider.generate async method async def generate(self, *, system: str, prompt: str) -> str Реализует внутреннюю операцию generate; точный contract виден в сигнатуре. L21–L21
AIProvider.health async method async def health(self) -> bool Реализует внутреннюю операцию health; точный contract виден в сигнатуре. L23–L23
FakeAIProvider class class FakeAIProvider Hashing-trick provider: быстрый, локальный и детерминированный. L26–L60
FakeAIProvider.__init__ method def __init__(self, dimensions: int=1024) -> None Сохраняет dependencies и начальное состояние FakeAIProvider. L29–L31
FakeAIProvider._vector method def _vector(self, text: str) -> list[float] Реализует внутреннюю операцию vector; точный contract виден в сигнатуре. L33–L43
FakeAIProvider.embed async method async def embed(self, texts: list[str]) -> list[list[float]] Реализует внутреннюю операцию embed; точный contract виден в сигнатуре. L45–L46
FakeAIProvider.generate async method async def generate(self, *, system: str, prompt: str) -> str Реализует внутреннюю операцию generate; точный contract виден в сигнатуре. L48–L57
FakeAIProvider.health async method async def health(self) -> bool Реализует внутреннюю операцию health; точный contract виден в сигнатуре. L59–L60
OllamaAIProvider class class OllamaAIProvider Проверяемый async client Ollama embed/generate/health API. L63–L142
OllamaAIProvider.__init__ method def __init__(self, *, base_url: str, embedding_model: str, generation_model: str, dimensions: int, timeout_seconds: float=90.0, client: httpx.AsyncClient \| None=None) -> None Сохраняет dependencies и начальное состояние OllamaAIProvider. L64–L79
OllamaAIProvider.aclose async method async def aclose(self) -> None Реализует внутреннюю операцию aclose; точный contract виден в сигнатуре. L81–L83
OllamaAIProvider.embed async method async def embed(self, texts: list[str]) -> list[list[float]] Реализует внутреннюю операцию embed; точный contract виден в сигнатуре. L85–L114
OllamaAIProvider.generate async method async def generate(self, *, system: str, prompt: str) -> str Реализует внутреннюю операцию generate; точный contract виден в сигнатуре. L116–L135
OllamaAIProvider.health async method async def health(self) -> bool Реализует внутреннюю операцию health; точный contract виден в сигнатуре. L137–L142
build_rag_prompt function def build_rag_prompt(query: str, results: list[SearchResult]) -> tuple[str, str] Создаёт prompt, где внешние документы явно являются недоверенным контекстом. L145–L165

src/tender_lens/api/__init__.py

FastAPI Gateway TenderLens.

Imports:

Символ Вид Сигнатура Ответственность Исходник
module Модуль не объявляет classes/functions. файл

src/tender_lens/api/auth.py

Проверка X-API-Key без сохранения открытого секрета.

Imports: __future__, dataclasses, fastapi, hashlib, secrets, sqlalchemy, tender_lens.errors, tender_lens.models, typing

Символ Вид Сигнатура Ответственность Исходник
GeneratedApiKey class class GeneratedApiKey Реализует внутреннюю операцию GeneratedApiKey; точный contract виден в сигнатуре. L18–L20
hash_api_key function def hash_api_key(secret: str) -> str Реализует внутреннюю операцию hash api key; точный contract виден в сигнатуре. L23–L24
generate_api_key function def generate_api_key() -> GeneratedApiKey Реализует внутреннюю операцию generate api key; точный contract виден в сигнатуре. L27–L29
get_session async function async def get_session(request: Request) Читает данные без изменения основной сущности: get session. L32–L35
authenticate_api_key async function async def authenticate_api_key(request: Request, x_api_key: str \| None=Header(default=None, alias='X-API-Key')) -> ApiKey Проверяет X-API-Key по hash и состоянию enabled. L38–L59

src/tender_lens/api/main.py

App factory, lifecycle, middleware, errors и статический интерфейс.

Imports: __future__, collections.abc, contextlib, fastapi, fastapi.exceptions, fastapi.responses, fastapi.staticfiles, logging, pathlib, tender_lens.ai, tender_lens.api.routes, tender_lens.config, tender_lens.db, tender_lens.errors, tender_lens.logging, tender_lens.schemas, tender_lens.search, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
_error_response function def _error_response(request: Request, error: AppError) -> JSONResponse Реализует внутреннюю операцию error response; точный contract виден в сигнатуре. L30–L49
create_app function def create_app(*, settings: Settings \| None=None, session_factory: SessionFactory \| Any \| None=None, ai: AIProvider \| None=None, search_service: Any \| None=None) -> FastAPI Собирает FastAPI, lifecycle dependencies, middleware и handlers. L52–L146

src/tender_lens/api/rate_limit.py

Fixed UTC-minute limiter в одной атомарной PostgreSQL-транзакции.

Imports: __future__, dataclasses, datetime, fastapi, math, sqlalchemy.ext.asyncio, tender_lens.api.auth, tender_lens.errors, tender_lens.models, uuid

Символ Вид Сигнатура Ответственность Исходник
RateLimitState class class RateLimitState Реализует внутреннюю операцию RateLimitState; точный contract виден в сигнатуре. L19–L34
RateLimitState.headers method def headers(self) -> dict[str, str] Реализует внутреннюю операцию headers; точный contract виден в сигнатуре. L25–L30
RateLimitState.exceeded_headers method def exceeded_headers(self, now: datetime) -> dict[str, str] Реализует внутреннюю операцию exceeded headers; точный contract виден в сигнатуре. L32–L34
minute_start function def minute_start(now: datetime) -> datetime Реализует внутреннюю операцию minute start; точный contract виден в сигнатуре. L37–L40
consume_rate_limit async function async def consume_rate_limit(session: AsyncSession, api_key_id: UUID, *, now: datetime \| None=None) -> RateLimitState Атомарно расходует слот fixed UTC-minute под row lock. L43–L75
rate_limited_key async function async def rate_limited_key(request: Request, api_key: ApiKey=Depends(authenticate_api_key)) Реализует внутреннюю операцию rate limited key; точный contract виден в сигнатуре. L78–L86

src/tender_lens/api/routes.py

Тонкие HTTP routes: валидация, зависимости и вызов сервисов.

Imports: __future__, fastapi, fastapi.responses, sqlalchemy, sqlalchemy.orm, tender_lens.api.auth, tender_lens.api.rate_limit, tender_lens.errors, tender_lens.models, tender_lens.schemas, uuid

Символ Вид Сигнатура Ответственность Исходник
live_health async function async def live_health() -> dict[str, str] Реализует внутреннюю операцию live health; точный contract виден в сигнатуре. L29–L30
ready_health async function async def ready_health(request: Request) -> JSONResponse Реализует внутреннюю операцию ready health; точный contract виден в сигнатуре. L34–L51
tender_details async function async def tender_details(tender_id: UUID, session=Depends(get_session)) -> TenderDetails Реализует внутреннюю операцию tender details; точный contract виден в сигнатуре. L60–L92
search async function async def search(request: Request, payload: SearchRequest, session=Depends(get_session)) Реализует внутреннюю операцию search; точный contract виден в сигнатуре. L101–L104
ask async function async def ask(request: Request, payload: AskRequest, session=Depends(get_session)) Реализует внутреннюю операцию ask; точный contract виден в сигнатуре. L113–L116

src/tender_lens/cli.py

Служебные команды: API-ключи, demo seed и проверка зависимостей.

Imports: __future__, argparse, asyncio, json, pathlib, shutil, sqlalchemy, tender_lens.api.auth, tender_lens.config, tender_lens.db, tender_lens.hashing, tender_lens.models, tender_lens.nats, tender_lens.schemas, tender_lens.storage, uuid

Символ Вид Сигнатура Ответственность Исходник
create_key async function async def create_key(name: str, limit: int) -> None Создаёт объект/значение для операции create key. L24–L50
disable_key async function async def disable_key(identifier: str) -> None Реализует внутреннюю операцию disable key; точный contract виден в сигнатуре. L53–L68
list_keys async function async def list_keys() -> None Читает данные без изменения основной сущности: list keys. L71–L89
_upsert_demo_record async function async def _upsert_demo_record(record: TenderRecordV1, fixture_file: Path, sessions) -> tuple[UUID, str] Реализует внутреннюю операцию upsert demo record; точный contract виден в сигнатуре. L92–L178
_demo_records function def _demo_records(fixture_dir: Path) -> list[tuple[TenderRecordV1, Path]] Реализует внутреннюю операцию demo records; точный contract виден в сигнатуре. L181–L192
seed_demo async function async def seed_demo(fixture_dir: Path) -> None Реализует внутреннюю операцию seed demo; точный contract виден в сигнатуре. L195–L211
_limit_value function def _limit_value(raw: str) -> int Проверяет CLI-лимит без громоздкого вывода тысячи вариантов argparse. L214–L223
build_parser function def build_parser() -> argparse.ArgumentParser Создаёт объект/значение для операции build parser. L226–L241
async_main async function async def async_main(args: argparse.Namespace) -> None Реализует внутреннюю операцию async main; точный contract виден в сигнатуре. L244–L252
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L255–L256

src/tender_lens/config.py

Типизированная конфигурация приложения без побочных эффектов.

Imports: __future__, functools, pathlib, pydantic, pydantic_settings, typing

Символ Вид Сигнатура Ответственность Исходник
Settings class class Settings(BaseSettings) Единый набор настроек для ролей crawler, indexer и API. L13–L87
Settings.strip_trailing_slash method def strip_trailing_slash(cls, value: str) -> str Реализует внутреннюю операцию strip trailing slash; точный contract виден в сигнатуре. L74–L75
Settings.normalize_log_level method def normalize_log_level(cls, value: str) -> str Нормализует или валидирует normalize log level по contract rules. L79–L80
Settings.validate_embedding_dimensions method def validate_embedding_dimensions(cls, value: int) -> int Нормализует или валидирует validate embedding dimensions по contract rules. L84–L87
get_settings function def get_settings() -> Settings Возвращает кэшированный immutable-by-convention объект настроек. L91–L94

src/tender_lens/crawler/__init__.py

Асинхронный сбор и нормализация открытых закупок.

Imports:

Символ Вид Сигнатура Ответственность Исходник
module Модуль не объявляет classes/functions. файл

src/tender_lens/crawler/__main__.py

CLI entrypoint роли crawler.

Imports: __future__, argparse, asyncio, dataclasses, json, logging, pathlib, tender_lens.config, tender_lens.crawler.base, tender_lens.crawler.contracts_finder, tender_lens.crawler.fixture, tender_lens.crawler.service, tender_lens.crawler.ted, tender_lens.db, tender_lens.logging, tender_lens.nats

Символ Вид Сигнатура Ответственность Исходник
build_parser function def build_parser() -> argparse.ArgumentParser Создаёт объект/значение для операции build parser. L25–L39
_source_hosts function def _source_hosts(source: str) -> set[str] Реализует внутреннюю операцию source hosts; точный contract виден в сигнатуре. L42–L52
_adapter function def _adapter(source: str, settings: Settings, source_client: ResilientHttpClient, fixture: Path \| None) Реализует внутреннюю операцию adapter; точный contract виден в сигнатуре. L55–L72
run async function async def run(args: argparse.Namespace) -> None Запускает lifecycle соответствующей CLI/worker роли. L75–L146
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L149–L150

src/tender_lens/crawler/base.py

Общий контракт источника и безопасная HTTP-политика crawler.

Imports: __future__, asyncio, collections.abc, contextlib, dataclasses, datetime, email.utils, httpx, ipaddress, random, tender_lens.errors, tender_lens.schemas, typing, urllib.parse

Символ Вид Сигнатура Ответственность Исходник
SourcePage class class SourcePage Одна подтверждаемая порция данных внешнего источника. L23–L27
SourceAdapter class class SourceAdapter(Protocol) Protocol одинакового получения страницы для любого внешнего источника. L30–L36
SourceAdapter.fetch_page async method async def fetch_page(self, cursor: str \| None, limit: int) -> SourcePage Получить и нормализовать одну страницу/итерацию источника. L33–L36
ResilientHttpClient class class ResilientHttpClient HTTP-клиент с bounded concurrency, retry и проверкой redirect host. L39–L281
ResilientHttpClient.__init__ method def __init__(self, *, max_concurrency: int, timeout_seconds: float, max_attempts: int, base_delay_seconds: float, jitter_seconds: float, user_agent: str, allowed_hosts: set[str], forbidden_cooldown_seconds: float \| None=None, client: httpx.AsyncClient \| None=None, sleep: Callable[[float], Awaitable[None]]=asyncio.sleep, random_value: Callable[[], float]=random.random) -> None Сохраняет dependencies и начальное состояние ResilientHttpClient. L42–L71
ResilientHttpClient.__aenter__ async method async def __aenter__(self) -> 'ResilientHttpClient' Реализует async context manager lifecycle. L73–L74
ResilientHttpClient.__aexit__ async method async def __aexit__(self, *_: object) -> None Реализует async context manager lifecycle. L76–L77
ResilientHttpClient.aclose async method async def aclose(self) -> None Реализует внутреннюю операцию aclose; точный contract виден в сигнатуре. L79–L81
ResilientHttpClient._validate_host method def _validate_host(self, url: str) -> None Реализует внутреннюю операцию validate host; точный contract виден в сигнатуре. L83–L97
ResilientHttpClient._is_retryable_status method def _is_retryable_status(self, status_code: int) -> bool Проверяет условие is retryable status. L99–L103
ResilientHttpClient._retry_delay method def _retry_delay(self, response: httpx.Response \| None, attempt: int) -> float Реализует внутреннюю операцию retry delay; точный contract виден в сигнатуре. L105–L127
ResilientHttpClient._polite_delay async method async def _polite_delay(self) -> None Реализует внутреннюю операцию polite delay; точный contract виден в сигнатуре. L129–L132
ResilientHttpClient.request async method async def request(self, method: str, url: str, **kwargs: Any) -> httpx.Response Реализует внутреннюю операцию request; точный contract виден в сигнатуре. L134–L189
ResilientHttpClient.get_json async method async def get_json(self, url: str, **kwargs: Any) -> dict[str, Any] Читает данные без изменения основной сущности: get json. L191–L199
ResilientHttpClient.post_json async method async def post_json(self, url: str, payload: dict[str, Any]) -> dict[str, Any] Реализует внутреннюю операцию post json; точный contract виден в сигнатуре. L201–L209
ResilientHttpClient.stream async method async def stream(self, url: str) -> AsyncIterator[httpx.Response] Открыть поток и удерживать semaphore до завершения чтения. L212–L281

src/tender_lens/crawler/contracts_finder.py

Адаптер UK Contracts Finder OCDS Search.

Imports: __future__, datetime, decimal, logging, pathlib, tender_lens.crawler.base, tender_lens.schemas, typing, urllib.parse

Символ Вид Сигнатура Ответственность Исходник
_object function def _object(value: Any) -> dict[str, Any] Реализует внутреннюю операцию object; точный contract виден в сигнатуре. L18–L19
_array function def _array(value: Any) -> list[Any] Реализует внутреннюю операцию array; точный contract виден в сигнатуре. L22–L23
_dt function def _dt(value: Any) -> datetime \| None Реализует внутреннюю операцию dt; точный contract виден в сигнатуре. L26–L35
_money function def _money(value: Any) -> Decimal \| None Реализует внутреннюю операцию money; точный contract виден в сигнатуре. L38–L44
_next_cursor function def _next_cursor(data: dict[str, Any]) -> str \| None Реализует внутреннюю операцию next cursor; точный contract виден в сигнатуре. L47–L52
ContractsFinderAdapter class class ContractsFinderAdapter Реализует внутреннюю операцию ContractsFinderAdapter; точный contract виден в сигнатуре. L55–L140
ContractsFinderAdapter.__init__ method def __init__(self, client: ResilientHttpClient, *, base_url: str) -> None Сохраняет dependencies и начальное состояние ContractsFinderAdapter. L58–L60
ContractsFinderAdapter.fetch_page async method async def fetch_page(self, cursor: str \| None, limit: int) -> SourcePage Реализует внутреннюю операцию fetch page; точный contract виден в сигнатуре. L62–L87
ContractsFinderAdapter.map_release method def map_release(release: dict[str, Any]) -> TenderRecordV1 Преобразует внешний payload: map release. L90–L140

src/tender_lens/crawler/fixture.py

Одноразовый fixture-адаптер для локального demo и e2e.

Imports: __future__, json, pathlib, tender_lens.crawler.base, tender_lens.crawler.contracts_finder, tender_lens.crawler.ted

Символ Вид Сигнатура Ответственность Исходник
FixtureAdapter class class FixtureAdapter Реализует внутреннюю операцию FixtureAdapter; точный contract виден в сигнатуре. L13–L33
FixtureAdapter.__init__ method def __init__(self, source_code: str, fixture_path: Path) -> None Сохраняет dependencies и начальное состояние FixtureAdapter. L14–L19
FixtureAdapter.fetch_page async method async def fetch_page(self, cursor: str \| None, limit: int) -> SourcePage Реализует внутреннюю операцию fetch page; точный contract виден в сигнатуре. L21–L33

src/tender_lens/crawler/service.py

Оркестрация crawl: upsert, вложения, cursor и NATS event.

Imports: __future__, asyncio, base, dataclasses, datetime, logging, sqlalchemy, sqlalchemy.ext.asyncio, tender_lens.config, tender_lens.db, tender_lens.hashing, tender_lens.models, tender_lens.schemas, tender_lens.storage, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
EventPublisher class class EventPublisher(Protocol) Реализует внутреннюю операцию EventPublisher; точный contract виден в сигнатуре. L27–L28
EventPublisher.publish_tender_changed async method async def publish_tender_changed(self, event: TenderChangedV1) -> str Реализует внутреннюю операцию publish tender changed; точный contract виден в сигнатуре. L28–L28
PersistedTender class class PersistedTender Реализует внутреннюю операцию PersistedTender; точный contract виден в сигнатуре. L32–L36
CrawlSummary class class CrawlSummary Реализует внутреннюю операцию CrawlSummary; точный contract виден в сигнатуре. L40–L46
CrawlerService class class CrawlerService Оркестрирует cursor, UPSERT, attachments и публикацию события. L49–L301
CrawlerService.__init__ method def __init__(self, *, settings: Settings, session_factory: SessionFactory, attachment_client: ResilientHttpClient, publisher: EventPublisher) -> None Сохраняет dependencies и начальное состояние CrawlerService. L50–L61
CrawlerService._source async method async def _source(self, session: AsyncSession, code: str) -> Source Реализует внутреннюю операцию source; точный contract виден в сигнатуре. L63–L69
CrawlerService.get_cursor async method async def get_cursor(self, code: str) -> str \| None Читает данные без изменения основной сущности: get cursor. L71–L75
CrawlerService.persist_record async method async def persist_record(self, record: TenderRecordV1) -> PersistedTender Реализует внутреннюю операцию persist record; точный contract виден в сигнатуре. L77–L162
CrawlerService._download_one async method async def _download_one(self, tender_id: UUID, attachment_id: UUID) -> bool Реализует внутреннюю операцию download one; точный contract виден в сигнатуре. L164–L211
CrawlerService.download_record_attachments async method async def download_record_attachments(self, persisted: PersistedTender) -> int Реализует внутреннюю операцию download record attachments; точный contract виден в сигнатуре. L213–L219
CrawlerService.publish async method async def publish(self, tender_id: UUID, content_hash: str) -> bool Реализует внутреннюю операцию publish; точный contract виден в сигнатуре. L221–L232
CrawlerService.republish_pending async method async def republish_pending(self, limit: int=100) -> int Реализует внутреннюю операцию republish pending; точный contract виден в сигнатуре. L234–L247
CrawlerService.update_cursor async method async def update_cursor(self, source_code: str, cursor: str \| None) -> None Реализует внутреннюю операцию update cursor; точный contract виден в сигнатуре. L249–L254
CrawlerService.run_source async method async def run_source(self, adapter: SourceAdapter, max_items: int) -> CrawlSummary Реализует внутреннюю операцию run source; точный contract виден в сигнатуре. L256–L301

src/tender_lens/crawler/ted.py

Адаптер официального TED Search API v3.

Imports: __future__, datetime, decimal, logging, pathlib, tender_lens.crawler.base, tender_lens.schemas, typing

Символ Вид Сигнатура Ответственность Исходник
_first function def _first(value: Any) -> Any Реализует внутреннюю операцию first; точный contract виден в сигнатуре. L17–L29
_string function def _string(value: Any) -> str \| None Реализует внутреннюю операцию string; точный contract виден в сигнатуре. L32–L37
_datetime function def _datetime(value: Any) -> datetime \| None Реализует внутреннюю операцию datetime; точный contract виден в сигнатуре. L40–L51
_decimal function def _decimal(value: Any) -> Decimal \| None Реализует внутреннюю операцию decimal; точный contract виден в сигнатуре. L54–L61
TedAdapter class class TedAdapter Реализует внутреннюю операцию TedAdapter; точный contract виден в сигнатуре. L64–L189
TedAdapter.__init__ method def __init__(self, client: ResilientHttpClient, *, base_url: str, query: str) -> None Сохраняет dependencies и начальное состояние TedAdapter. L67–L76
TedAdapter.fetch_page async method async def fetch_page(self, cursor: str \| None, limit: int) -> SourcePage Реализует внутреннюю операцию fetch page; точный contract виден в сигнатуре. L78–L124
TedAdapter.map_notice method def map_notice(notice: dict[str, Any]) -> TenderRecordV1 Преобразует внешний payload: map notice. L127–L189

src/tender_lens/db.py

Создание SQLAlchemy engine/session только по явному запросу.

Imports: __future__, collections.abc, contextlib, sqlalchemy.ext.asyncio, tender_lens.config

Символ Вид Сигнатура Ответственность Исходник
create_engine function def create_engine(settings: Settings) -> AsyncEngine Создаёт объект/значение для операции create engine. L20–L25
create_session_factory function def create_session_factory(engine: AsyncEngine) -> SessionFactory Создаёт объект/значение для операции create session factory. L28–L29
session_scope async function async def session_scope(factory: SessionFactory) -> AsyncIterator[AsyncSession] Реализует внутреннюю операцию session scope; точный contract виден в сигнатуре. L33–L40

src/tender_lens/errors.py

Типизированные ошибки, переводимые в стабильные HTTP-ответы и логи.

Imports: __future__, dataclasses, typing

Символ Вид Сигнатура Ответственность Исходник
AppError class class AppError(Exception) Базовая прикладная ошибка без утечки технических деталей наружу. L10–L19
AppError.__str__ method def __str__(self) -> str Реализует внутреннюю операцию str; точный contract виден в сигнатуре. L18–L19
DependencyUnavailableError class class DependencyUnavailableError(AppError) Реализует внутреннюю операцию DependencyUnavailableError; точный contract виден в сигнатуре. L22–L24
DependencyUnavailableError.__init__ method def __init__(self, message: str='Внешняя зависимость недоступна.') -> None Сохраняет dependencies и начальное состояние DependencyUnavailableError. L23–L24
SourceRequestError class class SourceRequestError(AppError) Реализует внутреннюю операцию SourceRequestError; точный contract виден в сигнатуре. L27–L29
SourceRequestError.__init__ method def __init__(self, message: str) -> None Сохраняет dependencies и начальное состояние SourceRequestError. L28–L29
AttachmentError class class AttachmentError(AppError) Реализует внутреннюю операцию AttachmentError; точный contract виден в сигнатуре. L32–L34
AttachmentError.__init__ method def __init__(self, code: str, message: str) -> None Сохраняет dependencies и начальное состояние AttachmentError. L33–L34
ExtractionError class class ExtractionError(AppError) Реализует внутреннюю операцию ExtractionError; точный contract виден в сигнатуре. L37–L39
ExtractionError.__init__ method def __init__(self, message: str) -> None Сохраняет dependencies и начальное состояние ExtractionError. L38–L39
InvalidAIResponseError class class InvalidAIResponseError(DependencyUnavailableError) Реализует внутреннюю операцию InvalidAIResponseError; точный contract виден в сигнатуре. L42–L44
InvalidAIResponseError.__init__ method def __init__(self, message: str='AI-сервис вернул некорректный ответ.') -> None Сохраняет dependencies и начальное состояние InvalidAIResponseError. L43–L44

src/tender_lens/hashing.py

Детерминированные hash-функции для закупок, файлов и чанков.

Imports: __future__, datetime, decimal, hashlib, json, tender_lens.schemas, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
sha256_bytes function def sha256_bytes(value: bytes) -> str Реализует внутреннюю операцию sha256 bytes; точный contract виден в сигнатуре. L15–L16
sha256_text function def sha256_text(value: str) -> str Реализует внутреннюю операцию sha256 text; точный contract виден в сигнатуре. L19–L20
_datetime_to_utc_iso function def _datetime_to_utc_iso(value: datetime \| None) -> str \| None Реализует внутреннюю операцию datetime to utc iso; точный contract виден в сигнатуре. L23–L28
_decimal_to_string function def _decimal_to_string(value: Decimal \| None) -> str \| None Реализует внутреннюю операцию decimal to string; точный contract виден в сигнатуре. L31–L35
canonical_tender_payload function def canonical_tender_payload(record: TenderRecordV1) -> dict[str, Any] Реализует внутреннюю операцию canonical tender payload; точный contract виден в сигнатуре. L38–L61
tender_content_hash function def tender_content_hash(record: TenderRecordV1) -> str Вычисляет SHA-256 canonical значимых полей закупки. L64–L71
chunk_content_hash function def chunk_content_hash(content: str) -> str Реализует внутреннюю операцию chunk content hash; точный contract виден в сигнатуре. L74–L75
build_chunk_key function def build_chunk_key(tender_id: UUID, attachment_id: UUID \| None, position: int, content_hash: str, embedding_model: str) -> str Создаёт объект/значение для операции build chunk key. L78–L87

src/tender_lens/indexer/__init__.py

Фоновая индексация закупок и вложений.

Imports:

Символ Вид Сигнатура Ответственность Исходник
module Модуль не объявляет classes/functions. файл

src/tender_lens/indexer/__main__.py

CLI entrypoint durable INDEXER consumer.

Imports: __future__, argparse, asyncio, logging, pydantic, sqlalchemy.exc, tender_lens.ai, tender_lens.config, tender_lens.db, tender_lens.errors, tender_lens.indexer.service, tender_lens.logging, tender_lens.nats, tender_lens.schemas

Символ Вид Сигнатура Ответственность Исходник
build_parser function def build_parser() -> argparse.ArgumentParser Создаёт объект/значение для операции build parser. L24–L25
run async function async def run() -> None Запускает lifecycle соответствующей CLI/worker роли. L28–L83
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L86–L88

src/tender_lens/indexer/chunk.py

Детерминированный paragraph-first chunking без отдельного фреймворка.

Imports: __future__, dataclasses, re, tender_lens.indexer.extract, uuid

Символ Вид Сигнатура Ответственность Исходник
ChunkDraft class class ChunkDraft Реализует внутреннюю операцию ChunkDraft; точный contract виден в сигнатуре. L13–L17
_paragraphs function def _paragraphs(text: str) -> list[str] Реализует внутреннюю операцию paragraphs; точный contract виден в сигнатуре. L20–L23
_split_long function def _split_long(value: str, max_chars: int) -> list[str] Реализует внутреннюю операцию split long; точный contract виден в сигнатуре. L26–L39
chunk_units function def chunk_units(units: list[TextUnit], *, max_chars: int=1500, overlap_chars: int=150) -> list[ChunkDraft] Режет TextUnit по абзацам с детерминированным overlap. L42–L81

src/tender_lens/indexer/extract.py

Безопасное извлечение текста из ограниченного набора форматов.

Imports: __future__, dataclasses, defusedxml, html.parser, json, pathlib, pypdf, tender_lens.errors, tender_lens.models, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
TextUnit class class TextUnit Реализует внутреннюю операцию TextUnit; точный contract виден в сигнатуре. L20–L23
_SafeHTMLTextParser class class _SafeHTMLTextParser(HTMLParser) Реализует внутреннюю операцию SafeHTMLTextParser; точный contract виден в сигнатуре. L26–L51
_SafeHTMLTextParser.__init__ method def __init__(self) -> None Сохраняет dependencies и начальное состояние _SafeHTMLTextParser. L27–L30
_SafeHTMLTextParser.handle_starttag method def handle_starttag(self, tag: str, attrs: list[tuple[str, str \| None]]) -> None Реализует внутреннюю операцию handle starttag; точный contract виден в сигнатуре. L32–L37
_SafeHTMLTextParser.handle_endtag method def handle_endtag(self, tag: str) -> None Реализует внутреннюю операцию handle endtag; точный contract виден в сигнатуре. L39–L43
_SafeHTMLTextParser.handle_data method def handle_data(self, data: str) -> None Реализует внутреннюю операцию handle data; точный contract виден в сигнатуре. L45–L47
_SafeHTMLTextParser.text method def text(self) -> str Реализует внутреннюю операцию text; точный contract виден в сигнатуре. L49–L51
metadata_text function def metadata_text(tender: Tender) -> TextUnit Реализует внутреннюю операцию metadata text; точный contract виден в сигнатуре. L54–L68
title_text function def title_text(tender: Tender) -> TextUnit Выделяет название отдельно, чтобы длинное описание не размывало его embedding. L71–L74
description_text function def description_text(tender: Tender) -> TextUnit \| None Сохраняет описание отдельным retrieval unit, если источник его предоставил. L77–L82
_read_bytes function def _read_bytes(path: Path, max_bytes: int) -> bytes Реализует внутреннюю операцию read bytes; точный contract виден в сигнатуре. L85–L89
extract_pdf function def extract_pdf(path: Path, attachment_id: UUID) -> list[TextUnit] Безопасно извлекает текст: extract pdf. L92–L108
extract_xml function def extract_xml(data: bytes, attachment_id: UUID) -> list[TextUnit] Безопасно извлекает текст: extract xml. L111–L117
extract_html function def extract_html(data: bytes, attachment_id: UUID) -> list[TextUnit] Безопасно извлекает текст: extract html. L120–L124
extract_json function def extract_json(data: bytes, attachment_id: UUID) -> list[TextUnit] Безопасно извлекает текст: extract json. L127–L133
extract_txt function def extract_txt(data: bytes, attachment_id: UUID) -> list[TextUnit] Безопасно извлекает текст: extract txt. L136–L138
extract_attachment function def extract_attachment(attachment: Attachment, max_bytes: int) -> list[TextUnit] Безопасно извлекает текст: extract attachment. L141–L162

src/tender_lens/indexer/service.py

Идемпотентная обработка tender.changed.v1 и атомарная замена чанков.

Imports: __future__, dataclasses, logging, sqlalchemy, sqlalchemy.orm, tender_lens.ai, tender_lens.config, tender_lens.db, tender_lens.errors, tender_lens.hashing, tender_lens.indexer.chunk, tender_lens.indexer.extract, tender_lens.models, tender_lens.schemas, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
IndexResult class class IndexResult Реализует внутреннюю операцию IndexResult; точный contract виден в сигнатуре. L32–L36
IndexerService class class IndexerService Идемпотентно превращает конкретную версию tender в vector chunks. L39–L162
IndexerService.__init__ method def __init__(self, *, settings: Settings, session_factory: SessionFactory, ai: AIProvider) -> None Сохраняет dependencies и начальное состояние IndexerService. L40–L49
IndexerService._load_tender async method async def _load_tender(self, tender_id: UUID) -> Tender \| None Реализует внутреннюю операцию load tender; точный contract виден в сигнатуре. L51–L60
IndexerService._mark_failed async method async def _mark_failed(self, tender_id: UUID, content_hash: str, message: str) -> None Атомарно меняет состояние: mark failed. L62–L68
IndexerService.process async method async def process(self, event: TenderChangedV1) -> IndexResult Реализует внутреннюю операцию process; точный contract виден в сигнатуре. L70–L162

src/tender_lens/logging.py

Минимальное структурированное логирование без секретов.

Imports: __future__, datetime, json, logging, typing

Символ Вид Сигнатура Ответственность Исходник
mask_mapping function def mask_mapping(value: dict[str, Any]) -> dict[str, Any] Рекурсивно маскирует известные секретные поля перед логированием. L14–L25
JsonFormatter class class JsonFormatter(logging.Formatter) Реализует внутреннюю операцию JsonFormatter; точный contract виден в сигнатуре. L28–L41
JsonFormatter.format method def format(self, record: logging.LogRecord) -> str Реализует внутреннюю операцию format; точный contract виден в сигнатуре. L29–L41
configure_logging function def configure_logging(level: str='INFO') -> None Реализует внутреннюю операцию configure logging; точный contract виден в сигнатуре. L44–L50

src/tender_lens/models.py

Пять SQLAlchemy-моделей, утверждённых спецификацией MVP.

Imports: __future__, datetime, decimal, sqlalchemy, sqlalchemy.dialects.postgresql, sqlalchemy.orm, sqlalchemy.types, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
utc_now function def utc_now() -> datetime Реализует внутреннюю операцию utc now; точный contract виден в сигнатуре. L29–L30
Base class class Base(DeclarativeBase) Общая declarative base без runtime-побочных эффектов. L33–L34
Source class class Source(Base) Реализует внутреннюю операцию Source; точный contract виден в сигнатуре. L37–L55
Tender class class Tender(Base) Реализует внутреннюю операцию Tender; точный contract виден в сигнатуре. L58–L110
Attachment class class Attachment(Base) Реализует внутреннюю операцию Attachment; точный contract виден в сигнатуре. L113–L154
Chunk class class Chunk(Base) Реализует внутреннюю операцию Chunk; точный contract виден в сигнатуре. L157–L185
ApiKey class class ApiKey(Base) Реализует внутреннюю операцию ApiKey; точный contract виден в сигнатуре. L188–L211

src/tender_lens/nats.py

Узкая интеграция NATS JetStream для одного события индексации.

Imports: __future__, asyncio, collections.abc, tender_lens.config, tender_lens.errors, tender_lens.schemas, typing

Символ Вид Сигнатура Ответственность Исходник
NatsMessage class class NatsMessage Минимальная обёртка, чтобы indexer не зависел от типов nats-py. L14–L31
NatsMessage.__init__ method def __init__(self, raw_message: Any) -> None Сохраняет dependencies и начальное состояние NatsMessage. L17–L19
NatsMessage.ack async method async def ack(self) -> None Реализует внутреннюю операцию ack; точный contract виден в сигнатуре. L21–L22
NatsMessage.nak async method async def nak(self, delay: float \| None=None) -> None Реализует внутреннюю операцию nak; точный contract виден в сигнатуре. L24–L28
NatsMessage.term async method async def term(self) -> None Реализует внутреннюю операцию term; точный contract виден в сигнатуре. L30–L31
NatsBroker class class NatsBroker Создаёт JetStream stream, публикует events и читает durable consumer. L34–L145
NatsBroker.__init__ method def __init__(self, settings: Settings) -> None Сохраняет dependencies и начальное состояние NatsBroker. L35–L38
NatsBroker.connect async method async def connect(self) -> None Реализует внутреннюю операцию connect; точный contract виден в сигнатуре. L40–L53
NatsBroker.ensure_stream async method async def ensure_stream(self) -> None Реализует внутреннюю операцию ensure stream; точный contract виден в сигнатуре. L55–L80
NatsBroker.publish_tender_changed async method async def publish_tender_changed(self, event: TenderChangedV1) -> str Реализует внутреннюю операцию publish tender changed; точный contract виден в сигнатуре. L82–L93
NatsBroker.iter_messages async method async def iter_messages(self, *, batch: int=1, timeout: float=1.0) -> AsyncIterator[NatsMessage] Реализует внутреннюю операцию iter messages; точный contract виден в сигнатуре. L95–L138
NatsBroker.close async method async def close(self) -> None Реализует внутреннюю операцию close; точный contract виден в сигнатуре. L140–L145
InMemoryBroker class class InMemoryBroker Детерминированный broker для unit/e2e без внешнего NATS. L148–L162
InMemoryBroker.__init__ method def __init__(self) -> None Сохраняет dependencies и начальное состояние InMemoryBroker. L151–L152
InMemoryBroker.connect async method async def connect(self) -> None Реализует внутреннюю операцию connect; точный contract виден в сигнатуре. L154–L155
InMemoryBroker.publish_tender_changed async method async def publish_tender_changed(self, event: TenderChangedV1) -> str Реализует внутреннюю операцию publish tender changed; точный contract виден в сигнатуре. L157–L159
InMemoryBroker.close async method async def close(self) -> None Реализует внутреннюю операцию close; точный contract виден в сигнатуре. L161–L162

src/tender_lens/schemas.py

Pydantic-контракты источников, NATS и HTTP API.

Imports: __future__, datetime, decimal, pydantic, typing, uuid

Символ Вид Сигнатура Ответственность Исходник
_empty_to_none function def _empty_to_none(value: str \| None) -> str \| None Реализует внутреннюю операцию empty to none; точный contract виден в сигнатуре. L20–L24
AttachmentRecordV1 class class AttachmentRecordV1(BaseModel) Реализует внутреннюю операцию AttachmentRecordV1; точный contract виден в сигнатуре. L27–L46
AttachmentRecordV1.normalize_optional_strings method def normalize_optional_strings(cls, value: Any) -> Any Нормализует или валидирует normalize optional strings по contract rules. L38–L39
AttachmentRecordV1.normalize_filename method def normalize_filename(cls, value: Any) -> str Нормализует или валидирует normalize filename по contract rules. L43–L46
TenderRecordV1 class class TenderRecordV1(BaseModel) Реализует внутреннюю операцию TenderRecordV1; точный contract виден в сигнатуре. L49–L99
TenderRecordV1.normalize_required_strings method def normalize_required_strings(cls, value: Any) -> str Нормализует или валидирует normalize required strings по contract rules. L67–L70
TenderRecordV1.normalize_optional_strings method def normalize_optional_strings(cls, value: Any) -> Any Нормализует или валидирует normalize optional strings по contract rules. L74–L75
TenderRecordV1.normalize_currency method def normalize_currency(cls, value: Any) -> str \| None Нормализует или валидирует normalize currency по contract rules. L79–L86
TenderRecordV1.normalize_datetime method def normalize_datetime(cls, value: datetime \| None) -> datetime \| None Нормализует или валидирует normalize datetime по contract rules. L90–L95
TenderRecordV1.serialize_amount method def serialize_amount(self, value: Decimal \| None) -> str \| None Реализует внутреннюю операцию serialize amount; точный contract виден в сигнатуре. L98–L99
TenderChangedV1 class class TenderChangedV1(BaseModel) Реализует внутреннюю операцию TenderChangedV1; точный contract виден в сигнатуре. L102–L116
TenderChangedV1.normalize_timestamp method def normalize_timestamp(cls, value: datetime) -> datetime Нормализует или валидирует normalize timestamp по contract rules. L113–L116
SearchRequest class class SearchRequest(BaseModel) Реализует внутреннюю операцию SearchRequest; точный contract виден в сигнатуре. L119–L131
SearchRequest.query_must_not_be_blank method def query_must_not_be_blank(cls, value: str) -> str Реализует внутреннюю операцию query must not be blank; точный contract виден в сигнатуре. L127–L131
AskRequest class class AskRequest(SearchRequest) Реализует внутреннюю операцию AskRequest; точный contract виден в сигнатуре. L134–L135
AttachmentBrief class class AttachmentBrief(BaseModel) Реализует внутреннюю операцию AttachmentBrief; точный contract виден в сигнатуре. L138–L140
SearchResult class class SearchResult(BaseModel) Реализует внутреннюю операцию SearchResult; точный contract виден в сигнатуре. L143–L150
SearchResponse class class SearchResponse(BaseModel) Реализует внутреннюю операцию SearchResponse; точный contract виден в сигнатуре. L153–L155
AskResponse class class AskResponse(BaseModel) Реализует внутреннюю операцию AskResponse; точный contract виден в сигнатуре. L158–L160
AttachmentDetails class class AttachmentDetails(BaseModel) Реализует внутреннюю операцию AttachmentDetails; точный contract виден в сигнатуре. L163–L169
TenderDetails class class TenderDetails(BaseModel) Реализует внутреннюю операцию TenderDetails; точный contract виден в сигнатуре. L172–L189
TenderDetails.serialize_amount method def serialize_amount(self, value: Decimal \| None) -> str \| None Реализует внутреннюю операцию serialize amount; точный contract виден в сигнатуре. L188–L189
ErrorBody class class ErrorBody(BaseModel) Реализует внутреннюю операцию ErrorBody; точный contract виден в сигнатуре. L192–L196
ErrorResponse class class ErrorResponse(BaseModel) Реализует внутреннюю операцию ErrorResponse; точный contract виден в сигнатуре. L199–L200

src/tender_lens/search.py

Exact cosine retrieval и grounded RAG поверх PostgreSQL/pgvector.

Imports: __future__, sqlalchemy, sqlalchemy.ext.asyncio, tender_lens.ai, tender_lens.schemas, typing

Символ Вид Сигнатура Ответственность Исходник
vector_literal function def vector_literal(vector: list[float]) -> str Реализует внутреннюю операцию vector literal; точный contract виден в сигнатуре. L14–L15
SearchService class class SearchService Выполняет pgvector retrieval и grounded generation. L18–L92
SearchService.__init__ method def __init__(self, ai: AIProvider, min_relevance_score: float=0.2) -> None Сохраняет dependencies и начальное состояние SearchService. L19–L21
SearchService.search async method async def search(self, session: AsyncSession, query: str, limit: int) -> SearchResponse Реализует внутреннюю операцию search; точный contract виден в сигнатуре. L23–L81
SearchService.ask async method async def ask(self, session: AsyncSession, query: str, limit: int) -> AskResponse Реализует внутреннюю операцию ask; точный contract виден в сигнатуре. L83–L92
InMemorySearchService class class InMemorySearchService Упрощённая реализация для HTTP-тестов без PostgreSQL. L95–L112
InMemorySearchService.__init__ method def __init__(self, items: list[SearchResult] \| None=None, answer: str='Тестовый ответ') -> None Сохраняет dependencies и начальное состояние InMemorySearchService. L98–L104
InMemorySearchService.search async method async def search(self, session: Any, query: str, limit: int) -> SearchResponse Реализует внутреннюю операцию search; точный contract виден в сигнатуре. L106–L108
InMemorySearchService.ask async method async def ask(self, session: Any, query: str, limit: int) -> AskResponse Реализует внутреннюю операцию ask; точный contract виден в сигнатуре. L110–L112

src/tender_lens/storage.py

Безопасная потоковая загрузка вложений в локальный volume.

Imports: __future__, dataclasses, hashlib, os, pathlib, re, tender_lens.crawler.base, tender_lens.errors, uuid

Символ Вид Сигнатура Ответственность Исходник
DownloadResult class class DownloadResult Реализует внутреннюю операцию DownloadResult; точный contract виден в сигнатуре. L19–L23
safe_filename function def safe_filename(value: str) -> str Удаляет traversal, null byte и опасные символы из внешнего имени. L26–L37
attachment_path function def attachment_path(root: Path, tender_id: UUID, attachment_id: UUID, filename: str) -> Path Реализует внутреннюю операцию attachment path; точный contract виден в сигнатуре. L40–L43
download_attachment async function async def download_attachment(*, client: ResilientHttpClient, url: str, root: Path, tender_id: UUID, attachment_id: UUID, filename: str, max_bytes: int) -> DownloadResult Потоково и атомарно сохраняет ограниченное по размеру вложение. L46–L99

migrations/env.py

Подключает async SQLAlchemy engine и metadata к Alembic runtime.

Imports: __future__, alembic, asyncio, logging.config, sqlalchemy, sqlalchemy.engine, sqlalchemy.ext.asyncio, tender_lens.config, tender_lens.models

Символ Вид Сигнатура Ответственность Исходник
run_migrations_offline function def run_migrations_offline() -> None Реализует внутреннюю операцию run migrations offline; точный contract виден в сигнатуре. L23–L32
do_run_migrations function def do_run_migrations(connection: Connection) -> None Реализует внутреннюю операцию do run migrations; точный contract виден в сигнатуре. L35–L38
run_async_migrations async function async def run_async_migrations() -> None Реализует внутреннюю операцию run async migrations; точный contract виден в сигнатуре. L41–L49
run_migrations_online function def run_migrations_online() -> None Реализует внутреннюю операцию run migrations online; точный contract виден в сигнатуре. L52–L53

migrations/versions/0001_initial_schema.py

Создание минимальной схемы TenderLens.

Imports: alembic, pgvector.sqlalchemy, sqlalchemy, sqlalchemy.dialects, typing

Символ Вид Сигнатура Ответственность Исходник
upgrade function def upgrade() -> None Реализует внутреннюю операцию upgrade; точный contract виден в сигнатуре. L21–L181
downgrade function def downgrade() -> None Реализует внутреннюю операцию downgrade; точный contract виден в сигнатуре. L184–L197

scripts/check_docs.py

Validate generated docs, exact GitHub line links, and built search content.

Imports: __future__, json, pathlib, re, struct, subprocess, sys, urllib.parse

Символ Вид Сигнатура Ответственность Исходник
validate_reference function def validate_reference() -> list[str] Нормализует или валидирует validate reference по contract rules. L21–L31
validate_source_links function def validate_source_links() -> list[str] Нормализует или валидирует validate source links по contract rules. L34–L52
validate_search_index function def validate_search_index() -> list[str] Нормализует или валидирует validate search index по contract rules. L55–L69
validate_dark_theme_tokens function def validate_dark_theme_tokens() -> list[str] Нормализует или валидирует validate dark theme tokens по contract rules. L72–L91
validate_ui_screenshots function def validate_ui_screenshots() -> list[str] Ensure the published gallery contains real PNG captures at expected viewports. L94–L127
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L130–L141

scripts/export_schemas.py

Экспортирует JSON Schema из Pydantic-контрактов без ручного дублирования.

Imports: __future__, argparse, json, pathlib, pydantic, tender_lens.schemas, typing

Символ Вид Сигнатура Ответственность Исходник
build_schema function def build_schema(model: ModelType, schema_id: str) -> dict Возвращает детерминированную Draft 2020-12 схему для validation contract. L29–L37
export function def export(*, check: bool=False) -> int Реализует внутреннюю операцию export; точный contract виден в сигнатуре. L40–L58
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L61–L64

scripts/generate_code_reference.py

Generate searchable repository, symbol, frontend, and test reference pages.

Imports: __future__, argparse, ast, dataclasses, html, pathlib, re, subprocess, typing

Символ Вид Сигнатура Ответственность Исходник
Symbol class class Symbol Реализует внутреннюю операцию Symbol; точный contract виден в сигнатуре. L92–L98
run_git function def run_git(*args: str) -> str Реализует внутреннюю операцию run git; точный contract виден в сигнатуре. L101–L102
repository_files function def repository_files() -> list[Path] Реализует внутреннюю операцию repository files; точный contract виден в сигнатуре. L105–L118
source_url function def source_url(path: Path, start: int \| None=None, end: int \| None=None) -> str Реализует внутреннюю операцию source url; точный contract виден в сигнатуре. L121–L127
text_info function def text_info(path: Path) -> tuple[int \| None, int] Реализует внутреннюю операцию text info; точный contract виден в сигнатуре. L130–L141
first_heading function def first_heading(content: str) -> str \| None Реализует внутреннюю операцию first heading; точный contract виден в сигнатуре. L144–L146
module_docstring function def module_docstring(path: Path) -> str \| None Реализует внутреннюю операцию module docstring; точный contract виден в сигнатуре. L149–L155
first_sentence function def first_sentence(value: str) -> str Реализует внутреннюю операцию first sentence; точный contract виден в сигнатуре. L158–L161
file_description function def file_description(path: Path) -> str Реализует внутреннюю операцию file description; точный contract виден в сигнатуре. L164–L211
file_kind function def file_kind(path: Path) -> str Реализует внутреннюю операцию file kind; точный contract виден в сигнатуре. L214–L230
tree_node function def tree_node(paths: Iterable[Path]) -> dict[str, object] Реализует внутреннюю операцию tree node; точный contract виден в сигнатуре. L233–L240
render_tree function def render_tree(node: dict[str, object], depth: int=0) -> list[str] Реализует внутреннюю операцию render tree; точный contract виден в сигнатуре. L243–L256
generate_repository_tree function def generate_repository_tree(paths: list[Path]) -> str Реализует внутреннюю операцию generate repository tree; точный contract виден в сигнатуре. L259–L296
signature function def signature(node: ast.ClassDef \| ast.FunctionDef \| ast.AsyncFunctionDef) -> str Реализует внутреннюю операцию signature; точный contract виден в сигнатуре. L299–L305
describe_symbol function def describe_symbol(node: ast.AST, qualname: str) -> str Реализует внутреннюю операцию describe symbol; точный contract виден в сигнатуре. L308–L341
symbols_in function def symbols_in(tree: ast.Module) -> list[Symbol] Реализует внутреннюю операцию symbols in; точный contract виден в сигнатуре. L344–L380
imports_in function def imports_in(tree: ast.Module) -> list[str] Реализует внутреннюю операцию imports in; точный contract виден в сигнатуре. L383–L390
generate_python_api function def generate_python_api(paths: list[Path]) -> str Реализует внутреннюю операцию generate python api; точный contract виден в сигнатуре. L393–L449
line_number function def line_number(content: str, offset: int) -> int Реализует внутреннюю операцию line number; точный contract виден в сигнатуре. L452–L453
generate_frontend_api function def generate_frontend_api() -> str Реализует внутреннюю операцию generate frontend api; точный contract виден в сигнатуре. L456–L534
describe_test function def describe_test(name: str) -> str Реализует внутреннюю операцию describe test; точный contract виден в сигнатуре. L557–L559
generate_test_catalog function def generate_test_catalog(paths: list[Path]) -> str Реализует внутреннюю операцию generate test catalog; точный contract виден в сигнатуре. L562–L602
escape_table function def escape_table(value: str) -> str Реализует внутреннюю операцию escape table; точный contract виден в сигнатуре. L605–L606
outputs function def outputs() -> dict[Path, str] Реализует внутреннюю операцию outputs; точный contract виден в сигнатуре. L609–L616
generate function def generate(*, check: bool) -> int Реализует внутреннюю операцию generate; точный contract виден в сигнатуре. L619–L635
main function def main() -> None Запускает lifecycle соответствующей CLI/worker роли. L638–L641