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 |