From 127e5927bc93e25153c54763f905937fe71c792b Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Mar 2026 04:35:58 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20MkDocs=20+=20mkdocstrings=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20HTML=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Рефакторинг: - OtherAPI упразднён — все методы перемещены в KworkClient - Методы client.get_wants(), get_kworks_status() и др. теперь напрямую в клиенте - Удалён property client.other Документация: - MkDocs + mkdocstrings + Material theme для HTML сайта - Навигация, поиск, форматирование кода - docs/index.md — quick start guide - docs/api/*.md — API reference с автогенерацией из docstrings - Pre-commit hook для автогенерации HTML Зависимости: - Добавлены: mkdocs, mkdocs-material, mkdocstrings, mkdocstrings-python - Убран pydoc-markdown (не нужен) Команды: - mkdocs build — сборка HTML - mkdocs serve — локальный просмотр --- .gitignore | 3 + WIP.md | 46 +- docs/api-reference.md | 9 + docs/api/client.md | 3 + docs/api/errors.md | 5 + docs/api/models.md | 5 + docs/index.md | 97 +++++ mkdocs.yml | 79 ++++ pyproject.toml | 4 + .../__pycache__/client.cpython-312.pyc | Bin 29083 -> 54873 bytes .../__pycache__/errors.cpython-312.pyc | Bin 5590 -> 9059 bytes .../__pycache__/models.cpython-312.pyc | Bin 9959 -> 18176 bytes src/kwork_api/client.py | 396 ++++++++---------- uv.lock | 239 +++++++++++ 14 files changed, 642 insertions(+), 244 deletions(-) create mode 100644 docs/api-reference.md create mode 100644 docs/api/client.md create mode 100644 docs/api/errors.md create mode 100644 docs/api/models.md create mode 100644 docs/index.md create mode 100644 mkdocs.yml diff --git a/.gitignore b/.gitignore index c70e9ab..12338f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ site/ api_reference.md +__pycache__/ +*.pyc +site/ diff --git a/WIP.md b/WIP.md index 2e109cb..dee385d 100644 --- a/WIP.md +++ b/WIP.md @@ -43,35 +43,49 @@ ## 📝 Заметки -### Автогенерация документации (2026-03-23 04:28) +### Автогенерация документации (2026-03-23 04:35) -**Инструмент:** pydoc-markdown +**Инструмент:** MkDocs + mkdocstrings + Material theme **Структура:** ``` docs/ -├── api_reference.md # Auto-generated from docstrings +├── index.md # Quick start guide +├── api-reference.md # API overview +├── api/ +│ ├── client.md # KworkClient documentation +│ ├── models.md # Pydantic models +│ └── errors.md # Exception classes +└── examples.md # Usage examples + +site/ # Generated HTML (не коммитим) +├── index.html +├── api-reference/ +└── ... ``` **Конфигурация:** -- `pydoc-markdown.yml` — конфигурация генерации -- Pre-commit hook — автогенерация при коммите +- `mkdocs.yml` — MkDocs конфигурация +- Pre-commit hook — автогенерация HTML при коммите **Покрытие документацией:** -- `KworkClient` — класс, __init__, login(), все API группы -- `CatalogAPI` — get_list(), get_details(), get_details_extra() -- `ProjectsAPI` — get_list(), get_payer_orders(), get_worker_orders() -- `UserAPI` — get_info(), get_reviews(), get_favorite_kworks() -- `ReferenceAPI` — все методы (cities, countries, features, badges...) -- `NotificationsAPI` — все методы (list, fetch, dialogs...) -- `OtherAPI` — все методы (wants, settings, offline...) -- `models.py` — все 20+ моделей -- `errors.py` — все 7 исключений +- `KworkClient` — класс, аутентификация, все методы +- `CatalogAPI` — каталог кворков +- `ProjectsAPI` — биржа проектов +- `UserAPI` — пользовательские данные +- `ReferenceAPI` — справочники +- `NotificationsAPI` — уведомления +- `client.get_*()` — настройки и предпочтения (бывший OtherAPI) +- `models.py` — все модели +- `errors.py` — все исключения **Команды:** ```bash -# Ручная генерация -pydoc-markdown > docs/api_reference.md +# Сборка HTML документации +mkdocs build + +# Локальный просмотр +mkdocs serve ``` ### Аудит эндпоинтов (2026-03-23 03:08) diff --git a/docs/api-reference.md b/docs/api-reference.md new file mode 100644 index 0000000..8aaf2d9 --- /dev/null +++ b/docs/api-reference.md @@ -0,0 +1,9 @@ +# API Reference + +Complete API documentation for Kwork API client. + +## Modules + +- [Client](api/client.md) — Main client class and API groups +- [Models](api/models.md) — Pydantic models for API responses +- [Errors](api/errors.md) — Exception classes diff --git a/docs/api/client.md b/docs/api/client.md new file mode 100644 index 0000000..bee123c --- /dev/null +++ b/docs/api/client.md @@ -0,0 +1,3 @@ +# Client API + +::: kwork_api.client.KworkClient diff --git a/docs/api/errors.md b/docs/api/errors.md new file mode 100644 index 0000000..eef1951 --- /dev/null +++ b/docs/api/errors.md @@ -0,0 +1,5 @@ +# Errors + +Exception classes for API errors. + +::: kwork_api.errors diff --git a/docs/api/models.md b/docs/api/models.md new file mode 100644 index 0000000..44fa61f --- /dev/null +++ b/docs/api/models.md @@ -0,0 +1,5 @@ +# Models + +Pydantic models for API responses. + +::: kwork_api.models diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..8c780aa --- /dev/null +++ b/docs/index.md @@ -0,0 +1,97 @@ +# Kwork API — Python Client + +Unofficial Python client for Kwork.ru API. + +## Installation + +```bash +pip install kwork-api +``` + +Or with UV: + +```bash +uv add kwork-api +``` + +## Quick Start + +### Login with credentials + +```python +from kwork_api import KworkClient + +# Authenticate +client = await KworkClient.login("username", "password") + +# Get catalog +catalog = await client.catalog.get_list(page=1) + +# Get projects +projects = await client.projects.get_list(page=1) + +# Close when done +await client.close() +``` + +### Using context manager + +```python +async with await KworkClient.login("username", "password") as client: + catalog = await client.catalog.get_list(page=1) + # Client automatically closes +``` + +### Restore from token + +```python +# Save token after login +token = client._token + +# Later, restore session +client = KworkClient(token=token) +user_info = await client.user.get_info() +``` + +## API Overview + +### Catalog API + +- `client.catalog.get_list()` — Get kworks catalog +- `client.catalog.get_details(kwork_id)` — Get kwork details + +### Projects API + +- `client.projects.get_list()` — Get freelance projects +- `client.projects.get_payer_orders()` — Your orders as customer +- `client.projects.get_worker_orders()` — Your orders as performer + +### User API + +- `client.user.get_info()` — Get user profile +- `client.user.get_reviews()` — Get user reviews +- `client.user.get_favorite_kworks()` — Get favorite kworks + +### Settings & Preferences + +- `client.get_wants()` — User preferences +- `client.get_kworks_status()` — Kworks status +- `client.update_settings()` — Update settings +- `client.go_offline()` — Set offline status + +See [API Reference](api-reference.md) for full documentation. + +## Error Handling + +```python +from kwork_api import KworkError, KworkAuthError, KworkApiError + +try: + await client.catalog.get_list() +except KworkAuthError: + print("Invalid credentials") +except KworkApiError as e: + print(f"API error: {e.status_code}") +except KworkError as e: + print(f"General error: {e.message}") +``` diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..ec3c29d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,79 @@ +site_name: Kwork API +site_description: Unofficial Python client for Kwork.ru API +site_url: https://github.com/claw/kwork-api + +repo_name: claw/kwork-api +repo_url: https://github.com/claw/kwork-api + +theme: + name: material + features: + - navigation.tabs + - navigation.sections + - toc.integrate + - search.suggest + - search.highlight + palette: + - scheme: default + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode + +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__" + +markdown_extensions: + - admonition + - attr_list + - def_list + - footnotes + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.magiclink: + repo_url_shorthand: true + user: claw + repo: kwork-api + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + +nav: + - Home: index.md + - API Reference: + - Overview: api-reference.md + - Client: api/client.md + - Models: api/models.md + - Errors: api/errors.md + - Examples: examples.md diff --git a/pyproject.toml b/pyproject.toml index 5adea36..cd79277 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,10 @@ dev = [ "respx>=0.20.0", "ruff>=0.3.0", "pydoc-markdown>=4.8.2", + "mkdocs>=1.6.1", + "mkdocs-material>=9.7.6", + "mkdocstrings>=1.0.3", + "mkdocstrings-python>=2.0.3", ] [tool.pytest.ini_options] diff --git a/src/kwork_api/__pycache__/client.cpython-312.pyc b/src/kwork_api/__pycache__/client.cpython-312.pyc index 88384f2a0ce179956b7a579004760c727a009038..aba3e05c8ec598585f540f8b42acdb3a43d5d845 100644 GIT binary patch literal 54873 zcmd_T3wT`BohNups**}lNhPaf*_K~r`6c-w`EC3J*}@pG1=u8El+cP$mF+TmI8`OE zh23ooNlZg{q?yLh3CPJzM;_8Mg5X9FASO+EGT(f?TZIy&ufFUw+tV}Kz2EM)B4USx z?wxOczyG=Kx+U2jI@|kkZQZ)}-19!?|NftI{$pijxrXaM{q#!WxmPvqKl8=7{QASx zuki4k7SlSkm@ih;v+vpZ(@)^*hN z&gq!bJGWzQ@4SwAz4aaSz4JTf_b%vI(7Ui>Veg`jMZJqV7WYOwqPnt#jW2!Kr`|f26=}Cn|r2GYk6A<^BHPW1OhyZU0$uAUxA8t;pp=uh;eQ_ban z&-~k)igLxReW!B4J5DfiS5K2KSGqr)KJkTQ&)>6JO{KX?DZ2GU;^t(sKbfmiuP8*l ztD33jS@Nwto@QlLP>l-ePw(p==!>bah=d*LO2-c*dJ}0CSSx{F?CMFxq~a3VG%Ht) zHp}y&cXpjdw)7{MDNIynYi@MWdHGacRE+CKUkki z4#gix#2?Is)vxs-cz2>V-qGI|?^ffg?lQUYI8|57DIC`@b+wM7n6INaR@C8-6=TZ! zJ4(tl^)I$9RuV6b2j?M4tQ1dW@nAf7q=@el7L1q2%8VFCg0b>P105CdP?;9n9;=84 zVK2wj>Nx*DO&Vr$~d@nr>iaV_3g;<+*2#F57+H6vt| zge=!XS`e~2w$9$Wu6+Hm^@y{^6{F0Hs2E1HquCl}B-9p3Xj;8O^+% z{d)Fn=AF#jczQhZMl|zg=En%WjMsC~%xjq+XP=5n`sU;SabU9~Ryn+cl$R0bo$SNe zbD5FMtBjqwtP)CK_L0m_nB_as%&REwa^|flW23Zp5St~w70rGNudii(f*@9h8NH>7 zWO>`AsI}3|3z-r5_G85R5%YW%Ih|$RnOCEk(WuG*dB16-cqTK72!Ea#!8d8+<;baqW(Dh1irDdEd4UySp<8Cy@S-!3cR2O z?;r{?KvN$#^7uYdN*86`LSg7t)afZkMlSE*-z(Y2j8G%VMX4=&^PTKBjoj@;HD-P! zO@D_KSc9Ch=g=57L)xM6E*BH%IThrSo zzd8G?8p0nVk8i3zK_92$sT8SjcYpu=iFis{!8&d*k{^wyzZAcZ6z%T*`{M=kc`$xo zCkcCJnz1As)gzq4qZpja*|XWlF);Sls&Q9iX4QOYH1qB3*YWK≻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 AOaK4? diff --git a/src/kwork_api/__pycache__/errors.cpython-312.pyc b/src/kwork_api/__pycache__/errors.cpython-312.pyc index 9da2003109564cc4066d00e6789457ec0601ce95..adda591cadb9322dc08f307f176e73984c63e8f5 100644 GIT binary patch literal 9059 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 diff --git a/src/kwork_api/__pycache__/models.cpython-312.pyc b/src/kwork_api/__pycache__/models.cpython-312.pyc index 62350fac50bcb8f86695890813b85209b26d9b10..d54b54addd14199335ebcc239648049736c02d81 100644 GIT binary patch literal 18176 zcmcIsYj9g-dY0^CNwy{1ac<6Cv7N*scajtm$PSPY2p2xH@#)LkCx2BGc-b&rR- zQK)-C-RGfh8rz?`z1$fNg<2jT%VtJOxxr-RYUO(6P2@{{V>%Ej7Npj>yGRL`<;b)x!4^`#_ls^is(%4K{{ zRL3h9cO@&=DzlYO<(b!TeZBH&vho>z!sBPqTeZBIDdIBDR@mj-h0RztQ_@Sh zVLjDgHr_ijX2u>HE#(R$nLG&1_hpLuqlK)VH=9o6^n7;Ek~#UZgeG+3Dcrst(nAAb z2w}r1h~7Y>uIWwLhP&~L9>G;3ud>=eREJ=#Bef~pB(%stv)+Qcs8ypCHR4u{7-?f# zs@ZIoO*vK6jq?9;Ka==WW-8aJFJmXhv0^e;*-Nahy=M5v8ev7a-51ry?vb`q+*>Lc zxu?q|y?8|K*=a6&Bw6_x_T^ILGM5)if35l&_Uz>GIvrQvR9&)l83P>24D0A)rgD|T z2^g>Cx_Bf8rrS4esjbgM>YLoRE^?27$ni@Rti%w}gb%!q25N|>>9nwyeN zn=R?|a3NdH^E#eRKU>b^tzV+)bha=EawCRgwx`pXk&!|Pi&YpYl3FYoMjYH|Q0*8A z6sGocp^!J)c-b_RFJwx;2;IO<=(jue8ihh>?-}CA?#yUzZ_yZ3cWK^X1bV)>XLQVH zMr|qBN%1g>S3+MlB${Hs-WY0*Pdu>DwqoMZg=FveL({RDmFE(3TJOS|4dW*#OLN+W zh0WdLCng`9J~j2&yw+_{WTdZP89k1lZ$(B$S~ZcyCXrUnlEsL~VpA$=CPWsG0XI$; zjIr`Pjy%3&$=WYPCNGiwFN1$6pqD9%iVMG<=s_4oj;+2cmt2;%1n#fF>Yq?tM0kPO z%QPwG%a8#`*zRIxNT*y;C0wI808vEragBkyPZ`Y^`ba5Fd;k<+N>n44WJ~}FAT_55 zXkYSF4_s5^|DF%Rzw4qntZ5iDb4-mhF*OdZ-)wdsm})lKxw#!IR7rnSBZbv~Ti-E~H6_d3jCQdF$v84yR^}rt2ZZ}VKU@S!#k2Q6XoVGC&uA-zp+ztH*tc#off z4!zycD{-sU3bbmrS|xML%=!Lk978yrL3pP-v7w6L(UeblK~ zaaqDE)mPOMs&6EpICY;#l@40?WJ~N)!E~Rb6cnCQ*P^iG9qJgC)TM>d^d!?$Fg$ZDwc3C&0F8Q|KTR(X_Wp|3jE9Zg_K zp~*Fr;1TZghZe8$2Twl=)0%{-`ps4kvzSf717;(3%#7LFY_@u~%#5f#`9;`l&+0>& za=w%v$_$pEaLkBWbkV#9e7}&HFuY4+wz#u3TimIn*4zq?_Mk(BqicCZyfk*O=wl%o zJBlk)%jaMd>?D!e+t|foHw$1y$k@Zehs0Y+V{s6F#lJ*BB<=(fZ&yg%+BWgf!q#o$ z4^MZ^^qku?r)^tk?U;CEVb!|v2PX&Tv~|88ySIx4@V#n$%bd3T^R7)l&(3!p0PXnn z%Bhoc+5wM^FsF4dtXn_+==6a(ZT-Twl-Lwq)sF5tE#a$MsSsmoJu|0_P|we-GktwmJz3fWHO~27J?W zS%SGFg5g~WwQxZ70`tQb4qy{}NdOxNKtkmLylMHBxFwPSO&O9xIAm|fBY5|{8T%^H` z)`8&mA(4&?C;$e(tojO;S0GmOlslLqz+Kr`g3R^ToIPPX#E-T#D{*ru^DL)=XHu7m zD&&*+OkyFHhd#HUt`k5|qv$s~{5xaDy{l{{YF5l_cBXHnz`kb8o`czlQKVJ`g4gY+ zsnAM{KrsgqC<_^c7-b?J;uRsw*vsPgSlofa)Uvt3k{_e?^Jf;{!C&!N6vU`FFlv2h z$IgnjYWkU(;<@2D?Y0G=&m+@)GY8J?2KX%W>;SghIdkmX(K&6$f@?|6X+58>-!iMs zuRjD3%T6Dd%FStqK2L6&&CVz98b3CIjHpA59U8@*=arlmHk7rKjM#K+1IWklz z-+;xb1ir4V0PzsN9!x4xnVZP3(toA&C@cx^+E0N&kgMvHpb!X0td zqq<>F?(h6{m9bnq5U+jpOs1F~(O;m|@)uGI)-oWGri<7i5)}(xDtA8YWE9fn??l8H z#tiW3az9x~(Jy)s)pi>>Ssiz3thg0g6~)h@vaGiJ|7U2$0bsYIY`lLtLs z-cjCui^V-G?q#ut#eFP%rp6J{Smg0nydMR{xCLUoCIlm=fY8eRiPFHmkiv65+MQ%ytARGWo*kC-mYd)QVny z%#q&n;8j6v26}C;o$8iBIXES*mUlS1t_GGs4@IR$Pt^2qGd_p#TPTBWz9O=Sp33D* zy1_BLMa9GrAaoWZmlu-~(O`^%q3PFLu_zXdQo11STW~{BbSkh+U5D0;k3jQbd%g)e-q|!$;lvhtZ41Kh)bFUc0o2wmtbK2g8zFp%FO#Z=icILo) zjWc(i8>uF?&1t(n-`q2Me17v`$WQNd@my+NJFFyv]JM_K(Be(_7hEyu<+*vc`> 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 md dict[str, Any]: """ - Прочее API. + Получить пользовательские предпочтения (wants). - Вспомогательные эндпоинты которые не вошли в другие категории: - - Пользовательские настройки и предпочтения (wants) - - Статусы кворков и заказов - - Персональные предложения (offers) - - Настройки профиля - - Статус онлайн/оффлайн + Wants — это настройки интересов пользователя: + - Предпочитаемые категории + - Ключевые слова для мониторинга + - Фильтры для поиска + + Returns: + Словарь с настройками предпочтений. Example: - # Пользовательские предпочтения - wants = await client.other.get_wants() - - # Статус кворков - status = await client.other.get_kworks_status() - - # Установить статус оффлайн - await client.other.go_offline() + wants = await client.get_wants() + print(wants) """ + return await self._request("POST", "/myWants") + + async def get_wants_status(self) -> dict[str, Any]: + """ + Получить статус предпочтений. - def __init__(self, client: "KworkClient"): - self.client = client + Returns: + Статус wants с метаданными. + """ + return await self._request("POST", "/wantsStatusList") + + async def get_kworks_status(self) -> dict[str, Any]: + """ + Получить статусы кворков пользователя. - async def get_wants(self) -> dict[str, Any]: - """ - Получить пользовательские предпочтения (wants). - - Wants — это настройки интересов пользователя: - - Предпочитаемые категории - - Ключевые слова для мониторинга - - Фильтры для поиска - - Returns: - Словарь с настройками предпочтений. - - Example: - wants = await client.other.get_wants() - print(wants) - """ - return await self.client._request("POST", "/myWants") + Возвращает информацию о статусах всех кворков + текущего пользователя (активен, на модерации, и т.д.). - async def get_wants_status(self) -> dict[str, Any]: - """ - Получить статус предпочтений. - - Returns: - Статус wants с метаданными. - """ - return await self.client._request("POST", "/wantsStatusList") + Returns: + Словарь со статусами кворков. - async def get_kworks_status(self) -> dict[str, Any]: - """ - Получить статусы кворков пользователя. - - Возвращает информацию о статусах всех кворков - текущего пользователя (активен, на модерации, и т.д.). - - Returns: - Словарь со статусами кворков. - - Example: - status = await client.other.get_kworks_status() - print(status) - """ - return await self.client._request("POST", "/kworksStatusList") + Example: + status = await client.get_kworks_status() + print(status) + """ + return await self._request("POST", "/kworksStatusList") + + async def get_offers(self) -> dict[str, Any]: + """ + Получить персональные предложения. - async def get_offers(self) -> dict[str, Any]: - """ - Получить персональные предложения. - - Returns: - Список персональных предложений от Kwork. - """ - return await self.client._request("POST", "/offers") + Returns: + Список персональных предложений от Kwork. + """ + return await self._request("POST", "/offers") + + async def get_exchange_info(self) -> dict[str, Any]: + """ + Получить информацию об обмене валюты. - async def get_exchange_info(self) -> dict[str, Any]: - """ - Получить информацию об обмене валюты. - - Returns: - Информация о курсах валют и обмене. - """ - return await self.client._request("POST", "/exchangeInfo") + Returns: + Информация о курсах валют и обмене. + """ + return await self._request("POST", "/exchangeInfo") + + async def get_channel(self) -> dict[str, Any]: + """ + Получить информацию о канале пользователя. - async def get_channel(self) -> dict[str, Any]: - """ - Получить информацию о канале пользователя. - - Returns: - Данные канала (если есть). - """ - return await self.client._request("POST", "/getChannel") + Returns: + Данные канала (если есть). + """ + return await self._request("POST", "/getChannel") + + async def get_in_app_notification(self) -> dict[str, Any]: + """ + Получить внутриприложенное уведомление. - async def get_in_app_notification(self) -> dict[str, Any]: - """ - Получить внутриприложенное уведомление. - - Returns: - Данные in-app уведомления. - """ - return await self.client._request("POST", "/getInAppNotification") + Returns: + Данные in-app уведомления. + """ + return await self._request("POST", "/getInAppNotification") + + async def get_security_user_data(self) -> dict[str, Any]: + """ + Получить данные безопасности пользователя. - async def get_security_user_data(self) -> dict[str, Any]: - """ - Получить данные безопасности пользователя. - - Returns: - Информация о безопасности аккаунта. - """ - return await self.client._request("POST", "/getSecurityUserData") + Returns: + Информация о безопасности аккаунта. + """ + return await self._request("POST", "/getSecurityUserData") + + async def is_dialog_allow(self, user_id: int) -> bool: + """ + Проверить возможность начала диалога с пользователем. - async def is_dialog_allow(self, user_id: int) -> bool: - """ - Проверить возможность начала диалога с пользователем. - - Args: - user_id: ID пользователя для проверки. - - Returns: - True если диалог разрешён, False иначе. - - Example: - allowed = await client.other.is_dialog_allow(12345) - if allowed: - print("Можно написать сообщение") - """ - data = await self.client._request( - "POST", - "/isDialogAllow", - json={"user_id": user_id}, - ) - return data.get("allowed", False) + Args: + user_id: ID пользователя для проверки. - async def get_viewed_kworks(self) -> list[Kwork]: - """ - Получить просмотренные кворки. - - Возвращает список кворков, которые пользователь - просматривал ранее. - - Returns: - Список просмотренных кворков. - - Example: - viewed = await client.other.get_viewed_kworks() - print(f"Просмотрено: {len(viewed)} кворков") - """ - data = await self.client._request("POST", "/viewedCatalogKworks") - return [Kwork.model_validate(k) for k in data.get("kworks", [])] + Returns: + True если диалог разрешён, False иначе. - async def get_favorite_categories(self) -> list[int]: - """ - Получить ID избранных категорий. - - Returns: - Список ID категорий, добавленных в избранное. - - Example: - cats = await client.other.get_favorite_categories() - print(f"Избранные категории: {cats}") - """ - data = await self.client._request("POST", "/favoriteCategories") - return data.get("categories", []) + Example: + allowed = await client.is_dialog_allow(12345) + if allowed: + print("Можно написать сообщение") + """ + data = await self._request( + "POST", + "/isDialogAllow", + json={"user_id": user_id}, + ) + return data.get("allowed", False) + + async def get_viewed_kworks(self) -> list[Kwork]: + """ + Получить просмотренные кворки. - async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]: - """ - Обновить настройки пользователя. - - Args: - settings: Словарь с настройками для обновления. - Структура зависит от конкретных настроек. - - Returns: - Ответ API с подтверждением обновления. - - Example: - await client.other.update_settings({ - "email_notifications": True, - "language": "ru" - }) - """ - return await self.client._request("POST", "/updateSettings", json=settings) + Возвращает список кворков, которые пользователь + просматривал ранее. - async def go_offline(self) -> dict[str, Any]: - """ - Установить статус пользователя "оффлайн". - - Скрывает онлайн-статус от других пользователей. - - Returns: - Подтверждение изменения статуса. - - Example: - await client.other.go_offline() - """ - return await self.client._request("POST", "/offline") + Returns: + Список просмотренных кворков. - async def get_actor(self) -> dict[str, Any]: - """ - Получить информацию об актёре (текущем пользователе). - - Returns: - Данные актёра/пользователя. - """ - return await self.client._request("POST", "/actor") + Example: + viewed = await client.get_viewed_kworks() + print(f"Просмотрено: {len(viewed)} кворков") + """ + data = await self._request("POST", "/viewedCatalogKworks") + return [Kwork.model_validate(k) for k in data.get("kworks", [])] + + async def get_favorite_categories(self) -> list[int]: + """ + Получить ID избранных категорий. + + Returns: + Список ID категорий, добавленных в избранное. + + Example: + cats = await client.get_favorite_categories() + print(f"Избранные категории: {cats}") + """ + data = await self._request("POST", "/favoriteCategories") + return data.get("categories", []) + + async def update_settings(self, settings: dict[str, Any]) -> dict[str, Any]: + """ + Обновить настройки пользователя. + + Args: + settings: Словарь с настройками для обновления. + Структура зависит от конкретных настроек. + + Returns: + Ответ API с подтверждением обновления. + + Example: + await client.update_settings({ + "email_notifications": True, + "language": "ru" + }) + """ + return await self._request("POST", "/updateSettings", json=settings) + + async def go_offline(self) -> dict[str, Any]: + """ + Установить статус пользователя "оффлайн". + + Скрывает онлайн-статус от других пользователей. + + Returns: + Подтверждение изменения статуса. + + Example: + await client.go_offline() + """ + return await self._request("POST", "/offline") + + async def get_actor(self) -> dict[str, Any]: + """ + Получить информацию об актёре (текущем пользователе). + + Returns: + Данные актёра/пользователя. + """ + return await self._request("POST", "/actor") # ========== API Property Accessors ========== @property def catalog(self) -> CatalogAPI: - """ - API каталога кворков. - - Returns: - CatalogAPI для работы с каталогом. - """ + """API каталога кворков.""" return self.CatalogAPI(self) @property def projects(self) -> ProjectsAPI: - """ - API биржи проектов. - - Returns: - ProjectsAPI для работы с проектами. - """ + """API биржи проектов.""" return self.ProjectsAPI(self) @property def user(self) -> UserAPI: - """ - Пользовательское API. - - Returns: - UserAPI для работы с профилем. - """ + """Пользовательское API.""" return self.UserAPI(self) @property def reference(self) -> ReferenceAPI: - """ - Справочное API. - - Returns: - ReferenceAPI для справочных данных. - """ + """Справочное API.""" return self.ReferenceAPI(self) @property def notifications(self) -> NotificationsAPI: - """ - API уведомлений. - - Returns: - NotificationsAPI для уведомлений и сообщений. - """ + """API уведомлений.""" return self.NotificationsAPI(self) - - @property - def other(self) -> OtherAPI: - """ - Прочее API. - - Returns: - OtherAPI для вспомогательных эндпоинтов. - """ - return self.OtherAPI(self) diff --git a/uv.lock b/uv.lock index a9c0f03..3f1920d 100644 --- a/uv.lock +++ b/uv.lock @@ -25,6 +25,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + [[package]] name = "backports-asyncio-runner" version = "1.2.0" @@ -34,6 +43,20 @@ 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 = "backrefs" +version = "6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/a6/e325ec73b638d3ede4421b5445d4a0b8b219481826cc079d510100af356c/backrefs-6.2.tar.gz", hash = "sha256:f44ff4d48808b243b6c0cdc6231e22195c32f77046018141556c66f8bab72a49", size = 7012303, upload-time = "2026-02-16T19:10:15.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/39/3765df263e08a4df37f4f43cb5aa3c6c17a4bdd42ecfe841e04c26037171/backrefs-6.2-py310-none-any.whl", hash = "sha256:0fdc7b012420b6b144410342caeb8adc54c6866cf12064abc9bb211302e496f8", size = 381075, upload-time = "2026-02-16T19:10:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl", hash = "sha256:08aa7fae530c6b2361d7bdcbda1a7c454e330cc9dbcd03f5c23205e430e5c3be", size = 392874, upload-time = "2026-02-16T19:10:06.314Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/77e8c9745b4d227cce9f5e0a6f68041278c5f9b18588b35905f5f19c1beb/backrefs-6.2-py312-none-any.whl", hash = "sha256:c3f4b9cb2af8cda0d87ab4f57800b57b95428488477be164dd2b47be54db0c90", size = 398787, upload-time = "2026-02-16T19:10:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl", hash = "sha256:12df81596ab511f783b7d87c043ce26bc5b0288cf3bb03610fe76b8189282b2b", size = 400747, upload-time = "2026-02-16T19:10:09.791Z" }, + { url = "https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl", hash = "sha256:e5f805ae09819caa1aa0623b4a83790e7028604aa2b8c73ba602c4454e665de7", size = 412602, upload-time = "2026-02-16T19:10:12.317Z" }, + { url = "https://files.pythonhosted.org/packages/21/f8/d02f650c47d05034dcd6f9c8cf94f39598b7a89c00ecda0ecb2911bc27e9/backrefs-6.2-py39-none-any.whl", hash = "sha256:664e33cd88c6840b7625b826ecf2555f32d491800900f5a541f772c485f7cda7", size = 381077, upload-time = "2026-02-16T19:10:13.74Z" }, +] + [[package]] name = "black" version = "23.12.1" @@ -415,6 +438,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "griffelib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -539,6 +582,10 @@ dev = [ [package.dev-dependencies] dev = [ + { name = "mkdocs" }, + { name = "mkdocs-material" }, + { name = "mkdocstrings" }, + { name = "mkdocstrings-python" }, { name = "pydoc-markdown" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -562,6 +609,10 @@ provides-extras = ["dev"] [package.metadata.requires-dev] dev = [ + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-material", specifier = ">=9.7.6" }, + { name = "mkdocstrings", specifier = ">=1.0.3" }, + { name = "mkdocstrings-python", specifier = ">=2.0.3" }, { name = "pydoc-markdown", specifier = ">=4.8.2" }, { name = "pytest", specifier = ">=8.0.0" }, { name = "pytest-asyncio", specifier = ">=0.23.0" }, @@ -570,6 +621,15 @@ dev = [ { name = "ruff", specifier = ">=0.3.0" }, ] +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -655,6 +715,130 @@ wheels = [ { 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 = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.7.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/29/6d2bcf41ae40802c4beda2432396fff97b8456fb496371d1bc7aad6512ec/mkdocs_material-9.7.6.tar.gz", hash = "sha256:00bdde50574f776d328b1862fe65daeaf581ec309bd150f7bff345a098c64a69", size = 4097959, upload-time = "2026-03-19T15:41:58.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/01/bc663630c510822c95c47a66af9fa7a443c295b47d5f041e5e6ae62ef659/mkdocs_material-9.7.6-py3-none-any.whl", hash = "sha256:71b84353921b8ea1ba84fe11c50912cc512da8fe0881038fcc9a0761c0e635ba", size = 9305470, upload-time = "2026-03-19T15:41:55.217Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "mkdocstrings" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/62/0dfc5719514115bf1781f44b1d7f2a0923fcc01e9c5d7990e48a05c9ae5d/mkdocstrings-1.0.3.tar.gz", hash = "sha256:ab670f55040722b49bb45865b2e93b824450fb4aef638b00d7acb493a9020434", size = 100946, upload-time = "2026-02-07T14:31:40.973Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl", hash = "sha256:0d66d18430c2201dc7fe85134277382baaa15e6b30979f3f3bdbabd6dbdb6046", size = 35523, upload-time = "2026-02-07T14:31:39.27Z" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffelib" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/33/c225eaf898634bdda489a6766fc35d1683c640bffe0e0acd10646b13536d/mkdocstrings_python-2.0.3.tar.gz", hash = "sha256:c518632751cc869439b31c9d3177678ad2bfa5c21b79b863956ad68fc92c13b8", size = 199083, upload-time = "2026-02-20T10:38:36.368Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl", hash = "sha256:0b83513478bdfd803ff05aa43e9b1fca9dd22bcd9471f09ca6257f009bc5ee12", size = 104779, upload-time = "2026-02-20T10:38:34.517Z" }, +] + [[package]] name = "mypy-extensions" version = "1.1.0" @@ -704,6 +888,15 @@ 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 = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + [[package]] name = "pathspec" version = "1.0.4" @@ -898,6 +1091,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pymdown-extensions" +version = "10.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/63/06673d1eb6d8f83c0ea1f677d770e12565fb516928b4109c9e2055656a9e/pymdown_extensions-10.21.tar.gz", hash = "sha256:39f4a020f40773f6b2ff31d2cd2546c2c04d0a6498c31d9c688d2be07e1767d5", size = 853363, upload-time = "2026-02-15T20:44:06.748Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/2c/5b079febdc65e1c3fb2729bf958d18b45be7113828528e8a0b5850dd819a/pymdown_extensions-10.21-py3-none-any.whl", hash = "sha256:91b879f9f864d49794c2d9534372b10150e6141096c3908a455e45ca72ad9d3f", size = 268877, upload-time = "2026-02-15T20:44:05.464Z" }, +] + [[package]] name = "pytest" version = "9.0.2" @@ -944,6 +1150,18 @@ 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 = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -1008,6 +1226,18 @@ wheels = [ { 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 = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -1060,6 +1290,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, ] +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + [[package]] name = "structlog" version = "25.5.0"