Browse Source

fix: remove unmaintained python packages (#9904)

Vetrichelvan 2 months ago
parent
commit
69df72fd2a
44 changed files with 0 additions and 1825 deletions
  1. 0 25
      frameworks/Python/apidaora/README.md
  2. 0 17
      frameworks/Python/apidaora/apidaora-core.dockerfile
  3. 0 17
      frameworks/Python/apidaora/apidaora.dockerfile
  4. 0 14
      frameworks/Python/apidaora/apidaora_conf.py
  5. 0 14
      frameworks/Python/apidaora/apidaora_core_conf.py
  6. 0 144
      frameworks/Python/apidaora/app.py
  7. 0 53
      frameworks/Python/apidaora/benchmark_config.json
  8. 0 36
      frameworks/Python/apidaora/config.toml
  9. 0 143
      frameworks/Python/apidaora/coreapp.py
  10. 0 6
      frameworks/Python/apidaora/requirements.txt
  11. 0 10
      frameworks/Python/apidaora/templates/fortune.html
  12. 0 17
      frameworks/Python/async-worker/Pipfile
  13. 0 440
      frameworks/Python/async-worker/Pipfile.lock
  14. 0 14
      frameworks/Python/async-worker/README.md
  15. 0 19
      frameworks/Python/async-worker/async-worker.dockerfile
  16. 0 20
      frameworks/Python/async-worker/benchmark_config.json
  17. 0 0
      frameworks/Python/async-worker/src/__init__.py
  18. 0 18
      frameworks/Python/async-worker/src/hello_world.py
  19. 0 22
      frameworks/Python/bareasgi/README.md
  20. 0 136
      frameworks/Python/bareasgi/app.py
  21. 0 11
      frameworks/Python/bareasgi/bareasgi.dockerfile
  22. 0 30
      frameworks/Python/bareasgi/benchmark_config.json
  23. 0 19
      frameworks/Python/bareasgi/config.toml
  24. 0 13
      frameworks/Python/bareasgi/hypercorn_conf.py
  25. 0 17
      frameworks/Python/bareasgi/requirements.txt
  26. 0 10
      frameworks/Python/bareasgi/templates/fortune.html
  27. 0 21
      frameworks/Python/japronto/README.md
  28. 0 78
      frameworks/Python/japronto/app.py
  29. 0 51
      frameworks/Python/japronto/app_postgres.py
  30. 0 23
      frameworks/Python/japronto/benchmark_config.json
  31. 0 15
      frameworks/Python/japronto/config.toml
  32. 0 45
      frameworks/Python/japronto/db.py
  33. 0 11
      frameworks/Python/japronto/japronto-postgres.dockerfile
  34. 0 11
      frameworks/Python/japronto/japronto.dockerfile
  35. 0 4
      frameworks/Python/japronto/requirements.txt
  36. 0 3
      frameworks/Python/japronto/requirements_postgres.txt
  37. 0 22
      frameworks/Python/routerling/README.md
  38. 0 170
      frameworks/Python/routerling/app.py
  39. 0 27
      frameworks/Python/routerling/benchmark_config.json
  40. 0 19
      frameworks/Python/routerling/config.toml
  41. 0 11
      frameworks/Python/routerling/requirements.txt
  42. 0 17
      frameworks/Python/routerling/routerling.dockerfile
  43. 0 14
      frameworks/Python/routerling/settings.py
  44. 0 18
      frameworks/Python/routerling/templates/fortune.html

+ 0 - 25
frameworks/Python/apidaora/README.md

@@ -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 <b>dataclasses</b> and <b>TypedDict</b> 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/)

+ 0 - 17
frameworks/Python/apidaora/apidaora-core.dockerfile

@@ -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

+ 0 - 17
frameworks/Python/apidaora/apidaora.dockerfile

@@ -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

+ 0 - 14
frameworks/Python/apidaora/apidaora_conf.py

@@ -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'

+ 0 - 14
frameworks/Python/apidaora/apidaora_core_conf.py

@@ -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'

+ 0 - 144
frameworks/Python/apidaora/app.py

@@ -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())
-
-
[email protected]('/json')
-async def json_serialization():
-    return {'message': 'Hello, world!'}
-
-
-class DatabaseObject(TypedDict):
-    id: int
-    randomNumber: float
-
-
[email protected]('/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)
-
-
[email protected]('/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
-
-
[email protected]('/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)
-
-
[email protected]('/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
-
-
[email protected]('/plaintext')
-async def plaintext():
-    return text('Hello, world!')
-
-
-app = appdaora([
-    json_serialization,
-    single_database_query,
-    multiple_database_queries,
-    fortunes,
-    database_updates,
-    plaintext
-])

+ 0 - 53
frameworks/Python/apidaora/benchmark_config.json

@@ -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"
-      }
-    }
-  ]
-}

+ 0 - 36
frameworks/Python/apidaora/config.toml

@@ -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"

