Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
c490147
pydantic 2 all tests passed
vladimirgubarik Aug 15, 2025
ccaf84a
fix poetry
vladimirgubarik Aug 15, 2025
01cd220
temp
vladimirgubarik Aug 18, 2025
1b56d81
add tests
vladimirgubarik Aug 18, 2025
e19cbf2
add tests, refactor
vladimirgubarik Aug 19, 2025
e1959f3
add fastapi openapi
vladimirgubarik Aug 19, 2025
d0d7dd9
add fastapi openapi
vladimirgubarik Aug 19, 2025
6d328c0
fix import
vladimirgubarik Aug 19, 2025
0759323
lints passed
vladimirgubarik Aug 19, 2025
fe17703
lints passed, fix some typos
vladimirgubarik Aug 19, 2025
79ede53
fix github actions
vladimirgubarik Aug 19, 2025
ff74315
fix github actions
vladimirgubarik Aug 19, 2025
910a2d6
fix github actions
vladimirgubarik Aug 19, 2025
998784c
fix lint
vladimirgubarik Aug 19, 2025
b306106
fix lint
vladimirgubarik Aug 19, 2025
ac959bb
fix lint
vladimirgubarik Aug 19, 2025
4fdb58e
fix lint
vladimirgubarik Aug 19, 2025
5502358
fix lint
vladimirgubarik Aug 19, 2025
3deac5d
fix lint
vladimirgubarik Aug 19, 2025
25c3ff6
fix lint
vladimirgubarik Aug 19, 2025
5cf6652
fix lint
vladimirgubarik Aug 19, 2025
e1f0516
fix lint
vladimirgubarik Aug 19, 2025
9ca6810
fix lint
vladimirgubarik Aug 19, 2025
ef0ff2d
fix lint
vladimirgubarik Aug 19, 2025
c98dd0d
add some docs
vladimirgubarik Aug 19, 2025
ed7e69c
add some docs
vladimirgubarik Aug 19, 2025
9df2367
add some docs
vladimirgubarik Aug 19, 2025
62de88e
coerage
vladimirgubarik Aug 19, 2025
85bd170
remove coverage
vladimirgubarik Aug 19, 2025
6dca24c
add extra handler arguments support
vladimirgubarik Aug 25, 2025
7eda911
fix lints
vladimirgubarik Aug 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions .github/workflows/actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@ jobs:

test:
name: Test
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
strategy:
matrix:
python-version: [ "3.8", "3.9", "3.10", "3.11" ]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13" ]

steps:
- name: Setup dependencies
uses: ExpressApp/github-actions-poetry@v0.3
uses: ExpressApp/github-actions-poetry@v0.4
with:
python-version: ${{ matrix.python-version }}
poetry-version: "1.3.2"
poetry-version: "2.1.4"

- name: Install dependencies with fastapi
run: poetry install --extras fastapi_utils

- name: Run tests
run: |
Expand All @@ -23,17 +26,20 @@ jobs:

lint:
name: Lint
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
strategy:
matrix:
python-version: [ "3.8", "3.9", "3.10", "3.11" ]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13" ]

steps:
- name: Setup dependencies
uses: ExpressApp/github-actions-poetry@v0.3
uses: ExpressApp/github-actions-poetry@v0.4
with:
python-version: ${{ matrix.python-version }}
poetry-version: "1.3.2"
poetry-version: "2.1.4"

- name: Install dependencies with fastapi
run: poetry install --extras fastapi_utils

- name: Run lint
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ on:
- "*.*.*"
jobs:
build:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
- name: Assert tag is from master
run: git branch -a --contains $(git describe --tags) | grep master
- name: Build and publish to pypi
uses: JRubics/poetry-publish@v1.8
uses: JRubics/poetry-publish@v2.1
with:
pypi_token: ${{ secrets.PYPI_TOKEN }}
86 changes: 24 additions & 62 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from pybotx_smartapp_rpc.new_openapi.refactored_utils.support_methods import get_rpc_flat_models_from_routes

# BotX-SmartApp-RPC
Библиотека, позволяющая писать смартаппы, используя [наш JSONRPC-like протокол](https://ccsteam.atlassian.net/wiki/spaces/EI/pages/193167368/SmartApp+RPC)

Expand Down Expand Up @@ -185,78 +187,38 @@ smartapp = SmartAppRPC(..., exception_handlers={KeyError: key_error_handler})
### Swagger documentation
Можно подключить rpc роутеры к авто генерируемой документации FastAPI и использовать
документацию в Swagger. Для этого необходимо переопределить функцию для генерации
OpenAPI схемы:
OpenAPI схемы.

Для этого необходимо:
1. Установить данную библиотеку с подключенной опцией
["fastapi_utils"]:
```
pybotx-smartapp-rpc = {version, extras = ["fastapi_utils"]}
```
2. При создании приложения подключить метод из библиотеки:
```python
from fastapi import FastAPI

from pybotx_smartapp_rpc.fastapi_utils.custom_openapi import rpc_openapi
from pybotx_smartapp_rpc.fastapi_utils.security import RPCAuth
application = FastAPI()
def get_custom_openapi():
return custom_openapi(
title="Smartapp API",
security = RPCAuth(
bot_id=bot_id_from_credentials
)

def get_custom_openapi():
return rpc_openapi(
title="Project Name",
version="0.1.0",
fastapi_routes=application.routes,
rpc_router=smartapp.router,
rpc_router=your_rpc_router,
openapi_version="3.0.2",
security=security
)

application.openapi = get_custom_openapi
```

Пример функции `custom_openapi`:
```python
from fastapi.encoders import jsonable_encoder
from fastapi.openapi.models import OpenAPI
from fastapi.openapi.utils import get_openapi
from pybotx_smartapp_rpc import RPCRouter
from pybotx_smartapp_rpc.openapi_utils import *
from pydantic.schema import get_model_name_map
from starlette.routing import BaseRoute


def custom_openapi(
*,
title: str,
version: str,
fastapi_routes: Sequence[BaseRoute],
rpc_router: RPCRouter,
**kwargs: Any,
) -> Dict[str, Any]:
openapi_dict = get_openapi(
title=title,
version=version,
routes=fastapi_routes,
**kwargs,
)

paths: Dict[str, Dict[str, Any]] = {}

flat_rpc_models = get_rpc_flat_models_from_routes(rpc_router)
rpc_model_name_map = get_model_name_map(flat_rpc_models)
rpc_definitions = get_rpc_model_definitions(
flat_models=flat_rpc_models, model_name_map=rpc_model_name_map
)

for method_name in rpc_router.rpc_methods.keys():
if not rpc_router.rpc_methods[method_name].include_in_schema:
continue
application.openapi = get_custom_openapi # type: ignore

path = get_rpc_openapi_path( # type: ignore
method_name=method_name,
route=rpc_router.rpc_methods[method_name],
model_name_map=rpc_model_name_map,
)
if path:
paths.setdefault(f"/{method_name}", {}).update(path)

if rpc_definitions:
openapi_dict.setdefault("components", {}).setdefault("schemas", {}).update(
{k: rpc_definitions[k] for k in sorted(rpc_definitions)}
)

openapi_dict.setdefault("paths", {}).update(paths)

return jsonable_encoder(OpenAPI(**openapi_dict), by_alias=True, exclude_none=True)
```

### Возможности RPC Swagger

* Можно добавлять теги к запросам, анaлогично FastAPI.
Expand Down
Loading
Loading