跳转到主要内容

访问启用Swagger-1.1的API的异步库

项目描述

关于

asyncswagger11是swagger.py的anyio兼容克隆,能够理解Swagger 1.1定义(仅限于此)。

由于swagger已更名为OpenAPI,现在已发布3.0版本(并且有一个实际的规范——与Swagger 1.1不同),因此该库(主要)仅适用于Asterisk,Asterisk仍然使用Swagger 1.1声明。

asyncswagger11支持WebSocket扩展,允许记录WebSocket,并自动生成WebSocket客户端代码。

来自swagger.py

Swagger.py是一个用于使用Swagger定义的API的Python库。

Swagger本身最好在Swagger主页上描述

Swagger是一个用于描述、生成、消费和可视化RESTful Web服务的规范和完整框架实现。

Swagger规范定义了如何使用Swagger描述API。

用法

从PyPI安装最新版本。

$ sudo pip install asyncswagger11

或使用setup.py脚本来从源安装。

$ sudo ./setup.py install

API

asyncswagger11将从启用Swagger的RESTful API动态构建一个对象模型。

以下是一个使用Asterisk REST接口的简单示例

#!/usr/bin/env python3

import json
import anyio

from asyncswagger11.client import SwaggerClient
from asyncswagger11.http_client import AsynchronousHttpClient

http_client = AsynchronousHttpClient()
http_client.set_api_key('localhost', 'hey:peekaboo')

async def run(ari,msg_json):
    channelId = msg_json['channel']['id']
    await ari.channels.answer(channelId=channelId)
    await ari.channels.play(channelId=channelId,
                    media='sound:hello-world')
    # In a real program you should wait for the PlaybackFinished event instead
    await anyio.sleep(3)
    await ari.channels.continueInDialplan(channelId=channelId)

async def main():
    ari = SwaggerClient(
        "http://localhost:8088/ari/api-docs/resources.json",
        http_client=http_client)

    ws = ari.events.eventWebsocket(app='hello')

    async for msg in ws:
        if not isinstance(msg, WebsocketDataMessage):
            break
        elif not isinstance(msg, WebsocketTextMessage):
            continue # ignore bytes

        msg_json = json.loads(msg.data)
        if msg_json['type'] == 'StasisStart':
            await nursery.start_soon(run,ari,msg_json)

if __name__ == "__main__":
    anyio.run(main)

数据模型

由swagger_model模块提供的数据模型几乎与原始Swagger API资源列表和API声明相同。这意味着如果您在文档中添加了额外的自定义元数据(例如_author_copyright字段),它们将携带到对象模型中。我建议在自定义字段前加上下划线,以避免与Swagger未来的版本冲突。

有一些有意义的区别。

  • 资源列表

  • 已添加 filebase_dir 字段,引用原始 .json 文件。

  • resource_listingapi 数组中的对象包含一个 api_declaration 字段,这是从引用的 API 文档中处理后的结果。

  • API 声明

  • 已添加 file 字段,引用原始 .json 文件。

开发

使用 Sphinx 对代码进行文档化,这使得 IntelliJ IDEA 在自动完成时可以更好地推断类型。

为了保持隔离,我还推荐安装(并使用)virtualenv

$ sudo pip install virtualenv
$ mkdir -p ~/virtualenv
$ virtualenv ~/virtualenv/swagger
$ . ~/virtualenv/swagger/bin/activate

Setuptools 用于构建。使用 Pytest 进行单元测试,并安装了 coverage 插件以生成代码覆盖率报告。通过传递 --with-coverage 生成代码覆盖率报告。报告的 HTML 版本放在 cover/index.html 中。

$ ./setup.py develop   # prep for development (install deps, launchers, etc.)
$ ./setup.py pytest    # run unit tests
$ ./setup.py bdist_egg # build distributable

测试

只需运行 python3 setup.py pytest

注意,目前无法单独测试此模块。以前的版本需要一个修改过的 httpretty 版本。

待办事项:使用本地服务器代替。

许可协议

版权所有(c)2013,Digium,Inc. 版权所有(c)2018,Matthias Urlichs

asyncswagger11 采用 BSD 3-Clause License 许可。

当前作者谦逊地请求您分享任何对此代码的进一步错误修复或改进。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

asyncswagger11-0.12.4.tar.gz (27.1 kB 查看散列)

上传时间

构建分发

asyncswagger11-0.12.4-py3-none-any.whl (15.9 kB 查看散列)

上传时间 Python 3

支持者