+ 0 - 143
frameworks/Python/apidaora/coreapp.py

@@ -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)

+ 0 - 6
frameworks/Python/apidaora/requirements.txt

@@ -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

+ 0 - 10
frameworks/Python/apidaora/templates/fortune.html

@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-<tr><th>id</th><th>message</th></tr>
-{% for fortune in fortunes %}<tr><td>{{ fortune[0] }}</td><td>{{ fortune[1]|e }}</td></tr>
-{% endfor %}</table>
-</body>
-</html>

+ 0 - 17
frameworks/Python/async-worker/Pipfile

@@ -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

+ 0 - 440
frameworks/Python/async-worker/Pipfile.lock

@@ -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"
-        }
-    }
-}

+ 0 - 14
frameworks/Python/async-worker/README.md

@@ -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

+ 0 - 19
frameworks/Python/async-worker/async-worker.dockerfile

@@ -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"]

+ 0 - 20
frameworks/Python/async-worker/benchmark_config.json

@@ -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"
-    }
-  }]
-}

+ 0 - 0
frameworks/Python/async-worker/src/__init__.py


+ 0 - 18
frameworks/Python/async-worker/src/hello_world.py

@@ -1,18 +0,0 @@
-from aiohttp import web
-from asyncworker import App
-
-app = App()
-
-
[email protected](["/plaintext"])
-async def handler(request: web.Request) -> web.Response:
-    return web.Response(body="Hello, World!")
-
-
[email protected](["/json"])
-async def handler(request: web.Request) -> web.Response:
-    return web.json_response({"message": "Hello, World!"})
-
-
-if __name__ == "__main__":
-    app.run()

+ 0 - 22
frameworks/Python/bareasgi/README.md

@@ -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/)

+ 0 - 136
frameworks/Python/bareasgi/app.py

@@ -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)

+ 0 - 11
frameworks/Python/bareasgi/bareasgi.dockerfile

@@ -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

+ 0 - 30
frameworks/Python/bareasgi/benchmark_config.json

@@ -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"
-      }
-    }
-  ]
-}

+ 0 - 19
frameworks/Python/bareasgi/config.toml

@@ -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"

+ 0 - 13
frameworks/Python/bareasgi/hypercorn_conf.py

@@ -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"

+ 0 - 17
frameworks/Python/bareasgi/requirements.txt

@@ -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

+ 0 - 10
frameworks/Python/bareasgi/templates/fortune.html

@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-<tr><th>id</th><th>message</th></tr>
-{% for fortune in fortunes %}<tr><td>{{ fortune[0] }}</td><td>{{ fortune[1]|e }}</td></tr>
-{% endfor %}</table>
-</body>
-</html>

+ 0 - 21
frameworks/Python/japronto/README.md

@@ -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"

+ 0 - 78
frameworks/Python/japronto/app.py

@@ -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)

+ 0 - 51
frameworks/Python/japronto/app_postgres.py

@@ -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())

+ 0 - 23
frameworks/Python/japronto/benchmark_config.json

@@ -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": ""
-    }
-  }]
-}

+ 0 - 15
frameworks/Python/japronto/config.toml

@@ -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"

+ 0 - 45
frameworks/Python/japronto/db.py

@@ -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)

+ 0 - 11
frameworks/Python/japronto/japronto-postgres.dockerfile

@@ -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

+ 0 - 11
frameworks/Python/japronto/japronto.dockerfile

@@ -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

+ 0 - 4
frameworks/Python/japronto/requirements.txt

@@ -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

+ 0 - 3
frameworks/Python/japronto/requirements_postgres.txt

@@ -1,3 +0,0 @@
-git+https://github.com/IterableTrucks/japronto.git@0d848d96dd010f6701729b14e6b8ec0330002b5c
-asyncpg==0.25.0
-ujson==5.4.0

+ 0 - 22
frameworks/Python/routerling/README.md

@@ -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/)

+ 0 - 170
frameworks/Python/routerling/app.py

@@ -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)

+ 0 - 27
frameworks/Python/routerling/benchmark_config.json

@@ -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": ""
-    }
-  }]
-}

+ 0 - 19
frameworks/Python/routerling/config.toml

@@ -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"

+ 0 - 11
frameworks/Python/routerling/requirements.txt

@@ -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

+ 0 - 17
frameworks/Python/routerling/routerling.dockerfile

@@ -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

+ 0 - 14
frameworks/Python/routerling/settings.py

@@ -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'

+ 0 - 18
frameworks/Python/routerling/templates/fortune.html

@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>Fortunes</title>
-    </head>
-    <body>
-        <table>
-            <tr>
-                <th>id</th><th>message</th>
-            </tr>
-            {% for fortune in fortunes %}
-            <tr>
-                <td>{{ fortune[0] }}</td><td>{{ fortune[1]|e }}</td>
-            </tr>
-            {% endfor %}
-        </table>
-    </body>
-</html>