diff --git a/frameworks/Python/apidaora/README.md b/frameworks/Python/apidaora/README.md
deleted file mode 100755
index 5a43e7b9070..00000000000
--- a/frameworks/Python/apidaora/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# APIDaora Benchmarking Test
-
-This is the APIDaora portion of a [benchmarking tests suite](../../)
-comparing a variety of web development platforms.
-
-The information below is specific to APIDaora. For further guidance,
-review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki).
-Also note that there is additional information provided in
-the [Python README](../).
-
-## Description
-
-[**APIDaora**](https://github.com/dutradda/apidaora) is a HTTP/REST API using dataclasses and TypedDict annotation for python3.8+.
-
-## Test Paths & Sources
-
-The default test implementations are located within the file ([app.py](app.py)).
-The core module test implementations are located within the file ([coreapp.py](coreapp.py)).
-
-All the tests are based on the ones for FastAPI, as APIDaora is an asgi application and have the same principles of using typing annotations for validation/serialization of data.
-
-## Resources
-
-* [APIDaora source code on GitHub](https://github.com/dutradda/apidaora)
-* [APIDaora website - documentation](https://dutradda.github.io/apidaora/)
diff --git a/frameworks/Python/apidaora/apidaora-core.dockerfile b/frameworks/Python/apidaora/apidaora-core.dockerfile
deleted file mode 100644
index 2598be52dd1..00000000000
--- a/frameworks/Python/apidaora/apidaora-core.dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM python:3.8
-
-ADD templates/fortune.html /apidaora/templates/
-
-WORKDIR /apidaora
-
-ADD requirements.txt /apidaora/
-
-RUN pip3 install cython==0.29.13
-
-RUN pip3 install -r /apidaora/requirements.txt
-
-ADD apidaora_core_conf.py coreapp.py /apidaora/
-
-EXPOSE 8080
-
-CMD gunicorn coreapp:app -k uvicorn.workers.UvicornWorker -c apidaora_core_conf.py
diff --git a/frameworks/Python/apidaora/apidaora.dockerfile b/frameworks/Python/apidaora/apidaora.dockerfile
deleted file mode 100644
index 0dcdcd1909d..00000000000
--- a/frameworks/Python/apidaora/apidaora.dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM python:3.8
-
-ADD templates/fortune.html /apidaora/templates/
-
-WORKDIR /apidaora
-
-ADD requirements.txt /apidaora/
-
-RUN pip3 install cython==0.29.13
-
-RUN pip3 install -r /apidaora/requirements.txt
-
-ADD apidaora_conf.py app.py /apidaora/
-
-EXPOSE 8080
-
-CMD gunicorn app:app -k uvicorn.workers.UvicornWorker -c apidaora_conf.py
diff --git a/frameworks/Python/apidaora/apidaora_conf.py b/frameworks/Python/apidaora/apidaora_conf.py
deleted file mode 100644
index c7e9f3e4c9c..00000000000
--- a/frameworks/Python/apidaora/apidaora_conf.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import multiprocessing
-import os
-
-_is_travis = os.environ.get('TRAVIS') == 'true'
-
-workers = multiprocessing.cpu_count()
-if _is_travis:
- workers = 2
-
-bind = "0.0.0.0:8080"
-keepalive = 120
-errorlog = '-'
-pidfile = '/tmp/apidaora.pid'
-loglevel = 'error'
diff --git a/frameworks/Python/apidaora/apidaora_core_conf.py b/frameworks/Python/apidaora/apidaora_core_conf.py
deleted file mode 100644
index 16db2539e21..00000000000
--- a/frameworks/Python/apidaora/apidaora_core_conf.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import multiprocessing
-import os
-
-_is_travis = os.environ.get('TRAVIS') == 'true'
-
-workers = multiprocessing.cpu_count()
-if _is_travis:
- workers = 2
-
-bind = "0.0.0.0:8080"
-keepalive = 120
-errorlog = '-'
-pidfile = '/tmp/apidaora-core.pid'
-loglevel = 'error'
diff --git a/frameworks/Python/apidaora/app.py b/frameworks/Python/apidaora/app.py
deleted file mode 100755
index 6c1455e3a82..00000000000
--- a/frameworks/Python/apidaora/app.py
+++ /dev/null
@@ -1,144 +0,0 @@
-import asyncio
-import asyncpg
-import os
-import jinja2
-from logging import getLogger
-from apidaora import appdaora, html, route, text
-from random import randint
-from operator import itemgetter
-from typing import TypedDict, Optional
-
-
-logger = getLogger(__name__)
-
-
-READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
-READ_ROW_SQL_TO_UPDATE = 'SELECT "id", "randomnumber" FROM "world" WHERE id = $1'
-WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2'
-ADDITIONAL_ROW = [0, 'Additional fortune added at request time.']
-
-
-async def setup_database():
- global connection_pool
- connection_pool = await asyncpg.create_pool(
- user=os.getenv('PGUSER', 'benchmarkdbuser'),
- password=os.getenv('PGPASS', 'benchmarkdbpass'),
- database='hello_world',
- host='tfb-database',
- port=5432
- )
-
-
-def load_fortunes_template():
- path = os.path.join('templates', 'fortune.html')
- with open(path, 'r') as template_file:
- template_text = template_file.read()
- return jinja2.Template(template_text)
-
-
-def get_num_queries(queries):
- try:
- query_count = int(queries)
- except (ValueError, TypeError):
- return 1
-
- if query_count < 1:
- return 1
- if query_count > 500:
- return 500
- return query_count
-
-
-connection_pool = None
-sort_fortunes_key = itemgetter(1)
-template = load_fortunes_template()
-loop = asyncio.get_event_loop()
-loop.run_until_complete(setup_database())
-
-
-@route.get('/json')
-async def json_serialization():
- return {'message': 'Hello, world!'}
-
-
-class DatabaseObject(TypedDict):
- id: int
- randomNumber: float
-
-
-@route.get('/db')
-async def single_database_query():
- row_id = randint(1, 10000)
-
- async with connection_pool.acquire() as connection:
- number = await connection.fetchval(READ_ROW_SQL, row_id)
-
- return DatabaseObject(id=row_id, randomNumber=number)
-
-
-@route.get('/queries')
-async def multiple_database_queries(queries: Optional[str] = None):
- num_queries = get_num_queries(queries)
- row_ids = [randint(1, 10000) for _ in range(num_queries)]
- worlds = []
-
- async with connection_pool.acquire() as connection:
- statement = await connection.prepare(READ_ROW_SQL)
- for row_id in row_ids:
- number = await statement.fetchval(row_id)
- worlds.append(
- DatabaseObject(
- id=row_id,
- randomNumber=number
- )
- )
-
- return worlds
-
-
-@route.get('/fortunes')
-async def fortunes():
- async with connection_pool.acquire() as connection:
- fortunes = await connection.fetch('SELECT * FROM Fortune')
-
- fortunes.append(ADDITIONAL_ROW)
- fortunes.sort(key=sort_fortunes_key)
- content = template.render(fortunes=fortunes)
- return html(content)
-
-
-@route.get('/updates')
-async def database_updates(queries: Optional[str] = None):
- worlds = []
- updates = set()
-
- async with connection_pool.acquire() as connection:
- statement = await connection.prepare(READ_ROW_SQL_TO_UPDATE)
-
- for _ in range(get_num_queries(queries)):
- record = await statement.fetchrow(randint(1, 10000))
- world = DatabaseObject(
- id=record['id'], randomNumber=record['randomnumber']
- )
- world['randomNumber'] = randint(1, 10000)
- worlds.append(world)
- updates.add((world['id'], world['randomNumber']))
-
- await connection.executemany(WRITE_ROW_SQL, updates)
-
- return worlds
-
-
-@route.get('/plaintext')
-async def plaintext():
- return text('Hello, world!')
-
-
-app = appdaora([
- json_serialization,
- single_database_query,
- multiple_database_queries,
- fortunes,
- database_updates,
- plaintext
-])
diff --git a/frameworks/Python/apidaora/benchmark_config.json b/frameworks/Python/apidaora/benchmark_config.json
deleted file mode 100755
index 4859e2dfc75..00000000000
--- a/frameworks/Python/apidaora/benchmark_config.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "framework": "apidaora",
- "tests": [
- {
- "default": {
- "json_url": "/json",
- "fortune_url": "/fortunes",
- "plaintext_url": "/plaintext",
- "db_url": "/db",
- "query_url": "/queries?queries=",
- "update_url": "/updates?queries=",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Micro",
- "database": "Postgres",
- "framework": "APIDaora",
- "language": "Python",
- "flavor": "Python3.8",
- "orm": "Raw",
- "platform": "None",
- "webserver": "None",
- "os": "Linux",
- "database_os": "Linux",
- "display_name": "APIDaora",
- "notes": "",
- "versus": "None"
- },
- "core": {
- "json_url": "/json",
- "fortune_url": "/fortunes",
- "plaintext_url": "/plaintext",
- "db_url": "/db",
- "query_url": "/queries?queries=",
- "update_url": "/updates?queries=",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Micro",
- "database": "Postgres",
- "framework": "APIDaora",
- "language": "Python",
- "flavor": "Python3.8",
- "orm": "Raw",
- "platform": "None",
- "webserver": "None",
- "os": "Linux",
- "database_os": "Linux",
- "display_name": "APIDaora Core",
- "notes": "",
- "versus": "None"
- }
- }
- ]
-}
diff --git a/frameworks/Python/apidaora/config.toml b/frameworks/Python/apidaora/config.toml
deleted file mode 100644
index 6d9599d812d..00000000000
--- a/frameworks/Python/apidaora/config.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-[framework]
-name = "apidaora"
-
-[main]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "Micro"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "None"
-webserver = "None"
-versus = "None"
-
-[core]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "Micro"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "None"
-webserver = "None"
-versus = "None"
diff --git a/frameworks/Python/apidaora/coreapp.py b/frameworks/Python/apidaora/coreapp.py
deleted file mode 100644
index e441532a5d1..00000000000
--- a/frameworks/Python/apidaora/coreapp.py
+++ /dev/null
@@ -1,143 +0,0 @@
-import asyncio
-import asyncpg
-import os
-import jinja2
-import orjson
-from logging import getLogger
-from random import randint
-from operator import itemgetter
-from apidaora.asgi.app import asgi_app
-from apidaora.asgi.responses import (
- JSON_RESPONSE, HTML_RESPONSE, PLAINTEXT_RESPONSE
-)
-from apidaora.asgi.router import Route, make_router
-from apidaora.method import MethodType
-
-
-logger = getLogger(__name__)
-
-
-READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
-READ_ROW_SQL_TO_UPDATE = 'SELECT "id", "randomnumber" FROM "world" WHERE id = $1'
-WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2'
-ADDITIONAL_ROW = [0, 'Additional fortune added at request time.']
-
-
-async def setup_database():
- global connection_pool
- connection_pool = await asyncpg.create_pool(
- user=os.getenv('PGUSER', 'benchmarkdbuser'),
- password=os.getenv('PGPASS', 'benchmarkdbpass'),
- database='hello_world',
- host='tfb-database',
- port=5432
- )
-
-
-def load_fortunes_template():
- path = os.path.join('templates', 'fortune.html')
- with open(path, 'r') as template_file:
- template_text = template_file.read()
- return jinja2.Template(template_text)
-
-
-def get_num_queries(queries):
- try:
- query_count = int(queries[0])
- except (ValueError, TypeError):
- return 1
-
- if query_count < 1:
- return 1
- if query_count > 500:
- return 500
- return query_count
-
-
-connection_pool = None
-sort_fortunes_key = itemgetter(1)
-template = load_fortunes_template()
-loop = asyncio.get_event_loop()
-loop.run_until_complete(setup_database())
-
-
-def json_serialization(request):
- return JSON_RESPONSE, orjson.dumps({'message': 'Hello, world!'})
-
-
-async def single_database_query(request):
- row_id = randint(1, 10000)
-
- async with connection_pool.acquire() as connection:
- number = await connection.fetchval(READ_ROW_SQL, row_id)
-
- return JSON_RESPONSE, orjson.dumps(
- {'id': row_id, 'randomNumber': number}
- )
-
-
-async def multiple_database_queries(request):
- num_queries = get_num_queries(request.query_dict.get('queries', 1))
- row_ids = [randint(1, 10000) for _ in range(num_queries)]
- worlds = []
-
- async with connection_pool.acquire() as connection:
- statement = await connection.prepare(READ_ROW_SQL)
- for row_id in row_ids:
- number = await statement.fetchval(row_id)
- worlds.append(
- dict(
- id=row_id,
- randomNumber=number
- )
- )
-
- return JSON_RESPONSE, orjson.dumps(worlds)
-
-
-async def fortunes(request):
- async with connection_pool.acquire() as connection:
- fortunes = await connection.fetch('SELECT * FROM Fortune')
-
- fortunes.append(ADDITIONAL_ROW)
- fortunes.sort(key=sort_fortunes_key)
- content = template.render(fortunes=fortunes).encode('utf-8')
- return HTML_RESPONSE, content
-
-
-async def database_updates(request):
- worlds = []
- updates = set()
- queries = request.query_dict.get('queries', 1)
-
- async with connection_pool.acquire() as connection:
- statement = await connection.prepare(READ_ROW_SQL_TO_UPDATE)
-
- for _ in range(get_num_queries(queries)):
- record = await statement.fetchrow(randint(1, 10000))
- world = dict(
- id=record['id'], randomNumber=record['randomnumber']
- )
- world['randomNumber'] = randint(1, 10000)
- worlds.append(world)
- updates.add((world['id'], world['randomNumber']))
-
- await connection.executemany(WRITE_ROW_SQL, updates)
-
- return JSON_RESPONSE, orjson.dumps(worlds)
-
-
-def plaintext(request):
- return PLAINTEXT_RESPONSE, b'Hello, world!'
-
-
-routes = (
- Route('/json', MethodType.GET, json_serialization),
- Route('/db', MethodType.GET, single_database_query),
- Route('/queries', MethodType.GET, multiple_database_queries, has_query=True),
- Route('/fortunes', MethodType.GET, fortunes),
- Route('/updates', MethodType.GET, database_updates, has_query=True),
- Route('/plaintext', MethodType.GET, plaintext),
-)
-router = make_router(routes)
-app = asgi_app(router)
diff --git a/frameworks/Python/apidaora/requirements.txt b/frameworks/Python/apidaora/requirements.txt
deleted file mode 100644
index 532c2b27bdd..00000000000
--- a/frameworks/Python/apidaora/requirements.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-asyncpg==0.21.0
-gunicorn==23.0.0
-jinja2==3.1.6
-uvloop==0.14.0
-uvicorn==0.11.7
-apidaora==0.26.0
diff --git a/frameworks/Python/apidaora/templates/fortune.html b/frameworks/Python/apidaora/templates/fortune.html
deleted file mode 100644
index 1c90834285d..00000000000
--- a/frameworks/Python/apidaora/templates/fortune.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
Fortunes
-
-
-| id | message |
-{% for fortune in fortunes %}| {{ fortune[0] }} | {{ fortune[1]|e }} |
-{% endfor %}
-
-
diff --git a/frameworks/Python/async-worker/Pipfile b/frameworks/Python/async-worker/Pipfile
deleted file mode 100644
index 0cf91e337f9..00000000000
--- a/frameworks/Python/async-worker/Pipfile
+++ /dev/null
@@ -1,17 +0,0 @@
-[[source]]
-url = "https://pypi.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-async-worker = "==0.19.1"
-cchardet = "==2.1.7"
-
-[dev-packages]
-black = "*"
-
-[requires]
-python_version = "3.9"
-
-[pipenv]
-allow_prereleases = true
diff --git a/frameworks/Python/async-worker/Pipfile.lock b/frameworks/Python/async-worker/Pipfile.lock
deleted file mode 100644
index 2ecfdb16067..00000000000
--- a/frameworks/Python/async-worker/Pipfile.lock
+++ /dev/null
@@ -1,440 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "872880755bbf439ce862323482273dd3539044167e90014909fbfe789adaa25a"
- },
- "pipfile-spec": 6,
- "requires": {
- "python_version": "3.9"
- },
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "aioamqp": {
- "hashes": [
- "sha256:55fa703a70e71bc958ad546b9ee0c68387cab366c82fc44c0742d6ad0303745a",
- "sha256:eef5c23a7fedee079d8326406f5c7a5725dfe36c359373da3499fffa16f79915"
- ],
- "version": "==0.14.0"
- },
- "aiohttp": {
- "hashes": [
- "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0",
- "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6",
- "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf",
- "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9",
- "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e",
- "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0",
- "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329",
- "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2",
- "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40",
- "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a",
- "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4",
- "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de",
- "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9",
- "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9",
- "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb",
- "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076",
- "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de",
- "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907",
- "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d",
- "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536",
- "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d",
- "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54",
- "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc",
- "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212",
- "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9",
- "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d",
- "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b",
- "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7",
- "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81",
- "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c",
- "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895",
- "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297",
- "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb",
- "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe",
- "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242",
- "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0",
- "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.7.4"
- },
- "aiologger": {
- "hashes": [
- "sha256:5e1493a2c9819a5d751b9e775c79b9afe628387ee80a1d5e91ff719bb2f511b9"
- ],
- "version": "==0.5.0"
- },
- "async-timeout": {
- "hashes": [
- "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f",
- "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"
- ],
- "markers": "python_full_version >= '3.5.3'",
- "version": "==3.0.1"
- },
- "async-worker": {
- "hashes": [
- "sha256:ca60175a50430fd06817163d7edb0d19d0978b54fc65d3df59af3663f2c05ba0"
- ],
- "index": "pypi",
- "version": "==0.19.1"
- },
- "attrs": {
- "hashes": [
- "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
- "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==21.2.0"
- },
- "cached-property": {
- "hashes": [
- "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f",
- "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"
- ],
- "version": "==1.5.1"
- },
- "cchardet": {
- "hashes": [
- "sha256:0b859069bbb9d27c78a2c9eb997e6f4b738db2d7039a03f8792b4058d61d1109",
- "sha256:228d2533987c450f39acf7548f474dd6814c446e9d6bd228e8f1d9a2d210f10b",
- "sha256:2309ff8fc652b0fc3c0cff5dbb172530c7abb92fe9ba2417c9c0bcf688463c1c",
- "sha256:24974b3e40fee9e7557bb352be625c39ec6f50bc2053f44a3d1191db70b51675",
- "sha256:273699c4e5cd75377776501b72a7b291a988c6eec259c29505094553ee505597",
- "sha256:27a9ba87c9f99e0618e1d3081189b1217a7d110e5c5597b0b7b7c3fedd1c340a",
- "sha256:302aa443ae2526755d412c9631136bdcd1374acd08e34f527447f06f3c2ddb98",
- "sha256:45456c59ec349b29628a3c6bfb86d818ec3a6fbb7eb72de4ff3bd4713681c0e3",
- "sha256:48ba829badef61441e08805cfa474ccd2774be2ff44b34898f5854168c596d4d",
- "sha256:50ad671e8d6c886496db62c3bd68b8d55060688c655873aa4ce25ca6105409a1",
- "sha256:54341e7e1ba9dc0add4c9d23b48d3a94e2733065c13920e85895f944596f6150",
- "sha256:54d0b26fd0cd4099f08fb9c167600f3e83619abefeaa68ad823cc8ac1f7bcc0c",
- "sha256:5a25f9577e9bebe1a085eec2d6fdd72b7a9dd680811bba652ea6090fb2ff472f",
- "sha256:6b6397d8a32b976a333bdae060febd39ad5479817fabf489e5596a588ad05133",
- "sha256:70eeae8aaf61192e9b247cf28969faef00578becd2602526ecd8ae7600d25e0e",
- "sha256:80e6faae75ecb9be04a7b258dc4750d459529debb6b8dee024745b7b5a949a34",
- "sha256:90086e5645f8a1801350f4cc6cb5d5bf12d3fa943811bb08667744ec1ecc9ccd",
- "sha256:a39526c1c526843965cec589a6f6b7c2ab07e3e56dc09a7f77a2be6a6afa4636",
- "sha256:b154effa12886e9c18555dfc41a110f601f08d69a71809c8d908be4b1ab7314f",
- "sha256:b59ddc615883835e03c26f81d5fc3671fab2d32035c87f50862de0da7d7db535",
- "sha256:bd7f262f41fd9caf5a5f09207a55861a67af6ad5c66612043ed0f81c58cdf376",
- "sha256:c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf",
- "sha256:c6f70139aaf47ffb94d89db603af849b82efdf756f187cdd3e566e30976c519f",
- "sha256:c96aee9ebd1147400e608a3eff97c44f49811f8904e5a43069d55603ac4d8c97",
- "sha256:ec3eb5a9c475208cf52423524dcaf713c394393e18902e861f983c38eeb77f18",
- "sha256:eee4f5403dc3a37a1ca9ab87db32b48dc7e190ef84601068f45397144427cc5e",
- "sha256:f16517f3697569822c6d09671217fdeab61dfebc7acb5068634d6b0728b86c0b",
- "sha256:f86e0566cb61dc4397297696a4a1b30f6391b50bc52b4f073507a48466b6255a",
- "sha256:fdac1e4366d0579fff056d1280b8dc6348be964fda8ebb627c0269e097ab37fa"
- ],
- "index": "pypi",
- "version": "==2.1.7"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "version": "==3.0.4"
- },
- "idna": {
- "hashes": [
- "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",
- "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.5'",
- "version": "==3.7"
- },
- "multidict": {
- "hashes": [
- "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a",
- "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93",
- "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632",
- "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656",
- "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79",
- "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7",
- "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d",
- "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5",
- "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224",
- "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26",
- "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea",
- "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348",
- "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6",
- "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76",
- "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1",
- "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f",
- "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952",
- "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a",
- "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37",
- "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9",
- "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359",
- "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8",
- "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da",
- "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3",
- "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d",
- "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf",
- "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841",
- "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d",
- "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93",
- "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f",
- "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647",
- "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635",
- "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456",
- "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda",
- "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5",
- "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281",
- "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.1.0"
- },
- "pamqp": {
- "hashes": [
- "sha256:2f81b5c186f668a67f165193925b6bfd83db4363a6222f599517f29ecee60b02",
- "sha256:5cd0f5a85e89f20d5f8e19285a1507788031cfca4a9ea6f067e3cf18f5e294e8"
- ],
- "version": "==2.3.0"
- },
- "prometheus-client": {
- "hashes": [
- "sha256:71cd24a2b3eb335cb800c7159f423df1bd4dcd5171b234be15e3f31ec9f622da"
- ],
- "version": "==0.7.1"
- },
- "pydantic": {
- "hashes": [
- "sha256:0b71ca069c16470cb00be0acaf0657eb74cbc4ff5f11b42e79647f170956cda3",
- "sha256:12ed0b175bba65e29dfc5859cd539d3512f58bb776bf620a3d3338501fd0f389",
- "sha256:22fe5756c6c57279234e4c4027a3549507aca29e9ee832d6aa39c367cb43c99f",
- "sha256:26821f61623b01d618bd8b3243f790ac8bd7ae31b388c0e41aa586002cf350eb",
- "sha256:2bc9e9f5d91a29dec53346efc5c719d82297885d89c8a62b971492fba222c68d",
- "sha256:42b8fb1e4e4783c4aa31df44b64714f96aa4deeacbacf3713a8a238ee7df3b2b",
- "sha256:4a83d24bcf9ce8e6fa55c379bba1359461eedb85721bfb3151e240871e2b13a8",
- "sha256:5759a4b276bda5ac2360f00e9b1e711aaac51fabd155b422d27f3339710f4264",
- "sha256:77e04800d19acc2a8fbb95fe3d47ff397ce137aa5a2b32cc23a87bac70dda343",
- "sha256:865410a6df71fb60294887770d19c67d499689f7ce64245182653952cdbd4183",
- "sha256:91baec8ed771d4c53d71ef549d8e36b0f92a31c32296062d562d1d7074dd1d6e",
- "sha256:999cc108933425752e45d1bf2f57d3cf091f2a5e8b9b8afab5b8872d2cc7645f",
- "sha256:a0ff36e3f929d76b91d1624c6673dbdc1407358700d117bb7f29d5696c52d288",
- "sha256:a989924324513215ad2b2cfd187426e6372f76f507b17361142c0b792294960c",
- "sha256:ad2fae68e185cfae5b6d83e7915352ff0b6e5fa84d84bc6a94c3e2de58327114",
- "sha256:b4e03c84f4e96e3880c9d34508cccbd0f0df6e7dc14b17f960ea8c71448823a3",
- "sha256:c26d380af3e9a8eb9abe3b6337cea28f057b5425330817c918cf74d0a0a2303d",
- "sha256:c8a3600435b83a4f28f5379f3bb574576521180f691828268268e9f172f1b1eb",
- "sha256:ccc2ab0a240d01847f3d5f0f9e1582d450a2fc3389db33a7af8e7447b205a935",
- "sha256:d361d181a3fb53ebfdc2fb1e3ca55a6b2ad717578a5e119c99641afd11b31a47",
- "sha256:d5aeab86837f8799df0d84bec1190e6cc0062d5c5374636b5599234f2b39fe0a",
- "sha256:edf37d30ea60179ef067add9772cf42299ea6cd490b3c94335a68f1021944ac4"
- ],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==1.8"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
- "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
- "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
- ],
- "version": "==3.10.0.0"
- },
- "yarl": {
- "hashes": [
- "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e",
- "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434",
- "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366",
- "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3",
- "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec",
- "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959",
- "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e",
- "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c",
- "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6",
- "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a",
- "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6",
- "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424",
- "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e",
- "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f",
- "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50",
- "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2",
- "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc",
- "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4",
- "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970",
- "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10",
- "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0",
- "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406",
- "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896",
- "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643",
- "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721",
- "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478",
- "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724",
- "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e",
- "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8",
- "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96",
- "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25",
- "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76",
- "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2",
- "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2",
- "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c",
- "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a",
- "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.6.3"
- }
- },
- "develop": {
- "appdirs": {
- "hashes": [
- "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41",
- "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"
- ],
- "version": "==1.4.4"
- },
- "black": {
- "hashes": [
- "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f",
- "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93",
- "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11",
- "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0",
- "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9",
- "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5",
- "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213",
- "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d",
- "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7",
- "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837",
- "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f",
- "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395",
- "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995",
- "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f",
- "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597",
- "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959",
- "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5",
- "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb",
- "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4",
- "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7",
- "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd",
- "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"
- ],
- "index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==24.3.0"
- },
- "click": {
- "hashes": [
- "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
- "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==8.1.7"
- },
- "mypy-extensions": {
- "hashes": [
- "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
- "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.0.0"
- },
- "packaging": {
- "hashes": [
- "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
- "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==24.0"
- },
- "pathspec": {
- "hashes": [
- "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",
- "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==0.12.1"
- },
- "platformdirs": {
- "hashes": [
- "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068",
- "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==4.2.0"
- },
- "regex": {
- "hashes": [
- "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5",
- "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79",
- "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31",
- "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500",
- "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11",
- "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14",
- "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3",
- "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439",
- "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c",
- "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82",
- "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711",
- "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093",
- "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a",
- "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb",
- "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8",
- "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17",
- "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000",
- "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d",
- "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480",
- "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc",
- "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0",
- "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9",
- "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765",
- "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e",
- "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a",
- "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07",
- "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f",
- "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac",
- "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7",
- "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed",
- "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968",
- "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7",
- "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2",
- "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4",
- "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87",
- "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8",
- "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10",
- "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29",
- "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605",
- "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6",
- "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"
- ],
- "version": "==2021.4.4"
- },
- "toml": {
- "hashes": [
- "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
- "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
- ],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.10.2"
- },
- "tomli": {
- "hashes": [
- "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
- "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
- ],
- "markers": "python_version < '3.11'",
- "version": "==2.0.1"
- },
- "typing-extensions": {
- "hashes": [
- "sha256:6f1117ac0cbe64536f34520c4688cd144794f9b1d79690bfe0389aa12a347976",
- "sha256:7427ef26efa5e4e465e3765af0e52d3897e3684c908efe20e3331e1ce51884b3"
- ],
- "markers": "python_version < '3.11'",
- "version": "==4.11.0rc1"
- }
- }
-}
diff --git a/frameworks/Python/async-worker/README.md b/frameworks/Python/async-worker/README.md
deleted file mode 100644
index fbdcb7e215a..00000000000
--- a/frameworks/Python/async-worker/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# [async-worker](https://github.com/async-worker/async-worker) Benchmark Test
-
-### Server
-Server is exposed at `:8080`
-
-## Test URLs
-
-### Test 1: JSON Encoding
-
- http://localhost:8080/json
-
-### Test 6: Plaintext
-
- http://localhost:8080/plaintext
diff --git a/frameworks/Python/async-worker/async-worker.dockerfile b/frameworks/Python/async-worker/async-worker.dockerfile
deleted file mode 100644
index 2023fb97fb9..00000000000
--- a/frameworks/Python/async-worker/async-worker.dockerfile
+++ /dev/null
@@ -1,19 +0,0 @@
-FROM python:3.9-alpine
-
-LABEL description="Image used to run async-worker benchmark tests."
-LABEL version='0.1'
-
-ENV ASYNCWORKER_HTTP_HOST=0.0.0.0
-ENV ASYNCWORKER_HTTP_PORT=8080
-
-WORKDIR /app
-
-COPY /src /app
-COPY Pipfile /app
-COPY Pipfile.lock /app
-
-RUN apk add --virtual .deps gcc g++ make openssl-dev libxml2 libffi-dev && \
- pip install pipenv && \
- pipenv install --system --ignore-pipfile
-
-CMD ["python", "./hello_world.py"]
diff --git a/frameworks/Python/async-worker/benchmark_config.json b/frameworks/Python/async-worker/benchmark_config.json
deleted file mode 100644
index f27f1806581..00000000000
--- a/frameworks/Python/async-worker/benchmark_config.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "framework": "async-worker",
- "tests": [{
- "default": {
- "json_url": "/json",
- "plaintext_url": "/plaintext",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Micro",
- "framework": "async-worker",
- "language": "Python",
- "flavor": "Python3",
- "orm": "Raw",
- "platform": "asyncio",
- "os": "Linux",
- "display_name": "async-worker",
- "versus": "aiohttp"
- }
- }]
-}
diff --git a/frameworks/Python/async-worker/src/__init__.py b/frameworks/Python/async-worker/src/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/frameworks/Python/async-worker/src/hello_world.py b/frameworks/Python/async-worker/src/hello_world.py
deleted file mode 100644
index ca785cd583b..00000000000
--- a/frameworks/Python/async-worker/src/hello_world.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from aiohttp import web
-from asyncworker import App
-
-app = App()
-
-
-@app.http.get(["/plaintext"])
-async def handler(request: web.Request) -> web.Response:
- return web.Response(body="Hello, World!")
-
-
-@app.http.get(["/json"])
-async def handler(request: web.Request) -> web.Response:
- return web.json_response({"message": "Hello, World!"})
-
-
-if __name__ == "__main__":
- app.run()
diff --git a/frameworks/Python/bareasgi/README.md b/frameworks/Python/bareasgi/README.md
deleted file mode 100755
index de493eec242..00000000000
--- a/frameworks/Python/bareasgi/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# bareASGI Benchmark Test
-
-This is the bareASGI portion of a [benchmarking tests suite](../../)
-comparing a variety of web development platforms.
-
-The information below is specific to bareASGI. For further guidance,
-review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki).
-Also note that there is additional information provided in
-the [Python README](../).
-
-## Description
-
-[bareASGI](https://github.com/rob-blackbourn/bareASGI) is a lightweight ASGI web server framework.
-
-## Test Paths & Sources
-
-All of the test implementations are located within a single file ([app.py](app.py)).
-
-## Resources
-
-* [bareASGI on GitHub](https://github.com/rob-blackbourn/bareASGI)
-* [ASGI specification](https://asgi.readthedocs.io/en/latest/)
diff --git a/frameworks/Python/bareasgi/app.py b/frameworks/Python/bareasgi/app.py
deleted file mode 100644
index 794754dfaf0..00000000000
--- a/frameworks/Python/bareasgi/app.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env python3
-from random import randint, sample
-import os
-import os.path
-from typing import Any, Dict, List, Tuple
-from urllib.parse import parse_qs
-
-import asyncpg
-import jinja2
-import orjson
-
-from bareasgi import Application, HttpRequest, HttpResponse, LifespanRequest
-from bareasgi_jinja2 import add_jinja2, Jinja2TemplateProvider
-
-GET_WORLD = "SELECT id, randomnumber FROM world WHERE id = $1"
-UPDATE_WORLD = "UPDATE world SET randomNumber = $2 WHERE id = $1"
-GET_FORTUNES = "SELECT * FROM fortune"
-ADDITIONAL_ROW = (0, "Additional fortune added at request time.")
-
-
-async def on_startup(_request: LifespanRequest) -> None:
- app.info['db'] = await asyncpg.create_pool(
- user=os.getenv("PGUSER", "benchmarkdbuser"),
- password=os.getenv("PGPASS", "benchmarkdbpass"),
- database="hello_world",
- host="tfb-database",
- port=5432,
- )
-
-
-async def on_shutdown(_request: LifespanRequest) -> None:
- await app.info['db'].close()
-
-
-async def handle_json_request(_request: HttpRequest) -> HttpResponse:
- return HttpResponse.from_json(
- {"message": "Hello, World!"},
- encode_bytes=orjson.dumps
- )
-
-
-async def handle_plaintext_request(_request: HttpRequest) -> HttpResponse:
- return HttpResponse.from_text("Hello, World!")
-
-
-async def handle_db_request(_request: HttpRequest) -> HttpResponse:
- key = randint(1, 10000)
-
- async with app.info['db'].acquire() as conn:
- number = await conn.fetchval(GET_WORLD, key)
-
- return HttpResponse.from_json(
- {"id": key, "randomNumber": number},
- encode_bytes=orjson.dumps
- )
-
-
-def get_query_count(request: HttpRequest):
- try:
- qs = parse_qs(request.scope["query_string"])
- num_queries = int(qs.get(b'queries', (1, ))[0])
- except ValueError:
- num_queries = 1
- if num_queries < 1:
- return 1
- if num_queries > 500:
- return 500
-
- return num_queries
-
-
-async def handle_queries_request(request: HttpRequest) -> HttpResponse:
- queries = get_query_count(request)
-
- worlds: List[Dict[str, Any]] = []
- async with app.info['db'].acquire() as conn:
- pst = await conn.prepare(GET_WORLD)
- for key in sample(range(1, 10000), queries):
- number = await pst.fetchval(key)
- worlds.append({"id": key, "randomNumber": number})
-
- return HttpResponse.from_json(
- worlds,
- encode_bytes=orjson.dumps
- )
-
-
-async def handle_updates_request(request: HttpRequest) -> HttpResponse:
- queries = get_query_count(request)
- updates = [(row_id, randint(1, 10000)) for row_id in sample(range(1, 10000), queries)]
- updates.sort()
- worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates]
-
- async with app.info['db'].acquire() as connection:
- statement = await connection.prepare(GET_WORLD)
- for row_id, number in updates:
- await statement.fetchval(row_id)
- await connection.executemany(UPDATE_WORLD, updates)
-
- return HttpResponse.from_json(
- worlds,
- encode_bytes=orjson.dumps
- )
-
-async def handle_fortunes_request(request: HttpRequest) -> HttpResponse:
- async with app.info['db'].acquire() as conn:
- rows = await conn.fetch(GET_FORTUNES)
- rows.append(ADDITIONAL_ROW)
- rows.sort(key=lambda row: row[1])
-
- return await Jinja2TemplateProvider.apply(
- request,
- "fortune.html",
- { "fortunes": rows }
- )
-
-app = Application(
- startup_handlers=[on_startup],
- shutdown_handlers=[on_shutdown]
-)
-
-here = os.path.abspath(os.path.dirname(__file__))
-env = jinja2.Environment(
- loader=jinja2.FileSystemLoader(os.path.join(here, 'templates')),
- autoescape=jinja2.select_autoescape(['html', 'xml']),
- enable_async=True
-)
-
-add_jinja2(app, env)
-
-app.http_router.add({"GET"}, "/json", handle_json_request)
-app.http_router.add({"GET"}, "/plaintext", handle_plaintext_request)
-app.http_router.add({"GET"}, "/db", handle_db_request)
-app.http_router.add({"GET"}, "/queries", handle_queries_request)
-app.http_router.add({"GET"}, "/updates", handle_updates_request)
-app.http_router.add({"GET"}, "/fortunes", handle_fortunes_request)
diff --git a/frameworks/Python/bareasgi/bareasgi.dockerfile b/frameworks/Python/bareasgi/bareasgi.dockerfile
deleted file mode 100644
index 2306153b5c0..00000000000
--- a/frameworks/Python/bareasgi/bareasgi.dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM python:3.10
-
-ADD ./ /bareasgi
-
-WORKDIR /bareasgi
-
-RUN pip install -r /bareasgi/requirements.txt
-
-EXPOSE 8080
-
-CMD hypercorn app:app --config=file:hypercorn_conf.py
diff --git a/frameworks/Python/bareasgi/benchmark_config.json b/frameworks/Python/bareasgi/benchmark_config.json
deleted file mode 100755
index cb1521cc63d..00000000000
--- a/frameworks/Python/bareasgi/benchmark_config.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "framework": "bareasgi",
- "tests": [
- {
- "default": {
- "json_url": "/json",
- "plaintext_url": "/plaintext",
- "fortune_url": "/fortunes",
- "db_url": "/db",
- "query_url": "/queries?queries=",
- "update_url": "/updates?queries=",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Micro",
- "database": "Postgres",
- "framework": "bareasgi",
- "language": "Python",
- "flavor": "Python3",
- "orm": "Raw",
- "platform": "asyncio",
- "webserver": "Hypercorn",
- "os": "Linux",
- "database_os": "Linux",
- "display_name": "bareASGI",
- "notes": "",
- "versus": "None"
- }
- }
- ]
-}
diff --git a/frameworks/Python/bareasgi/config.toml b/frameworks/Python/bareasgi/config.toml
deleted file mode 100644
index 4f803119e49..00000000000
--- a/frameworks/Python/bareasgi/config.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[framework]
-name = "bareasgi"
-
-[main]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "Micro"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "None"
-webserver = "None"
-versus = "None"
diff --git a/frameworks/Python/bareasgi/hypercorn_conf.py b/frameworks/Python/bareasgi/hypercorn_conf.py
deleted file mode 100644
index 79865d7583c..00000000000
--- a/frameworks/Python/bareasgi/hypercorn_conf.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import multiprocessing
-import os
-
-_is_travis = os.environ.get('TRAVIS') == 'true'
-
-workers = multiprocessing.cpu_count()
-if _is_travis:
- workers = 2
-
-bind = ["0.0.0.0:8080"]
-keep_alive_timeout = 120
-loglevel = "error"
-worker_class = "uvloop"
diff --git a/frameworks/Python/bareasgi/requirements.txt b/frameworks/Python/bareasgi/requirements.txt
deleted file mode 100644
index 357e05a3d00..00000000000
--- a/frameworks/Python/bareasgi/requirements.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-asyncpg==0.26.0
-bareasgi==4.3.0
-bareasgi-jinja2==4.0.1
-bareutils==4.0.2
-h11==0.16.0
-h2==4.1.0
-hpack==4.0.0
-hypercorn==0.14.3
-hyperframe==6.0.1
-jetblack-asgi-typing==0.4.0
-Jinja2==3.1.6
-MarkupSafe==2.1.1
-orjson==3.8.0
-priority==2.0.0
-toml==0.10.2
-uvloop==0.17.0
-wsproto==1.2.0
diff --git a/frameworks/Python/bareasgi/templates/fortune.html b/frameworks/Python/bareasgi/templates/fortune.html
deleted file mode 100644
index 1c90834285d..00000000000
--- a/frameworks/Python/bareasgi/templates/fortune.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-Fortunes
-
-
-| id | message |
-{% for fortune in fortunes %}| {{ fortune[0] }} | {{ fortune[1]|e }} |
-{% endfor %}
-
-
diff --git a/frameworks/Python/japronto/README.md b/frameworks/Python/japronto/README.md
deleted file mode 100644
index e8cc702fac1..00000000000
--- a/frameworks/Python/japronto/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Japronto Benchmark Test
-
-This is the Japronto portion of a [benchmarking tests suite](../../)
-comparing a variety of web development platforms.
-
-The information below is specific to Japronto. For further guidance,
-review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki).
-Also note that there is additional information provided in
-the [Python README](../).
-
-## Description
-
-[Japronto](https://github.com/squeaky-pl/japronto) is a screaming-fast, scalable,
-asynchronous Python 3.5+ HTTP toolkit.
-
-## Test Paths & Sources
-
-All of the test implementations are located within a single file ([app.py](app.py)).
-
-* [JSON Serialization](app.py): "/json"
-* [Plaintext](app.py): "/plaintext"
diff --git a/frameworks/Python/japronto/app.py b/frameworks/Python/japronto/app.py
deleted file mode 100644
index 040de09a4be..00000000000
--- a/frameworks/Python/japronto/app.py
+++ /dev/null
@@ -1,78 +0,0 @@
-import os
-import sys
-import multiprocessing
-from wsgiref.handlers import format_date_time
-import japronto
-import ujson as json
-import random
-import asyncio
-import asyncpg
-
-db_pool = None
-
-async def db_setup():
- global db_pool
- db_pool = await asyncpg.create_pool(
- user = os.getenv('PGUSER', 'benchmarkdbuser'),
- password = os.getenv('PGPASS', 'benchmarkdbpass'),
- database = 'hello_world',
- host = 'tfb-database',
- port = 5432
- )
-
-READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
-
-
-def get_headers():
- return {
- 'Server': 'Japronto/0.1.2',
- 'Date': format_date_time(None),
- }
-
-# -----------------------------------------------------------------------------------
-
-def json_view(request):
- return request.Response(
- text = json.dumps( {'message': 'Hello, world!'} ),
- mime_type = 'application/json',
- headers = get_headers(),
- )
-
-
-def plaintext_view(request):
- return request.Response(
- body = b'Hello, world!',
- mime_type = 'text/plain',
- headers = get_headers(),
- )
-
-
-async def db_view(request):
- global db_pool
- row_id = random.randint(1, 10000)
- async with db_pool.acquire() as connection:
- number = await connection.fetchval(READ_ROW_SQL, row_id)
-
- text = json.dumps( {'id': row_id, 'randomNumber': number} )
- return request.Response(text = text, mime_type = 'application/json', headers = get_headers())
-
-# -----------------------------------------------------------------------------------
-
-app = japronto.Application()
-app.router.add_route('/json', json_view, 'GET')
-app.router.add_route('/plaintext', plaintext_view, 'GET')
-#app.router.add_route('/db', db_view, 'GET')
-
-#asyncio.set_event_loop(app.loop)
-#app.loop.run_until_complete(db_setup())
-
-# -----------------------------------------------------------------------------------
-
-if __name__ == '__main__':
- _is_travis = os.environ.get('TRAVIS') == 'true'
-
- workers = int( multiprocessing.cpu_count() )
- if _is_travis:
- workers = 2
-
- app.run('0.0.0.0', 8080, worker_num = workers)
diff --git a/frameworks/Python/japronto/app_postgres.py b/frameworks/Python/japronto/app_postgres.py
deleted file mode 100644
index d68a92f026c..00000000000
--- a/frameworks/Python/japronto/app_postgres.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import multiprocessing
-from wsgiref.handlers import format_date_time
-import random
-
-import japronto
-import ujson as json
-
-from db import init_db, close_db
-
-
-def get_headers():
- return {
- 'Server': 'Japronto/0.1.1',
- 'Date': format_date_time(None),
- }
-
-
-def json_view(request):
- return request.Response(
- text=json.dumps({'message': 'Hello, world!'}),
- mime_type='application/json',
- headers=get_headers(),
- )
-
-
-def plaintext_view(request):
- return request.Response(
- body=b'Hello, world!',
- mime_type='text/plain',
- headers=get_headers(),
- )
-
-
-async def db_view(request):
- async with app.db_pool.acquire() as conn:
- world = await conn.fetchrow("select id,randomnumber from world where id=%s" % random.randint(1, 10000))
- return request.Response(
- text=json.dumps(dict(world)),
- mime_type='application/json', headers=get_headers())
-
-
-app = japronto.Application()
-app.on_startup.append(init_db)
-app.on_cleanup.append(close_db)
-app.router.add_route('/json', json_view, 'GET')
-app.router.add_route('/plaintext', plaintext_view, 'GET')
-app.router.add_route('/db', db_view, 'GET')
-
-
-if __name__ == '__main__':
- app.run('0.0.0.0', 8080, worker_num=multiprocessing.cpu_count())
diff --git a/frameworks/Python/japronto/benchmark_config.json b/frameworks/Python/japronto/benchmark_config.json
deleted file mode 100644
index 21bb719516d..00000000000
--- a/frameworks/Python/japronto/benchmark_config.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "framework": "japronto",
- "tests": [{
- "default": {
- "json_url": "/json",
- "plaintext_url": "/plaintext",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Micro",
- "framework": "japronto",
- "language": "Python",
- "flavor": "Python3",
- "platform": "None",
- "webserver": "None",
- "os": "Linux",
- "orm": "Raw",
- "database_os": "Linux",
- "database": "None",
- "display_name": "Japronto",
- "notes": ""
- }
- }]
-}
diff --git a/frameworks/Python/japronto/config.toml b/frameworks/Python/japronto/config.toml
deleted file mode 100644
index 8b5d2cbd9ad..00000000000
--- a/frameworks/Python/japronto/config.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[framework]
-name = "japronto"
-
-[main]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-approach = "Realistic"
-classification = "Micro"
-database = "None"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "None"
-webserver = "None"
-versus = "None"
diff --git a/frameworks/Python/japronto/db.py b/frameworks/Python/japronto/db.py
deleted file mode 100644
index 2609377ff84..00000000000
--- a/frameworks/Python/japronto/db.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import asyncio
-from contextlib import asynccontextmanager
-import asyncpg
-import os
-
-
-class Connection(asyncpg.Connection):
- async def reset(self, *, timeout=None):
- pass
-
-
-class Pool:
- def __init__(self, connect_url, max_size=10, connection_class=None):
- self._connect_url = connect_url
- self._connection_class = connection_class or Connection
- self._queue = asyncio.LifoQueue(max_size)
-
- def __await__(self):
- return self._async_init__().__await__()
-
- async def _async_init__(self):
- for _ in range(self._queue.maxsize):
- self._queue.put_nowait(await asyncpg.connect(self._connect_url, connection_class=self._connection_class))
- return self
-
- @asynccontextmanager
- async def acquire(self):
- conn = await self._queue.get()
- try:
- yield conn
- finally:
- self._queue.put_nowait(conn)
-
- async def close(self):
- for _ in range(self._queue.maxsize):
- conn = await self._queue.get()
- await conn.close()
-
-
-async def init_db(app):
- app.db_pool = await Pool("postgresql://%s:%s@tfb-database:5432/hello_world" % (os.getenv("PGUSER", "benchmarkdbuser"), os.getenv("PSPASS", "benchmarkdbpass")), connection_class=asyncpg.Connection)
-
-
-async def close_db(app):
- await asyncio.wait_for(app.db_pool.close(), timeout=1)
diff --git a/frameworks/Python/japronto/japronto-postgres.dockerfile b/frameworks/Python/japronto/japronto-postgres.dockerfile
deleted file mode 100644
index d868e4b927c..00000000000
--- a/frameworks/Python/japronto/japronto-postgres.dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM python:3.9.7
-
-ADD ./ /japronto
-
-WORKDIR /japronto
-
-RUN pip3 install -r /japronto/requirements_postgres.txt
-
-EXPOSE 8080
-
-CMD python3 app_postgres.py
diff --git a/frameworks/Python/japronto/japronto.dockerfile b/frameworks/Python/japronto/japronto.dockerfile
deleted file mode 100644
index eb91bb3dfa1..00000000000
--- a/frameworks/Python/japronto/japronto.dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM python:3.8.12
-
-ADD ./ /japronto
-
-WORKDIR /japronto
-
-RUN pip3 install -r /japronto/requirements.txt
-
-EXPOSE 8080
-
-CMD python3 app.py
diff --git a/frameworks/Python/japronto/requirements.txt b/frameworks/Python/japronto/requirements.txt
deleted file mode 100644
index e3564875559..00000000000
--- a/frameworks/Python/japronto/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-uvloop==0.17.0
-git+https://github.com/squeaky-pl/japronto.git#egg=japronto
-asyncpg==0.27.0
-ujson==5.4.0
diff --git a/frameworks/Python/japronto/requirements_postgres.txt b/frameworks/Python/japronto/requirements_postgres.txt
deleted file mode 100644
index 9b268878800..00000000000
--- a/frameworks/Python/japronto/requirements_postgres.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-git+https://github.com/IterableTrucks/japronto.git@0d848d96dd010f6701729b14e6b8ec0330002b5c
-asyncpg==0.25.0
-ujson==5.4.0
diff --git a/frameworks/Python/routerling/README.md b/frameworks/Python/routerling/README.md
deleted file mode 100755
index 2e4cb9faa5a..00000000000
--- a/frameworks/Python/routerling/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Routerling Benchmarking Test
-
-This is the Routerling portion of a [benchmarking tests suite](../../)
-comparing a variety of web development platforms.
-
-The information below is specific to Routerling. For further guidance,
-review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki).
-Also note that there is additional information provided in
-the [Python README](../).
-
-## Description
-
-[Routerling](https://github.com/rayattack/pyrouterling) is a lightweight ASGI framework.
-
-## Test Paths & Sources
-
-All of the test implementations are located within a single file ([app.py](app.py)).
-
-## Resources
-
-* [Routerling on GitHub](https://github.com/rayattack/pyrouterling)
-* [ASGI specification](https://asgi.readthedocs.io/en/latest/)
diff --git a/frameworks/Python/routerling/app.py b/frameworks/Python/routerling/app.py
deleted file mode 100644
index 291d5da2653..00000000000
--- a/frameworks/Python/routerling/app.py
+++ /dev/null
@@ -1,170 +0,0 @@
-import asyncio
-import asyncpg
-import jinja2
-import os
-import ujson
-from random import randint
-from operator import itemgetter
-from urllib.parse import parse_qs
-
-from routerling import Router
-
-
-router = Router()
-
-
-async def setup():
- global pool
- pool = await asyncpg.create_pool(
- user=os.getenv('PGUSER', 'benchmarkdbuser'),
- password=os.getenv('PGPASS', 'benchmarkdbpass'),
- database='hello_world',
- host='tfb-database',
- port=5432
- )
-
-
-CONTENT_TYPE = 'Content-Type'
-JSON = 'application/json'
-
-READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
-WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2'
-ADDITIONAL_ROW = [0, 'Additional fortune added at request time.']
-
-
-pool = None
-key = itemgetter(1)
-json_dumps = ujson.dumps
-template = None
-path = os.path.join('templates', 'fortune.html')
-with open(path, 'r') as template_file:
- template_text = template_file.read()
- template = jinja2.Template(template_text)
-
-loop = asyncio.get_event_loop()
-loop.run_until_complete(setup())
-
-
-def get_num_queries(scope):
- try:
- query_string = scope['query_string']
- query_count = int(parse_qs(query_string)[b'queries'][0])
- except (KeyError, IndexError, ValueError):
- return 1
-
- if query_count < 1:
- return 1
- if query_count > 500:
- return 500
- return query_count
-
-
-async def json_serialization(r, w, c):
- """
- Test type 1: JSON Serialization
- """
- content = json_dumps({'message': 'Hello, world!'})
- w.headers = CONTENT_TYPE, JSON
- w.body = content
-
-
-async def single_database_query(r, w, c):
- """
- Test type 2: Single database object
- """
- row_id = randint(1, 10000)
- connection = await pool.acquire()
- try:
- number = await connection.fetchval(READ_ROW_SQL, row_id)
- world = {'id': row_id, 'randomNumber': number}
- finally:
- await pool.release(connection)
-
- content = json_dumps(world).encode('utf-8')
- w.headers = CONTENT_TYPE, JSON
- w.body = content
-
-
-async def multiple_database_queries(r, w, c):
- """
- Test type 3: Multiple database queries
- """
- num_queries = get_num_queries(r._scope)
- row_ids = [randint(1, 10000) for _ in range(num_queries)]
- worlds = []
-
- connection = await pool.acquire()
- try:
- statement = await connection.prepare(READ_ROW_SQL)
- for row_id in row_ids:
- number = await statement.fetchval(row_id)
- worlds.append({'id': row_id, 'randomNumber': number})
- finally:
- await pool.release(connection)
-
- content = json_dumps(worlds).encode('utf-8')
- w.headers = CONTENT_TYPE, JSON
- w.body = content
-
-
-async def fortunes(r, w, c):
- """
- Test type 4: Fortunes
- """
- connection = await pool.acquire()
- try:
- fortunes = await connection.fetch('SELECT * FROM Fortune')
- finally:
- await pool.release(connection)
-
- fortunes.append(ADDITIONAL_ROW)
- fortunes.sort(key=key)
- content = template.render(fortunes=fortunes).encode('utf-8')
- w.headers = CONTENT_TYPE, 'text/html; charset=utf-8'
- w.body = content
-
-
-async def database_updates(r, w, c):
- """
- Test type 5: Database updates
- """
- num_queries = get_num_queries(r._scope)
- updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)]
- worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates]
-
- connection = await pool.acquire()
- try:
- statement = await connection.prepare(READ_ROW_SQL)
- for row_id, _ in updates:
- await statement.fetchval(row_id)
- await connection.executemany(WRITE_ROW_SQL, updates)
- finally:
- await pool.release(connection)
-
- content = json_dumps(worlds).encode('utf-8')
- w.headers = CONTENT_TYPE, JSON
- w.body = content
-
-
-async def plaintext(r, w, c):
- """
- Test type 6: Plaintext
- """
- content = 'Hello, world!'
- w.headers = CONTENT_TYPE, 'text/plain; charset=utf-8'
- w.body = content
-
-
-async def handle_404(r, w, c):
- content = b'Not found'
- w.headers = CONTENT_TYPE, b'text/plain; charset=utf-8'
- w.body = content
-
-
-
-router.HTTP('/json', json_serialization)
-router.HTTP('/db', single_database_query)
-router.HTTP('/queries', multiple_database_queries)
-router.HTTP('/fortunes', fortunes)
-router.HTTP('/updates', database_updates)
-router.HTTP('/plaintext', plaintext)
diff --git a/frameworks/Python/routerling/benchmark_config.json b/frameworks/Python/routerling/benchmark_config.json
deleted file mode 100755
index 7ec9ca2895e..00000000000
--- a/frameworks/Python/routerling/benchmark_config.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "framework": "routerling",
- "tests": [{
- "default": {
- "json_url": "/json",
- "fortune_url": "/fortunes",
- "plaintext_url": "/plaintext",
- "db_url": "/db",
- "query_url": "/queries?queries=",
- "update_url": "/updates?queries=",
- "port": 8080,
- "approach": "Realistic",
- "classification": "Platform",
- "framework": "uvicorn",
- "language": "Python",
- "flavor": "Python3",
- "platform": "None",
- "webserver": "None",
- "os": "Linux",
- "orm": "Raw",
- "database_os": "Linux",
- "database": "Postgres",
- "display_name": "routerling",
- "notes": ""
- }
- }]
-}
diff --git a/frameworks/Python/routerling/config.toml b/frameworks/Python/routerling/config.toml
deleted file mode 100644
index daf63bdbf08..00000000000
--- a/frameworks/Python/routerling/config.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[framework]
-name = "routerling"
-
-[main]
-urls.plaintext = "/plaintext"
-urls.json = "/json"
-urls.db = "/db"
-urls.query = "/queries?queries="
-urls.update = "/updates?queries="
-urls.fortune = "/fortunes"
-approach = "Realistic"
-classification = "Platform"
-database = "Postgres"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = "None"
-webserver = "None"
-versus = "None"
\ No newline at end of file
diff --git a/frameworks/Python/routerling/requirements.txt b/frameworks/Python/routerling/requirements.txt
deleted file mode 100644
index 9653371b503..00000000000
--- a/frameworks/Python/routerling/requirements.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-asgiref==3.4.1
-asyncpg==0.24.0
-click==8.0.1
-gunicorn==22.0.0
-h11==0.16.0
-Jinja2==3.1.4
-MarkupSafe==2.0.1
-routerling==0.3.1
-ujson==5.4.0
-uvloop==0.16.0
-uvicorn==0.14.0
diff --git a/frameworks/Python/routerling/routerling.dockerfile b/frameworks/Python/routerling/routerling.dockerfile
deleted file mode 100644
index e46173e71e9..00000000000
--- a/frameworks/Python/routerling/routerling.dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM python:3.8
-
-WORKDIR /routerling
-
-RUN pip3 install cython==0.29.13
-
-ADD requirements.txt /routerling/
-
-RUN pip3 install -r /routerling/requirements.txt
-
-ADD templates/fortune.html /routerling/templates/
-
-ADD settings.py app.py /routerling/
-
-EXPOSE 8080
-
-CMD gunicorn app:router -k uvicorn.workers.UvicornWorker -c settings.py
\ No newline at end of file
diff --git a/frameworks/Python/routerling/settings.py b/frameworks/Python/routerling/settings.py
deleted file mode 100644
index 295745226cd..00000000000
--- a/frameworks/Python/routerling/settings.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import multiprocessing
-import os
-
-_is_travis = os.environ.get('TRAVIS') == 'true'
-
-workers = multiprocessing.cpu_count()
-if _is_travis:
- workers = 2
-
-bind = "0.0.0.0:8080"
-keepalive = 120
-errorlog = '-'
-pidfile = '/tmp/routerling.pid'
-loglevel = 'error'
diff --git a/frameworks/Python/routerling/templates/fortune.html b/frameworks/Python/routerling/templates/fortune.html
deleted file mode 100644
index 244205144fd..00000000000
--- a/frameworks/Python/routerling/templates/fortune.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Fortunes
-
-
-
-
- | id | message |
-
- {% for fortune in fortunes %}
-
- | {{ fortune[0] }} | {{ fortune[1]|e }} |
-
- {% endfor %}
-
-
-
\ No newline at end of file