From 89db0bb24deb9d466979d7a2948eb4aac16652ed Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Wed, 22 Apr 2020 23:58:06 +0200 Subject: [PATCH] What is my purpose? --- .env-example | 4 + .gitignore | 12 + Dockerfile.dev | 20 + Makefile | 17 + README.md | 86 +++ assets/icon.png | Bin 0 -> 134565 bytes assets/icon@120.png | Bin 0 -> 24200 bytes butterrobot/__init__.py | 0 butterrobot/__main__.py | 6 + butterrobot/app.py | 60 ++ butterrobot/config.py | 27 + butterrobot/lib/__init__.py | 0 butterrobot/lib/slack.py | 39 + butterrobot/lib/telegram.py | 59 ++ butterrobot/logging.py | 23 + butterrobot/objects.py | 13 + butterrobot/platforms/__init__.py | 5 + butterrobot/platforms/base.py | 35 + butterrobot/platforms/slack.py | 70 ++ butterrobot/platforms/telegram.py | 66 ++ butterrobot/plugins.py | 37 + butterrobot_plugins_contrib/__init__.py | 0 butterrobot_plugins_contrib/dev.py | 17 + butterrobot_plugins_contrib/fun.py | 11 + docker/Dockerfile | 14 + docker/bin/start-server.sh | 3 + poetry.lock | 932 ++++++++++++++++++++++++ pyproject.toml | 35 + setup.cfg | 16 + 29 files changed, 1607 insertions(+) create mode 100644 .env-example create mode 100644 .gitignore create mode 100644 Dockerfile.dev create mode 100644 Makefile create mode 100644 README.md create mode 100644 assets/icon.png create mode 100644 assets/icon@120.png create mode 100644 butterrobot/__init__.py create mode 100644 butterrobot/__main__.py create mode 100644 butterrobot/app.py create mode 100644 butterrobot/config.py create mode 100644 butterrobot/lib/__init__.py create mode 100644 butterrobot/lib/slack.py create mode 100644 butterrobot/lib/telegram.py create mode 100644 butterrobot/logging.py create mode 100644 butterrobot/objects.py create mode 100644 butterrobot/platforms/__init__.py create mode 100644 butterrobot/platforms/base.py create mode 100644 butterrobot/platforms/slack.py create mode 100644 butterrobot/platforms/telegram.py create mode 100644 butterrobot/plugins.py create mode 100644 butterrobot_plugins_contrib/__init__.py create mode 100644 butterrobot_plugins_contrib/dev.py create mode 100644 butterrobot_plugins_contrib/fun.py create mode 100644 docker/Dockerfile create mode 100755 docker/bin/start-server.sh create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 setup.cfg diff --git a/.env-example b/.env-example new file mode 100644 index 0000000..3da2865 --- /dev/null +++ b/.env-example @@ -0,0 +1,4 @@ +# For information about this variables check config.py + +SLACK_TOKEN=xxx +TELEGRAM_TOKEN=xxx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6054505 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.py[c|o] +__pycache__ +.vscode +*~ +*.cert +.env-local +test.py + +# Distribution +dist +*.egg-info +pip-wheel-metadata diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..f8063df --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,20 @@ +FROM alpine:3.11 + +ENV PYTHON_VERSION=3.8.2-r0 +ENV APP_PORT 8080 +ENV BUILD_DIR /tmp/build +ENV BUTTERROBOT_VERSION 0.0.1 + +WORKDIR ${BUILD_DIR} +COPY poetry.lock ${BUILD_DIR}/poetry.lock +COPY pyproject.toml ${BUILD_DIR}/pyproject.toml +COPY ./butterrobot ${BUILD_DIR}/butterrobot +COPY ./butterrobot_plugins_contrib ${BUILD_DIR}/butterrobot_plugins_contrib +RUN apk --update add python3-dev==${PYTHON_VERSION} gcc musl-dev libffi-dev openssl-dev && \ + pip3 install poetry && \ + poetry build && \ + pip3 install ${BUILD_DIR}/dist/butterrobot-${BUTTERROBOT_VERSION}.tar.gz && \ + rm -rf ${BUILD_DIR} +COPY ./docker/bin/start-server.sh /usr/local/bin/start-server + +CMD ["/usr/local/bin/start-server"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f6148b4 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +# Local development +setup: + poetry install + +docker@build: + docker build -t fmartingr/butterrobot . + +podman@build: + podman build -t fmartingr/butterrobot . + +docker@save: + make docker@build + docker image save fmartingr/butterrobot -o fmartingr-butterrobot-docker-image.tar + +clean: + rm -rf dist + rm -rf butterrobot.egg-info diff --git a/README.md b/README.md new file mode 100644 index 0000000..465e7df --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# Butter Robot + +[![Docker Repository on Quay](https://quay.io/repository/fmartingr/butterrobot/status "Docker Repository on Quay")](https://quay.io/repository/fmartingr/butterrobot) + +Python framework to create bots for several platforms. + +![Butter Robot](./assets/icon@120.png) + +> What is my purpose? + +## Supported platforms + +| Name | Receive messages | Send messages | +| --------------- | ---------------- | ------------- | +| Slack (app) | Yes | Yes | +| Slack (webhook) | Planned | No[^1] | +| Telegram | Yes | Yes | + +[^1]: Slack webhooks only supports answering to incoming event, not + sending messages on demand. + +## Provided plugins + +### Butter robot + +- [ ] Help +- [ ] Usage +- [ ] Changelog + +### Development + +- [x] Ping + +### Fun and entertainment + +- [ ] Dice roll +- [x] Loquito + +## Installation + +### PyPi + +You can run it directly by installing the package and calling it +with `python` though this is not recommended and only intended for +development purposes. + +``` +$ pip install --user butterrobot +$ python -m butterrobot +``` + +### Containers + +The `fmartingr/butterrobot` container image is published on quay.io to +use with your favourite tool: + +``` +podman run -d --name butterrobot -p 8080:8080 quay.io/fmartingr/butterrobot +``` + +## Contributing + +To run the project locally you will need [poetry](https://python-poetry.org/). + +``` +git clone git@github.com:fmartingr/butterrobot.git +cd butterrobot +poetry install +``` + +Create a `.env-local` file with the required environment variables, +you have [an example file](.env-example). + +``` +SLACK_TOKEN=xxx +TELEGRAM_TOKEN=xxx +... +``` + +And then you can run it directly with poetry + +TODO: Autoload .env-local + +``` +docker run -it --rm --env-file .env-local -p 5000:5000 -v $PWD/butterrobot:/etc/app/butterrobot local/butterrobot python -m butterrobot +``` diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9ce6015d48f7d9d4d7fdf4aa1f25092a7d282e GIT binary patch literal 134565 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±is%&~5(~1}sc_xS_t$+8XaRzAhdP)qv;T*JeYm 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 N002ovPDHLkV1jf+j9CBx literal 0 HcmV?d00001 diff --git a/assets/icon@120.png b/assets/icon@120.png new file mode 100644 index 0000000000000000000000000000000000000000..96e866e52ccc517c77dc2c8eac674a9ef1556ab0 GIT binary patch literal 24200 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/incoming", methods=["POST"]) +@app.route("//incoming/", methods=["POST"]) +async def incoming_platform_message_view(platform, path=None): + if platform not in available_platforms: + return {"error": "Unknown platform"}, 400 + + try: + message = await available_platforms[platform].parse_incoming_message(request=request) + except Platform.PlatformAuthResponse as response: + return response.data, response.status_code + except Exception as error: + logger.error(f"Error parsing message", platform=platform, error=error, traceback=traceback.format_exc()) + return {"error": str(error)}, 400 + + if not message: + return {} + + for plugin in enabled_plugins: + if result := await plugin.on_message(message): + await available_platforms[platform].methods.send_message(result) + + return {} + + +@app.route("/healthz") +def healthz(): + return {} diff --git a/butterrobot/config.py b/butterrobot/config.py new file mode 100644 index 0000000..cf428ed --- /dev/null +++ b/butterrobot/config.py @@ -0,0 +1,27 @@ +import os + +# --- Butter Robot ----------------------------------------------------------------- +DEBUG = os.environ.get("DEBUG", "n") == "y" + +HOSTNAME = os.environ.get("BUTTERROBOT_HOSTNAME", "butterrobot-dev.int.fmartingr.network") + +LOG_LEVEL = os.environ.get("LOG_LEVEL", "ERROR") + +ENABLED_PLUGINS = os.environ.get("ENABLED_PLUGINS", "contrib/dev/ping").split(",") + + +# --- PLATFORMS --------------------------------------------------------------------- +# --- +# Slack +# --- +# Slack app access token +SLACK_TOKEN = os.environ.get("SLACK_TOKEN") + +# Slack app oauth access token to send messages on the bot behalf +SLACK_BOT_OAUTH_ACCESS_TOKEN = os.environ.get("SLACK_BOT_OAUTH_ACCESS_TOKEN") + +# --- +# Telegram +# --- +# Telegram auth token +TELEGRAM_TOKEN = os.environ.get("TELEGRAM_TOKEN") diff --git a/butterrobot/lib/__init__.py b/butterrobot/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/butterrobot/lib/slack.py b/butterrobot/lib/slack.py new file mode 100644 index 0000000..f6fd875 --- /dev/null +++ b/butterrobot/lib/slack.py @@ -0,0 +1,39 @@ +from typing import Optional, Text + +import aiohttp +import structlog + +from butterrobot.config import SLACK_BOT_OAUTH_ACCESS_TOKEN + + +logger = structlog.get_logger() + + +class SlackAPI: + BASE_URL = "https://slack.com/api" + + class SlackError(Exception): + pass + + class SlackClientError(Exception): + pass + + @classmethod + async def send_message(cls, platform, message, thread: Optional[Text] = None): + payload = { + "text": message, + "platform": platform, + } + + if thread: + payload["thread_ts"] = thread + + async with aiohttp.ClientSession() as session: + async with session.post( + f"{cls.BASE_URL}/chat.postMessage", + data=payload, + headers={"Authorization": f"Bearer {SLACK_BOT_OAUTH_ACCESS_TOKEN}"}, + ) as response: + response = await response.json() + if not response["ok"]: + raise cls.SlackClientError(response) diff --git a/butterrobot/lib/telegram.py b/butterrobot/lib/telegram.py new file mode 100644 index 0000000..cd082b9 --- /dev/null +++ b/butterrobot/lib/telegram.py @@ -0,0 +1,59 @@ +import aiohttp +import structlog + +from butterrobot.config import TELEGRAM_TOKEN + + +logger = structlog.get_logger(__name__) + + +class TelegramAPI: + BASE_URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}" + + DEFAULT_ALLOWED_UPDATES = ["message"] + + class TelegramError(Exception): + pass + + class TelegramClientError(Exception): + pass + + @classmethod + async def set_webhook(cls, webhook_url, max_connections=40, allowed_updates=None): + allowed_updates = allowed_updates or cls.DEFAULT_ALLOWED_UPDATES + url = f"{cls.BASE_URL}/setWebhook" + payload = { + "url": webhook_url, + "max_connections": max_connections, + "allowed_updates": allowed_updates, + } + async with aiohttp.ClientSession() as session: + async with session.post(url, json=payload) as response: + response = await response.json() + if not response["ok"]: + raise cls.TelegramClientError + + @classmethod + async def send_message( + cls, + chat_id, + text, + parse_mode="markdown", + disable_web_page_preview=False, + disable_notification=False, + reply_to_message_id=None, + ): + url = f"{cls.BASE_URL}/sendMessage" + payload = { + "chat_id": chat_id, + "text": text, + "parse_mode": parse_mode, + "disable_web_page_preview": disable_web_page_preview, + "disable_notification": disable_notification, + "reply_to_message_id": reply_to_message_id, + } + async with aiohttp.ClientSession() as session: + async with session.post(url, json=payload) as response: + response = await response.json() + if not response["ok"]: + raise cls.TelegramClientError(response) diff --git a/butterrobot/logging.py b/butterrobot/logging.py new file mode 100644 index 0000000..4b30bd4 --- /dev/null +++ b/butterrobot/logging.py @@ -0,0 +1,23 @@ +import logging + +import structlog + +from butterrobot.config import LOG_LEVEL, DEBUG + + +logging.basicConfig(format="%(message)s", level=LOG_LEVEL) +structlog.configure( + processors=[ + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog.dev.set_exc_info, + structlog.processors.StackInfoRenderer(), + structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M.%S"), + structlog.processors.format_exc_info, + structlog.dev.ConsoleRenderer() if DEBUG else structlog.processors.JSONRenderer(), + ], + context_class=dict, + logger_factory=structlog.stdlib.LoggerFactory(), + wrapper_class=structlog.BoundLogger, + cache_logger_on_first_use=True, +) diff --git a/butterrobot/objects.py b/butterrobot/objects.py new file mode 100644 index 0000000..0c734ee --- /dev/null +++ b/butterrobot/objects.py @@ -0,0 +1,13 @@ +from datetime import datetime +from dataclasses import dataclass, field +from typing import Text, Optional + + +@dataclass +class Message: + text: Text + chat: Text + date: Optional[datetime] = None + id: Optional[Text] = None + reply_to: Optional[Text] = None + raw: dict = field(default_factory=dict) diff --git a/butterrobot/platforms/__init__.py b/butterrobot/platforms/__init__.py new file mode 100644 index 0000000..ff08cef --- /dev/null +++ b/butterrobot/platforms/__init__.py @@ -0,0 +1,5 @@ +from butterrobot.platforms.slack import SlackPlatform +from butterrobot.platforms.telegram import TelegramPlatform + + +PLATFORMS = {platform.ID: platform for platform in (SlackPlatform, TelegramPlatform,)} diff --git a/butterrobot/platforms/base.py b/butterrobot/platforms/base.py new file mode 100644 index 0000000..8fa2198 --- /dev/null +++ b/butterrobot/platforms/base.py @@ -0,0 +1,35 @@ +from abc import abstractclassmethod +from dataclasses import dataclass + + +class Platform: + class PlatformError(Exception): + pass + + class PlatformInitError(PlatformError): + pass + + class PlatformAuthError(PlatformError): + pass + + @dataclass + class PlatformAuthResponse(PlatformError): + """ + Used when the platform needs to make a response right away instead of async. + """ + data: dict + status_code: int = 200 + + @classmethod + async def init(cls, app): + pass + + +class PlatformMethods: + @abstractclassmethod + def send_message(cls, message): + pass + + @abstractclassmethod + def reply_message(cls, message, reply_to): + pass diff --git a/butterrobot/platforms/slack.py b/butterrobot/platforms/slack.py new file mode 100644 index 0000000..36f88fb --- /dev/null +++ b/butterrobot/platforms/slack.py @@ -0,0 +1,70 @@ +from datetime import datetime + +import structlog + +from butterrobot.platforms.base import Platform, PlatformMethods +from butterrobot.config import SLACK_TOKEN, SLACK_BOT_OAUTH_ACCESS_TOKEN +from butterrobot.objects import Message +from butterrobot.lib.slack import SlackAPI + + +logger = structlog.get_logger(__name__) + + +class SlackMethods(PlatformMethods): + @classmethod + async def send_message(self, message: Message): + logger.debug( + "Outgoing message", message=message.__dict__, platform=SlackPlatform.ID + ) + try: + await SlackAPI.send_message( + platform=message.chat, message=message.text, thread=message.reply_to + ) + except SlackAPI.SlackClientError as error: + logger.error( + "Send message error", + platform=SlackPlatform.ID, + error=error, + message=message.__dict__, + ) + + +class SlackPlatform(Platform): + ID = "slack" + + methods = SlackMethods + + @classmethod + async def init(cls, app): + if not (SLACK_TOKEN and SLACK_BOT_OAUTH_ACCESS_TOKEN): + logger.error("Missing token. platform not enabled.", platform=cls.ID) + return + + @classmethod + async def parse_incoming_message(cls, request): + data = await request.get_json() + logger.debug("Parsing message", platform=cls.ID, data=data) + + # Auth + if data.get("token") != SLACK_TOKEN: + raise cls.PlatformAuthError("Authentication error") + + # Confirms challenge request to configure webhook + if "challenge" in data: + raise cls.PlatformAuthResponse(data={"challenge": data["challenge"]}) + + # Discard messages by bots + if "bot_id" in data["event"]: + return + + if data["event"]["type"] != "message": + return + + return Message( + id=data["event"].get("thread_ts", data["event"]["ts"]), + date=datetime.fromtimestamp(int(float(data["event"]["event_ts"]))), + text=data["event"]["text"], + chat=data["event"]["platform"], + raw=data, + ) diff --git a/butterrobot/platforms/telegram.py b/butterrobot/platforms/telegram.py new file mode 100644 index 0000000..7506861 --- /dev/null +++ b/butterrobot/platforms/telegram.py @@ -0,0 +1,66 @@ +from datetime import datetime + +import structlog + +from butterrobot.platforms.base import Platform, PlatformMethods +from butterrobot.config import TELEGRAM_TOKEN, HOSTNAME +from butterrobot.lib.telegram import TelegramAPI +from butterrobot.objects import Message + + +logger = structlog.get_logger(__name__) + + +class TelegramMethods(PlatformMethods): + @classmethod + async def send_message(self, message: Message): + logger.debug( + "Outgoing message", message=message.__dict__, platform=TelegramPlatform.ID + ) + await TelegramAPI.send_message( + chat_id=message.chat, + text=message.text, + reply_to_message_id=message.reply_to, + ) + + +class TelegramPlatform(Platform): + ID = "telegram" + + methods = TelegramMethods + + @classmethod + async def init(cls, app): + """ + Initializes the Telegram webhook endpoint to receive updates + """ + + if not TELEGRAM_TOKEN: + logger.error("Missing token. platform not enabled.", platform=cls.ID) + return + + webhook_url = f"https://{HOSTNAME}/telegram/incoming/{TELEGRAM_TOKEN}" + try: + await TelegramAPI.set_webhook(webhook_url) + except TelegramAPI.TelegramError as error: + logger.error(f"Error setting Telegram webhook: {error}", platform=cls.ID) + raise Platform.PlatformInitError() + + @classmethod + async def parse_incoming_message(cls, request): + token = request.path.split("/")[-1] + if token != TELEGRAM_TOKEN: + raise cls.PlatformAuthError("Authentication error") + + request_data = await request.get_json() + logger.debug("Parsing message", data=request_data, platform=cls.ID) + + if "text" in request_data["message"]: + # Ignore all messages but text messages + return Message( + id=request_data["message"]["message_id"], + date=datetime.fromtimestamp(request_data["message"]["date"]), + text=str(request_data["message"]["text"]), + chat=str(request_data["message"]["chat"]["id"]), + raw=request_data, + ) diff --git a/butterrobot/plugins.py b/butterrobot/plugins.py new file mode 100644 index 0000000..b9dc5a0 --- /dev/null +++ b/butterrobot/plugins.py @@ -0,0 +1,37 @@ +import traceback +import pkg_resources +from abc import abstractclassmethod + +import structlog + + +logger = structlog.get_logger(__name__) + + +class Plugin: + @abstractclassmethod + def on_message(cls, message): + pass + + +def get_available_plugins(): + """Retrieves every available plugin""" + plugins = {} + logger.debug("Loading plugins") + for ep in pkg_resources.iter_entry_points("butterrobot.plugins"): + try: + plugin_cls = ep.load() + plugins[plugin_cls.id] = plugin_cls + except Exception as error: + logger.error( + "Error loading plugin", + exception=str(error), + traceback=traceback.format_exc(), + plugin=ep.name, + project_name=ep.dist.project_name, + entry_point=ep, + module=ep.module_name, + ) + + logger.info(f"Plugins loaded", plugins=list(plugins.keys())) + return plugins diff --git a/butterrobot_plugins_contrib/__init__.py b/butterrobot_plugins_contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/butterrobot_plugins_contrib/dev.py b/butterrobot_plugins_contrib/dev.py new file mode 100644 index 0000000..18b9a8c --- /dev/null +++ b/butterrobot_plugins_contrib/dev.py @@ -0,0 +1,17 @@ +from datetime import datetime + +from butterrobot.plugins import Plugin +from butterrobot.objects import Message + + +class PingPlugin(Plugin): + id = "contrib/dev/ping" + + @classmethod + async def on_message(cls, message): + if message.text == "!ping": + delta = datetime.now() - message.date + delta_ms = delta.seconds * 1000 + delta.microseconds / 1000 + return Message( + chat=message.chat, reply_to=message.id, text=f"pong! ({delta_ms}ms)", + ) diff --git a/butterrobot_plugins_contrib/fun.py b/butterrobot_plugins_contrib/fun.py new file mode 100644 index 0000000..78b4755 --- /dev/null +++ b/butterrobot_plugins_contrib/fun.py @@ -0,0 +1,11 @@ +from butterrobot.plugins import Plugin +from butterrobot.objects import Message + + +class LoquitoPlugin(Plugin): + id = "contrib/fun/loquito" + + @classmethod + async def on_message(cls, message): + if "lo quito" in message.text.lower(): + return Message(chat=message.chat, reply_to=message.id, text="Loquito tu.",) diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..070cc5c --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,14 @@ +FROM alpine:3.11 + +ENV PYTHON_VERSION=3.8.2-r0 +ENV APP_PORT 8080 +ENV BUTTERROBOT_VERSION 0.0.2 +ENV EXTRA_DEPENDENCIES "" + +COPY bin/start-server.sh /usr/local/bin/start-server +RUN apk --update add python3-dev==${PYTHON_VERSION} gcc musl-dev libffi-dev openssl-dev && \ + pip3 install butterrobot==${BUTTERROBOT_VERSION} ${EXTRA_DEPENDENCIES} + +USER 1000 + +CMD ["/usr/local/bin/start-server"] diff --git a/docker/bin/start-server.sh b/docker/bin/start-server.sh new file mode 100755 index 0000000..d6be1ca --- /dev/null +++ b/docker/bin/start-server.sh @@ -0,0 +1,3 @@ +#!/bin/sh -xe + +hypercorn butterrobot.app -b "0.0.0.0:${APP_PORT}" diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..07adda5 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,932 @@ +[[package]] +category = "main" +description = "File support for asyncio." +name = "aiofiles" +optional = false +python-versions = "*" +version = "0.5.0" + +[[package]] +category = "main" +description = "Async http client/server framework (asyncio)" +name = "aiohttp" +optional = false +python-versions = ">=3.5.3" +version = "3.6.2" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<4.0" +multidict = ">=4.5,<5.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +category = "dev" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +name = "appdirs" +optional = false +python-versions = "*" +version = "1.4.3" + +[[package]] +category = "dev" +description = "Disable App Nap on OS X 10.9" +marker = "python_version >= \"3.4\" and sys_platform == \"darwin\"" +name = "appnope" +optional = false +python-versions = "*" +version = "0.1.0" + +[[package]] +category = "main" +description = "Timeout context manager for asyncio programs" +name = "async-timeout" +optional = false +python-versions = ">=3.5.3" +version = "3.0.1" + +[[package]] +category = "main" +description = "Classes Without Boilerplate" +name = "attrs" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "19.3.0" + +[package.extras] +azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] +dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] +docs = ["sphinx", "zope.interface"] +tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] + +[[package]] +category = "dev" +description = "Specifications for callback functions passed in to an API" +marker = "python_version >= \"3.4\"" +name = "backcall" +optional = false +python-versions = "*" +version = "0.1.0" + +[[package]] +category = "dev" +description = "The uncompromising code formatter." +name = "black" +optional = false +python-versions = ">=3.6" +version = "19.10b0" + +[package.dependencies] +appdirs = "*" +attrs = ">=18.1.0" +click = ">=6.5" +pathspec = ">=0.6,<1" +regex = "*" +toml = ">=0.9.4" +typed-ast = ">=1.4.0" + +[package.extras] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +category = "main" +description = "Fast, simple object-to-object and broadcast signaling" +name = "blinker" +optional = false +python-versions = "*" +version = "1.4" + +[[package]] +category = "main" +description = "Universal encoding detector for Python 2 and 3" +name = "chardet" +optional = false +python-versions = "*" +version = "3.0.4" + +[[package]] +category = "main" +description = "Composable command line interface toolkit" +name = "click" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "7.1.1" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.3" + +[[package]] +category = "dev" +description = "Decorators for Humans" +marker = "python_version >= \"3.4\"" +name = "decorator" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.4.2" + +[[package]] +category = "dev" +description = "Discover and load entry points from installed packages." +name = "entrypoints" +optional = false +python-versions = ">=2.7" +version = "0.3" + +[[package]] +category = "dev" +description = "the modular source code checker: pep8, pyflakes and co" +name = "flake8" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.7.9" + +[package.dependencies] +entrypoints = ">=0.3.0,<0.4.0" +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.5.0,<2.6.0" +pyflakes = ">=2.1.0,<2.2.0" + +[[package]] +category = "main" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +name = "h11" +optional = false +python-versions = "*" +version = "0.9.0" + +[[package]] +category = "main" +description = "HTTP/2 State-Machine based protocol implementation" +name = "h2" +optional = false +python-versions = "*" +version = "3.2.0" + +[package.dependencies] +hpack = ">=3.0,<4" +hyperframe = ">=5.2.0,<6" + +[[package]] +category = "main" +description = "Pure-Python HPACK header compression" +name = "hpack" +optional = false +python-versions = "*" +version = "3.0.0" + +[[package]] +category = "main" +description = "A ASGI Server based on Hyper libraries and inspired by Gunicorn." +name = "hypercorn" +optional = false +python-versions = ">=3.7" +version = "0.9.5" + +[package.dependencies] +h11 = "*" +h2 = ">=3.1.0" +priority = "*" +toml = "*" +typing-extensions = "*" +wsproto = ">=0.14.0" + +[package.extras] +h3 = ["aioquic (>=0.8.1,<1.0)"] +tests = ["asynctest", "hypothesis", "pytest", "pytest-asyncio", "pytest-cov", "pytest-trio", "trio"] +trio = ["trio (>=0.11.0)"] +uvloop = ["uvloop"] + +[[package]] +category = "main" +description = "HTTP/2 framing layer for Python" +name = "hyperframe" +optional = false +python-versions = "*" +version = "5.2.0" + +[[package]] +category = "main" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.9" + +[[package]] +category = "dev" +description = "IPython-enabled pdb" +name = "ipdb" +optional = false +python-versions = ">=2.7" +version = "0.13.2" + +[package.dependencies] +setuptools = "*" + +[package.dependencies.ipython] +python = ">=3.4" +version = ">=5.1.0" + +[[package]] +category = "dev" +description = "IPython: Productive Interactive Computing" +marker = "python_version >= \"3.4\"" +name = "ipython" +optional = false +python-versions = ">=3.6" +version = "7.13.0" + +[package.dependencies] +appnope = "*" +backcall = "*" +colorama = "*" +decorator = "*" +jedi = ">=0.10" +pexpect = "*" +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + +[package.extras] +all = ["numpy (>=1.14)", "testpath", "notebook", "nose (>=0.10.1)", "nbconvert", "requests", "ipywidgets", "qtconsole", "ipyparallel", "Sphinx (>=1.3)", "pygments", "nbformat", "ipykernel"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] + +[[package]] +category = "dev" +description = "Vestigial utilities from IPython" +marker = "python_version >= \"3.4\"" +name = "ipython-genutils" +optional = false +python-versions = "*" +version = "0.2.0" + +[[package]] +category = "dev" +description = "A Python utility / library to sort Python imports." +name = "isort" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "4.3.21" + +[package.extras] +pipfile = ["pipreqs", "requirementslib"] +pyproject = ["toml"] +requirements = ["pipreqs", "pip-api"] +xdg_home = ["appdirs (>=1.4.0)"] + +[[package]] +category = "main" +description = "Various helpers to pass data to untrusted environments and back." +name = "itsdangerous" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.1.0" + +[[package]] +category = "dev" +description = "An autocompletion tool for Python that can be used for text editors." +marker = "python_version >= \"3.4\"" +name = "jedi" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.17.0" + +[package.dependencies] +parso = ">=0.7.0" + +[package.extras] +qa = ["flake8 (3.7.9)"] +testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] + +[[package]] +category = "main" +description = "A very fast and expressive template engine." +name = "jinja2" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.11.2" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +category = "main" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "1.1.1" + +[[package]] +category = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" +optional = false +python-versions = "*" +version = "0.6.1" + +[[package]] +category = "main" +description = "multidict implementation" +name = "multidict" +optional = false +python-versions = ">=3.5" +version = "4.7.5" + +[[package]] +category = "dev" +description = "A Python Parser" +marker = "python_version >= \"3.4\"" +name = "parso" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.7.0" + +[package.extras] +testing = ["docopt", "pytest (>=3.0.7)"] + +[[package]] +category = "dev" +description = "Utility library for gitignore style pattern matching of file paths." +name = "pathspec" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.8.0" + +[[package]] +category = "dev" +description = "Pexpect allows easy control of interactive console applications." +marker = "python_version >= \"3.4\" and sys_platform != \"win32\"" +name = "pexpect" +optional = false +python-versions = "*" +version = "4.8.0" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +category = "dev" +description = "Tiny 'shelve'-like database with concurrency support" +marker = "python_version >= \"3.4\"" +name = "pickleshare" +optional = false +python-versions = "*" +version = "0.7.5" + +[[package]] +category = "main" +description = "A pure-Python implementation of the HTTP/2 priority tree" +name = "priority" +optional = false +python-versions = "*" +version = "1.3.0" + +[[package]] +category = "dev" +description = "Library for building powerful interactive command lines in Python" +marker = "python_version >= \"3.4\"" +name = "prompt-toolkit" +optional = false +python-versions = ">=3.6.1" +version = "3.0.5" + +[package.dependencies] +wcwidth = "*" + +[[package]] +category = "dev" +description = "Run a subprocess in a pseudo terminal" +marker = "python_version >= \"3.4\" and sys_platform != \"win32\"" +name = "ptyprocess" +optional = false +python-versions = "*" +version = "0.6.0" + +[[package]] +category = "dev" +description = "Python style guide checker" +name = "pycodestyle" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.5.0" + +[[package]] +category = "dev" +description = "passive checker of Python programs" +name = "pyflakes" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.1.1" + +[[package]] +category = "dev" +description = "Pygments is a syntax highlighting package written in Python." +marker = "python_version >= \"3.4\"" +name = "pygments" +optional = false +python-versions = ">=3.5" +version = "2.6.1" + +[[package]] +category = "main" +description = "A Python ASGI web microframework with the same API as Flask" +name = "quart" +optional = false +python-versions = ">=3.7.0" +version = "0.11.5" + +[package.dependencies] +aiofiles = "*" +blinker = "*" +click = "*" +hypercorn = ">=0.7.0" +itsdangerous = "*" +jinja2 = "*" +toml = "*" +werkzeug = ">=1.0.0" + +[package.extras] +dotenv = ["python-dotenv"] + +[[package]] +category = "dev" +description = "Alternative regular expression module, to replace re." +name = "regex" +optional = false +python-versions = "*" +version = "2020.4.4" + +[[package]] +category = "dev" +description = "a python refactoring library..." +name = "rope" +optional = false +python-versions = "*" +version = "0.16.0" + +[package.extras] +dev = ["pytest"] + +[[package]] +category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.14.0" + +[[package]] +category = "main" +description = "Structured Logging for Python" +name = "structlog" +optional = false +python-versions = "*" +version = "20.1.0" + +[package.dependencies] +six = "*" + +[package.extras] +azure-pipelines = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest (>=3.3.0)", "simplejson", "pytest-azurepipelines", "python-rapidjson", "pytest-asyncio"] +dev = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest (>=3.3.0)", "simplejson", "sphinx", "twisted", "pre-commit", "python-rapidjson", "pytest-asyncio"] +docs = ["sphinx", "twisted"] +tests = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest (>=3.3.0)", "simplejson", "python-rapidjson", "pytest-asyncio"] + +[[package]] +category = "main" +description = "Python Library for Tom's Obvious, Minimal Language" +name = "toml" +optional = false +python-versions = "*" +version = "0.10.0" + +[[package]] +category = "dev" +description = "Traitlets Python config system" +marker = "python_version >= \"3.4\"" +name = "traitlets" +optional = false +python-versions = "*" +version = "4.3.3" + +[package.dependencies] +decorator = "*" +ipython-genutils = "*" +six = "*" + +[package.extras] +test = ["pytest", "mock"] + +[[package]] +category = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typed-ast" +optional = false +python-versions = "*" +version = "1.4.1" + +[[package]] +category = "main" +description = "Backported and Experimental Type Hints for Python 3.5+" +name = "typing-extensions" +optional = false +python-versions = "*" +version = "3.7.4.2" + +[[package]] +category = "dev" +description = "Measures number of Terminal column cells of wide-character codes" +marker = "python_version >= \"3.4\"" +name = "wcwidth" +optional = false +python-versions = "*" +version = "0.1.9" + +[[package]] +category = "main" +description = "The comprehensive WSGI web application library." +name = "werkzeug" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "1.0.1" + +[package.extras] +dev = ["pytest", "pytest-timeout", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"] +watchdog = ["watchdog"] + +[[package]] +category = "main" +description = "WebSockets state-machine based protocol implementation" +name = "wsproto" +optional = false +python-versions = ">=3.6.1" +version = "0.15.0" + +[package.dependencies] +h11 = ">=0.8.1" + +[[package]] +category = "main" +description = "Yet another URL library" +name = "yarl" +optional = false +python-versions = ">=3.5" +version = "1.4.2" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +content-hash = "ceba58ecf5ec2b4dd95cc58ca7122659610ad89052f420d2e9f22223aff38dd4" +python-versions = "^3.7" + +[metadata.files] +aiofiles = [ + {file = "aiofiles-0.5.0-py3-none-any.whl", hash = "sha256:377fdf7815cc611870c59cbd07b68b180841d2a2b79812d8c218be02448c2acb"}, + {file = "aiofiles-0.5.0.tar.gz", hash = "sha256:98e6bcfd1b50f97db4980e182ddd509b7cc35909e903a8fe50d8849e02d815af"}, +] +aiohttp = [ + {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, + {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, + {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, + {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, + {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, + {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, + {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, + {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, + {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, + {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, + {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, + {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, +] +appdirs = [ + {file = "appdirs-1.4.3-py2.py3-none-any.whl", hash = "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"}, + {file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"}, +] +appnope = [ + {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, + {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, +] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] +attrs = [ + {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, + {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, +] +backcall = [ + {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, + {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, +] +black = [ + {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, + {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, +] +blinker = [ + {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, +] +chardet = [ + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +] +click = [ + {file = "click-7.1.1-py2.py3-none-any.whl", hash = "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"}, + {file = "click-7.1.1.tar.gz", hash = "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc"}, +] +colorama = [ + {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, + {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, +] +decorator = [ + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +flake8 = [ + {file = "flake8-3.7.9-py2.py3-none-any.whl", hash = "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca"}, + {file = "flake8-3.7.9.tar.gz", hash = "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb"}, +] +h11 = [ + {file = "h11-0.9.0-py2.py3-none-any.whl", hash = "sha256:4bc6d6a1238b7615b266ada57e0618568066f57dd6fa967d1290ec9309b2f2f1"}, + {file = "h11-0.9.0.tar.gz", hash = "sha256:33d4bca7be0fa039f4e84d50ab00531047e53d6ee8ffbc83501ea602c169cae1"}, +] +h2 = [ + {file = "h2-3.2.0-py2.py3-none-any.whl", hash = "sha256:61e0f6601fa709f35cdb730863b4e5ec7ad449792add80d1410d4174ed139af5"}, + {file = "h2-3.2.0.tar.gz", hash = "sha256:875f41ebd6f2c44781259005b157faed1a5031df3ae5aa7bcb4628a6c0782f14"}, +] +hpack = [ + {file = "hpack-3.0.0-py2.py3-none-any.whl", hash = "sha256:0edd79eda27a53ba5be2dfabf3b15780928a0dff6eb0c60a3d6767720e970c89"}, + {file = "hpack-3.0.0.tar.gz", hash = "sha256:8eec9c1f4bfae3408a3f30500261f7e6a65912dc138526ea054f9ad98892e9d2"}, +] +hypercorn = [ + {file = "Hypercorn-0.9.5-py3-none-any.whl", hash = "sha256:c53eb444d05e40ac1aacecaa6d3a8fabada90bbea8aacf617e75d41ac065c310"}, + {file = "Hypercorn-0.9.5.tar.gz", hash = "sha256:d94fa535e238ce1cd9c9b5f4cb77cb785d53069a5dc57a017e7c2fc51104ad5e"}, +] +hyperframe = [ + {file = "hyperframe-5.2.0-py2.py3-none-any.whl", hash = "sha256:5187962cb16dcc078f23cb5a4b110098d546c3f41ff2d4038a9896893bbd0b40"}, + {file = "hyperframe-5.2.0.tar.gz", hash = "sha256:a9f5c17f2cc3c719b917c4f33ed1c61bd1f8dfac4b1bd23b7c80b3400971b41f"}, +] +idna = [ + {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"}, + {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"}, +] +ipdb = [ + {file = "ipdb-0.13.2.tar.gz", hash = "sha256:77fb1c2a6fccdfee0136078c9ed6fe547ab00db00bebff181f1e8c9e13418d49"}, +] +ipython = [ + {file = "ipython-7.13.0-py3-none-any.whl", hash = "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333"}, + {file = "ipython-7.13.0.tar.gz", hash = "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +isort = [ + {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, + {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, +] +itsdangerous = [ + {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, + {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, +] +jedi = [ + {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, + {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +multidict = [ + {file = "multidict-4.7.5-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:fc3b4adc2ee8474cb3cd2a155305d5f8eda0a9c91320f83e55748e1fcb68f8e3"}, + {file = "multidict-4.7.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:42f56542166040b4474c0c608ed051732033cd821126493cf25b6c276df7dd35"}, + {file = "multidict-4.7.5-cp35-cp35m-win32.whl", hash = "sha256:7774e9f6c9af3f12f296131453f7b81dabb7ebdb948483362f5afcaac8a826f1"}, + {file = "multidict-4.7.5-cp35-cp35m-win_amd64.whl", hash = "sha256:c2c37185fb0af79d5c117b8d2764f4321eeb12ba8c141a95d0aa8c2c1d0a11dd"}, + {file = "multidict-4.7.5-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:e439c9a10a95cb32abd708bb8be83b2134fa93790a4fb0535ca36db3dda94d20"}, + {file = "multidict-4.7.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:85cb26c38c96f76b7ff38b86c9d560dea10cf3459bb5f4caf72fc1bb932c7136"}, + {file = "multidict-4.7.5-cp36-cp36m-win32.whl", hash = "sha256:620b37c3fea181dab09267cd5a84b0f23fa043beb8bc50d8474dd9694de1fa6e"}, + {file = "multidict-4.7.5-cp36-cp36m-win_amd64.whl", hash = "sha256:6e6fef114741c4d7ca46da8449038ec8b1e880bbe68674c01ceeb1ac8a648e78"}, + {file = "multidict-4.7.5-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:a326f4240123a2ac66bb163eeba99578e9d63a8654a59f4688a79198f9aa10f8"}, + {file = "multidict-4.7.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dc561313279f9d05a3d0ffa89cd15ae477528ea37aa9795c4654588a3287a9ab"}, + {file = "multidict-4.7.5-cp37-cp37m-win32.whl", hash = "sha256:4b7df040fb5fe826d689204f9b544af469593fb3ff3a069a6ad3409f742f5928"}, + {file = "multidict-4.7.5-cp37-cp37m-win_amd64.whl", hash = "sha256:317f96bc0950d249e96d8d29ab556d01dd38888fbe68324f46fd834b430169f1"}, + {file = "multidict-4.7.5-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:b51249fdd2923739cd3efc95a3d6c363b67bbf779208e9f37fd5e68540d1a4d4"}, + {file = "multidict-4.7.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ae402f43604e3b2bc41e8ea8b8526c7fa7139ed76b0d64fc48e28125925275b2"}, + {file = "multidict-4.7.5-cp38-cp38-win32.whl", hash = "sha256:bb519becc46275c594410c6c28a8a0adc66fe24fef154a9addea54c1adb006f5"}, + {file = "multidict-4.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:544fae9261232a97102e27a926019100a9db75bec7b37feedd74b3aa82f29969"}, + {file = "multidict-4.7.5.tar.gz", hash = "sha256:aee283c49601fa4c13adc64c09c978838a7e812f85377ae130a24d7198c0331e"}, +] +parso = [ + {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, + {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, +] +pathspec = [ + {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, + {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +priority = [ + {file = "priority-1.3.0-py2.py3-none-any.whl", hash = "sha256:be4fcb94b5e37cdeb40af5533afe6dd603bd665fe9c8b3052610fc1001d5d1eb"}, + {file = "priority-1.3.0.tar.gz", hash = "sha256:6bc1961a6d7fcacbfc337769f1a382c8e746566aaa365e78047abe9f66b2ffbe"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, + {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, +] +ptyprocess = [ + {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, + {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, +] +pycodestyle = [ + {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, + {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, +] +pyflakes = [ + {file = "pyflakes-2.1.1-py2.py3-none-any.whl", hash = "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0"}, + {file = "pyflakes-2.1.1.tar.gz", hash = "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"}, +] +pygments = [ + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, +] +quart = [ + {file = "Quart-0.11.5-py3-none-any.whl", hash = "sha256:187427d1a2d7fed20dcb825dddbe20fd971efd7ec413639f95d2e28ff59a0cb1"}, + {file = "Quart-0.11.5.tar.gz", hash = "sha256:bd93650fa856dcfbc3890952ab3ca53f7755ab506d453a209db63713eceeceda"}, +] +regex = [ + {file = "regex-2020.4.4-cp27-cp27m-win32.whl", hash = "sha256:90742c6ff121a9c5b261b9b215cb476eea97df98ea82037ec8ac95d1be7a034f"}, + {file = "regex-2020.4.4-cp27-cp27m-win_amd64.whl", hash = "sha256:24f4f4062eb16c5bbfff6a22312e8eab92c2c99c51a02e39b4eae54ce8255cd1"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:08119f707f0ebf2da60d2f24c2f39ca616277bb67ef6c92b72cbf90cbe3a556b"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c9423a150d3a4fc0f3f2aae897a59919acd293f4cb397429b120a5fcd96ea3db"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:c087bff162158536387c53647411db09b6ee3f9603c334c90943e97b1052a156"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1cbe0fa0b7f673400eb29e9ef41d4f53638f65f9a2143854de6b1ce2899185c3"}, + {file = "regex-2020.4.4-cp36-cp36m-win32.whl", hash = "sha256:0ce9537396d8f556bcfc317c65b6a0705320701e5ce511f05fc04421ba05b8a8"}, + {file = "regex-2020.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:7e1037073b1b7053ee74c3c6c0ada80f3501ec29d5f46e42669378eae6d4405a"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4385f12aa289d79419fede43f979e372f527892ac44a541b5446617e4406c468"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a58dd45cb865be0ce1d5ecc4cfc85cd8c6867bea66733623e54bd95131f473b6"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ccccdd84912875e34c5ad2d06e1989d890d43af6c2242c6fcfa51556997af6cd"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ea4adf02d23b437684cd388d557bf76e3afa72f7fed5bbc013482cc00c816948"}, + {file = "regex-2020.4.4-cp37-cp37m-win32.whl", hash = "sha256:2294f8b70e058a2553cd009df003a20802ef75b3c629506be20687df0908177e"}, + {file = "regex-2020.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:e91ba11da11cf770f389e47c3f5c30473e6d85e06d7fd9dcba0017d2867aab4a"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5635cd1ed0a12b4c42cce18a8d2fb53ff13ff537f09de5fd791e97de27b6400e"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:23069d9c07e115537f37270d1d5faea3e0bdded8279081c4d4d607a2ad393683"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c162a21e0da33eb3d31a3ac17a51db5e634fc347f650d271f0305d96601dc15b"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fb95debbd1a824b2c4376932f2216cc186912e389bdb0e27147778cf6acb3f89"}, + {file = "regex-2020.4.4-cp38-cp38-win32.whl", hash = "sha256:2a3bf8b48f8e37c3a40bb3f854bf0121c194e69a650b209628d951190b862de3"}, + {file = "regex-2020.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bfed051dbff32fd8945eccca70f5e22b55e4148d2a8a45141a3b053d6455ae3"}, + {file = "regex-2020.4.4.tar.gz", hash = "sha256:295badf61a51add2d428a46b8580309c520d8b26e769868b922750cf3ce67142"}, +] +rope = [ + {file = "rope-0.16.0-py2-none-any.whl", hash = "sha256:ae1fa2fd56f64f4cc9be46493ce54bed0dd12dee03980c61a4393d89d84029ad"}, + {file = "rope-0.16.0-py3-none-any.whl", hash = "sha256:52423a7eebb5306a6d63bdc91a7c657db51ac9babfb8341c9a1440831ecf3203"}, + {file = "rope-0.16.0.tar.gz", hash = "sha256:d2830142c2e046f5fc26a022fe680675b6f48f81c7fc1f03a950706e746e9dfe"}, +] +six = [ + {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"}, + {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"}, +] +structlog = [ + {file = "structlog-20.1.0-py2.py3-none-any.whl", hash = "sha256:8a672be150547a93d90a7d74229a29e765be05bd156a35cdcc527ebf68e9af92"}, + {file = "structlog-20.1.0.tar.gz", hash = "sha256:7a48375db6274ed1d0ae6123c486472aa1d0890b08d314d2b016f3aa7f35990b"}, +] +toml = [ + {file = "toml-0.10.0-py2.7.egg", hash = "sha256:f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"}, + {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, + {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] +typed-ast = [ + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, + {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, + {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, + {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, + {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.2-py2-none-any.whl", hash = "sha256:f8d2bd89d25bc39dabe7d23df520442fa1d8969b82544370e03d88b5a591c392"}, + {file = "typing_extensions-3.7.4.2-py3-none-any.whl", hash = "sha256:6e95524d8a547a91e08f404ae485bbb71962de46967e1b71a0cb89af24e761c5"}, + {file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"}, +] +wcwidth = [ + {file = "wcwidth-0.1.9-py2.py3-none-any.whl", hash = "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1"}, + {file = "wcwidth-0.1.9.tar.gz", hash = "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1"}, +] +werkzeug = [ + {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, + {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, +] +wsproto = [ + {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, + {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, +] +yarl = [ + {file = "yarl-1.4.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b"}, + {file = "yarl-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1"}, + {file = "yarl-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080"}, + {file = "yarl-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a"}, + {file = "yarl-1.4.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f"}, + {file = "yarl-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea"}, + {file = "yarl-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb"}, + {file = "yarl-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70"}, + {file = "yarl-1.4.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d"}, + {file = "yarl-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce"}, + {file = "yarl-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2"}, + {file = "yarl-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce"}, + {file = "yarl-1.4.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b"}, + {file = "yarl-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae"}, + {file = "yarl-1.4.2-cp38-cp38-win32.whl", hash = "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462"}, + {file = "yarl-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6"}, + {file = "yarl-1.4.2.tar.gz", hash = "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..84f414f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,35 @@ +[tool.poetry] +name = "butterrobot" +version = "0.0.2" +description = "What is my purpose?" +authors = ["Felipe Martin "] +license = "GPL-2.0" +packages = [ + { include = "butterrobot" }, + { include = "butterrobot_plugins_contrib" }, +] +include = ["README.md"] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.7" +quart = "^0.11.3" +aiohttp = "^3.6.2" +structlog = "^20.1.0" +colorama = "^0.4.3" + +[tool.poetry.dev-dependencies] +black = "^19.10b0" +flake8 = "^3.7.9" +rope = "^0.16.0" +isort = "^4.3.21" +ipdb = "^0.13.2" + +[tool.poetry.plugins] +[tool.poetry.plugins."butterrobot.plugins"] +"fun.loquito" = "butterrobot_plugins_contrib.fun:LoquitoPlugin" +"dev.ping" = "butterrobot_plugins_contrib.dev:PingPlugin" + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..007f4ac --- /dev/null +++ b/setup.cfg @@ -0,0 +1,16 @@ +[flake8] +ignore = E203, E266, E501, W503, F403 +max-line-length = 88 +max-complexity = 18 +select = B,C,E,F,W,T4,B9 + +[isort] +use_parentheses = True +multi_line_output = 3 +include_trailing_comma = True +length_sort = 1 +lines_between_types = 0 +line_length = 88 +known_third_party = click,django,docker,factory,pydantic,pytest,requests,toml +sections = FUTURE, STDLIB, DJANGO, THIRDPARTY, FIRSTPARTY, LOCALFOLDER +no_lines_before = LOCALFOLDER