diff --git a/WIP.md b/WIP.md index d83a650..a2252b0 100644 --- a/WIP.md +++ b/WIP.md @@ -20,7 +20,7 @@ - [x] Тесты unit (46 тестов, 92% coverage) - [x] Документация (README + docs/) - [x] **Аудит эндпоинтов** — все 33 endpoint протестированы ✅ -- [x] **Автогенерация документации** — mkdocstrings+griffe ✅ +- [x] **Автогенерация документации** — pydoc-markdown ✅ - [ ] Добавить `/kworks` endpoint (альтернатива каталогу) - [ ] Добавить `/api/validation/checktext` (валидация текста) - [ ] Тесты integration (шаблон готов, нужны реальные credentials) @@ -42,44 +42,38 @@ ## 📝 Заметки -### Автогенерация документации (2026-03-23 03:44) +### Автогенерация документации (2026-03-23 04:17) -**Инструмент:** mkdocstrings + griffe +**Инструмент:** pydoc-markdown + MkDocs **Структура:** ``` docs/ -├── index.md # Quick start -├── api-reference.md # Auto-generated from docstrings -└── examples.md # Usage examples +├── index.md # Quick start +├── api_reference.md # Auto-generated from docstrings +└── examples.md # Usage examples -site/ # Generated HTML (не коммитим) +site/ # Generated HTML (не коммитим) ├── index.html -├── api-reference/ +├── api_reference/ └── ... ``` **Конфигурация:** +- `pydoc-markdown.yml` — конфигурация pydoc-markdown - `mkdocs.yml` — MkDocs конфигурация -- `.git/hooks/pre-commit` — автогенерация при коммите - -**Pre-commit hook:** -```bash -# При каждом коммите: -mkdocs build --quiet -# Генерирует site/ с HTML документацией -``` +- `scripts/gen_docs.py` — скрипт генерации **Команды:** ```bash +# Генерация документации +uv run python scripts/gen_docs.py + # Локальный просмотр mkdocs serve # Сборка mkdocs build - -# Деплой -mkdocs gh-deploy ``` ### Аудит эндпоинтов (2026-03-23 03:08) diff --git a/mkdocs.yml b/mkdocs.yml index 29457e8..4b12060 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -25,21 +25,6 @@ theme: plugins: - search - - mkdocstrings: - handlers: - python: - paths: [src] - options: - docstring_style: google - show_source: true - show_root_heading: true - show_category_heading: true - merge_init_into_class: true - separate_signature: true - signature_crossrefs: true - filters: - - "!^_" # Скрыть приватные методы - - "^__init__" # Показать __init__ markdown_extensions: - admonition @@ -54,9 +39,6 @@ markdown_extensions: smart_enable: all - pymdownx.caret - pymdownx.details - - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - pymdownx.inlinehilite - pymdownx.keys - pymdownx.magiclink: @@ -74,9 +56,5 @@ markdown_extensions: nav: - Home: index.md - - API Reference: - - Overview: api-reference.md - - Client: api/client.md - - Models: api/models.md - - Errors: api/errors.md + - API Reference: api_reference.md - Examples: examples.md diff --git a/pydoc-markdown.yml b/pydoc-markdown.yml new file mode 100644 index 0000000..8bf21cf --- /dev/null +++ b/pydoc-markdown.yml @@ -0,0 +1,18 @@ +loaders: + - type: python + search_path: [src] + packages: [kwork_api] + +processors: + - type: filter + skip_empty_modules: true + documented_only: true + do_not_filter_modules: true + expression: "not (name.startswith('_') and not name.startswith('__'))" + - type: smart + - type: crossref + +renderer: + type: markdown + filename: api_reference.md + render_toc: true diff --git a/pyproject.toml b/pyproject.toml index 6a3566f..8b9c8c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,13 +47,14 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/kwork_api"] -[tool.uv] -dev-dependencies = [ +[dependency-groups] +dev = [ "pytest>=8.0.0", "pytest-cov>=4.0.0", "pytest-asyncio>=0.23.0", "respx>=0.20.0", "ruff>=0.3.0", + "pydoc-markdown>=4.8.2", ] [tool.pytest.ini_options] @@ -97,3 +98,9 @@ exclude_lines = [ "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] + +[tool.pydoc-markdown] +config = "pydoc-markdown.yml" + +[project.scripts] +gen-docs = "scripts.gen_docs:main" diff --git a/scripts/gen_docs.py b/scripts/gen_docs.py new file mode 100644 index 0000000..1d04fe1 --- /dev/null +++ b/scripts/gen_docs.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +"""Generate API documentation using pydoc-markdown.""" + +import subprocess +import sys +from pathlib import Path + + +def main(): + """Generate documentation and build MkDocs site.""" + project_root = Path(__file__).parent.parent + + print("📝 Generating API documentation...") + result = subprocess.run( + ["pydoc-markdown"], + cwd=project_root, + capture_output=False, + ) + + if result.returncode != 0: + print("❌ Failed to generate documentation") + return 1 + + print("✅ Documentation generated: docs/api_reference.md") + + print("🏗️ Building MkDocs site...") + result = subprocess.run( + ["mkdocs", "build", "--quiet"], + cwd=project_root, + capture_output=False, + ) + + if result.returncode != 0: + print("❌ Failed to build MkDocs site") + return 1 + + print("✅ Site built: site/") + print("\n✨ Done! Run 'mkdocs serve' to preview locally.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/site/404.html b/site/404.html index 51725bf..b9f853e 100644 --- a/site/404.html +++ b/site/404.html @@ -47,8 +47,6 @@ - - @@ -234,18 +232,17 @@ - - -
  • - - +
  • + + + + API Reference - -
  • - + + @@ -348,25 +345,9 @@ - - - - - - +
  • + - - - -
  • - - - - - - - - - - -
  • - - diff --git a/site/api-reference/index.html b/site/api-reference/index.html index 16f86a1..c78f979 100644 --- a/site/api-reference/index.html +++ b/site/api-reference/index.html @@ -13,10 +13,6 @@ - - - - @@ -27,7 +23,7 @@ - Overview - Kwork API + API Reference - Kwork API @@ -53,8 +49,6 @@ - - @@ -114,7 +108,7 @@
    - Overview + API Reference
    @@ -244,21 +238,18 @@ - + +
  • + + - -
  • - - - API Reference - -
  • - + + @@ -359,32 +350,11 @@ - - - - - - - +
  • + - - - - - - - -
  • - - - - - - - - - -
  • @@ -1494,3119 +423,16 @@

    API Reference

    Auto-generated API documentation using mkdocstrings.

    Client

    - - -
    - - - -

    - kwork_api.client.KworkClient - - -

    -
    KworkClient(
    -    token=None, cookies=None, timeout=30.0, base_url=None
    -)
    -
    - -
    - - - -

    Kwork.ru API client.

    - - -
    - Usage -

    Login with credentials

    -

    client = await KworkClient.login("username", "password")

    -

    Or restore from token

    -

    client = KworkClient(token="your_web_auth_token")

    -

    Make requests

    -

    catalog = await client.catalog.get_list(page=1)

    -
    -

    Initialize client.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - token - - Optional[str] - -
    -

    Web auth token (from getWebAuthToken)

    -
    -
    - None -
    - cookies - - Optional[dict[str, str]] - -
    -

    Session cookies (optional, will be set from token)

    -
    -
    - None -
    - timeout - - float - -
    -

    Request timeout in seconds

    -
    -
    - 30.0 -
    - base_url - - Optional[str] - -
    -

    Custom base URL (for testing)

    -
    -
    - None -
    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    def __init__(
    -    self,
    -    token: Optional[str] = None,
    -    cookies: Optional[dict[str, str]] = None,
    -    timeout: float = 30.0,
    -    base_url: Optional[str] = None,
    -):
    -    """
    -    Initialize client.
    -
    -    Args:
    -        token: Web auth token (from getWebAuthToken)
    -        cookies: Session cookies (optional, will be set from token)
    -        timeout: Request timeout in seconds
    -        base_url: Custom base URL (for testing)
    -    """
    -    self.base_url = base_url or self.BASE_URL
    -    self.timeout = timeout
    -    self._token = token
    -    self._cookies = cookies or {}
    -
    -    # Initialize HTTP client
    -    self._client: Optional[httpx.AsyncClient] = None
    -
    -
    - - - -
    - - - - - -

    Attributes

    - -
    - - - -

    - catalog - - - - property - - -

    -
    catalog
    -
    - -
    - -

    Catalog API.

    - -
    - -
    - -
    - - - -

    - notifications - - - - property - - -

    -
    notifications
    -
    - -
    - -

    Notifications API.

    - -
    - -
    - -
    - - - -

    - other - - - - property - - -

    -
    other
    -
    - -
    - -

    Other endpoints.

    - -
    - -
    - -
    - - - -

    - projects - - - - property - - -

    -
    projects
    -
    - -
    - -

    Projects API.

    - -
    - -
    - -
    - - - -

    - reference - - - - property - - -

    -
    reference
    -
    - -
    - -

    Reference data API.

    - -
    - -
    - -
    - - - -

    - user - - - - property - - -

    -
    user
    -
    - -
    - -

    User API.

    - -
    - -
    - -

    Classes

    - -
    - - - -

    - CatalogAPI - - -

    -
    CatalogAPI(client)
    -
    - -
    - - - -

    Catalog/Kworks API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    266
    -267
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_details - - - - async - - -
    -
    get_details(kwork_id)
    -
    - -
    - -

    Get kwork details.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - kwork_id - - int - -
    -

    Kwork ID

    -
    -
    - required -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkDetails - -
    -

    KworkDetails with full information

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    async def get_details(self, kwork_id: int) -> KworkDetails:
    -    """
    -    Get kwork details.
    -
    -    Args:
    -        kwork_id: Kwork ID
    -
    -    Returns:
    -        KworkDetails with full information
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/getKworkDetails",
    -        json={"kwork_id": kwork_id},
    -    )
    -    return KworkDetails.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_details_extra - - - - async - - -
    -
    get_details_extra(kwork_id)
    -
    - -
    - -

    Get additional kwork details.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - kwork_id - - int - -
    -

    Kwork ID

    -
    -
    - required -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - dict[str, Any] - -
    -

    Extra details dict

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    async def get_details_extra(self, kwork_id: int) -> dict[str, Any]:
    -    """
    -    Get additional kwork details.
    -
    -    Args:
    -        kwork_id: Kwork ID
    -
    -    Returns:
    -        Extra details dict
    -    """
    -    return await self.client._request(
    -        "POST",
    -        "/getKworkDetailsExtra",
    -        json={"kwork_id": kwork_id},
    -    )
    -
    -
    -
    - -
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list(page=1, category_id=None, sort='recommend')
    -
    - -
    - -

    Get kworks catalog.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - category_id - - Optional[int] - -
    -

    Category filter

    -
    -
    - None -
    - sort - - str - -
    -

    Sort option (recommend, price_asc, price_desc, etc.)

    -
    -
    - 'recommend' -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - CatalogResponse - -
    -

    CatalogResponse with kworks and pagination

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    async def get_list(
    -    self,
    -    page: int = 1,
    -    category_id: Optional[int] = None,
    -    sort: str = "recommend",
    -) -> CatalogResponse:
    -    """
    -    Get kworks catalog.
    -
    -    Args:
    -        page: Page number
    -        category_id: Category filter
    -        sort: Sort option (recommend, price_asc, price_desc, etc.)
    -
    -    Returns:
    -        CatalogResponse with kworks and pagination
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/catalogMainv2",
    -        json={
    -            "page": page,
    -            "category_id": category_id,
    -            "sort": sort,
    -        },
    -    )
    -    return CatalogResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - NotificationsAPI - - -

    -
    NotificationsAPI(client)
    -
    - -
    - - - -

    Notifications and messages endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    475
    -476
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - fetch - - - - async - - -
    -
    fetch()
    -
    - -
    - -

    Fetch new notifications.

    - - -
    - Source code in src/kwork_api/client.py -
    483
    -484
    -485
    -486
    async def fetch(self) -> NotificationsResponse:
    -    """Fetch new notifications."""
    -    data = await self.client._request("POST", "/notificationsFetch")
    -    return NotificationsResponse.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_blocked_dialogs - - - - async - - -
    -
    get_blocked_dialogs()
    -
    - -
    - -

    Get blocked dialogs.

    - - -
    - Source code in src/kwork_api/client.py -
    493
    -494
    -495
    -496
    async def get_blocked_dialogs(self) -> list[Dialog]:
    -    """Get blocked dialogs."""
    -    data = await self.client._request("POST", "/blockedDialogList")
    -    return [Dialog.model_validate(d) for d in data.get("dialogs", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_dialogs - - - - async - - -
    -
    get_dialogs()
    -
    - -
    - -

    Get dialogs list.

    - - -
    - Source code in src/kwork_api/client.py -
    488
    -489
    -490
    -491
    async def get_dialogs(self) -> list[Dialog]:
    -    """Get dialogs list."""
    -    data = await self.client._request("POST", "/dialogs")
    -    return [Dialog.model_validate(d) for d in data.get("dialogs", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list()
    -
    - -
    - -

    Get notifications list.

    - - -
    - Source code in src/kwork_api/client.py -
    478
    -479
    -480
    -481
    async def get_list(self) -> NotificationsResponse:
    -    """Get notifications list."""
    -    data = await self.client._request("POST", "/notifications")
    -    return NotificationsResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - OtherAPI - - -

    -
    OtherAPI(client)
    -
    - -
    - - - -

    Other API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    503
    -504
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_actor - - - - async - - -
    -
    get_actor()
    -
    - -
    - -

    Get actor info.

    - - -
    - Source code in src/kwork_api/client.py -
    565
    -566
    -567
    async def get_actor(self) -> dict[str, Any]:
    -    """Get actor info."""
    -    return await self.client._request("POST", "/actor")
    -
    -
    -
    - -
    - -
    - - -
    - get_channel - - - - async - - -
    -
    get_channel()
    -
    - -
    - -

    Get channel info.

    - - -
    - Source code in src/kwork_api/client.py -
    526
    -527
    -528
    async def get_channel(self) -> dict[str, Any]:
    -    """Get channel info."""
    -    return await self.client._request("POST", "/getChannel")
    -
    -
    -
    - -
    - -
    - - -
    - get_exchange_info - - - - async - - -
    -
    get_exchange_info()
    -
    - -
    - -

    Get exchange info.

    - - -
    - Source code in src/kwork_api/client.py -
    522
    -523
    -524
    async def get_exchange_info(self) -> dict[str, Any]:
    -    """Get exchange info."""
    -    return await self.client._request("POST", "/exchangeInfo")
    -
    -
    -
    - -
    - -
    - - -
    - get_favorite_categories - - - - async - - -
    -
    get_favorite_categories()
    -
    - -
    - -

    Get favorite categories.

    - - -
    - Source code in src/kwork_api/client.py -
    552
    -553
    -554
    -555
    async def get_favorite_categories(self) -> list[int]:
    -    """Get favorite categories."""
    -    data = await self.client._request("POST", "/favoriteCategories")
    -    return data.get("categories", [])
    -
    -
    -
    - -
    - -
    - - -
    - get_in_app_notification - - - - async - - -
    -
    get_in_app_notification()
    -
    - -
    - -

    Get in-app notification.

    - - -
    - Source code in src/kwork_api/client.py -
    530
    -531
    -532
    async def get_in_app_notification(self) -> dict[str, Any]:
    -    """Get in-app notification."""
    -    return await self.client._request("POST", "/getInAppNotification")
    -
    -
    -
    - -
    - -
    - - -
    - get_kworks_status - - - - async - - -
    -
    get_kworks_status()
    -
    - -
    - -

    Get kworks status.

    - - -
    - Source code in src/kwork_api/client.py -
    514
    -515
    -516
    async def get_kworks_status(self) -> dict[str, Any]:
    -    """Get kworks status."""
    -    return await self.client._request("POST", "/kworksStatusList")
    -
    -
    -
    - -
    - -
    - - -
    - get_offers - - - - async - - -
    -
    get_offers()
    -
    - -
    - -

    Get offers.

    - - -
    - Source code in src/kwork_api/client.py -
    518
    -519
    -520
    async def get_offers(self) -> dict[str, Any]:
    -    """Get offers."""
    -    return await self.client._request("POST", "/offers")
    -
    -
    -
    - -
    - -
    - - -
    - get_security_user_data - - - - async - - -
    -
    get_security_user_data()
    -
    - -
    - -

    Get security user data.

    - - -
    - Source code in src/kwork_api/client.py -
    534
    -535
    -536
    async def get_security_user_data(self) -> dict[str, Any]:
    -    """Get security user data."""
    -    return await self.client._request("POST", "/getSecurityUserData")
    -
    -
    -
    - -
    - -
    - - -
    - get_viewed_kworks - - - - async - - -
    -
    get_viewed_kworks()
    -
    - -
    - -

    Get viewed kworks.

    - - -
    - Source code in src/kwork_api/client.py -
    547
    -548
    -549
    -550
    async def get_viewed_kworks(self) -> list[Kwork]:
    -    """Get viewed kworks."""
    -    data = await self.client._request("POST", "/viewedCatalogKworks")
    -    return [Kwork.model_validate(k) for k in data.get("kworks", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_wants - - - - async - - -
    -
    get_wants()
    -
    - -
    - -

    Get user wants.

    - - -
    - Source code in src/kwork_api/client.py -
    506
    -507
    -508
    async def get_wants(self) -> dict[str, Any]:
    -    """Get user wants."""
    -    return await self.client._request("POST", "/myWants")
    -
    -
    -
    - -
    - -
    - - -
    - get_wants_status - - - - async - - -
    -
    get_wants_status()
    -
    - -
    - -

    Get wants status.

    - - -
    - Source code in src/kwork_api/client.py -
    510
    -511
    -512
    async def get_wants_status(self) -> dict[str, Any]:
    -    """Get wants status."""
    -    return await self.client._request("POST", "/wantsStatusList")
    -
    -
    -
    - -
    - -
    - - -
    - go_offline - - - - async - - -
    -
    go_offline()
    -
    - -
    - -

    Set user status to offline.

    - - -
    - Source code in src/kwork_api/client.py -
    561
    -562
    -563
    async def go_offline(self) -> dict[str, Any]:
    -    """Set user status to offline."""
    -    return await self.client._request("POST", "/offline")
    -
    -
    -
    - -
    - -
    - - -
    - is_dialog_allow - - - - async - - -
    -
    is_dialog_allow(user_id)
    -
    - -
    - -

    Check if dialog is allowed.

    - - -
    - Source code in src/kwork_api/client.py -
    538
    -539
    -540
    -541
    -542
    -543
    -544
    -545
    async def is_dialog_allow(self, user_id: int) -> bool:
    -    """Check if dialog is allowed."""
    -    data = await self.client._request(
    -        "POST",
    -        "/isDialogAllow",
    -        json={"user_id": user_id},
    -    )
    -    return data.get("allowed", False)
    -
    -
    -
    - -
    - -
    - - -
    - update_settings - - - - async - - -
    -
    update_settings(settings)
    -
    - -
    - -

    Update user settings.

    - - -
    - Source code in src/kwork_api/client.py -
    557
    -558
    -559
    async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]:
    -    """Update user settings."""
    -    return await self.client._request("POST", "/updateSettings", json=settings)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - ProjectsAPI - - -

    -
    ProjectsAPI(client)
    -
    - -
    - - - -

    Projects (freelance orders) API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    335
    -336
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list(page=1, category_id=None)
    -
    - -
    - -

    Get projects list.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - category_id - - Optional[int] - -
    -

    Category filter

    -
    -
    - None -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - ProjectsResponse - -
    -

    ProjectsResponse with projects and pagination

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
    -348
    -349
    -350
    -351
    -352
    -353
    -354
    -355
    -356
    -357
    -358
    -359
    -360
    -361
    async def get_list(
    -    self,
    -    page: int = 1,
    -    category_id: Optional[int] = None,
    -) -> ProjectsResponse:
    -    """
    -    Get projects list.
    -
    -    Args:
    -        page: Page number
    -        category_id: Category filter
    -
    -    Returns:
    -        ProjectsResponse with projects and pagination
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/projects",
    -        json={
    -            "page": page,
    -            "category_id": category_id,
    -        },
    -    )
    -    return ProjectsResponse.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_payer_orders - - - - async - - -
    -
    get_payer_orders()
    -
    - -
    - -

    Get orders where user is customer.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Project] - -
    -

    List of projects

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    363
    -364
    -365
    -366
    -367
    -368
    -369
    -370
    -371
    async def get_payer_orders(self) -> list[Project]:
    -    """
    -    Get orders where user is customer.
    -
    -    Returns:
    -        List of projects
    -    """
    -    data = await self.client._request("POST", "/payerOrders")
    -    return [Project.model_validate(p) for p in data.get("orders", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_worker_orders - - - - async - - -
    -
    get_worker_orders()
    -
    - -
    - -

    Get orders where user is performer.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Project] - -
    -

    List of projects

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    async def get_worker_orders(self) -> list[Project]:
    -    """
    -    Get orders where user is performer.
    -
    -    Returns:
    -        List of projects
    -    """
    -    data = await self.client._request("POST", "/workerOrders")
    -    return [Project.model_validate(p) for p in data.get("orders", [])]
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - ReferenceAPI - - -

    -
    ReferenceAPI(client)
    -
    - -
    - - - -

    Reference data (cities, countries, etc.) endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    437
    -438
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_badges_info - - - - async - - -
    -
    get_badges_info()
    -
    - -
    - -

    Get badges info.

    - - -
    - Source code in src/kwork_api/client.py -
    465
    -466
    -467
    -468
    async def get_badges_info(self) -> list[Badge]:
    -    """Get badges info."""
    -    data = await self.client._request("POST", "/getBadgesInfo")
    -    return [Badge.model_validate(b) for b in data.get("badges", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_cities - - - - async - - -
    -
    get_cities()
    -
    - -
    - -

    Get all cities.

    - - -
    - Source code in src/kwork_api/client.py -
    440
    -441
    -442
    -443
    async def get_cities(self) -> list[City]:
    -    """Get all cities."""
    -    data = await self.client._request("POST", "/cities")
    -    return [City.model_validate(c) for c in data.get("cities", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_countries - - - - async - - -
    -
    get_countries()
    -
    - -
    - -

    Get all countries.

    - - -
    - Source code in src/kwork_api/client.py -
    445
    -446
    -447
    -448
    async def get_countries(self) -> list[Country]:
    -    """Get all countries."""
    -    data = await self.client._request("POST", "/countries")
    -    return [Country.model_validate(c) for c in data.get("countries", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_features - - - - async - - -
    -
    get_features()
    -
    - -
    - -

    Get available features.

    - - -
    - Source code in src/kwork_api/client.py -
    455
    -456
    -457
    -458
    async def get_features(self) -> list[Feature]:
    -    """Get available features."""
    -    data = await self.client._request("POST", "/getAvailableFeatures")
    -    return [Feature.model_validate(f) for f in data.get("features", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_public_features - - - - async - - -
    -
    get_public_features()
    -
    - -
    - -

    Get public features.

    - - -
    - Source code in src/kwork_api/client.py -
    460
    -461
    -462
    -463
    async def get_public_features(self) -> list[Feature]:
    -    """Get public features."""
    -    data = await self.client._request("POST", "/getPublicFeatures")
    -    return [Feature.model_validate(f) for f in data.get("features", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_timezones - - - - async - - -
    -
    get_timezones()
    -
    - -
    - -

    Get all timezones.

    - - -
    - Source code in src/kwork_api/client.py -
    450
    -451
    -452
    -453
    async def get_timezones(self) -> list[TimeZone]:
    -    """Get all timezones."""
    -    data = await self.client._request("POST", "/timezones")
    -    return [TimeZone.model_validate(t) for t in data.get("timezones", [])]
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - UserAPI - - -

    -
    UserAPI(client)
    -
    - -
    - - - -

    User API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    388
    -389
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_favorite_kworks - - - - async - - -
    -
    get_favorite_kworks()
    -
    - -
    - -

    Get favorite kworks.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Kwork] - -
    -

    List of kworks

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    422
    -423
    -424
    -425
    -426
    -427
    -428
    -429
    -430
    async def get_favorite_kworks(self) -> list[Kwork]:
    -    """
    -    Get favorite kworks.
    -
    -    Returns:
    -        List of kworks
    -    """
    -    data = await self.client._request("POST", "/favoriteKworks")
    -    return [Kwork.model_validate(k) for k in data.get("kworks", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_info - - - - async - - -
    -
    get_info()
    -
    - -
    - -

    Get current user info.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - dict[str, Any] - -
    -

    User info dict

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    async def get_info(self) -> dict[str, Any]:
    -    """
    -    Get current user info.
    -
    -    Returns:
    -        User info dict
    -    """
    -    return await self.client._request("POST", "/user")
    -
    -
    -
    - -
    - -
    - - -
    - get_reviews - - - - async - - -
    -
    get_reviews(user_id=None, page=1)
    -
    - -
    - -

    Get user reviews.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - user_id - - Optional[int] - -
    -

    User ID (None for current user)

    -
    -
    - None -
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - ReviewsResponse - -
    -

    ReviewsResponse

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    400
    -401
    -402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    async def get_reviews(
    -    self,
    -    user_id: Optional[int] = None,
    -    page: int = 1,
    -) -> ReviewsResponse:
    -    """
    -    Get user reviews.
    -
    -    Args:
    -        user_id: User ID (None for current user)
    -        page: Page number
    -
    -    Returns:
    -        ReviewsResponse
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/userReviews",
    -        json={"user_id": user_id, "page": page},
    -    )
    -    return ReviewsResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    -

    Functions

    - -
    - - -

    - close - - - - async - - -

    -
    close()
    -
    - -
    - -

    Close HTTP client.

    - - -
    - Source code in src/kwork_api/client.py -
    179
    -180
    -181
    -182
    async def close(self) -> None:
    -    """Close HTTP client."""
    -    if self._client and not self._client.is_closed:
    -        await self._client.aclose()
    -
    -
    -
    - -
    - -
    - - -

    - login - - - - async - classmethod - - -

    -
    login(username, password, timeout=30.0)
    -
    - -
    - -

    Login with username and password.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - username - - str - -
    -

    Kwork username or email

    -
    -
    - required -
    - password - - str - -
    -

    Kwork password

    -
    -
    - required -
    - timeout - - float - -
    -

    Request timeout

    -
    -
    - 30.0 -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkClient - -
    -

    Authenticated KworkClient instance

    -
    -
    - - -

    Raises:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkAuthError - -
    -

    If login fails

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
     88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    @classmethod
    -async def login(
    -    cls,
    -    username: str,
    -    password: str,
    -    timeout: float = 30.0,
    -) -> "KworkClient":
    -    """
    -    Login with username and password.
    -
    -    Args:
    -        username: Kwork username or email
    -        password: Kwork password
    -        timeout: Request timeout
    -
    -    Returns:
    -        Authenticated KworkClient instance
    -
    -    Raises:
    -        KworkAuthError: If login fails
    -    """
    -    client = cls(timeout=timeout)
    -
    -    try:
    -        async with client._get_httpx_client() as http_client:
    -            # Step 1: Login to get session cookies
    -            login_data = {
    -                "login_or_email": username,
    -                "password": password,
    -            }
    -
    -            response = await http_client.post(
    -                cls.LOGIN_URL,
    -                data=login_data,
    -                headers={"Referer": "https://kwork.ru/"},
    -            )
    -
    -            if response.status_code != 200:
    -                raise KworkAuthError(f"Login failed: {response.status_code}")
    -
    -            # Extract cookies
    -            cookies = dict(response.cookies)
    -
    -            if "userId" not in cookies:
    -                raise KworkAuthError("Login failed: no userId in cookies")
    -
    -            # Step 2: Get web auth token
    -            token_response = await http_client.post(
    -                cls.TOKEN_URL,
    -                json={},
    -            )
    -
    -            if token_response.status_code != 200:
    -                raise KworkAuthError(f"Token request failed: {token_response.status_code}")
    -
    -            token_data = token_response.json()
    -            web_token = token_data.get("web_auth_token")
    -
    -            if not web_token:
    -                raise KworkAuthError("No web_auth_token in response")
    -
    -            # Create new client with token
    -            return cls(token=web_token, cookies=cookies, timeout=timeout)
    -
    -    except httpx.RequestError as e:
    -        raise KworkNetworkError(f"Login request failed: {e}")
    -
    -
    -
    - -
    - - - -
    - -
    - -

    Models

    - - -
    - - - -

    - kwork_api.models.Kwork - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Kwork (service) information.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - -

    - kwork_api.models.KworkDetails - - -

    - - -
    -

    - Bases: Kwork

    - - - -

    Extended kwork details.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - -

    - kwork_api.models.Project - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Project (freelance order) information.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - -

    - kwork_api.models.CatalogResponse - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Catalog response with kworks and pagination.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -

    Errors

    - - -
    - - - -

    - kwork_api.errors.KworkError - - -

    -
    KworkError(message, response=None)
    -
    - -
    -

    - Bases: Exception

    - - - -

    Base exception for all Kwork API errors.

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    13
    -14
    -15
    -16
    def __init__(self, message: str, response: Optional[Any] = None):
    -    self.message = message
    -    self.response = response
    -    super().__init__(self.message)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - -

    - kwork_api.errors.KworkAuthError - - -

    -
    KworkAuthError(
    -    message="Authentication failed", response=None
    -)
    -
    - -
    -

    - Bases: KworkError

    - - - -

    Authentication/authorization error.

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    25
    -26
    def __init__(self, message: str = "Authentication failed", response: Optional[Any] = None):
    -    super().__init__(message, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - -

    - kwork_api.errors.KworkApiError - - -

    -
    KworkApiError(message, status_code=None, response=None)
    -
    - -
    -

    - Bases: KworkError

    - - - -

    API request error (4xx, 5xx).

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    def __init__(
    -    self,
    -    message: str,
    -    status_code: Optional[int] = None,
    -    response: Optional[Any] = None,
    -):
    -    self.status_code = status_code
    -    super().__init__(message, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -
    +

    ::: kwork_api.client.KworkClient

    +

    Models

    +

    ::: kwork_api.models.Kwork

    +

    ::: kwork_api.models.KworkDetails

    +

    ::: kwork_api.models.Project

    +

    ::: kwork_api.models.CatalogResponse

    +

    Errors

    +

    ::: kwork_api.errors.KworkError

    +

    ::: kwork_api.errors.KworkAuthError

    +

    ::: kwork_api.errors.KworkApiError

    diff --git a/site/api/client/index.html b/site/api/client/index.html index 925abc3..44d1aa8 100644 --- a/site/api/client/index.html +++ b/site/api/client/index.html @@ -13,10 +13,6 @@ - - - - @@ -27,7 +23,7 @@ - Client - Kwork API + Client API - Kwork API @@ -53,8 +49,6 @@ - - @@ -114,7 +108,7 @@
    - Client + Client API
    @@ -244,21 +238,18 @@ - + +
  • + + - -
  • - - - API Reference - -
  • - + + @@ -359,32 +350,11 @@ - - - - - - - +
  • + - - - - - - - -
  • - - - - - - - - - - -
  • - - @@ -1382,2739 +421,11 @@

    Client API

    - - -
    - - - -

    - kwork_api.client.KworkClient - - -

    -
    KworkClient(
    -    token=None, cookies=None, timeout=30.0, base_url=None
    -)
    -
    - -
    - - - -

    Kwork.ru API client.

    - - -
    - Usage -

    Login with credentials

    -

    client = await KworkClient.login("username", "password")

    -

    Or restore from token

    -

    client = KworkClient(token="your_web_auth_token")

    -

    Make requests

    -

    catalog = await client.catalog.get_list(page=1)

    -
    -

    Initialize client.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - token - - Optional[str] - -
    -

    Web auth token (from getWebAuthToken)

    -
    -
    - None -
    - cookies - - Optional[dict[str, str]] - -
    -

    Session cookies (optional, will be set from token)

    -
    -
    - None -
    - timeout - - float - -
    -

    Request timeout in seconds

    -
    -
    - 30.0 -
    - base_url - - Optional[str] - -
    -

    Custom base URL (for testing)

    -
    -
    - None -
    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    def __init__(
    -    self,
    -    token: Optional[str] = None,
    -    cookies: Optional[dict[str, str]] = None,
    -    timeout: float = 30.0,
    -    base_url: Optional[str] = None,
    -):
    -    """
    -    Initialize client.
    -
    -    Args:
    -        token: Web auth token (from getWebAuthToken)
    -        cookies: Session cookies (optional, will be set from token)
    -        timeout: Request timeout in seconds
    -        base_url: Custom base URL (for testing)
    -    """
    -    self.base_url = base_url or self.BASE_URL
    -    self.timeout = timeout
    -    self._token = token
    -    self._cookies = cookies or {}
    -
    -    # Initialize HTTP client
    -    self._client: Optional[httpx.AsyncClient] = None
    -
    -
    - - - -
    - - - - - -

    Attributes

    - -
    - - - -

    - catalog - - - - property - - -

    -
    catalog
    -
    - -
    - -

    Catalog API.

    - -
    - -
    - -
    - - - -

    - notifications - - - - property - - -

    -
    notifications
    -
    - -
    - -

    Notifications API.

    - -
    - -
    - -
    - - - -

    - other - - - - property - - -

    -
    other
    -
    - -
    - -

    Other endpoints.

    - -
    - -
    - -
    - - - -

    - projects - - - - property - - -

    -
    projects
    -
    - -
    - -

    Projects API.

    - -
    - -
    - -
    - - - -

    - reference - - - - property - - -

    -
    reference
    -
    - -
    - -

    Reference data API.

    - -
    - -
    - -
    - - - -

    - user - - - - property - - -

    -
    user
    -
    - -
    - -

    User API.

    - -
    - -
    - -

    Classes

    - -
    - - - -

    - CatalogAPI - - -

    -
    CatalogAPI(client)
    -
    - -
    - - - -

    Catalog/Kworks API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    266
    -267
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_details - - - - async - - -
    -
    get_details(kwork_id)
    -
    - -
    - -

    Get kwork details.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - kwork_id - - int - -
    -

    Kwork ID

    -
    -
    - required -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkDetails - -
    -

    KworkDetails with full information

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    async def get_details(self, kwork_id: int) -> KworkDetails:
    -    """
    -    Get kwork details.
    -
    -    Args:
    -        kwork_id: Kwork ID
    -
    -    Returns:
    -        KworkDetails with full information
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/getKworkDetails",
    -        json={"kwork_id": kwork_id},
    -    )
    -    return KworkDetails.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_details_extra - - - - async - - -
    -
    get_details_extra(kwork_id)
    -
    - -
    - -

    Get additional kwork details.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - kwork_id - - int - -
    -

    Kwork ID

    -
    -
    - required -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - dict[str, Any] - -
    -

    Extra details dict

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    async def get_details_extra(self, kwork_id: int) -> dict[str, Any]:
    -    """
    -    Get additional kwork details.
    -
    -    Args:
    -        kwork_id: Kwork ID
    -
    -    Returns:
    -        Extra details dict
    -    """
    -    return await self.client._request(
    -        "POST",
    -        "/getKworkDetailsExtra",
    -        json={"kwork_id": kwork_id},
    -    )
    -
    -
    -
    - -
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list(page=1, category_id=None, sort='recommend')
    -
    - -
    - -

    Get kworks catalog.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - category_id - - Optional[int] - -
    -

    Category filter

    -
    -
    - None -
    - sort - - str - -
    -

    Sort option (recommend, price_asc, price_desc, etc.)

    -
    -
    - 'recommend' -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - CatalogResponse - -
    -

    CatalogResponse with kworks and pagination

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    async def get_list(
    -    self,
    -    page: int = 1,
    -    category_id: Optional[int] = None,
    -    sort: str = "recommend",
    -) -> CatalogResponse:
    -    """
    -    Get kworks catalog.
    -
    -    Args:
    -        page: Page number
    -        category_id: Category filter
    -        sort: Sort option (recommend, price_asc, price_desc, etc.)
    -
    -    Returns:
    -        CatalogResponse with kworks and pagination
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/catalogMainv2",
    -        json={
    -            "page": page,
    -            "category_id": category_id,
    -            "sort": sort,
    -        },
    -    )
    -    return CatalogResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - NotificationsAPI - - -

    -
    NotificationsAPI(client)
    -
    - -
    - - - -

    Notifications and messages endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    475
    -476
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - fetch - - - - async - - -
    -
    fetch()
    -
    - -
    - -

    Fetch new notifications.

    - - -
    - Source code in src/kwork_api/client.py -
    483
    -484
    -485
    -486
    async def fetch(self) -> NotificationsResponse:
    -    """Fetch new notifications."""
    -    data = await self.client._request("POST", "/notificationsFetch")
    -    return NotificationsResponse.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_blocked_dialogs - - - - async - - -
    -
    get_blocked_dialogs()
    -
    - -
    - -

    Get blocked dialogs.

    - - -
    - Source code in src/kwork_api/client.py -
    493
    -494
    -495
    -496
    async def get_blocked_dialogs(self) -> list[Dialog]:
    -    """Get blocked dialogs."""
    -    data = await self.client._request("POST", "/blockedDialogList")
    -    return [Dialog.model_validate(d) for d in data.get("dialogs", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_dialogs - - - - async - - -
    -
    get_dialogs()
    -
    - -
    - -

    Get dialogs list.

    - - -
    - Source code in src/kwork_api/client.py -
    488
    -489
    -490
    -491
    async def get_dialogs(self) -> list[Dialog]:
    -    """Get dialogs list."""
    -    data = await self.client._request("POST", "/dialogs")
    -    return [Dialog.model_validate(d) for d in data.get("dialogs", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list()
    -
    - -
    - -

    Get notifications list.

    - - -
    - Source code in src/kwork_api/client.py -
    478
    -479
    -480
    -481
    async def get_list(self) -> NotificationsResponse:
    -    """Get notifications list."""
    -    data = await self.client._request("POST", "/notifications")
    -    return NotificationsResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - OtherAPI - - -

    -
    OtherAPI(client)
    -
    - -
    - - - -

    Other API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    503
    -504
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_actor - - - - async - - -
    -
    get_actor()
    -
    - -
    - -

    Get actor info.

    - - -
    - Source code in src/kwork_api/client.py -
    565
    -566
    -567
    async def get_actor(self) -> dict[str, Any]:
    -    """Get actor info."""
    -    return await self.client._request("POST", "/actor")
    -
    -
    -
    - -
    - -
    - - -
    - get_channel - - - - async - - -
    -
    get_channel()
    -
    - -
    - -

    Get channel info.

    - - -
    - Source code in src/kwork_api/client.py -
    526
    -527
    -528
    async def get_channel(self) -> dict[str, Any]:
    -    """Get channel info."""
    -    return await self.client._request("POST", "/getChannel")
    -
    -
    -
    - -
    - -
    - - -
    - get_exchange_info - - - - async - - -
    -
    get_exchange_info()
    -
    - -
    - -

    Get exchange info.

    - - -
    - Source code in src/kwork_api/client.py -
    522
    -523
    -524
    async def get_exchange_info(self) -> dict[str, Any]:
    -    """Get exchange info."""
    -    return await self.client._request("POST", "/exchangeInfo")
    -
    -
    -
    - -
    - -
    - - -
    - get_favorite_categories - - - - async - - -
    -
    get_favorite_categories()
    -
    - -
    - -

    Get favorite categories.

    - - -
    - Source code in src/kwork_api/client.py -
    552
    -553
    -554
    -555
    async def get_favorite_categories(self) -> list[int]:
    -    """Get favorite categories."""
    -    data = await self.client._request("POST", "/favoriteCategories")
    -    return data.get("categories", [])
    -
    -
    -
    - -
    - -
    - - -
    - get_in_app_notification - - - - async - - -
    -
    get_in_app_notification()
    -
    - -
    - -

    Get in-app notification.

    - - -
    - Source code in src/kwork_api/client.py -
    530
    -531
    -532
    async def get_in_app_notification(self) -> dict[str, Any]:
    -    """Get in-app notification."""
    -    return await self.client._request("POST", "/getInAppNotification")
    -
    -
    -
    - -
    - -
    - - -
    - get_kworks_status - - - - async - - -
    -
    get_kworks_status()
    -
    - -
    - -

    Get kworks status.

    - - -
    - Source code in src/kwork_api/client.py -
    514
    -515
    -516
    async def get_kworks_status(self) -> dict[str, Any]:
    -    """Get kworks status."""
    -    return await self.client._request("POST", "/kworksStatusList")
    -
    -
    -
    - -
    - -
    - - -
    - get_offers - - - - async - - -
    -
    get_offers()
    -
    - -
    - -

    Get offers.

    - - -
    - Source code in src/kwork_api/client.py -
    518
    -519
    -520
    async def get_offers(self) -> dict[str, Any]:
    -    """Get offers."""
    -    return await self.client._request("POST", "/offers")
    -
    -
    -
    - -
    - -
    - - -
    - get_security_user_data - - - - async - - -
    -
    get_security_user_data()
    -
    - -
    - -

    Get security user data.

    - - -
    - Source code in src/kwork_api/client.py -
    534
    -535
    -536
    async def get_security_user_data(self) -> dict[str, Any]:
    -    """Get security user data."""
    -    return await self.client._request("POST", "/getSecurityUserData")
    -
    -
    -
    - -
    - -
    - - -
    - get_viewed_kworks - - - - async - - -
    -
    get_viewed_kworks()
    -
    - -
    - -

    Get viewed kworks.

    - - -
    - Source code in src/kwork_api/client.py -
    547
    -548
    -549
    -550
    async def get_viewed_kworks(self) -> list[Kwork]:
    -    """Get viewed kworks."""
    -    data = await self.client._request("POST", "/viewedCatalogKworks")
    -    return [Kwork.model_validate(k) for k in data.get("kworks", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_wants - - - - async - - -
    -
    get_wants()
    -
    - -
    - -

    Get user wants.

    - - -
    - Source code in src/kwork_api/client.py -
    506
    -507
    -508
    async def get_wants(self) -> dict[str, Any]:
    -    """Get user wants."""
    -    return await self.client._request("POST", "/myWants")
    -
    -
    -
    - -
    - -
    - - -
    - get_wants_status - - - - async - - -
    -
    get_wants_status()
    -
    - -
    - -

    Get wants status.

    - - -
    - Source code in src/kwork_api/client.py -
    510
    -511
    -512
    async def get_wants_status(self) -> dict[str, Any]:
    -    """Get wants status."""
    -    return await self.client._request("POST", "/wantsStatusList")
    -
    -
    -
    - -
    - -
    - - -
    - go_offline - - - - async - - -
    -
    go_offline()
    -
    - -
    - -

    Set user status to offline.

    - - -
    - Source code in src/kwork_api/client.py -
    561
    -562
    -563
    async def go_offline(self) -> dict[str, Any]:
    -    """Set user status to offline."""
    -    return await self.client._request("POST", "/offline")
    -
    -
    -
    - -
    - -
    - - -
    - is_dialog_allow - - - - async - - -
    -
    is_dialog_allow(user_id)
    -
    - -
    - -

    Check if dialog is allowed.

    - - -
    - Source code in src/kwork_api/client.py -
    538
    -539
    -540
    -541
    -542
    -543
    -544
    -545
    async def is_dialog_allow(self, user_id: int) -> bool:
    -    """Check if dialog is allowed."""
    -    data = await self.client._request(
    -        "POST",
    -        "/isDialogAllow",
    -        json={"user_id": user_id},
    -    )
    -    return data.get("allowed", False)
    -
    -
    -
    - -
    - -
    - - -
    - update_settings - - - - async - - -
    -
    update_settings(settings)
    -
    - -
    - -

    Update user settings.

    - - -
    - Source code in src/kwork_api/client.py -
    557
    -558
    -559
    async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]:
    -    """Update user settings."""
    -    return await self.client._request("POST", "/updateSettings", json=settings)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - ProjectsAPI - - -

    -
    ProjectsAPI(client)
    -
    - -
    - - - -

    Projects (freelance orders) API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    335
    -336
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_list - - - - async - - -
    -
    get_list(page=1, category_id=None)
    -
    - -
    - -

    Get projects list.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - category_id - - Optional[int] - -
    -

    Category filter

    -
    -
    - None -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - ProjectsResponse - -
    -

    ProjectsResponse with projects and pagination

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
    -348
    -349
    -350
    -351
    -352
    -353
    -354
    -355
    -356
    -357
    -358
    -359
    -360
    -361
    async def get_list(
    -    self,
    -    page: int = 1,
    -    category_id: Optional[int] = None,
    -) -> ProjectsResponse:
    -    """
    -    Get projects list.
    -
    -    Args:
    -        page: Page number
    -        category_id: Category filter
    -
    -    Returns:
    -        ProjectsResponse with projects and pagination
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/projects",
    -        json={
    -            "page": page,
    -            "category_id": category_id,
    -        },
    -    )
    -    return ProjectsResponse.model_validate(data)
    -
    -
    -
    - -
    - -
    - - -
    - get_payer_orders - - - - async - - -
    -
    get_payer_orders()
    -
    - -
    - -

    Get orders where user is customer.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Project] - -
    -

    List of projects

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    363
    -364
    -365
    -366
    -367
    -368
    -369
    -370
    -371
    async def get_payer_orders(self) -> list[Project]:
    -    """
    -    Get orders where user is customer.
    -
    -    Returns:
    -        List of projects
    -    """
    -    data = await self.client._request("POST", "/payerOrders")
    -    return [Project.model_validate(p) for p in data.get("orders", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_worker_orders - - - - async - - -
    -
    get_worker_orders()
    -
    - -
    - -

    Get orders where user is performer.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Project] - -
    -

    List of projects

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    async def get_worker_orders(self) -> list[Project]:
    -    """
    -    Get orders where user is performer.
    -
    -    Returns:
    -        List of projects
    -    """
    -    data = await self.client._request("POST", "/workerOrders")
    -    return [Project.model_validate(p) for p in data.get("orders", [])]
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - ReferenceAPI - - -

    -
    ReferenceAPI(client)
    -
    - -
    - - - -

    Reference data (cities, countries, etc.) endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    437
    -438
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_badges_info - - - - async - - -
    -
    get_badges_info()
    -
    - -
    - -

    Get badges info.

    - - -
    - Source code in src/kwork_api/client.py -
    465
    -466
    -467
    -468
    async def get_badges_info(self) -> list[Badge]:
    -    """Get badges info."""
    -    data = await self.client._request("POST", "/getBadgesInfo")
    -    return [Badge.model_validate(b) for b in data.get("badges", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_cities - - - - async - - -
    -
    get_cities()
    -
    - -
    - -

    Get all cities.

    - - -
    - Source code in src/kwork_api/client.py -
    440
    -441
    -442
    -443
    async def get_cities(self) -> list[City]:
    -    """Get all cities."""
    -    data = await self.client._request("POST", "/cities")
    -    return [City.model_validate(c) for c in data.get("cities", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_countries - - - - async - - -
    -
    get_countries()
    -
    - -
    - -

    Get all countries.

    - - -
    - Source code in src/kwork_api/client.py -
    445
    -446
    -447
    -448
    async def get_countries(self) -> list[Country]:
    -    """Get all countries."""
    -    data = await self.client._request("POST", "/countries")
    -    return [Country.model_validate(c) for c in data.get("countries", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_features - - - - async - - -
    -
    get_features()
    -
    - -
    - -

    Get available features.

    - - -
    - Source code in src/kwork_api/client.py -
    455
    -456
    -457
    -458
    async def get_features(self) -> list[Feature]:
    -    """Get available features."""
    -    data = await self.client._request("POST", "/getAvailableFeatures")
    -    return [Feature.model_validate(f) for f in data.get("features", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_public_features - - - - async - - -
    -
    get_public_features()
    -
    - -
    - -

    Get public features.

    - - -
    - Source code in src/kwork_api/client.py -
    460
    -461
    -462
    -463
    async def get_public_features(self) -> list[Feature]:
    -    """Get public features."""
    -    data = await self.client._request("POST", "/getPublicFeatures")
    -    return [Feature.model_validate(f) for f in data.get("features", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_timezones - - - - async - - -
    -
    get_timezones()
    -
    - -
    - -

    Get all timezones.

    - - -
    - Source code in src/kwork_api/client.py -
    450
    -451
    -452
    -453
    async def get_timezones(self) -> list[TimeZone]:
    -    """Get all timezones."""
    -    data = await self.client._request("POST", "/timezones")
    -    return [TimeZone.model_validate(t) for t in data.get("timezones", [])]
    -
    -
    -
    - -
    - - - -
    - -
    - -
    - -
    - - - -

    - UserAPI - - -

    -
    UserAPI(client)
    -
    - -
    - - - -

    User API endpoints.

    - - - - - - - - -
    - Source code in src/kwork_api/client.py -
    388
    -389
    def __init__(self, client: "KworkClient"):
    -    self.client = client
    -
    -
    - - - -
    - - - - - - - - -
    Functions
    - -
    - - -
    - get_favorite_kworks - - - - async - - -
    -
    get_favorite_kworks()
    -
    - -
    - -

    Get favorite kworks.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - list[Kwork] - -
    -

    List of kworks

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    422
    -423
    -424
    -425
    -426
    -427
    -428
    -429
    -430
    async def get_favorite_kworks(self) -> list[Kwork]:
    -    """
    -    Get favorite kworks.
    -
    -    Returns:
    -        List of kworks
    -    """
    -    data = await self.client._request("POST", "/favoriteKworks")
    -    return [Kwork.model_validate(k) for k in data.get("kworks", [])]
    -
    -
    -
    - -
    - -
    - - -
    - get_info - - - - async - - -
    -
    get_info()
    -
    - -
    - -

    Get current user info.

    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - dict[str, Any] - -
    -

    User info dict

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    async def get_info(self) -> dict[str, Any]:
    -    """
    -    Get current user info.
    -
    -    Returns:
    -        User info dict
    -    """
    -    return await self.client._request("POST", "/user")
    -
    -
    -
    - -
    - -
    - - -
    - get_reviews - - - - async - - -
    -
    get_reviews(user_id=None, page=1)
    -
    - -
    - -

    Get user reviews.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - user_id - - Optional[int] - -
    -

    User ID (None for current user)

    -
    -
    - None -
    - page - - int - -
    -

    Page number

    -
    -
    - 1 -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - ReviewsResponse - -
    -

    ReviewsResponse

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
    400
    -401
    -402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    async def get_reviews(
    -    self,
    -    user_id: Optional[int] = None,
    -    page: int = 1,
    -) -> ReviewsResponse:
    -    """
    -    Get user reviews.
    -
    -    Args:
    -        user_id: User ID (None for current user)
    -        page: Page number
    -
    -    Returns:
    -        ReviewsResponse
    -    """
    -    data = await self.client._request(
    -        "POST",
    -        "/userReviews",
    -        json={"user_id": user_id, "page": page},
    -    )
    -    return ReviewsResponse.model_validate(data)
    -
    -
    -
    - -
    - - - -
    - -
    - -
    -

    Functions

    - -
    - - -

    - close - - - - async - - -

    -
    close()
    -
    - -
    - -

    Close HTTP client.

    - - -
    - Source code in src/kwork_api/client.py -
    179
    -180
    -181
    -182
    async def close(self) -> None:
    -    """Close HTTP client."""
    -    if self._client and not self._client.is_closed:
    -        await self._client.aclose()
    -
    -
    -
    - -
    - -
    - - -

    - login - - - - async - classmethod - - -

    -
    login(username, password, timeout=30.0)
    -
    - -
    - -

    Login with username and password.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - username - - str - -
    -

    Kwork username or email

    -
    -
    - required -
    - password - - str - -
    -

    Kwork password

    -
    -
    - required -
    - timeout - - float - -
    -

    Request timeout

    -
    -
    - 30.0 -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkClient - -
    -

    Authenticated KworkClient instance

    -
    -
    - - -

    Raises:

    - - - - - - - - - - - - - -
    TypeDescription
    - KworkAuthError - -
    -

    If login fails

    -
    -
    - - -
    - Source code in src/kwork_api/client.py -
     88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    @classmethod
    -async def login(
    -    cls,
    -    username: str,
    -    password: str,
    -    timeout: float = 30.0,
    -) -> "KworkClient":
    -    """
    -    Login with username and password.
    -
    -    Args:
    -        username: Kwork username or email
    -        password: Kwork password
    -        timeout: Request timeout
    -
    -    Returns:
    -        Authenticated KworkClient instance
    -
    -    Raises:
    -        KworkAuthError: If login fails
    -    """
    -    client = cls(timeout=timeout)
    -
    -    try:
    -        async with client._get_httpx_client() as http_client:
    -            # Step 1: Login to get session cookies
    -            login_data = {
    -                "login_or_email": username,
    -                "password": password,
    -            }
    -
    -            response = await http_client.post(
    -                cls.LOGIN_URL,
    -                data=login_data,
    -                headers={"Referer": "https://kwork.ru/"},
    -            )
    -
    -            if response.status_code != 200:
    -                raise KworkAuthError(f"Login failed: {response.status_code}")
    -
    -            # Extract cookies
    -            cookies = dict(response.cookies)
    -
    -            if "userId" not in cookies:
    -                raise KworkAuthError("Login failed: no userId in cookies")
    -
    -            # Step 2: Get web auth token
    -            token_response = await http_client.post(
    -                cls.TOKEN_URL,
    -                json={},
    -            )
    -
    -            if token_response.status_code != 200:
    -                raise KworkAuthError(f"Token request failed: {token_response.status_code}")
    -
    -            token_data = token_response.json()
    -            web_token = token_data.get("web_auth_token")
    -
    -            if not web_token:
    -                raise KworkAuthError("No web_auth_token in response")
    -
    -            # Create new client with token
    -            return cls(token=web_token, cookies=cookies, timeout=timeout)
    -
    -    except httpx.RequestError as e:
    -        raise KworkNetworkError(f"Login request failed: {e}")
    -
    -
    -
    - -
    - - - -
    - -
    - -
    +

    ::: kwork_api.client.KworkClient + options: + show_root_heading: true + show_source: true + merge_init_into_class: true

    diff --git a/site/api/errors/index.html b/site/api/errors/index.html index 19c8c58..6840499 100644 --- a/site/api/errors/index.html +++ b/site/api/errors/index.html @@ -13,10 +13,6 @@ - - - - @@ -53,8 +49,6 @@ - - @@ -244,21 +238,18 @@ - + +
  • + + - -
  • - - - API Reference - -
  • - + + @@ -359,32 +350,11 @@ - - - - - - - +
  • + - - - - - - - -
  • - - - - - - - - - - -
  • - - @@ -738,311 +423,15 @@

    Errors

    Exception classes for error handling.

    KworkError

    - - -
    - - - -

    - kwork_api.errors.KworkError - - -

    -
    KworkError(message, response=None)
    -
    - -
    -

    - Bases: Exception

    - - - -

    Base exception for all Kwork API errors.

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    13
    -14
    -15
    -16
    def __init__(self, message: str, response: Optional[Any] = None):
    -    self.message = message
    -    self.response = response
    -    super().__init__(self.message)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -

    KworkAuthError

    - - -
    - - - -

    - kwork_api.errors.KworkAuthError - - -

    -
    KworkAuthError(
    -    message="Authentication failed", response=None
    -)
    -
    - -
    -

    - Bases: KworkError

    - - - -

    Authentication/authorization error.

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    25
    -26
    def __init__(self, message: str = "Authentication failed", response: Optional[Any] = None):
    -    super().__init__(message, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -

    KworkApiError

    - - -
    - - - -

    - kwork_api.errors.KworkApiError - - -

    -
    KworkApiError(message, status_code=None, response=None)
    -
    - -
    -

    - Bases: KworkError

    - - - -

    API request error (4xx, 5xx).

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    def __init__(
    -    self,
    -    message: str,
    -    status_code: Optional[int] = None,
    -    response: Optional[Any] = None,
    -):
    -    self.status_code = status_code
    -    super().__init__(message, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -

    KworkNotFoundError

    - - -
    - - - -

    - kwork_api.errors.KworkNotFoundError - - -

    -
    KworkNotFoundError(resource, response=None)
    -
    - -
    -

    - Bases: KworkApiError

    - - - -

    Resource not found (404).

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    53
    -54
    def __init__(self, resource: str, response: Optional[Any] = None):
    -    super().__init__(f"Resource not found: {resource}", 404, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -

    KworkRateLimitError

    - - -
    - - - -

    - kwork_api.errors.KworkRateLimitError - - -

    -
    KworkRateLimitError(
    -    message="Rate limit exceeded", response=None
    -)
    -
    - -
    -

    - Bases: KworkApiError

    - - - -

    Rate limit exceeded (429).

    - - - - - - - - -
    - Source code in src/kwork_api/errors.py -
    60
    -61
    def __init__(self, message: str = "Rate limit exceeded", response: Optional[Any] = None):
    -    super().__init__(message, 429, response)
    -
    -
    - - - -
    - - - - - - - - - - - - -
    - -
    - -
    +

    ::: kwork_api.errors.KworkError

    +

    KworkAuthError

    +

    ::: kwork_api.errors.KworkAuthError

    +

    KworkApiError

    +

    ::: kwork_api.errors.KworkApiError

    +

    KworkNotFoundError

    +

    ::: kwork_api.errors.KworkNotFoundError

    +

    KworkRateLimitError

    +

    ::: kwork_api.errors.KworkRateLimitError

    diff --git a/site/api/models/index.html b/site/api/models/index.html index 35bfc63..9742751 100644 --- a/site/api/models/index.html +++ b/site/api/models/index.html @@ -13,10 +13,6 @@ - - - - @@ -53,8 +49,6 @@ - - @@ -244,21 +238,18 @@ - + +
  • + + - -
  • - - - API Reference - -
  • - + + @@ -359,32 +350,11 @@ - - - - - - - +
  • + - - - - - - - -
  • - - - - - - - - - - -
  • - - @@ -738,251 +423,15 @@

    Models

    Pydantic models used in API responses.

    Kwork

    - - -
    - - - -

    - kwork_api.models.Kwork - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Kwork (service) information.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -

    KworkDetails

    - - -
    - - - -

    - kwork_api.models.KworkDetails - - -

    - - -
    -

    - Bases: Kwork

    - - - -

    Extended kwork details.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -

    Project

    - - -
    - - - -

    - kwork_api.models.Project - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Project (freelance order) information.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -

    CatalogResponse

    - - -
    - - - -

    - kwork_api.models.CatalogResponse - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Catalog response with kworks and pagination.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -

    PaginationInfo

    - - -
    - - - -

    - kwork_api.models.PaginationInfo - - -

    - - -
    -

    - Bases: BaseModel

    - - - -

    Pagination metadata.

    - - - - - - - - - - - -
    - - - - - - - - - - - - -
    - -
    - -
    +

    ::: kwork_api.models.Kwork

    +

    KworkDetails

    +

    ::: kwork_api.models.KworkDetails

    +

    Project

    +

    ::: kwork_api.models.Project

    +

    CatalogResponse

    +

    ::: kwork_api.models.CatalogResponse

    +

    PaginationInfo

    +

    ::: kwork_api.models.PaginationInfo

    diff --git a/site/assets/_mkdocstrings.css b/site/assets/_mkdocstrings.css deleted file mode 100644 index 854048c..0000000 --- a/site/assets/_mkdocstrings.css +++ /dev/null @@ -1,237 +0,0 @@ - -/* Avoid breaking parameter names, etc. in table cells. */ -.doc-contents td code { - word-break: normal !important; -} - -/* No line break before first paragraph of descriptions. */ -.doc-md-description, -.doc-md-description>p:first-child { - display: inline; -} - -/* No text transformation from Material for MkDocs for H5 headings. */ -.md-typeset h5 .doc-object-name { - text-transform: none; -} - -/* Max width for docstring sections tables. */ -.doc .md-typeset__table, -.doc .md-typeset__table table { - display: table !important; - width: 100%; -} - -.doc .md-typeset__table tr { - display: table-row; -} - -/* Defaults in Spacy table style. */ -.doc-param-default, -.doc-type_param-default { - float: right; -} - -/* Parameter headings must be inline, not blocks. */ -.doc-heading-parameter, -.doc-heading-type_parameter { - display: inline; -} - -/* Default font size for parameter headings. */ -.md-typeset .doc-heading-parameter { - font-size: inherit; -} - -/* Prefer space on the right, not the left of parameter permalinks. */ -.doc-heading-parameter .headerlink, -.doc-heading-type_parameter .headerlink { - margin-left: 0 !important; - margin-right: 0.2rem; -} - -/* Backward-compatibility: docstring section titles in bold. */ -.doc-section-title { - font-weight: bold; -} - -/* Backlinks crumb separator. */ -.doc-backlink-crumb { - display: inline-flex; - gap: .2rem; - white-space: nowrap; - align-items: center; - vertical-align: middle; -} -.doc-backlink-crumb:not(:first-child)::before { - background-color: var(--md-default-fg-color--lighter); - content: ""; - display: inline; - height: 1rem; - --md-path-icon: url('data:image/svg+xml;charset=utf-8,'); - -webkit-mask-image: var(--md-path-icon); - mask-image: var(--md-path-icon); - width: 1rem; -} -.doc-backlink-crumb.last { - font-weight: bold; -} - -/* Symbols in Navigation and ToC. */ -:root, :host, -[data-md-color-scheme="default"] { - --doc-symbol-parameter-fg-color: #df50af; - --doc-symbol-type_parameter-fg-color: #df50af; - --doc-symbol-attribute-fg-color: #953800; - --doc-symbol-function-fg-color: #8250df; - --doc-symbol-method-fg-color: #8250df; - --doc-symbol-class-fg-color: #0550ae; - --doc-symbol-type_alias-fg-color: #0550ae; - --doc-symbol-module-fg-color: #5cad0f; - - --doc-symbol-parameter-bg-color: #df50af1a; - --doc-symbol-type_parameter-bg-color: #df50af1a; - --doc-symbol-attribute-bg-color: #9538001a; - --doc-symbol-function-bg-color: #8250df1a; - --doc-symbol-method-bg-color: #8250df1a; - --doc-symbol-class-bg-color: #0550ae1a; - --doc-symbol-type_alias-bg-color: #0550ae1a; - --doc-symbol-module-bg-color: #5cad0f1a; -} - -[data-md-color-scheme="slate"] { - --doc-symbol-parameter-fg-color: #ffa8cc; - --doc-symbol-type_parameter-fg-color: #ffa8cc; - --doc-symbol-attribute-fg-color: #ffa657; - --doc-symbol-function-fg-color: #d2a8ff; - --doc-symbol-method-fg-color: #d2a8ff; - --doc-symbol-class-fg-color: #79c0ff; - --doc-symbol-type_alias-fg-color: #79c0ff; - --doc-symbol-module-fg-color: #baff79; - - --doc-symbol-parameter-bg-color: #ffa8cc1a; - --doc-symbol-type_parameter-bg-color: #ffa8cc1a; - --doc-symbol-attribute-bg-color: #ffa6571a; - --doc-symbol-function-bg-color: #d2a8ff1a; - --doc-symbol-method-bg-color: #d2a8ff1a; - --doc-symbol-class-bg-color: #79c0ff1a; - --doc-symbol-type_alias-bg-color: #79c0ff1a; - --doc-symbol-module-bg-color: #baff791a; -} - -code.doc-symbol { - border-radius: .1rem; - font-size: .85em; - padding: 0 .3em; - font-weight: bold; -} - -code.doc-symbol-parameter, -a code.doc-symbol-parameter { - color: var(--doc-symbol-parameter-fg-color); - background-color: var(--doc-symbol-parameter-bg-color); -} - -code.doc-symbol-parameter::after { - content: "param"; -} - -code.doc-symbol-type_parameter, -a code.doc-symbol-type_parameter { - color: var(--doc-symbol-type_parameter-fg-color); - background-color: var(--doc-symbol-type_parameter-bg-color); -} - -code.doc-symbol-type_parameter::after { - content: "type-param"; -} - -code.doc-symbol-attribute, -a code.doc-symbol-attribute { - color: var(--doc-symbol-attribute-fg-color); - background-color: var(--doc-symbol-attribute-bg-color); -} - -code.doc-symbol-attribute::after { - content: "attr"; -} - -code.doc-symbol-function, -a code.doc-symbol-function { - color: var(--doc-symbol-function-fg-color); - background-color: var(--doc-symbol-function-bg-color); -} - -code.doc-symbol-function::after { - content: "func"; -} - -code.doc-symbol-method, -a code.doc-symbol-method { - color: var(--doc-symbol-method-fg-color); - background-color: var(--doc-symbol-method-bg-color); -} - -code.doc-symbol-method::after { - content: "meth"; -} - -code.doc-symbol-class, -a code.doc-symbol-class { - color: var(--doc-symbol-class-fg-color); - background-color: var(--doc-symbol-class-bg-color); -} - -code.doc-symbol-class::after { - content: "class"; -} - - -code.doc-symbol-type_alias, -a code.doc-symbol-type_alias { - color: var(--doc-symbol-type_alias-fg-color); - background-color: var(--doc-symbol-type_alias-bg-color); -} - -code.doc-symbol-type_alias::after { - content: "type"; -} - -code.doc-symbol-module, -a code.doc-symbol-module { - color: var(--doc-symbol-module-fg-color); - background-color: var(--doc-symbol-module-bg-color); -} - -code.doc-symbol-module::after { - content: "mod"; -} - -.doc-signature .autorefs { - color: inherit; - border-bottom: 1px dotted currentcolor; -} - -/* Source code blocks (admonitions). */ -:root { - --md-admonition-icon--mkdocstrings-source: url('data:image/svg+xml;charset=utf-8,') -} -.md-typeset .admonition.mkdocstrings-source, -.md-typeset details.mkdocstrings-source { - border: none; - padding: 0; -} -.md-typeset .admonition.mkdocstrings-source:focus-within, -.md-typeset details.mkdocstrings-source:focus-within { - box-shadow: none; -} -.md-typeset .mkdocstrings-source > .admonition-title, -.md-typeset .mkdocstrings-source > summary { - background-color: inherit; -} -.md-typeset .mkdocstrings-source > .admonition-title::before, -.md-typeset .mkdocstrings-source > summary::before { - background-color: var(--md-default-fg-color); - -webkit-mask-image: var(--md-admonition-icon--mkdocstrings-source); - mask-image: var(--md-admonition-icon--mkdocstrings-source); -} diff --git a/site/examples/index.html b/site/examples/index.html index 2cc65b6..1be4a6d 100644 --- a/site/examples/index.html +++ b/site/examples/index.html @@ -13,7 +13,7 @@ - + @@ -51,8 +51,6 @@ - - @@ -243,18 +241,17 @@ - - -
  • - - +
  • + + + + API Reference - -
  • - + + @@ -359,25 +356,9 @@ - - - - - - +
  • + - - - -
  • - - - - - - - - - - -
  • - - diff --git a/site/index.html b/site/index.html index c547971..aff6201 100644 --- a/site/index.html +++ b/site/index.html @@ -14,7 +14,7 @@ - + @@ -51,8 +51,6 @@ - - @@ -245,18 +243,17 @@ - - -
  • - - +
  • + + + + API Reference - -
  • - + + @@ -500,25 +497,9 @@ - - - - - - +
  • + - - - -
  • - - - - - - - - - - -
  • - - diff --git a/site/objects.inv b/site/objects.inv deleted file mode 100644 index baa2486..0000000 --- a/site/objects.inv +++ /dev/null @@ -1,7 +0,0 @@ -# Sphinx inventory version 2 -# Project: Kwork API -# Version: 0.0.0 -# The remainder of this file is compressed using zlib. -xڵMo0 kl݊n [`gAi" 4$ss,f|ӢUﭯtn~;|RZ/=(X]g$0^Ȇ3gz M"lطgu~HUgzVԶY1 ($pec5[' 2fQw2]4P[ \ No newline at end of file diff --git a/site/search/search_index.json b/site/search/search_index.json index b7f3400..30581f2 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Kwork API Documentation","text":"

    Unofficial Python client for Kwork.ru API.

    "},{"location":"#quick-start","title":"Quick Start","text":""},{"location":"#installation","title":"Installation","text":"
    pip install kwork-api\n
    "},{"location":"#authentication","title":"Authentication","text":"
    from kwork_api import KworkClient\n\n# Login with credentials\nclient = await KworkClient.login(\"username\", \"password\")\n\n# Or restore from token\nclient = KworkClient(token=\"your_web_auth_token\")\n
    "},{"location":"#basic-usage","title":"Basic Usage","text":"
    async with KworkClient(token=\"token\") as client:\n    # Get catalog\n    catalog = await client.catalog.get_list(page=1)\n\n    # Get kwork details\n    details = await client.catalog.get_details(kwork_id=123)\n\n    # Get projects\n    projects = await client.projects.get_list()\n
    "},{"location":"#documentation-sections","title":"Documentation Sections","text":""},{"location":"#features","title":"Features","text":""},{"location":"#rate-limiting","title":"Rate Limiting","text":"

    Rate limiting is not implemented in the library. Handle it in your code:

    import asyncio\n\nfor page in range(1, 10):\n    catalog = await client.catalog.get_list(page=page)\n    await asyncio.sleep(1)  # 1 second delay\n
    "},{"location":"#error-handling","title":"Error Handling","text":"
    from kwork_api import KworkAuthError, KworkApiError\n\ntry:\n    catalog = await client.catalog.get_list()\nexcept KworkAuthError as e:\n    print(f\"Auth failed: {e}\")\nexcept KworkApiError as e:\n    print(f\"API error [{e.status_code}]: {e.message}\")\n

    Documentation auto-generated from source code.

    "},{"location":"api-reference/","title":"API Reference","text":"

    Auto-generated API documentation using mkdocstrings.

    "},{"location":"api-reference/#client","title":"Client","text":""},{"location":"api-reference/#kwork_api.client.KworkClient","title":"kwork_api.client.KworkClient","text":"
    KworkClient(\n    token=None, cookies=None, timeout=30.0, base_url=None\n)\n

    Kwork.ru API client.

    Usage

    Initialize client.

    Parameters:

    Name Type Description Default token Optional[str]

    Web auth token (from getWebAuthToken)

    None cookies Optional[dict[str, str]]

    Session cookies (optional, will be set from token)

    None timeout float

    Request timeout in seconds

    30.0 base_url Optional[str]

    Custom base URL (for testing)

    None Source code in src/kwork_api/client.py
    def __init__(\n    self,\n    token: Optional[str] = None,\n    cookies: Optional[dict[str, str]] = None,\n    timeout: float = 30.0,\n    base_url: Optional[str] = None,\n):\n    \"\"\"\n    Initialize client.\n\n    Args:\n        token: Web auth token (from getWebAuthToken)\n        cookies: Session cookies (optional, will be set from token)\n        timeout: Request timeout in seconds\n        base_url: Custom base URL (for testing)\n    \"\"\"\n    self.base_url = base_url or self.BASE_URL\n    self.timeout = timeout\n    self._token = token\n    self._cookies = cookies or {}\n\n    # Initialize HTTP client\n    self._client: Optional[httpx.AsyncClient] = None\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient--login-with-credentials","title":"Login with credentials","text":"

    client = await KworkClient.login(\"username\", \"password\")

    "},{"location":"api-reference/#kwork_api.client.KworkClient--or-restore-from-token","title":"Or restore from token","text":"

    client = KworkClient(token=\"your_web_auth_token\")

    "},{"location":"api-reference/#kwork_api.client.KworkClient--make-requests","title":"Make requests","text":"

    catalog = await client.catalog.get_list(page=1)

    "},{"location":"api-reference/#kwork_api.client.KworkClient-attributes","title":"Attributes","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.catalog","title":"catalog property","text":"
    catalog\n

    Catalog API.

    "},{"location":"api-reference/#kwork_api.client.KworkClient.notifications","title":"notifications property","text":"
    notifications\n

    Notifications API.

    "},{"location":"api-reference/#kwork_api.client.KworkClient.other","title":"other property","text":"
    other\n

    Other endpoints.

    "},{"location":"api-reference/#kwork_api.client.KworkClient.projects","title":"projects property","text":"
    projects\n

    Projects API.

    "},{"location":"api-reference/#kwork_api.client.KworkClient.reference","title":"reference property","text":"
    reference\n

    Reference data API.

    "},{"location":"api-reference/#kwork_api.client.KworkClient.user","title":"user property","text":"
    user\n

    User API.

    "},{"location":"api-reference/#kwork_api.client.KworkClient-classes","title":"Classes","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.CatalogAPI","title":"CatalogAPI","text":"
    CatalogAPI(client)\n

    Catalog/Kworks API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.CatalogAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.CatalogAPI.get_details","title":"get_details async","text":"
    get_details(kwork_id)\n

    Get kwork details.

    Parameters:

    Name Type Description Default kwork_id int

    Kwork ID

    required

    Returns:

    Type Description KworkDetails

    KworkDetails with full information

    Source code in src/kwork_api/client.py
    async def get_details(self, kwork_id: int) -> KworkDetails:\n    \"\"\"\n    Get kwork details.\n\n    Args:\n        kwork_id: Kwork ID\n\n    Returns:\n        KworkDetails with full information\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/getKworkDetails\",\n        json={\"kwork_id\": kwork_id},\n    )\n    return KworkDetails.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.CatalogAPI.get_details_extra","title":"get_details_extra async","text":"
    get_details_extra(kwork_id)\n

    Get additional kwork details.

    Parameters:

    Name Type Description Default kwork_id int

    Kwork ID

    required

    Returns:

    Type Description dict[str, Any]

    Extra details dict

    Source code in src/kwork_api/client.py
    async def get_details_extra(self, kwork_id: int) -> dict[str, Any]:\n    \"\"\"\n    Get additional kwork details.\n\n    Args:\n        kwork_id: Kwork ID\n\n    Returns:\n        Extra details dict\n    \"\"\"\n    return await self.client._request(\n        \"POST\",\n        \"/getKworkDetailsExtra\",\n        json={\"kwork_id\": kwork_id},\n    )\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.CatalogAPI.get_list","title":"get_list async","text":"
    get_list(page=1, category_id=None, sort='recommend')\n

    Get kworks catalog.

    Parameters:

    Name Type Description Default page int

    Page number

    1 category_id Optional[int]

    Category filter

    None sort str

    Sort option (recommend, price_asc, price_desc, etc.)

    'recommend'

    Returns:

    Type Description CatalogResponse

    CatalogResponse with kworks and pagination

    Source code in src/kwork_api/client.py
    async def get_list(\n    self,\n    page: int = 1,\n    category_id: Optional[int] = None,\n    sort: str = \"recommend\",\n) -> CatalogResponse:\n    \"\"\"\n    Get kworks catalog.\n\n    Args:\n        page: Page number\n        category_id: Category filter\n        sort: Sort option (recommend, price_asc, price_desc, etc.)\n\n    Returns:\n        CatalogResponse with kworks and pagination\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/catalogMainv2\",\n        json={\n            \"page\": page,\n            \"category_id\": category_id,\n            \"sort\": sort,\n        },\n    )\n    return CatalogResponse.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI","title":"NotificationsAPI","text":"
    NotificationsAPI(client)\n

    Notifications and messages endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI.fetch","title":"fetch async","text":"
    fetch()\n

    Fetch new notifications.

    Source code in src/kwork_api/client.py
    async def fetch(self) -> NotificationsResponse:\n    \"\"\"Fetch new notifications.\"\"\"\n    data = await self.client._request(\"POST\", \"/notificationsFetch\")\n    return NotificationsResponse.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI.get_blocked_dialogs","title":"get_blocked_dialogs async","text":"
    get_blocked_dialogs()\n

    Get blocked dialogs.

    Source code in src/kwork_api/client.py
    async def get_blocked_dialogs(self) -> list[Dialog]:\n    \"\"\"Get blocked dialogs.\"\"\"\n    data = await self.client._request(\"POST\", \"/blockedDialogList\")\n    return [Dialog.model_validate(d) for d in data.get(\"dialogs\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI.get_dialogs","title":"get_dialogs async","text":"
    get_dialogs()\n

    Get dialogs list.

    Source code in src/kwork_api/client.py
    async def get_dialogs(self) -> list[Dialog]:\n    \"\"\"Get dialogs list.\"\"\"\n    data = await self.client._request(\"POST\", \"/dialogs\")\n    return [Dialog.model_validate(d) for d in data.get(\"dialogs\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.NotificationsAPI.get_list","title":"get_list async","text":"
    get_list()\n

    Get notifications list.

    Source code in src/kwork_api/client.py
    async def get_list(self) -> NotificationsResponse:\n    \"\"\"Get notifications list.\"\"\"\n    data = await self.client._request(\"POST\", \"/notifications\")\n    return NotificationsResponse.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI","title":"OtherAPI","text":"
    OtherAPI(client)\n

    Other API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_actor","title":"get_actor async","text":"
    get_actor()\n

    Get actor info.

    Source code in src/kwork_api/client.py
    async def get_actor(self) -> dict[str, Any]:\n    \"\"\"Get actor info.\"\"\"\n    return await self.client._request(\"POST\", \"/actor\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_channel","title":"get_channel async","text":"
    get_channel()\n

    Get channel info.

    Source code in src/kwork_api/client.py
    async def get_channel(self) -> dict[str, Any]:\n    \"\"\"Get channel info.\"\"\"\n    return await self.client._request(\"POST\", \"/getChannel\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_exchange_info","title":"get_exchange_info async","text":"
    get_exchange_info()\n

    Get exchange info.

    Source code in src/kwork_api/client.py
    async def get_exchange_info(self) -> dict[str, Any]:\n    \"\"\"Get exchange info.\"\"\"\n    return await self.client._request(\"POST\", \"/exchangeInfo\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_favorite_categories","title":"get_favorite_categories async","text":"
    get_favorite_categories()\n

    Get favorite categories.

    Source code in src/kwork_api/client.py
    async def get_favorite_categories(self) -> list[int]:\n    \"\"\"Get favorite categories.\"\"\"\n    data = await self.client._request(\"POST\", \"/favoriteCategories\")\n    return data.get(\"categories\", [])\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_in_app_notification","title":"get_in_app_notification async","text":"
    get_in_app_notification()\n

    Get in-app notification.

    Source code in src/kwork_api/client.py
    async def get_in_app_notification(self) -> dict[str, Any]:\n    \"\"\"Get in-app notification.\"\"\"\n    return await self.client._request(\"POST\", \"/getInAppNotification\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_kworks_status","title":"get_kworks_status async","text":"
    get_kworks_status()\n

    Get kworks status.

    Source code in src/kwork_api/client.py
    async def get_kworks_status(self) -> dict[str, Any]:\n    \"\"\"Get kworks status.\"\"\"\n    return await self.client._request(\"POST\", \"/kworksStatusList\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_offers","title":"get_offers async","text":"
    get_offers()\n

    Get offers.

    Source code in src/kwork_api/client.py
    async def get_offers(self) -> dict[str, Any]:\n    \"\"\"Get offers.\"\"\"\n    return await self.client._request(\"POST\", \"/offers\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_security_user_data","title":"get_security_user_data async","text":"
    get_security_user_data()\n

    Get security user data.

    Source code in src/kwork_api/client.py
    async def get_security_user_data(self) -> dict[str, Any]:\n    \"\"\"Get security user data.\"\"\"\n    return await self.client._request(\"POST\", \"/getSecurityUserData\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_viewed_kworks","title":"get_viewed_kworks async","text":"
    get_viewed_kworks()\n

    Get viewed kworks.

    Source code in src/kwork_api/client.py
    async def get_viewed_kworks(self) -> list[Kwork]:\n    \"\"\"Get viewed kworks.\"\"\"\n    data = await self.client._request(\"POST\", \"/viewedCatalogKworks\")\n    return [Kwork.model_validate(k) for k in data.get(\"kworks\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_wants","title":"get_wants async","text":"
    get_wants()\n

    Get user wants.

    Source code in src/kwork_api/client.py
    async def get_wants(self) -> dict[str, Any]:\n    \"\"\"Get user wants.\"\"\"\n    return await self.client._request(\"POST\", \"/myWants\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.get_wants_status","title":"get_wants_status async","text":"
    get_wants_status()\n

    Get wants status.

    Source code in src/kwork_api/client.py
    async def get_wants_status(self) -> dict[str, Any]:\n    \"\"\"Get wants status.\"\"\"\n    return await self.client._request(\"POST\", \"/wantsStatusList\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.go_offline","title":"go_offline async","text":"
    go_offline()\n

    Set user status to offline.

    Source code in src/kwork_api/client.py
    async def go_offline(self) -> dict[str, Any]:\n    \"\"\"Set user status to offline.\"\"\"\n    return await self.client._request(\"POST\", \"/offline\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.is_dialog_allow","title":"is_dialog_allow async","text":"
    is_dialog_allow(user_id)\n

    Check if dialog is allowed.

    Source code in src/kwork_api/client.py
    async def is_dialog_allow(self, user_id: int) -> bool:\n    \"\"\"Check if dialog is allowed.\"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/isDialogAllow\",\n        json={\"user_id\": user_id},\n    )\n    return data.get(\"allowed\", False)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.OtherAPI.update_settings","title":"update_settings async","text":"
    update_settings(settings)\n

    Update user settings.

    Source code in src/kwork_api/client.py
    async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]:\n    \"\"\"Update user settings.\"\"\"\n    return await self.client._request(\"POST\", \"/updateSettings\", json=settings)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ProjectsAPI","title":"ProjectsAPI","text":"
    ProjectsAPI(client)\n

    Projects (freelance orders) API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ProjectsAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.ProjectsAPI.get_list","title":"get_list async","text":"
    get_list(page=1, category_id=None)\n

    Get projects list.

    Parameters:

    Name Type Description Default page int

    Page number

    1 category_id Optional[int]

    Category filter

    None

    Returns:

    Type Description ProjectsResponse

    ProjectsResponse with projects and pagination

    Source code in src/kwork_api/client.py
    async def get_list(\n    self,\n    page: int = 1,\n    category_id: Optional[int] = None,\n) -> ProjectsResponse:\n    \"\"\"\n    Get projects list.\n\n    Args:\n        page: Page number\n        category_id: Category filter\n\n    Returns:\n        ProjectsResponse with projects and pagination\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/projects\",\n        json={\n            \"page\": page,\n            \"category_id\": category_id,\n        },\n    )\n    return ProjectsResponse.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ProjectsAPI.get_payer_orders","title":"get_payer_orders async","text":"
    get_payer_orders()\n

    Get orders where user is customer.

    Returns:

    Type Description list[Project]

    List of projects

    Source code in src/kwork_api/client.py
    async def get_payer_orders(self) -> list[Project]:\n    \"\"\"\n    Get orders where user is customer.\n\n    Returns:\n        List of projects\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/payerOrders\")\n    return [Project.model_validate(p) for p in data.get(\"orders\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ProjectsAPI.get_worker_orders","title":"get_worker_orders async","text":"
    get_worker_orders()\n

    Get orders where user is performer.

    Returns:

    Type Description list[Project]

    List of projects

    Source code in src/kwork_api/client.py
    async def get_worker_orders(self) -> list[Project]:\n    \"\"\"\n    Get orders where user is performer.\n\n    Returns:\n        List of projects\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/workerOrders\")\n    return [Project.model_validate(p) for p in data.get(\"orders\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI","title":"ReferenceAPI","text":"
    ReferenceAPI(client)\n

    Reference data (cities, countries, etc.) endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_badges_info","title":"get_badges_info async","text":"
    get_badges_info()\n

    Get badges info.

    Source code in src/kwork_api/client.py
    async def get_badges_info(self) -> list[Badge]:\n    \"\"\"Get badges info.\"\"\"\n    data = await self.client._request(\"POST\", \"/getBadgesInfo\")\n    return [Badge.model_validate(b) for b in data.get(\"badges\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_cities","title":"get_cities async","text":"
    get_cities()\n

    Get all cities.

    Source code in src/kwork_api/client.py
    async def get_cities(self) -> list[City]:\n    \"\"\"Get all cities.\"\"\"\n    data = await self.client._request(\"POST\", \"/cities\")\n    return [City.model_validate(c) for c in data.get(\"cities\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_countries","title":"get_countries async","text":"
    get_countries()\n

    Get all countries.

    Source code in src/kwork_api/client.py
    async def get_countries(self) -> list[Country]:\n    \"\"\"Get all countries.\"\"\"\n    data = await self.client._request(\"POST\", \"/countries\")\n    return [Country.model_validate(c) for c in data.get(\"countries\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_features","title":"get_features async","text":"
    get_features()\n

    Get available features.

    Source code in src/kwork_api/client.py
    async def get_features(self) -> list[Feature]:\n    \"\"\"Get available features.\"\"\"\n    data = await self.client._request(\"POST\", \"/getAvailableFeatures\")\n    return [Feature.model_validate(f) for f in data.get(\"features\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_public_features","title":"get_public_features async","text":"
    get_public_features()\n

    Get public features.

    Source code in src/kwork_api/client.py
    async def get_public_features(self) -> list[Feature]:\n    \"\"\"Get public features.\"\"\"\n    data = await self.client._request(\"POST\", \"/getPublicFeatures\")\n    return [Feature.model_validate(f) for f in data.get(\"features\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.ReferenceAPI.get_timezones","title":"get_timezones async","text":"
    get_timezones()\n

    Get all timezones.

    Source code in src/kwork_api/client.py
    async def get_timezones(self) -> list[TimeZone]:\n    \"\"\"Get all timezones.\"\"\"\n    data = await self.client._request(\"POST\", \"/timezones\")\n    return [TimeZone.model_validate(t) for t in data.get(\"timezones\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.UserAPI","title":"UserAPI","text":"
    UserAPI(client)\n

    User API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.UserAPI-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.UserAPI.get_favorite_kworks","title":"get_favorite_kworks async","text":"
    get_favorite_kworks()\n

    Get favorite kworks.

    Returns:

    Type Description list[Kwork]

    List of kworks

    Source code in src/kwork_api/client.py
    async def get_favorite_kworks(self) -> list[Kwork]:\n    \"\"\"\n    Get favorite kworks.\n\n    Returns:\n        List of kworks\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/favoriteKworks\")\n    return [Kwork.model_validate(k) for k in data.get(\"kworks\", [])]\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.UserAPI.get_info","title":"get_info async","text":"
    get_info()\n

    Get current user info.

    Returns:

    Type Description dict[str, Any]

    User info dict

    Source code in src/kwork_api/client.py
    async def get_info(self) -> dict[str, Any]:\n    \"\"\"\n    Get current user info.\n\n    Returns:\n        User info dict\n    \"\"\"\n    return await self.client._request(\"POST\", \"/user\")\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.UserAPI.get_reviews","title":"get_reviews async","text":"
    get_reviews(user_id=None, page=1)\n

    Get user reviews.

    Parameters:

    Name Type Description Default user_id Optional[int]

    User ID (None for current user)

    None page int

    Page number

    1

    Returns:

    Type Description ReviewsResponse

    ReviewsResponse

    Source code in src/kwork_api/client.py
    async def get_reviews(\n    self,\n    user_id: Optional[int] = None,\n    page: int = 1,\n) -> ReviewsResponse:\n    \"\"\"\n    Get user reviews.\n\n    Args:\n        user_id: User ID (None for current user)\n        page: Page number\n\n    Returns:\n        ReviewsResponse\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/userReviews\",\n        json={\"user_id\": user_id, \"page\": page},\n    )\n    return ReviewsResponse.model_validate(data)\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient-functions","title":"Functions","text":""},{"location":"api-reference/#kwork_api.client.KworkClient.close","title":"close async","text":"
    close()\n

    Close HTTP client.

    Source code in src/kwork_api/client.py
    async def close(self) -> None:\n    \"\"\"Close HTTP client.\"\"\"\n    if self._client and not self._client.is_closed:\n        await self._client.aclose()\n
    "},{"location":"api-reference/#kwork_api.client.KworkClient.login","title":"login async classmethod","text":"
    login(username, password, timeout=30.0)\n

    Login with username and password.

    Parameters:

    Name Type Description Default username str

    Kwork username or email

    required password str

    Kwork password

    required timeout float

    Request timeout

    30.0

    Returns:

    Type Description KworkClient

    Authenticated KworkClient instance

    Raises:

    Type Description KworkAuthError

    If login fails

    Source code in src/kwork_api/client.py
    @classmethod\nasync def login(\n    cls,\n    username: str,\n    password: str,\n    timeout: float = 30.0,\n) -> \"KworkClient\":\n    \"\"\"\n    Login with username and password.\n\n    Args:\n        username: Kwork username or email\n        password: Kwork password\n        timeout: Request timeout\n\n    Returns:\n        Authenticated KworkClient instance\n\n    Raises:\n        KworkAuthError: If login fails\n    \"\"\"\n    client = cls(timeout=timeout)\n\n    try:\n        async with client._get_httpx_client() as http_client:\n            # Step 1: Login to get session cookies\n            login_data = {\n                \"login_or_email\": username,\n                \"password\": password,\n            }\n\n            response = await http_client.post(\n                cls.LOGIN_URL,\n                data=login_data,\n                headers={\"Referer\": \"https://kwork.ru/\"},\n            )\n\n            if response.status_code != 200:\n                raise KworkAuthError(f\"Login failed: {response.status_code}\")\n\n            # Extract cookies\n            cookies = dict(response.cookies)\n\n            if \"userId\" not in cookies:\n                raise KworkAuthError(\"Login failed: no userId in cookies\")\n\n            # Step 2: Get web auth token\n            token_response = await http_client.post(\n                cls.TOKEN_URL,\n                json={},\n            )\n\n            if token_response.status_code != 200:\n                raise KworkAuthError(f\"Token request failed: {token_response.status_code}\")\n\n            token_data = token_response.json()\n            web_token = token_data.get(\"web_auth_token\")\n\n            if not web_token:\n                raise KworkAuthError(\"No web_auth_token in response\")\n\n            # Create new client with token\n            return cls(token=web_token, cookies=cookies, timeout=timeout)\n\n    except httpx.RequestError as e:\n        raise KworkNetworkError(f\"Login request failed: {e}\")\n
    "},{"location":"api-reference/#models","title":"Models","text":""},{"location":"api-reference/#kwork_api.models.Kwork","title":"kwork_api.models.Kwork","text":"

    Bases: BaseModel

    Kwork (service) information.

    "},{"location":"api-reference/#kwork_api.models.KworkDetails","title":"kwork_api.models.KworkDetails","text":"

    Bases: Kwork

    Extended kwork details.

    "},{"location":"api-reference/#kwork_api.models.Project","title":"kwork_api.models.Project","text":"

    Bases: BaseModel

    Project (freelance order) information.

    "},{"location":"api-reference/#kwork_api.models.CatalogResponse","title":"kwork_api.models.CatalogResponse","text":"

    Bases: BaseModel

    Catalog response with kworks and pagination.

    "},{"location":"api-reference/#errors","title":"Errors","text":""},{"location":"api-reference/#kwork_api.errors.KworkError","title":"kwork_api.errors.KworkError","text":"
    KworkError(message, response=None)\n

    Bases: Exception

    Base exception for all Kwork API errors.

    Source code in src/kwork_api/errors.py
    def __init__(self, message: str, response: Optional[Any] = None):\n    self.message = message\n    self.response = response\n    super().__init__(self.message)\n
    "},{"location":"api-reference/#kwork_api.errors.KworkAuthError","title":"kwork_api.errors.KworkAuthError","text":"
    KworkAuthError(\n    message=\"Authentication failed\", response=None\n)\n

    Bases: KworkError

    Authentication/authorization error.

    Source code in src/kwork_api/errors.py
    def __init__(self, message: str = \"Authentication failed\", response: Optional[Any] = None):\n    super().__init__(message, response)\n
    "},{"location":"api-reference/#kwork_api.errors.KworkApiError","title":"kwork_api.errors.KworkApiError","text":"
    KworkApiError(message, status_code=None, response=None)\n

    Bases: KworkError

    API request error (4xx, 5xx).

    Source code in src/kwork_api/errors.py
    def __init__(\n    self,\n    message: str,\n    status_code: Optional[int] = None,\n    response: Optional[Any] = None,\n):\n    self.status_code = status_code\n    super().__init__(message, response)\n
    "},{"location":"examples/","title":"Usage Examples","text":""},{"location":"examples/#catalog","title":"Catalog","text":""},{"location":"examples/#get-catalog-list","title":"Get Catalog List","text":"
    from kwork_api import KworkClient\n\nasync with KworkClient(token=\"token\") as client:\n    catalog = await client.catalog.get_list(page=1, category_id=5)\n\n    for kwork in catalog.kworks:\n        print(f\"{kwork.title}: {kwork.price} RUB\")\n\n    # Pagination\n    if catalog.pagination:\n        print(f\"Page {catalog.pagination.current_page} of {catalog.pagination.total_pages}\")\n
    "},{"location":"examples/#get-kwork-details","title":"Get Kwork Details","text":"
    details = await client.catalog.get_details(kwork_id=123)\n\nprint(f\"Title: {details.title}\")\nprint(f\"Price: {details.price}\")\nprint(f\"Description: {details.full_description}\")\nprint(f\"Delivery: {details.delivery_time} days\")\n
    "},{"location":"examples/#projects","title":"Projects","text":""},{"location":"examples/#get-projects-list","title":"Get Projects List","text":"
    projects = await client.projects.get_list(page=1)\n\nfor project in projects.projects:\n    print(f\"{project.title} - {project.budget} RUB\")\n
    "},{"location":"examples/#get-customer-orders","title":"Get Customer Orders","text":"
    orders = await client.projects.get_payer_orders()\n\nfor order in orders:\n    print(f\"Order #{order.id}: {order.status}\")\n
    "},{"location":"examples/#get-performer-orders","title":"Get Performer Orders","text":"
    orders = await client.projects.get_worker_orders()\n\nfor order in orders:\n    print(f\"Work #{order.id}: {order.status}\")\n
    "},{"location":"examples/#user","title":"User","text":""},{"location":"examples/#get-user-info","title":"Get User Info","text":"
    user_info = await client.user.get_info()\nprint(f\"Username: {user_info.get('username')}\")\n
    "},{"location":"examples/#get-reviews","title":"Get Reviews","text":"
    reviews = await client.user.get_reviews(page=1)\n\nfor review in reviews.reviews:\n    print(f\"Rating: {review.rating}/5 - {review.comment}\")\n
    "},{"location":"examples/#get-favorite-kworks","title":"Get Favorite Kworks","text":"
    favorites = await client.user.get_favorite_kworks()\n\nfor kwork in favorites:\n    print(f\"Favorite: {kwork.title}\")\n
    "},{"location":"examples/#reference-data","title":"Reference Data","text":""},{"location":"examples/#get-cities","title":"Get Cities","text":"
    cities = await client.reference.get_cities()\n\nfor city in cities:\n    print(f\"{city.id}: {city.name}\")\n
    "},{"location":"examples/#get-countries","title":"Get Countries","text":"
    countries = await client.reference.get_countries()\n\nfor country in countries:\n    print(f\"{country.id}: {country.name}\")\n
    "},{"location":"examples/#get-timezones","title":"Get Timezones","text":"
    timezones = await client.reference.get_timezones()\n\nfor tz in timezones:\n    print(f\"{tz.id}: {tz.name} ({tz.offset})\")\n
    "},{"location":"examples/#notifications","title":"Notifications","text":""},{"location":"examples/#get-notifications","title":"Get Notifications","text":"
    notifications = await client.notifications.get_list()\n\nfor notif in notifications.notifications:\n    print(f\"{notif.title}: {notif.message}\")\n\nprint(f\"Unread: {notifications.unread_count}\")\n
    "},{"location":"examples/#fetch-new-notifications","title":"Fetch New Notifications","text":"
    new_notifications = await client.notifications.fetch()\nprint(f\"New: {len(new_notifications.notifications)}\")\n
    "},{"location":"examples/#get-dialogs","title":"Get Dialogs","text":"
    dialogs = await client.notifications.get_dialogs()\n\nfor dialog in dialogs:\n    print(f\"Dialog with {dialog.participant.username}: {dialog.last_message}\")\n
    "},{"location":"examples/#error-handling","title":"Error Handling","text":"
    from kwork_api import KworkAuthError, KworkApiError, KworkNotFoundError\n\ntry:\n    catalog = await client.catalog.get_list()\nexcept KworkAuthError as e:\n    print(f\"Authentication failed: {e}\")\nexcept KworkNotFoundError as e:\n    print(f\"Resource not found: {e}\")\nexcept KworkApiError as e:\n    print(f\"API error [{e.status_code}]: {e.message}\")\nexcept Exception as e:\n    print(f\"Unexpected error: {e}\")\n
    "},{"location":"examples/#rate-limiting","title":"Rate Limiting","text":"
    import asyncio\n\nasync def fetch_all_pages():\n    all_kworks = []\n\n    for page in range(1, 10):\n        try:\n            catalog = await client.catalog.get_list(page=page)\n            all_kworks.extend(catalog.kworks)\n\n            if not catalog.pagination or not catalog.pagination.has_next:\n                break\n\n            # Delay to avoid rate limiting\n            await asyncio.sleep(1)\n\n        except KworkRateLimitError:\n            print(\"Rate limited, waiting...\")\n            await asyncio.sleep(5)\n\n    return all_kworks\n
    "},{"location":"examples/#pagination-helper","title":"Pagination Helper","text":"
    async def fetch_all_catalog():\n    \"\"\"Fetch all kworks from catalog with pagination.\"\"\"\n    all_kworks = []\n    page = 1\n\n    while True:\n        catalog = await client.catalog.get_list(page=page)\n        all_kworks.extend(catalog.kworks)\n\n        if not catalog.pagination or not catalog.pagination.has_next:\n            break\n\n        page += 1\n        await asyncio.sleep(0.5)  # Rate limiting\n\n    return all_kworks\n

    More examples in the API Reference.

    "},{"location":"api/client/","title":"Client API","text":""},{"location":"api/client/#kwork_api.client.KworkClient","title":"kwork_api.client.KworkClient","text":"
    KworkClient(\n    token=None, cookies=None, timeout=30.0, base_url=None\n)\n

    Kwork.ru API client.

    Usage

    Initialize client.

    Parameters:

    Name Type Description Default token Optional[str]

    Web auth token (from getWebAuthToken)

    None cookies Optional[dict[str, str]]

    Session cookies (optional, will be set from token)

    None timeout float

    Request timeout in seconds

    30.0 base_url Optional[str]

    Custom base URL (for testing)

    None Source code in src/kwork_api/client.py
    def __init__(\n    self,\n    token: Optional[str] = None,\n    cookies: Optional[dict[str, str]] = None,\n    timeout: float = 30.0,\n    base_url: Optional[str] = None,\n):\n    \"\"\"\n    Initialize client.\n\n    Args:\n        token: Web auth token (from getWebAuthToken)\n        cookies: Session cookies (optional, will be set from token)\n        timeout: Request timeout in seconds\n        base_url: Custom base URL (for testing)\n    \"\"\"\n    self.base_url = base_url or self.BASE_URL\n    self.timeout = timeout\n    self._token = token\n    self._cookies = cookies or {}\n\n    # Initialize HTTP client\n    self._client: Optional[httpx.AsyncClient] = None\n
    "},{"location":"api/client/#kwork_api.client.KworkClient--login-with-credentials","title":"Login with credentials","text":"

    client = await KworkClient.login(\"username\", \"password\")

    "},{"location":"api/client/#kwork_api.client.KworkClient--or-restore-from-token","title":"Or restore from token","text":"

    client = KworkClient(token=\"your_web_auth_token\")

    "},{"location":"api/client/#kwork_api.client.KworkClient--make-requests","title":"Make requests","text":"

    catalog = await client.catalog.get_list(page=1)

    "},{"location":"api/client/#kwork_api.client.KworkClient-attributes","title":"Attributes","text":""},{"location":"api/client/#kwork_api.client.KworkClient.catalog","title":"catalog property","text":"
    catalog\n

    Catalog API.

    "},{"location":"api/client/#kwork_api.client.KworkClient.notifications","title":"notifications property","text":"
    notifications\n

    Notifications API.

    "},{"location":"api/client/#kwork_api.client.KworkClient.other","title":"other property","text":"
    other\n

    Other endpoints.

    "},{"location":"api/client/#kwork_api.client.KworkClient.projects","title":"projects property","text":"
    projects\n

    Projects API.

    "},{"location":"api/client/#kwork_api.client.KworkClient.reference","title":"reference property","text":"
    reference\n

    Reference data API.

    "},{"location":"api/client/#kwork_api.client.KworkClient.user","title":"user property","text":"
    user\n

    User API.

    "},{"location":"api/client/#kwork_api.client.KworkClient-classes","title":"Classes","text":""},{"location":"api/client/#kwork_api.client.KworkClient.CatalogAPI","title":"CatalogAPI","text":"
    CatalogAPI(client)\n

    Catalog/Kworks API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.CatalogAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.CatalogAPI.get_details","title":"get_details async","text":"
    get_details(kwork_id)\n

    Get kwork details.

    Parameters:

    Name Type Description Default kwork_id int

    Kwork ID

    required

    Returns:

    Type Description KworkDetails

    KworkDetails with full information

    Source code in src/kwork_api/client.py
    async def get_details(self, kwork_id: int) -> KworkDetails:\n    \"\"\"\n    Get kwork details.\n\n    Args:\n        kwork_id: Kwork ID\n\n    Returns:\n        KworkDetails with full information\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/getKworkDetails\",\n        json={\"kwork_id\": kwork_id},\n    )\n    return KworkDetails.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.CatalogAPI.get_details_extra","title":"get_details_extra async","text":"
    get_details_extra(kwork_id)\n

    Get additional kwork details.

    Parameters:

    Name Type Description Default kwork_id int

    Kwork ID

    required

    Returns:

    Type Description dict[str, Any]

    Extra details dict

    Source code in src/kwork_api/client.py
    async def get_details_extra(self, kwork_id: int) -> dict[str, Any]:\n    \"\"\"\n    Get additional kwork details.\n\n    Args:\n        kwork_id: Kwork ID\n\n    Returns:\n        Extra details dict\n    \"\"\"\n    return await self.client._request(\n        \"POST\",\n        \"/getKworkDetailsExtra\",\n        json={\"kwork_id\": kwork_id},\n    )\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.CatalogAPI.get_list","title":"get_list async","text":"
    get_list(page=1, category_id=None, sort='recommend')\n

    Get kworks catalog.

    Parameters:

    Name Type Description Default page int

    Page number

    1 category_id Optional[int]

    Category filter

    None sort str

    Sort option (recommend, price_asc, price_desc, etc.)

    'recommend'

    Returns:

    Type Description CatalogResponse

    CatalogResponse with kworks and pagination

    Source code in src/kwork_api/client.py
    async def get_list(\n    self,\n    page: int = 1,\n    category_id: Optional[int] = None,\n    sort: str = \"recommend\",\n) -> CatalogResponse:\n    \"\"\"\n    Get kworks catalog.\n\n    Args:\n        page: Page number\n        category_id: Category filter\n        sort: Sort option (recommend, price_asc, price_desc, etc.)\n\n    Returns:\n        CatalogResponse with kworks and pagination\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/catalogMainv2\",\n        json={\n            \"page\": page,\n            \"category_id\": category_id,\n            \"sort\": sort,\n        },\n    )\n    return CatalogResponse.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI","title":"NotificationsAPI","text":"
    NotificationsAPI(client)\n

    Notifications and messages endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI.fetch","title":"fetch async","text":"
    fetch()\n

    Fetch new notifications.

    Source code in src/kwork_api/client.py
    async def fetch(self) -> NotificationsResponse:\n    \"\"\"Fetch new notifications.\"\"\"\n    data = await self.client._request(\"POST\", \"/notificationsFetch\")\n    return NotificationsResponse.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI.get_blocked_dialogs","title":"get_blocked_dialogs async","text":"
    get_blocked_dialogs()\n

    Get blocked dialogs.

    Source code in src/kwork_api/client.py
    async def get_blocked_dialogs(self) -> list[Dialog]:\n    \"\"\"Get blocked dialogs.\"\"\"\n    data = await self.client._request(\"POST\", \"/blockedDialogList\")\n    return [Dialog.model_validate(d) for d in data.get(\"dialogs\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI.get_dialogs","title":"get_dialogs async","text":"
    get_dialogs()\n

    Get dialogs list.

    Source code in src/kwork_api/client.py
    async def get_dialogs(self) -> list[Dialog]:\n    \"\"\"Get dialogs list.\"\"\"\n    data = await self.client._request(\"POST\", \"/dialogs\")\n    return [Dialog.model_validate(d) for d in data.get(\"dialogs\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.NotificationsAPI.get_list","title":"get_list async","text":"
    get_list()\n

    Get notifications list.

    Source code in src/kwork_api/client.py
    async def get_list(self) -> NotificationsResponse:\n    \"\"\"Get notifications list.\"\"\"\n    data = await self.client._request(\"POST\", \"/notifications\")\n    return NotificationsResponse.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI","title":"OtherAPI","text":"
    OtherAPI(client)\n

    Other API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_actor","title":"get_actor async","text":"
    get_actor()\n

    Get actor info.

    Source code in src/kwork_api/client.py
    async def get_actor(self) -> dict[str, Any]:\n    \"\"\"Get actor info.\"\"\"\n    return await self.client._request(\"POST\", \"/actor\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_channel","title":"get_channel async","text":"
    get_channel()\n

    Get channel info.

    Source code in src/kwork_api/client.py
    async def get_channel(self) -> dict[str, Any]:\n    \"\"\"Get channel info.\"\"\"\n    return await self.client._request(\"POST\", \"/getChannel\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_exchange_info","title":"get_exchange_info async","text":"
    get_exchange_info()\n

    Get exchange info.

    Source code in src/kwork_api/client.py
    async def get_exchange_info(self) -> dict[str, Any]:\n    \"\"\"Get exchange info.\"\"\"\n    return await self.client._request(\"POST\", \"/exchangeInfo\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_favorite_categories","title":"get_favorite_categories async","text":"
    get_favorite_categories()\n

    Get favorite categories.

    Source code in src/kwork_api/client.py
    async def get_favorite_categories(self) -> list[int]:\n    \"\"\"Get favorite categories.\"\"\"\n    data = await self.client._request(\"POST\", \"/favoriteCategories\")\n    return data.get(\"categories\", [])\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_in_app_notification","title":"get_in_app_notification async","text":"
    get_in_app_notification()\n

    Get in-app notification.

    Source code in src/kwork_api/client.py
    async def get_in_app_notification(self) -> dict[str, Any]:\n    \"\"\"Get in-app notification.\"\"\"\n    return await self.client._request(\"POST\", \"/getInAppNotification\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_kworks_status","title":"get_kworks_status async","text":"
    get_kworks_status()\n

    Get kworks status.

    Source code in src/kwork_api/client.py
    async def get_kworks_status(self) -> dict[str, Any]:\n    \"\"\"Get kworks status.\"\"\"\n    return await self.client._request(\"POST\", \"/kworksStatusList\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_offers","title":"get_offers async","text":"
    get_offers()\n

    Get offers.

    Source code in src/kwork_api/client.py
    async def get_offers(self) -> dict[str, Any]:\n    \"\"\"Get offers.\"\"\"\n    return await self.client._request(\"POST\", \"/offers\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_security_user_data","title":"get_security_user_data async","text":"
    get_security_user_data()\n

    Get security user data.

    Source code in src/kwork_api/client.py
    async def get_security_user_data(self) -> dict[str, Any]:\n    \"\"\"Get security user data.\"\"\"\n    return await self.client._request(\"POST\", \"/getSecurityUserData\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_viewed_kworks","title":"get_viewed_kworks async","text":"
    get_viewed_kworks()\n

    Get viewed kworks.

    Source code in src/kwork_api/client.py
    async def get_viewed_kworks(self) -> list[Kwork]:\n    \"\"\"Get viewed kworks.\"\"\"\n    data = await self.client._request(\"POST\", \"/viewedCatalogKworks\")\n    return [Kwork.model_validate(k) for k in data.get(\"kworks\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_wants","title":"get_wants async","text":"
    get_wants()\n

    Get user wants.

    Source code in src/kwork_api/client.py
    async def get_wants(self) -> dict[str, Any]:\n    \"\"\"Get user wants.\"\"\"\n    return await self.client._request(\"POST\", \"/myWants\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.get_wants_status","title":"get_wants_status async","text":"
    get_wants_status()\n

    Get wants status.

    Source code in src/kwork_api/client.py
    async def get_wants_status(self) -> dict[str, Any]:\n    \"\"\"Get wants status.\"\"\"\n    return await self.client._request(\"POST\", \"/wantsStatusList\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.go_offline","title":"go_offline async","text":"
    go_offline()\n

    Set user status to offline.

    Source code in src/kwork_api/client.py
    async def go_offline(self) -> dict[str, Any]:\n    \"\"\"Set user status to offline.\"\"\"\n    return await self.client._request(\"POST\", \"/offline\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.is_dialog_allow","title":"is_dialog_allow async","text":"
    is_dialog_allow(user_id)\n

    Check if dialog is allowed.

    Source code in src/kwork_api/client.py
    async def is_dialog_allow(self, user_id: int) -> bool:\n    \"\"\"Check if dialog is allowed.\"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/isDialogAllow\",\n        json={\"user_id\": user_id},\n    )\n    return data.get(\"allowed\", False)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.OtherAPI.update_settings","title":"update_settings async","text":"
    update_settings(settings)\n

    Update user settings.

    Source code in src/kwork_api/client.py
    async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]:\n    \"\"\"Update user settings.\"\"\"\n    return await self.client._request(\"POST\", \"/updateSettings\", json=settings)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ProjectsAPI","title":"ProjectsAPI","text":"
    ProjectsAPI(client)\n

    Projects (freelance orders) API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ProjectsAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.ProjectsAPI.get_list","title":"get_list async","text":"
    get_list(page=1, category_id=None)\n

    Get projects list.

    Parameters:

    Name Type Description Default page int

    Page number

    1 category_id Optional[int]

    Category filter

    None

    Returns:

    Type Description ProjectsResponse

    ProjectsResponse with projects and pagination

    Source code in src/kwork_api/client.py
    async def get_list(\n    self,\n    page: int = 1,\n    category_id: Optional[int] = None,\n) -> ProjectsResponse:\n    \"\"\"\n    Get projects list.\n\n    Args:\n        page: Page number\n        category_id: Category filter\n\n    Returns:\n        ProjectsResponse with projects and pagination\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/projects\",\n        json={\n            \"page\": page,\n            \"category_id\": category_id,\n        },\n    )\n    return ProjectsResponse.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ProjectsAPI.get_payer_orders","title":"get_payer_orders async","text":"
    get_payer_orders()\n

    Get orders where user is customer.

    Returns:

    Type Description list[Project]

    List of projects

    Source code in src/kwork_api/client.py
    async def get_payer_orders(self) -> list[Project]:\n    \"\"\"\n    Get orders where user is customer.\n\n    Returns:\n        List of projects\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/payerOrders\")\n    return [Project.model_validate(p) for p in data.get(\"orders\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ProjectsAPI.get_worker_orders","title":"get_worker_orders async","text":"
    get_worker_orders()\n

    Get orders where user is performer.

    Returns:

    Type Description list[Project]

    List of projects

    Source code in src/kwork_api/client.py
    async def get_worker_orders(self) -> list[Project]:\n    \"\"\"\n    Get orders where user is performer.\n\n    Returns:\n        List of projects\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/workerOrders\")\n    return [Project.model_validate(p) for p in data.get(\"orders\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI","title":"ReferenceAPI","text":"
    ReferenceAPI(client)\n

    Reference data (cities, countries, etc.) endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_badges_info","title":"get_badges_info async","text":"
    get_badges_info()\n

    Get badges info.

    Source code in src/kwork_api/client.py
    async def get_badges_info(self) -> list[Badge]:\n    \"\"\"Get badges info.\"\"\"\n    data = await self.client._request(\"POST\", \"/getBadgesInfo\")\n    return [Badge.model_validate(b) for b in data.get(\"badges\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_cities","title":"get_cities async","text":"
    get_cities()\n

    Get all cities.

    Source code in src/kwork_api/client.py
    async def get_cities(self) -> list[City]:\n    \"\"\"Get all cities.\"\"\"\n    data = await self.client._request(\"POST\", \"/cities\")\n    return [City.model_validate(c) for c in data.get(\"cities\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_countries","title":"get_countries async","text":"
    get_countries()\n

    Get all countries.

    Source code in src/kwork_api/client.py
    async def get_countries(self) -> list[Country]:\n    \"\"\"Get all countries.\"\"\"\n    data = await self.client._request(\"POST\", \"/countries\")\n    return [Country.model_validate(c) for c in data.get(\"countries\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_features","title":"get_features async","text":"
    get_features()\n

    Get available features.

    Source code in src/kwork_api/client.py
    async def get_features(self) -> list[Feature]:\n    \"\"\"Get available features.\"\"\"\n    data = await self.client._request(\"POST\", \"/getAvailableFeatures\")\n    return [Feature.model_validate(f) for f in data.get(\"features\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_public_features","title":"get_public_features async","text":"
    get_public_features()\n

    Get public features.

    Source code in src/kwork_api/client.py
    async def get_public_features(self) -> list[Feature]:\n    \"\"\"Get public features.\"\"\"\n    data = await self.client._request(\"POST\", \"/getPublicFeatures\")\n    return [Feature.model_validate(f) for f in data.get(\"features\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.ReferenceAPI.get_timezones","title":"get_timezones async","text":"
    get_timezones()\n

    Get all timezones.

    Source code in src/kwork_api/client.py
    async def get_timezones(self) -> list[TimeZone]:\n    \"\"\"Get all timezones.\"\"\"\n    data = await self.client._request(\"POST\", \"/timezones\")\n    return [TimeZone.model_validate(t) for t in data.get(\"timezones\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.UserAPI","title":"UserAPI","text":"
    UserAPI(client)\n

    User API endpoints.

    Source code in src/kwork_api/client.py
    def __init__(self, client: \"KworkClient\"):\n    self.client = client\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.UserAPI-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.UserAPI.get_favorite_kworks","title":"get_favorite_kworks async","text":"
    get_favorite_kworks()\n

    Get favorite kworks.

    Returns:

    Type Description list[Kwork]

    List of kworks

    Source code in src/kwork_api/client.py
    async def get_favorite_kworks(self) -> list[Kwork]:\n    \"\"\"\n    Get favorite kworks.\n\n    Returns:\n        List of kworks\n    \"\"\"\n    data = await self.client._request(\"POST\", \"/favoriteKworks\")\n    return [Kwork.model_validate(k) for k in data.get(\"kworks\", [])]\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.UserAPI.get_info","title":"get_info async","text":"
    get_info()\n

    Get current user info.

    Returns:

    Type Description dict[str, Any]

    User info dict

    Source code in src/kwork_api/client.py
    async def get_info(self) -> dict[str, Any]:\n    \"\"\"\n    Get current user info.\n\n    Returns:\n        User info dict\n    \"\"\"\n    return await self.client._request(\"POST\", \"/user\")\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.UserAPI.get_reviews","title":"get_reviews async","text":"
    get_reviews(user_id=None, page=1)\n

    Get user reviews.

    Parameters:

    Name Type Description Default user_id Optional[int]

    User ID (None for current user)

    None page int

    Page number

    1

    Returns:

    Type Description ReviewsResponse

    ReviewsResponse

    Source code in src/kwork_api/client.py
    async def get_reviews(\n    self,\n    user_id: Optional[int] = None,\n    page: int = 1,\n) -> ReviewsResponse:\n    \"\"\"\n    Get user reviews.\n\n    Args:\n        user_id: User ID (None for current user)\n        page: Page number\n\n    Returns:\n        ReviewsResponse\n    \"\"\"\n    data = await self.client._request(\n        \"POST\",\n        \"/userReviews\",\n        json={\"user_id\": user_id, \"page\": page},\n    )\n    return ReviewsResponse.model_validate(data)\n
    "},{"location":"api/client/#kwork_api.client.KworkClient-functions","title":"Functions","text":""},{"location":"api/client/#kwork_api.client.KworkClient.close","title":"close async","text":"
    close()\n

    Close HTTP client.

    Source code in src/kwork_api/client.py
    async def close(self) -> None:\n    \"\"\"Close HTTP client.\"\"\"\n    if self._client and not self._client.is_closed:\n        await self._client.aclose()\n
    "},{"location":"api/client/#kwork_api.client.KworkClient.login","title":"login async classmethod","text":"
    login(username, password, timeout=30.0)\n

    Login with username and password.

    Parameters:

    Name Type Description Default username str

    Kwork username or email

    required password str

    Kwork password

    required timeout float

    Request timeout

    30.0

    Returns:

    Type Description KworkClient

    Authenticated KworkClient instance

    Raises:

    Type Description KworkAuthError

    If login fails

    Source code in src/kwork_api/client.py
    @classmethod\nasync def login(\n    cls,\n    username: str,\n    password: str,\n    timeout: float = 30.0,\n) -> \"KworkClient\":\n    \"\"\"\n    Login with username and password.\n\n    Args:\n        username: Kwork username or email\n        password: Kwork password\n        timeout: Request timeout\n\n    Returns:\n        Authenticated KworkClient instance\n\n    Raises:\n        KworkAuthError: If login fails\n    \"\"\"\n    client = cls(timeout=timeout)\n\n    try:\n        async with client._get_httpx_client() as http_client:\n            # Step 1: Login to get session cookies\n            login_data = {\n                \"login_or_email\": username,\n                \"password\": password,\n            }\n\n            response = await http_client.post(\n                cls.LOGIN_URL,\n                data=login_data,\n                headers={\"Referer\": \"https://kwork.ru/\"},\n            )\n\n            if response.status_code != 200:\n                raise KworkAuthError(f\"Login failed: {response.status_code}\")\n\n            # Extract cookies\n            cookies = dict(response.cookies)\n\n            if \"userId\" not in cookies:\n                raise KworkAuthError(\"Login failed: no userId in cookies\")\n\n            # Step 2: Get web auth token\n            token_response = await http_client.post(\n                cls.TOKEN_URL,\n                json={},\n            )\n\n            if token_response.status_code != 200:\n                raise KworkAuthError(f\"Token request failed: {token_response.status_code}\")\n\n            token_data = token_response.json()\n            web_token = token_data.get(\"web_auth_token\")\n\n            if not web_token:\n                raise KworkAuthError(\"No web_auth_token in response\")\n\n            # Create new client with token\n            return cls(token=web_token, cookies=cookies, timeout=timeout)\n\n    except httpx.RequestError as e:\n        raise KworkNetworkError(f\"Login request failed: {e}\")\n
    "},{"location":"api/errors/","title":"Errors","text":"

    Exception classes for error handling.

    "},{"location":"api/errors/#kworkerror","title":"KworkError","text":""},{"location":"api/errors/#kwork_api.errors.KworkError","title":"kwork_api.errors.KworkError","text":"
    KworkError(message, response=None)\n

    Bases: Exception

    Base exception for all Kwork API errors.

    Source code in src/kwork_api/errors.py
    def __init__(self, message: str, response: Optional[Any] = None):\n    self.message = message\n    self.response = response\n    super().__init__(self.message)\n
    "},{"location":"api/errors/#kworkautherror","title":"KworkAuthError","text":""},{"location":"api/errors/#kwork_api.errors.KworkAuthError","title":"kwork_api.errors.KworkAuthError","text":"
    KworkAuthError(\n    message=\"Authentication failed\", response=None\n)\n

    Bases: KworkError

    Authentication/authorization error.

    Source code in src/kwork_api/errors.py
    def __init__(self, message: str = \"Authentication failed\", response: Optional[Any] = None):\n    super().__init__(message, response)\n
    "},{"location":"api/errors/#kworkapierror","title":"KworkApiError","text":""},{"location":"api/errors/#kwork_api.errors.KworkApiError","title":"kwork_api.errors.KworkApiError","text":"
    KworkApiError(message, status_code=None, response=None)\n

    Bases: KworkError

    API request error (4xx, 5xx).

    Source code in src/kwork_api/errors.py
    def __init__(\n    self,\n    message: str,\n    status_code: Optional[int] = None,\n    response: Optional[Any] = None,\n):\n    self.status_code = status_code\n    super().__init__(message, response)\n
    "},{"location":"api/errors/#kworknotfounderror","title":"KworkNotFoundError","text":""},{"location":"api/errors/#kwork_api.errors.KworkNotFoundError","title":"kwork_api.errors.KworkNotFoundError","text":"
    KworkNotFoundError(resource, response=None)\n

    Bases: KworkApiError

    Resource not found (404).

    Source code in src/kwork_api/errors.py
    def __init__(self, resource: str, response: Optional[Any] = None):\n    super().__init__(f\"Resource not found: {resource}\", 404, response)\n
    "},{"location":"api/errors/#kworkratelimiterror","title":"KworkRateLimitError","text":""},{"location":"api/errors/#kwork_api.errors.KworkRateLimitError","title":"kwork_api.errors.KworkRateLimitError","text":"
    KworkRateLimitError(\n    message=\"Rate limit exceeded\", response=None\n)\n

    Bases: KworkApiError

    Rate limit exceeded (429).

    Source code in src/kwork_api/errors.py
    def __init__(self, message: str = \"Rate limit exceeded\", response: Optional[Any] = None):\n    super().__init__(message, 429, response)\n
    "},{"location":"api/models/","title":"Models","text":"

    Pydantic models used in API responses.

    "},{"location":"api/models/#kwork","title":"Kwork","text":""},{"location":"api/models/#kwork_api.models.Kwork","title":"kwork_api.models.Kwork","text":"

    Bases: BaseModel

    Kwork (service) information.

    "},{"location":"api/models/#kworkdetails","title":"KworkDetails","text":""},{"location":"api/models/#kwork_api.models.KworkDetails","title":"kwork_api.models.KworkDetails","text":"

    Bases: Kwork

    Extended kwork details.

    "},{"location":"api/models/#project","title":"Project","text":""},{"location":"api/models/#kwork_api.models.Project","title":"kwork_api.models.Project","text":"

    Bases: BaseModel

    Project (freelance order) information.

    "},{"location":"api/models/#catalogresponse","title":"CatalogResponse","text":""},{"location":"api/models/#kwork_api.models.CatalogResponse","title":"kwork_api.models.CatalogResponse","text":"

    Bases: BaseModel

    Catalog response with kworks and pagination.

    "},{"location":"api/models/#paginationinfo","title":"PaginationInfo","text":""},{"location":"api/models/#kwork_api.models.PaginationInfo","title":"kwork_api.models.PaginationInfo","text":"

    Bases: BaseModel

    Pagination metadata.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Kwork API Documentation","text":"

    Unofficial Python client for Kwork.ru API.

    "},{"location":"#quick-start","title":"Quick Start","text":""},{"location":"#installation","title":"Installation","text":"
    pip install kwork-api\n
    "},{"location":"#authentication","title":"Authentication","text":"
    from kwork_api import KworkClient\n\n# Login with credentials\nclient = await KworkClient.login(\"username\", \"password\")\n\n# Or restore from token\nclient = KworkClient(token=\"your_web_auth_token\")\n
    "},{"location":"#basic-usage","title":"Basic Usage","text":"
    async with KworkClient(token=\"token\") as client:\n    # Get catalog\n    catalog = await client.catalog.get_list(page=1)\n\n    # Get kwork details\n    details = await client.catalog.get_details(kwork_id=123)\n\n    # Get projects\n    projects = await client.projects.get_list()\n
    "},{"location":"#documentation-sections","title":"Documentation Sections","text":""},{"location":"#features","title":"Features","text":""},{"location":"#rate-limiting","title":"Rate Limiting","text":"

    Rate limiting is not implemented in the library. Handle it in your code:

    import asyncio\n\nfor page in range(1, 10):\n    catalog = await client.catalog.get_list(page=page)\n    await asyncio.sleep(1)  # 1 second delay\n
    "},{"location":"#error-handling","title":"Error Handling","text":"
    from kwork_api import KworkAuthError, KworkApiError\n\ntry:\n    catalog = await client.catalog.get_list()\nexcept KworkAuthError as e:\n    print(f\"Auth failed: {e}\")\nexcept KworkApiError as e:\n    print(f\"API error [{e.status_code}]: {e.message}\")\n

    Documentation auto-generated from source code.

    "},{"location":"api-reference/","title":"API Reference","text":"

    Auto-generated API documentation using mkdocstrings.

    "},{"location":"api-reference/#client","title":"Client","text":"

    ::: kwork_api.client.KworkClient

    "},{"location":"api-reference/#models","title":"Models","text":"

    ::: kwork_api.models.Kwork

    ::: kwork_api.models.KworkDetails

    ::: kwork_api.models.Project

    ::: kwork_api.models.CatalogResponse

    "},{"location":"api-reference/#errors","title":"Errors","text":"

    ::: kwork_api.errors.KworkError

    ::: kwork_api.errors.KworkAuthError

    ::: kwork_api.errors.KworkApiError

    "},{"location":"examples/","title":"Usage Examples","text":""},{"location":"examples/#catalog","title":"Catalog","text":""},{"location":"examples/#get-catalog-list","title":"Get Catalog List","text":"
    from kwork_api import KworkClient\n\nasync with KworkClient(token=\"token\") as client:\n    catalog = await client.catalog.get_list(page=1, category_id=5)\n\n    for kwork in catalog.kworks:\n        print(f\"{kwork.title}: {kwork.price} RUB\")\n\n    # Pagination\n    if catalog.pagination:\n        print(f\"Page {catalog.pagination.current_page} of {catalog.pagination.total_pages}\")\n
    "},{"location":"examples/#get-kwork-details","title":"Get Kwork Details","text":"
    details = await client.catalog.get_details(kwork_id=123)\n\nprint(f\"Title: {details.title}\")\nprint(f\"Price: {details.price}\")\nprint(f\"Description: {details.full_description}\")\nprint(f\"Delivery: {details.delivery_time} days\")\n
    "},{"location":"examples/#projects","title":"Projects","text":""},{"location":"examples/#get-projects-list","title":"Get Projects List","text":"
    projects = await client.projects.get_list(page=1)\n\nfor project in projects.projects:\n    print(f\"{project.title} - {project.budget} RUB\")\n
    "},{"location":"examples/#get-customer-orders","title":"Get Customer Orders","text":"
    orders = await client.projects.get_payer_orders()\n\nfor order in orders:\n    print(f\"Order #{order.id}: {order.status}\")\n
    "},{"location":"examples/#get-performer-orders","title":"Get Performer Orders","text":"
    orders = await client.projects.get_worker_orders()\n\nfor order in orders:\n    print(f\"Work #{order.id}: {order.status}\")\n
    "},{"location":"examples/#user","title":"User","text":""},{"location":"examples/#get-user-info","title":"Get User Info","text":"
    user_info = await client.user.get_info()\nprint(f\"Username: {user_info.get('username')}\")\n
    "},{"location":"examples/#get-reviews","title":"Get Reviews","text":"
    reviews = await client.user.get_reviews(page=1)\n\nfor review in reviews.reviews:\n    print(f\"Rating: {review.rating}/5 - {review.comment}\")\n
    "},{"location":"examples/#get-favorite-kworks","title":"Get Favorite Kworks","text":"
    favorites = await client.user.get_favorite_kworks()\n\nfor kwork in favorites:\n    print(f\"Favorite: {kwork.title}\")\n
    "},{"location":"examples/#reference-data","title":"Reference Data","text":""},{"location":"examples/#get-cities","title":"Get Cities","text":"
    cities = await client.reference.get_cities()\n\nfor city in cities:\n    print(f\"{city.id}: {city.name}\")\n
    "},{"location":"examples/#get-countries","title":"Get Countries","text":"
    countries = await client.reference.get_countries()\n\nfor country in countries:\n    print(f\"{country.id}: {country.name}\")\n
    "},{"location":"examples/#get-timezones","title":"Get Timezones","text":"
    timezones = await client.reference.get_timezones()\n\nfor tz in timezones:\n    print(f\"{tz.id}: {tz.name} ({tz.offset})\")\n
    "},{"location":"examples/#notifications","title":"Notifications","text":""},{"location":"examples/#get-notifications","title":"Get Notifications","text":"
    notifications = await client.notifications.get_list()\n\nfor notif in notifications.notifications:\n    print(f\"{notif.title}: {notif.message}\")\n\nprint(f\"Unread: {notifications.unread_count}\")\n
    "},{"location":"examples/#fetch-new-notifications","title":"Fetch New Notifications","text":"
    new_notifications = await client.notifications.fetch()\nprint(f\"New: {len(new_notifications.notifications)}\")\n
    "},{"location":"examples/#get-dialogs","title":"Get Dialogs","text":"
    dialogs = await client.notifications.get_dialogs()\n\nfor dialog in dialogs:\n    print(f\"Dialog with {dialog.participant.username}: {dialog.last_message}\")\n
    "},{"location":"examples/#error-handling","title":"Error Handling","text":"
    from kwork_api import KworkAuthError, KworkApiError, KworkNotFoundError\n\ntry:\n    catalog = await client.catalog.get_list()\nexcept KworkAuthError as e:\n    print(f\"Authentication failed: {e}\")\nexcept KworkNotFoundError as e:\n    print(f\"Resource not found: {e}\")\nexcept KworkApiError as e:\n    print(f\"API error [{e.status_code}]: {e.message}\")\nexcept Exception as e:\n    print(f\"Unexpected error: {e}\")\n
    "},{"location":"examples/#rate-limiting","title":"Rate Limiting","text":"
    import asyncio\n\nasync def fetch_all_pages():\n    all_kworks = []\n\n    for page in range(1, 10):\n        try:\n            catalog = await client.catalog.get_list(page=page)\n            all_kworks.extend(catalog.kworks)\n\n            if not catalog.pagination or not catalog.pagination.has_next:\n                break\n\n            # Delay to avoid rate limiting\n            await asyncio.sleep(1)\n\n        except KworkRateLimitError:\n            print(\"Rate limited, waiting...\")\n            await asyncio.sleep(5)\n\n    return all_kworks\n
    "},{"location":"examples/#pagination-helper","title":"Pagination Helper","text":"
    async def fetch_all_catalog():\n    \"\"\"Fetch all kworks from catalog with pagination.\"\"\"\n    all_kworks = []\n    page = 1\n\n    while True:\n        catalog = await client.catalog.get_list(page=page)\n        all_kworks.extend(catalog.kworks)\n\n        if not catalog.pagination or not catalog.pagination.has_next:\n            break\n\n        page += 1\n        await asyncio.sleep(0.5)  # Rate limiting\n\n    return all_kworks\n

    More examples in the API Reference.

    "},{"location":"api/client/","title":"Client API","text":"

    ::: kwork_api.client.KworkClient options: show_root_heading: true show_source: true merge_init_into_class: true

    "},{"location":"api/errors/","title":"Errors","text":"

    Exception classes for error handling.

    "},{"location":"api/errors/#kworkerror","title":"KworkError","text":"

    ::: kwork_api.errors.KworkError

    "},{"location":"api/errors/#kworkautherror","title":"KworkAuthError","text":"

    ::: kwork_api.errors.KworkAuthError

    "},{"location":"api/errors/#kworkapierror","title":"KworkApiError","text":"

    ::: kwork_api.errors.KworkApiError

    "},{"location":"api/errors/#kworknotfounderror","title":"KworkNotFoundError","text":"

    ::: kwork_api.errors.KworkNotFoundError

    "},{"location":"api/errors/#kworkratelimiterror","title":"KworkRateLimitError","text":"

    ::: kwork_api.errors.KworkRateLimitError

    "},{"location":"api/models/","title":"Models","text":"

    Pydantic models used in API responses.

    "},{"location":"api/models/#kwork","title":"Kwork","text":"

    ::: kwork_api.models.Kwork

    "},{"location":"api/models/#kworkdetails","title":"KworkDetails","text":"

    ::: kwork_api.models.KworkDetails

    "},{"location":"api/models/#project","title":"Project","text":"

    ::: kwork_api.models.Project

    "},{"location":"api/models/#catalogresponse","title":"CatalogResponse","text":"

    ::: kwork_api.models.CatalogResponse

    "},{"location":"api/models/#paginationinfo","title":"PaginationInfo","text":"

    ::: kwork_api.models.PaginationInfo

    "}]} \ No newline at end of file diff --git a/uv.lock b/uv.lock index 7eea8ea..a9c0f03 100644 --- a/uv.lock +++ b/uv.lock @@ -34,6 +34,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, ] +[[package]] +name = "black" +version = "23.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/f4/a57cde4b60da0e249073009f4a9087e9e0a955deae78d3c2a493208d0c5c/black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5", size = 620809, upload-time = "2023-12-22T23:06:17.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/58/677da52d845b59505a8a787ff22eff9cfd9046b5789aa2bd387b236db5c5/black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2", size = 1560531, upload-time = "2023-12-22T23:18:20.555Z" }, + { url = "https://files.pythonhosted.org/packages/11/92/522a4f1e4b2b8da62e4ec0cb8acf2d257e6d39b31f4214f0fd94d2eeb5bd/black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba", size = 1404644, upload-time = "2023-12-22T23:17:46.425Z" }, + { url = "https://files.pythonhosted.org/packages/a4/dc/af67d8281e9a24f73d24b060f3f03f6d9ad6be259b3c6acef2845e17d09c/black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0", size = 1711153, upload-time = "2023-12-22T23:08:34.4Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0f/94d7c36b421ea187359c413be7b9fc66dc105620c3a30b1c94310265830a/black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3", size = 1332918, upload-time = "2023-12-22T23:10:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/ed/2c/d9b1a77101e6e5f294f6553d76c39322122bfea2a438aeea4eb6d4b22749/black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba", size = 1541926, upload-time = "2023-12-22T23:23:17.72Z" }, + { url = "https://files.pythonhosted.org/packages/72/e2/d981a3ff05ba9abe3cfa33e70c986facb0614fd57c4f802ef435f4dd1697/black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b", size = 1388465, upload-time = "2023-12-22T23:19:00.611Z" }, + { url = "https://files.pythonhosted.org/packages/eb/59/1f5c8eb7bba8a8b1bb5c87f097d16410c93a48a6655be3773db5d2783deb/black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59", size = 1691993, upload-time = "2023-12-22T23:08:32.018Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/a80abc6fcdb00f0d4d3d74184b172adbf2197f6b002913fa0fb6af4dc6db/black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50", size = 1340929, upload-time = "2023-12-22T23:09:37.088Z" }, + { url = "https://files.pythonhosted.org/packages/66/16/8726cedc83be841dfa854bbeef1288ee82272282a71048d7935292182b0b/black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e", size = 1569989, upload-time = "2023-12-22T23:20:22.158Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1e/30f5eafcc41b8378890ba39b693fa111f7dca8a2620ba5162075d95ffe46/black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec", size = 1398647, upload-time = "2023-12-22T23:19:57.225Z" }, + { url = "https://files.pythonhosted.org/packages/99/de/ddb45cc044256431d96d846ce03164d149d81ca606b5172224d1872e0b58/black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e", size = 1720450, upload-time = "2023-12-22T23:08:52.675Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/54e5dbe9be5a10cbea2259517206ff7b6a452bb34e07508c7e1395950833/black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9", size = 1351070, upload-time = "2023-12-22T23:09:32.762Z" }, + { url = "https://files.pythonhosted.org/packages/7b/14/4da7b12a9abc43a601c215cb5a3d176734578da109f0dbf0a832ed78be09/black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e", size = 194363, upload-time = "2023-12-22T23:06:14.278Z" }, +] + [[package]] name = "certifi" version = "2026.2.25" @@ -43,6 +73,123 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] +[[package]] +name = "charset-normalizer" +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, + { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, + { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, + { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, + { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, + { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, + { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, + { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -170,6 +317,92 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "databind" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "nr-date" }, + { name = "nr-stream" }, + { name = "typeapi" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/b8/a6beffa3dd3d7898003d32b3ff5dc0be422c54efed5e0e3f85e92c65c2b2/databind-4.5.2.tar.gz", hash = "sha256:0a8aa0ff130a0306581c559388f5ef65e0fae7ef4b86412eacb1f4a0420006c4", size = 43001, upload-time = "2024-05-31T15:29:07.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/5b/39577d7629da11765786f45a37dccdf7f420038f6040325fe1ca40f52a93/databind-4.5.2-py3-none-any.whl", hash = "sha256:b9c3a03c0414aa4567f095d7218ac904bd2b267b58e3763dac28e83d64b69770", size = 49283, upload-time = "2024-05-31T15:29:00.026Z" }, +] + +[[package]] +name = "databind-core" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "databind" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/78/d05b13cc6aee2e84a3253c193e8dd2487c89ca80b9ecf63721e41cce4b78/databind.core-4.5.2.tar.gz", hash = "sha256:b8ac8127bc5d6b239a2a81aeddb268b0c4cadd53fbce7e8b2c7a9ef6413bccb3", size = 1485, upload-time = "2024-05-31T15:29:09.625Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/54/eed2d15f7e1465a7a5a00958c0c926d153201c6cf37a5012d9012005bd8b/databind.core-4.5.2-py3-none-any.whl", hash = "sha256:a1dd1c6bd8ca9907d1292d8df9ec763ce91543e27f7eda4268e4a1a84fcd1c42", size = 1477, upload-time = "2024-05-31T15:29:02.264Z" }, +] + +[[package]] +name = "databind-json" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "databind" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/15/77a84f4b552365119dcc03076daeb0e1e0167b337ec7fbdfabe722f2d5e8/databind.json-4.5.2.tar.gz", hash = "sha256:6cc9b5c6fddaebd49b2433932948eb3be8a41633b90aa37998d7922504b8f165", size = 1466, upload-time = "2024-05-31T15:29:11.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/0f/a2f53f5e7be49bfa98dcb4e552382a6dc8c74ea74e755723654b85062316/databind.json-4.5.2-py3-none-any.whl", hash = "sha256:a803bf440634685984361cb2a5a975887e487c854ed48d81ff7aaf3a1ed1e94c", size = 1473, upload-time = "2024-05-31T15:29:05.857Z" }, +] + +[[package]] +name = "deprecated" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, +] + +[[package]] +name = "docspec" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "databind-core" }, + { name = "databind-json" }, + { name = "deprecated" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/fe/1ad244d0ca186b5386050ec30dfd59bd3dbeea5baec33ca861dd43b922e6/docspec-2.2.2.tar.gz", hash = "sha256:c772c6facfce839176b647701082c7a22b3d22d872d392552cf5d65e0348c919", size = 14086, upload-time = "2025-05-06T12:39:59.466Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/57/1011f2e88743a818cced9a95d54200ba6a05decaf43fd91d8c6ed9f6470d/docspec-2.2.2-py3-none-any.whl", hash = "sha256:854d25401e7ec2d155b0c1e001e25819d16b6df3a7575212a7f340ae8b00122e", size = 9726, upload-time = "2025-05-06T12:39:58.047Z" }, +] + +[[package]] +name = "docspec-python" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "black" }, + { name = "docspec" }, + { name = "nr-util" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/88/99c5e27a894f01290364563c84838cf68f1a8629474b5bbfc3bf35a8d923/docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559", size = 13838, upload-time = "2023-05-28T11:24:19.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/49/b8d1a2fa01b6f7a1a9daa1d485efc7684489028d6a356fc2bc5b40131061/docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54", size = 16093, upload-time = "2023-05-28T11:24:17.261Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ce/5d6a3782b9f88097ce3e579265015db3372ae78d12f67629b863a9208c96/docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb", size = 22775, upload-time = "2021-09-30T07:44:10.288Z" } + [[package]] name = "exceptiongroup" version = "1.3.1" @@ -273,6 +506,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + [[package]] name = "kwork-api" version = "0.1.0" @@ -294,6 +539,7 @@ dev = [ [package.dev-dependencies] dev = [ + { name = "pydoc-markdown" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-cov" }, @@ -316,6 +562,7 @@ provides-extras = ["dev"] [package.metadata.requires-dev] dev = [ + { name = "pydoc-markdown", specifier = ">=4.8.2" }, { name = "pytest", specifier = ">=8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.23.0" }, { name = "pytest-cov", specifier = ">=4.0.0" }, @@ -323,6 +570,131 @@ dev = [ { name = "ruff", specifier = ">=0.3.0" }, ] +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nr-date" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/92/08110dd3d7ff5e2b852a220752eb6c40183839f5b7cc91f9f38dd2298e7d/nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6", size = 8789, upload-time = "2023-08-16T13:46:04.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/10/1d2b00172537c1522fe64bbc6fb16b015632a02f7b3864e788ccbcb4dd85/nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568", size = 10496, upload-time = "2023-08-16T13:46:02.627Z" }, +] + +[[package]] +name = "nr-stream" +version = "1.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/37/e4d36d852c441233c306c5fbd98147685dce3ac9b0a8bbf4a587d0ea29ea/nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65", size = 10053, upload-time = "2023-02-14T22:44:09.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/e1/f93485fe09aa36c0e1a3b76363efa1791241f7f863a010f725c95e8a74fe/nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4", size = 10448, upload-time = "2023-02-14T22:44:07.72Z" }, +] + +[[package]] +name = "nr-util" +version = "0.8.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/0c/078c567d95e25564bc1ede3c2cf6ce1c91f50648c83786354b47224326da/nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4", size = 63707, upload-time = "2022-06-20T13:29:29.192Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/58/eab08df9dbd69d9e21fc5e7be6f67454f386336ec71e6b64e378a2dddea4/nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb", size = 90319, upload-time = "2022-06-20T13:29:27.312Z" }, +] + [[package]] name = "packaging" version = "26.0" @@ -332,6 +704,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -474,6 +864,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] +[[package]] +name = "pydoc-markdown" +version = "4.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "databind-core" }, + { name = "databind-json" }, + { name = "docspec" }, + { name = "docspec-python" }, + { name = "docstring-parser" }, + { name = "jinja2" }, + { name = "nr-util" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tomli" }, + { name = "tomli-w" }, + { name = "watchdog" }, + { name = "yapf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/8a/2c7f7ad656d22371a596d232fc140327b958d7f1d491b889632ea0cb7e87/pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b", size = 44506, upload-time = "2023-06-26T12:37:01.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/5a/ce0b056d9a95fd0c06a6cfa5972477d79353392d19230c748a7ba5a9df04/pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f", size = 67830, upload-time = "2023-06-26T12:36:59.502Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -529,6 +944,85 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + [[package]] name = "respx" version = "0.22.0" @@ -632,6 +1126,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, +] + +[[package]] +name = "typeapi" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/92/5a23ad34aa877edf00906166e339bfdc571543ea183ea7ab727bb01516c7/typeapi-2.3.0.tar.gz", hash = "sha256:a60d11f72c5ec27338cfd1c807f035b0b16ed2e3b798fb1c1d34fc5589f544be", size = 122687, upload-time = "2025-10-23T13:44:11.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/84/021bbeb7edb990dd6875cb6ab08d32faaa49fec63453d863730260a01f9e/typeapi-2.3.0-py3-none-any.whl", hash = "sha256:576b7dcb94412e91c5cae107a393674f8f99c10a24beb8be2302e3fed21d5cc2", size = 26858, upload-time = "2025-10-23T13:44:09.833Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -652,3 +1167,143 @@ sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] + +[[package]] +name = "wrapt" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/64/925f213fdcbb9baeb1530449ac71a4d57fc361c053d06bf78d0c5c7cd80c/wrapt-2.1.2.tar.gz", hash = "sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e", size = 81678, upload-time = "2026-03-06T02:53:25.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/d2/387594fb592d027366645f3d7cc9b4d7ca7be93845fbaba6d835a912ef3c/wrapt-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a86d99a14f76facb269dc148590c01aaf47584071809a70da30555228158c", size = 60669, upload-time = "2026-03-06T02:52:40.671Z" }, + { url = "https://files.pythonhosted.org/packages/c9/18/3f373935bc5509e7ac444c8026a56762e50c1183e7061797437ca96c12ce/wrapt-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a819e39017f95bf7aede768f75915635aa8f671f2993c036991b8d3bfe8dbb6f", size = 61603, upload-time = "2026-03-06T02:54:21.032Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7a/32758ca2853b07a887a4574b74e28843919103194bb47001a304e24af62f/wrapt-2.1.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5681123e60aed0e64c7d44f72bbf8b4ce45f79d81467e2c4c728629f5baf06eb", size = 113632, upload-time = "2026-03-06T02:53:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d5/eeaa38f670d462e97d978b3b0d9ce06d5b91e54bebac6fbed867809216e7/wrapt-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8b28e97a44d21836259739ae76284e180b18abbb4dcfdff07a415cf1016c3e", size = 115644, upload-time = "2026-03-06T02:54:53.33Z" }, + { url = "https://files.pythonhosted.org/packages/e3/09/2a41506cb17affb0bdf9d5e2129c8c19e192b388c4c01d05e1b14db23c00/wrapt-2.1.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cef91c95a50596fcdc31397eb6955476f82ae8a3f5a8eabdc13611b60ee380ba", size = 112016, upload-time = "2026-03-06T02:54:43.274Z" }, + { url = "https://files.pythonhosted.org/packages/64/15/0e6c3f5e87caadc43db279724ee36979246d5194fa32fed489c73643ba59/wrapt-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dad63212b168de8569b1c512f4eac4b57f2c6934b30df32d6ee9534a79f1493f", size = 114823, upload-time = "2026-03-06T02:54:29.392Z" }, + { url = "https://files.pythonhosted.org/packages/56/b2/0ad17c8248f4e57bedf44938c26ec3ee194715f812d2dbbd9d7ff4be6c06/wrapt-2.1.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d307aa6888d5efab2c1cde09843d48c843990be13069003184b67d426d145394", size = 111244, upload-time = "2026-03-06T02:54:02.149Z" }, + { url = "https://files.pythonhosted.org/packages/ff/04/bcdba98c26f2c6522c7c09a726d5d9229120163493620205b2f76bd13c01/wrapt-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c87cf3f0c85e27b3ac7d9ad95da166bf8739ca215a8b171e8404a2d739897a45", size = 113307, upload-time = "2026-03-06T02:54:12.428Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1b/5e2883c6bc14143924e465a6fc5a92d09eeabe35310842a481fb0581f832/wrapt-2.1.2-cp310-cp310-win32.whl", hash = "sha256:d1c5fea4f9fe3762e2b905fdd67df51e4be7a73b7674957af2d2ade71a5c075d", size = 57986, upload-time = "2026-03-06T02:54:26.823Z" }, + { url = "https://files.pythonhosted.org/packages/42/5a/4efc997bccadd3af5749c250b49412793bc41e13a83a486b2b54a33e240c/wrapt-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:d8f7740e1af13dff2684e4d56fe604a7e04d6c94e737a60568d8d4238b9a0c71", size = 60336, upload-time = "2026-03-06T02:54:18Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f5/a2bb833e20181b937e87c242645ed5d5aa9c373006b0467bfe1a35c727d0/wrapt-2.1.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c6cc827c00dc839350155f316f1f8b4b0c370f52b6a19e782e2bda89600c7dc", size = 58757, upload-time = "2026-03-06T02:53:51.545Z" }, + { url = "https://files.pythonhosted.org/packages/c7/81/60c4471fce95afa5922ca09b88a25f03c93343f759aae0f31fb4412a85c7/wrapt-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96159a0ee2b0277d44201c3b5be479a9979cf154e8c82fa5df49586a8e7679bb", size = 60666, upload-time = "2026-03-06T02:52:58.934Z" }, + { url = "https://files.pythonhosted.org/packages/6b/be/80e80e39e7cb90b006a0eaf11c73ac3a62bbfb3068469aec15cc0bc795de/wrapt-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98ba61833a77b747901e9012072f038795de7fc77849f1faa965464f3f87ff2d", size = 61601, upload-time = "2026-03-06T02:53:00.487Z" }, + { url = "https://files.pythonhosted.org/packages/b0/be/d7c88cd9293c859fc74b232abdc65a229bb953997995d6912fc85af18323/wrapt-2.1.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:767c0dbbe76cae2a60dd2b235ac0c87c9cccf4898aef8062e57bead46b5f6894", size = 114057, upload-time = "2026-03-06T02:52:44.08Z" }, + { url = "https://files.pythonhosted.org/packages/ea/25/36c04602831a4d685d45a93b3abea61eca7fe35dab6c842d6f5d570ef94a/wrapt-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c691a6bc752c0cc4711cc0c00896fcd0f116abc253609ef64ef930032821842", size = 116099, upload-time = "2026-03-06T02:54:56.74Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4e/98a6eb417ef551dc277bec1253d5246b25003cf36fdf3913b65cb7657a56/wrapt-2.1.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f3b7d73012ea75aee5844de58c88f44cf62d0d62711e39da5a82824a7c4626a8", size = 112457, upload-time = "2026-03-06T02:53:52.842Z" }, + { url = "https://files.pythonhosted.org/packages/cb/a6/a6f7186a5297cad8ec53fd7578533b28f795fdf5372368c74bd7e6e9841c/wrapt-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:577dff354e7acd9d411eaf4bfe76b724c89c89c8fc9b7e127ee28c5f7bcb25b6", size = 115351, upload-time = "2026-03-06T02:53:32.684Z" }, + { url = "https://files.pythonhosted.org/packages/97/6f/06e66189e721dbebd5cf20e138acc4d1150288ce118462f2fcbff92d38db/wrapt-2.1.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3d7b6fd105f8b24e5bd23ccf41cb1d1099796524bcc6f7fbb8fe576c44befbc9", size = 111748, upload-time = "2026-03-06T02:53:08.455Z" }, + { url = "https://files.pythonhosted.org/packages/ef/43/4808b86f499a51370fbdbdfa6cb91e9b9169e762716456471b619fca7a70/wrapt-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:866abdbf4612e0b34764922ef8b1c5668867610a718d3053d59e24a5e5fcfc15", size = 113783, upload-time = "2026-03-06T02:53:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/91/2c/a3f28b8fa7ac2cefa01cfcaca3471f9b0460608d012b693998cd61ef43df/wrapt-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5a0a0a3a882393095573344075189eb2d566e0fd205a2b6414e9997b1b800a8b", size = 57977, upload-time = "2026-03-06T02:53:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c3/2b1c7bd07a27b1db885a2fab469b707bdd35bddf30a113b4917a7e2139d2/wrapt-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:64a07a71d2730ba56f11d1a4b91f7817dc79bc134c11516b75d1921a7c6fcda1", size = 60336, upload-time = "2026-03-06T02:54:28.104Z" }, + { url = "https://files.pythonhosted.org/packages/ec/5c/76ece7b401b088daa6503d6264dd80f9a727df3e6042802de9a223084ea2/wrapt-2.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:b89f095fe98bc12107f82a9f7d570dc83a0870291aeb6b1d7a7d35575f55d98a", size = 58756, upload-time = "2026-03-06T02:53:16.319Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b6/1db817582c49c7fcbb7df6809d0f515af29d7c2fbf57eb44c36e98fb1492/wrapt-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9", size = 61255, upload-time = "2026-03-06T02:52:45.663Z" }, + { url = "https://files.pythonhosted.org/packages/a2/16/9b02a6b99c09227c93cd4b73acc3678114154ec38da53043c0ddc1fba0dc/wrapt-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748", size = 61848, upload-time = "2026-03-06T02:53:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/af/aa/ead46a88f9ec3a432a4832dfedb84092fc35af2d0ba40cd04aea3889f247/wrapt-2.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e", size = 121433, upload-time = "2026-03-06T02:54:40.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9f/742c7c7cdf58b59085a1ee4b6c37b013f66ac33673a7ef4aaed5e992bc33/wrapt-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8", size = 123013, upload-time = "2026-03-06T02:53:26.58Z" }, + { url = "https://files.pythonhosted.org/packages/e8/44/2c3dd45d53236b7ed7c646fcf212251dc19e48e599debd3926b52310fafb/wrapt-2.1.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c", size = 117326, upload-time = "2026-03-06T02:53:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/b17d66abc26bd96f89dec0ecd0ef03da4a1286e6ff793839ec431b9fae57/wrapt-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c", size = 121444, upload-time = "2026-03-06T02:54:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/62/e2977843fdf9f03daf1586a0ff49060b1b2fc7ff85a7ea82b6217c1ae36e/wrapt-2.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1", size = 116237, upload-time = "2026-03-06T02:54:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/27fc67914e68d740bce512f11734aec08696e6b17641fef8867c00c949fc/wrapt-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2", size = 120563, upload-time = "2026-03-06T02:53:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9f/b750b3692ed2ef4705cb305bd68858e73010492b80e43d2a4faa5573cbe7/wrapt-2.1.2-cp312-cp312-win32.whl", hash = "sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0", size = 58198, upload-time = "2026-03-06T02:53:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b2/feecfe29f28483d888d76a48f03c4c4d8afea944dbee2b0cd3380f9df032/wrapt-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63", size = 60441, upload-time = "2026-03-06T02:52:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/44/e1/e328f605d6e208547ea9fd120804fcdec68536ac748987a68c47c606eea8/wrapt-2.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf", size = 58836, upload-time = "2026-03-06T02:53:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/4c/7a/d936840735c828b38d26a854e85d5338894cda544cb7a85a9d5b8b9c4df7/wrapt-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787fd6f4d67befa6fe2abdffcbd3de2d82dfc6fb8a6d850407c53332709d030b", size = 61259, upload-time = "2026-03-06T02:53:41.922Z" }, + { url = "https://files.pythonhosted.org/packages/5e/88/9a9b9a90ac8ca11c2fdb6a286cb3a1fc7dd774c00ed70929a6434f6bc634/wrapt-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4bdf26e03e6d0da3f0e9422fd36bcebf7bc0eeb55fdf9c727a09abc6b9fe472e", size = 61851, upload-time = "2026-03-06T02:52:48.672Z" }, + { url = "https://files.pythonhosted.org/packages/03/a9/5b7d6a16fd6533fed2756900fc8fc923f678179aea62ada6d65c92718c00/wrapt-2.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bbac24d879aa22998e87f6b3f481a5216311e7d53c7db87f189a7a0266dafffb", size = 121446, upload-time = "2026-03-06T02:54:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/45/bb/34c443690c847835cfe9f892be78c533d4f32366ad2888972c094a897e39/wrapt-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16997dfb9d67addc2e3f41b62a104341e80cac52f91110dece393923c0ebd5ca", size = 123056, upload-time = "2026-03-06T02:54:10.829Z" }, + { url = "https://files.pythonhosted.org/packages/93/b9/ff205f391cb708f67f41ea148545f2b53ff543a7ac293b30d178af4d2271/wrapt-2.1.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:162e4e2ba7542da9027821cb6e7c5e068d64f9a10b5f15512ea28e954893a267", size = 117359, upload-time = "2026-03-06T02:53:03.623Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/1ea04d7747825119c3c9a5e0874a40b33594ada92e5649347c457d982805/wrapt-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f29c827a8d9936ac320746747a016c4bc66ef639f5cd0d32df24f5eacbf9c69f", size = 121479, upload-time = "2026-03-06T02:53:45.844Z" }, + { url = "https://files.pythonhosted.org/packages/78/cc/ee3a011920c7a023b25e8df26f306b2484a531ab84ca5c96260a73de76c0/wrapt-2.1.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a9dd9813825f7ecb018c17fd147a01845eb330254dff86d3b5816f20f4d6aaf8", size = 116271, upload-time = "2026-03-06T02:54:46.356Z" }, + { url = "https://files.pythonhosted.org/packages/98/fd/e5ff7ded41b76d802cf1191288473e850d24ba2e39a6ec540f21ae3b57cb/wrapt-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f8dbdd3719e534860d6a78526aafc220e0241f981367018c2875178cf83a413", size = 120573, upload-time = "2026-03-06T02:52:50.163Z" }, + { url = "https://files.pythonhosted.org/packages/47/c5/242cae3b5b080cd09bacef0591691ba1879739050cc7c801ff35c8886b66/wrapt-2.1.2-cp313-cp313-win32.whl", hash = "sha256:5c35b5d82b16a3bc6e0a04349b606a0582bc29f573786aebe98e0c159bc48db6", size = 58205, upload-time = "2026-03-06T02:53:47.494Z" }, + { url = "https://files.pythonhosted.org/packages/12/69/c358c61e7a50f290958809b3c61ebe8b3838ea3e070d7aac9814f95a0528/wrapt-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f8bc1c264d8d1cf5b3560a87bbdd31131573eb25f9f9447bb6252b8d4c44a3a1", size = 60452, upload-time = "2026-03-06T02:53:30.038Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/c8a6fcfe321295fd8c0ab1bd685b5a01462a9b3aa2f597254462fc2bc975/wrapt-2.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:3beb22f674550d5634642c645aba4c72a2c66fb185ae1aebe1e955fae5a13baf", size = 58842, upload-time = "2026-03-06T02:52:52.114Z" }, + { url = "https://files.pythonhosted.org/packages/da/55/9c7052c349106e0b3f17ae8db4b23a691a963c334de7f9dbd60f8f74a831/wrapt-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fc04bc8664a8bc4c8e00b37b5355cffca2535209fba1abb09ae2b7c76ddf82b", size = 63075, upload-time = "2026-03-06T02:53:19.108Z" }, + { url = "https://files.pythonhosted.org/packages/09/a8/ce7b4006f7218248dd71b7b2b732d0710845a0e49213b18faef64811ffef/wrapt-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a9b9d50c9af998875a1482a038eb05755dfd6fe303a313f6a940bb53a83c3f18", size = 63719, upload-time = "2026-03-06T02:54:33.452Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e5/2ca472e80b9e2b7a17f106bb8f9df1db11e62101652ce210f66935c6af67/wrapt-2.1.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2d3ff4f0024dd224290c0eabf0240f1bfc1f26363431505fb1b0283d3b08f11d", size = 152643, upload-time = "2026-03-06T02:52:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/36/42/30f0f2cefca9d9cbf6835f544d825064570203c3e70aa873d8ae12e23791/wrapt-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3278c471f4468ad544a691b31bb856374fbdefb7fee1a152153e64019379f015", size = 158805, upload-time = "2026-03-06T02:54:25.441Z" }, + { url = "https://files.pythonhosted.org/packages/bb/67/d08672f801f604889dcf58f1a0b424fe3808860ede9e03affc1876b295af/wrapt-2.1.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8914c754d3134a3032601c6984db1c576e6abaf3fc68094bb8ab1379d75ff92", size = 145990, upload-time = "2026-03-06T02:53:57.456Z" }, + { url = "https://files.pythonhosted.org/packages/68/a7/fd371b02e73babec1de6ade596e8cd9691051058cfdadbfd62a5898f3295/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ff95d4264e55839be37bafe1536db2ab2de19da6b65f9244f01f332b5286cfbf", size = 155670, upload-time = "2026-03-06T02:54:55.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/9fe0095dfdb621009f40117dcebf41d7396c2c22dca6eac779f4c007b86c/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:76405518ca4e1b76fbb1b9f686cff93aebae03920cc55ceeec48ff9f719c5f67", size = 144357, upload-time = "2026-03-06T02:54:24.092Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/ec7b4a254abbe4cde9fa15c5d2cca4518f6b07d0f1b77d4ee9655e30280e/wrapt-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c0be8b5a74c5824e9359b53e7e58bef71a729bacc82e16587db1c4ebc91f7c5a", size = 150269, upload-time = "2026-03-06T02:53:31.268Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6b/2fabe8ebf148f4ee3c782aae86a795cc68ffe7d432ef550f234025ce0cfa/wrapt-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:f01277d9a5fc1862f26f7626da9cf443bebc0abd2f303f41c5e995b15887dabd", size = 59894, upload-time = "2026-03-06T02:54:15.391Z" }, + { url = "https://files.pythonhosted.org/packages/ca/fb/9ba66fc2dedc936de5f8073c0217b5d4484e966d87723415cc8262c5d9c2/wrapt-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:84ce8f1c2104d2f6daa912b1b5b039f331febfeee74f8042ad4e04992bd95c8f", size = 63197, upload-time = "2026-03-06T02:54:41.943Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1c/012d7423c95d0e337117723eb8ecf73c622ce15a97847e84cf3f8f26cd7e/wrapt-2.1.2-cp313-cp313t-win_arm64.whl", hash = "sha256:a93cd767e37faeddbe07d8fc4212d5cba660af59bdb0f6372c93faaa13e6e679", size = 60363, upload-time = "2026-03-06T02:54:48.093Z" }, + { url = "https://files.pythonhosted.org/packages/39/25/e7ea0b417db02bb796182a5316398a75792cd9a22528783d868755e1f669/wrapt-2.1.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1370e516598854e5b4366e09ce81e08bfe94d42b0fd569b88ec46cc56d9164a9", size = 61418, upload-time = "2026-03-06T02:53:55.706Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0f/fa539e2f6a770249907757eaeb9a5ff4deb41c026f8466c1c6d799088a9b/wrapt-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6de1a3851c27e0bd6a04ca993ea6f80fc53e6c742ee1601f486c08e9f9b900a9", size = 61914, upload-time = "2026-03-06T02:52:53.37Z" }, + { url = "https://files.pythonhosted.org/packages/53/37/02af1867f5b1441aaeda9c82deed061b7cd1372572ddcd717f6df90b5e93/wrapt-2.1.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:de9f1a2bbc5ac7f6012ec24525bdd444765a2ff64b5985ac6e0692144838542e", size = 120417, upload-time = "2026-03-06T02:54:30.74Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b7/0138a6238c8ba7476c77cf786a807f871672b37f37a422970342308276e7/wrapt-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:970d57ed83fa040d8b20c52fe74a6ae7e3775ae8cff5efd6a81e06b19078484c", size = 122797, upload-time = "2026-03-06T02:54:51.539Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ad/819ae558036d6a15b7ed290d5b14e209ca795dd4da9c58e50c067d5927b0/wrapt-2.1.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3969c56e4563c375861c8df14fa55146e81ac11c8db49ea6fb7f2ba58bc1ff9a", size = 117350, upload-time = "2026-03-06T02:54:37.651Z" }, + { url = "https://files.pythonhosted.org/packages/8b/2d/afc18dc57a4600a6e594f77a9ae09db54f55ba455440a54886694a84c71b/wrapt-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:57d7c0c980abdc5f1d98b11a2aa3bb159790add80258c717fa49a99921456d90", size = 121223, upload-time = "2026-03-06T02:54:35.221Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5b/5ec189b22205697bc56eb3b62aed87a1e0423e9c8285d0781c7a83170d15/wrapt-2.1.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:776867878e83130c7a04237010463372e877c1c994d449ca6aaafeab6aab2586", size = 116287, upload-time = "2026-03-06T02:54:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2d/f84939a7c9b5e6cdd8a8d0f6a26cabf36a0f7e468b967720e8b0cd2bdf69/wrapt-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fab036efe5464ec3291411fabb80a7a39e2dd80bae9bcbeeca5087fdfa891e19", size = 119593, upload-time = "2026-03-06T02:54:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/0b/fe/ccd22a1263159c4ac811ab9374c061bcb4a702773f6e06e38de5f81a1bdc/wrapt-2.1.2-cp314-cp314-win32.whl", hash = "sha256:e6ed62c82ddf58d001096ae84ce7f833db97ae2263bff31c9b336ba8cfe3f508", size = 58631, upload-time = "2026-03-06T02:53:06.498Z" }, + { url = "https://files.pythonhosted.org/packages/65/0a/6bd83be7bff2e7efaac7b4ac9748da9d75a34634bbbbc8ad077d527146df/wrapt-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:467e7c76315390331c67073073d00662015bb730c566820c9ca9b54e4d67fd04", size = 60875, upload-time = "2026-03-06T02:53:50.252Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c0/0b3056397fe02ff80e5a5d72d627c11eb885d1ca78e71b1a5c1e8c7d45de/wrapt-2.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:da1f00a557c66225d53b095a97eace0fc5349e3bfda28fa34ffae238978ee575", size = 59164, upload-time = "2026-03-06T02:53:59.128Z" }, + { url = "https://files.pythonhosted.org/packages/71/ed/5d89c798741993b2371396eb9d4634f009ff1ad8a6c78d366fe2883ea7a6/wrapt-2.1.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:62503ffbc2d3a69891cf29beeaccdb4d5e0a126e2b6a851688d4777e01428dbb", size = 63163, upload-time = "2026-03-06T02:52:54.873Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8c/05d277d182bf36b0a13d6bd393ed1dec3468a25b59d01fba2dd70fe4d6ae/wrapt-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c7e6cd120ef837d5b6f860a6ea3745f8763805c418bb2f12eeb1fa6e25f22d22", size = 63723, upload-time = "2026-03-06T02:52:56.374Z" }, + { url = "https://files.pythonhosted.org/packages/f4/27/6c51ec1eff4413c57e72d6106bb8dec6f0c7cdba6503d78f0fa98767bcc9/wrapt-2.1.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3769a77df8e756d65fbc050333f423c01ae012b4f6731aaf70cf2bef61b34596", size = 152652, upload-time = "2026-03-06T02:53:23.79Z" }, + { url = "https://files.pythonhosted.org/packages/db/4c/d7dd662d6963fc7335bfe29d512b02b71cdfa23eeca7ab3ac74a67505deb/wrapt-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a76d61a2e851996150ba0f80582dd92a870643fa481f3b3846f229de88caf044", size = 158807, upload-time = "2026-03-06T02:53:35.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4d/1e5eea1a78d539d346765727422976676615814029522c76b87a95f6bcdd/wrapt-2.1.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6f97edc9842cf215312b75fe737ee7c8adda75a89979f8e11558dfff6343cc4b", size = 146061, upload-time = "2026-03-06T02:52:57.574Z" }, + { url = "https://files.pythonhosted.org/packages/89/bc/62cabea7695cd12a288023251eeefdcb8465056ddaab6227cb78a2de005b/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4006c351de6d5007aa33a551f600404ba44228a89e833d2fadc5caa5de8edfbf", size = 155667, upload-time = "2026-03-06T02:53:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/e9/99/6f2888cd68588f24df3a76572c69c2de28287acb9e1972bf0c83ce97dbc1/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a9372fc3639a878c8e7d87e1556fa209091b0a66e912c611e3f833e2c4202be2", size = 144392, upload-time = "2026-03-06T02:54:22.41Z" }, + { url = "https://files.pythonhosted.org/packages/40/51/1dfc783a6c57971614c48e361a82ca3b6da9055879952587bc99fe1a7171/wrapt-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3144b027ff30cbd2fca07c0a87e67011adb717eb5f5bd8496325c17e454257a3", size = 150296, upload-time = "2026-03-06T02:54:07.848Z" }, + { url = "https://files.pythonhosted.org/packages/6c/38/cbb8b933a0201076c1f64fc42883b0023002bdc14a4964219154e6ff3350/wrapt-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:3b8d15e52e195813efe5db8cec156eebe339aaf84222f4f4f051a6c01f237ed7", size = 60539, upload-time = "2026-03-06T02:54:00.594Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/e5176e4b241c9f528402cebb238a36785a628179d7d8b71091154b3e4c9e/wrapt-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:08ffa54146a7559f5b8df4b289b46d963a8e74ed16ba3687f99896101a3990c5", size = 63969, upload-time = "2026-03-06T02:54:39Z" }, + { url = "https://files.pythonhosted.org/packages/5c/99/79f17046cf67e4a95b9987ea129632ba8bcec0bc81f3fb3d19bdb0bd60cd/wrapt-2.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:72aaa9d0d8e4ed0e2e98019cea47a21f823c9dd4b43c7b77bba6679ffcca6a00", size = 60554, upload-time = "2026-03-06T02:53:14.132Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/8528ac2dfa2c1e6708f647df7ae144ead13f0a31146f43c7264b4942bf12/wrapt-2.1.2-py3-none-any.whl", hash = "sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8", size = 43993, upload-time = "2026-03-06T02:53:12.905Z" }, +] + +[[package]] +name = "yapf" +version = "0.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/97/b6f296d1e9cc1ec25c7604178b48532fa5901f721bcf1b8d8148b13e5588/yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e", size = 254907, upload-time = "2024-11-14T00:11:41.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/81/6acd6601f61e31cfb8729d3da6d5df966f80f374b78eff83760714487338/yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca", size = 256158, upload-time = "2024-11-14T00:11:39.37Z" }, +]