diff --git a/.circleci/config.templ.yml b/.circleci/config.templ.yml
index ae4a1b99f6b..42b60eddb3a 100644
--- a/.circleci/config.templ.yml
+++ b/.circleci/config.templ.yml
@@ -78,7 +78,7 @@ commands:
description: "Install riot"
steps:
# Make sure we install and run riot on Python 3
- - run: pip3 install riot==0.17.7
+ - run: pip3 install riot==0.19.0
setup_hatch:
description: "Install hatch"
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 260901772ef..1c910518daa 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -30,7 +30,7 @@ jobs:
- run:
name: Generate config
command: |
- pip3 install riot==0.17.7
+ pip3 install riot==0.19.0
riot -v run --pass-env -s circleci-gen-config -- -v
- continuation/continue:
configuration_path: .circleci/config.gen.yml
diff --git a/.riot/requirements/103019c.txt b/.riot/requirements/103019c.txt
deleted file mode 100644
index 9b43cc9ea6e..00000000000
--- a/.riot/requirements/103019c.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/103019c.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==23.1.0
diff --git a/.riot/requirements/1036992.txt b/.riot/requirements/1036992.txt
new file mode 100644
index 00000000000..029e9787ba4
--- /dev/null
+++ b/.riot/requirements/1036992.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1036992.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1037a9e.txt b/.riot/requirements/1037a9e.txt
new file mode 100644
index 00000000000..c5f8a5bc073
--- /dev/null
+++ b/.riot/requirements/1037a9e.txt
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1037a9e.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.3.2
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
diff --git a/.riot/requirements/1043965.txt b/.riot/requirements/1043965.txt
new file mode 100644
index 00000000000..a4173d3daa3
--- /dev/null
+++ b/.riot/requirements/1043965.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1043965.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1085954.txt b/.riot/requirements/1085954.txt
deleted file mode 100644
index 6d71b5d1812..00000000000
--- a/.riot/requirements/1085954.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1085954.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-protobuf==3.19.0
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.1.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/1da96d1.txt b/.riot/requirements/10d77cd.txt
similarity index 68%
rename from .riot/requirements/1da96d1.txt
rename to .riot/requirements/10d77cd.txt
index 920b7d48499..58d965049e0 100644
--- a/.riot/requirements/1da96d1.txt
+++ b/.riot/requirements/10d77cd.txt
@@ -1,22 +1,19 @@
#
-# This file is autogenerated by pip-compile with Python 3.11
+# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1da96d1.in
+# pip-compile --no-annotate --resolver=backtracking .riot/requirements/8071a9d.in
#
attrs==22.2.0
coverage[toml]==7.2.2
-httpretty==0.9.7
hypothesis==6.45.0
iniconfig==2.0.0
mock==5.0.1
-msgpack==1.0.5
+mysqlclient==2.1.1
opentracing==2.4.0
packaging==23.0
pluggy==1.0.0
pytest==7.2.2
pytest-cov==4.0.0
pytest-mock==3.10.0
-six==1.16.0
sortedcontainers==2.4.0
-structlog==22.3.0
diff --git a/.riot/requirements/10faaef.txt b/.riot/requirements/10faaef.txt
new file mode 100644
index 00000000000..a0a29b33cb3
--- /dev/null
+++ b/.riot/requirements/10faaef.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/10faaef.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/10fb966.txt b/.riot/requirements/10fb966.txt
new file mode 100644
index 00000000000..4981649a4fe
--- /dev/null
+++ b/.riot/requirements/10fb966.txt
@@ -0,0 +1,33 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/10fb966.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+tomli==2.0.1
+urllib3==2.0.4
+werkzeug==2.3.7
diff --git a/.riot/requirements/1108166.txt b/.riot/requirements/1108166.txt
new file mode 100644
index 00000000000..efe8758a49f
--- /dev/null
+++ b/.riot/requirements/1108166.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1108166.in
+#
+attrs==23.1.0
+beautifulsoup4==4.12.2
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+soupsieve==2.4.1
+waitress==2.1.2
+webob==1.8.7
+webtest==3.0.0
diff --git a/.riot/requirements/115000b.txt b/.riot/requirements/115000b.txt
new file mode 100644
index 00000000000..d5084a6a6bf
--- /dev/null
+++ b/.riot/requirements/115000b.txt
@@ -0,0 +1,56 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/115000b.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+autobahn==23.6.2
+automat==22.10.0
+certifi==2023.7.22
+cffi==1.15.1
+channels==4.0.0
+charset-normalizer==3.2.0
+constantly==15.1.0
+coverage[toml]==7.2.7
+cryptography==41.0.3
+daphne==4.0.0
+django==4.2.4
+django-pylibmc==0.6.1
+django-redis==4.5.0
+hyperlink==21.0.0
+hypothesis==6.45.0
+idna==3.4
+incremental==22.10.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+psycopg==3.1.10
+psycopg2-binary==2.9.7
+pyasn1==0.5.0
+pyasn1-modules==0.3.0
+pycparser==2.21
+pylibmc==1.6.3
+pyopenssl==23.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+python-memcached==1.59
+redis==2.10.6
+requests==2.31.0
+service-identity==23.1.0
+six==1.16.0
+sortedcontainers==2.4.0
+sqlparse==0.4.4
+twisted[tls]==22.10.0
+txaio==23.1.1
+typing-extensions==4.7.1
+urllib3==2.0.4
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/115be7b.txt b/.riot/requirements/115be7b.txt
new file mode 100644
index 00000000000..bb4baf753f0
--- /dev/null
+++ b/.riot/requirements/115be7b.txt
@@ -0,0 +1,35 @@
+#
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/115be7b.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.8.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+tomli==2.0.1
+urllib3==2.0.4
+werkzeug==2.3.7
+zipp==3.16.2
diff --git a/.riot/requirements/11673f8.txt b/.riot/requirements/11673f8.txt
new file mode 100644
index 00000000000..e336f34073b
--- /dev/null
+++ b/.riot/requirements/11673f8.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/11673f8.in
+#
+algoliasearch==2.6.3
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/8fe2e58.txt b/.riot/requirements/1167a5a.txt
similarity index 59%
rename from .riot/requirements/8fe2e58.txt
rename to .riot/requirements/1167a5a.txt
index f481d453ad3..ca4ce2e69ed 100644
--- a/.riot/requirements/8fe2e58.txt
+++ b/.riot/requirements/1167a5a.txt
@@ -2,28 +2,28 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/8fe2e58.in
+# pip-compile --no-annotate .riot/requirements/1167a5a.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
+coverage[toml]==7.3.0
gevent==22.10.2
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/118b2b0.txt b/.riot/requirements/118b2b0.txt
new file mode 100644
index 00000000000..1f1c47f96c1
--- /dev/null
+++ b/.riot/requirements/118b2b0.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/118b2b0.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/11b75a6.txt b/.riot/requirements/11b75a6.txt
new file mode 100644
index 00000000000..2bc878fbbca
--- /dev/null
+++ b/.riot/requirements/11b75a6.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/11b75a6.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch5==5.5.6
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/11c9b11.txt b/.riot/requirements/11c9b11.txt
new file mode 100644
index 00000000000..766681b51b3
--- /dev/null
+++ b/.riot/requirements/11c9b11.txt
@@ -0,0 +1,32 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/11c9b11.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.3.2
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.0.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
+zipp==3.16.2
diff --git a/.riot/requirements/11ec1d1.txt b/.riot/requirements/11ec1d1.txt
new file mode 100644
index 00000000000..c51d8b08fbf
--- /dev/null
+++ b/.riot/requirements/11ec1d1.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/11ec1d1.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+elastic-transport==8.4.0
+elasticsearch8==8.9.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/11ef2c8.txt b/.riot/requirements/11ef2c8.txt
new file mode 100644
index 00000000000..21161c10979
--- /dev/null
+++ b/.riot/requirements/11ef2c8.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/11ef2c8.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/12115db.txt b/.riot/requirements/12115db.txt
deleted file mode 100644
index 6760b1e2241..00000000000
--- a/.riot/requirements/12115db.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.7
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/12115db.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
-hypothesis==6.45.0
-importlib-metadata==6.6.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-protobuf==4.23.2
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.1.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-typing-extensions==4.7.0
-uwsgi==2.0.21
-zipp==3.15.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/1238375.txt b/.riot/requirements/1238375.txt
new file mode 100644
index 00000000000..eb22e68a4d9
--- /dev/null
+++ b/.riot/requirements/1238375.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1238375.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+decorator==5.1.1
+dogpile-cache==1.2.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pbr==5.11.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+stevedore==5.1.0
diff --git a/.riot/requirements/126287a.txt b/.riot/requirements/126287a.txt
new file mode 100644
index 00000000000..d1f75e7526b
--- /dev/null
+++ b/.riot/requirements/126287a.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/126287a.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opensearch-py[requests]==1.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/127998e.txt b/.riot/requirements/127998e.txt
new file mode 100644
index 00000000000..eec1c09dffb
--- /dev/null
+++ b/.riot/requirements/127998e.txt
@@ -0,0 +1,27 @@
+#
+# This file is autogenerated by pip-compile with Python 3.7
+# by the following command:
+#
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/127998e.in
+#
+attrs==20.1.0
+coverage[toml]==7.2.7
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+importlib-metadata==6.7.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+typing-extensions==4.7.1
+wheel==0.41.2
+zipp==3.15.0
diff --git a/.riot/requirements/1288133.txt b/.riot/requirements/1288133.txt
new file mode 100644
index 00000000000..e8e5705ba02
--- /dev/null
+++ b/.riot/requirements/1288133.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1288133.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opensearch-py[requests]==2.0.1
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/128d117.txt b/.riot/requirements/128d117.txt
new file mode 100644
index 00000000000..7e611e8455b
--- /dev/null
+++ b/.riot/requirements/128d117.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/128d117.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+h11==0.14.0
+httpcore==0.12.3
+httpx==0.17.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+rfc3986[idna2008]==1.5.0
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/12a04f4.txt b/.riot/requirements/12a04f4.txt
new file mode 100644
index 00000000000..b57483ac151
--- /dev/null
+++ b/.riot/requirements/12a04f4.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/12a04f4.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/12b1643.txt b/.riot/requirements/12b1643.txt
deleted file mode 100644
index 4fb1db9f409..00000000000
--- a/.riot/requirements/12b1643.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/12b1643.in
-#
-attrs==23.1.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-flask==2.2.3
-gunicorn==20.1.0
-httpretty==0.9.7
-hypothesis==6.45.0
-idna==3.4
-importlib-metadata==6.6.0
-iniconfig==2.0.0
-itsdangerous==2.1.2
-jinja2==3.1.2
-markupsafe==2.1.2
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-requests==2.29.0
-six==1.16.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-urllib3==1.26.15
-werkzeug==2.3.0
-zipp==3.15.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/12ff32e.txt b/.riot/requirements/12ff32e.txt
new file mode 100644
index 00000000000..e9534483387
--- /dev/null
+++ b/.riot/requirements/12ff32e.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/12ff32e.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymysql==1.1.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1ee1d52.txt b/.riot/requirements/1353fd0.txt
similarity index 61%
rename from .riot/requirements/1ee1d52.txt
rename to .riot/requirements/1353fd0.txt
index 74b44a53b32..d8b18bdb4ef 100644
--- a/.riot/requirements/1ee1d52.txt
+++ b/.riot/requirements/1353fd0.txt
@@ -2,22 +2,21 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1ee1d52.in
+# pip-compile --no-annotate .riot/requirements/1353fd0.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
-httpretty==0.9.7
+coverage[toml]==7.3.0
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
pytest==7.4.0
-pytest-asyncio==0.21.0
+pytest-asyncio==0.21.1
pytest-cov==4.1.0
pytest-mock==3.11.1
-six==1.16.0
sortedcontainers==2.4.0
typing-extensions==4.7.1
diff --git a/.riot/requirements/17b171a.txt b/.riot/requirements/1398072.txt
similarity index 54%
rename from .riot/requirements/17b171a.txt
rename to .riot/requirements/1398072.txt
index 2c1c4eb4168..bc70bc8a51e 100644
--- a/.riot/requirements/17b171a.txt
+++ b/.riot/requirements/1398072.txt
@@ -2,28 +2,27 @@
# This file is autogenerated by pip-compile with Python 3.8
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/17b171a.in
+# pip-compile --no-annotate .riot/requirements/1398072.in
#
attrs==23.1.0
-coverage[toml]==7.2.5
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-httpretty==0.9.7
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/139c624.txt b/.riot/requirements/139c624.txt
deleted file mode 100644
index f722d561901..00000000000
--- a/.riot/requirements/139c624.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.8
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/139c624.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-gevent==20.6.1
-greenlet==0.4.16
-gunicorn[gevent]==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
-zope-interface==6.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/13a3198.txt b/.riot/requirements/13a3198.txt
new file mode 100644
index 00000000000..7eecb08c2de
--- /dev/null
+++ b/.riot/requirements/13a3198.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/13a3198.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1405df5.txt b/.riot/requirements/1405df5.txt
new file mode 100644
index 00000000000..55126e5eb9a
--- /dev/null
+++ b/.riot/requirements/1405df5.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1405df5.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==3.19.0
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+tomli==2.0.1
+uwsgi==2.0.22
diff --git a/.riot/requirements/1431312.txt b/.riot/requirements/1431312.txt
deleted file mode 100644
index dc4a4ec104b..00000000000
--- a/.riot/requirements/1431312.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1431312.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-protobuf==4.23.2
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.1.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/143e207.txt b/.riot/requirements/143e207.txt
deleted file mode 100644
index 5560574b83a..00000000000
--- a/.riot/requirements/143e207.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.7
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/143e207.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-importlib-metadata==6.0.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
-typing-extensions==4.7.0
-zipp==3.15.0
diff --git a/.riot/requirements/1458cd8.txt b/.riot/requirements/1458cd8.txt
new file mode 100644
index 00000000000..19b3c4c0ed4
--- /dev/null
+++ b/.riot/requirements/1458cd8.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1458cd8.in
+#
+attrs==23.1.0
+cattrs==22.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+molten==1.0.2
+mypy-extensions==1.0.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+typing-extensions==3.10.0.2
+typing-inspect==0.6.0
diff --git a/.riot/requirements/14ba6b2.txt b/.riot/requirements/14ba6b2.txt
new file mode 100644
index 00000000000..a6c55d9f069
--- /dev/null
+++ b/.riot/requirements/14ba6b2.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/14ba6b2.in
+#
+aniso8601==9.0.1
+attrs==23.1.0
+coverage[toml]==7.2.7
+graphene==3.0
+graphql-core==3.1.7
+graphql-relay==3.1.5
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/14f0bdd.txt b/.riot/requirements/14f0bdd.txt
new file mode 100644
index 00000000000..ab0b479939c
--- /dev/null
+++ b/.riot/requirements/14f0bdd.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/14f0bdd.in
+#
+anyio==3.7.1
+asgiref==3.0.0
+async-timeout==3.0.1
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/14ffec7.txt b/.riot/requirements/14ffec7.txt
deleted file mode 100644
index e595f501857..00000000000
--- a/.riot/requirements/14ffec7.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/14ffec7.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==23.1.0
diff --git a/.riot/requirements/153fe5b.txt b/.riot/requirements/153fe5b.txt
new file mode 100644
index 00000000000..16cd665ac74
--- /dev/null
+++ b/.riot/requirements/153fe5b.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/153fe5b.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1540a76.txt b/.riot/requirements/1540a76.txt
new file mode 100644
index 00000000000..077ec4693fe
--- /dev/null
+++ b/.riot/requirements/1540a76.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1540a76.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.1
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.2
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+typing-extensions==4.7.1
diff --git a/.riot/requirements/1562ac8.txt b/.riot/requirements/1562ac8.txt
new file mode 100644
index 00000000000..6fe02a6fb97
--- /dev/null
+++ b/.riot/requirements/1562ac8.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1562ac8.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch2==2.5.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/15ae61d.txt b/.riot/requirements/15ae61d.txt
new file mode 100644
index 00000000000..0f3d7f7820e
--- /dev/null
+++ b/.riot/requirements/15ae61d.txt
@@ -0,0 +1,38 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/15ae61d.in
+#
+annotated-types==0.5.0
+attrs==23.1.0
+autocommand==2.2.2
+cheroot==10.0.0
+cherrypy==18.8.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+inflect==7.0.0
+iniconfig==2.0.0
+jaraco-collections==4.3.0
+jaraco-context==4.3.0
+jaraco-functools==3.8.1
+jaraco-text==3.11.1
+mock==5.1.0
+more-itertools==8.10.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+portend==3.2.0
+pydantic==2.1.1
+pydantic-core==2.4.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+tempora==5.5.0
+typing-extensions==4.7.1
+zc-lockfile==3.0.post1
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/61fd204.txt b/.riot/requirements/15d434b.txt
similarity index 54%
rename from .riot/requirements/61fd204.txt
rename to .riot/requirements/15d434b.txt
index d2b3cc04800..01324e80ea9 100644
--- a/.riot/requirements/61fd204.txt
+++ b/.riot/requirements/15d434b.txt
@@ -2,28 +2,27 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/61fd204.in
+# pip-compile --no-annotate .riot/requirements/15d434b.in
#
attrs==23.1.0
-coverage[toml]==7.2.5
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-httpretty==0.9.7
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/15e629e.txt b/.riot/requirements/15e629e.txt
new file mode 100644
index 00000000000..d23735e745c
--- /dev/null
+++ b/.riot/requirements/15e629e.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/15e629e.in
+#
+amqp==5.1.1
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+kombu==5.3.1
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+vine==5.0.0
diff --git a/.riot/requirements/165caef.txt b/.riot/requirements/165caef.txt
new file mode 100644
index 00000000000..f3678d7dc52
--- /dev/null
+++ b/.riot/requirements/165caef.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/165caef.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+dnspython==2.4.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+mongoengine==0.27.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymongo==4.4.1
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/168915b.txt b/.riot/requirements/168915b.txt
new file mode 100644
index 00000000000..89245fe5d06
--- /dev/null
+++ b/.riot/requirements/168915b.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/168915b.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/65c8aef.txt b/.riot/requirements/1693ec0.txt
similarity index 58%
rename from .riot/requirements/65c8aef.txt
rename to .riot/requirements/1693ec0.txt
index cb005781016..911e2ef1a80 100644
--- a/.riot/requirements/65c8aef.txt
+++ b/.riot/requirements/1693ec0.txt
@@ -2,30 +2,30 @@
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/65c8aef.in
+# pip-compile --no-annotate .riot/requirements/1693ec0.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
gevent==21.8.0
greenlet==1.1.0
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/16aae71.txt b/.riot/requirements/16aae71.txt
new file mode 100644
index 00000000000..2550acefa8f
--- /dev/null
+++ b/.riot/requirements/16aae71.txt
@@ -0,0 +1,36 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/16aae71.in
+#
+aiofiles==23.2.1
+annotated-types==0.5.0
+anyio==3.7.1
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+fastapi==0.101.0
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pydantic==2.1.1
+pydantic-core==2.4.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sniffio==1.3.0
+sortedcontainers==2.4.0
+starlette==0.27.0
+typing-extensions==4.7.1
+urllib3==2.0.4
diff --git a/.riot/requirements/197d9d9.txt b/.riot/requirements/16b0e2d.txt
similarity index 57%
rename from .riot/requirements/197d9d9.txt
rename to .riot/requirements/16b0e2d.txt
index d8370480802..29576482b27 100644
--- a/.riot/requirements/197d9d9.txt
+++ b/.riot/requirements/16b0e2d.txt
@@ -2,28 +2,28 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate .riot/requirements/197d9d9.in
+# pip-compile --no-annotate .riot/requirements/16b0e2d.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-gevent==22.10.2
+coverage[toml]==7.3.0
+gevent==23.7.0
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/16d62ae.txt b/.riot/requirements/16d62ae.txt
new file mode 100644
index 00000000000..830563ceed7
--- /dev/null
+++ b/.riot/requirements/16d62ae.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/16d62ae.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/171ef96.txt b/.riot/requirements/171ef96.txt
new file mode 100644
index 00000000000..701704f3df5
--- /dev/null
+++ b/.riot/requirements/171ef96.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/171ef96.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymemcache==3.4.4
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+six==1.16.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1786122.txt b/.riot/requirements/1786122.txt
new file mode 100644
index 00000000000..110a7c03d02
--- /dev/null
+++ b/.riot/requirements/1786122.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1786122.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==4.22.0
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/17c2d6c.txt b/.riot/requirements/17c2d6c.txt
new file mode 100644
index 00000000000..77779c403b7
--- /dev/null
+++ b/.riot/requirements/17c2d6c.txt
@@ -0,0 +1,27 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/17c2d6c.in
+#
+anyio==3.7.1
+asgiref==3.7.2
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/17ca8a8.txt b/.riot/requirements/17ca8a8.txt
new file mode 100644
index 00000000000..7653f3cea3e
--- /dev/null
+++ b/.riot/requirements/17ca8a8.txt
@@ -0,0 +1,32 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/17ca8a8.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.0.3
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.0.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
+zipp==3.16.2
diff --git a/.riot/requirements/18471e1.txt b/.riot/requirements/18471e1.txt
new file mode 100644
index 00000000000..76aa51482e8
--- /dev/null
+++ b/.riot/requirements/18471e1.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/18471e1.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+requests-mock==1.11.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/1853197.txt b/.riot/requirements/1853197.txt
new file mode 100644
index 00000000000..be946a75e54
--- /dev/null
+++ b/.riot/requirements/1853197.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1853197.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+falcon==3.0.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/18cd02f.txt b/.riot/requirements/18cd02f.txt
new file mode 100644
index 00000000000..2942b411626
--- /dev/null
+++ b/.riot/requirements/18cd02f.txt
@@ -0,0 +1,79 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/18cd02f.in
+#
+attrs==23.1.0
+aws-sam-translator==1.73.0
+aws-xray-sdk==2.12.0
+boto3==1.28.23
+botocore==1.31.23
+certifi==2023.7.22
+cffi==1.15.1
+cfn-lint==0.79.6
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+cryptography==41.0.3
+docker==6.1.3
+ecdsa==0.18.0
+graphql-core==3.2.3
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+jinja2==3.1.2
+jmespath==1.0.1
+jschema-to-python==1.2.3
+jsondiff==2.0.0
+jsonpatch==1.33
+jsonpickle==3.0.1
+jsonpointer==2.4
+jsonschema==4.17.3
+jsonschema-spec==0.1.6
+junit-xml==1.9
+lazy-object-proxy==1.9.0
+markupsafe==2.1.3
+mock==5.1.0
+moto[all]==4.1.14
+mpmath==1.3.0
+networkx==3.1
+openapi-schema-validator==0.4.4
+openapi-spec-validator==0.5.7
+opentracing==2.4.0
+packaging==23.1
+pathable==0.4.3
+pbr==5.11.1
+pluggy==1.2.0
+py-partiql-parser==0.3.6
+pyasn1==0.5.0
+pycparser==2.21
+pydantic==1.10.12
+pyparsing==3.1.1
+pyrsistent==0.19.3
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+python-dateutil==2.8.2
+python-jose[cryptography]==3.3.0
+pyyaml==6.0.1
+regex==2023.8.8
+requests==2.31.0
+responses==0.23.3
+rfc3339-validator==0.1.4
+rsa==4.9
+s3transfer==0.6.1
+sarif-om==1.0.4
+six==1.16.0
+sortedcontainers==2.4.0
+sshpubkeys==3.3.1
+sympy==1.12
+types-pyyaml==6.0.12.11
+typing-extensions==4.7.1
+urllib3==1.26.16
+websocket-client==1.6.1
+werkzeug==2.3.6
+wrapt==1.15.0
+xmltodict==0.13.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/18dfaeb.txt b/.riot/requirements/18dfaeb.txt
new file mode 100644
index 00000000000..d390daaae51
--- /dev/null
+++ b/.riot/requirements/18dfaeb.txt
@@ -0,0 +1,32 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/18dfaeb.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.3.2
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.0.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
+zipp==3.16.2
diff --git a/.riot/requirements/19535a2.txt b/.riot/requirements/19535a2.txt
new file mode 100644
index 00000000000..4786a7897be
--- /dev/null
+++ b/.riot/requirements/19535a2.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/19535a2.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1965d19.txt b/.riot/requirements/1965d19.txt
new file mode 100644
index 00000000000..7e21fa4763c
--- /dev/null
+++ b/.riot/requirements/1965d19.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1965d19.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+jinja2==3.0.3
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/19af47c.txt b/.riot/requirements/19af47c.txt
new file mode 100644
index 00000000000..437324d23af
--- /dev/null
+++ b/.riot/requirements/19af47c.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/19af47c.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==4.2.4
+djangorestframework==3.14.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/19c5517.txt b/.riot/requirements/19c5517.txt
new file mode 100644
index 00000000000..7ebe2b75ab9
--- /dev/null
+++ b/.riot/requirements/19c5517.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/19c5517.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==3.2.20
+djangorestframework==3.11.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/19ed516.txt b/.riot/requirements/19ed516.txt
new file mode 100644
index 00000000000..13070b961ee
--- /dev/null
+++ b/.riot/requirements/19ed516.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/19ed516.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1a039ba.txt b/.riot/requirements/1a039ba.txt
new file mode 100644
index 00000000000..2c39b94daa7
--- /dev/null
+++ b/.riot/requirements/1a039ba.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1a039ba.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+falcon==3.1.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1a26cde.txt b/.riot/requirements/1a26cde.txt
new file mode 100644
index 00000000000..8fbaf6e0405
--- /dev/null
+++ b/.riot/requirements/1a26cde.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1a26cde.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+dnspython==2.4.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+mongoengine==0.27.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymongo==4.4.1
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1a60c2e.txt b/.riot/requirements/1a60c2e.txt
new file mode 100644
index 00000000000..668f582e305
--- /dev/null
+++ b/.riot/requirements/1a60c2e.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1a60c2e.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+elasticsearch==1.6.0
+elasticsearch6==6.8.2
+elasticsearch7==7.13.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/1a630b3.txt b/.riot/requirements/1a630b3.txt
new file mode 100644
index 00000000000..94a77b9f6a9
--- /dev/null
+++ b/.riot/requirements/1a630b3.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1a630b3.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/9423397.txt b/.riot/requirements/1a74ed3.txt
similarity index 52%
rename from .riot/requirements/9423397.txt
rename to .riot/requirements/1a74ed3.txt
index 926b9f95f42..5de8c4a26f2 100644
--- a/.riot/requirements/9423397.txt
+++ b/.riot/requirements/1a74ed3.txt
@@ -2,31 +2,30 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/9423397.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a74ed3.in
#
attrs==23.1.0
-coverage[toml]==7.2.5
-exceptiongroup==1.1.1
+coverage[toml]==7.2.7
+exceptiongroup==1.1.3
gevent==22.10.2
greenlet==2.0.2
-httpretty==0.9.7
+httpretty==1.1.4
hypothesis==6.45.0
-importlib-metadata==6.6.0
+importlib-metadata==6.7.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-typing-extensions==4.7.0
+typing-extensions==4.7.1
zipp==3.15.0
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/d3fd547.txt b/.riot/requirements/1a8dea8.txt
similarity index 77%
rename from .riot/requirements/d3fd547.txt
rename to .riot/requirements/1a8dea8.txt
index 88bf8f115aa..413686946a2 100644
--- a/.riot/requirements/d3fd547.txt
+++ b/.riot/requirements/1a8dea8.txt
@@ -2,26 +2,26 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d3fd547.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a8dea8.in
#
attrs==23.1.0
coverage[toml]==7.2.7
-exceptiongroup==1.1.2
-httpretty==0.9.7
+exceptiongroup==1.1.3
+httpretty==1.1.4
hypothesis==6.45.0
importlib-metadata==6.7.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
pytest==7.4.0
-pytest-asyncio==0.21.0
pytest-cov==4.1.0
pytest-mock==3.11.1
-six==1.16.0
sortedcontainers==2.4.0
+structlog==23.1.0
tomli==2.0.1
typing-extensions==4.7.1
+wheel==0.41.2
zipp==3.15.0
diff --git a/.riot/requirements/f5a5572.txt b/.riot/requirements/1a9b995.txt
similarity index 59%
rename from .riot/requirements/f5a5572.txt
rename to .riot/requirements/1a9b995.txt
index baf27fa3537..0eba8f41fa6 100644
--- a/.riot/requirements/f5a5572.txt
+++ b/.riot/requirements/1a9b995.txt
@@ -2,24 +2,23 @@
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f5a5572.in
+# pip-compile --no-annotate .riot/requirements/1a9b995.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.2
-httpretty==0.9.7
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
pytest==7.4.0
-pytest-asyncio==0.21.0
+pytest-asyncio==0.21.1
pytest-cov==4.1.0
pytest-mock==3.11.1
-six==1.16.0
sortedcontainers==2.4.0
tomli==2.0.1
typing-extensions==4.7.1
diff --git a/.riot/requirements/1af552c.txt b/.riot/requirements/1af552c.txt
new file mode 100644
index 00000000000..574284c6bd1
--- /dev/null
+++ b/.riot/requirements/1af552c.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1af552c.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+graphql-core==3.2.3
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1b0b05e.txt b/.riot/requirements/1b0b05e.txt
new file mode 100644
index 00000000000..6d5463990e8
--- /dev/null
+++ b/.riot/requirements/1b0b05e.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1b0b05e.in
+#
+anyio==3.7.1
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1b728bf.txt b/.riot/requirements/1b728bf.txt
new file mode 100644
index 00000000000..61c606cd3cd
--- /dev/null
+++ b/.riot/requirements/1b728bf.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1b728bf.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pylibmc==1.6.3
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/3af4ac9.txt b/.riot/requirements/1b7cb49.txt
similarity index 64%
rename from .riot/requirements/3af4ac9.txt
rename to .riot/requirements/1b7cb49.txt
index d4241c1fab2..9f56c1e6c73 100644
--- a/.riot/requirements/3af4ac9.txt
+++ b/.riot/requirements/1b7cb49.txt
@@ -1,22 +1,19 @@
#
-# This file is autogenerated by pip-compile with Python 3.11
+# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/3af4ac9.in
+# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1b7cb49.in
#
-attrs==20.1.0
+attrs==22.2.0
coverage[toml]==7.2.2
-httpretty==0.9.7
hypothesis==6.45.0
iniconfig==2.0.0
mock==5.0.1
-msgpack==1.0.5
opentracing==2.4.0
packaging==23.0
pluggy==1.0.0
pytest==7.2.2
pytest-cov==4.0.0
pytest-mock==3.10.0
-six==1.16.0
sortedcontainers==2.4.0
-structlog==22.3.0
+tornado==6.2
diff --git a/.riot/requirements/1b83c72.txt b/.riot/requirements/1b83c72.txt
new file mode 100644
index 00000000000..efb64f5b830
--- /dev/null
+++ b/.riot/requirements/1b83c72.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1b83c72.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+dnspython==2.4.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+mongoengine==0.27.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymongo==4.4.1
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1bc5161.txt b/.riot/requirements/1bc5161.txt
new file mode 100644
index 00000000000..526abfb3adb
--- /dev/null
+++ b/.riot/requirements/1bc5161.txt
@@ -0,0 +1,38 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1bc5161.in
+#
+astunparse==1.6.3
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+cffi==1.15.1
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+cryptography==41.0.3
+flask==2.3.2
+gunicorn==21.2.0
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pycparser==2.21
+pycryptodome==3.18.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
+wheel==0.41.1
diff --git a/.riot/requirements/1bd153a.txt b/.riot/requirements/1bd153a.txt
new file mode 100644
index 00000000000..781ef218e87
--- /dev/null
+++ b/.riot/requirements/1bd153a.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1bd153a.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1c45659.txt b/.riot/requirements/1c45659.txt
new file mode 100644
index 00000000000..865768ac0dd
--- /dev/null
+++ b/.riot/requirements/1c45659.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1c45659.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymemcache==3.5.2
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+six==1.16.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1c810ba.txt b/.riot/requirements/1c810ba.txt
new file mode 100644
index 00000000000..7b42737dbbd
--- /dev/null
+++ b/.riot/requirements/1c810ba.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1c810ba.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch6==6.8.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/1c83510.txt b/.riot/requirements/1c83510.txt
new file mode 100644
index 00000000000..f7a32d8f727
--- /dev/null
+++ b/.riot/requirements/1c83510.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1c83510.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1c94482.txt b/.riot/requirements/1c94482.txt
new file mode 100644
index 00000000000..efbe04b5e99
--- /dev/null
+++ b/.riot/requirements/1c94482.txt
@@ -0,0 +1,31 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1c94482.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+gevent==23.7.0
+greenlet==3.0.0a1
+gunicorn==20.0.4
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/1ca304d.txt b/.riot/requirements/1ca304d.txt
new file mode 100644
index 00000000000..c6685d964ed
--- /dev/null
+++ b/.riot/requirements/1ca304d.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1ca304d.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/1cc0457.txt b/.riot/requirements/1cc0457.txt
new file mode 100644
index 00000000000..90225a668ad
--- /dev/null
+++ b/.riot/requirements/1cc0457.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1cc0457.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1d0d03e.txt b/.riot/requirements/1d0d03e.txt
new file mode 100644
index 00000000000..8e2b89a66c3
--- /dev/null
+++ b/.riot/requirements/1d0d03e.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1d0d03e.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/195f89f.txt b/.riot/requirements/1d5e643.txt
similarity index 54%
rename from .riot/requirements/195f89f.txt
rename to .riot/requirements/1d5e643.txt
index 612f7a7c2e5..d8aa18a09a1 100644
--- a/.riot/requirements/195f89f.txt
+++ b/.riot/requirements/1d5e643.txt
@@ -2,28 +2,27 @@
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/195f89f.in
+# pip-compile --no-annotate .riot/requirements/1d5e643.in
#
attrs==23.1.0
-coverage[toml]==7.2.5
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-httpretty==0.9.7
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/1d725d8.txt b/.riot/requirements/1d725d8.txt
new file mode 100644
index 00000000000..3dce6c590e3
--- /dev/null
+++ b/.riot/requirements/1d725d8.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1d725d8.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+falcon==3.1.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1d84a29.txt b/.riot/requirements/1d84a29.txt
deleted file mode 100644
index 84c769e2513..00000000000
--- a/.riot/requirements/1d84a29.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.8
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1d84a29.in
-#
-attrs==23.1.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-flask==2.2.3
-gunicorn==20.1.0
-httpretty==0.9.7
-hypothesis==6.45.0
-idna==3.4
-importlib-metadata==6.6.0
-iniconfig==2.0.0
-itsdangerous==2.1.2
-jinja2==3.1.2
-markupsafe==2.1.2
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-requests==2.29.0
-six==1.16.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-urllib3==1.26.15
-werkzeug==2.3.0
-zipp==3.15.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/1dfb998.txt b/.riot/requirements/1dfb998.txt
new file mode 100644
index 00000000000..b603229b4f8
--- /dev/null
+++ b/.riot/requirements/1dfb998.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1dfb998.in
+#
+aniso8601==9.0.1
+attrs==23.1.0
+coverage[toml]==7.2.7
+graphene==3.3
+graphql-core==3.1.7
+graphql-relay==3.1.5
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1e1f9ed.txt b/.riot/requirements/1e1f9ed.txt
new file mode 100644
index 00000000000..e047c3a5a9a
--- /dev/null
+++ b/.riot/requirements/1e1f9ed.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1e1f9ed.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch==7.6.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/721875d.txt b/.riot/requirements/1e231c4.txt
similarity index 55%
rename from .riot/requirements/721875d.txt
rename to .riot/requirements/1e231c4.txt
index 43f07e085f5..c4899bf582a 100644
--- a/.riot/requirements/721875d.txt
+++ b/.riot/requirements/1e231c4.txt
@@ -2,26 +2,25 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/721875d.in
+# pip-compile --no-annotate .riot/requirements/1e231c4.in
#
attrs==23.1.0
-coverage[toml]==7.2.5
-gevent==22.10.2
+coverage[toml]==7.3.0
+gevent==23.7.0
greenlet==2.0.2
-httpretty==0.9.7
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/6ce2052.txt b/.riot/requirements/1e67ccb.txt
similarity index 52%
rename from .riot/requirements/6ce2052.txt
rename to .riot/requirements/1e67ccb.txt
index 7b29258261e..20e2b595e68 100644
--- a/.riot/requirements/6ce2052.txt
+++ b/.riot/requirements/1e67ccb.txt
@@ -2,21 +2,21 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/6ce2052.in
+# pip-compile --no-annotate .riot/requirements/1e67ccb.in
#
attrs==20.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
+coverage[toml]==7.3.0
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/1e68324.txt b/.riot/requirements/1e68324.txt
new file mode 100644
index 00000000000..14cf1dfb69d
--- /dev/null
+++ b/.riot/requirements/1e68324.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1e68324.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+psycopg2-binary==2.9.7
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1ea67e6.txt b/.riot/requirements/1ea67e6.txt
new file mode 100644
index 00000000000..db8e9501d33
--- /dev/null
+++ b/.riot/requirements/1ea67e6.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1ea67e6.in
+#
+anyio==3.7.1
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+h11==0.12.0
+httpcore==0.14.7
+httpx==0.22.0
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+rfc3986[idna2008]==1.5.0
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1ea78c5.txt b/.riot/requirements/1ea78c5.txt
deleted file mode 100644
index 98eb60419d6..00000000000
--- a/.riot/requirements/1ea78c5.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1ea78c5.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/1ed4b2f.txt b/.riot/requirements/1ed4b2f.txt
new file mode 100644
index 00000000000..59122bcb269
--- /dev/null
+++ b/.riot/requirements/1ed4b2f.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1ed4b2f.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+elasticsearch==7.10.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/1edfc9b.txt b/.riot/requirements/1edfc9b.txt
deleted file mode 100644
index 40747f6c19c..00000000000
--- a/.riot/requirements/1edfc9b.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1edfc9b.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/1f114a1.txt b/.riot/requirements/1f114a1.txt
new file mode 100644
index 00000000000..7bc5b92db38
--- /dev/null
+++ b/.riot/requirements/1f114a1.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1f114a1.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+graphql-core==3.1.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1f44441.txt b/.riot/requirements/1f44441.txt
deleted file mode 100644
index 8061397ebc5..00000000000
--- a/.riot/requirements/1f44441.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1f44441.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-protobuf==4.23.2
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.1.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/1f598f0.txt b/.riot/requirements/1f598f0.txt
new file mode 100644
index 00000000000..7a79bf29317
--- /dev/null
+++ b/.riot/requirements/1f598f0.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1f598f0.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+decorator==5.1.1
+dogpile-cache==0.9.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1f6511d.txt b/.riot/requirements/1f6511d.txt
deleted file mode 100644
index b7924d68159..00000000000
--- a/.riot/requirements/1f6511d.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.7
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1f6511d.in
-#
-attrs==23.1.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-flask==2.2.3
-gunicorn==20.1.0
-httpretty==0.9.7
-hypothesis==6.45.0
-idna==3.4
-importlib-metadata==6.6.0
-iniconfig==2.0.0
-itsdangerous==2.1.2
-jinja2==3.1.2
-markupsafe==2.1.2
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-requests==2.29.0
-six==1.16.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-typing-extensions==4.7.0
-urllib3==1.26.15
-werkzeug==2.2.3
-zipp==3.15.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/1f6fa90.txt b/.riot/requirements/1f6fa90.txt
deleted file mode 100644
index 6485a545785..00000000000
--- a/.riot/requirements/1f6fa90.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1f6fa90.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==23.1.0
diff --git a/.riot/requirements/1fd2c20.txt b/.riot/requirements/1fd2c20.txt
new file mode 100644
index 00000000000..a01a8e1b930
--- /dev/null
+++ b/.riot/requirements/1fd2c20.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1fd2c20.in
+#
+aiomysql==0.1.1
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymysql==1.1.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1fe6c51.txt b/.riot/requirements/1fe6c51.txt
new file mode 100644
index 00000000000..c196a2c3dd8
--- /dev/null
+++ b/.riot/requirements/1fe6c51.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1fe6c51.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch6==6.8.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/901e08e.txt b/.riot/requirements/1fede5b.txt
similarity index 54%
rename from .riot/requirements/901e08e.txt
rename to .riot/requirements/1fede5b.txt
index 3af5f0535c4..8efac63e05a 100644
--- a/.riot/requirements/901e08e.txt
+++ b/.riot/requirements/1fede5b.txt
@@ -2,28 +2,25 @@
# This file is autogenerated by pip-compile with Python 3.8
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/901e08e.in
+# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1fede5b.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-protobuf==4.23.2
+pluggy==1.3.0
+protobuf==4.24.2
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
pytest-cov==4.1.0
-pytest-mock==3.10.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
+uwsgi==2.0.22
diff --git a/.riot/requirements/1ffd39b.txt b/.riot/requirements/1ffd39b.txt
new file mode 100644
index 00000000000..93b2ce27a71
--- /dev/null
+++ b/.riot/requirements/1ffd39b.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/1ffd39b.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==3.2.20
+django-hosts==4.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/2348649.txt b/.riot/requirements/2348649.txt
new file mode 100644
index 00000000000..5cd40c8e2e7
--- /dev/null
+++ b/.riot/requirements/2348649.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/2348649.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/246da88.txt b/.riot/requirements/246da88.txt
new file mode 100644
index 00000000000..ae3ec113961
--- /dev/null
+++ b/.riot/requirements/246da88.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/246da88.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/25676e3.txt b/.riot/requirements/25676e3.txt
new file mode 100644
index 00000000000..0eaa276288a
--- /dev/null
+++ b/.riot/requirements/25676e3.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/25676e3.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+decorator==5.1.1
+dogpile-cache==1.2.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pbr==5.11.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+stevedore==5.1.0
diff --git a/.riot/requirements/2635fb0.txt b/.riot/requirements/2635fb0.txt
deleted file mode 100644
index 80c4199d499..00000000000
--- a/.riot/requirements/2635fb0.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.8
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/2635fb0.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-protobuf==3.19.0
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.1.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/27679b4.txt b/.riot/requirements/27679b4.txt
new file mode 100644
index 00000000000..e44e391677c
--- /dev/null
+++ b/.riot/requirements/27679b4.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/27679b4.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==4.24.2
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/277a719.txt b/.riot/requirements/277a719.txt
new file mode 100644
index 00000000000..78912cb11de
--- /dev/null
+++ b/.riot/requirements/277a719.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/277a719.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mariadb==1.1.7
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/29c779d.txt b/.riot/requirements/29c779d.txt
new file mode 100644
index 00000000000..da67ef801cd
--- /dev/null
+++ b/.riot/requirements/29c779d.txt
@@ -0,0 +1,27 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/29c779d.in
+#
+anyio==3.7.1
+asgiref==3.7.2
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sniffio==1.3.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/2bd75d2.txt b/.riot/requirements/2bd75d2.txt
new file mode 100644
index 00000000000..fc99a62bbad
--- /dev/null
+++ b/.riot/requirements/2bd75d2.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/2bd75d2.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/2d9a1f8.txt b/.riot/requirements/2d9a1f8.txt
new file mode 100644
index 00000000000..b59960d12d5
--- /dev/null
+++ b/.riot/requirements/2d9a1f8.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/2d9a1f8.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+psycopg2-binary==2.9.7
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/2f2479c.txt b/.riot/requirements/2f2479c.txt
new file mode 100644
index 00000000000..269c0e5da73
--- /dev/null
+++ b/.riot/requirements/2f2479c.txt
@@ -0,0 +1,31 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/2f2479c.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+gevent==23.7.0
+greenlet==3.0.0a1
+gunicorn==21.2.0
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/2f76f48.txt b/.riot/requirements/2f76f48.txt
new file mode 100644
index 00000000000..067b0086d97
--- /dev/null
+++ b/.riot/requirements/2f76f48.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/2f76f48.in
+#
+asynctest==0.13.0
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+more-itertools==8.10.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1f7079e.txt b/.riot/requirements/34281dc.txt
similarity index 54%
rename from .riot/requirements/1f7079e.txt
rename to .riot/requirements/34281dc.txt
index 205c689be87..71723aa97bf 100644
--- a/.riot/requirements/1f7079e.txt
+++ b/.riot/requirements/34281dc.txt
@@ -2,28 +2,25 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1f7079e.in
+# pip-compile --no-annotate --resolver=backtracking .riot/requirements/34281dc.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.1
-gunicorn==20.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-protobuf==3.19.0
+pluggy==1.3.0
+protobuf==4.24.2
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
pytest-cov==4.1.0
-pytest-mock==3.10.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
+uwsgi==2.0.22
diff --git a/.riot/requirements/34653f4.txt b/.riot/requirements/34653f4.txt
new file mode 100644
index 00000000000..4b6a3ca715b
--- /dev/null
+++ b/.riot/requirements/34653f4.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/34653f4.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+requests-mock==1.11.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/3591bdc.txt b/.riot/requirements/3591bdc.txt
new file mode 100644
index 00000000000..5d3d9952f40
--- /dev/null
+++ b/.riot/requirements/3591bdc.txt
@@ -0,0 +1,32 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/3591bdc.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.3.2
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.0.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
+zipp==3.16.2
diff --git a/.riot/requirements/3a13f7b.txt b/.riot/requirements/3a13f7b.txt
deleted file mode 100644
index 7aaad9001a9..00000000000
--- a/.riot/requirements/3a13f7b.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/3a13f7b.in
-#
-attrs==23.1.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-flask==2.2.3
-gunicorn==20.1.0
-httpretty==0.9.7
-hypothesis==6.45.0
-idna==3.4
-iniconfig==2.0.0
-itsdangerous==2.1.2
-jinja2==3.1.2
-markupsafe==2.1.2
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-requests==2.29.0
-six==1.16.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-urllib3==1.26.15
-werkzeug==2.3.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/3d67ff0.txt b/.riot/requirements/3d67ff0.txt
new file mode 100644
index 00000000000..368afa640e2
--- /dev/null
+++ b/.riot/requirements/3d67ff0.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/3d67ff0.in
+#
+attrs==23.1.0
+click==8.1.6
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+redis==4.6.0
+rq==1.15.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/5d6f54d.txt b/.riot/requirements/41dfea6.txt
similarity index 53%
rename from .riot/requirements/5d6f54d.txt
rename to .riot/requirements/41dfea6.txt
index 9da7cd6aab4..d1915b8cf19 100644
--- a/.riot/requirements/5d6f54d.txt
+++ b/.riot/requirements/41dfea6.txt
@@ -2,33 +2,33 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/5d6f54d.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/41dfea6.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
+coverage[toml]==7.2.7
+exceptiongroup==1.1.3
gevent==22.10.2
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
-importlib-metadata==6.6.0
+importlib-metadata==6.7.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.2.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-typing-extensions==4.7.0
-uwsgi==2.0.21
+typing-extensions==4.7.1
+uwsgi==2.0.22
zipp==3.15.0
-zope-event==4.6
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/4639c12.txt b/.riot/requirements/4639c12.txt
new file mode 100644
index 00000000000..2215d631873
--- /dev/null
+++ b/.riot/requirements/4639c12.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/4639c12.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opensearch-py[requests]==2.3.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+python-dateutil==2.8.2
+requests==2.31.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/4721305.txt b/.riot/requirements/4721305.txt
deleted file mode 100644
index 329138de296..00000000000
--- a/.riot/requirements/4721305.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/4721305.in
-#
-attrs==22.2.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/48059c6.txt b/.riot/requirements/48059c6.txt
deleted file mode 100644
index 6a93b09d408..00000000000
--- a/.riot/requirements/48059c6.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/48059c6.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-gevent==20.6.1
-greenlet==0.4.16
-gunicorn[gevent]==20.1.0
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
-pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
-zope-interface==6.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/4ec2419.txt b/.riot/requirements/4ec2419.txt
new file mode 100644
index 00000000000..4a7f0bd57a2
--- /dev/null
+++ b/.riot/requirements/4ec2419.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/4ec2419.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+glob2==0.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mako==1.2.4
+markupsafe==2.1.3
+mock==5.1.0
+more-itertools==8.10.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+parse==1.19.1
+parse-type==0.6.2
+pluggy==1.2.0
+py==1.11.0
+pytest==7.4.0
+pytest-bdd==6.0.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+six==1.16.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/4fef498.txt b/.riot/requirements/4fef498.txt
new file mode 100644
index 00000000000..8eb778d2d28
--- /dev/null
+++ b/.riot/requirements/4fef498.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/4fef498.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+mongoengine==0.27.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymongo==3.12.3
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/50151f5.txt b/.riot/requirements/50151f5.txt
new file mode 100644
index 00000000000..db1af01e1aa
--- /dev/null
+++ b/.riot/requirements/50151f5.txt
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/50151f5.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.3.2
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
diff --git a/.riot/requirements/db592df.txt b/.riot/requirements/50a0fe2.txt
similarity index 56%
rename from .riot/requirements/db592df.txt
rename to .riot/requirements/50a0fe2.txt
index 78bd7959749..0d0b82ad93d 100644
--- a/.riot/requirements/db592df.txt
+++ b/.riot/requirements/50a0fe2.txt
@@ -2,30 +2,30 @@
# This file is autogenerated by pip-compile with Python 3.8
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/db592df.in
+# pip-compile --no-annotate .riot/requirements/50a0fe2.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/5540194.txt b/.riot/requirements/5540194.txt
new file mode 100644
index 00000000000..b36d52d9f57
--- /dev/null
+++ b/.riot/requirements/5540194.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/5540194.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==4.2.4
+djangorestframework==3.14.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/56b205e.txt b/.riot/requirements/56b205e.txt
new file mode 100644
index 00000000000..0ac4b4c07d4
--- /dev/null
+++ b/.riot/requirements/56b205e.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/56b205e.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+decorator==5.1.1
+dogpile-cache==1.2.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pbr==5.11.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+stevedore==5.1.0
diff --git a/.riot/requirements/5883bdc.txt b/.riot/requirements/5883bdc.txt
new file mode 100644
index 00000000000..fec7d2a7adf
--- /dev/null
+++ b/.riot/requirements/5883bdc.txt
@@ -0,0 +1,34 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/5883bdc.in
+#
+aiofiles==23.2.1
+anyio==3.7.1
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+fastapi==0.86.0
+h11==0.14.0
+httpcore==0.17.3
+httpx==0.24.1
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pydantic==1.10.12
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sniffio==1.3.0
+sortedcontainers==2.4.0
+starlette==0.20.4
+typing-extensions==4.7.1
+urllib3==2.0.4
diff --git a/.riot/requirements/5be816f.txt b/.riot/requirements/5be816f.txt
new file mode 100644
index 00000000000..2a9c9b1ba27
--- /dev/null
+++ b/.riot/requirements/5be816f.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/5be816f.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+elasticsearch==7.8.1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/5c88126.txt b/.riot/requirements/5c88126.txt
new file mode 100644
index 00000000000..580cbd122b6
--- /dev/null
+++ b/.riot/requirements/5c88126.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/5c88126.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mako==1.2.4
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1427229.txt b/.riot/requirements/5c95c1a.txt
similarity index 59%
rename from .riot/requirements/1427229.txt
rename to .riot/requirements/5c95c1a.txt
index d216f7b1c0c..52169e753cf 100644
--- a/.riot/requirements/1427229.txt
+++ b/.riot/requirements/5c95c1a.txt
@@ -2,24 +2,23 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1427229.in
+# pip-compile --no-annotate .riot/requirements/5c95c1a.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
-exceptiongroup==1.1.2
-httpretty==0.9.7
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
pytest==7.4.0
-pytest-asyncio==0.21.0
+pytest-asyncio==0.21.1
pytest-cov==4.1.0
pytest-mock==3.11.1
-six==1.16.0
sortedcontainers==2.4.0
tomli==2.0.1
typing-extensions==4.7.1
diff --git a/.riot/requirements/5e10a2d.txt b/.riot/requirements/5e10a2d.txt
deleted file mode 100644
index a51ce535a9a..00000000000
--- a/.riot/requirements/5e10a2d.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/5e10a2d.in
-#
-attrs==22.2.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/6009fe3.txt b/.riot/requirements/6009fe3.txt
new file mode 100644
index 00000000000..ce05769549a
--- /dev/null
+++ b/.riot/requirements/6009fe3.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/6009fe3.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+elasticsearch1==1.10.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/130cf94.txt b/.riot/requirements/6126a3f.txt
similarity index 52%
rename from .riot/requirements/130cf94.txt
rename to .riot/requirements/6126a3f.txt
index 734336e7867..395add1fcbe 100644
--- a/.riot/requirements/130cf94.txt
+++ b/.riot/requirements/6126a3f.txt
@@ -2,21 +2,21 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/130cf94.in
+# pip-compile --no-annotate .riot/requirements/6126a3f.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
+coverage[toml]==7.3.0
+httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/640620a.txt b/.riot/requirements/640620a.txt
new file mode 100644
index 00000000000..9d0f744d62a
--- /dev/null
+++ b/.riot/requirements/640620a.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.9
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/640620a.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/65afd8d.txt b/.riot/requirements/65afd8d.txt
new file mode 100644
index 00000000000..813a01e8a7b
--- /dev/null
+++ b/.riot/requirements/65afd8d.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/65afd8d.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+dnspython==2.4.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+mongoengine==0.27.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymongo==4.4.1
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/6b4fe21.txt b/.riot/requirements/6b4fe21.txt
new file mode 100644
index 00000000000..003c48c02fe
--- /dev/null
+++ b/.riot/requirements/6b4fe21.txt
@@ -0,0 +1,31 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/6b4fe21.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.3.0
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.7
diff --git a/.riot/requirements/72b2f21.txt b/.riot/requirements/72b2f21.txt
new file mode 100644
index 00000000000..6929ee1c2db
--- /dev/null
+++ b/.riot/requirements/72b2f21.txt
@@ -0,0 +1,27 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/72b2f21.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+gevent==23.7.0
+greenlet==3.0.0a1
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/72f9106.txt b/.riot/requirements/72f9106.txt
new file mode 100644
index 00000000000..13a4c0ea281
--- /dev/null
+++ b/.riot/requirements/72f9106.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/72f9106.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/78a356f.txt b/.riot/requirements/78a356f.txt
deleted file mode 100644
index 189f5f76bcc..00000000000
--- a/.riot/requirements/78a356f.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/78a356f.in
-#
-attrs==23.1.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-coverage[toml]==7.2.3
-flask==2.2.3
-gunicorn==20.1.0
-httpretty==0.9.7
-hypothesis==6.45.0
-idna==3.4
-iniconfig==2.0.0
-itsdangerous==2.1.2
-jinja2==3.1.2
-markupsafe==2.1.2
-mock==5.0.2
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-requests==2.29.0
-six==1.16.0
-sortedcontainers==2.4.0
-urllib3==1.26.15
-werkzeug==2.3.0
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/.riot/requirements/4c0dd57.txt b/.riot/requirements/8071a9d.txt
similarity index 63%
rename from .riot/requirements/4c0dd57.txt
rename to .riot/requirements/8071a9d.txt
index 1e6537d5349..58d965049e0 100644
--- a/.riot/requirements/4c0dd57.txt
+++ b/.riot/requirements/8071a9d.txt
@@ -1,24 +1,19 @@
#
-# This file is autogenerated by pip-compile with Python 3.8
+# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/4c0dd57.in
+# pip-compile --no-annotate --resolver=backtracking .riot/requirements/8071a9d.in
#
attrs==22.2.0
coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
hypothesis==6.45.0
iniconfig==2.0.0
mock==5.0.1
-msgpack==1.0.5
+mysqlclient==2.1.1
opentracing==2.4.0
packaging==23.0
pluggy==1.0.0
pytest==7.2.2
pytest-cov==4.0.0
pytest-mock==3.10.0
-six==1.16.0
sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/80f0844.txt b/.riot/requirements/80f0844.txt
deleted file mode 100644
index faec6426cb0..00000000000
--- a/.riot/requirements/80f0844.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.8
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/80f0844.in
-#
-attrs==20.1.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
diff --git a/.riot/requirements/850dfa2.txt b/.riot/requirements/850dfa2.txt
new file mode 100644
index 00000000000..29f2333d304
--- /dev/null
+++ b/.riot/requirements/850dfa2.txt
@@ -0,0 +1,38 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/850dfa2.in
+#
+annotated-types==0.5.0
+attrs==23.1.0
+autocommand==2.2.2
+cheroot==10.0.0
+cherrypy==18.8.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+inflect==7.0.0
+iniconfig==2.0.0
+jaraco-collections==4.3.0
+jaraco-context==4.3.0
+jaraco-functools==3.8.1
+jaraco-text==3.11.1
+mock==5.1.0
+more-itertools==8.10.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+portend==3.2.0
+pydantic==2.1.1
+pydantic-core==2.4.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+pytz==2023.3
+sortedcontainers==2.4.0
+tempora==5.5.0
+typing-extensions==4.7.1
+zc-lockfile==3.0.post1
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/87af88b.txt b/.riot/requirements/87af88b.txt
new file mode 100644
index 00000000000..bc45282325d
--- /dev/null
+++ b/.riot/requirements/87af88b.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/87af88b.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+requests-mock==1.11.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/89475ad.txt b/.riot/requirements/89475ad.txt
new file mode 100644
index 00000000000..7e584e1ab20
--- /dev/null
+++ b/.riot/requirements/89475ad.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/89475ad.in
+#
+aiomysql==0.2.0
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymysql==1.1.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/8d11306.txt b/.riot/requirements/8d11306.txt
new file mode 100644
index 00000000000..753afc3cda5
--- /dev/null
+++ b/.riot/requirements/8d11306.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/8d11306.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mako==1.1.6
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/8eb275c.txt b/.riot/requirements/8eb275c.txt
new file mode 100644
index 00000000000..9cb79b3d6e9
--- /dev/null
+++ b/.riot/requirements/8eb275c.txt
@@ -0,0 +1,29 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/8eb275c.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.1
+gevent==23.9.0
+greenlet==3.0.0rc1
+gunicorn[gevent]==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+py-cpuinfo==8.0.0
+pytest==7.4.2
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/9070b25.txt b/.riot/requirements/9070b25.txt
new file mode 100644
index 00000000000..f555bd5edd0
--- /dev/null
+++ b/.riot/requirements/9070b25.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/9070b25.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/912a64b.txt b/.riot/requirements/912a64b.txt
new file mode 100644
index 00000000000..120b2e992c6
--- /dev/null
+++ b/.riot/requirements/912a64b.txt
@@ -0,0 +1,20 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/912a64b.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+graphql-core==3.2.3
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/91ffad0.txt b/.riot/requirements/91ffad0.txt
new file mode 100644
index 00000000000..380f130dfb0
--- /dev/null
+++ b/.riot/requirements/91ffad0.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/91ffad0.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==4.2.4
+django-hosts==5.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/9297f39.txt b/.riot/requirements/9297f39.txt
new file mode 100644
index 00000000000..f3c32893eae
--- /dev/null
+++ b/.riot/requirements/9297f39.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/9297f39.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/95440c5.txt b/.riot/requirements/95440c5.txt
new file mode 100644
index 00000000000..bf0393dc350
--- /dev/null
+++ b/.riot/requirements/95440c5.txt
@@ -0,0 +1,35 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/95440c5.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.8.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+tomli==2.0.1
+urllib3==2.0.4
+werkzeug==2.3.7
+zipp==3.16.2
diff --git a/.riot/requirements/99f5f19.txt b/.riot/requirements/99f5f19.txt
new file mode 100644
index 00000000000..a423fc7d81e
--- /dev/null
+++ b/.riot/requirements/99f5f19.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/99f5f19.in
+#
+asgiref==3.7.2
+attrs==23.1.0
+coverage[toml]==7.2.7
+django==4.2.4
+django-hosts==5.2
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-django==3.10.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+sqlparse==0.4.4
diff --git a/.riot/requirements/9b47f98.txt b/.riot/requirements/9b47f98.txt
new file mode 100644
index 00000000000..502d87079c0
--- /dev/null
+++ b/.riot/requirements/9b47f98.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/9b47f98.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+tomli==2.0.1
+wheel==0.41.2
diff --git a/.riot/requirements/9eaca27.txt b/.riot/requirements/9eaca27.txt
new file mode 100644
index 00000000000..592783f0dfb
--- /dev/null
+++ b/.riot/requirements/9eaca27.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/9eaca27.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.1
+gevent==23.9.1
+greenlet==3.0.0rc3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.2
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+six==1.16.0
+sortedcontainers==2.4.0
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/a0b7aa3.txt b/.riot/requirements/a0b7aa3.txt
new file mode 100644
index 00000000000..c2824d3baf9
--- /dev/null
+++ b/.riot/requirements/a0b7aa3.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/a0b7aa3.in
+#
+attrs==23.1.0
+cattrs==22.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+molten==1.0.2
+mypy-extensions==1.0.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+typing-extensions==3.10.0.2
+typing-inspect==0.6.0
diff --git a/.riot/requirements/a1828ca.txt b/.riot/requirements/a1828ca.txt
new file mode 100644
index 00000000000..ea9212958b1
--- /dev/null
+++ b/.riot/requirements/a1828ca.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/a1828ca.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/a5fa5ab.txt b/.riot/requirements/a5fa5ab.txt
new file mode 100644
index 00000000000..1f7b2266185
--- /dev/null
+++ b/.riot/requirements/a5fa5ab.txt
@@ -0,0 +1,18 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/a5fa5ab.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/a757772.txt b/.riot/requirements/a757772.txt
new file mode 100644
index 00000000000..5fee9520a80
--- /dev/null
+++ b/.riot/requirements/a757772.txt
@@ -0,0 +1,36 @@
+#
+# This file is autogenerated by pip-compile with Python 3.7
+# by the following command:
+#
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/a757772.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.2.7
+exceptiongroup==1.1.3
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+importlib-metadata==6.7.0
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+tomli==2.0.1
+typing-extensions==4.7.1
+urllib3==2.0.4
+werkzeug==2.2.3
+zipp==3.15.0
diff --git a/.riot/requirements/5f096ae.txt b/.riot/requirements/aabf077.txt
similarity index 56%
rename from .riot/requirements/5f096ae.txt
rename to .riot/requirements/aabf077.txt
index f72fbcf5fe8..8e373b1075e 100644
--- a/.riot/requirements/5f096ae.txt
+++ b/.riot/requirements/aabf077.txt
@@ -2,30 +2,30 @@
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/5f096ae.in
+# pip-compile --no-annotate .riot/requirements/aabf077.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/ac2e77a.txt b/.riot/requirements/ac2e77a.txt
new file mode 100644
index 00000000000..b19295490dc
--- /dev/null
+++ b/.riot/requirements/ac2e77a.txt
@@ -0,0 +1,31 @@
+#
+# This file is autogenerated by pip-compile with Python 3.11
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/ac2e77a.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.7
+coverage[toml]==7.3.0
+flask==2.2.3
+gunicorn==21.2.0
+httpretty==1.0.5
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.7
diff --git a/.riot/requirements/ad2a87e.txt b/.riot/requirements/ad2a87e.txt
new file mode 100644
index 00000000000..9dd6b6d6fb6
--- /dev/null
+++ b/.riot/requirements/ad2a87e.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/ad2a87e.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mariadb==1.1.7
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/a157848.txt b/.riot/requirements/ada4a05.txt
similarity index 56%
rename from .riot/requirements/a157848.txt
rename to .riot/requirements/ada4a05.txt
index e335e78f688..d09da51f140 100644
--- a/.riot/requirements/a157848.txt
+++ b/.riot/requirements/ada4a05.txt
@@ -2,30 +2,30 @@
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/a157848.in
+# pip-compile --no-annotate .riot/requirements/ada4a05.in
#
attrs==23.1.0
-coverage[toml]==7.2.3
-exceptiongroup==1.1.1
-gevent==22.10.2
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gevent==23.7.0
greenlet==2.0.2
-gunicorn[gevent]==20.1.0
+gunicorn[gevent]==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.0.0
+pluggy==1.3.0
py-cpuinfo==8.0.0
-pytest==7.3.1
-pytest-asyncio==0.21.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
pytest-benchmark==4.0.0
-pytest-cov==4.0.0
-pytest-mock==3.10.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
-uwsgi==2.0.21
-zope-event==4.6
+uwsgi==2.0.22
+zope-event==5.0
zope-interface==6.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/adfaf52.txt b/.riot/requirements/adfaf52.txt
deleted file mode 100644
index a5995a0d86a..00000000000
--- a/.riot/requirements/adfaf52.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/adfaf52.in
-#
-attrs==23.1.0
-coverage[toml]==7.2.3
-httpretty==0.9.7
-hypothesis==6.45.0
-iniconfig==2.0.0
-mock==5.0.2
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.1
-pluggy==1.0.0
-pytest==7.3.1
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==23.1.0
diff --git a/.riot/requirements/345f42d.txt b/.riot/requirements/af3567d.txt
similarity index 61%
rename from .riot/requirements/345f42d.txt
rename to .riot/requirements/af3567d.txt
index 2d1dec0ff04..e6c2256704a 100644
--- a/.riot/requirements/345f42d.txt
+++ b/.riot/requirements/af3567d.txt
@@ -1,25 +1,26 @@
#
-# This file is autogenerated by pip-compile with Python 3.8
+# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/345f42d.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/af3567d.in
#
attrs==23.1.0
coverage[toml]==7.2.7
-exceptiongroup==1.1.2
-httpretty==0.9.7
+exceptiongroup==1.1.3
+httpretty==1.1.4
hypothesis==6.45.0
+importlib-metadata==6.7.0
iniconfig==2.0.0
-mock==5.0.2
+mock==5.1.0
msgpack==1.0.5
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
pytest==7.4.0
-pytest-asyncio==0.21.0
+pytest-asyncio==0.21.1
pytest-cov==4.1.0
pytest-mock==3.11.1
-six==1.16.0
sortedcontainers==2.4.0
tomli==2.0.1
typing-extensions==4.7.1
+zipp==3.15.0
diff --git a/.riot/requirements/b0ffb4b.txt b/.riot/requirements/b0ffb4b.txt
new file mode 100644
index 00000000000..2067b9aa335
--- /dev/null
+++ b/.riot/requirements/b0ffb4b.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/b0ffb4b.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+glob2==0.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mako==1.2.4
+markupsafe==2.1.3
+mock==5.1.0
+more-itertools==8.10.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+parse==1.19.1
+parse-type==0.6.2
+pluggy==1.2.0
+py==1.11.0
+pytest==7.4.0
+pytest-bdd==4.1.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+six==1.16.0
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/b4959b4.txt b/.riot/requirements/b4959b4.txt
new file mode 100644
index 00000000000..b6435557684
--- /dev/null
+++ b/.riot/requirements/b4959b4.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/b4959b4.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/b83fcd5.txt b/.riot/requirements/b83fcd5.txt
new file mode 100644
index 00000000000..6105728dd67
--- /dev/null
+++ b/.riot/requirements/b83fcd5.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/b83fcd5.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/badf37b.txt b/.riot/requirements/badf37b.txt
new file mode 100644
index 00000000000..d1212da3489
--- /dev/null
+++ b/.riot/requirements/badf37b.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/badf37b.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+gevent==23.7.0
+greenlet==3.0.0a1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+redis==4.6.0
+sortedcontainers==2.4.0
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/bc5ded5.txt b/.riot/requirements/bc5ded5.txt
new file mode 100644
index 00000000000..89765fc3d66
--- /dev/null
+++ b/.riot/requirements/bc5ded5.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/bc5ded5.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/bcbcf6c.txt b/.riot/requirements/bcbcf6c.txt
new file mode 100644
index 00000000000..2f17d5fe1ed
--- /dev/null
+++ b/.riot/requirements/bcbcf6c.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/bcbcf6c.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+python-consul==1.1.0
+requests==2.31.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/102cf0a.txt b/.riot/requirements/bec60d9.txt
similarity index 78%
rename from .riot/requirements/102cf0a.txt
rename to .riot/requirements/bec60d9.txt
index fd309f83e41..a2c4d3c156d 100644
--- a/.riot/requirements/102cf0a.txt
+++ b/.riot/requirements/bec60d9.txt
@@ -2,14 +2,12 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/102cf0a.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/bec60d9.in
#
attrs==23.1.0
coverage[toml]==7.2.7
-exceptiongroup==1.1.2
-gevent==1.4.0
-greenlet==0.4.14
-gunicorn[gevent]==21.2.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
hypothesis==6.45.0
importlib-metadata==6.7.0
iniconfig==2.0.0
@@ -17,6 +15,7 @@ mock==5.1.0
opentracing==2.4.0
packaging==23.1
pluggy==1.2.0
+protobuf==4.24.2
py-cpuinfo==8.0.0
pytest==7.4.0
pytest-asyncio==0.21.1
@@ -26,5 +25,5 @@ pytest-mock==3.11.1
sortedcontainers==2.4.0
tomli==2.0.1
typing-extensions==4.7.1
-uwsgi==2.0.21
+uwsgi==2.0.22
zipp==3.15.0
diff --git a/.riot/requirements/c2ee914.txt b/.riot/requirements/c2ee914.txt
new file mode 100644
index 00000000000..66ce3c49b64
--- /dev/null
+++ b/.riot/requirements/c2ee914.txt
@@ -0,0 +1,24 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/c2ee914.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+tomli==2.0.1
+typing-extensions==4.7.1
diff --git a/.riot/requirements/c503907.txt b/.riot/requirements/c503907.txt
new file mode 100644
index 00000000000..89f8398753b
--- /dev/null
+++ b/.riot/requirements/c503907.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/c503907.in
+#
+attrs==20.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/ca1140c.txt b/.riot/requirements/ca1140c.txt
deleted file mode 100644
index f8635bb8e90..00000000000
--- a/.riot/requirements/ca1140c.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.7
-# by the following command:
-#
-# pip-compile --no-annotate --resolver=backtracking .riot/requirements/ca1140c.in
-#
-attrs==22.2.0
-coverage[toml]==7.2.2
-exceptiongroup==1.1.1
-httpretty==0.9.7
-hypothesis==6.45.0
-importlib-metadata==6.0.0
-iniconfig==2.0.0
-mock==5.0.1
-msgpack==1.0.5
-opentracing==2.4.0
-packaging==23.0
-pluggy==1.0.0
-pytest==7.2.2
-pytest-cov==4.0.0
-pytest-mock==3.10.0
-six==1.16.0
-sortedcontainers==2.4.0
-structlog==22.3.0
-tomli==2.0.1
-typing-extensions==4.7.0
-zipp==3.15.0
diff --git a/.riot/requirements/cfc44ec.txt b/.riot/requirements/cfc44ec.txt
new file mode 100644
index 00000000000..51ea1d11985
--- /dev/null
+++ b/.riot/requirements/cfc44ec.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/cfc44ec.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymemcache==4.0.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/d4721d0.txt b/.riot/requirements/d4721d0.txt
new file mode 100644
index 00000000000..a2a885b722d
--- /dev/null
+++ b/.riot/requirements/d4721d0.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/d4721d0.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+charset-normalizer==3.2.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+python-consul==1.1.0
+requests==2.31.0
+six==1.16.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
diff --git a/.riot/requirements/d9c952b.txt b/.riot/requirements/d9c952b.txt
new file mode 100644
index 00000000000..1e1f5a50f54
--- /dev/null
+++ b/.riot/requirements/d9c952b.txt
@@ -0,0 +1,22 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/d9c952b.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+httpretty==1.1.4
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+structlog==23.1.0
+wheel==0.41.2
diff --git a/.riot/requirements/e07ee01.txt b/.riot/requirements/e07ee01.txt
new file mode 100644
index 00000000000..867bb7ae82e
--- /dev/null
+++ b/.riot/requirements/e07ee01.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/e07ee01.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==3.19.0
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+tomli==2.0.1
+uwsgi==2.0.22
diff --git a/.riot/requirements/e355274.txt b/.riot/requirements/e355274.txt
new file mode 100644
index 00000000000..23480dc8372
--- /dev/null
+++ b/.riot/requirements/e355274.txt
@@ -0,0 +1,21 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/e355274.in
+#
+attrs==23.1.0
+certifi==2023.7.22
+coverage[toml]==7.2.7
+elasticsearch7==7.11.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+urllib3==1.26.16
diff --git a/.riot/requirements/9d5cd76.txt b/.riot/requirements/e50ca93.txt
similarity index 73%
rename from .riot/requirements/9d5cd76.txt
rename to .riot/requirements/e50ca93.txt
index 0cb404627dc..04ccd6a539b 100644
--- a/.riot/requirements/9d5cd76.txt
+++ b/.riot/requirements/e50ca93.txt
@@ -2,17 +2,17 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate .riot/requirements/9d5cd76.in
+# pip-compile --no-annotate .riot/requirements/e50ca93.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
+coverage[toml]==7.3.0
gunicorn==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.2.0
+pluggy==1.3.0
protobuf==4.22.0
py-cpuinfo==8.0.0
pytest==7.4.0
@@ -21,4 +21,4 @@ pytest-benchmark==4.0.0
pytest-cov==4.1.0
pytest-mock==3.11.1
sortedcontainers==2.4.0
-uwsgi==2.0.21
+uwsgi==2.0.22
diff --git a/.riot/requirements/e7776bf.txt b/.riot/requirements/e7776bf.txt
new file mode 100644
index 00000000000..922a8421e9e
--- /dev/null
+++ b/.riot/requirements/e7776bf.txt
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/e7776bf.in
+#
+attrs==23.1.0
+blinker==1.6.2
+certifi==2023.7.22
+charset-normalizer==3.2.0
+click==8.1.6
+coverage[toml]==7.2.7
+flask==2.0.3
+hypothesis==6.45.0
+idna==3.4
+iniconfig==2.0.0
+itsdangerous==2.1.2
+jinja2==3.1.2
+markupsafe==2.1.3
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+requests==2.31.0
+sortedcontainers==2.4.0
+urllib3==2.0.4
+werkzeug==2.3.6
diff --git a/.riot/requirements/ead9fee.txt b/.riot/requirements/ead9fee.txt
new file mode 100644
index 00000000000..b91fe75e83e
--- /dev/null
+++ b/.riot/requirements/ead9fee.txt
@@ -0,0 +1,25 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/ead9fee.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+gevent==23.7.0
+greenlet==3.0.0a1
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+zope-event==5.0
+zope-interface==6.0
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/.riot/requirements/ed535cd.txt b/.riot/requirements/ed535cd.txt
new file mode 100644
index 00000000000..df57d6192bd
--- /dev/null
+++ b/.riot/requirements/ed535cd.txt
@@ -0,0 +1,23 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/ed535cd.in
+#
+asynctest==0.13.0
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+more-itertools==8.10.0
+msgpack==1.0.5
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+py==1.11.0
+pytest==6.2.5
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+toml==0.10.2
diff --git a/.riot/requirements/f7531b1.txt b/.riot/requirements/f7531b1.txt
new file mode 100644
index 00000000000..6175db89da4
--- /dev/null
+++ b/.riot/requirements/f7531b1.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/f7531b1.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==4.24.2
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+tomli==2.0.1
+uwsgi==2.0.22
diff --git a/.riot/requirements/f94d38e.txt b/.riot/requirements/f94d38e.txt
new file mode 100644
index 00000000000..5833753adc4
--- /dev/null
+++ b/.riot/requirements/f94d38e.txt
@@ -0,0 +1,26 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/f94d38e.in
+#
+attrs==23.1.0
+coverage[toml]==7.3.0
+exceptiongroup==1.1.3
+gunicorn==21.2.0
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.3.0
+protobuf==3.19.0
+py-cpuinfo==8.0.0
+pytest==7.4.0
+pytest-asyncio==0.21.1
+pytest-benchmark==4.0.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
+tomli==2.0.1
+uwsgi==2.0.22
diff --git a/.riot/requirements/fb7182a.txt b/.riot/requirements/fb7182a.txt
new file mode 100644
index 00000000000..dbf415d62b4
--- /dev/null
+++ b/.riot/requirements/fb7182a.txt
@@ -0,0 +1,19 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# pip-compile --no-annotate .riot/requirements/fb7182a.in
+#
+attrs==23.1.0
+coverage[toml]==7.2.7
+hypothesis==6.45.0
+iniconfig==2.0.0
+mock==5.1.0
+opentracing==2.4.0
+packaging==23.1
+pluggy==1.2.0
+pymysql==1.1.0
+pytest==7.4.0
+pytest-cov==4.1.0
+pytest-mock==3.11.1
+sortedcontainers==2.4.0
diff --git a/.riot/requirements/1d3adbd.txt b/.riot/requirements/fd28b66.txt
similarity index 88%
rename from .riot/requirements/1d3adbd.txt
rename to .riot/requirements/fd28b66.txt
index 1ad516ff1ac..529aa4d53aa 100644
--- a/.riot/requirements/1d3adbd.txt
+++ b/.riot/requirements/fd28b66.txt
@@ -2,11 +2,11 @@
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1d3adbd.in
+# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/fd28b66.in
#
attrs==23.1.0
coverage[toml]==7.2.7
-exceptiongroup==1.1.2
+exceptiongroup==1.1.3
gunicorn==21.2.0
hypothesis==6.45.0
importlib-metadata==6.7.0
@@ -26,7 +26,7 @@ six==1.16.0
sortedcontainers==2.4.0
tomli==2.0.1
typing-extensions==4.7.1
-uwsgi==2.0.21
+uwsgi==2.0.22
zipp==3.15.0
# The following packages are considered to be unsafe in a requirements file:
diff --git a/.riot/requirements/8a20a52.txt b/.riot/requirements/ff654ab.txt
similarity index 69%
rename from .riot/requirements/8a20a52.txt
rename to .riot/requirements/ff654ab.txt
index f782196ec16..c03c992fc4c 100644
--- a/.riot/requirements/8a20a52.txt
+++ b/.riot/requirements/ff654ab.txt
@@ -2,18 +2,18 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
-# pip-compile --config=pyproject.toml --no-annotate .riot/requirements/8a20a52.in
+# pip-compile --no-annotate .riot/requirements/ff654ab.in
#
attrs==23.1.0
-coverage[toml]==7.2.7
+coverage[toml]==7.3.0
gunicorn==21.2.0
hypothesis==6.45.0
iniconfig==2.0.0
mock==5.1.0
opentracing==2.4.0
packaging==23.1
-pluggy==1.2.0
-protobuf==4.23.4
+pluggy==1.3.0
+protobuf==4.24.2
py-cpuinfo==8.0.0
pytest==7.4.0
pytest-asyncio==0.21.1
@@ -21,4 +21,4 @@ pytest-benchmark==4.0.0
pytest-cov==4.1.0
pytest-mock==3.11.1
sortedcontainers==2.4.0
-uwsgi==2.0.21
+uwsgi==2.0.22
diff --git a/ddtrace/__init__.py b/ddtrace/__init__.py
index 399395992e5..6e0f8490ae9 100644
--- a/ddtrace/__init__.py
+++ b/ddtrace/__init__.py
@@ -25,6 +25,11 @@
telemetry.install_excepthook()
+# In order to support 3.12, we start the writer upon initialization.
+# See https://github.com/python/cpython/pull/104826.
+# Telemetry events will only be sent after the `app-started` is queued.
+# This will occur when the agent writer starts.
+telemetry.telemetry_writer.enable()
from ._monkey import patch # noqa: E402
from ._monkey import patch_all # noqa: E402
diff --git a/ddtrace/debugging/_expressions.py b/ddtrace/debugging/_expressions.py
index 87bd5fa899b..5c2ef5efac9 100644
--- a/ddtrace/debugging/_expressions.py
+++ b/ddtrace/debugging/_expressions.py
@@ -25,6 +25,7 @@
""" # noqa
from itertools import chain
import re
+import sys
from types import FunctionType
from typing import Any
from typing import Callable
@@ -67,6 +68,8 @@ def _make_function(ast, args, name):
raise ValueError("Invalid predicate: %r" % ast)
instrs = compiled + [Instr("RETURN_VALUE")]
+ if sys.version_info >= (3, 11):
+ instrs.insert(0, Instr("RESUME", 0))
abstract_code = Bytecode(instrs)
abstract_code.argcount = len(args)
diff --git a/ddtrace/internal/safety.py b/ddtrace/internal/safety.py
index 339bdc4f012..3371d99d803 100644
--- a/ddtrace/internal/safety.py
+++ b/ddtrace/internal/safety.py
@@ -11,6 +11,7 @@
from ddtrace.internal.compat import BUILTIN
from ddtrace.internal.compat import PY3
+from ddtrace.internal.compat import PYTHON_VERSION_INFO
from ddtrace.internal.utils.attrdict import AttrDict
from ddtrace.internal.utils.cache import cached
@@ -51,6 +52,9 @@ def _isinstance(obj, types):
return issubclass(type(obj), types)
+IS_312_OR_NEWER = PYTHON_VERSION_INFO >= (3, 12)
+
+
class SafeObjectProxy(wrapt.ObjectProxy):
"""Object proxy to make sure we don't call unsafe code.
@@ -66,13 +70,15 @@ def __call__(self, *args, **kwargs):
def __getattribute__(self, name):
# type: (str) -> Any
- if name == "__wrapped__":
+ if name == "__wrapped__" and not IS_312_OR_NEWER:
raise AttributeError("Access denied")
return super(SafeObjectProxy, self).__getattribute__(name)
def __getattr__(self, name):
# type: (str) -> Any
+ if name == "__wrapped__" and IS_312_OR_NEWER:
+ raise AttributeError("Access denied")
return type(self).safe(super(SafeObjectProxy, self).__getattr__(name))
def __getitem__(self, item):
diff --git a/ddtrace/internal/telemetry/__init__.py b/ddtrace/internal/telemetry/__init__.py
index b5ba2bc6d90..e8d4395a90c 100644
--- a/ddtrace/internal/telemetry/__init__.py
+++ b/ddtrace/internal/telemetry/__init__.py
@@ -49,6 +49,10 @@ def _excepthook(tp, value, root_traceback):
error_msg = "{}:{} {}".format(filename, lineno, str(value))
telemetry_writer.add_integration(integration_name, True, error_msg=error_msg)
+ if telemetry_writer.started is False:
+ telemetry_writer._app_started_event(False)
+ telemetry_writer._app_dependencies_loaded_event()
+
telemetry_writer.app_shutdown()
telemetry_writer.disable()
diff --git a/ddtrace/internal/telemetry/data.py b/ddtrace/internal/telemetry/data.py
index 2afe96bc5f3..bd334c7bc29 100644
--- a/ddtrace/internal/telemetry/data.py
+++ b/ddtrace/internal/telemetry/data.py
@@ -4,12 +4,12 @@
from typing import List
from typing import Tuple
-import ddtrace
from ddtrace.internal.compat import PY3
from ddtrace.internal.constants import DEFAULT_SERVICE_NAME
from ddtrace.internal.packages import get_distributions
from ddtrace.internal.runtime.container import get_container_info
from ddtrace.internal.utils.cache import cached
+from ddtrace.version import get_version
from ...settings import _config as config
from ..hostname import get_hostname
@@ -63,7 +63,7 @@ def _get_application(key):
"env": env or "",
"language_name": "python",
"language_version": _format_version_info(sys.version_info),
- "tracer_version": ddtrace.__version__,
+ "tracer_version": get_version(),
"runtime_name": platform.python_implementation(),
"runtime_version": _format_version_info(sys.implementation.version) if PY3 else "",
"products": _get_products(),
@@ -88,7 +88,7 @@ def get_application(service, version, env):
def _get_products():
# type: () -> Dict
return {
- "appsec": {"version": ddtrace.__version__, "enabled": config._appsec_enabled},
+ "appsec": {"version": get_version(), "enabled": config._appsec_enabled},
}
diff --git a/ddtrace/internal/telemetry/writer.py b/ddtrace/internal/telemetry/writer.py
index 29946915d48..a6b29f2e298 100644
--- a/ddtrace/internal/telemetry/writer.py
+++ b/ddtrace/internal/telemetry/writer.py
@@ -216,7 +216,6 @@ def enable(self):
if self._is_periodic:
self.start()
- atexit.register(self.app_shutdown)
return True
self.status = ServiceStatus.RUNNING
@@ -290,14 +289,18 @@ def add_error(self, code, msg, filename, line_number):
msg = "%s:%s: %s" % (filename, line_number, msg)
self._error = (code, msg)
- def _app_started_event(self):
- # type: () -> None
+ def _app_started_event(self, register_app_shutdown=True):
+ # type: (bool) -> None
"""Sent when TelemetryWriter is enabled or forks"""
if self._forked:
# app-started events should only be sent by the main process
return
# List of configurations to be collected
+ self.started = True
+ if register_app_shutdown:
+ atexit.register(self.app_shutdown)
+
self.add_configurations(
[
(TELEMETRY_TRACING_ENABLED, config._tracing_enabled, "unknown"),
@@ -593,15 +596,6 @@ def periodic(self, force_flush=False):
for telemetry_event in telemetry_events:
self._client.send_event(telemetry_event)
- def start(self, *args, **kwargs):
- # type: (...) -> None
- super(TelemetryWriter, self).start(*args, **kwargs)
- # Queue app-started event after the telemetry worker thread is running
- if self.started is False:
- self._app_started_event()
- self._app_dependencies_loaded_event()
- self.started = True
-
def app_shutdown(self):
self._app_closing_event()
self.periodic(force_flush=True)
@@ -632,6 +626,10 @@ def _fork_writer(self):
self.stop(join=False)
+ # Enable writer service in child process to avoid interpreter shutdown
+ # error in Python 3.12
+ self.enable()
+
def _restart_sequence(self):
self._sequence = itertools.count(1)
diff --git a/ddtrace/internal/writer/writer.py b/ddtrace/internal/writer/writer.py
index 63580f0cd28..19b7a66fc8f 100644
--- a/ddtrace/internal/writer/writer.py
+++ b/ddtrace/internal/writer/writer.py
@@ -627,7 +627,8 @@ def _send_payload(self, payload, count, client):
def start(self):
super(AgentWriter, self).start()
try:
- telemetry_writer.enable()
+ telemetry_writer._app_started_event()
+ telemetry_writer._app_dependencies_loaded_event()
# appsec remote config should be enabled/started after the global tracer and configs
# are initialized
diff --git a/ddtrace/profiling/exporter/pprof.pyx b/ddtrace/profiling/exporter/pprof.pyx
index 1f9468cf533..7336894b953 100644
--- a/ddtrace/profiling/exporter/pprof.pyx
+++ b/ddtrace/profiling/exporter/pprof.pyx
@@ -225,7 +225,7 @@ class _PprofConverter(object):
self._locations[(filename, lineno, funcname)] = location
return location
- def _str(self, string: str) -> int:
+ def _str(self, string: typing.Optional[str]) -> int:
"""Convert a string to an id from the string table."""
return self._string_table.index(str(string))
diff --git a/docs/contributing-testing.rst b/docs/contributing-testing.rst
index a1ae692b9db..ae2c6b05a50 100644
--- a/docs/contributing-testing.rst
+++ b/docs/contributing-testing.rst
@@ -35,7 +35,7 @@ In addition, you will need `riot `_ an
.. code-block:: bash
- $ pip install riot==0.17.4
+ $ pip install riot==0.19.0
$ pip install hatch==1.7.0
Some of our test environments are managed with Riot, others with Hatch.
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index f58b42c461d..498ed5a3bec 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -151,6 +151,7 @@ NeedsAppKey
obfuscator
openai
opensearch
+opentelemetry
opentracer
opentracing
otel
diff --git a/hatch.toml b/hatch.toml
index d422711da48..eb9a6b2feb3 100644
--- a/hatch.toml
+++ b/hatch.toml
@@ -29,7 +29,7 @@ dependencies = [
"flake8-rst-docstrings",
"flake8-isort",
"pygments",
- "riot==0.17.4",
+ "riot==0.19.0",
]
[envs.lint.scripts]
diff --git a/pyproject.toml b/pyproject.toml
index 856031d7848..c5db5085367 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,5 @@
[build-system]
-requires = ["setuptools_scm[toml]>=4", "cython<3", "cmake>=3.24.2; python_version>='3.6'"]
+requires = ["setuptools_scm[toml]>=4", "cython", "cmake>=3.24.2; python_version>='3.7'"]
build-backend = "setuptools.build_meta"
[project]
@@ -8,48 +8,34 @@ dynamic = ["version"]
description = "Datadog APM client library"
readme = "README.md"
# license-files = { paths = ["LICENSE.BSD3"] }
-requires-python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+requires-python = ">=3.7"
authors = [
{ name = "Datadog, Inc.", email = "dev@datadoghq.com" },
]
classifiers = [
"Programming Language :: Python",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
]
dependencies = [
- "attrs>=20,<22; python_version=='2.7'",
- "attrs>=20; python_version>'2.7'",
+ "attrs>=20",
"bytecode; python_version>='3.8'",
- "bytecode~=0.12.0; python_version=='3.5'",
- "bytecode~=0.13.0; python_version=='3.6'",
"bytecode~=0.13.0; python_version=='3.7'",
- "cattrs; python_version>='3.7'",
- "cattrs<1.1; python_version<='3.6'",
- "contextlib2<1.0; python_version=='2.7'",
+ "cattrs",
"ddsketch>=2.0.1",
- "dead-bytecode; python_version<'3.0'",
- "enum34; python_version<'3.4'",
"envier",
- "funcsigs>=1.0.0; python_version=='2.7'",
"importlib_metadata; python_version<'3.8'",
- "ipaddress; python_version<'3.7'",
- "opentelemetry-api>=1; python_version>='3.7'",
- "pathlib2; python_version<'3.5'",
- "psutil>=5.6.7",
- "protobuf>=3,<3.18; python_version<'3.6'",
- "protobuf>=3,<4.0; python_version=='3.6'",
- "protobuf>=3; python_version>='3.7'",
+ "opentelemetry-api>=1",
+ "psutil==5.6.7",
+ "protobuf>=3",
+ "setuptools; python_version>='3.12'",
"six>=1.12.0",
- "typing; python_version<'3.5'",
"typing_extensions",
- "wrapt>=1.14.1",
+ "wrapt==1.15.0",
"xmltodict>=0.12",
]
diff --git a/releasenotes/notes/add-312-73857cf79c64c924.yaml b/releasenotes/notes/add-312-73857cf79c64c924.yaml
new file mode 100644
index 00000000000..68e667b7b4a
--- /dev/null
+++ b/releasenotes/notes/add-312-73857cf79c64c924.yaml
@@ -0,0 +1,27 @@
+---
+features:
+ - |
+ Adds support for Python 3.12.
+issues:
+ - |
+ aiohttp: Python 3.12 is not supported.
+ - |
+ aiohttp-jinja: Python 3.12 is not supported.
+ - |
+ aiobotocore: Python 3.12 is not supported.
+ - |
+ flask-caching: Python 3.12 is not supported.
+ - |
+ opentelemetry-api: Python 3.12 is not supported.
+ - |
+ openai/langchain: Python 3.12 is not supported.
+ - |
+ opentracing: Python 3.12 is not supported.
+ - |
+ pynamodb: Python 3.12 is not supported.
+ - |
+ pyramid: Python 3.12 is not supported.
+ - |
+ redis/redis-py-cluster: Python 3.12 is not supported.
+ - |
+ ASM: IAST for Python 3.12 is not supported.
diff --git a/riotfile.py b/riotfile.py
index 6ed4425dee3..ce46721327c 100644
--- a/riotfile.py
+++ b/riotfile.py
@@ -16,6 +16,7 @@
(3, 9),
(3, 10),
(3, 11),
+ (3, 12),
] # type: List[Tuple[int, int]]
@@ -33,6 +34,8 @@ def version_to_str(version):
'3.10'
>>> version_to_str((3, 11))
'3.11'
+ >>> version_to_str((3, 12))
+ '3.12'
>>> version_to_str((3, ))
'3'
"""
@@ -53,6 +56,8 @@ def str_to_version(version):
(3, 10)
>>> str_to_version("3.11")
(3, 11)
+ >>> str_to_version("3.12")
+ (3, 12)
>>> str_to_version("3")
(3,)
"""
@@ -68,9 +73,9 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
"""Helper to select python versions from the list of versions we support
>>> select_pys()
- ['3.7', '3.8', '3.9', '3.10', '3.11']
+ ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12']
>>> select_pys(min_version='3')
- ['3.7', '3.8', '3.9', '3.10', '3.11']
+ ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12']
>>> select_pys(max_version='3')
[]
>>> select_pys(min_version='3.7', max_version='3.9')
@@ -155,8 +160,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
"coverage": latest,
"attrs": ["==20.1.0", latest],
"structlog": latest,
- # httpretty v1.0 drops python 2.7 support
- "httpretty": "==0.9.7",
+ "httpretty": latest,
+ "wheel": latest,
},
venvs=[
Venv(pys=select_pys()),
@@ -188,11 +193,10 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
command="pytest {cmdargs} tests/telemetry/",
pys=select_pys(),
pkgs={
- # httpretty v1.0 drops python 2.7 support
"requests": latest,
"gunicorn": latest,
"flask": "<=2.2.3",
- "httpretty": "==0.9.7",
+ "httpretty": "<1.1",
},
),
Venv(
@@ -259,12 +263,11 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
name="internal",
command="pytest {cmdargs} tests/internal/",
pkgs={
- "httpretty": "==0.9.7",
+ "httpretty": latest,
"gevent": latest,
"pytest-asyncio": latest,
},
- # FIXME[bytecode-3.11]: internal depends on bytecode, which is not python 3.11 compatible.
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.12"),
),
Venv(
name="gevent",
@@ -314,6 +317,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
"gevent": ["~=22.10.0", latest],
},
),
+ # FIXME[python-3.12]: blocked on aiohttp release https://github.com/aio-libs/aiohttp/issues/7229
],
),
],
@@ -341,11 +345,11 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
command="pytest {cmdargs} tests/debugging/",
pkgs={
"msgpack": latest,
- "httpretty": "==0.9.7",
+ "httpretty": latest,
"typing-extensions": latest,
"pytest-asyncio": latest,
},
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(),
),
Venv(
name="vendor",
@@ -696,7 +700,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
"requests": latest,
"typing-extensions": latest,
},
- pys=select_pys(min_version="3.8"),
+ pys=select_pys(min_version="3.8", max_version="3.11"),
),
Venv(
name="elasticsearch",
@@ -884,7 +888,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
],
),
Venv(
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"flask": "~=1.1.0",
"flask-caching": ["~=1.10.0", latest],
@@ -897,7 +901,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
},
),
Venv(
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"flask": [latest],
"flask-caching": ["~=1.10.0", latest],
@@ -984,7 +988,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
command="pytest {cmdargs} tests/contrib/pynamodb",
venvs=[
Venv(
- pys=select_pys(min_version="3.7"),
+ # FIXME[python-3.12]: moto test dependency needs to be updated
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"pynamodb": ["~=5.0", "~=5.3", latest],
"moto": ">=1.0,<2.0",
@@ -1203,7 +1208,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
),
Venv(
# pyramid added support for Python 3.10/3.11 in 2.1
- pys=select_pys(min_version="3.10"),
+ # FIXME[python-3.12]: blocked on venusian release https://github.com/Pylons/venusian/issues/85
+ pys=select_pys(min_version="3.10", max_version="3.11"),
pkgs={
"pyramid": [latest],
},
@@ -1218,7 +1224,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
# async_generator 1.10 used because @asynccontextmanager was only available in Python 3.6+
# aiobotocore 1.x and higher require Python 3.6 or higher
Venv(
- pys=select_pys(min_version="3.7"),
+ # FIXME[python-3.12]: blocked on aiohttp release https://github.com/aio-libs/aiohttp/issues/7229
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"aiobotocore": ["~=1.4.2", "~=2.0.0", latest],
},
@@ -1596,7 +1603,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
],
"yarl": "~=1.0",
},
- pys=select_pys(min_version="3.7"),
+ # FIXME[python-3.12]: blocked on aiohttp release https://github.com/aio-libs/aiohttp/issues/7229
+ pys=select_pys(min_version="3.7", max_version="3.11"),
),
Venv(
name="aiohttp_jinja2",
@@ -1614,7 +1622,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
],
"jinja2": latest,
},
- pys=select_pys(min_version="3.7"),
+ # FIXME[python-3.12]: blocked on aiohttp release https://github.com/aio-libs/aiohttp/issues/7229
+ pys=select_pys(min_version="3.7", max_version="3.11"),
),
Venv(
name="jinja2",
@@ -1639,7 +1648,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
),
Venv(
name="rediscluster",
- pys=select_pys(),
+ pys=select_pys(max_version="3.11"),
command="pytest {cmdargs} tests/contrib/rediscluster",
pkgs={
# deprecated package
@@ -1670,6 +1679,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
"redis": ["~=4.3", latest],
},
),
+ # FIXME[python-3.12]: blocked on redis release https://github.com/redis/redis-py/pull/2873
],
),
Venv(
@@ -1911,7 +1921,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
Venv(
name="opentelemetry",
command="pytest {cmdargs} tests/opentelemetry",
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"pytest-asyncio": latest,
"opentelemetry-api": ["~=1.0.0", "~=1.3.0", "~=1.4.0", "~=1.8.0", "~=1.11.0", "~=1.15.0", latest],
@@ -1944,13 +1954,13 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
},
),
Venv(
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.11"),
pkgs={
"openai[embeddings]": ["==0.27.2", latest],
},
),
Venv(
- pys=select_pys(min_version="3.8"),
+ pys=select_pys(min_version="3.8", max_version="3.11"),
pkgs={
"openai[embeddings]": [latest],
"tiktoken": latest,
@@ -1973,7 +1983,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
pkgs={"pytest-asyncio": latest},
),
Venv(
- pys=select_pys(min_version="3.7"),
+ pys=select_pys(min_version="3.7", max_version="3.11"),
command="pytest {cmdargs} tests/opentracer/test_tracer_tornado.py",
# TODO: update opentracing tests to be compatible with Tornado v6.
# https://github.com/opentracing/opentracing-python/issues/136
@@ -2077,11 +2087,12 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
),
Venv(
# kombu added support for Python 3.10 in 5.2.1
- pys=select_pys(min_version="3.10"),
+ pys=select_pys(min_version="3.10", max_version="3.11"),
pkgs={
"kombu": [">=5.2,<5.3", latest],
},
),
+ Venv(pys="3.12", pkgs={"kombu": latest}),
],
),
Venv(
@@ -2123,7 +2134,8 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
Venv(
name="langchain",
command="pytest {cmdargs} tests/contrib/langchain",
- pys=select_pys(min_version="3.9"),
+ # FIXME[python-3.12]: blocked on aiohttp release https://github.com/aio-libs/aiohttp/issues/7229
+ pys=select_pys(min_version="3.9", max_version="3.11"),
pkgs={
"langchain": ["==0.0.192", latest],
"openai": latest,
@@ -2212,13 +2224,13 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
# See https://github.com/workhorsy/py-cpuinfo/issues/177
"pytest-benchmark": latest,
"py-cpuinfo": "~=8.0.0",
- "uwsgi": latest,
"pytest-asyncio": latest,
},
venvs=[
# Python 3.7
Venv(
pys="3.7",
+ pkgs={"uwsgi": latest},
venvs=[
Venv(
pkgs={
@@ -2232,24 +2244,15 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
},
pkgs={
"gunicorn[gevent]": latest,
+ "gevent": latest,
},
- venvs=[
- Venv(
- pkgs={
- "gevent": "==1.4.0",
- "greenlet": "==0.4.14",
- }
- ),
- Venv(
- pkgs={"gevent": latest},
- ),
- ],
),
],
),
# Python 3.8 + 3.9
Venv(
pys=["3.8", "3.9"],
+ pkgs={"uwsgi": latest},
venvs=[
Venv(
pkgs={
@@ -2263,24 +2266,15 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
},
pkgs={
"gunicorn[gevent]": latest,
+ "gevent": latest,
},
- venvs=[
- Venv(
- pkgs={
- "gevent": "==20.6.1",
- "greenlet": "==0.4.16",
- }
- ),
- Venv(
- pkgs={"gevent": latest},
- ),
- ],
),
],
),
# Python 3.10
Venv(
pys="3.10",
+ pkgs={"uwsgi": latest},
venvs=[
Venv(
pkgs={
@@ -2309,9 +2303,10 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
),
],
),
- # Python 3.11+
+ # Python 3.11
Venv(
- pys=select_pys(min_version="3.11"),
+ pys="3.11",
+ pkgs={"uwsgi": latest},
venvs=[
Venv(
pkgs={
@@ -2334,6 +2329,31 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
),
],
),
+ # Python 3.12
+ Venv(
+ pys=select_pys(min_version="3.12"),
+ venvs=[
+ Venv(
+ pkgs={
+ "protobuf": ["==4.22.0", latest],
+ },
+ ),
+ # Gevent
+ Venv(
+ env={
+ "DD_PROFILE_TEST_GEVENT": "1",
+ },
+ pkgs={
+ "gunicorn[gevent]": latest,
+ },
+ venvs=[
+ Venv(
+ pkgs={"gevent": ["==23.9.0"]},
+ ),
+ ],
+ ),
+ ],
+ ),
],
),
],
diff --git a/scripts/ddtest b/scripts/ddtest
index 44a576b9def..7b44295f949 100755
--- a/scripts/ddtest
+++ b/scripts/ddtest
@@ -12,8 +12,7 @@ fi
# retry docker pull if fails
for i in {1..3}; do docker-compose pull -q testrunner && break || sleep 3; done
-FULL_CMD="pip install -q --disable-pip-version-check riot==0.17.7 hatch==1.7.0 \
- && $CMD"
+FULL_CMD="pip install -q --disable-pip-version-check riot==0.19.0 hatch==1.7.0 && $CMD"
# install and upgrade riot in case testrunner image has not been updated
diff --git a/scripts/needs_testrun.py b/scripts/needs_testrun.py
index e42e185a7fa..512bae0a210 100755
--- a/scripts/needs_testrun.py
+++ b/scripts/needs_testrun.py
@@ -102,8 +102,9 @@ def needs_testrun(suite: str, pr_number: int, sha: t.Optional[str] = None) -> bo
"""
try:
patterns = get_patterns(suite)
- except Exception:
+ except Exception as exc:
LOGGER.error("Failed to get patterns")
+ LOGGER.error(exc)
return True
if not patterns:
# We don't have patterns so we run the tests
diff --git a/setup.py b/setup.py
index 868d98fda39..e1b40e6c999 100644
--- a/setup.py
+++ b/setup.py
@@ -499,9 +499,6 @@ def get_ddup_ext():
bytecode = [
- "dead-bytecode; python_version<'3.0'", # backport of bytecode for Python 2.7
- "bytecode~=0.12.0; python_version=='3.5'",
- "bytecode~=0.13.0; python_version=='3.6'",
"bytecode~=0.13.0; python_version=='3.7'",
"bytecode; python_version>='3.8'",
]
@@ -538,17 +535,18 @@ def get_ddup_ext():
# funcsigs backport required for vendored debtcollector
install_requires=[
"ddsketch>=2.0.1",
- "protobuf>=3; python_version>='3.7'",
+ "protobuf>=3",
"attrs>=20",
- "cattrs; python_version>='3.7'",
+ "cattrs",
"six>=1.12.0",
"typing_extensions",
"importlib_metadata; python_version<'3.8'",
"xmltodict>=0.12",
"envier",
- "opentelemetry-api>=1; python_version>='3.7'",
+ "opentelemetry-api>=1",
"psutil==5.6.7",
- "wrapt==14.1.0",
+ "setuptools; python_version>='3.12'",
+ "wrapt==1.15.0",
]
+ bytecode,
extras_require={
@@ -584,8 +582,9 @@ def get_ddup_ext():
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
],
- setup_requires=["setuptools_scm[toml]>=4", "cython<3", "cmake>=3.24.2; python_version>='3.6'"],
+ setup_requires=["setuptools_scm[toml]>=4", "cython", "cmake>=3.24.2"],
ext_modules=ext_modules
+ cythonize(
[
diff --git a/tests/appsec/iast/test_iast_entrypoint_patches.py b/tests/appsec/iast/test_iast_entrypoint_patches.py
index f423fd877d2..d62daf352f1 100644
--- a/tests/appsec/iast/test_iast_entrypoint_patches.py
+++ b/tests/appsec/iast/test_iast_entrypoint_patches.py
@@ -9,6 +9,7 @@
@pytest.mark.skipif(sys.version_info[:2] < (3, 7), reason="dis is different in python <= 3.6")
+@pytest.mark.skipif(sys.version_info[:2] > (3, 11), reason="IAST is not supported in Pys later than 3.11")
def test_ddtrace_iast_flask_patch():
with override_global_config(dict(_iast_enabled=True)), override_env(dict(DD_IAST_ENABLED="true")):
import tests.appsec.iast.fixtures.entrypoint.app_patched as flask_entrypoint
diff --git a/tests/contrib/aiopg/py35/__init__.py b/tests/contrib/aiopg/py35/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/contrib/aiopg/py35/test.py b/tests/contrib/aiopg/py35/test.py
deleted file mode 100644
index 77e4a61f235..00000000000
--- a/tests/contrib/aiopg/py35/test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-import asyncio
-
-import aiopg
-
-# project
-from ddtrace import Pin
-from ddtrace.contrib.aiopg.patch import patch
-from ddtrace.contrib.aiopg.patch import unpatch
-from tests.contrib.asyncio.utils import AsyncioTestCase
-from tests.contrib.asyncio.utils import mark_asyncio
-from tests.contrib.config import POSTGRES_CONFIG
-
-
-TEST_PORT = str(POSTGRES_CONFIG["port"])
-
-
-class TestPsycopgPatch(AsyncioTestCase):
- # default service
- TEST_SERVICE = "postgres"
-
- def setUp(self):
- super().setUp()
- self._conn = None
- patch()
-
- def tearDown(self):
- super().tearDown()
- if self._conn and not self._conn.closed:
- self._conn.close()
-
- unpatch()
-
- @asyncio.coroutine
- def _get_conn_and_tracer(self):
- conn = self._conn = yield from aiopg.connect(**POSTGRES_CONFIG)
- Pin.get_from(conn).clone(tracer=self.tracer).onto(conn)
-
- return conn, self.tracer
-
- async def _test_cursor_ctx_manager(self):
- conn, tracer = await self._get_conn_and_tracer()
- cur = await conn.cursor()
- t = type(cur)
-
- async with conn.cursor() as cur:
- assert t == type(cur), "%s != %s" % (t, type(cur))
- await cur.execute(query="select 'blah'")
- rows = await cur.fetchall()
- assert len(rows) == 1
- assert rows[0][0] == "blah"
-
- spans = self.pop_spans()
- assert len(spans) == 1
- span = spans[0]
- assert span.name == "postgres.query"
-
- @mark_asyncio
- def test_cursor_ctx_manager(self):
- # ensure cursors work with context managers
- # https://github.com/DataDog/dd-trace-py/issues/228
- yield from self._test_cursor_ctx_manager()
diff --git a/tests/contrib/aiopg/py37/__init__.py b/tests/contrib/aiopg/py37/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/contrib/aiopg/py37/test.py b/tests/contrib/aiopg/py37/test.py
deleted file mode 100644
index 1cb14983904..00000000000
--- a/tests/contrib/aiopg/py37/test.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import aiopg
-
-# project
-from ddtrace import Pin
-from ddtrace.contrib.aiopg.patch import patch
-from ddtrace.contrib.aiopg.patch import unpatch
-from tests.contrib.asyncio.utils import AsyncioTestCase
-from tests.contrib.asyncio.utils import mark_asyncio
-from tests.contrib.config import POSTGRES_CONFIG
-
-
-TEST_PORT = str(POSTGRES_CONFIG["port"])
-
-
-class AiopgTestCase(AsyncioTestCase):
- # default service
- TEST_SERVICE = "postgres"
-
- def setUp(self):
- super().setUp()
- self._conn = None
- patch()
-
- def tearDown(self):
- super().tearDown()
- if self._conn and not self._conn.closed:
- self._conn.close()
-
- unpatch()
-
- async def _get_conn_and_tracer(self):
- conn = self._conn = await aiopg.connect(**POSTGRES_CONFIG)
- Pin.get_from(conn).clone(tracer=self.tracer).onto(conn)
-
- return conn, self.tracer
-
- @mark_asyncio
- async def test_async_generator(self):
- conn, tracer = await self._get_conn_and_tracer()
- cursor = await conn.cursor()
- q = "select 'foobarblah'"
- await cursor.execute(q)
- rows = []
- async for row in cursor:
- rows.append(row)
-
- assert rows == [("foobarblah",)]
- spans = self.pop_spans()
- assert len(spans) == 1
- span = spans[0]
- assert span.name == "postgres.query"
diff --git a/tests/contrib/aiopg/test.py b/tests/contrib/aiopg/test.py
index e34e459caeb..34a83a9cc6e 100644
--- a/tests/contrib/aiopg/test.py
+++ b/tests/contrib/aiopg/test.py
@@ -123,6 +123,22 @@ def assert_conn_is_traced(self, tracer, db, service):
assert span.get_tag("component") == "aiopg"
assert span.get_tag("span.kind") == "client"
+ @mark_asyncio
+ async def test_async_generator(self):
+ conn, tracer = await self._get_conn_and_tracer()
+ cursor = await conn.cursor()
+ q = "select 'foobarblah'"
+ await cursor.execute(q)
+ rows = []
+ async for row in cursor:
+ rows.append(row)
+
+ assert rows == [("foobarblah",)]
+ spans = self.pop_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ assert span.name == "postgres.query"
+
@mark_asyncio
def test_disabled_execute(self):
conn, tracer = yield from self._get_conn_and_tracer()
@@ -313,3 +329,26 @@ def test_analytics_without_rate(self):
spans = yield from self.trace_spans()
self.assertEqual(len(spans), 1)
self.assertEqual(spans[0].get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
+
+ async def _test_cursor_ctx_manager(self):
+ conn, tracer = await self._get_conn_and_tracer()
+ cur = await conn.cursor()
+ t = type(cur)
+
+ async with conn.cursor() as cur:
+ assert t == type(cur), "%s != %s" % (t, type(cur))
+ await cur.execute(query="select 'blah'")
+ rows = await cur.fetchall()
+ assert len(rows) == 1
+ assert rows[0][0] == "blah"
+
+ spans = self.pop_spans()
+ assert len(spans) == 1
+ span = spans[0]
+ assert span.name == "postgres.query"
+
+ @mark_asyncio
+ def test_cursor_ctx_manager(self):
+ # ensure cursors work with context managers
+ # https://github.com/DataDog/dd-trace-py/issues/228
+ yield from self._test_cursor_ctx_manager()
diff --git a/tests/contrib/futures/test_propagation.py b/tests/contrib/futures/test_propagation.py
index 8a2afe29227..fbbebcd95fe 100644
--- a/tests/contrib/futures/test_propagation.py
+++ b/tests/contrib/futures/test_propagation.py
@@ -359,7 +359,17 @@ def test_concurrent_futures_with_gevent():
import os
import sys
- pid = os.fork()
+ # Temporarily suppress warnings for Python 3.12 as os.fork() will generate a
+ # DeprecationWarning. See https://github.com/python/cpython/pull/100229/
+ if sys.version_info >= (3, 12):
+ import warnings
+
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore")
+ pid = os.fork()
+ else:
+ pid = os.fork()
+
if pid == 0:
from gevent import monkey
diff --git a/tests/contrib/psycopg/test_psycopg.py b/tests/contrib/psycopg/test_psycopg.py
index ac574be460e..b48b938c78e 100644
--- a/tests/contrib/psycopg/test_psycopg.py
+++ b/tests/contrib/psycopg/test_psycopg.py
@@ -93,7 +93,7 @@ def assert_conn_is_traced(self, db, service):
rows = res.fetchall()
end = time.time()
- self.assertEquals(rows, [("foobarblah",)])
+ self.assertEqual(rows, [("foobarblah",)])
self.assert_structure(
dict(name="postgres.query", resource=q, service=service, error=0, span_type="sql"),
@@ -158,7 +158,7 @@ def test_opentracing_propagation(self):
cursor.execute(query)
rows = cursor.fetchall()
- self.assertEquals(rows, [("tracing",)])
+ self.assertEqual(rows, [("tracing",)])
self.assert_structure(
dict(name="db.access", service="psycopg-svc"),
@@ -176,7 +176,7 @@ def test_opentracing_propagation(self):
cursor.execute(query)
rows = cursor.fetchall()
- self.assertEquals(rows, [("tracing",)])
+ self.assertEqual(rows, [("tracing",)])
self.assert_structure(
dict(name="db.access", service="psycopg-svc"),
diff --git a/tests/contrib/psycopg2/test_psycopg.py b/tests/contrib/psycopg2/test_psycopg.py
index 098443cae18..3a9e28f6a7c 100644
--- a/tests/contrib/psycopg2/test_psycopg.py
+++ b/tests/contrib/psycopg2/test_psycopg.py
@@ -100,7 +100,7 @@ def assert_conn_is_traced(self, db, service):
rows = cursor.fetchall()
end = time.time()
- self.assertEquals(rows, [("foobarblah",)])
+ self.assertEqual(rows, [("foobarblah",)])
self.assert_structure(
dict(name="postgres.query", resource=q, service=service, error=0, span_type="sql"),
@@ -164,7 +164,7 @@ def test_opentracing_propagation(self):
cursor.execute(query)
rows = cursor.fetchall()
- self.assertEquals(rows, [("tracing",)])
+ self.assertEqual(rows, [("tracing",)])
self.assert_structure(
dict(name="db.access", service="psycopg-svc"),
@@ -182,7 +182,7 @@ def test_opentracing_propagation(self):
cursor.execute(query)
rows = cursor.fetchall()
- self.assertEquals(rows, [("tracing",)])
+ self.assertEqual(rows, [("tracing",)])
self.assert_structure(
dict(name="db.access", service="psycopg-svc"),
diff --git a/tests/contrib/requests/test_requests.py b/tests/contrib/requests/test_requests.py
index 711b3621380..08630d2f862 100644
--- a/tests/contrib/requests/test_requests.py
+++ b/tests/contrib/requests/test_requests.py
@@ -240,8 +240,12 @@ def test_non_existant_url(self):
assert s.get_tag("span.kind") == "client"
assert s.get_tag("out.host") == "doesnotexist.google.com"
assert s.error == 1
- assert "Failed to establish a new connection" in s.get_tag(ERROR_MSG)
- assert "Failed to establish a new connection" in s.get_tag(ERROR_STACK)
+ if sys.version_info >= (3, 12, 0):
+ assert "Failed to resolve 'doesnotexist.google.com'" in s.get_tag(ERROR_MSG)
+ assert "Failed to resolve 'doesnotexist.google.com'" in s.get_tag(ERROR_STACK)
+ else:
+ assert "Failed to establish a new connection" in s.get_tag(ERROR_MSG)
+ assert "Failed to establish a new connection" in s.get_tag(ERROR_STACK)
assert "Traceback (most recent call last)" in s.get_tag(ERROR_STACK)
assert "requests.exception" in s.get_tag(ERROR_TYPE)
diff --git a/tests/debugging/function/test_store.py b/tests/debugging/function/test_store.py
index 19306114095..df3ae065505 100644
--- a/tests/debugging/function/test_store.py
+++ b/tests/debugging/function/test_store.py
@@ -203,7 +203,9 @@ def test_function_inject_wrap_commutativity():
# Unwrapping
store.unwrap(stuff.modulestuff)
- assert stuff.modulestuff.__code__ is not code and stuff.modulestuff.__code__ == code
+ assert stuff.modulestuff.__code__ is not code
+ if sys.version_info < (3, 12):
+ assert stuff.modulestuff.__code__ == code
def test_function_wrap_inject_commutativity():
@@ -228,4 +230,6 @@ def test_function_wrap_inject_commutativity():
assert stuff.modulestuff.__code__ is not code
store.eject_hook(stuff.modulestuff, hook, lo, 42)
- assert stuff.modulestuff.__code__ is not code and stuff.modulestuff.__code__ == code
+ assert stuff.modulestuff.__code__ is not code
+ if sys.version_info < (3, 12):
+ assert stuff.modulestuff.__code__ == code
diff --git a/tests/debugging/py35/__init__.py b/tests/debugging/py35/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/debugging/py35/test_async.py b/tests/debugging/test_async.py
similarity index 100%
rename from tests/debugging/py35/test_async.py
rename to tests/debugging/test_async.py
diff --git a/tests/internal/py35/__init__.py b/tests/internal/py35/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/internal/py35/asyncstuff.py b/tests/internal/py35/asyncstuff.py
deleted file mode 100644
index 3e1fa7e7b61..00000000000
--- a/tests/internal/py35/asyncstuff.py
+++ /dev/null
@@ -1,2 +0,0 @@
-async def async_func():
- return 42
diff --git a/tests/internal/py35/test_wrapping.py b/tests/internal/py35/test_wrapping.py
deleted file mode 100644
index 38893cb8c25..00000000000
--- a/tests/internal/py35/test_wrapping.py
+++ /dev/null
@@ -1,79 +0,0 @@
-from types import CoroutineType
-
-import pytest
-
-from ddtrace.internal.wrapping import wrap
-from tests.internal.py35.asyncstuff import async_func as asyncfoo
-
-
-def test_wrap_generator_yield_from():
- channel = []
-
- def wrapper(f, args, kwargs):
- channel[:] = []
- for _ in f(*args, **kwargs):
- channel.append(_)
- yield _
-
- def g():
- yield from range(10)
-
- wrap(g, wrapper)
-
- assert list(g()) == list(range(10)) == channel
-
-
-@pytest.mark.asyncio
-async def test_wrap_coroutine():
- channel = []
-
- def wrapper(f, args, kwargs):
- async def _handle_coroutine(c):
- retval = await c
- channel.append(retval)
- return retval
-
- channel[:] = []
- retval = f(*args, **kwargs)
- if isinstance(retval, CoroutineType):
- return _handle_coroutine(retval)
- else:
- channel.append(retval)
- return retval
-
- async def c():
- return await asyncfoo()
-
- wrap(c, wrapper)
-
- assert await c() == 42
-
- assert channel == [42]
-
-
-def test_wrap_args_kwarg():
- def f(*args, path=None):
- return (args, path)
-
- def wrapper(f, args, kwargs):
- return f(*args, **kwargs)
-
- wrap(f, wrapper)
-
- assert f(1, 2) == ((1, 2), None)
-
-
-def test_wrap_arg_args_kwarg_kwargs():
- def f(posarg, *args, path=None, **kwargs):
- return (posarg, args, path, kwargs)
-
- def wrapper(f, args, kwargs):
- return f(*args, **kwargs)
-
- wrap(f, wrapper)
-
- assert f(1, 2) == (1, (2,), None, {})
- assert f(1, 2, 3, foo="bar") == (1, (2, 3), None, {"foo": "bar"})
- assert f(1, 2, 3, path="bar") == (1, (2, 3), "bar", {})
- assert f(1, 2, 3, 4, path="bar", foo="baz") == (1, (2, 3, 4), "bar", {"foo": "baz"})
- assert f(1, path="bar", foo="baz") == (1, (), "bar", {"foo": "baz"})
diff --git a/tests/internal/py36/__init__.py b/tests/internal/py36/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/internal/py36/test_wrapping.py b/tests/internal/py36/test_wrapping.py
deleted file mode 100644
index ab6e369fa78..00000000000
--- a/tests/internal/py36/test_wrapping.py
+++ /dev/null
@@ -1,173 +0,0 @@
-import inspect
-import sys
-
-import pytest
-
-from ddtrace.internal.wrapping import wrap
-
-
-@pytest.mark.asyncio
-async def test_async_generator():
- async def stream():
- yield b"hello"
- yield b""
- return
-
- async def body():
- chunks = []
- async for chunk in stream():
- chunks.append(chunk)
- _body = b"".join(chunks)
- return _body
-
- wrapper_called = awrapper_called = False
-
- async def wrapper(f, args, kwargs):
- nonlocal wrapper_called
- wrapper_called = True
- return await f(*args, **kwargs)
-
- async def agwrapper(f, args, kwargs):
- nonlocal awrapper_called
- awrapper_called = True
- async for _ in f(*args, **kwargs):
- yield _
-
- wrap(stream, agwrapper)
- wrap(body, wrapper)
-
- assert await body() == b"hello"
- assert wrapper_called
- assert awrapper_called
-
-
-@pytest.mark.asyncio
-async def test_wrap_async_generator_send():
- def wrapper(f, args, kwargs):
- return f(*args, **kwargs)
-
- async def g():
- yield 0
- for _ in range(1, 10):
- n = yield _
- assert _ == n
- return
-
- wrap(g, wrapper)
-
- channel = []
-
- async def consume():
- agen = g()
- n = await agen.__anext__()
- channel.append(n)
- try:
- while True:
- n = await agen.asend(n)
- channel.append(n)
- except StopAsyncIteration:
- pass
-
- assert list(range(10)) == channel
-
- await consume()
-
-
-@pytest.mark.asyncio
-async def test_double_async_for_with_exception():
- channel = None
-
- class StreamConsumed(Exception):
- pass
-
- class AsyncIteratorByteStream(object):
- def __init__(self, stream):
- self._stream = stream
- self._is_stream_consumed = False
-
- async def __aiter__(self):
- if self._is_stream_consumed:
- raise StreamConsumed()
-
- self._is_stream_consumed = True
- async for part in self._stream:
- yield part
-
- async def wrapper(f, args, kwargs):
- nonlocal channel
-
- channel = [_ async for _ in f(*args, **kwargs)]
- for _ in channel:
- yield _
- return
-
- async def stream():
- yield b"hello"
- yield b""
- return
-
- wrap(stream, wrapper)
- wrap(AsyncIteratorByteStream.__aiter__, wrapper)
-
- s = AsyncIteratorByteStream(stream())
-
- assert b"".join([_ async for _ in s]) == b"hello"
- assert channel == [b"hello", b""]
- with pytest.raises(StreamConsumed):
- b"".join([_ async for _ in s])
-
-
-@pytest.mark.asyncio
-async def test_wrap_async_generator_throw_close():
- channel = []
-
- async def wrapper(f, args, kwargs):
- nonlocal channel
-
- channel.append(True)
-
- __ddgen = f(*args, **kwargs)
- __ddgensend = __ddgen.asend
- try:
- value = await __ddgen.__anext__()
- channel.append(value)
- except StopAsyncIteration:
- return
- while True:
- try:
- tosend = yield value
- except GeneratorExit:
- channel.append("GeneratorExit")
- await __ddgen.aclose()
- raise
- except: # noqa
- channel.append(sys.exc_info()[0])
- value = await __ddgen.athrow(*sys.exc_info())
- channel.append(value)
- else:
- try:
- value = await __ddgensend(tosend)
- channel.append(value)
- except StopAsyncIteration:
- return
-
- async def g():
- while True:
- try:
- yield 0
- except ValueError:
- yield 1
-
- wrap(g, wrapper)
- assert inspect.isasyncgenfunction(g)
-
- gen = g()
- assert inspect.isasyncgen(gen)
-
- for _ in range(10):
- assert await gen.__anext__() == 0
- assert await gen.athrow(ValueError) == 1
-
- await gen.aclose()
-
- assert channel == [True] + [0, ValueError, 1] * 10 + ["GeneratorExit"]
diff --git a/tests/internal/py37/__init__.py b/tests/internal/py37/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/internal/py37/test_wrapping.py b/tests/internal/py37/test_wrapping.py
deleted file mode 100644
index a1f94e1dae4..00000000000
--- a/tests/internal/py37/test_wrapping.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from contextlib import asynccontextmanager
-
-import pytest
-
-from ddtrace.internal.wrapping import wrap
-
-
-@pytest.mark.asyncio
-async def test_wrap_async_context_manager_exception_on_exit():
- def wrapper(f, args, kwargs):
- return f(*args, **kwargs)
-
- @asynccontextmanager
- async def g():
- yield 0
-
- wrap(g.__wrapped__, wrapper)
-
- acm = g()
- assert 0 == await acm.__aenter__()
- await acm.__aexit__(ValueError, None, None)
diff --git a/tests/internal/remoteconfig/test_remoteconfig.py b/tests/internal/remoteconfig/test_remoteconfig.py
index 95c7421354d..488e7fd8d1a 100644
--- a/tests/internal/remoteconfig/test_remoteconfig.py
+++ b/tests/internal/remoteconfig/test_remoteconfig.py
@@ -3,6 +3,7 @@
import datetime
import hashlib
import json
+import sys
from time import sleep
import mock
@@ -143,6 +144,10 @@ def test_remote_config_enable_validate_rc_disabled():
assert remoteconfig_poller.status == ServiceStatus.STOPPED
+@pytest.mark.skipif(
+ sys.version_info >= (3, 12, 0),
+ reason="Python 3.12 subprocess will raise deprecation warning for forking in a multi-threaded process",
+)
@pytest.mark.subprocess(env=dict(DD_REMOTE_CONFIGURATION_ENABLED="true"))
def test_remote_config_forksafe():
import os
diff --git a/tests/internal/test_wrapping.py b/tests/internal/test_wrapping.py
index 70628aa1cba..085a15dab8d 100644
--- a/tests/internal/test_wrapping.py
+++ b/tests/internal/test_wrapping.py
@@ -1,10 +1,18 @@
+from contextlib import asynccontextmanager
import inspect
import sys
+from types import CoroutineType
+
+import pytest
from ddtrace.internal.wrapping import unwrap
from ddtrace.internal.wrapping import wrap
+async def async_func():
+ return 42
+
+
def test_wrap_unwrap():
channel = []
@@ -190,3 +198,260 @@ def f():
wrap(f, wrapper)
assert [frame.f_code.co_name for frame in f()[:4]] == ["f", "wrapper", "f", "test_wrap_stack"]
+
+
+@pytest.mark.asyncio
+async def test_wrap_async_context_manager_exception_on_exit():
+ def wrapper(f, args, kwargs):
+ return f(*args, **kwargs)
+
+ @asynccontextmanager
+ async def g():
+ yield 0
+
+ wrap(g.__wrapped__, wrapper)
+
+ acm = g()
+ assert 0 == await acm.__aenter__()
+ await acm.__aexit__(ValueError, None, None)
+
+
+def test_wrap_generator_yield_from():
+ channel = []
+
+ def wrapper(f, args, kwargs):
+ channel[:] = []
+ for _ in f(*args, **kwargs):
+ channel.append(_)
+ yield _
+
+ def g():
+ yield from range(10)
+
+ wrap(g, wrapper)
+
+ assert list(g()) == list(range(10)) == channel
+
+
+@pytest.mark.asyncio
+async def test_wrap_coroutine():
+ channel = []
+
+ def wrapper(f, args, kwargs):
+ async def _handle_coroutine(c):
+ retval = await c
+ channel.append(retval)
+ return retval
+
+ channel[:] = []
+ retval = f(*args, **kwargs)
+ if isinstance(retval, CoroutineType):
+ return _handle_coroutine(retval)
+ else:
+ channel.append(retval)
+ return retval
+
+ async def c():
+ return await async_func()
+
+ wrap(c, wrapper)
+
+ assert await c() == 42
+
+ assert channel == [42]
+
+
+def test_wrap_args_kwarg():
+ def f(*args, path=None):
+ return (args, path)
+
+ def wrapper(f, args, kwargs):
+ return f(*args, **kwargs)
+
+ wrap(f, wrapper)
+
+ assert f(1, 2) == ((1, 2), None)
+
+
+@pytest.mark.skipif(sys.version_info[:2] > (3, 11), reason="dis is different in python >= 3.12")
+def test_wrap_arg_args_kwarg_kwargs():
+ def f(posarg, *args, path=None, **kwargs):
+ return (posarg, args, path, kwargs)
+
+ def wrapper(f, args, kwargs):
+ return f(*args, **kwargs)
+
+ wrap(f, wrapper)
+
+ assert f(1, 2) == (1, (2,), None, {})
+ assert f(1, 2, 3, foo="bar") == (1, (2, 3), None, {"foo": "bar"})
+ assert f(1, 2, 3, path="bar") == (1, (2, 3), "bar", {})
+ assert f(1, 2, 3, 4, path="bar", foo="baz") == (1, (2, 3, 4), "bar", {"foo": "baz"})
+ assert f(1, path="bar", foo="baz") == (1, (), "bar", {"foo": "baz"})
+
+
+@pytest.mark.asyncio
+async def test_async_generator():
+ async def stream():
+ yield b"hello"
+ yield b""
+ return
+
+ async def body():
+ chunks = []
+ async for chunk in stream():
+ chunks.append(chunk)
+ _body = b"".join(chunks)
+ return _body
+
+ wrapper_called = awrapper_called = False
+
+ async def wrapper(f, args, kwargs):
+ nonlocal wrapper_called
+ wrapper_called = True
+ return await f(*args, **kwargs)
+
+ async def agwrapper(f, args, kwargs):
+ nonlocal awrapper_called
+ awrapper_called = True
+ async for _ in f(*args, **kwargs):
+ yield _
+
+ wrap(stream, agwrapper)
+ wrap(body, wrapper)
+
+ assert await body() == b"hello"
+ assert wrapper_called
+ assert awrapper_called
+
+
+@pytest.mark.asyncio
+async def test_wrap_async_generator_send():
+ def wrapper(f, args, kwargs):
+ return f(*args, **kwargs)
+
+ async def g():
+ yield 0
+ for _ in range(1, 10):
+ n = yield _
+ assert _ == n
+ return
+
+ wrap(g, wrapper)
+
+ channel = []
+
+ async def consume():
+ agen = g()
+ n = await agen.__anext__()
+ channel.append(n)
+ try:
+ while True:
+ n = await agen.asend(n)
+ channel.append(n)
+ except StopAsyncIteration:
+ pass
+
+ assert list(range(10)) == channel
+
+ await consume()
+
+
+@pytest.mark.asyncio
+async def test_double_async_for_with_exception():
+ channel = None
+
+ class StreamConsumed(Exception):
+ pass
+
+ class AsyncIteratorByteStream(object):
+ def __init__(self, stream):
+ self._stream = stream
+ self._is_stream_consumed = False
+
+ async def __aiter__(self):
+ if self._is_stream_consumed:
+ raise StreamConsumed()
+
+ self._is_stream_consumed = True
+ async for part in self._stream:
+ yield part
+
+ async def wrapper(f, args, kwargs):
+ nonlocal channel
+
+ channel = [_ async for _ in f(*args, **kwargs)]
+ for _ in channel:
+ yield _
+ return
+
+ async def stream():
+ yield b"hello"
+ yield b""
+ return
+
+ wrap(stream, wrapper)
+ wrap(AsyncIteratorByteStream.__aiter__, wrapper)
+
+ s = AsyncIteratorByteStream(stream())
+
+ assert b"".join([_ async for _ in s]) == b"hello"
+ assert channel == [b"hello", b""]
+ with pytest.raises(StreamConsumed):
+ b"".join([_ async for _ in s])
+
+
+@pytest.mark.asyncio
+async def test_wrap_async_generator_throw_close():
+ channel = []
+
+ async def wrapper(f, args, kwargs):
+ nonlocal channel
+
+ channel.append(True)
+
+ __ddgen = f(*args, **kwargs)
+ __ddgensend = __ddgen.asend
+ try:
+ value = await __ddgen.__anext__()
+ channel.append(value)
+ except StopAsyncIteration:
+ return
+ while True:
+ try:
+ tosend = yield value
+ except GeneratorExit:
+ channel.append("GeneratorExit")
+ await __ddgen.aclose()
+ raise
+ except: # noqa
+ channel.append(sys.exc_info()[0])
+ value = await __ddgen.athrow(*sys.exc_info())
+ channel.append(value)
+ else:
+ try:
+ value = await __ddgensend(tosend)
+ channel.append(value)
+ except StopAsyncIteration:
+ return
+
+ async def g():
+ while True:
+ try:
+ yield 0
+ except ValueError:
+ yield 1
+
+ wrap(g, wrapper)
+ assert inspect.isasyncgenfunction(g)
+
+ gen = g()
+ assert inspect.isasyncgen(gen)
+
+ for _ in range(10):
+ assert await gen.__anext__() == 0
+ assert await gen.athrow(ValueError) == 1
+
+ await gen.aclose()
+
+ assert channel == [True] + [0, ValueError, 1] * 10 + ["GeneratorExit"]
diff --git a/tests/profiling/collector/test_memalloc.py b/tests/profiling/collector/test_memalloc.py
index 1359d579363..712f6f93662 100644
--- a/tests/profiling/collector/test_memalloc.py
+++ b/tests/profiling/collector/test_memalloc.py
@@ -1,10 +1,12 @@
# -*- encoding: utf-8 -*-
import gc
import os
+import sys
import threading
import pytest
+from ddtrace.profiling.event import DDFrame
from ddtrace.settings.profiling import ProfilingConfig
from ddtrace.settings.profiling import _derive_default_heap_sample_size
@@ -78,12 +80,15 @@ def test_iter_events():
assert nframe >= len(stack)
last_call = stack[0]
assert size >= 1 # size depends on the object size
- if last_call[2] == "" and last_call[1] == _ALLOC_LINE_NUMBER:
+ if last_call == DDFrame(
+ __file__,
+ _ALLOC_LINE_NUMBER,
+ "" if sys.version_info < (3, 12) else "_allocate_1k",
+ "",
+ ):
assert thread_id == threading.main_thread().ident
- assert last_call[0] == __file__
- assert stack[1][0] == __file__
- assert stack[1][1] == _ALLOC_LINE_NUMBER
- assert stack[1][2] == "_allocate_1k"
+ if sys.version_info < (3, 12):
+ assert stack[1] == (__file__, _ALLOC_LINE_NUMBER, "_allocate_1k", "")
object_count += 1
assert object_count >= 1000
@@ -128,18 +133,22 @@ def test_iter_events_multi_thread():
assert nframe >= len(stack)
last_call = stack[0]
assert size >= 1 # size depends on the object size
- if last_call[2] == "" and last_call[1] == _ALLOC_LINE_NUMBER:
- assert last_call[0] == __file__
+ if last_call == DDFrame(
+ __file__,
+ _ALLOC_LINE_NUMBER,
+ "" if sys.version_info < (3, 12) else "_allocate_1k",
+ "",
+ ):
if thread_id == threading.main_thread().ident:
count_object += 1
- assert stack[1][0] == __file__
- assert stack[1][1] == _ALLOC_LINE_NUMBER
- assert stack[1][2] == "_allocate_1k"
+ if sys.version_info < (3, 12):
+ assert stack[1] == (__file__, _ALLOC_LINE_NUMBER, "_allocate_1k", "")
elif thread_id == t.ident:
count_thread += 1
- assert stack[2][0] == threading.__file__
- assert stack[2][1] > 0
- assert stack[2][2] == "run"
+ entry = 2 if sys.version_info < (3, 12) else 1
+ assert stack[entry][0] == threading.__file__
+ assert stack[entry][1] > 0
+ assert stack[entry][2] == "run"
assert count_object >= 1000
assert count_thread >= 1000
@@ -160,13 +169,14 @@ def test_memory_collector():
assert 0 < event.capture_pct <= 100
last_call = event.frames[0]
assert event.size > 0
- if last_call[2] == "" and last_call[1] == _ALLOC_LINE_NUMBER:
+ if last_call == DDFrame(
+ __file__, _ALLOC_LINE_NUMBER, "" if sys.version_info < (3, 12) else "_allocate_1k", ""
+ ):
assert event.thread_id == threading.main_thread().ident
assert event.thread_name == "MainThread"
count_object += 1
- assert event.frames[2][0] == __file__
- assert event.frames[2][1] == 152
- assert event.frames[2][2] == "test_memory_collector"
+ entry = 2 if sys.version_info < (3, 12) else 1
+ assert event.frames[entry] == DDFrame(__file__, 161, "test_memory_collector", "")
assert count_object > 0
@@ -226,15 +236,8 @@ def test_heap():
if thread_id == threading.main_thread().ident:
thread_found = True
assert isinstance(thread_id, int)
- if (
- stack[0][0] == __file__
- and stack[0][1] == _ALLOC_LINE_NUMBER
- and stack[0][2] == ""
- and stack[1][0] == __file__
- and stack[1][1] == _ALLOC_LINE_NUMBER
- and stack[1][2] == "_allocate_1k"
- and stack[2][0] == __file__
- and stack[2][2] == "test_heap"
+ if stack[0] == DDFrame(
+ __file__, _ALLOC_LINE_NUMBER, "" if sys.version_info < (3, 12) else "_allocate_1k", ""
):
break
else:
@@ -245,15 +248,8 @@ def test_heap():
assert 0 < len(stack) <= max_nframe
assert size > 0
assert isinstance(thread_id, int)
- if (
- stack[0][0] == __file__
- and stack[0][1] == _ALLOC_LINE_NUMBER
- and stack[0][2] == ""
- and stack[1][0] == __file__
- and stack[1][1] == _ALLOC_LINE_NUMBER
- and stack[1][2] == "_allocate_1k"
- and stack[2][0] == __file__
- and stack[2][2] == "_pre_allocate_1k"
+ if stack[0] == DDFrame(
+ __file__, _ALLOC_LINE_NUMBER, "" if sys.version_info < (3, 12) else "_allocate_1k", ""
):
break
else:
@@ -264,15 +260,11 @@ def test_heap():
assert 0 < len(stack) <= max_nframe
assert size > 0
assert isinstance(thread_id, int)
+ entry = 2 if sys.version_info < (3, 12) else 1
if (
- stack[0][0] == __file__
- and stack[0][1] == _ALLOC_LINE_NUMBER
- and stack[0][2] == ""
- and stack[1][0] == __file__
- and stack[1][1] == _ALLOC_LINE_NUMBER
- and stack[1][2] == "_allocate_1k"
- and stack[2][0] == __file__
- and stack[2][2] == "test_heap"
+ stack[0]
+ == DDFrame(__file__, _ALLOC_LINE_NUMBER, "" if sys.version_info < (3, 12) else "_allocate_1k", "")
+ and stack[entry].function_name == "test_heap"
):
pytest.fail("Allocated memory still in heap")
del y
diff --git a/tests/profiling/test_uwsgi.py b/tests/profiling/test_uwsgi.py
index b99246b43f0..50cbb968d07 100644
--- a/tests/profiling/test_uwsgi.py
+++ b/tests/profiling/test_uwsgi.py
@@ -13,9 +13,9 @@
from . import utils
-# uwsgi does not support Python 3.10 yet
+# uwsgi does not support Python 3.12 yet
# uwsgi is not available on Windows
-if sys.version_info[:2] >= (3, 10) or sys.platform == "win32":
+if sys.version_info[:2] >= (3, 12) or sys.platform == "win32":
pytestmark = pytest.mark.skip
TESTING_GEVENT = os.getenv("DD_PROFILE_TEST_GEVENT", False)
diff --git a/tests/smoke_test.py b/tests/smoke_test.py
index 1a89409c1ed..615171dba31 100644
--- a/tests/smoke_test.py
+++ b/tests/smoke_test.py
@@ -16,7 +16,7 @@ def mac_supported_iast_version():
if __name__ == "__main__":
# ASM IAST smoke test
- if sys.version_info >= (3, 6, 0) and system() != "Windows" and mac_supported_iast_version():
+ if (3, 6, 0) <= sys.version_info < (3, 12) and system() != "Windows" and mac_supported_iast_version():
from ddtrace.appsec._iast._taint_tracking._native import ops
assert ops
diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py
index 8e3aa8bea77..bc7ee6b2b7b 100644
--- a/tests/telemetry/test_telemetry.py
+++ b/tests/telemetry/test_telemetry.py
@@ -8,7 +8,12 @@
def test_enable(test_agent_session, run_python_code_in_subprocess):
code = """
from ddtrace.internal.telemetry import telemetry_writer
+from ddtrace.internal.service import ServiceStatus
+
telemetry_writer.enable()
+
+assert telemetry_writer.status == ServiceStatus.RUNNING
+assert telemetry_writer._worker is not None
"""
stdout, stderr, status, _ = run_python_code_in_subprocess(code)
@@ -17,26 +22,10 @@ def test_enable(test_agent_session, run_python_code_in_subprocess):
assert stdout == b"", stderr
assert stderr == b""
- events = test_agent_session.get_events()
- assert len(events) == 3
-
- # Same runtime id is used
- assert events[0]["runtime_id"] == events[1]["runtime_id"]
- assert events[0]["request_type"] == "app-closing"
- assert events[1]["request_type"] == "app-dependencies-loaded"
- assert events[2]["request_type"] == "app-started"
- assert events[2]["payload"]["error"] == {"code": 0, "message": ""}
-
@pytest.mark.snapshot
def test_telemetry_enabled_on_first_tracer_flush(test_agent_session, ddtrace_run_python_code_in_subprocess):
"""assert telemetry events are generated after the first trace is flushed to the agent"""
- # Using ddtrace-run and/or importing ddtrace alone should not enable telemetry
- # Telemetry data should only be sent after the first trace to the agent
- _, stderr, status, _ = ddtrace_run_python_code_in_subprocess("import ddtrace")
- assert status == 0, stderr
- # No trace and No Telemetry
- assert len(test_agent_session.get_events()) == 0
# Submit a trace to the agent in a subprocess
code = 'from ddtrace import tracer; span = tracer.trace("test-telemetry"); span.finish()'
@@ -58,6 +47,11 @@ def test_telemetry_enabled_on_first_tracer_flush(test_agent_session, ddtrace_run
def test_enable_fork(test_agent_session, run_python_code_in_subprocess):
"""assert app-started/app-closing events are only sent in parent process"""
code = """
+import warnings
+# This test logs the following warning in py3.12:
+# This process (pid=402) is multi-threaded, use of fork() may lead to deadlocks in the child
+warnings.filterwarnings("ignore", category=DeprecationWarning)
+
import os
from ddtrace.internal.runtime import get_runtime_id
@@ -65,6 +59,7 @@ def test_enable_fork(test_agent_session, run_python_code_in_subprocess):
# We have to start before forking since fork hooks are not enabled until after enabling
telemetry_writer.enable()
+telemetry_writer._app_started_event()
if os.fork() == 0:
# Send multiple started events to confirm none get sent
@@ -78,27 +73,29 @@ def test_enable_fork(test_agent_session, run_python_code_in_subprocess):
stdout, stderr, status, _ = run_python_code_in_subprocess(code)
assert status == 0, stderr
- assert stderr == b""
+ assert stderr == b"", stderr
runtime_id = stdout.strip().decode("utf-8")
requests = test_agent_session.get_requests()
# We expect 2 events from the parent process to get sent, but none from the child process
- assert len(requests) == 3
+ assert len(requests) == 2
# Validate that the runtime id sent for every event is the parent processes runtime id
assert requests[0]["body"]["runtime_id"] == runtime_id
assert requests[0]["body"]["request_type"] == "app-closing"
assert requests[1]["body"]["runtime_id"] == runtime_id
- assert requests[1]["body"]["request_type"] == "app-dependencies-loaded"
- assert requests[1]["body"]["runtime_id"] == runtime_id
- assert requests[2]["body"]["request_type"] == "app-started"
- assert requests[2]["body"]["runtime_id"] == runtime_id
+ assert requests[1]["body"]["request_type"] == "app-started"
def test_enable_fork_heartbeat(test_agent_session, run_python_code_in_subprocess):
"""assert app-heartbeat events are only sent in parent process when no other events are queued"""
code = """
+import warnings
+# This test logs the following warning in py3.12:
+# This process (pid=402) is multi-threaded, use of fork() may lead to deadlocks in the child
+warnings.filterwarnings("ignore", category=DeprecationWarning)
+
import os
from ddtrace.internal.runtime import get_runtime_id
@@ -120,7 +117,7 @@ def test_enable_fork_heartbeat(test_agent_session, run_python_code_in_subprocess
stdout, stderr, status, _ = run_python_code_in_subprocess(code)
assert status == 0, stderr
- assert stderr == b""
+ assert stderr == b"", stderr
runtime_id = stdout.strip().decode("utf-8")
@@ -138,6 +135,11 @@ def test_heartbeat_interval_configuration(run_python_code_in_subprocess):
env = os.environ.copy()
env["DD_TELEMETRY_HEARTBEAT_INTERVAL"] = "61"
code = """
+import warnings
+# This test logs the following warning in py3.12:
+# This process (pid=402) is multi-threaded, use of fork() may lead to deadlocks in the child
+warnings.filterwarnings("ignore", category=DeprecationWarning)
+
from ddtrace import config
assert config._telemetry_heartbeat_interval == 61
@@ -156,6 +158,11 @@ def test_logs_after_fork(run_python_code_in_subprocess):
# Regression test: telemetry writer should not log an error when a process forks
_, err, status, _ = run_python_code_in_subprocess(
"""
+import warnings
+# This test logs the following warning in py3.12:
+# This process (pid=402) is multi-threaded, use of fork() may lead to deadlocks in the child
+warnings.filterwarnings("ignore", category=DeprecationWarning)
+
import ddtrace
import logging
import os
@@ -167,7 +174,7 @@ def test_logs_after_fork(run_python_code_in_subprocess):
)
assert status == 0, err
- assert err == b""
+ assert err == b"", err
def test_app_started_error_handled_exception(test_agent_session, run_python_code_in_subprocess):
@@ -250,6 +257,9 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
from ddtrace import patch, tracer
patch(raise_errors=False, sqlite3=True)
+
+# Create a span to start the telemetry writer
+tracer.trace("hi").finish()
"""
_, stderr, status, _ = run_python_code_in_subprocess(code)
@@ -260,15 +270,11 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
events = test_agent_session.get_events()
- assert len(events) == 5
- # Same runtime id is used
- assert (
- events[0]["runtime_id"]
- == events[1]["runtime_id"]
- == events[2]["runtime_id"]
- == events[3]["runtime_id"]
- == events[4]["runtime_id"]
- )
+ assert len(events) > 1
+ for event in events:
+ # Same runtime id is used
+ assert event["runtime_id"] == events[0]["runtime_id"]
+
integrations_events = [event for event in events if event["request_type"] == "app-integrations-change"]
assert len(integrations_events) == 1
@@ -277,12 +283,14 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
== "failed to import ddtrace module 'ddtrace.contrib.sqlite3' when patching on import"
)
- metric_events = [event for event in events if event["request_type"] == "generate-metrics"]
-
+ metric_events = [
+ event
+ for event in events
+ if event["request_type"] == "generate-metrics"
+ and event["payload"]["series"][0]["metric"] == "integration_errors"
+ ]
assert len(metric_events) == 1
- assert metric_events[0]["payload"]["namespace"] == "tracers"
assert len(metric_events[0]["payload"]["series"]) == 1
- assert metric_events[0]["payload"]["series"][0]["metric"] == "integration_errors"
assert metric_events[0]["payload"]["series"][0]["type"] == "count"
assert len(metric_events[0]["payload"]["series"][0]["points"]) == 1
assert metric_events[0]["payload"]["series"][0]["points"][0][1] == 1
diff --git a/tests/telemetry/test_telemetry_metrics_e2e.py b/tests/telemetry/test_telemetry_metrics_e2e.py
index 6755e387255..55f62589247 100644
--- a/tests/telemetry/test_telemetry_metrics_e2e.py
+++ b/tests/telemetry/test_telemetry_metrics_e2e.py
@@ -3,7 +3,6 @@
import os
import subprocess
import sys
-import time
import pytest
@@ -28,8 +27,6 @@ def _build_env():
def gunicorn_server(telemetry_metrics_enabled="true", token=None):
cmd = ["ddtrace-run", "gunicorn", "-w", "1", "-b", "0.0.0.0:8000", "tests.telemetry.app:app"]
env = _build_env()
- env["DD_TELEMETRY_METRICS_ENABLED"] = telemetry_metrics_enabled
- env["DD_TELEMETRY_HEARTBEAT_INTERVAL"] = "1.0"
env["_DD_TRACE_WRITER_ADDITIONAL_HEADERS"] = "X-Datadog-Test-Session-Token:{}".format(token)
env["DD_TRACE_AGENT_URL"] = os.environ.get("DD_TRACE_AGENT_URL", "")
env["DD_TRACE_DEBUG"] = "true"
@@ -90,19 +87,15 @@ def test_telemetry_metrics_enabled_on_gunicorn_child_process(test_agent_session)
gunicorn_client.get("/count_metric")
response = gunicorn_client.get("/count_metric")
assert response.status_code == 200
- # DD_TELEMETRY_HEARTBEAT_INTERVAL is set to 1 second
- time.sleep(1)
gunicorn_client.get("/count_metric")
response = gunicorn_client.get("/count_metric")
assert response.status_code == 200
events = test_agent_session.get_events()
metrics = list(filter(lambda event: event["request_type"] == "generate-metrics", events))
- assert len(metrics) == 2
+ assert len(metrics) == 1
assert metrics[0]["payload"]["series"][0]["metric"] == "test_metric"
- assert metrics[0]["payload"]["series"][0]["points"][0][1] == 2.0
- assert metrics[1]["payload"]["series"][0]["metric"] == "test_metric"
- assert metrics[1]["payload"]["series"][0]["points"][0][1] == 3.0
+ assert metrics[0]["payload"]["series"][0]["points"][0][1] == 5
def test_span_creation_and_finished_metrics_datadog(test_agent_session, ddtrace_run_python_code_in_subprocess):
diff --git a/tests/telemetry/test_writer.py b/tests/telemetry/test_writer.py
index 1c8d483f9ba..2f26997e789 100644
--- a/tests/telemetry/test_writer.py
+++ b/tests/telemetry/test_writer.py
@@ -372,8 +372,8 @@ def test_send_failing_request(mock_status, telemetry_writer):
with httpretty.enabled():
httpretty.register_uri(httpretty.POST, telemetry_writer._client.url, status=mock_status)
with mock.patch("ddtrace.internal.telemetry.writer.log") as log:
- # sends failing app-closing event
- telemetry_writer.app_shutdown()
+ # sends failing app-heartbeat event
+ telemetry_writer.periodic()
# asserts unsuccessful status code was logged
log.debug.assert_called_with(
"failed to send telemetry to the Datadog Agent at %s. response: %s",
@@ -392,13 +392,11 @@ def test_telemetry_graceful_shutdown(telemetry_writer, test_agent_session, mock_
telemetry_writer.app_shutdown()
events = test_agent_session.get_events()
- assert len(events) == 3
+ assert len(events) == 1
# Reverse chronological order
assert events[0]["request_type"] == "app-closing"
- assert events[0] == _get_request_body({}, "app-closing", 3)
- assert events[1]["request_type"] == "app-dependencies-loaded"
- assert events[2]["request_type"] == "app-started"
+ assert events[0] == _get_request_body({}, "app-closing", 1)
def test_app_heartbeat_event_periodic(mock_time, telemetry_writer, test_agent_session):
@@ -407,6 +405,7 @@ def test_app_heartbeat_event_periodic(mock_time, telemetry_writer, test_agent_se
# Ensure telemetry writer is initialized to send periodic events
telemetry_writer._is_periodic = True
+ telemetry_writer.started = True
# Assert default telemetry interval is 10 seconds and the expected periodic threshold and counts are set
assert telemetry_writer.interval == 10
assert telemetry_writer._periodic_threshold == 5
diff --git a/tests/tracer/runtime/test_runtime_metrics.py b/tests/tracer/runtime/test_runtime_metrics.py
index 4b0296cddf5..a311caae846 100644
--- a/tests/tracer/runtime/test_runtime_metrics.py
+++ b/tests/tracer/runtime/test_runtime_metrics.py
@@ -172,14 +172,14 @@ def test_tracer_metrics(self):
# check to last set of metrics returned to confirm tags were set
for gauge in received[-1:]:
- self.assertRegexpMatches(gauge, "service:parent")
- self.assertRegexpMatches(gauge, "service:child")
- self.assertNotRegexpMatches(gauge, "service:db")
- self.assertRegexpMatches(gauge, "env:tests.dog")
- self.assertRegexpMatches(gauge, "lang_interpreter:CPython")
- self.assertRegexpMatches(gauge, "lang_version:")
- self.assertRegexpMatches(gauge, "lang:python")
- self.assertRegexpMatches(gauge, "tracer_version:")
+ self.assertRegex(gauge, "service:parent")
+ self.assertRegex(gauge, "service:child")
+ self.assertNotRegex(gauge, "service:db")
+ self.assertRegex(gauge, "env:tests.dog")
+ self.assertRegex(gauge, "lang_interpreter:CPython")
+ self.assertRegex(gauge, "lang_version:")
+ self.assertRegex(gauge, "lang:python")
+ self.assertRegex(gauge, "tracer_version:")
def test_root_and_child_span_runtime_internal_span_types(self):
with runtime_metrics_service(tracer=self.tracer):
diff --git a/tests/tracer/test_trace_utils.py b/tests/tracer/test_trace_utils.py
index faf17550d22..b43b2dff53d 100644
--- a/tests/tracer/test_trace_utils.py
+++ b/tests/tracer/test_trace_utils.py
@@ -490,7 +490,10 @@ def test_set_http_meta_insecure_cookies_iast_disabled(span, int_config):
assert not span_report
-@pytest.mark.skipif(sys.version_info < (3, 6, 0), reason="Python 3.6+ test")
+@pytest.mark.skipif(
+ sys.version_info < (3, 6, 0) or sys.version_info >= (3, 12),
+ reason="Python 3.6+ test, IAST not supported with Python 3.12",
+)
def test_set_http_meta_insecure_cookies_iast_enabled(span, int_config):
with override_global_config(dict(_iast_enabled=True, _appsec_enabled=True)):
cookies = {"foo": "bar"}