diff --git a/.gitlab/tests.yml b/.gitlab/tests.yml index b6cc09ad3bd..7c89ea1a4c6 100644 --- a/.gitlab/tests.yml +++ b/.gitlab/tests.yml @@ -85,6 +85,8 @@ include: done ./scripts/check-diff ".riot/requirements/" \ "Changes detected after running riot. Consider deleting changed files, running scripts/compile-and-prune-test-requirements and committing the result." + ./scripts/check-diff "ddtrace/contrib/integration_registry/registry.yaml" \ + "Registry YAML file (ddtrace/contrib/integration_registry/registry.yaml) was modified. Please run: scripts/integration_registry/update_and_format_registry.py and commit the changes." .test_base_riot_snapshot: diff --git a/.riot/requirements/2b3511f.txt b/.riot/requirements/103234b.txt similarity index 50% rename from .riot/requirements/2b3511f.txt rename to .riot/requirements/103234b.txt index b8571f19a82..4f52bc59094 100644 --- a/.riot/requirements/2b3511f.txt +++ b/.riot/requirements/103234b.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --no-annotate .riot/requirements/2b3511f.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/103234b.in # -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.8.0 django==2.2.28 django-configurations==2.3.2 djangorestframework==3.12.4 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/10853b3.txt b/.riot/requirements/10853b3.txt new file mode 100644 index 00000000000..932a7ab7d8e --- /dev/null +++ b/.riot/requirements/10853b3.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/10853b3.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.21.0 diff --git a/.riot/requirements/f24db70.txt b/.riot/requirements/1089a44.txt similarity index 68% rename from .riot/requirements/f24db70.txt rename to .riot/requirements/1089a44.txt index 51c04922304..09f54b83b6f 100644 --- a/.riot/requirements/f24db70.txt +++ b/.riot/requirements/1089a44.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --no-annotate .riot/requirements/f24db70.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1089a44.in # asgiref==3.8.1 -attrs==25.1.0 -coverage[toml]==7.6.10 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 -pytest-cov==6.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.16.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==78.1.0 diff --git a/.riot/requirements/109f96d.txt b/.riot/requirements/109f96d.txt new file mode 100644 index 00000000000..3f8370d2b2e --- /dev/null +++ b/.riot/requirements/109f96d.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/109f96d.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +graphene==3.4.3 +graphql-core==3.2.6 +graphql-relay==3.2.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 diff --git a/.riot/requirements/10b643c.txt b/.riot/requirements/10b643c.txt new file mode 100644 index 00000000000..2caebfda648 --- /dev/null +++ b/.riot/requirements/10b643c.txt @@ -0,0 +1,27 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/10b643c.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 diff --git a/.riot/requirements/1ada88e.txt b/.riot/requirements/10c216c.txt similarity index 66% rename from .riot/requirements/1ada88e.txt rename to .riot/requirements/10c216c.txt index 5fc0aa5664d..2d6656ffc4e 100644 --- a/.riot/requirements/1ada88e.txt +++ b/.riot/requirements/10c216c.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1ada88e.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/10c216c.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 -django==4.2.16 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/10e98b3.txt b/.riot/requirements/10e98b3.txt deleted file mode 100644 index 9b867ad98cc..00000000000 --- a/.riot/requirements/10e98b3.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 .riot/requirements/10e98b3.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 diff --git a/.riot/requirements/1146bb7.txt b/.riot/requirements/1146bb7.txt deleted file mode 100644 index bc45be322a6..00000000000 --- a/.riot/requirements/1146bb7.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1146bb7.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 diff --git a/.riot/requirements/1157d7b.txt b/.riot/requirements/1157d7b.txt deleted file mode 100644 index b89cff9e685..00000000000 --- a/.riot/requirements/1157d7b.txt +++ /dev/null @@ -1,19 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1157d7b.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/1239a3c.txt b/.riot/requirements/11cd1a5.txt similarity index 67% rename from .riot/requirements/1239a3c.txt rename to .riot/requirements/11cd1a5.txt index 1d7ec8b0a38..f5d18914248 100644 --- a/.riot/requirements/1239a3c.txt +++ b/.riot/requirements/11cd1a5.txt @@ -2,32 +2,32 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1239a3c.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/11cd1a5.in # asgiref==3.8.1 -attrs==25.1.0 -coverage[toml]==7.6.10 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 -pytest-cov==6.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.16.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 +typing-extensions==4.13.2 # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==78.1.0 diff --git a/.riot/requirements/1584f8c.txt b/.riot/requirements/11e6ad6.txt similarity index 66% rename from .riot/requirements/1584f8c.txt rename to .riot/requirements/11e6ad6.txt index 602372e9b06..9ff674c168f 100644 --- a/.riot/requirements/1584f8c.txt +++ b/.riot/requirements/11e6ad6.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1584f8c.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/11e6ad6.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 -django==4.2.16 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/13658ae.txt b/.riot/requirements/11f9495.txt similarity index 51% rename from .riot/requirements/13658ae.txt rename to .riot/requirements/11f9495.txt index e4ac641af5c..40cee8a181a 100644 --- a/.riot/requirements/13658ae.txt +++ b/.riot/requirements/11f9495.txt @@ -2,23 +2,26 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/13658ae.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/11f9495.in # -attrs==24.2.0 -certifi==2024.8.30 -coverage[toml]==7.6.1 -elastic-transport==8.15.0 -elasticsearch==8.15.1 +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch==9.0.0 elasticsearch7==7.17.12 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 sortedcontainers==2.4.0 +typing-extensions==4.13.2 urllib3==1.26.20 diff --git a/.riot/requirements/11ff4d8.txt b/.riot/requirements/11ff4d8.txt deleted file mode 100644 index 290d82ad814..00000000000 --- a/.riot/requirements/11ff4d8.txt +++ /dev/null @@ -1,19 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/11ff4d8.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/1200a2a.txt b/.riot/requirements/1200a2a.txt new file mode 100644 index 00000000000..b62c701008a --- /dev/null +++ b/.riot/requirements/1200a2a.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1200a2a.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 diff --git a/.riot/requirements/498209d.txt b/.riot/requirements/121fc8d.txt similarity index 76% rename from .riot/requirements/498209d.txt rename to .riot/requirements/121fc8d.txt index b975548628c..b3460fa999e 100644 --- a/.riot/requirements/498209d.txt +++ b/.riot/requirements/121fc8d.txt @@ -2,21 +2,21 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/498209d.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/121fc8d.in # -attrs==24.3.0 -coverage[toml]==7.6.9 +attrs==25.3.0 +coverage[toml]==7.8.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 msgpack==1.1.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 py-cpuinfo==9.0.0 -pytest==8.3.4 +pytest==8.3.5 pytest-benchmark==4.0.0 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/122e427.txt b/.riot/requirements/122e427.txt new file mode 100644 index 00000000000..58d51498b2c --- /dev/null +++ b/.riot/requirements/122e427.txt @@ -0,0 +1,31 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/122e427.in +# +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.6.1 +elastic-transport==8.17.1 +elasticsearch==9.0.0 +elasticsearch7==7.17.12 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 +zipp==3.20.2 diff --git a/.riot/requirements/127564e.txt b/.riot/requirements/127564e.txt deleted file mode 100644 index 6bd7e14b818..00000000000 --- a/.riot/requirements/127564e.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/127564e.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -urllib3==2.1.0 diff --git a/.riot/requirements/665ee2b.txt b/.riot/requirements/13180f0.txt similarity index 66% rename from .riot/requirements/665ee2b.txt rename to .riot/requirements/13180f0.txt index 8eb56a39c52..6f2c91991a5 100644 --- a/.riot/requirements/665ee2b.txt +++ b/.riot/requirements/13180f0.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/665ee2b.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/13180f0.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/12d5b48.txt b/.riot/requirements/132915c.txt similarity index 53% rename from .riot/requirements/12d5b48.txt rename to .riot/requirements/132915c.txt index 4b79d8945c7..7b85f7727d7 100644 --- a/.riot/requirements/12d5b48.txt +++ b/.riot/requirements/132915c.txt @@ -2,26 +2,26 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/12d5b48.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/132915c.in # -attrs==24.2.0 +attrs==25.3.0 coverage[toml]==7.6.1 exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.70.0 grpcio==1.59.5 hypothesis==6.45.0 -importlib-metadata==8.4.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 +protobuf==5.29.4 +pytest==8.3.5 pytest-asyncio==0.23.7 pytest-cov==5.0.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.20.1 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/bed28f9.txt b/.riot/requirements/132ab47.txt similarity index 54% rename from .riot/requirements/bed28f9.txt rename to .riot/requirements/132ab47.txt index 55011c5733d..9d5524a6a8f 100644 --- a/.riot/requirements/bed28f9.txt +++ b/.riot/requirements/132ab47.txt @@ -2,31 +2,31 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/bed28f9.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/132ab47.in # asgiref==3.8.1 -attrs==23.2.0 +attrs==25.3.0 backports-zoneinfo==0.2.1 -coverage[toml]==7.6.0 -django==4.2.14 +coverage[toml]==7.6.1 +django==4.2.20 django-configurations==2.5.1 djangorestframework==3.15.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 diff --git a/.riot/requirements/13990f5.txt b/.riot/requirements/13990f5.txt deleted file mode 100644 index bb96b335454..00000000000 --- a/.riot/requirements/13990f5.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 .riot/requirements/13990f5.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==3.2.25 -django-configurations==2.5.1 -djangorestframework==3.11.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 diff --git a/.riot/requirements/13c380c.txt b/.riot/requirements/13c380c.txt new file mode 100644 index 00000000000..bea29a1b8ab --- /dev/null +++ b/.riot/requirements/13c380c.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/13c380c.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/ae8bd25.txt b/.riot/requirements/13ff868.txt similarity index 60% rename from .riot/requirements/ae8bd25.txt rename to .riot/requirements/13ff868.txt index f0736d28cfc..93f77c922d7 100644 --- a/.riot/requirements/ae8bd25.txt +++ b/.riot/requirements/13ff868.txt @@ -2,25 +2,25 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/ae8bd25.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/13ff868.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 -django==4.2.16 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 -djangorestframework==3.15.2 +djangorestframework==3.16.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 diff --git a/.riot/requirements/fbe8250.txt b/.riot/requirements/1407476.txt similarity index 66% rename from .riot/requirements/fbe8250.txt rename to .riot/requirements/1407476.txt index 81296b5d3fe..36903e5bd21 100644 --- a/.riot/requirements/fbe8250.txt +++ b/.riot/requirements/1407476.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/fbe8250.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1407476.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/1435097.txt b/.riot/requirements/1435097.txt new file mode 100644 index 00000000000..6fedc9d4149 --- /dev/null +++ b/.riot/requirements/1435097.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1435097.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +py-cpuinfo==9.0.0 +pytest==8.3.5 +pytest-benchmark==4.0.0 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/1437520.txt b/.riot/requirements/1437520.txt new file mode 100644 index 00000000000..afbf5c53734 --- /dev/null +++ b/.riot/requirements/1437520.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1437520.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +events==0.5 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +urllib3==2.4.0 diff --git a/.riot/requirements/18c6e70.txt b/.riot/requirements/14a4ad8.txt similarity index 63% rename from .riot/requirements/18c6e70.txt rename to .riot/requirements/14a4ad8.txt index f257d8ded2b..d30b28c50a7 100644 --- a/.riot/requirements/18c6e70.txt +++ b/.riot/requirements/14a4ad8.txt @@ -2,18 +2,18 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/18c6e70.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/14a4ad8.in # -attrs==24.2.0 -coverage[toml]==7.6.1 +attrs==25.3.0 +coverage[toml]==7.8.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/14b9202.txt b/.riot/requirements/14b9202.txt new file mode 100644 index 00000000000..ddd1d960b95 --- /dev/null +++ b/.riot/requirements/14b9202.txt @@ -0,0 +1,39 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/14b9202.in +# +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +frozenlist==1.6.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.4.3 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.3.1 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.20.0 diff --git a/.riot/requirements/1560ba9.txt b/.riot/requirements/1560ba9.txt new file mode 100644 index 00000000000..e7f12e49d80 --- /dev/null +++ b/.riot/requirements/1560ba9.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1560ba9.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/1588200.txt b/.riot/requirements/1588200.txt new file mode 100644 index 00000000000..00474bc3e5f --- /dev/null +++ b/.riot/requirements/1588200.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1588200.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/1591bf5.txt b/.riot/requirements/1591bf5.txt new file mode 100644 index 00000000000..c227fbeeeb7 --- /dev/null +++ b/.riot/requirements/1591bf5.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1591bf5.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.70.0 +grpcio==1.59.5 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/15996f6.txt b/.riot/requirements/15996f6.txt new file mode 100644 index 00000000000..a377dc28bd4 --- /dev/null +++ b/.riot/requirements/15996f6.txt @@ -0,0 +1,30 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/15996f6.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +graphene==3.4.3 +graphql-core==3.2.6 +graphql-relay==3.2.0 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 diff --git a/.riot/requirements/15ad8d9.txt b/.riot/requirements/15ad8d9.txt deleted file mode 100644 index 502d944b1cc..00000000000 --- a/.riot/requirements/15ad8d9.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/15ad8d9.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/160ea38.txt b/.riot/requirements/160ea38.txt new file mode 100644 index 00000000000..7983d6c8aef --- /dev/null +++ b/.riot/requirements/160ea38.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/160ea38.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +py-cpuinfo==9.0.0 +pytest==8.3.5 +pytest-benchmark==4.0.0 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/104daf8.txt b/.riot/requirements/1611a53.txt similarity index 63% rename from .riot/requirements/104daf8.txt rename to .riot/requirements/1611a53.txt index e25e2cb84d2..7f043ee4880 100644 --- a/.riot/requirements/104daf8.txt +++ b/.riot/requirements/1611a53.txt @@ -2,24 +2,24 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/104daf8.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1611a53.in # -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.6.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opensearch-py[requests]==1.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 requests==2.32.3 sortedcontainers==2.4.0 urllib3==1.26.20 diff --git a/.riot/requirements/26ee64c.txt b/.riot/requirements/16240ae.txt similarity index 73% rename from .riot/requirements/26ee64c.txt rename to .riot/requirements/16240ae.txt index f1a65526c25..51ff56b9100 100644 --- a/.riot/requirements/26ee64c.txt +++ b/.riot/requirements/16240ae.txt @@ -2,14 +2,14 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/26ee64c.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/16240ae.in # amqp==5.3.1 -attrs==24.3.0 +attrs==25.3.0 backports-zoneinfo[tzdata]==0.2.1 billiard==4.2.1 -celery==5.4.0 -certifi==2024.12.14 +celery==5.5.1 +certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 click-didyoumean==0.3.1 @@ -23,27 +23,27 @@ greenlet==3.1.1 hypothesis==6.45.0 idna==3.10 importlib-metadata==8.5.0 -iniconfig==2.0.0 -kombu==5.4.2 -mock==5.1.0 +iniconfig==2.1.0 +kombu==5.5.3 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -prompt-toolkit==3.0.48 -pytest==8.3.4 +prompt-toolkit==3.0.51 +pytest==8.3.5 pytest-cov==5.0.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 python-dateutil==2.9.0.post0 -pytz==2024.2 +pytz==2025.2 requests==2.32.3 six==1.17.0 sortedcontainers==2.4.0 sqlalchemy==1.2.19 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 -tzdata==2024.2 +typing-extensions==4.13.2 +tzdata==2025.2 urllib3==2.2.3 vine==5.1.0 wcwidth==0.2.13 @@ -52,4 +52,4 @@ zope-event==5.0 zope-interface==7.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.3.0 +setuptools==75.3.2 diff --git a/.riot/requirements/16313f3.txt b/.riot/requirements/16313f3.txt new file mode 100644 index 00000000000..a68dddbd795 --- /dev/null +++ b/.riot/requirements/16313f3.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/16313f3.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +urllib3==1.26.20 diff --git a/.riot/requirements/166af91.txt b/.riot/requirements/166af91.txt deleted file mode 100644 index 3ea3c4ab9b6..00000000000 --- a/.riot/requirements/166af91.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 .riot/requirements/166af91.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.4.0 -py-cpuinfo==9.0.0 -pytest==8.0.0 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/16856c4.txt b/.riot/requirements/16856c4.txt deleted file mode 100644 index b1f44451666..00000000000 --- a/.riot/requirements/16856c4.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 .riot/requirements/16856c4.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/1691156.txt b/.riot/requirements/1691156.txt deleted file mode 100644 index 58e51aa3337..00000000000 --- a/.riot/requirements/1691156.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1691156.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 diff --git a/.riot/requirements/169a543.txt b/.riot/requirements/169a543.txt deleted file mode 100644 index d82561692f5..00000000000 --- a/.riot/requirements/169a543.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/169a543.in -# -aiohttp==3.9.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -exceptiongroup==1.2.0 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -yarl==1.9.4 -zipp==3.17.0 diff --git a/.riot/requirements/169b006.txt b/.riot/requirements/169b006.txt new file mode 100644 index 00000000000..aaa16a423f8 --- /dev/null +++ b/.riot/requirements/169b006.txt @@ -0,0 +1,23 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/169b006.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/16a5a2e.txt b/.riot/requirements/16a5a2e.txt new file mode 100644 index 00000000000..d03760acd7a --- /dev/null +++ b/.riot/requirements/16a5a2e.txt @@ -0,0 +1,40 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/16a5a2e.in +# +attrs==25.3.0 +click==8.1.8 +coverage[toml]==7.8.0 +distlib==0.3.9 +filelock==3.18.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 +markdown-it-py==3.0.0 +mdurl==0.1.2 +mock==5.2.0 +opentracing==2.4.0 +packaging==25.0 +pexpect==4.9.0 +platformdirs==4.3.7 +pluggy==1.5.0 +ptyprocess==0.7.0 +pygments==2.19.1 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +pyyaml==6.0.2 +referencing==0.36.2 +rich==14.0.0 +riot==0.20.1 +rpds-py==0.24.0 +sortedcontainers==2.4.0 +virtualenv==20.26.6 + +# The following packages are considered to be unsafe in a requirements file: +setuptools==79.0.0 diff --git a/.riot/requirements/16ac1f1.txt b/.riot/requirements/16ac1f1.txt new file mode 100644 index 00000000000..d3fbd86c1c3 --- /dev/null +++ b/.riot/requirements/16ac1f1.txt @@ -0,0 +1,30 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/16ac1f1.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +events==0.5 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==2.4.0 diff --git a/.riot/requirements/16bd71d.txt b/.riot/requirements/16bd71d.txt new file mode 100644 index 00000000000..ce4ede6acc8 --- /dev/null +++ b/.riot/requirements/16bd71d.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/16bd71d.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +googleapis-common-protos==1.70.0 +grpcio==1.49.1 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/16de9c4.txt b/.riot/requirements/16de9c4.txt deleted file mode 100644 index ed357be4e45..00000000000 --- a/.riot/requirements/16de9c4.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.13 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate .riot/requirements/16de9c4.in -# -aiohappyeyeballs==2.4.3 -aiohttp==3.10.9 -aiosignal==1.3.1 -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.6.1 -elastic-transport==8.15.0 -elasticsearch[async]==8.15.1 -elasticsearch7[async]==7.17.12 -events==0.5 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.10 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.1.0 -opensearch-py[async]==2.7.1 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -python-dateutil==2.9.0.post0 -requests==2.32.3 -six==1.16.0 -sortedcontainers==2.4.0 -urllib3==1.26.20 -yarl==1.13.1 diff --git a/.riot/requirements/16ea438.txt b/.riot/requirements/16ea438.txt new file mode 100644 index 00000000000..c2bd0d380d7 --- /dev/null +++ b/.riot/requirements/16ea438.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/16ea438.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 diff --git a/.riot/requirements/56b3d29.txt b/.riot/requirements/171cc7d.txt similarity index 54% rename from .riot/requirements/56b3d29.txt rename to .riot/requirements/171cc7d.txt index 20894390886..eeef1a8b1cf 100644 --- a/.riot/requirements/56b3d29.txt +++ b/.riot/requirements/171cc7d.txt @@ -2,31 +2,31 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/56b3d29.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/171cc7d.in # asgiref==3.8.1 -attrs==23.2.0 +attrs==25.3.0 backports-zoneinfo==0.2.1 -coverage[toml]==7.6.0 -django==4.2.14 +coverage[toml]==7.6.1 +django==4.2.20 django-configurations==2.5.1 djangorestframework==3.15.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 diff --git a/.riot/requirements/1726db0.txt b/.riot/requirements/1726db0.txt new file mode 100644 index 00000000000..948a8b3dae9 --- /dev/null +++ b/.riot/requirements/1726db0.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1726db0.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 diff --git a/.riot/requirements/173260e.txt b/.riot/requirements/173260e.txt new file mode 100644 index 00000000000..c6d704199d9 --- /dev/null +++ b/.riot/requirements/173260e.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/173260e.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.70.0 +grpcio==1.34.1 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/1746c1c.txt b/.riot/requirements/1746c1c.txt new file mode 100644 index 00000000000..1f261539f15 --- /dev/null +++ b/.riot/requirements/1746c1c.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1746c1c.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.0.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.21.0 diff --git a/.riot/requirements/1762012.txt b/.riot/requirements/1762012.txt deleted file mode 100644 index bf890d14bf6..00000000000 --- a/.riot/requirements/1762012.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1762012.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/1c17138.txt b/.riot/requirements/178199b.txt similarity index 55% rename from .riot/requirements/1c17138.txt rename to .riot/requirements/178199b.txt index 65496a40488..d21e56afe99 100644 --- a/.riot/requirements/1c17138.txt +++ b/.riot/requirements/178199b.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1c17138.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/178199b.in # -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.6.1 django==2.2.28 django-configurations==2.3.2 djangorestframework==3.12.4 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/178680b.txt b/.riot/requirements/178680b.txt deleted file mode 100644 index 272569806c7..00000000000 --- a/.riot/requirements/178680b.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/178680b.in -# -aiohttp==3.9.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -exceptiongroup==1.2.0 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -yarl==1.9.4 diff --git a/.riot/requirements/17adcc8.txt b/.riot/requirements/17adcc8.txt deleted file mode 100644 index 880f550740b..00000000000 --- a/.riot/requirements/17adcc8.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 .riot/requirements/17adcc8.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/17f0d68.txt b/.riot/requirements/17f0d68.txt new file mode 100644 index 00000000000..fe514d5c166 --- /dev/null +++ b/.riot/requirements/17f0d68.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/17f0d68.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 diff --git a/.riot/requirements/17f2a52.txt b/.riot/requirements/17f2a52.txt new file mode 100644 index 00000000000..a73669b7de7 --- /dev/null +++ b/.riot/requirements/17f2a52.txt @@ -0,0 +1,27 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/17f2a52.in +# +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch==9.0.0 +elasticsearch7==7.17.12 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 +urllib3==1.26.20 diff --git a/.riot/requirements/17fcdc3.txt b/.riot/requirements/17fcdc3.txt deleted file mode 100644 index db58d7086db..00000000000 --- a/.riot/requirements/17fcdc3.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 .riot/requirements/17fcdc3.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.8.6 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/180f6a3.txt b/.riot/requirements/180f6a3.txt deleted file mode 100644 index a1afd8968bd..00000000000 --- a/.riot/requirements/180f6a3.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/180f6a3.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/1840541.txt b/.riot/requirements/1840541.txt deleted file mode 100644 index 8189aa065f4..00000000000 --- a/.riot/requirements/1840541.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1840541.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -urllib3==2.1.0 diff --git a/.riot/requirements/1878fa7.txt b/.riot/requirements/1878fa7.txt new file mode 100644 index 00000000000..db98927c9c0 --- /dev/null +++ b/.riot/requirements/1878fa7.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1878fa7.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.0.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.20.2 diff --git a/.riot/requirements/17e93e1.txt b/.riot/requirements/189028b.txt similarity index 54% rename from .riot/requirements/17e93e1.txt rename to .riot/requirements/189028b.txt index d245ca37a67..9cc6361e0b4 100644 --- a/.riot/requirements/17e93e1.txt +++ b/.riot/requirements/189028b.txt @@ -2,31 +2,31 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/17e93e1.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/189028b.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.6.1 django==3.2.25 django-configurations==2.5.1 djangorestframework==3.11.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 diff --git a/.riot/requirements/18e5cae.txt b/.riot/requirements/18e5cae.txt new file mode 100644 index 00000000000..1bb9e155125 --- /dev/null +++ b/.riot/requirements/18e5cae.txt @@ -0,0 +1,19 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/18e5cae.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/174e111.txt b/.riot/requirements/195a93b.txt similarity index 57% rename from .riot/requirements/174e111.txt rename to .riot/requirements/195a93b.txt index 0828a4bfe41..418997b2e76 100644 --- a/.riot/requirements/174e111.txt +++ b/.riot/requirements/195a93b.txt @@ -2,34 +2,34 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/174e111.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/195a93b.in # asgiref==3.8.1 -attrs==23.2.0 +attrs==25.3.0 backports-zoneinfo==0.2.1 -coverage[toml]==7.6.0 -django==4.2.14 +coverage[toml]==7.6.1 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==75.3.2 diff --git a/.riot/requirements/196a072.txt b/.riot/requirements/196a072.txt deleted file mode 100644 index 91c6b2ebd41..00000000000 --- a/.riot/requirements/196a072.txt +++ /dev/null @@ -1,20 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/196a072.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/198a57c.txt b/.riot/requirements/198a57c.txt deleted file mode 100644 index 150dcc5566c..00000000000 --- a/.riot/requirements/198a57c.txt +++ /dev/null @@ -1,23 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/198a57c.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/19cd829.txt b/.riot/requirements/19cd829.txt deleted file mode 100644 index c07b38da22f..00000000000 --- a/.riot/requirements/19cd829.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/19cd829.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/1e4bb51.txt b/.riot/requirements/19fca43.txt similarity index 70% rename from .riot/requirements/1e4bb51.txt rename to .riot/requirements/19fca43.txt index c160a2df5e6..b5aefa01da1 100644 --- a/.riot/requirements/1e4bb51.txt +++ b/.riot/requirements/19fca43.txt @@ -2,23 +2,23 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1e4bb51.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/19fca43.in # aniso8601==9.0.1 -attrs==24.2.0 -coverage[toml]==7.6.1 +attrs==25.3.0 +coverage[toml]==7.8.0 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 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 +pytest==8.3.5 pytest-asyncio==0.21.1 -pytest-cov==5.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/1a21d86.txt b/.riot/requirements/1a21d86.txt new file mode 100644 index 00000000000..fc2989b5f0b --- /dev/null +++ b/.riot/requirements/1a21d86.txt @@ -0,0 +1,42 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1a21d86.in +# +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +async-timeout==5.0.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +exceptiongroup==1.2.2 +frozenlist==1.6.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.4.3 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.3.1 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.20.0 diff --git a/.riot/requirements/1a84cc2.txt b/.riot/requirements/1a84cc2.txt new file mode 100644 index 00000000000..beb0cbbdbc9 --- /dev/null +++ b/.riot/requirements/1a84cc2.txt @@ -0,0 +1,23 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1a84cc2.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/c177e20.txt b/.riot/requirements/1ac29e1.txt similarity index 60% rename from .riot/requirements/c177e20.txt rename to .riot/requirements/1ac29e1.txt index 5c4ac90e0f7..3a2c5ea7612 100644 --- a/.riot/requirements/c177e20.txt +++ b/.riot/requirements/1ac29e1.txt @@ -2,33 +2,33 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/c177e20.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1ac29e1.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/1b007f9.txt b/.riot/requirements/1b007f9.txt deleted file mode 100644 index 87da2323d2b..00000000000 --- a/.riot/requirements/1b007f9.txt +++ /dev/null @@ -1,20 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1b007f9.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/18e9526.txt b/.riot/requirements/1b2137c.txt similarity index 56% rename from .riot/requirements/18e9526.txt rename to .riot/requirements/1b2137c.txt index ce6bddab69f..37cf536f52d 100644 --- a/.riot/requirements/18e9526.txt +++ b/.riot/requirements/1b2137c.txt @@ -2,27 +2,27 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/18e9526.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1b2137c.in # -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.6.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 events==0.5 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.7.1 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 python-dateutil==2.9.0.post0 requests==2.32.3 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -urllib3==2.2.3 +urllib3==2.4.0 diff --git a/.riot/requirements/1b6ed54.txt b/.riot/requirements/1b6ed54.txt new file mode 100644 index 00000000000..570a6ca490a --- /dev/null +++ b/.riot/requirements/1b6ed54.txt @@ -0,0 +1,27 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1b6ed54.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.0.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 diff --git a/.riot/requirements/1de8548.txt b/.riot/requirements/1b7c78f.txt similarity index 54% rename from .riot/requirements/1de8548.txt rename to .riot/requirements/1b7c78f.txt index 49e3556e0ca..9e2cf87c42c 100644 --- a/.riot/requirements/1de8548.txt +++ b/.riot/requirements/1b7c78f.txt @@ -2,26 +2,26 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1de8548.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1b7c78f.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 djangorestframework==3.11.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 diff --git a/.riot/requirements/1b92a5a.txt b/.riot/requirements/1b92a5a.txt deleted file mode 100644 index aa3d0555220..00000000000 --- a/.riot/requirements/1b92a5a.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1b92a5a.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 diff --git a/.riot/requirements/1bbf463.txt b/.riot/requirements/1bbf463.txt deleted file mode 100644 index 843080f8056..00000000000 --- a/.riot/requirements/1bbf463.txt +++ /dev/null @@ -1,23 +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/1bbf463.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -googleapis-common-protos==1.65.0 -grpcio==1.59.5 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/1c01d99.txt b/.riot/requirements/1c01d99.txt deleted file mode 100644 index dd308354583..00000000000 --- a/.riot/requirements/1c01d99.txt +++ /dev/null @@ -1,20 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1c01d99.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/1c7bf82.txt b/.riot/requirements/1c7bf82.txt new file mode 100644 index 00000000000..dbfb7b39335 --- /dev/null +++ b/.riot/requirements/1c7bf82.txt @@ -0,0 +1,31 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1c7bf82.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 diff --git a/.riot/requirements/1cce628.txt b/.riot/requirements/1cce628.txt deleted file mode 100644 index f25e29ae3d3..00000000000 --- a/.riot/requirements/1cce628.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 .riot/requirements/1cce628.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/1ce9a95.txt b/.riot/requirements/1ce9a95.txt deleted file mode 100644 index 363ae1fa333..00000000000 --- a/.riot/requirements/1ce9a95.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1ce9a95.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mako==1.3.2 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.4.0 -py==1.11.0 -pytest==8.0.0 -pytest-bdd==4.1.0 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/1cf4498.txt b/.riot/requirements/1cf4498.txt deleted file mode 100644 index 947304992e7..00000000000 --- a/.riot/requirements/1cf4498.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1cf4498.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==2.1.0 -zipp==3.17.0 diff --git a/.riot/requirements/1d07c9f.txt b/.riot/requirements/1d07c9f.txt new file mode 100644 index 00000000000..f2ee6a1dc3b --- /dev/null +++ b/.riot/requirements/1d07c9f.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1d07c9f.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/1d44438.txt b/.riot/requirements/1d27b17.txt similarity index 63% rename from .riot/requirements/1d44438.txt rename to .riot/requirements/1d27b17.txt index 5a2fbefacd8..232d6bf9471 100644 --- a/.riot/requirements/1d44438.txt +++ b/.riot/requirements/1d27b17.txt @@ -2,27 +2,27 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1d44438.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1d27b17.in # -attrs==24.3.0 -coverage[toml]==7.6.9 +attrs==25.3.0 +coverage[toml]==7.8.0 glob2==0.7 hypothesis==6.45.0 -iniconfig==2.0.0 -mako==1.3.8 +iniconfig==2.1.0 +mako==1.3.10 markupsafe==3.0.2 -mock==5.1.0 +mock==5.2.0 more-itertools==8.10.0 msgpack==1.1.0 opentracing==2.4.0 -packaging==24.2 +packaging==25.0 parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==7.4.4 pytest-bdd==6.0.1 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 six==1.17.0 diff --git a/.riot/requirements/1d282b1.txt b/.riot/requirements/1d282b1.txt new file mode 100644 index 00000000000..eb68c651466 --- /dev/null +++ b/.riot/requirements/1d282b1.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1d282b1.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.0.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +urllib3==1.26.20 diff --git a/.riot/requirements/1d804d4.txt b/.riot/requirements/1d804d4.txt deleted file mode 100644 index 25a63a4d39b..00000000000 --- a/.riot/requirements/1d804d4.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1d804d4.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 diff --git a/.riot/requirements/1d8a1bf.txt b/.riot/requirements/1d8a1bf.txt deleted file mode 100644 index 8f3dab69ff7..00000000000 --- a/.riot/requirements/1d8a1bf.txt +++ /dev/null @@ -1,25 +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/1d8a1bf.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.59.5 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/1d915ff.txt b/.riot/requirements/1d915ff.txt new file mode 100644 index 00000000000..617753bbbcb --- /dev/null +++ b/.riot/requirements/1d915ff.txt @@ -0,0 +1,32 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1d915ff.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +events==0.5 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.21.0 diff --git a/.riot/requirements/1db0994.txt b/.riot/requirements/1db0994.txt new file mode 100644 index 00000000000..e45f38b9aeb --- /dev/null +++ b/.riot/requirements/1db0994.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1db0994.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/7f40666.txt b/.riot/requirements/1dfbbf5.txt similarity index 54% rename from .riot/requirements/7f40666.txt rename to .riot/requirements/1dfbbf5.txt index ccadf87a049..bc5a663c7ab 100644 --- a/.riot/requirements/7f40666.txt +++ b/.riot/requirements/1dfbbf5.txt @@ -2,26 +2,26 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --no-annotate .riot/requirements/7f40666.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1dfbbf5.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 djangorestframework==3.11.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 diff --git a/.riot/requirements/1e44443.txt b/.riot/requirements/1e44443.txt deleted file mode 100644 index 83a0d093d08..00000000000 --- a/.riot/requirements/1e44443.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1e44443.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/ad0deeb.txt b/.riot/requirements/1e77d23.txt similarity index 64% rename from .riot/requirements/ad0deeb.txt rename to .riot/requirements/1e77d23.txt index 7bd5f54c1f7..d70b7ac4fe5 100644 --- a/.riot/requirements/ad0deeb.txt +++ b/.riot/requirements/1e77d23.txt @@ -2,31 +2,31 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/ad0deeb.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1e77d23.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/1ea993d.txt b/.riot/requirements/1ea993d.txt deleted file mode 100644 index 8f070a49b96..00000000000 --- a/.riot/requirements/1ea993d.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1ea993d.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/1f1d3a0.txt b/.riot/requirements/1f1d3a0.txt new file mode 100644 index 00000000000..5e303e1d07b --- /dev/null +++ b/.riot/requirements/1f1d3a0.txt @@ -0,0 +1,19 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f1d3a0.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/1f238e9.txt b/.riot/requirements/1f238e9.txt deleted file mode 100644 index 61d747537b2..00000000000 --- a/.riot/requirements/1f238e9.txt +++ /dev/null @@ -1,28 +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/1f238e9.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.34.1 -hypothesis==6.45.0 -importlib-metadata==8.4.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.20.1 diff --git a/.riot/requirements/1f280ce.txt b/.riot/requirements/1f280ce.txt new file mode 100644 index 00000000000..f54c2094409 --- /dev/null +++ b/.riot/requirements/1f280ce.txt @@ -0,0 +1,44 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f280ce.in +# +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +async-timeout==5.0.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +exceptiongroup==1.2.2 +frozenlist==1.6.0 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.4.3 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.3.1 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.20.0 +zipp==3.21.0 diff --git a/.riot/requirements/ce6cd33.txt b/.riot/requirements/1f4c63a.txt similarity index 70% rename from .riot/requirements/ce6cd33.txt rename to .riot/requirements/1f4c63a.txt index c9d940f1e5c..c06911b5033 100644 --- a/.riot/requirements/ce6cd33.txt +++ b/.riot/requirements/1f4c63a.txt @@ -2,51 +2,51 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/ce6cd33.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f4c63a.in # amqp==5.3.1 -attrs==24.3.0 +attrs==25.3.0 billiard==4.2.1 -celery==5.4.0 -certifi==2024.12.14 +celery==5.5.1 +certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 click-didyoumean==0.3.1 click-plugins==1.1.1 click-repl==0.3.0 -coverage[toml]==7.6.10 +coverage[toml]==7.8.0 django==2.2.1 exceptiongroup==1.2.2 -gevent==24.11.1 -greenlet==3.1.1 +gevent==25.4.1 +greenlet==3.2.0 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -kombu==5.4.2 -mock==5.1.0 +iniconfig==2.1.0 +kombu==5.5.3 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -prompt-toolkit==3.0.48 -pytest==8.3.4 -pytest-cov==6.0.0 +prompt-toolkit==3.0.51 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 python-dateutil==2.9.0.post0 -pytz==2024.2 +pytz==2025.2 requests==2.32.3 six==1.17.0 sortedcontainers==2.4.0 sqlalchemy==1.2.19 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 -tzdata==2024.2 -urllib3==2.3.0 +typing-extensions==4.13.2 +tzdata==2025.2 +urllib3==2.4.0 vine==5.1.0 wcwidth==0.2.13 zope-event==5.0 zope-interface==7.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.7.0 +setuptools==78.1.0 diff --git a/.riot/requirements/1d74d67.txt b/.riot/requirements/1f67448.txt similarity index 54% rename from .riot/requirements/1d74d67.txt rename to .riot/requirements/1f67448.txt index 32873cff656..1d61a32468e 100644 --- a/.riot/requirements/1d74d67.txt +++ b/.riot/requirements/1f67448.txt @@ -2,23 +2,25 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1d74d67.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f67448.in # -aniso8601==9.0.1 -attrs==24.2.0 -coverage[toml]==7.6.1 -graphene==3.3 -graphql-core==3.2.4 +attrs==25.3.0 +coverage[toml]==7.8.0 +graphene==3.4.3 +graphql-core==3.2.6 graphql-relay==3.2.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 +pytest==8.3.5 pytest-asyncio==0.21.1 -pytest-cov==5.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 sortedcontainers==2.4.0 +typing-extensions==4.13.2 diff --git a/.riot/requirements/1f8f136.txt b/.riot/requirements/1f8f136.txt deleted file mode 100644 index 7dded0161d6..00000000000 --- a/.riot/requirements/1f8f136.txt +++ /dev/null @@ -1,27 +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/1f8f136.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.59.5 -hypothesis==6.45.0 -importlib-metadata==8.4.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.20.1 diff --git a/.riot/requirements/1f9e516.txt b/.riot/requirements/1f9e516.txt deleted file mode 100644 index 766e0d8325c..00000000000 --- a/.riot/requirements/1f9e516.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 .riot/requirements/1f9e516.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 diff --git a/.riot/requirements/1ff1638.txt b/.riot/requirements/1ff1638.txt deleted file mode 100644 index f6733a5fb67..00000000000 --- a/.riot/requirements/1ff1638.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1ff1638.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.18.1 diff --git a/.riot/requirements/20a6a1c.txt b/.riot/requirements/20a6a1c.txt deleted file mode 100644 index a0f4e6129c7..00000000000 --- a/.riot/requirements/20a6a1c.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 .riot/requirements/20a6a1c.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/8def785.txt b/.riot/requirements/2215008.txt similarity index 64% rename from .riot/requirements/8def785.txt rename to .riot/requirements/2215008.txt index c1d4ea95f61..19d384b7224 100644 --- a/.riot/requirements/8def785.txt +++ b/.riot/requirements/2215008.txt @@ -2,31 +2,31 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/8def785.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/2215008.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/22824e9.txt b/.riot/requirements/22824e9.txt deleted file mode 100644 index eb2e2fbbe0e..00000000000 --- a/.riot/requirements/22824e9.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/22824e9.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 diff --git a/.riot/requirements/25cad6d.txt b/.riot/requirements/25cad6d.txt new file mode 100644 index 00000000000..d2f545c4273 --- /dev/null +++ b/.riot/requirements/25cad6d.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/25cad6d.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +graphene==3.4.3 +graphql-core==3.2.6 +graphql-relay==3.2.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 diff --git a/.riot/requirements/273fcaf.txt b/.riot/requirements/273fcaf.txt new file mode 100644 index 00000000000..eb4ea0f7ab0 --- /dev/null +++ b/.riot/requirements/273fcaf.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/273fcaf.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +py-cpuinfo==9.0.0 +pytest==8.3.5 +pytest-benchmark==4.0.0 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/19209e7.txt b/.riot/requirements/2877cc1.txt similarity index 66% rename from .riot/requirements/19209e7.txt rename to .riot/requirements/2877cc1.txt index 89953e277e6..8a702550323 100644 --- a/.riot/requirements/19209e7.txt +++ b/.riot/requirements/2877cc1.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/19209e7.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/2877cc1.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/2b9f1e7.txt b/.riot/requirements/2b9f1e7.txt deleted file mode 100644 index be8c122b5f8..00000000000 --- a/.riot/requirements/2b9f1e7.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/2b9f1e7.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mako==1.3.2 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.4.0 -py==1.11.0 -pytest==8.0.0 -pytest-bdd==6.0.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/2eee4bd.txt b/.riot/requirements/2eee4bd.txt deleted file mode 100644 index 411e54ade21..00000000000 --- a/.riot/requirements/2eee4bd.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 .riot/requirements/2eee4bd.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==2.1.0 diff --git a/.riot/requirements/f1dd76d.txt b/.riot/requirements/2f08515.txt similarity index 55% rename from .riot/requirements/f1dd76d.txt rename to .riot/requirements/2f08515.txt index 98088258968..9c7b43c11cc 100644 --- a/.riot/requirements/f1dd76d.txt +++ b/.riot/requirements/2f08515.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/f1dd76d.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/2f08515.in # -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.6.1 django==2.2.28 django-configurations==2.3.2 djangorestframework==3.13.1 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/2f68e1b.txt b/.riot/requirements/2f68e1b.txt deleted file mode 100644 index 5d6f44a22f0..00000000000 --- a/.riot/requirements/2f68e1b.txt +++ /dev/null @@ -1,20 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/2f68e1b.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/3185459.txt b/.riot/requirements/3185459.txt new file mode 100644 index 00000000000..2fa22ce5f54 --- /dev/null +++ b/.riot/requirements/3185459.txt @@ -0,0 +1,39 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/3185459.in +# +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +frozenlist==1.6.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.4.3 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.3.1 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.20.0 diff --git a/.riot/requirements/37646c9.txt b/.riot/requirements/37646c9.txt new file mode 100644 index 00000000000..5840c1ecaee --- /dev/null +++ b/.riot/requirements/37646c9.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/37646c9.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/39bb283.txt b/.riot/requirements/39bb283.txt deleted file mode 100644 index 069b4db181b..00000000000 --- a/.riot/requirements/39bb283.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/39bb283.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/3a9fb88.txt b/.riot/requirements/3a9fb88.txt new file mode 100644 index 00000000000..017cd803d7a --- /dev/null +++ b/.riot/requirements/3a9fb88.txt @@ -0,0 +1,33 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/3a9fb88.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.7.0 +iniconfig==2.1.0 +mako==1.3.10 +markupsafe==3.0.2 +mock==5.2.0 +more-itertools==8.10.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==25.0 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==7.4.4 +pytest-bdd==6.0.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/3ba7e37.txt b/.riot/requirements/3ba7e37.txt new file mode 100644 index 00000000000..3dbb32d1178 --- /dev/null +++ b/.riot/requirements/3ba7e37.txt @@ -0,0 +1,33 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/3ba7e37.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mako==1.3.10 +markupsafe==2.1.5 +mock==5.2.0 +more-itertools==8.10.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==25.0 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==7.4.4 +pytest-bdd==6.0.1 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/3c8534a.txt b/.riot/requirements/3c8534a.txt deleted file mode 100644 index 2c8a63a3b2b..00000000000 --- a/.riot/requirements/3c8534a.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/3c8534a.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 diff --git a/.riot/requirements/4396c33.txt b/.riot/requirements/4396c33.txt new file mode 100644 index 00000000000..fd4f081db54 --- /dev/null +++ b/.riot/requirements/4396c33.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/4396c33.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 diff --git a/.riot/requirements/4ad4ecd.txt b/.riot/requirements/4ad4ecd.txt deleted file mode 100644 index b2c78efe74d..00000000000 --- a/.riot/requirements/4ad4ecd.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/4ad4ecd.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/4ad5317.txt b/.riot/requirements/4ad5317.txt new file mode 100644 index 00000000000..9d6cecbc8e5 --- /dev/null +++ b/.riot/requirements/4ad5317.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/4ad5317.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.8.6 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/1a1e37a.txt b/.riot/requirements/4c32dc0.txt similarity index 50% rename from .riot/requirements/1a1e37a.txt rename to .riot/requirements/4c32dc0.txt index f30bff11d02..e706e8cc71d 100644 --- a/.riot/requirements/1a1e37a.txt +++ b/.riot/requirements/4c32dc0.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1a1e37a.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/4c32dc0.in # -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.8.0 django==2.2.28 django-configurations==2.3.2 djangorestframework==3.13.1 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/4ce4ec1.txt b/.riot/requirements/4ce4ec1.txt new file mode 100644 index 00000000000..5e6f9af5dd5 --- /dev/null +++ b/.riot/requirements/4ce4ec1.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/4ce4ec1.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.0.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +urllib3==1.26.20 diff --git a/.riot/requirements/d2ca94b.txt b/.riot/requirements/50b70d9.txt similarity index 72% rename from .riot/requirements/d2ca94b.txt rename to .riot/requirements/50b70d9.txt index 2e7e08f8ccd..8bedee18d6e 100644 --- a/.riot/requirements/d2ca94b.txt +++ b/.riot/requirements/50b70d9.txt @@ -2,10 +2,10 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/d2ca94b.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/50b70d9.in # asgiref==3.8.1 -attrs==25.1.0 +attrs==25.3.0 coverage[toml]==7.6.1 django==3.2.25 django-configurations==2.5.1 @@ -13,23 +13,23 @@ django-hosts==4.0 exceptiongroup==1.2.2 hypothesis==6.45.0 importlib-metadata==8.5.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 +typing-extensions==4.13.2 zipp==3.20.2 # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==75.3.2 diff --git a/.riot/requirements/51aba1e.txt b/.riot/requirements/51aba1e.txt deleted file mode 100644 index e237fa42800..00000000000 --- a/.riot/requirements/51aba1e.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 .riot/requirements/51aba1e.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/51d9412.txt b/.riot/requirements/51d9412.txt new file mode 100644 index 00000000000..ef8d911b401 --- /dev/null +++ b/.riot/requirements/51d9412.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/51d9412.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.70.0 +grpcio==1.42.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/53b1ba3.txt b/.riot/requirements/53b1ba3.txt new file mode 100644 index 00000000000..81822e6cbf2 --- /dev/null +++ b/.riot/requirements/53b1ba3.txt @@ -0,0 +1,23 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/53b1ba3.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +googleapis-common-protos==1.70.0 +grpcio==1.59.5 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/56ee07b.txt b/.riot/requirements/56ee07b.txt deleted file mode 100644 index 948cb6fb19a..00000000000 --- a/.riot/requirements/56ee07b.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/56ee07b.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/57549f7.txt b/.riot/requirements/57549f7.txt new file mode 100644 index 00000000000..e10d65976a4 --- /dev/null +++ b/.riot/requirements/57549f7.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/57549f7.in +# +aniso8601==9.0.1 +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +graphene==3.0 +graphql-core==3.1.7 +graphql-relay==3.1.5 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/58d7730.txt b/.riot/requirements/58d7730.txt new file mode 100644 index 00000000000..138bb3c9393 --- /dev/null +++ b/.riot/requirements/58d7730.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/58d7730.in +# +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch==9.0.0 +elasticsearch7==7.17.12 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 diff --git a/.riot/requirements/1a508dc.txt b/.riot/requirements/5a79a6b.txt similarity index 68% rename from .riot/requirements/1a508dc.txt rename to .riot/requirements/5a79a6b.txt index 3011d06795c..bff2342865e 100644 --- a/.riot/requirements/1a508dc.txt +++ b/.riot/requirements/5a79a6b.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1a508dc.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/5a79a6b.in # asgiref==3.8.1 -attrs==25.1.0 -coverage[toml]==7.6.10 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 -pytest-cov==6.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.16.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools +setuptools==78.1.0 diff --git a/.riot/requirements/5b82761.txt b/.riot/requirements/5b82761.txt deleted file mode 100644 index c82c4ca75ee..00000000000 --- a/.riot/requirements/5b82761.txt +++ /dev/null @@ -1,26 +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/5b82761.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.42.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/5e79012.txt b/.riot/requirements/5e79012.txt new file mode 100644 index 00000000000..22de4e112ba --- /dev/null +++ b/.riot/requirements/5e79012.txt @@ -0,0 +1,44 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/5e79012.in +# +aiohappyeyeballs==2.4.4 +aiohttp==3.10.11 +aiosignal==1.3.1 +async-timeout==5.0.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +exceptiongroup==1.2.2 +frozenlist==1.5.0 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.1.0 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.2.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.15.2 +zipp==3.20.2 diff --git a/.riot/requirements/e5cd460.txt b/.riot/requirements/5eb6b4f.txt similarity index 76% rename from .riot/requirements/e5cd460.txt rename to .riot/requirements/5eb6b4f.txt index d14867cc689..81782c1233d 100644 --- a/.riot/requirements/e5cd460.txt +++ b/.riot/requirements/5eb6b4f.txt @@ -2,21 +2,21 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/e5cd460.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/5eb6b4f.in # -attrs==24.3.0 -coverage[toml]==7.6.9 +attrs==25.3.0 +coverage[toml]==7.8.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 msgpack==1.1.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 py-cpuinfo==9.0.0 -pytest==8.3.4 +pytest==8.3.5 pytest-benchmark==4.0.0 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/65aafe7.txt b/.riot/requirements/65aafe7.txt new file mode 100644 index 00000000000..6ed8de883d5 --- /dev/null +++ b/.riot/requirements/65aafe7.txt @@ -0,0 +1,39 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/65aafe7.in +# +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch[async]==9.0.0 +elasticsearch7[async]==7.17.12 +events==0.5 +frozenlist==1.6.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +multidict==6.4.3 +opensearch-py[async]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.3.1 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 +urllib3==1.26.20 +yarl==1.20.0 diff --git a/.riot/requirements/6861164.txt b/.riot/requirements/6861164.txt deleted file mode 100644 index 394767b9243..00000000000 --- a/.riot/requirements/6861164.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/6861164.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 diff --git a/.riot/requirements/688e35d.txt b/.riot/requirements/688e35d.txt deleted file mode 100644 index 5dd7237a8f5..00000000000 --- a/.riot/requirements/688e35d.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/688e35d.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/690aeca.txt b/.riot/requirements/690aeca.txt new file mode 100644 index 00000000000..4f98130f4da --- /dev/null +++ b/.riot/requirements/690aeca.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/690aeca.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +graphene==3.4.3 +graphql-core==3.2.6 +graphql-relay==3.2.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 diff --git a/.riot/requirements/69fbaa6.txt b/.riot/requirements/69fbaa6.txt deleted file mode 100644 index efd500eaaf0..00000000000 --- a/.riot/requirements/69fbaa6.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/69fbaa6.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==2.1.0 -zipp==3.17.0 diff --git a/.riot/requirements/6d820e6.txt b/.riot/requirements/6d820e6.txt new file mode 100644 index 00000000000..20e79e2450f --- /dev/null +++ b/.riot/requirements/6d820e6.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/6d820e6.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +events==0.5 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +urllib3==2.4.0 diff --git a/.riot/requirements/fbee8ab.txt b/.riot/requirements/6f12901.txt similarity index 63% rename from .riot/requirements/fbee8ab.txt rename to .riot/requirements/6f12901.txt index df12821215c..2c0d8fe69bf 100644 --- a/.riot/requirements/fbee8ab.txt +++ b/.riot/requirements/6f12901.txt @@ -2,24 +2,24 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/fbee8ab.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/6f12901.in # -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.6.1 +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opensearch-py[requests]==2.0.1 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 requests==2.32.3 sortedcontainers==2.4.0 urllib3==1.26.20 diff --git a/.riot/requirements/1f390da.txt b/.riot/requirements/70dec77.txt similarity index 57% rename from .riot/requirements/1f390da.txt rename to .riot/requirements/70dec77.txt index 788e18155b8..16751370567 100644 --- a/.riot/requirements/1f390da.txt +++ b/.riot/requirements/70dec77.txt @@ -2,34 +2,34 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f390da.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/70dec77.in # asgiref==3.8.1 -attrs==23.2.0 +attrs==25.3.0 backports-zoneinfo==0.2.1 -coverage[toml]==7.6.0 -django==4.2.14 +coverage[toml]==7.6.1 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 +pytest==8.3.5 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==75.3.2 diff --git a/.riot/requirements/17e1939.txt b/.riot/requirements/7179876.txt similarity index 54% rename from .riot/requirements/17e1939.txt rename to .riot/requirements/7179876.txt index 2ca5ef91eb2..a7b658396d8 100644 --- a/.riot/requirements/17e1939.txt +++ b/.riot/requirements/7179876.txt @@ -2,23 +2,23 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --no-annotate .riot/requirements/17e1939.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/7179876.in # aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 +attrs==25.3.0 +coverage[toml]==7.8.0 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 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/7613d04.txt b/.riot/requirements/7613d04.txt new file mode 100644 index 00000000000..af4b5537dd7 --- /dev/null +++ b/.riot/requirements/7613d04.txt @@ -0,0 +1,32 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/7613d04.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +events==0.5 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==2.8.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.20.2 diff --git a/.riot/requirements/b826871.txt b/.riot/requirements/792f843.txt similarity index 66% rename from .riot/requirements/b826871.txt rename to .riot/requirements/792f843.txt index 27ca4b1c8f7..3c433acf3e2 100644 --- a/.riot/requirements/b826871.txt +++ b/.riot/requirements/792f843.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/b826871.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/792f843.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==5.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/7a4893e.txt b/.riot/requirements/7a4893e.txt new file mode 100644 index 00000000000..f64eba84234 --- /dev/null +++ b/.riot/requirements/7a4893e.txt @@ -0,0 +1,31 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/7a4893e.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 diff --git a/.riot/requirements/7e7551c.txt b/.riot/requirements/7e7551c.txt deleted file mode 100644 index 945877903ec..00000000000 --- a/.riot/requirements/7e7551c.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/7e7551c.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mako==1.3.2 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.4.0 -py==1.11.0 -pytest==8.0.0 -pytest-bdd==6.0.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/81db984.txt b/.riot/requirements/81db984.txt deleted file mode 100644 index 07e3d91a54c..00000000000 --- a/.riot/requirements/81db984.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 .riot/requirements/81db984.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/bbb3af0.txt b/.riot/requirements/8567c69.txt similarity index 67% rename from .riot/requirements/bbb3af0.txt rename to .riot/requirements/8567c69.txt index 0c47cba8e87..5957a90f8e0 100644 --- a/.riot/requirements/bbb3af0.txt +++ b/.riot/requirements/8567c69.txt @@ -2,49 +2,49 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/bbb3af0.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/8567c69.in # amqp==5.3.1 asgiref==3.8.1 -attrs==24.3.0 +attrs==25.3.0 billiard==4.2.1 -celery==5.4.0 -certifi==2024.12.14 +celery==5.5.1 +certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 click-didyoumean==0.3.1 click-plugins==1.1.1 click-repl==0.3.0 -coverage[toml]==7.6.10 -django==5.1.4 -gevent==24.11.1 -greenlet==3.1.1 +coverage[toml]==7.8.0 +django==5.2 +gevent==25.4.1 +greenlet==3.2.0 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -kombu==5.4.2 -mock==5.1.0 +iniconfig==2.1.0 +kombu==5.5.3 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -prompt-toolkit==3.0.48 -pytest==8.3.4 -pytest-cov==6.0.0 +prompt-toolkit==3.0.51 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 python-dateutil==2.9.0.post0 requests==2.32.3 six==1.17.0 sortedcontainers==2.4.0 -sqlalchemy==2.0.36 +sqlalchemy==2.0.40 sqlparse==0.5.3 -typing-extensions==4.12.2 -tzdata==2024.2 -urllib3==2.3.0 +typing-extensions==4.13.2 +tzdata==2025.2 +urllib3==2.4.0 vine==5.1.0 wcwidth==0.2.13 zope-event==5.0 zope-interface==7.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.7.0 +setuptools==78.1.0 diff --git a/.riot/requirements/4ccd5e8.txt b/.riot/requirements/8848464.txt similarity index 50% rename from .riot/requirements/4ccd5e8.txt rename to .riot/requirements/8848464.txt index a925fb4bff8..2f3e5f22760 100644 --- a/.riot/requirements/4ccd5e8.txt +++ b/.riot/requirements/8848464.txt @@ -2,25 +2,25 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --no-annotate .riot/requirements/4ccd5e8.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/8848464.in # aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 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 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 -tomli==2.0.1 +tomli==2.2.1 diff --git a/.riot/requirements/8d15996.txt b/.riot/requirements/8d15996.txt new file mode 100644 index 00000000000..2f9057f263b --- /dev/null +++ b/.riot/requirements/8d15996.txt @@ -0,0 +1,33 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/8d15996.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.7.0 +iniconfig==2.1.0 +mako==1.3.10 +markupsafe==3.0.2 +mock==5.2.0 +more-itertools==8.10.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==25.0 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==7.4.4 +pytest-bdd==4.1.0 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/8f9b04b.txt b/.riot/requirements/8f9b04b.txt new file mode 100644 index 00000000000..2e951d421a8 --- /dev/null +++ b/.riot/requirements/8f9b04b.txt @@ -0,0 +1,27 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/8f9b04b.in +# +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch==9.0.0 +elasticsearch7==7.17.12 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.13.2 +urllib3==1.26.20 diff --git a/.riot/requirements/912dbf5.txt b/.riot/requirements/912dbf5.txt deleted file mode 100644 index cf048e4dbc5..00000000000 --- a/.riot/requirements/912dbf5.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/912dbf5.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 -graphene==3.0 -graphql-core==3.1.7 -graphql-relay==3.1.5 -hypothesis==6.45.0 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.18.1 diff --git a/.riot/requirements/91c10ff.txt b/.riot/requirements/91c10ff.txt new file mode 100644 index 00000000000..f888db10383 --- /dev/null +++ b/.riot/requirements/91c10ff.txt @@ -0,0 +1,28 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/91c10ff.in +# +aniso8601==9.0.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +graphene==3.0 +graphql-core==3.1.7 +graphql-relay==3.1.5 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/93b1e3b.txt b/.riot/requirements/93b1e3b.txt new file mode 100644 index 00000000000..2a9190c342d --- /dev/null +++ b/.riot/requirements/93b1e3b.txt @@ -0,0 +1,31 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/93b1e3b.in +# +attrs==25.3.0 +certifi==2025.1.31 +coverage[toml]==7.8.0 +elastic-transport==8.17.1 +elasticsearch==9.0.0 +elasticsearch7==7.17.12 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +urllib3==1.26.20 +zipp==3.21.0 diff --git a/.riot/requirements/9b8c47e.txt b/.riot/requirements/9b8c47e.txt deleted file mode 100644 index 1786a038a59..00000000000 --- a/.riot/requirements/9b8c47e.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/9b8c47e.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.4.0 -py-cpuinfo==9.0.0 -pytest==8.0.0 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/9d50a6f.txt b/.riot/requirements/9d50a6f.txt new file mode 100644 index 00000000000..e09d60c42d8 --- /dev/null +++ b/.riot/requirements/9d50a6f.txt @@ -0,0 +1,33 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/9d50a6f.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mako==1.3.10 +markupsafe==2.1.5 +mock==5.2.0 +more-itertools==8.10.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==25.0 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==7.4.4 +pytest-bdd==4.1.0 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/1abf4f4.txt b/.riot/requirements/a3b8bb8.txt similarity index 54% rename from .riot/requirements/1abf4f4.txt rename to .riot/requirements/a3b8bb8.txt index 744669e9947..16a3ecc3937 100644 --- a/.riot/requirements/1abf4f4.txt +++ b/.riot/requirements/a3b8bb8.txt @@ -2,23 +2,23 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1abf4f4.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/a3b8bb8.in # aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 +attrs==25.3.0 +coverage[toml]==7.8.0 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 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/a4331a5.txt b/.riot/requirements/a4331a5.txt new file mode 100644 index 00000000000..b1ba285ef32 --- /dev/null +++ b/.riot/requirements/a4331a5.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/a4331a5.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/a5642ea.txt b/.riot/requirements/a5642ea.txt deleted file mode 100644 index 344bd0e0e1b..00000000000 --- a/.riot/requirements/a5642ea.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/a5642ea.in -# -aiohttp==3.9.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -exceptiongroup==1.2.0 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -yarl==1.9.4 -zipp==3.17.0 diff --git a/.riot/requirements/a61304c.txt b/.riot/requirements/a61304c.txt new file mode 100644 index 00000000000..8a9b9f62137 --- /dev/null +++ b/.riot/requirements/a61304c.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/a61304c.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/a6329d3.txt b/.riot/requirements/a6329d3.txt deleted file mode 100644 index 589b32f24be..00000000000 --- a/.riot/requirements/a6329d3.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/a6329d3.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/a750d73.txt b/.riot/requirements/a750d73.txt deleted file mode 100644 index db5cc470805..00000000000 --- a/.riot/requirements/a750d73.txt +++ /dev/null @@ -1,23 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/a750d73.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/adb0290.txt b/.riot/requirements/a9b5fed.txt similarity index 69% rename from .riot/requirements/adb0290.txt rename to .riot/requirements/a9b5fed.txt index 28eafd82e1f..fdce6cace1c 100644 --- a/.riot/requirements/adb0290.txt +++ b/.riot/requirements/a9b5fed.txt @@ -2,48 +2,48 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/adb0290.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/a9b5fed.in # amqp==5.3.1 -attrs==24.3.0 +attrs==25.3.0 billiard==4.2.1 -celery==5.4.0 -certifi==2024.12.14 +celery==5.5.1 +certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 click-didyoumean==0.3.1 click-plugins==1.1.1 click-repl==0.3.0 -coverage[toml]==7.6.10 +coverage[toml]==7.8.0 django==2.2.1 exceptiongroup==1.2.2 -gevent==24.11.1 -greenlet==3.1.1 +gevent==25.4.1 +greenlet==3.2.0 hypothesis==6.45.0 idna==3.10 -importlib-metadata==8.5.0 -iniconfig==2.0.0 -kombu==5.4.2 -mock==5.1.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +kombu==5.5.3 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -prompt-toolkit==3.0.48 -pytest==8.3.4 -pytest-cov==6.0.0 +prompt-toolkit==3.0.51 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 python-dateutil==2.9.0.post0 -pytz==2024.2 +pytz==2025.2 requests==2.32.3 six==1.17.0 sortedcontainers==2.4.0 sqlalchemy==1.2.19 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 -tzdata==2024.2 -urllib3==2.3.0 +typing-extensions==4.13.2 +tzdata==2025.2 +urllib3==2.4.0 vine==5.1.0 wcwidth==0.2.13 zipp==3.21.0 @@ -51,4 +51,4 @@ zope-event==5.0 zope-interface==7.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.7.0 +setuptools==78.1.0 diff --git a/.riot/requirements/aa76239.txt b/.riot/requirements/aa76239.txt new file mode 100644 index 00000000000..6d8b3b2dc88 --- /dev/null +++ b/.riot/requirements/aa76239.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/aa76239.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 +django-configurations==2.5.1 +djangorestframework==3.16.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 diff --git a/.riot/requirements/3e3e299.txt b/.riot/requirements/ad2a94e.txt similarity index 68% rename from .riot/requirements/3e3e299.txt rename to .riot/requirements/ad2a94e.txt index caa71a23f45..91531fb3380 100644 --- a/.riot/requirements/3e3e299.txt +++ b/.riot/requirements/ad2a94e.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --no-annotate .riot/requirements/3e3e299.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/ad2a94e.in # asgiref==3.8.1 -attrs==25.1.0 -coverage[toml]==7.6.10 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 -pytest-cov==6.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.16.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools +setuptools==78.1.0 diff --git a/.riot/requirements/ae13b87.txt b/.riot/requirements/ae13b87.txt deleted file mode 100644 index e3aa05bb2f2..00000000000 --- a/.riot/requirements/ae13b87.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/ae13b87.in -# -aiohttp==3.9.1 -aiosignal==1.3.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 -yarl==1.9.4 diff --git a/.riot/requirements/ae55137.txt b/.riot/requirements/ae55137.txt deleted file mode 100644 index bb12acecc5f..00000000000 --- a/.riot/requirements/ae55137.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/ae55137.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 diff --git a/.riot/requirements/b0d5dee.txt b/.riot/requirements/b0d5dee.txt new file mode 100644 index 00000000000..af0aae8fbe9 --- /dev/null +++ b/.riot/requirements/b0d5dee.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b0d5dee.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/b570f17.txt b/.riot/requirements/b570f17.txt new file mode 100644 index 00000000000..be856a53827 --- /dev/null +++ b/.riot/requirements/b570f17.txt @@ -0,0 +1,32 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b570f17.in +# +asgiref==3.8.1 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==3.2.25 +django-configurations==2.5.1 +djangorestframework==3.11.2 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-django[testing]==3.10.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 +sortedcontainers==2.4.0 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 diff --git a/.riot/requirements/b58b8b2.txt b/.riot/requirements/b58b8b2.txt new file mode 100644 index 00000000000..03c8567c15e --- /dev/null +++ b/.riot/requirements/b58b8b2.txt @@ -0,0 +1,21 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b58b8b2.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 diff --git a/.riot/requirements/1cc7f49.txt b/.riot/requirements/b947449.txt similarity index 63% rename from .riot/requirements/1cc7f49.txt rename to .riot/requirements/b947449.txt index 644fd59d910..deec944d5a0 100644 --- a/.riot/requirements/1cc7f49.txt +++ b/.riot/requirements/b947449.txt @@ -2,27 +2,27 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1cc7f49.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b947449.in # -attrs==24.3.0 -coverage[toml]==7.6.9 +attrs==25.3.0 +coverage[toml]==7.8.0 glob2==0.7 hypothesis==6.45.0 -iniconfig==2.0.0 -mako==1.3.8 +iniconfig==2.1.0 +mako==1.3.10 markupsafe==3.0.2 -mock==5.1.0 +mock==5.2.0 more-itertools==8.10.0 msgpack==1.1.0 opentracing==2.4.0 -packaging==24.2 +packaging==25.0 parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==7.4.4 pytest-bdd==6.0.1 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 six==1.17.0 diff --git a/.riot/requirements/c08cf9c.txt b/.riot/requirements/c08cf9c.txt deleted file mode 100644 index 689125dd9b9..00000000000 --- a/.riot/requirements/c08cf9c.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/c08cf9c.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 diff --git a/.riot/requirements/c32fba4.txt b/.riot/requirements/c32fba4.txt new file mode 100644 index 00000000000..fa0fa28e26e --- /dev/null +++ b/.riot/requirements/c32fba4.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/c32fba4.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +psycopg2-binary==2.9.10 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 diff --git a/.riot/requirements/1f8ac1c.txt b/.riot/requirements/c59d61b.txt similarity index 69% rename from .riot/requirements/1f8ac1c.txt rename to .riot/requirements/c59d61b.txt index 4bbe51235ae..29f0eb3c9f9 100644 --- a/.riot/requirements/1f8ac1c.txt +++ b/.riot/requirements/c59d61b.txt @@ -2,49 +2,49 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1f8ac1c.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/c59d61b.in # amqp==5.3.1 -attrs==24.3.0 +attrs==25.3.0 billiard==4.2.1 -celery==5.4.0 -certifi==2024.12.14 +celery==5.5.1 +certifi==2025.1.31 charset-normalizer==3.4.1 click==8.1.8 click-didyoumean==0.3.1 click-plugins==1.1.1 click-repl==0.3.0 -coverage[toml]==7.6.10 +coverage[toml]==7.8.0 django==2.2.1 -gevent==24.11.1 -greenlet==3.1.1 +gevent==25.4.1 +greenlet==3.2.0 hypothesis==6.45.0 idna==3.10 -iniconfig==2.0.0 -kombu==5.4.2 -mock==5.1.0 +iniconfig==2.1.0 +kombu==5.5.3 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -prompt-toolkit==3.0.48 -pytest==8.3.4 -pytest-cov==6.0.0 +prompt-toolkit==3.0.51 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 python-dateutil==2.9.0.post0 -pytz==2024.2 +pytz==2025.2 requests==2.32.3 six==1.17.0 sortedcontainers==2.4.0 sqlalchemy==1.2.19 sqlparse==0.5.3 -typing-extensions==4.12.2 -tzdata==2024.2 -urllib3==2.3.0 +typing-extensions==4.13.2 +tzdata==2025.2 +urllib3==2.4.0 vine==5.1.0 wcwidth==0.2.13 zope-event==5.0 zope-interface==7.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.7.0 +setuptools==78.1.0 diff --git a/.riot/requirements/c8ba76f.txt b/.riot/requirements/c8ba76f.txt new file mode 100644 index 00000000000..b42ad4185d0 --- /dev/null +++ b/.riot/requirements/c8ba76f.txt @@ -0,0 +1,27 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/c8ba76f.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.70.0 +grpcio==1.59.5 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==6.30.2 +pytest==8.3.5 +pytest-asyncio==0.23.7 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/cfa93dd.txt b/.riot/requirements/cfa93dd.txt deleted file mode 100644 index 81cde4d6042..00000000000 --- a/.riot/requirements/cfa93dd.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 .riot/requirements/cfa93dd.in -# -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/d4987bc.txt b/.riot/requirements/d4987bc.txt deleted file mode 100644 index f1b8d81484f..00000000000 --- a/.riot/requirements/d4987bc.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/d4987bc.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/1aa43eb.txt b/.riot/requirements/d65551b.txt similarity index 53% rename from .riot/requirements/1aa43eb.txt rename to .riot/requirements/d65551b.txt index 2b980e9abaa..cec29af7fda 100644 --- a/.riot/requirements/1aa43eb.txt +++ b/.riot/requirements/d65551b.txt @@ -2,29 +2,29 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --no-annotate .riot/requirements/1aa43eb.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/d65551b.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 djangorestframework==3.11.2 exceptiongroup==1.2.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 diff --git a/.riot/requirements/dae821a.txt b/.riot/requirements/d78868d.txt similarity index 69% rename from .riot/requirements/dae821a.txt rename to .riot/requirements/d78868d.txt index 0bb3a53e1d9..9c0c2069947 100644 --- a/.riot/requirements/dae821a.txt +++ b/.riot/requirements/d78868d.txt @@ -2,34 +2,34 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --no-annotate .riot/requirements/dae821a.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/d78868d.in # asgiref==3.8.1 -attrs==25.1.0 -coverage[toml]==7.6.10 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 exceptiongroup==1.2.2 hypothesis==6.45.0 importlib-metadata==8.6.1 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 packaging==24.2 pluggy==1.5.0 -pytest==8.3.4 -pytest-cov==6.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.16.0 -pytz==2024.2 +pytz==2025.2 six==1.17.0 sortedcontainers==2.4.0 sqlparse==0.5.3 tomli==2.2.1 -typing-extensions==4.12.2 +typing-extensions==4.13.2 zipp==3.21.0 # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==78.1.0 diff --git a/.riot/requirements/d7cd7fb.txt b/.riot/requirements/d7cd7fb.txt deleted file mode 100644 index c9dc111cdf5..00000000000 --- a/.riot/requirements/d7cd7fb.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 .riot/requirements/d7cd7fb.in -# -aiohttp==3.9.1 -aiosignal==1.3.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -frozenlist==1.4.1 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -urllib3==1.26.18 -yarl==1.9.4 diff --git a/.riot/requirements/db02b05.txt b/.riot/requirements/db02b05.txt deleted file mode 100644 index 77c96200bd2..00000000000 --- a/.riot/requirements/db02b05.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/db02b05.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.4.0 -py-cpuinfo==9.0.0 -pytest==8.0.0 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/.riot/requirements/ddbda57.txt b/.riot/requirements/ddbda57.txt deleted file mode 100644 index 85d6908a23e..00000000000 --- a/.riot/requirements/ddbda57.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/ddbda57.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 diff --git a/.riot/requirements/16acf84.txt b/.riot/requirements/e5e30b6.txt similarity index 66% rename from .riot/requirements/16acf84.txt rename to .riot/requirements/e5e30b6.txt index 402495f9654..5d88e542756 100644 --- a/.riot/requirements/16acf84.txt +++ b/.riot/requirements/e5e30b6.txt @@ -2,26 +2,26 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/16acf84.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/e5e30b6.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 +attrs==25.3.0 +coverage[toml]==7.8.0 django==3.2.25 django-configurations==2.5.1 djangorestframework==3.11.2 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.2 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2025.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 diff --git a/.riot/requirements/349f570.txt b/.riot/requirements/e6e4cca.txt similarity index 60% rename from .riot/requirements/349f570.txt rename to .riot/requirements/e6e4cca.txt index f3f7947804a..94979b0e67b 100644 --- a/.riot/requirements/349f570.txt +++ b/.riot/requirements/e6e4cca.txt @@ -2,33 +2,33 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/349f570.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/e6e4cca.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 django-hosts==6.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.6.1 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 +sqlparse==0.5.3 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.21.0 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools==78.1.0 diff --git a/.riot/requirements/e7a63a3.txt b/.riot/requirements/e7a63a3.txt new file mode 100644 index 00000000000..6c1feed2bd3 --- /dev/null +++ b/.riot/requirements/e7a63a3.txt @@ -0,0 +1,29 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/e7a63a3.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +urllib3==1.26.20 +zipp==3.20.2 diff --git a/.riot/requirements/e8fbd30.txt b/.riot/requirements/e8fbd30.txt new file mode 100644 index 00000000000..9c829efdff9 --- /dev/null +++ b/.riot/requirements/e8fbd30.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/e8fbd30.in +# +attrs==25.3.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +coverage[toml]==7.8.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.1.0 +mock==5.2.0 +opensearch-py[requests]==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-cov==6.1.1 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +urllib3==1.26.20 diff --git a/.riot/requirements/ef43008.txt b/.riot/requirements/ef43008.txt deleted file mode 100644 index b2c56cec629..00000000000 --- a/.riot/requirements/ef43008.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 .riot/requirements/ef43008.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==7.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -urllib3==1.26.18 -zipp==3.17.0 diff --git a/.riot/requirements/f3d54b7.txt b/.riot/requirements/f3d54b7.txt deleted file mode 100644 index 125d3e037a1..00000000000 --- a/.riot/requirements/f3d54b7.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/f3d54b7.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.18.1 diff --git a/.riot/requirements/f64307d.txt b/.riot/requirements/f64307d.txt deleted file mode 100644 index f3d4876261b..00000000000 --- a/.riot/requirements/f64307d.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/f64307d.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.4.4 -exceptiongroup==1.2.0 -graphene==3.0 -graphql-core==3.1.7 -graphql-relay==3.1.5 -hypothesis==6.45.0 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.4.0 -pytest==8.1.1 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.18.1 diff --git a/.riot/requirements/f73b199.txt b/.riot/requirements/f73b199.txt deleted file mode 100644 index 5e598fb0f8a..00000000000 --- a/.riot/requirements/f73b199.txt +++ /dev/null @@ -1,24 +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/f73b199.in -# -attrs==24.2.0 -coverage[toml]==7.6.1 -googleapis-common-protos==1.65.0 -grpcio==1.49.1 -hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 -pytest-asyncio==0.23.7 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 diff --git a/.riot/requirements/1304e20.txt b/.riot/requirements/fa67e31.txt similarity index 60% rename from .riot/requirements/1304e20.txt rename to .riot/requirements/fa67e31.txt index 54f718e4122..0d848a07374 100644 --- a/.riot/requirements/1304e20.txt +++ b/.riot/requirements/fa67e31.txt @@ -2,25 +2,25 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1304e20.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/fa67e31.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 -django==4.2.16 +attrs==25.3.0 +coverage[toml]==7.8.0 +django==4.2.20 django-configurations==2.5.1 -djangorestframework==3.15.2 +djangorestframework==3.16.0 hypothesis==6.45.0 -iniconfig==2.0.0 -mock==5.1.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.5 +pytest-cov==6.1.1 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 +pytest-randomly==3.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 diff --git a/.riot/requirements/13d8f2b.txt b/.riot/requirements/fadb064.txt similarity index 52% rename from .riot/requirements/13d8f2b.txt rename to .riot/requirements/fadb064.txt index 53e51205570..ad51389c99f 100644 --- a/.riot/requirements/13d8f2b.txt +++ b/.riot/requirements/fadb064.txt @@ -2,27 +2,27 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --no-annotate .riot/requirements/13d8f2b.in +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/fadb064.in # -attrs==24.2.0 +attrs==25.3.0 coverage[toml]==7.6.1 exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.70.0 grpcio==1.34.1 hypothesis==6.45.0 -importlib-metadata==8.4.0 -iniconfig==2.0.0 -mock==5.1.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -protobuf==5.28.0 -pytest==8.3.2 +protobuf==5.29.4 +pytest==8.3.5 pytest-asyncio==0.23.7 pytest-cov==5.0.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.20.1 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/fb47988.txt b/.riot/requirements/fb8986c.txt similarity index 65% rename from .riot/requirements/fb47988.txt rename to .riot/requirements/fb8986c.txt index e9cc2d8236d..309fbfc1087 100644 --- a/.riot/requirements/fb47988.txt +++ b/.riot/requirements/fb8986c.txt @@ -2,28 +2,28 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --no-annotate .riot/requirements/fb47988.in +# pip-compile --allow-unsafe --no-annotate .riot/requirements/fb8986c.in # -attrs==24.3.0 -coverage[toml]==7.6.9 +attrs==25.3.0 +coverage[toml]==7.8.0 exceptiongroup==1.2.2 glob2==0.7 hypothesis==6.45.0 -iniconfig==2.0.0 -mako==1.3.8 +iniconfig==2.1.0 +mako==1.3.10 markupsafe==3.0.2 -mock==5.1.0 +mock==5.2.0 more-itertools==8.10.0 msgpack==1.1.0 opentracing==2.4.0 -packaging==24.2 +packaging==25.0 parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==7.4.4 pytest-bdd==6.0.1 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-randomly==3.16.0 six==1.17.0 diff --git a/.riot/requirements/fd6d189.txt b/.riot/requirements/fd6d189.txt new file mode 100644 index 00000000000..06b862521cf --- /dev/null +++ b/.riot/requirements/fd6d189.txt @@ -0,0 +1,30 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/fd6d189.in +# +attrs==25.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +graphene==3.4.3 +graphql-core==3.2.6 +graphql-relay==3.2.0 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.1.0 +mock==5.2.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.5 +pytest-asyncio==0.21.1 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.13.2 +zipp==3.20.2 diff --git a/.riot/requirements/fe13728.txt b/.riot/requirements/fe13728.txt deleted file mode 100644 index 4d44d7537c1..00000000000 --- a/.riot/requirements/fe13728.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/fe13728.in -# -asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 -django==4.2.14 -django-configurations==2.5.1 -djangorestframework==3.15.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 -typing-extensions==4.12.2 -zipp==3.19.2 diff --git a/.riot/requirements/ff88ab0.txt b/.riot/requirements/ff88ab0.txt deleted file mode 100644 index 69b41f473b8..00000000000 --- a/.riot/requirements/ff88ab0.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/ff88ab0.in -# -attrs==23.2.0 -coverage[toml]==7.4.1 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==7.0.1 -iniconfig==2.0.0 -mako==1.3.2 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.7 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.4.0 -py==1.11.0 -pytest==8.0.0 -pytest-bdd==4.1.0 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 diff --git a/ddtrace/contrib/integration_registry/README.md b/ddtrace/contrib/integration_registry/README.md new file mode 100644 index 00000000000..1e1591af39d --- /dev/null +++ b/ddtrace/contrib/integration_registry/README.md @@ -0,0 +1,166 @@ +# Datadog Python APM Integration Registry + +This directory contains the canonical registry of integrations supported by `dd-trace-py`. + +## Purpose + +The [`registry.yaml`](./registry.yaml) file serves as a centralized, machine-readable source of truth for metadata about each integration within the `ddtrace/contrib/internal/` directory. This metadata includes essential information about dependencies and version compatibility, used by internal tooling and potentially for documentation generation. + +## Format + +The registry is stored as a single YAML file: [`registry.yaml`](./registry.yaml). It consists of a root object with a single key, `integrations`, which holds a list of integration definition objects. Each integration object represents one directory found under `ddtrace/contrib/internal/`. + +## Schema and Fields + +Each integration entry in the `integrations` list adheres to the schema defined in [`_registry_schema.json`](./_registry_schema.json). The key fields are: + +**Required Fields:** + +* **`integration_name`** (String): + * The canonical, lowercase, snake_case name of the integration + * Must match the corresponding directory name within `ddtrace/contrib/internal/` + * Example: `flask`, `redis`, `asyncio` + +* **`is_external_package`** (Boolean): + * `true`: If the integration instruments a third-party library typically installed via pip (e.g., `flask`, `requests`, `psycopg`) + * `false`: If the integration instruments a Python standard library module (`asyncio`, `logging`) or internal integration (`dbapi`). + +**Optional Fields:** + +* **`is_tested`** (Boolean): + * Indicated if the integration has tests + * `false` if the integration is untested + +* **`dependency_names`** (List of Strings): + * Present only if `is_external_package` is `true` + * Lists the primary PyPI package name(s) associated with the integration + * For integrations patching multiple underlying libraries (like `elasticsearch`), this may list several names + * Example: `["flask"]`, `["redis"]`, `["elasticsearch", "elasticsearch1", "opensearchpy"]` + +* **`tested_versions_by_dependency`** (Object): + * Present only if `is_external_package` is `true` and `is_tested` is not `false` + * Maps dependency names to their tested version ranges + * Each version range includes: + * `min`: Minimum tested version + * `max`: Maximum tested version + * Example: + ```yaml + tested_versions_by_dependency: + flask: + min: "2.0.0" + max: "3.0.0" + ``` + +## Updating the Registry + +The registry is automatically updated through two main mechanisms: + +1. **Test Suite Execution**: + * Running a riot test suite for an integration automatically updates its version information in the registry (if updates are deemed necessary) + * This happens through the [`IntegrationRegistryManager`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py) which tracks patched dependencies and their tested versions during test execution + +2. **Manual Update Script**: + * To update all integration information at once, run from the repository root: + ```bash + python scripts/integration_registry/update_and_format_registry.py + ``` + * This script: + * Runs [`scripts/freshvenvs.py generate`](../../../scripts/freshvenvs.py) to update underlying version data + * Runs [`scripts/generate_table.py`](../../../scripts/generate_table.py) to create the supported versions table + * Runs [`scripts/integration_registry/_update_integration_registry_versions.py`](../../../scripts/integration_registry/_update_integration_registry_versions.py) to update the registry + * Formats the registry YAML for consistency + + **NOTE: Manual script update does not guarantee that newly added patched dependencies (such as for a new integration) will be added to the registry.yaml.** + + ***Registry Update Example (Incorrect Workflow)***: + - Add support for new `integration_a`, including patch files and tests + - Manually run `python scripts/integration_registry/update_and_format_registry.py` WITHOUT running riot test suite for `integration_a`. + - **OUTCOME**: Existing integration and dependencies are updated, but the new `integration_a` and its dependencies will not be added to `registry.yaml`. + + ***Registry Update Example (Correct Workflow)***: + - Add support for new `integration_a`, including patch files and tests + - Do a full riot test run of the newly added `integration_a` test suite. This is needed because we cannot reliably map dependency name to the integration name if they are not equal (such as integration == `rediscluster` and dependency name == `redis-py-cluster`). Instead, during the riot test suite run, we rely on collecting the patched module, along with the integration name via the [`IntegrationRegistryManager`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py). With the patched module, we can map the patched module to the dependency name using `importlib.metadata`, and in the `rediscluster` case, we get: `redis-py-cluster` as a dependency. Then we can update the registry since we now know the dependency name of interest, and the related integration name. + - **OUTCOME**: After running our new test suite for `integration_a`, the new integration along with its dependencies are automatically added to `registry.yaml`. Existing integrations amd dependencies are also updated. + + **FURTHER-NOTE: [`IntegrationRegistryManager`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py#158) relies on the use of `_datadog_patch` to collect patched modules. Please ensure this attribute is set on the patched module within the integration's patch function. Here is an example for the `aiohttp` integration [`aiohttp patch.py`](../../../ddtrace/contrib/internal/aiohttp/patch.py#139)** + +## Adding New Integrations + +When adding a new integration: + +1. Create the integration directory and implementation in `ddtrace/contrib/internal/` + - Ensure the patched module has `_datadog_patch=True`. The integration registry test code uses this attribute to determine which dependencies are patched, and that within the `patch()` function, the integration uses `getattr(module, '_datadog_patch') is True`. +2. Add tests and a corresponding riot test suite in [`riotfile.py`](../../../riotfile.py) +3. Run the test suite - this will automatically: + * Add the integration to the registry + * Record its dependency information + * Track tested version ranges + +No manual registry updates are needed - the `IntegrationRegistryManager` and update scripts handle everything automatically. + +## Registry Tests + +The registry has a test suite in [`tests/contrib/integration_registry/`](../../../tests/contrib/integration_registry/): + +* [`test_registry_schema.py`](../../../tests/contrib/integration_registry/test_registry_schema.py): + * Validates that the registry YAML content strictly conforms to the JSON schema definition + * Ensures all required fields are present and correctly formatted + * Verifies that every directory in `ddtrace/contrib/internal` has a corresponding entry in the registry + * Checks for any orphaned registry entries that don't have matching directories + +* [`test_external_dependencies.py`](../../../tests/contrib/integration_registry/test_external_dependencies.py): + * Validates external package requirements and version information: + * Ensures external integrations have required `dependency_names` and `tested_versions_by_dependency` fields + * Verifies version strings follow semantic versioning format + * Checks that version maps match declared dependencies + * Verifies all declared dependencies exist on PyPI: + * Uses `pip index versions` to check each package + * Validates package names are available and accessible + * Reports detailed errors for missing or invalid packages + * Ensures non-external integrations don't have dependency-related fields + +* [`test_riotfile.py`](../../../tests/contrib/integration_registry/test_riotfile.py): + * Verifies every integration has corresponding test environments in `riotfile.py`: + * Checks that each integration directory has a matching riot environment + * Excludes explicitly untested integrations + * Reports missing test environment definitions + * Validates test paths in riot environments: + * Ensures test paths under `tests/contrib` correspond to actual integrations + * Handles special cases for utility test environments + * Verifies proper organization of integration-specific tests + +## Troubleshooting + +### Running the Integration Registry Updater Locally + +If you need to debug or manually run the integration registry update process, the necessary code is located within the `integration_update_orchestrator.py` script. Follow these steps: + +1. Navigate to the [code section containing the local run logic](tests/contrib/integration_registry/registry_update_helpers/integration_update_orchestrator.py#L175-L183). +2. Uncomment the Python code block as indicated and comment out the the lines previous that run the updater in a subprocess. +3. Ensure the required dependencies (`filelock`, `pyyaml`) are installed in the riot environment you are running. You need to temporarily add them to the relevant environment definition in `riotfile.py`. +4. Execute the test suite, and place a breakpoint in your choice of code for the `IntegrationRegistryUpdater`. + +## Related Files + +* [`registry.yaml`](./registry.yaml) - The main registry file +* [`_registry_schema.json`](./_registry_schema.json) - JSON Schema definition +* [`mappings.py`](./mappings.py) - Mappings of integration name to dependency name, and the other way around as well. Also includes special cases for dependency name mappings to integration. +* [`IntegrationRegistryManager`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py) + - Patches `getattr()` and listens for modules that have `_datadog_patch` set on them. + - Collects all modules that had a patch set and saves them for later processing. + - Produces a dict of the form: `{ integration_name: { dependency_names: { "version": dep_version, "top_level_module": patched_top_level_module } } }` + - Cleans up all fixtures after the test session +* [`IntegrationRegistryUpdater`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_registry_updater.py) + - Reads collected dictionary of integrations and patched dependencies during test run from `IntegrationRegistryManager` + - Reads current `registry.yaml` file, and determines if the file should be updated by looking for the presence of the integration, dependency, or if + the tested version is outside the currently listed tested range. + - Updates `registry.yaml` if necessary +* [`IntegrationUpdateOrchestrator`](../../../tests/contrib/integration_registry/registry_update_helpers/integration_update_orchestrator.py) + - Builds a virtual environment to allow the integration registry updater process to run in another thread. Installs `riot` and `pyyaml` dependencies necessary for update. + - Runs `IntegrationRegistryUpdater` + - Runs [`update_and_format_registry.py`](../../../scripts/integration_registry/update_and_format_registry.py) script if updates are deemed necessary. +* Update Scripts: + * [`update_and_format_registry.py`](../../../scripts/integration_registry/update_and_format_registry.py) - Main update script, runs all the below scripts + * [`_update_integration_registry_versions.py`](../../../scripts/integration_registry/_update_integration_registry_versions.py) - Updates version information within the registry + * [`freshvenvs.py`](../../../scripts/freshvenvs.py) - Generates tested integration version data from test environments + * [`generate_table.py`](../../../scripts/generate_table.py) - Creates supported versions table diff --git a/ddtrace/contrib/integration_registry/__init__.py b/ddtrace/contrib/integration_registry/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ddtrace/contrib/integration_registry/_registry_schema.json b/ddtrace/contrib/integration_registry/_registry_schema.json new file mode 100644 index 00000000000..3325cd95ac6 --- /dev/null +++ b/ddtrace/contrib/integration_registry/_registry_schema.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Datadog Python Integration Registry Schema", + "description": "Schema matching the current fields generated by scripts/integration_registry/update_and_format_registry.py.", + "type": "object", + "properties": { + "integrations": { + "description": "List of all Datadog integration definitions.", + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/integration" + } + } + }, + "required": [ + "integrations" + ], + "additionalProperties": false, + "definitions": { + "testedVersionInfo": { + "type": "object", + "description": "Min, max, and list of tested versions for a specific dependency.", + "properties": { + "min": { + "description": "Minimum explicit version found in test lockfiles.", + "type": "string" + }, + "max": { + "description": "Maximum explicit version found in test lockfiles.", + "type": "string" + } + }, + "required": [ + "min", "max" + ], + "additionalProperties": false + }, + "integration": { + "type": "object", + "description": "Schema for a single integration definition.", + "properties": { + "integration_name": { + "description": "Canonical integration name used within ddtrace (lowercase, snake_case).", + "type": "string", + "pattern": "^[a-z0-9_]+$" + }, + "is_external_package": { + "description": "True if this instruments an external PyPI package, False for stdlib/internal/testing.", + "type": "boolean" + }, + "is_tested": { + "description": "False if the integration is not tested, true if it is tested.", + "type": "boolean" + }, + "dependency_names": { + "description": "Optional: List of primary PyPI package names instrumented (present only if is_external_package=true and dependencies were identified).", + "type": "array", + "items": { "type": "string" }, + "minItems": 1 + }, + "tested_versions_by_dependency": { + "description": "Optional: Maps dependency names (from dependency_names list) to their tested version info. Present only if is_external_package=true and is_tested=true.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/testedVersionInfo" + } + } + }, + "required": [ + "integration_name", + "is_external_package", + "is_tested" + ], + "additionalProperties": false + } + } +} diff --git a/ddtrace/contrib/integration_registry/mappings.py b/ddtrace/contrib/integration_registry/mappings.py new file mode 100644 index 00000000000..70feb3b0705 --- /dev/null +++ b/ddtrace/contrib/integration_registry/mappings.py @@ -0,0 +1,38 @@ +from .utils import get_integration_to_dependency_map +from .utils import invert_integration_to_dependency_map + + +EXCLUDED_FROM_TESTING = { + "coverage", + "pytest_benchmark", + "asgi", + "wsgi", + "boto", + "aioredis", + "pytest_bdd", + "urllib", + "webbrowser", + "asynctest", + "integration_registry", + "gunicorn", + "dbapi", + "dbapi_async", +} + +DEPENDENCY_TO_INTEGRATION_MAPPING_SPECIAL_CASES = { + "flask-caching": "flask-cache", + "pytest-asyncio": "asyncio", + "pysqlite3-binary": "sqlite3", + "dogpile.cache": "dogpile_cache", + "dogpile_cache": "dogpile_cache", + "dogpile-cache": "dogpile_cache", + "boto3": "botocore", + "pytest-bdd": "pytest_bdd", + "datadog-lambda": "aws_lambda", + "datadog_lambda": "aws_lambda", + "aiohttp-jinja2": "aiohttp_jinja2", + "aiohttp_jinja2": "aiohttp_jinja2", +} + +INTEGRATION_TO_DEPENDENCY_MAPPING = get_integration_to_dependency_map(DEPENDENCY_TO_INTEGRATION_MAPPING_SPECIAL_CASES) +DEPENDENCY_TO_INTEGRATION_MAPPING = invert_integration_to_dependency_map(INTEGRATION_TO_DEPENDENCY_MAPPING) diff --git a/ddtrace/contrib/integration_registry/registry.yaml b/ddtrace/contrib/integration_registry/registry.yaml new file mode 100644 index 00000000000..22b7b63bf3f --- /dev/null +++ b/ddtrace/contrib/integration_registry/registry.yaml @@ -0,0 +1,896 @@ +integrations: +- integration_name: aiobotocore + is_external_package: true + is_tested: true + dependency_names: + - aiobotocore + tested_versions_by_dependency: + aiobotocore: + min: 1.4.2 + max: 2.16.0 + +- integration_name: aiohttp + is_external_package: true + is_tested: true + dependency_names: + - aiohttp + tested_versions_by_dependency: + aiohttp: + min: 3.10.5 + max: 3.10.9 + +- integration_name: aiohttp_jinja2 + is_external_package: true + is_tested: true + dependency_names: + - aiohttp-jinja2 + - aiohttp_jinja2 + tested_versions_by_dependency: + aiohttp-jinja2: + min: 1.5.1 + max: 1.6.0 + aiohttp_jinja2: + min: 1.5.1 + max: 1.6.0 + +- integration_name: aiomysql + is_external_package: true + is_tested: true + dependency_names: + - aiomysql + tested_versions_by_dependency: + aiomysql: + min: 0.1.1 + max: 0.2.0 + +- integration_name: aiopg + is_external_package: true + is_tested: true + dependency_names: + - aiopg + tested_versions_by_dependency: + aiopg: + min: 1.4.0 + max: 1.4.0 + +- integration_name: aioredis + is_external_package: true + is_tested: false + dependency_names: + - aioredis + +- integration_name: algoliasearch + is_external_package: true + is_tested: true + dependency_names: + - algoliasearch + tested_versions_by_dependency: + algoliasearch: + min: 2.6.3 + max: 2.6.3 + +- integration_name: anthropic + is_external_package: true + is_tested: true + dependency_names: + - anthropic + tested_versions_by_dependency: + anthropic: + min: 0.49.0 + max: 0.49.0 + +- integration_name: aredis + is_external_package: true + is_tested: true + dependency_names: + - aredis + tested_versions_by_dependency: + aredis: + min: 1.1.8 + max: 1.1.8 + +- integration_name: asgi + is_external_package: false + is_tested: true + +- integration_name: asyncio + is_external_package: false + is_tested: true + +- integration_name: asyncpg + is_external_package: true + is_tested: true + dependency_names: + - asyncpg + tested_versions_by_dependency: + asyncpg: + min: 0.23.0 + max: 0.30.0 + +- integration_name: avro + is_external_package: true + is_tested: true + dependency_names: + - avro + tested_versions_by_dependency: + avro: + min: 1.12.0 + max: 1.12.0 + +- integration_name: aws_lambda + is_external_package: true + is_tested: true + dependency_names: + - datadog-lambda + - datadog_lambda + tested_versions_by_dependency: + datadog-lambda: + min: 6.105.0 + max: 6.105.0 + datadog_lambda: + min: 6.105.0 + max: 6.105.0 + +- integration_name: azure_functions + is_external_package: true + is_tested: true + dependency_names: + - azure-functions + tested_versions_by_dependency: + azure-functions: + min: 1.21.3 + max: 1.21.3 + +- integration_name: boto + is_external_package: true + is_tested: true + dependency_names: + - boto + tested_versions_by_dependency: + boto: + min: 2.49.0 + max: 2.49.0 + +- integration_name: botocore + is_external_package: true + is_tested: true + dependency_names: + - boto3 + - botocore + tested_versions_by_dependency: + boto3: + min: 1.34.49 + max: 1.37.5 + botocore: + min: 1.34.49 + max: 1.37.5 + +- integration_name: bottle + is_external_package: true + is_tested: true + dependency_names: + - bottle + tested_versions_by_dependency: + bottle: + min: 0.12.25 + max: 0.13.2 + +- integration_name: cassandra + is_external_package: true + is_tested: true + dependency_names: + - cassandra-driver + tested_versions_by_dependency: + cassandra-driver: + min: 3.24.0 + max: 3.28.0 + +- integration_name: celery + is_external_package: true + is_tested: true + dependency_names: + - celery + tested_versions_by_dependency: + celery: + min: 5.3.6 + max: 5.4.0 + +- integration_name: cherrypy + is_external_package: true + is_tested: true + dependency_names: + - cherrypy + tested_versions_by_dependency: + cherrypy: + min: 17.4.2 + max: 18.10.0 + +- integration_name: consul + is_external_package: true + is_tested: true + dependency_names: + - python-consul + tested_versions_by_dependency: + python-consul: + min: 1.1.0 + max: 1.1.0 + +- integration_name: coverage + is_external_package: true + is_tested: true + dependency_names: + - coverage + tested_versions_by_dependency: + coverage: + min: 7.2.2 + max: 7.8.0 + +- integration_name: crewai + is_external_package: true + is_tested: true + dependency_names: + - crewai + tested_versions_by_dependency: + crewai: + min: 0.108.0 + max: 0.108.0 + +- integration_name: ddtrace_api + is_external_package: false + is_tested: true + +- integration_name: django + is_external_package: true + is_tested: true + dependency_names: + - django + tested_versions_by_dependency: + django: + min: 2.2.1 + max: 5.2.0 + +- integration_name: dogpile_cache + is_external_package: true + is_tested: true + dependency_names: + - dogpile-cache + - dogpile.cache + - dogpile_cache + tested_versions_by_dependency: + dogpile-cache: + min: 0.9.2 + max: 1.3.3 + dogpile.cache: + min: 0.9.2 + max: 1.3.3 + dogpile_cache: + min: 0.9.2 + max: 1.3.3 + +- integration_name: dramatiq + is_external_package: true + is_tested: true + dependency_names: + - dramatiq + tested_versions_by_dependency: + dramatiq: + min: 1.17.0 + max: 1.17.0 + +- integration_name: elasticsearch + is_external_package: true + is_tested: true + dependency_names: + - elastic-transport + - elasticsearch + - elasticsearch1 + - elasticsearch2 + - elasticsearch5 + - elasticsearch6 + - elasticsearch7 + - opensearch-py + tested_versions_by_dependency: + elastic-transport: + min: 8.11.0 + max: 8.17.1 + elasticsearch: + min: 7.13.4 + max: 9.0.0 + elasticsearch1: + min: 1.10.0 + max: 1.10.0 + elasticsearch2: + min: 2.5.1 + max: 2.5.1 + elasticsearch5: + min: 5.5.6 + max: 5.5.6 + elasticsearch6: + min: 6.8.2 + max: 6.8.2 + elasticsearch7: + min: 7.13.4 + max: 7.17.12 + opensearch-py: + min: 1.1.0 + max: 2.8.0 + +- integration_name: falcon + is_external_package: true + is_tested: true + dependency_names: + - falcon + tested_versions_by_dependency: + falcon: + min: 3.0.1 + max: 4.0.2 + +- integration_name: fastapi + is_external_package: true + is_tested: true + dependency_names: + - fastapi + tested_versions_by_dependency: + fastapi: + min: 0.64.0 + max: 0.115.12 + +- integration_name: flask + is_external_package: true + is_tested: true + dependency_names: + - flask + tested_versions_by_dependency: + flask: + min: 1.1.4 + max: 3.1.0 + +- integration_name: flask_cache + is_external_package: true + is_tested: true + dependency_names: + - flask-cache + - flask-caching + tested_versions_by_dependency: + flask-cache: + min: 0.13.1 + max: 0.13.1 + flask-caching: + min: 1.10.1 + max: 2.3.0 + +- integration_name: freezegun + is_external_package: true + is_tested: false + dependency_names: + - freezegun + +- integration_name: futures + is_external_package: false + is_tested: true + +- integration_name: gevent + is_external_package: true + is_tested: true + dependency_names: + - gevent + tested_versions_by_dependency: + gevent: + min: 20.12.1 + max: 24.11.1 + +- integration_name: google_generativeai + is_external_package: true + is_tested: true + dependency_names: + - google-generativeai + tested_versions_by_dependency: + google-generativeai: + min: 0.8.3 + max: 0.8.3 + +- integration_name: graphql + is_external_package: true + is_tested: true + dependency_names: + - graphql-core + tested_versions_by_dependency: + graphql-core: + min: 3.1.7 + max: 3.2.6 + +- integration_name: grpc + is_external_package: true + is_tested: true + dependency_names: + - grpcio + tested_versions_by_dependency: + grpcio: + min: 1.34.1 + max: 1.68.1 + +- integration_name: httplib + is_external_package: false + is_tested: true + +- integration_name: httpx + is_external_package: true + is_tested: true + dependency_names: + - httpx + tested_versions_by_dependency: + httpx: + min: 0.17.1 + max: 0.27.2 + +- integration_name: jinja2 + is_external_package: true + is_tested: true + dependency_names: + - jinja2 + tested_versions_by_dependency: + jinja2: + min: 2.10.3 + max: 3.1.4 + +- integration_name: kafka + is_external_package: true + is_tested: true + dependency_names: + - confluent-kafka + tested_versions_by_dependency: + confluent-kafka: + min: 1.9.2 + max: 2.6.2 + +- integration_name: kombu + is_external_package: true + is_tested: true + dependency_names: + - kombu + tested_versions_by_dependency: + kombu: + min: 4.6.11 + max: 5.4.2 + +- integration_name: langchain + is_external_package: true + is_tested: true + dependency_names: + - langchain + tested_versions_by_dependency: + langchain: + min: 0.1.20 + max: 0.3.18 + +- integration_name: langgraph + is_external_package: true + is_tested: true + dependency_names: + - langgraph + - langgraph-checkpoint + tested_versions_by_dependency: + langgraph: + min: 0.2.60 + max: 0.2.61 + langgraph-checkpoint: + min: 2.0.9 + max: 2.0.9 + +- integration_name: litellm + is_external_package: true + is_tested: true + dependency_names: + - litellm + tested_versions_by_dependency: + litellm: + min: 1.65.4 + max: 1.65.4 + +- integration_name: logbook + is_external_package: true + is_tested: true + dependency_names: + - logbook + tested_versions_by_dependency: + logbook: + min: 1.0.0 + max: 1.8.1 + +- integration_name: logging + is_external_package: false + is_tested: true + +- integration_name: loguru + is_external_package: true + is_tested: true + dependency_names: + - loguru + tested_versions_by_dependency: + loguru: + min: 0.4.1 + max: 0.7.2 + +- integration_name: mako + is_external_package: true + is_tested: true + dependency_names: + - mako + tested_versions_by_dependency: + mako: + min: 1.1.6 + max: 1.3.8 + +- integration_name: mariadb + is_external_package: true + is_tested: true + dependency_names: + - mariadb + tested_versions_by_dependency: + mariadb: + min: 1.0.11 + max: 1.1.11 + +- integration_name: molten + is_external_package: true + is_tested: true + dependency_names: + - molten + tested_versions_by_dependency: + molten: + min: 1.0.2 + max: 1.0.2 + +- integration_name: mongoengine + is_external_package: true + is_tested: true + dependency_names: + - mongoengine + tested_versions_by_dependency: + mongoengine: + min: 0.29.1 + max: 0.29.1 + +- integration_name: mysql + is_external_package: true + is_tested: true + dependency_names: + - mysql-connector-python + tested_versions_by_dependency: + mysql-connector-python: + min: 8.0.5 + max: 9.0.0 + +- integration_name: mysqldb + is_external_package: true + is_tested: true + dependency_names: + - mysqlclient + tested_versions_by_dependency: + mysqlclient: + min: 2.2.1 + max: 2.2.6 + +- integration_name: openai + is_external_package: true + is_tested: true + dependency_names: + - openai + tested_versions_by_dependency: + openai: + min: 1.0.0 + max: 1.60.0 + +- integration_name: openai_agents + is_external_package: true + is_tested: true + dependency_names: + - openai-agents + tested_versions_by_dependency: + openai-agents: + min: 0.0.8 + max: 0.0.8 + +- integration_name: protobuf + is_external_package: true + is_tested: true + dependency_names: + - protobuf + tested_versions_by_dependency: + protobuf: + min: 5.29.3 + max: 6.30.1 + +- integration_name: psycopg + is_external_package: true + is_tested: true + dependency_names: + - psycopg + - psycopg2-binary + tested_versions_by_dependency: + psycopg: + min: 3.2.1 + max: 3.2.1 + psycopg2-binary: + min: 2.8.6 + max: 2.9.10 + +- integration_name: pylibmc + is_external_package: true + is_tested: true + dependency_names: + - pylibmc + tested_versions_by_dependency: + pylibmc: + min: 1.6.3 + max: 1.6.3 + +- integration_name: pymemcache + is_external_package: true + is_tested: true + dependency_names: + - pymemcache + tested_versions_by_dependency: + pymemcache: + min: 3.4.4 + max: 4.0.0 + +- integration_name: pymongo + is_external_package: true + is_tested: true + dependency_names: + - pymongo + tested_versions_by_dependency: + pymongo: + min: 3.8.0 + max: 4.10.1 + +- integration_name: pymysql + is_external_package: true + is_tested: true + dependency_names: + - pymysql + tested_versions_by_dependency: + pymysql: + min: 0.10.1 + max: 1.1.1 + +- integration_name: pynamodb + is_external_package: true + is_tested: true + dependency_names: + - pynamodb + tested_versions_by_dependency: + pynamodb: + min: 5.5.1 + max: 5.5.1 + +- integration_name: pyodbc + is_external_package: true + is_tested: true + dependency_names: + - pyodbc + tested_versions_by_dependency: + pyodbc: + min: 4.0.39 + max: 5.2.0 + +- integration_name: pyramid + is_external_package: true + is_tested: true + dependency_names: + - pyramid + tested_versions_by_dependency: + pyramid: + min: 1.10.8 + max: 2.0.2 + +- integration_name: pytest + is_external_package: true + is_tested: true + dependency_names: + - pytest + tested_versions_by_dependency: + pytest: + min: 6.2.5 + max: 8.1.1 + +- integration_name: pytest_bdd + is_external_package: true + is_tested: true + dependency_names: + - pytest-bdd + tested_versions_by_dependency: + pytest-bdd: + min: 4.1.0 + max: 6.0.1 + +- integration_name: pytest_benchmark + is_external_package: true + is_tested: false + dependency_names: + - pytest_benchmark + +- integration_name: redis + is_external_package: true + is_tested: true + dependency_names: + - redis + tested_versions_by_dependency: + redis: + min: 4.6.0 + max: 5.2.0 + +- integration_name: rediscluster + is_external_package: true + is_tested: true + dependency_names: + - redis-py-cluster + tested_versions_by_dependency: + redis-py-cluster: + min: 2.0.0 + max: 2.1.3 + +- integration_name: requests + is_external_package: true + is_tested: true + dependency_names: + - requests + tested_versions_by_dependency: + requests: + min: 2.22.0 + max: 2.32.3 + +- integration_name: rq + is_external_package: true + is_tested: true + dependency_names: + - rq + tested_versions_by_dependency: + rq: + min: 1.8.1 + max: 1.16.2 + +- integration_name: sanic + is_external_package: true + is_tested: true + dependency_names: + - sanic + tested_versions_by_dependency: + sanic: + min: 20.12.7 + max: 24.6.0 + +- integration_name: selenium + is_external_package: true + is_tested: false + dependency_names: + - selenium + +- integration_name: snowflake + is_external_package: true + is_tested: true + dependency_names: + - snowflake-connector-python + tested_versions_by_dependency: + snowflake-connector-python: + min: 2.3.10 + max: 3.12.2 + +- integration_name: sqlalchemy + is_external_package: true + is_tested: true + dependency_names: + - sqlalchemy + tested_versions_by_dependency: + sqlalchemy: + min: 1.3.24 + max: 2.0.40 + +- integration_name: sqlite3 + is_external_package: false + is_tested: true + +- integration_name: starlette + is_external_package: true + is_tested: true + dependency_names: + - starlette + tested_versions_by_dependency: + starlette: + min: 0.14.2 + max: 0.39.2 + +- integration_name: structlog + is_external_package: true + is_tested: true + dependency_names: + - structlog + tested_versions_by_dependency: + structlog: + min: 20.2.0 + max: 24.4.0 + +- integration_name: subprocess + is_external_package: false + is_tested: true + +- integration_name: tornado + is_external_package: true + is_tested: true + dependency_names: + - tornado + tested_versions_by_dependency: + tornado: + min: 6.2.0 + max: 6.4.1 + +- integration_name: unittest + is_external_package: false + is_tested: true + +- integration_name: urllib + is_external_package: false + is_tested: true + +- integration_name: urllib3 + is_external_package: true + is_tested: true + dependency_names: + - urllib3 + tested_versions_by_dependency: + urllib3: + min: 1.25.0 + max: 2.2.3 + +- integration_name: valkey + is_external_package: true + is_tested: true + dependency_names: + - valkey + tested_versions_by_dependency: + valkey: + min: 6.0.2 + max: 6.0.2 + +- integration_name: vertexai + is_external_package: true + is_tested: true + dependency_names: + - google-cloud-aiplatform + - vertexai + tested_versions_by_dependency: + google-cloud-aiplatform: + min: 1.71.1 + max: 1.71.1 + vertexai: + min: 1.71.1 + max: 1.71.1 + +- integration_name: vertica + is_external_package: true + is_tested: true + dependency_names: + - vertica-python + tested_versions_by_dependency: + vertica-python: + min: 0.6.14 + max: 0.7.4 + +- integration_name: webbrowser + is_external_package: false + is_tested: true + +- integration_name: wsgi + is_external_package: false + is_tested: true + +- integration_name: yaaredis + is_external_package: true + is_tested: true + dependency_names: + - yaaredis + tested_versions_by_dependency: + yaaredis: + min: 2.0.4 + max: 3.0.0 diff --git a/ddtrace/contrib/integration_registry/utils.py b/ddtrace/contrib/integration_registry/utils.py new file mode 100644 index 00000000000..8d6a509198d --- /dev/null +++ b/ddtrace/contrib/integration_registry/utils.py @@ -0,0 +1,43 @@ +from collections import defaultdict +import pathlib +from typing import DefaultDict +from typing import Dict +from typing import List +from typing import Optional + +import yaml + + +def get_integration_to_dependency_map(special_cases: Optional[Dict[str, str]] = None) -> DefaultDict[str, set]: + REGISTRY_YAML_PATH = pathlib.Path("ddtrace/contrib/integration_registry/registry.yaml") + dependency_map: DefaultDict[str, set] = defaultdict(set) + + with open(REGISTRY_YAML_PATH, "r", encoding="utf-8") as f: + registry_content = yaml.safe_load(f) + + integrations_list = registry_content["integrations"] + + for index, entry in enumerate(integrations_list): + integration_name = entry.get("integration_name").lower() + dependency_names = entry.get("dependency_names") + + if dependency_names is None: + valid_dependency_names = set() + elif isinstance(dependency_names, list): + valid_dependency_names = set(dependency_name.lower() for dependency_name in dependency_names) + + dependency_map[integration_name] = valid_dependency_names + + for dependency, integration in special_cases.items(): + dependency_map[integration].add(dependency) + + return dependency_map + + +def invert_integration_to_dependency_map(integration_to_deps: Dict[str, List[str]]) -> Dict[str, str]: + dependency_to_integration_map: Dict[str, str] = {} + for integration, dependency_list in integration_to_deps.items(): + for dependency in dependency_list: + dependency_to_integration_map[dependency.lower()] = integration.lower() + + return dependency_to_integration_map diff --git a/lib-injection/sources/min_compatible_versions.csv b/lib-injection/sources/min_compatible_versions.csv index 83bddf15944..0884cd8d8ac 100644 --- a/lib-injection/sources/min_compatible_versions.csv +++ b/lib-injection/sources/min_compatible_versions.csv @@ -2,6 +2,7 @@ This file was generated by scripts/min_compatible_versions.py pkg_name,min_version Flask-Cache,~=0.13.1 Jinja2,~=2.10.0 +PyYAML,0 WebTest,0 Werkzeug,<1.0 ai21,0 @@ -159,6 +160,7 @@ requests-mock,>=1.4 responses,~=0.16.0 respx,0 rich,0 +riot,==0.20.1 rq,~=1.8.0 ruamel.yaml,0 sanic,~=20.12 diff --git a/min_compatible_versions.csv b/min_compatible_versions.csv index 83bddf15944..0884cd8d8ac 100644 --- a/min_compatible_versions.csv +++ b/min_compatible_versions.csv @@ -2,6 +2,7 @@ This file was generated by scripts/min_compatible_versions.py pkg_name,min_version Flask-Cache,~=0.13.1 Jinja2,~=2.10.0 +PyYAML,0 WebTest,0 Werkzeug,<1.0 ai21,0 @@ -159,6 +160,7 @@ requests-mock,>=1.4 responses,~=0.16.0 respx,0 rich,0 +riot,==0.20.1 rq,~=1.8.0 ruamel.yaml,0 sanic,~=20.12 diff --git a/riotfile.py b/riotfile.py index 995a69d1be5..fd46f5b2aba 100644 --- a/riotfile.py +++ b/riotfile.py @@ -457,7 +457,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT pys=select_pys(), ), Venv( - name="test_logging", + name="logging", command="pytest {cmdargs} tests/contrib/logging", pkgs={ "pytest-randomly": latest, @@ -679,7 +679,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="django_hosts", + name="django:django_hosts", command="pytest {cmdargs} tests/contrib/django_hosts", pkgs={ "pytest-django[testing]": [ @@ -706,7 +706,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="djangorestframework", + name="django:djangorestframework", command="pytest {cmdargs} tests/contrib/djangorestframework", pkgs={ "pytest-django[testing]": "==3.10.0", @@ -738,7 +738,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="django_celery", + name="django:celery", command="pytest {cmdargs} tests/contrib/django_celery", pkgs={ # The test app was built with Django 2. We don't need to test @@ -805,7 +805,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="elasticsearch-multi", + name="elasticsearch:multi", command="pytest {cmdargs} tests/contrib/elasticsearch/test_elasticsearch_multi.py", venvs=[ Venv( @@ -819,7 +819,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="elasticsearch-async", + name="elasticsearch:async", command="pytest {cmdargs} tests/contrib/elasticsearch/test_async.py", env={"AIOHTTP_NO_EXTENSIONS": "1"}, # needed until aiohttp is updated to support python 3.12 venvs=[ @@ -835,7 +835,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="elasticsearch-opensearch", + name="elasticsearch:opensearch", # avoid running tests in ElasticsearchPatchTest, only run tests with OpenSearchPatchTest configurations command="pytest {cmdargs} tests/contrib/elasticsearch/test_opensearch.py -k 'not ElasticsearchPatchTest'", pys=select_pys(), @@ -1022,7 +1022,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="psycopg2", + name="psycopg:psycopg2", command="pytest {cmdargs} tests/contrib/psycopg2", pkgs={ "pytest-randomly": latest, @@ -1545,11 +1545,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="pytest-bdd", + name="pytest_bdd", command="pytest --no-ddtrace {cmdargs} tests/contrib/pytest_bdd/", pkgs={ "msgpack": latest, "more_itertools": "<8.11.0", + "pytest": "==7.4.4", "pytest-randomly": latest, "pytest-bdd": [ ">=4.0,<5.0", @@ -1604,7 +1605,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="pytest-benchmark", + name="pytest_benchmark", pys=select_pys(min_version="3.8", max_version="3.12"), command="pytest {cmdargs} --no-ddtrace --no-cov tests/contrib/pytest_benchmark/", pkgs={ @@ -1677,7 +1678,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="grpc_aio", + name="grpc:grpc_aio", command="python -m pytest {cmdargs} tests/contrib/grpc_aio", pkgs={ "googleapis-common-protos": latest, @@ -1713,7 +1714,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - name="graphene", + name="graphql:graphene", command="pytest {cmdargs} tests/contrib/graphene", pys=select_pys(min_version="3.8"), pkgs={ @@ -2743,6 +2744,19 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, pys=select_pys(), ), + Venv( + name="integration_registry", + command="pytest {cmdargs} tests/contrib/integration_registry", + pkgs={ + "riot": "==0.20.1", + "pytest-randomly": latest, + "pytest-asyncio": "==0.23.7", + "PyYAML": latest, + "jsonschema": latest, + }, + # we only need to run this on one version of Python + pys=["3.13"], + ), Venv( name="llmobs", command="pytest {cmdargs} tests/llmobs", diff --git a/scripts/freshvenvs.py b/scripts/freshvenvs.py index d2337d6a83d..9e5e749df18 100644 --- a/scripts/freshvenvs.py +++ b/scripts/freshvenvs.py @@ -15,41 +15,17 @@ from pip import _internal +# add project root to path to import riotfile sys.path.append(str(pathlib.Path(__file__).parent.parent.resolve())) -import riotfile # noqa: E402 +from ddtrace.contrib.integration_registry.mappings import DEPENDENCY_TO_INTEGRATION_MAPPING # noqa: I001,E402 +from ddtrace.contrib.integration_registry.mappings import INTEGRATION_TO_DEPENDENCY_MAPPING # noqa: I001,E402 + +import riotfile # noqa: I001,E402 CONTRIB_ROOT = pathlib.Path("ddtrace/contrib/internal") LATEST = "" -excluded = {"coverage"} - -# map module => lockfile dependency -module_dependency_mapping = { - "kafka": "confluent-kafka", - "consul": "python-consul", - "snowflake": "snowflake-connector-python", - "flask_cache": "flask-caching", - "graphql": "graphql-core", - "mysql": "mysql-connector-python", - "mysqldb": "mysqlclient", - "asyncio": "pytest-asyncio", - "sqlite3": "pysqlite3-binary", - "grpc": "grpcio", - "google_generativeai": "google-generativeai", - "psycopg2": "psycopg2-binary", - "cassandra": "cassandra-driver", - "rediscluster": "redis-py-cluster", - "dogpile_cache": "dogpile-cache", - "vertica": "vertica-python", - "aiohttp_jinja2": "aiohttp-jinja2", - "azure_functions": "azure-functions", - "pytest_bdd": "pytest-bdd", - "aws_lambda": "datadog-lambda", -} - -dependency_module_mapping = {v: k for k, v in module_dependency_mapping.items()} - supported_versions = [] pinned_packages = set() @@ -68,6 +44,7 @@ def __exit__(self, *args): sys.stdout = self._stdout sys.stderr = self._stderr + def parse_args(): """ usage: python scripts/freshvenvs.py OR @@ -76,9 +53,10 @@ def parse_args(): parser.add_argument("mode", choices=["output", "generate"], help="mode: output or generate") return parser.parse_args() -def _get_integrated_modules() -> typing.Set[str]: - """Get all modules that have contribs implemented for them""" - all_required_modules = set() + +def _get_contrib_modules() -> typing.Set[str]: + """Get all integrations by checking modules that have contribs implemented for them""" + all_integration_names = set() for item in CONTRIB_ROOT.iterdir(): if not os.path.isdir(item): continue @@ -87,53 +65,87 @@ def _get_integrated_modules() -> typing.Set[str]: if os.path.isfile(patch_filepath): module_name = item.name - all_required_modules.add(module_name) - + all_integration_names.add(module_name) - return all_required_modules + return all_integration_names -def _get_riot_envs_including_any(modules: typing.Set[str]) -> typing.Set[str]: +def _get_riot_envs_including_any(contrib_modules: typing.Set[str]) -> typing.Set[str]: """Return the set of riot env hashes where each env uses at least one of the given modules""" envs = set() for item in os.listdir(".riot/requirements"): if item.endswith(".txt"): with open(f".riot/requirements/{item}", "r") as lockfile: lockfile_content = lockfile.read() - for module in modules: - if module in lockfile_content or ( - module in module_dependency_mapping and module_dependency_mapping[module] in lockfile_content + for contrib_module in contrib_modules: + if contrib_module in lockfile_content or ( + _integration_to_dependency_mapping_contains(contrib_module, lockfile_content) ): envs |= {item.split(".")[0]} break return envs -def _get_updatable_packages_implementing(modules: typing.Set[str]) -> typing.Set[str]: - """Return all packages have contribs implemented for them""" - all_venvs = riotfile.venv.venvs +def _integration_to_dependency_mapping_contains(integration: str, lockfile_content: str) -> bool: + if integration not in INTEGRATION_TO_DEPENDENCY_MAPPING: + return False - for v in all_venvs: - package = v.name - if package not in modules: - continue - if not _venv_sets_latest_for_package(v, package): - pinned_packages.add(package) + for dependency in INTEGRATION_TO_DEPENDENCY_MAPPING[integration]: + if dependency in lockfile_content: + return True - packages = {m for m in modules if "." not in m and m not in pinned_packages} + return False + + +def _get_updatable_packages_implementing(contrib_modules: typing.Set[str]) -> typing.Set[str]: + """Return all integrations that can be updated""" + all_venvs = riotfile.venv.venvs + all_venvs = _propagate_venv_names_to_child_venvs(all_venvs) + + packages_setting_latest = set() + def recurse_venvs(venvs: typing.List[riotfile.Venv]): + for venv in venvs: + # split venv name by ":" since some venvs are named after the integration:subintegration + package = venv.name.split(":")[0] if venv.name is not None else venv.name + # Check if the package name is an integration as all contrib venvs are named after the integration + if package not in contrib_modules: + continue + if not _venv_sets_latest_for_package(venv, package) and package not in packages_setting_latest: + pinned_packages.add(package) + else: + packages_setting_latest.add(package) + if package in pinned_packages: + pinned_packages.remove(package) + recurse_venvs(venv.venvs) + + recurse_venvs(all_venvs) + + packages = {m for m in contrib_modules if "." not in m and m not in pinned_packages} return packages -def _get_all_modules(modules: typing.Set[str]) -> typing.Set[str]: - """Return all packages have contribs implemented for them""" - contrib_modules = {m for m in modules if "." not in m} - return contrib_modules +def _propagate_venv_names_to_child_venvs(all_venvs: typing.List[riotfile.Venv]) -> typing.List[riotfile.Venv]: + """ + Propagate the venv name to child venvs, since most child venvs in riotfile are unnamed. Since most contrib + venvs are nested within each other, we will get a consistent integration name for each venv / child venv. Also + lowercase the package names to ensure consistent lookups. + """ + def _lower_pkg_names(venv: riotfile.Venv): + venv.pkgs = {k.lower(): v for k, v in venv.pkgs.items()} + for venv in all_venvs: + _lower_pkg_names(venv) + if venv.venvs: + for child_venv in venv.venvs: + child_venv.name = venv.name -def _get_version_extremes(package_name: str) -> typing.Tuple[Optional[str], Optional[str]]: + return all_venvs + + +def _get_version_extremes(contrib_module: str) -> typing.Tuple[Optional[str], Optional[str]]: """Return the (earliest, latest) supported versions of a given package""" with Capturing() as output: - _internal.main(["index", "versions", package_name]) + _internal.main(["index", "versions", contrib_module]) if not output: return (None, None) version_list = [a for a in output if "available versions" in a.lower()][0] @@ -142,7 +154,7 @@ def _get_version_extremes(package_name: str) -> typing.Tuple[Optional[str], Opti earliest_within_window = versions[-1] conn = HTTPSConnection("pypi.org", 443) - conn.request("GET", f"pypi/{package_name}/json") + conn.request("GET", f"pypi/{contrib_module}/json") response = conn.getresponse() if response.status != 200: @@ -165,17 +177,64 @@ def _get_version_extremes(package_name: str) -> typing.Tuple[Optional[str], Opti return earliest_within_window, versions[0] -def _get_package_versions_from(env: str, packages: typing.Set[str]) -> typing.List[typing.Tuple[str, str]]: +def _get_riot_hash_to_venv_name() -> typing.Dict[str, str]: + """Get a mapping of riot hash to venv name.""" + from io import StringIO + import re + + import riot + + ctx = riot.Session.from_config_file("riotfile.py") + old_stdout = sys.stdout + result = StringIO() + sys.stdout = result + + try: + pattern = re.compile(r"^.*$") + venv_pattern = re.compile(r"^.*$") + ctx.list_venvs(pattern=pattern, venv_pattern=venv_pattern, pipe_mode=True) + output = result.getvalue() + finally: + sys.stdout = old_stdout + + hash_to_name = {} + for line in output.splitlines(): + match = re.match(r'\[#\d+\]\s+([a-f0-9]+)\s+(\S+)', line) + if match: + venv_hash, venv_name = match.groups() + hash_to_name[venv_hash] = venv_name.lower() + return hash_to_name + + +def _get_package_versions_from( + env: str, contrib_modules: typing.Set[str], riot_hash_to_venv_name: typing.Dict[str, str] +) -> typing.List[typing.Tuple[str, str]]: """Return the list of package versions that are tested, related to the modules""" lockfile_content = pathlib.Path(f".riot/requirements/{env}.txt").read_text().splitlines() lock_packages = [] + integration = None + dependencies = [] + if riot_hash_to_venv_name.get(env): + venv_name = riot_hash_to_venv_name[env].split(":")[0] + + def get_integration_and_dependencies(venv_name: str) -> typing.Tuple[str, typing.List[str]]: + if venv_name in contrib_modules: + integration = venv_name + dependencies = INTEGRATION_TO_DEPENDENCY_MAPPING.get(venv_name, integration) + return integration, dependencies + elif venv_name in DEPENDENCY_TO_INTEGRATION_MAPPING: + integration = DEPENDENCY_TO_INTEGRATION_MAPPING[venv_name] + dependencies = INTEGRATION_TO_DEPENDENCY_MAPPING[integration] + return integration, dependencies + else: + return None, [] + integration, dependencies = get_integration_and_dependencies(venv_name) + for line in lockfile_content: package, _, versions = line.partition("==") - if package in packages: + package = package.split("[")[0] # strip optional package installs like flask[async] + if package in dependencies or package == integration: lock_packages.append((package, versions)) - elif package in dependency_module_mapping and dependency_module_mapping[package] in packages: - lock_packages.append((dependency_module_mapping[package], versions)) - return lock_packages @@ -187,6 +246,7 @@ def _is_module_autoinstrumented(module: str) -> bool: return module in PATCH_MODULES and PATCH_MODULES[module] + def _versions_fully_cover_bounds(bounds: typing.Tuple[str, str], versions: typing.List[str]) -> bool: """Return whether the tested versions cover the upper bound range of supported versions""" if not versions: @@ -200,113 +260,126 @@ def _venv_sets_latest_for_package(venv: riotfile.Venv, suite_name: str) -> bool: Returns whether the Venv for the package uses `latest` or not. DFS traverse through the Venv, as it may have nested Venvs. - If the module name is in module_dependency_mapping, remap it. + If the module name is in INTEGRATION_TO_DEPENDENCY_MAPPING, remap it. """ - package = module_dependency_mapping.get(suite_name, suite_name) + packages = INTEGRATION_TO_DEPENDENCY_MAPPING.get(suite_name, [suite_name]) - if package in venv.pkgs: - if LATEST in venv.pkgs[package]: - return True - - if venv.venvs: - for child_venv in venv.venvs: - if _venv_sets_latest_for_package(child_venv, package): + for package in packages: + if package in venv.pkgs: + if LATEST in venv.pkgs[package]: return True + if venv.venvs: + for child_venv in venv.venvs: + if _venv_sets_latest_for_package(child_venv, package): + return True return False -def _get_all_used_versions(envs, packages) -> dict: +def _get_all_used_versions(envs, contrib_modules, riot_hash_to_venv_name) -> dict: """ Returns dict(module, set(versions)) for a venv, as defined from riot lockfiles. """ all_used_versions = defaultdict(set) for env in envs: - versions_used = _get_package_versions_from(env, packages) + versions_used = _get_package_versions_from(env, contrib_modules, riot_hash_to_venv_name) for package, version in versions_used: all_used_versions[package].add(version) return all_used_versions -def _get_version_bounds(packages) -> dict: +def _get_version_bounds(contrib_modules: typing.Set[str]) -> dict: """ Return dict(module: (earliest, latest)) of the module from PyPI """ bounds = dict() - for package in packages: - earliest, latest = _get_version_extremes(package) - bounds[package] = (earliest, latest) + for contrib_module in contrib_modules: + earliest, latest = _get_version_extremes(contrib_module) + bounds[contrib_module] = (earliest, latest) return bounds -def output_outdated_packages(all_required_packages, envs, bounds): + +def output_outdated_packages(all_updatable_contribs, envs, bounds, riot_hash_to_venv_name): """ Output a list of package names that can be updated. """ outdated_packages = [] - for package in all_required_packages: - earliest, latest = _get_version_extremes(package) - bounds[package] = (earliest, latest) + for contrib_module in all_updatable_contribs: + earliest, latest = _get_version_extremes(contrib_module) + bounds[contrib_module] = (earliest, latest) all_used_versions = defaultdict(set) for env in envs: - versions_used = _get_package_versions_from(env, all_required_packages) + versions_used = _get_package_versions_from(env, all_updatable_contribs, riot_hash_to_venv_name) for pkg, version in versions_used: all_used_versions[pkg].add(version) - - for package in all_required_packages: - ordered = sorted([Version(v) for v in all_used_versions[package]], reverse=True) + for contrib_module in all_updatable_contribs: + ordered = sorted([Version(v) for v in all_used_versions[contrib_module]], reverse=True) if not ordered: continue - if package not in bounds or bounds[package] == (None, None): + if contrib_module not in bounds or bounds[contrib_module] == (None, None): continue - if not _versions_fully_cover_bounds(bounds[package], ordered): - outdated_packages.append(package) + if not _versions_fully_cover_bounds(bounds[contrib_module], ordered): + outdated_packages.append(contrib_module) print(" ".join(outdated_packages)) -def generate_supported_versions(contrib_packages, all_used_versions): +def generate_supported_versions(contrib_modules, all_used_versions): """ Generate supported versions JSON """ patched = {} - for package in contrib_packages: - ordered = sorted([Version(v) for v in all_used_versions[package]], reverse=True) - if not ordered: - continue - json_format = { - "integration": package, - "minimum_tracer_supported": str(ordered[-1]), - "max_tracer_supported": str(ordered[0]), - } - - if package in pinned_packages: - json_format["pinned"] = "true" - - if package not in patched: - patched[package] = _is_module_autoinstrumented(package) - json_format["auto-instrumented"] = patched[package] - supported_versions.append(json_format) + for contrib_module in contrib_modules: + for dependency in sorted(INTEGRATION_TO_DEPENDENCY_MAPPING.get(contrib_module, [contrib_module])): + versions = [] + if dependency not in all_used_versions: + # special case, some dependencies such as dogpile_cache can be installed + # e.g. dogpile.cache or dogpile-cache or dogpile_cache, just use the one with versions + for dep in INTEGRATION_TO_DEPENDENCY_MAPPING.get(contrib_module, [contrib_module]): + if dep in all_used_versions: + versions = all_used_versions[dep] + break + else: + versions = all_used_versions[dependency] + ordered = sorted([Version(v) for v in versions], reverse=True) + if not ordered: + continue + json_format = { + "dependency": dependency or contrib_module, + "integration": contrib_module, + "minimum_tracer_supported": str(ordered[-1]), + "max_tracer_supported": str(ordered[0]), + } + + if contrib_module in pinned_packages: + json_format["pinned"] = "true" + + if contrib_module not in patched: + patched[contrib_module] = _is_module_autoinstrumented(contrib_module) + json_format["auto-instrumented"] = patched[contrib_module] + supported_versions.append(json_format) supported_versions_output = sorted(supported_versions, key=itemgetter("integration")) with open("supported_versions_output.json", "w") as file: json.dump(supported_versions_output, file, indent=4) + def main(): args = parse_args() - all_required_modules = _get_integrated_modules() - all_required_packages = _get_updatable_packages_implementing(all_required_modules) # MODULE names - envs = _get_riot_envs_including_any(all_required_modules) - contrib_packages = _get_all_modules(all_required_modules) + contribs = _get_contrib_modules() + all_updatable_contribs = _get_updatable_packages_implementing(contribs) # MODULE names + riot_hash_to_venv_name = _get_riot_hash_to_venv_name() + envs = _get_riot_envs_including_any(contribs) if args.mode == "output": - bounds = _get_version_bounds(contrib_packages) - output_outdated_packages(all_required_packages, envs, bounds) + bounds = _get_version_bounds(contribs) + output_outdated_packages(all_updatable_contribs, envs, bounds, riot_hash_to_venv_name) elif args.mode == "generate": - all_used_versions = _get_all_used_versions(envs, contrib_packages) - generate_supported_versions(contrib_packages, all_used_versions) + all_used_versions = _get_all_used_versions(envs, contribs, riot_hash_to_venv_name) + generate_supported_versions(contribs, all_used_versions) if __name__ == "__main__": diff --git a/scripts/generate_table.py b/scripts/generate_table.py index 1d7569b3e63..2eadb074060 100644 --- a/scripts/generate_table.py +++ b/scripts/generate_table.py @@ -7,11 +7,12 @@ with open("supported_versions_output.json", "r") as json_file: data = json.load(json_file) -columns = ["integration", "minimum_tracer_supported", "max_tracer_supported", "auto-instrumented"] +columns = ["dependency", "integration", "minimum_tracer_supported", "max_tracer_supported", "auto-instrumented"] csv_rows = [] for entry in data: integration_name = entry.get("integration", "") + dependency_name = entry.get("dependency", "") if entry.get("pinned", "").lower() == "true": integration_name += " *" entry["integration"] = integration_name diff --git a/scripts/integration_registry/_format_integration_registry.py b/scripts/integration_registry/_format_integration_registry.py new file mode 100644 index 00000000000..ef6781a45c0 --- /dev/null +++ b/scripts/integration_registry/_format_integration_registry.py @@ -0,0 +1,77 @@ +""" +Script to format the integration registry YAML file to have blank lines between top-level integration list items. +""" + +import pathlib +import sys +from typing import List +from typing import Optional + + +SCRIPT_DIR = pathlib.Path(__file__).parent.parent.resolve() +ROOT_DIR = SCRIPT_DIR.parent +REGISTRY_YAML_PATH = ROOT_DIR / "ddtrace" / "contrib" / "integration_registry" / "registry.yaml" + + +# This is the key that marks the start of a top-level integration list item +INTEGRATION_START_KEY = "- integration_name:" + + +def _read_file_lines(filepath: pathlib.Path) -> Optional[List[str]]: + """Reads all lines from the file, handling potential errors.""" + try: + with open(filepath, "r", encoding="utf-8") as infile: + return infile.readlines() + except IOError as e: + print(f" Error reading {filepath.relative_to(ROOT_DIR)}: {e}", file=sys.stderr) + return None + + +def _process_lines_for_formatting(input_lines: List[str]) -> List[str]: + """Adds blank lines between top-level integration list items.""" + output_lines = [] + found_first_integration = False + for line in input_lines: + stripped_line = line.lstrip() + is_integration_start = stripped_line.startswith(INTEGRATION_START_KEY) + + if is_integration_start: + if found_first_integration: + if output_lines and output_lines[-1].strip() != "": + output_lines.append("\n") + else: + found_first_integration = True + + output_lines.append(line) + return output_lines + + +def _write_file_lines(filepath: pathlib.Path, output_lines: List[str]) -> bool: + """Writes lines back to a file, handling potential errors.""" + try: + with open(filepath, "w", encoding="utf-8") as outfile: + outfile.writelines(output_lines) + return True + except IOError as e: + print(f" Error writing formatted file {filepath.relative_to(ROOT_DIR)}: {e}", file=sys.stderr) + return False + + +def main() -> int: + """Main execution function.""" + print(f"Formatting YAML file: {REGISTRY_YAML_PATH.relative_to(ROOT_DIR)}") + + input_lines = _read_file_lines(REGISTRY_YAML_PATH) + if input_lines is None: + return 1 + + output_lines = _process_lines_for_formatting(input_lines) + + if _write_file_lines(REGISTRY_YAML_PATH, output_lines): + print(f"Successfully applied formatting to {REGISTRY_YAML_PATH.name}") + return 0 + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/integration_registry/_update_integration_registry_versions.py b/scripts/integration_registry/_update_integration_registry_versions.py new file mode 100644 index 00000000000..bbebc2b4a1d --- /dev/null +++ b/scripts/integration_registry/_update_integration_registry_versions.py @@ -0,0 +1,125 @@ +""" +Updates the supported version fields in ddtrace/contrib/integration_registry/registry.yaml based on +supported_versions_table.csv. +Preserves all other existing fields in registry.yaml. +""" + +from collections import defaultdict +import csv +import os +import pathlib +import sys +from typing import Dict +from typing import Optional + +from packaging.version import InvalidVersion +from packaging.version import parse as parse_version + + +# Add the project root to the Python path +project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from tests.contrib.integration_registry.registry_update_helpers.integration_registry_updater import ( # noqa: E402 + IntegrationRegistryUpdater, # noqa: E402 +) + + +SCRIPT_DIR = pathlib.Path(__file__).parent.parent.resolve() +PROJECT_ROOT = SCRIPT_DIR.parent.resolve() +REGISTRY_YAML_PATH = PROJECT_ROOT / "ddtrace" / "contrib" / "integration_registry" / "registry.yaml" +SUPPORTED_VERSIONS_CSV_PATH = PROJECT_ROOT / "supported_versions_table.csv" + + +def _normalize_version_string(v_str: str) -> str: + """Ensures version string has MAJOR.MINOR.PATCH, adding .0 if needed.""" + try: + if not v_str or not v_str[0].isdigit(): + return v_str + v = parse_version(v_str) + if v.micro is None: + if v.minor is None: + return f"{v.major}.0.0" + return f"{v.major}.{v.minor}.0" + parts = v_str.split(".") + if len(parts) < 3: + if len(parts) == 1: + return f"{v.major}.0.0" + if len(parts) == 2: + return f"{v.major}.{v.minor}.0" + return v_str + except InvalidVersion: + return v_str + + +def _read_supported_versions(filepath: pathlib.Path) -> Optional[Dict[str, Dict[str, Dict[str, str]]]]: + """ + Reads the supported versions CSV (potentially multiple rows per integration), + returning {integration: {dependency: {'min': str, 'max': str}}} or None on error. + """ + supported_data: Dict[str, Dict[str, Dict[str, str]]] = defaultdict(dict) + + print(f"Reading NEW dependency-specific supported versions from: {filepath.relative_to(PROJECT_ROOT)}") + try: + with open(filepath, "r", newline="", encoding="utf-8") as csvfile: + header = next(csv.reader(csvfile)) + csvfile.seek(0) + reader = csv.DictReader(csvfile) + col_integration = next((h for h in header if "integration" in h.lower()), None) + col_dependency = next( + (h for h in header if "dependency" in h.lower() and h.lower() != col_integration.lower()), None + ) + col_min = next((h for h in header if "minimum" in h.lower()), None) + col_max = next((h for h in header if "max" in h.lower()), None) + + for row_num, row in enumerate(reader, 2): + integration_name_raw = row.get(col_integration, "").strip() + dependency_name_raw = row.get(col_dependency, "").strip() + min_version = row.get(col_min, "").strip() + max_version = row.get(col_max, "").strip() + integration_name = integration_name_raw.split("*")[0].strip().lower() + dependency_name = dependency_name_raw + + normalized_min = _normalize_version_string(min_version) if min_version else "N/A" + normalized_max = _normalize_version_string(max_version) if max_version else "N/A" + + supported_data[integration_name][dependency_name] = {"min": normalized_min, "max": normalized_max} + + except Exception as e: + print(f"Error reading supported versions file {filepath.relative_to(PROJECT_ROOT)}: {e}", file=sys.stderr) + return None + + print(f"Loaded supported version info for {len(supported_data)} integrations from {filepath.name}.") + return dict(supported_data) + + +def main() -> int: + """Reads existing registry, updates versions from CSV, adds entries, writes back, formats.""" + print("\n") + new_supported_versions = _read_supported_versions(SUPPORTED_VERSIONS_CSV_PATH) + print("-" * 120) + + print(f"Loading existing registry data from: {REGISTRY_YAML_PATH.relative_to(PROJECT_ROOT)}") + + updater = IntegrationRegistryUpdater() + updater.load_registry_data() + + print(f"Loaded {len(updater.integrations)} existing integration entries.") + + # update the integrations with the new supported versions + added_count, updated_count = updater.merge_data(new_supported_versions) + + print(f"\nUpdate summary: {updated_count} integration(s) had version maps updated/added.") + print(f" {added_count} new integration(s) added.") + + if not updater.write_registry_data(): + return 1 + + print("\n--- Version Update Workflow Completed Successfully ---") + print("\n") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/integration_registry/update_and_format_registry.py b/scripts/integration_registry/update_and_format_registry.py new file mode 100644 index 00000000000..cedee92d358 --- /dev/null +++ b/scripts/integration_registry/update_and_format_registry.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +""" +Runs the sequence of scripts required to update supported versions +and the integration registry. + +1. Regenerates the supported versions JSON data (freshvenvs.py). +2. Generates the supported versions CSV table (generate_table.py). +3. Updates the integration registry YAML with the new versions (update_integration_registry_versions.py). +""" + +import pathlib +import subprocess +import sys +from typing import List + + +SCRIPT_DIR = pathlib.Path(__file__).parent.parent.resolve() +PROJECT_ROOT = SCRIPT_DIR.parent.resolve() +PATH_FRESHVENVS_SCRIPT = PROJECT_ROOT / "scripts" / "freshvenvs.py" +PATH_GENERATE_TABLE_SCRIPT = PROJECT_ROOT / "scripts" / "generate_table.py" +PATH_UPDATE_REGISTRY_SCRIPT = ( + PROJECT_ROOT / "scripts" / "integration_registry" / "_update_integration_registry_versions.py" +) +PATH_FORMAT_REGISTRY_SCRIPT = PROJECT_ROOT / "scripts" / "integration_registry" / "_format_integration_registry.py" + + +def _run_script(script_path: pathlib.Path, *args: str) -> bool: + """Executes a given Python script using the current interpreter and handles output/errors.""" + command: List[str] = [sys.executable, str(script_path)] + list(args) + script_name: str = script_path.name + print(f" -> Running {script_path.relative_to(PROJECT_ROOT)} {' '.join(args)}...") + + try: + result = subprocess.run(command, check=True, capture_output=True, text=True, cwd=PROJECT_ROOT, timeout=60) + if result.stdout and result.stdout.strip(): + indented_stdout = "\n".join([f" {line}" for line in result.stdout.strip().splitlines()]) + print(indented_stdout) + + if result.stderr and result.stderr.strip(): + print(f"--- {script_name} Stderr ---", file=sys.stderr) + print(result.stderr.strip(), file=sys.stderr) + + return True + except subprocess.TimeoutExpired: + print(f"Error: {script_path.relative_to(PROJECT_ROOT)} timed out after 60 seconds.", file=sys.stderr) + except subprocess.CalledProcessError as e: + print(f"Error: {script_path.relative_to(PROJECT_ROOT)} failed with exit code {e.returncode}", file=sys.stderr) + if e.stdout and e.stdout.strip(): + print("--- Stdout ---", e.stdout.strip(), file=sys.stderr) + if e.stderr and e.stderr.strip(): + print("--- Stderr ---", e.stderr.strip(), file=sys.stderr) + except Exception as e: + print(f"Error running {script_path.relative_to(PROJECT_ROOT)}: {e}", file=sys.stderr) + + print(f" -> {script_path.relative_to(PROJECT_ROOT)} FAILED.") + return False + + +def main() -> int: + """Runs the version update workflow sequentially.""" + print(f"\nStarting Version Update Workflow (from: {PROJECT_ROOT.name})") + print("=" * 60) + + # Step 1: Regenerate intermediate version data + if not _run_script(PATH_FRESHVENVS_SCRIPT, "generate"): + print(f"\nWorkflow aborted: {PATH_FRESHVENVS_SCRIPT.relative_to(PROJECT_ROOT)} failed.") + print("=" * 60) + return 1 + + # Step 2: Generate the supported versions table CSV + if not _run_script(PATH_GENERATE_TABLE_SCRIPT): + print(f"\nWorkflow aborted: {PATH_GENERATE_TABLE_SCRIPT.relative_to(PROJECT_ROOT)} failed.") + print("=" * 60) + return 1 + + # Step 3: Update the registry YAML using the generated table of tested dependency versions + if not _run_script(PATH_UPDATE_REGISTRY_SCRIPT): + print(f"\nWorkflow aborted: {PATH_UPDATE_REGISTRY_SCRIPT.relative_to(PROJECT_ROOT)} failed.") + print("=" * 60) + return 1 + + # Step 4: Format the registry YAML + if not _run_script(PATH_FORMAT_REGISTRY_SCRIPT): + print(f"\nWorkflow aborted: {PATH_FORMAT_REGISTRY_SCRIPT.relative_to(PROJECT_ROOT)} failed.") + print("=" * 60) + return 1 + + print("=" * 60) + print("--- Version Update Workflow Completed Successfully ---") + print("=" * 60) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/run-test-suite b/scripts/run-test-suite index 8664decde25..5a57199a352 100755 --- a/scripts/run-test-suite +++ b/scripts/run-test-suite @@ -76,3 +76,8 @@ echo "All tests passed. Saved $CIRCLE_SHA1 as the latest successful commit for j ".riot/requirements/" \ "Changes detected after running riot. Consider deleting changed files, \ running scripts/compile-and-prune-test-requirements and committing the result." + +./scripts/check-diff \ + "ddtrace/contrib/integration_registry/registry.yaml" \ + "Registry YAML file (ddtrace/contrib/integration_registry/registry.yaml) was modified. Please run: \ + \`python scripts/integration_registry/update_and_format_registry.py\` and commit the changes." diff --git a/supported_versions_output.json b/supported_versions_output.json index ae5b33c5f61..c571a458c06 100644 --- a/supported_versions_output.json +++ b/supported_versions_output.json @@ -1,30 +1,41 @@ [ { + "dependency": "aiobotocore", "integration": "aiobotocore", "minimum_tracer_supported": "1.4.2", "max_tracer_supported": "2.16.0", "auto-instrumented": false }, { + "dependency": "aiohttp", "integration": "aiohttp", - "minimum_tracer_supported": "3.9.1", - "max_tracer_supported": "3.11.13", + "minimum_tracer_supported": "3.10.5", + "max_tracer_supported": "3.10.9", "auto-instrumented": true }, { + "dependency": "aiohttp-jinja2", + "integration": "aiohttp_jinja2", + "minimum_tracer_supported": "1.5.1", + "max_tracer_supported": "1.6", + "auto-instrumented": true + }, + { + "dependency": "aiohttp_jinja2", "integration": "aiohttp_jinja2", "minimum_tracer_supported": "1.5.1", "max_tracer_supported": "1.6", - "pinned": "true", "auto-instrumented": true }, { + "dependency": "aiomysql", "integration": "aiomysql", "minimum_tracer_supported": "0.1.1", "max_tracer_supported": "0.2.0", "auto-instrumented": true }, { + "dependency": "aiopg", "integration": "aiopg", "minimum_tracer_supported": "1.4.0", "max_tracer_supported": "1.4.0", @@ -32,6 +43,7 @@ "auto-instrumented": true }, { + "dependency": "algoliasearch", "integration": "algoliasearch", "minimum_tracer_supported": "2.6.3", "max_tracer_supported": "2.6.3", @@ -39,43 +51,57 @@ "auto-instrumented": true }, { + "dependency": "anthropic", "integration": "anthropic", - "minimum_tracer_supported": "0.26.0", + "minimum_tracer_supported": "0.49.0", "max_tracer_supported": "0.49.0", "auto-instrumented": true }, { + "dependency": "aredis", "integration": "aredis", "minimum_tracer_supported": "1.1.8", "max_tracer_supported": "1.1.8", "auto-instrumented": true }, { + "dependency": "pytest-asyncio", "integration": "asyncio", "minimum_tracer_supported": "0.21.1", - "max_tracer_supported": "0.26.0", + "max_tracer_supported": "0.21.1", "pinned": "true", "auto-instrumented": true }, { + "dependency": "asyncpg", "integration": "asyncpg", "minimum_tracer_supported": "0.23.0", "max_tracer_supported": "0.30.0", "auto-instrumented": true }, { + "dependency": "avro", "integration": "avro", "minimum_tracer_supported": "1.12.0", "max_tracer_supported": "1.12.0", "auto-instrumented": true }, { + "dependency": "datadog-lambda", + "integration": "aws_lambda", + "minimum_tracer_supported": "6.105.0", + "max_tracer_supported": "6.105.0", + "auto-instrumented": true + }, + { + "dependency": "datadog_lambda", "integration": "aws_lambda", "minimum_tracer_supported": "6.105.0", "max_tracer_supported": "6.105.0", "auto-instrumented": true }, { + "dependency": "azure-functions", "integration": "azure_functions", "minimum_tracer_supported": "1.21.3", "max_tracer_supported": "1.21.3", @@ -83,256 +109,397 @@ "auto-instrumented": true }, { - "integration": "boto", - "minimum_tracer_supported": "2.49.0", - "max_tracer_supported": "2.49.0", + "dependency": "boto3", + "integration": "botocore", + "minimum_tracer_supported": "1.34.49", + "max_tracer_supported": "1.37.5", + "pinned": "true", "auto-instrumented": true }, { + "dependency": "botocore", "integration": "botocore", - "minimum_tracer_supported": "1.20.106", + "minimum_tracer_supported": "1.34.49", "max_tracer_supported": "1.37.5", "pinned": "true", "auto-instrumented": true }, { + "dependency": "bottle", "integration": "bottle", "minimum_tracer_supported": "0.12.25", "max_tracer_supported": "0.13.2", "auto-instrumented": true }, { + "dependency": "cassandra-driver", "integration": "cassandra", "minimum_tracer_supported": "3.24.0", - "max_tracer_supported": "3.29.2", + "max_tracer_supported": "3.28.0", "auto-instrumented": true }, { + "dependency": "celery", "integration": "celery", "minimum_tracer_supported": "5.3.6", "max_tracer_supported": "5.4.0", "auto-instrumented": true }, { + "dependency": "cherrypy", "integration": "cherrypy", "minimum_tracer_supported": "17.4.2", "max_tracer_supported": "18.10.0", "auto-instrumented": false }, { + "dependency": "python-consul", "integration": "consul", "minimum_tracer_supported": "1.1.0", "max_tracer_supported": "1.1.0", "auto-instrumented": true }, { - "integration": "coverage", - "minimum_tracer_supported": "7.4.4", - "max_tracer_supported": "7.4.4", - "auto-instrumented": false + "dependency": "crewai", + "integration": "crewai", + "minimum_tracer_supported": "0.108.0", + "max_tracer_supported": "0.108.0", + "auto-instrumented": true }, { + "dependency": "django", "integration": "django", "minimum_tracer_supported": "2.2.1", - "max_tracer_supported": "5.1.4", - "pinned": "true", + "max_tracer_supported": "5.2", "auto-instrumented": true }, { + "dependency": "dogpile-cache", + "integration": "dogpile_cache", + "minimum_tracer_supported": "0.9.2", + "max_tracer_supported": "1.3.3", + "auto-instrumented": true + }, + { + "dependency": "dogpile.cache", + "integration": "dogpile_cache", + "minimum_tracer_supported": "0.9.2", + "max_tracer_supported": "1.3.3", + "auto-instrumented": true + }, + { + "dependency": "dogpile_cache", "integration": "dogpile_cache", "minimum_tracer_supported": "0.9.2", "max_tracer_supported": "1.3.3", - "pinned": "true", "auto-instrumented": true }, { + "dependency": "dramatiq", "integration": "dramatiq", "minimum_tracer_supported": "1.17.0", "max_tracer_supported": "1.17.0", "auto-instrumented": true }, { + "dependency": "elastic-transport", + "integration": "elasticsearch", + "minimum_tracer_supported": "8.11.0", + "max_tracer_supported": "8.17.1", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch", + "integration": "elasticsearch", + "minimum_tracer_supported": "7.13.4", + "max_tracer_supported": "9.0.0", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch1", + "integration": "elasticsearch", + "minimum_tracer_supported": "1.10.0", + "max_tracer_supported": "1.10.0", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch2", + "integration": "elasticsearch", + "minimum_tracer_supported": "2.5.1", + "max_tracer_supported": "2.5.1", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch5", + "integration": "elasticsearch", + "minimum_tracer_supported": "5.5.6", + "max_tracer_supported": "5.5.6", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch6", + "integration": "elasticsearch", + "minimum_tracer_supported": "6.8.2", + "max_tracer_supported": "6.8.2", + "auto-instrumented": true + }, + { + "dependency": "elasticsearch7", "integration": "elasticsearch", "minimum_tracer_supported": "7.13.4", - "max_tracer_supported": "8.17.0", + "max_tracer_supported": "7.17.12", + "auto-instrumented": true + }, + { + "dependency": "opensearch-py", + "integration": "elasticsearch", + "minimum_tracer_supported": "1.1.0", + "max_tracer_supported": "2.8.0", "auto-instrumented": true }, { + "dependency": "falcon", "integration": "falcon", "minimum_tracer_supported": "3.0.1", "max_tracer_supported": "4.0.2", "auto-instrumented": true }, { + "dependency": "fastapi", "integration": "fastapi", "minimum_tracer_supported": "0.64.0", - "max_tracer_supported": "0.115.8", + "max_tracer_supported": "0.115.12", "auto-instrumented": true }, { + "dependency": "flask", "integration": "flask", - "minimum_tracer_supported": "0.12.5", + "minimum_tracer_supported": "1.1.4", "max_tracer_supported": "3.1.0", "auto-instrumented": true }, { + "dependency": "flask-cache", + "integration": "flask_cache", + "minimum_tracer_supported": "0.13.1", + "max_tracer_supported": "0.13.1", + "auto-instrumented": false + }, + { + "dependency": "flask-caching", "integration": "flask_cache", "minimum_tracer_supported": "1.10.1", "max_tracer_supported": "2.3.0", "auto-instrumented": false }, { + "dependency": "gevent", "integration": "gevent", "minimum_tracer_supported": "20.12.1", "max_tracer_supported": "24.11.1", "auto-instrumented": true }, { + "dependency": "google-generativeai", "integration": "google_generativeai", "minimum_tracer_supported": "0.8.3", "max_tracer_supported": "0.8.3", "auto-instrumented": true }, { + "dependency": "graphql-core", "integration": "graphql", "minimum_tracer_supported": "3.1.7", "max_tracer_supported": "3.2.6", "auto-instrumented": true }, { + "dependency": "grpcio", "integration": "grpc", "minimum_tracer_supported": "1.34.1", "max_tracer_supported": "1.68.1", "auto-instrumented": true }, { + "dependency": "httpx", "integration": "httpx", - "minimum_tracer_supported": "0.15.4", - "max_tracer_supported": "0.28.1", + "minimum_tracer_supported": "0.17.1", + "max_tracer_supported": "0.27.2", "auto-instrumented": true }, { + "dependency": "jinja2", "integration": "jinja2", "minimum_tracer_supported": "2.10.3", - "max_tracer_supported": "3.1.5", + "max_tracer_supported": "3.1.4", "auto-instrumented": true }, { + "dependency": "confluent-kafka", "integration": "kafka", "minimum_tracer_supported": "1.9.2", "max_tracer_supported": "2.6.2", "auto-instrumented": true }, { + "dependency": "kombu", "integration": "kombu", - "minimum_tracer_supported": "4.2.2.post1", + "minimum_tracer_supported": "4.6.11", "max_tracer_supported": "5.4.2", "auto-instrumented": false }, { + "dependency": "langchain", "integration": "langchain", "minimum_tracer_supported": "0.1.20", "max_tracer_supported": "0.3.18", "auto-instrumented": true }, { + "dependency": "langgraph", "integration": "langgraph", "minimum_tracer_supported": "0.2.60", "max_tracer_supported": "0.2.61", "pinned": "true", - "auto-instrumented": false + "auto-instrumented": true + }, + { + "dependency": "langgraph-checkpoint", + "integration": "langgraph", + "minimum_tracer_supported": "2.0.9", + "max_tracer_supported": "2.0.9", + "pinned": "true", + "auto-instrumented": true + }, + { + "dependency": "litellm", + "integration": "litellm", + "minimum_tracer_supported": "1.65.4", + "max_tracer_supported": "1.65.4", + "pinned": "true", + "auto-instrumented": true }, { + "dependency": "logbook", "integration": "logbook", "minimum_tracer_supported": "1.0.0", "max_tracer_supported": "1.8.1", "auto-instrumented": false }, { + "dependency": "loguru", "integration": "loguru", "minimum_tracer_supported": "0.4.1", "max_tracer_supported": "0.7.2", "auto-instrumented": false }, { + "dependency": "mako", "integration": "mako", "minimum_tracer_supported": "1.1.6", "max_tracer_supported": "1.3.8", "auto-instrumented": true }, { + "dependency": "mariadb", "integration": "mariadb", "minimum_tracer_supported": "1.0.11", "max_tracer_supported": "1.1.11", "auto-instrumented": true }, { + "dependency": "molten", "integration": "molten", "minimum_tracer_supported": "1.0.2", "max_tracer_supported": "1.0.2", "auto-instrumented": true }, { + "dependency": "mongoengine", "integration": "mongoengine", "minimum_tracer_supported": "0.29.1", "max_tracer_supported": "0.29.1", "auto-instrumented": true }, { + "dependency": "mysql-connector-python", "integration": "mysql", "minimum_tracer_supported": "8.0.5", - "max_tracer_supported": "9.1.0", + "max_tracer_supported": "9.0.0", "auto-instrumented": true }, { + "dependency": "mysqlclient", "integration": "mysqldb", "minimum_tracer_supported": "2.2.1", "max_tracer_supported": "2.2.6", "auto-instrumented": true }, { + "dependency": "openai", "integration": "openai", - "minimum_tracer_supported": "1.30.3", - "max_tracer_supported": "1.65.3", + "minimum_tracer_supported": "1.0.0", + "max_tracer_supported": "1.60.0", + "auto-instrumented": true + }, + { + "dependency": "openai-agents", + "integration": "openai_agents", + "minimum_tracer_supported": "0.0.8", + "max_tracer_supported": "0.0.8", "auto-instrumented": true }, { + "dependency": "protobuf", "integration": "protobuf", - "minimum_tracer_supported": "3.19.0", - "max_tracer_supported": "6.30.2", + "minimum_tracer_supported": "5.29.3", + "max_tracer_supported": "6.30.1", "auto-instrumented": false }, { + "dependency": "psycopg", "integration": "psycopg", "minimum_tracer_supported": "3.2.1", - "max_tracer_supported": "3.2.3", + "max_tracer_supported": "3.2.1", + "auto-instrumented": true + }, + { + "dependency": "psycopg2-binary", + "integration": "psycopg", + "minimum_tracer_supported": "2.8.6", + "max_tracer_supported": "2.9.10", "auto-instrumented": true }, { + "dependency": "pylibmc", "integration": "pylibmc", "minimum_tracer_supported": "1.6.3", "max_tracer_supported": "1.6.3", "auto-instrumented": true }, { + "dependency": "pymemcache", "integration": "pymemcache", "minimum_tracer_supported": "3.4.4", "max_tracer_supported": "4.0.0", "auto-instrumented": true }, { + "dependency": "pymongo", "integration": "pymongo", "minimum_tracer_supported": "3.8.0", "max_tracer_supported": "4.10.1", "auto-instrumented": true }, { + "dependency": "pymysql", "integration": "pymysql", "minimum_tracer_supported": "0.10.1", "max_tracer_supported": "1.1.1", "auto-instrumented": true }, { + "dependency": "pynamodb", "integration": "pynamodb", "minimum_tracer_supported": "5.5.1", "max_tracer_supported": "5.5.1", @@ -340,115 +507,142 @@ "auto-instrumented": true }, { + "dependency": "pyodbc", "integration": "pyodbc", "minimum_tracer_supported": "4.0.39", "max_tracer_supported": "5.2.0", "auto-instrumented": true }, { + "dependency": "pyramid", "integration": "pyramid", "minimum_tracer_supported": "1.10.8", "max_tracer_supported": "2.0.2", "auto-instrumented": true }, { + "dependency": "pytest", "integration": "pytest", - "minimum_tracer_supported": "4.6.11", - "max_tracer_supported": "8.3.5", + "minimum_tracer_supported": "6.2.5", + "max_tracer_supported": "8.1.1", "auto-instrumented": false }, { + "dependency": "pytest-bdd", "integration": "pytest_bdd", "minimum_tracer_supported": "4.1.0", "max_tracer_supported": "6.0.1", + "pinned": "true", "auto-instrumented": false }, { + "dependency": "redis", "integration": "redis", - "minimum_tracer_supported": "2.10.6", - "max_tracer_supported": "5.2.1", + "minimum_tracer_supported": "4.6.0", + "max_tracer_supported": "5.2.0", "auto-instrumented": true }, { + "dependency": "redis-py-cluster", "integration": "rediscluster", "minimum_tracer_supported": "2.0.0", "max_tracer_supported": "2.1.3", "auto-instrumented": true }, { + "dependency": "requests", "integration": "requests", "minimum_tracer_supported": "2.22.0", "max_tracer_supported": "2.32.3", "auto-instrumented": true }, { + "dependency": "rq", "integration": "rq", "minimum_tracer_supported": "1.8.1", "max_tracer_supported": "1.16.2", "auto-instrumented": true }, { + "dependency": "sanic", "integration": "sanic", "minimum_tracer_supported": "20.12.7", "max_tracer_supported": "24.6.0", "auto-instrumented": true }, { + "dependency": "snowflake-connector-python", "integration": "snowflake", "minimum_tracer_supported": "2.3.10", "max_tracer_supported": "3.12.2", "auto-instrumented": false }, { + "dependency": "sqlalchemy", "integration": "sqlalchemy", - "minimum_tracer_supported": "1.2.19", - "max_tracer_supported": "2.0.38", + "minimum_tracer_supported": "1.3.24", + "max_tracer_supported": "2.0.40", "auto-instrumented": false }, { + "dependency": "pysqlite3-binary", "integration": "sqlite3", "minimum_tracer_supported": "0.5.2.post3", "max_tracer_supported": "0.5.2.post3", "auto-instrumented": true }, { + "dependency": "starlette", "integration": "starlette", - "minimum_tracer_supported": "0.13.6", - "max_tracer_supported": "0.44.0", + "minimum_tracer_supported": "0.14.2", + "max_tracer_supported": "0.39.2", "auto-instrumented": true }, { + "dependency": "structlog", "integration": "structlog", "minimum_tracer_supported": "20.2.0", - "max_tracer_supported": "25.1.0", + "max_tracer_supported": "24.4.0", "auto-instrumented": false }, { + "dependency": "tornado", "integration": "tornado", - "minimum_tracer_supported": "4.5.3", + "minimum_tracer_supported": "6.2", "max_tracer_supported": "6.4.1", "pinned": "true", "auto-instrumented": false }, { + "dependency": "urllib3", "integration": "urllib3", "minimum_tracer_supported": "1.25", - "max_tracer_supported": "2.3.0", + "max_tracer_supported": "2.2.3", "auto-instrumented": false }, { + "dependency": "valkey", "integration": "valkey", "minimum_tracer_supported": "6.0.2", "max_tracer_supported": "6.0.2", "auto-instrumented": true }, { + "dependency": "google-cloud-aiplatform", + "integration": "vertexai", + "minimum_tracer_supported": "1.71.1", + "max_tracer_supported": "1.71.1", + "auto-instrumented": true + }, + { + "dependency": "vertexai", "integration": "vertexai", "minimum_tracer_supported": "1.71.1", "max_tracer_supported": "1.71.1", "auto-instrumented": true }, { + "dependency": "vertica-python", "integration": "vertica", "minimum_tracer_supported": "0.6.14", "max_tracer_supported": "0.7.4", @@ -456,6 +650,7 @@ "auto-instrumented": true }, { + "dependency": "yaaredis", "integration": "yaaredis", "minimum_tracer_supported": "2.0.4", "max_tracer_supported": "3.0.0", diff --git a/supported_versions_table.csv b/supported_versions_table.csv index 9c97b281522..b5549698628 100644 --- a/supported_versions_table.csv +++ b/supported_versions_table.csv @@ -1,76 +1,93 @@ -integration,minimum_tracer_supported,max_tracer_supported,auto-instrumented -aiobotocore,1.4.2,2.16.0,False -aiohttp,3.9.1,3.11.13,True -aiohttp_jinja2 *,1.5.1,1.6,True -aiomysql,0.1.1,0.2.0,True -aiopg *,1.4.0,1.4.0,True -algoliasearch *,2.6.3,2.6.3,True -anthropic,0.26.0,0.49.0,True -aredis,1.1.8,1.1.8,True -asyncio *,0.21.1,0.26.0,True -asyncpg,0.23.0,0.30.0,True -avro,1.12.0,1.12.0,True -aws_lambda,6.105.0,6.105.0,True -azure_functions *,1.21.3,1.21.3,True -boto,2.49.0,2.49.0,True -botocore *,1.20.106,1.37.5,True -bottle,0.12.25,0.13.2,True -cassandra,3.24.0,3.29.2,True -celery,5.3.6,5.4.0,True -cherrypy,17.4.2,18.10.0,False -consul,1.1.0,1.1.0,True -coverage,7.4.4,7.4.4,False -django *,2.2.1,5.1.4,True -dogpile_cache *,0.9.2,1.3.3,True -dramatiq,1.17.0,1.17.0,True -elasticsearch,7.13.4,8.17.0,True -falcon,3.0.1,4.0.2,True -fastapi,0.64.0,0.115.8,True -flask,0.12.5,3.1.0,True -flask_cache,1.10.1,2.3.0,False -gevent,20.12.1,24.11.1,True -google_generativeai,0.8.3,0.8.3,True -graphql,3.1.7,3.2.6,True -grpc,1.34.1,1.68.1,True -httpx,0.15.4,0.28.1,True -jinja2,2.10.3,3.1.5,True -kafka,1.9.2,2.6.2,True -kombu,4.2.2.post1,5.4.2,False -langchain,0.1.20,0.3.18,True -langgraph *,0.2.60,0.2.61,False -logbook,1.0.0,1.8.1,False -loguru,0.4.1,0.7.2,False -mako,1.1.6,1.3.8,True -mariadb,1.0.11,1.1.11,True -molten,1.0.2,1.0.2,True -mongoengine,0.29.1,0.29.1,True -mysql,8.0.5,9.1.0,True -mysqldb,2.2.1,2.2.6,True -openai,1.30.3,1.65.3,True -protobuf,3.19.0,6.30.2,False -psycopg,3.2.1,3.2.3,True -pylibmc,1.6.3,1.6.3,True -pymemcache,3.4.4,4.0.0,True -pymongo,3.8.0,4.10.1,True -pymysql,0.10.1,1.1.1,True -pynamodb *,5.5.1,5.5.1,True -pyodbc,4.0.39,5.2.0,True -pyramid,1.10.8,2.0.2,True -pytest,4.6.11,8.3.5,False -pytest_bdd,4.1.0,6.0.1,False -redis,2.10.6,5.2.1,True -rediscluster,2.0.0,2.1.3,True -requests,2.22.0,2.32.3,True -rq,1.8.1,1.16.2,True -sanic,20.12.7,24.6.0,True -snowflake,2.3.10,3.12.2,False -sqlalchemy,1.2.19,2.0.38,False -sqlite3,0.5.2.post3,0.5.2.post3,True -starlette,0.13.6,0.44.0,True -structlog,20.2.0,25.1.0,False -tornado *,4.5.3,6.4.1,False -urllib3,1.25,2.3.0,False -valkey,6.0.2,6.0.2,True -vertexai,1.71.1,1.71.1,True -vertica *,0.6.14,0.7.4,True -yaaredis,2.0.4,3.0.0,True +dependency,integration,minimum_tracer_supported,max_tracer_supported,auto-instrumented +aiobotocore,aiobotocore,1.4.2,2.16.0,False +aiohttp,aiohttp,3.10.5,3.10.9,True +aiohttp-jinja2,aiohttp_jinja2,1.5.1,1.6,True +aiohttp_jinja2,aiohttp_jinja2,1.5.1,1.6,True +aiomysql,aiomysql,0.1.1,0.2.0,True +aiopg,aiopg *,1.4.0,1.4.0,True +algoliasearch,algoliasearch *,2.6.3,2.6.3,True +anthropic,anthropic,0.49.0,0.49.0,True +aredis,aredis,1.1.8,1.1.8,True +pytest-asyncio,asyncio *,0.21.1,0.21.1,True +asyncpg,asyncpg,0.23.0,0.30.0,True +avro,avro,1.12.0,1.12.0,True +datadog-lambda,aws_lambda,6.105.0,6.105.0,True +datadog_lambda,aws_lambda,6.105.0,6.105.0,True +azure-functions,azure_functions *,1.21.3,1.21.3,True +boto3,botocore *,1.34.49,1.37.5,True +botocore,botocore *,1.34.49,1.37.5,True +bottle,bottle,0.12.25,0.13.2,True +cassandra-driver,cassandra,3.24.0,3.28.0,True +celery,celery,5.3.6,5.4.0,True +cherrypy,cherrypy,17.4.2,18.10.0,False +python-consul,consul,1.1.0,1.1.0,True +crewai,crewai,0.108.0,0.108.0,True +django,django,2.2.1,5.2,True +dogpile-cache,dogpile_cache,0.9.2,1.3.3,True +dogpile.cache,dogpile_cache,0.9.2,1.3.3,True +dogpile_cache,dogpile_cache,0.9.2,1.3.3,True +dramatiq,dramatiq,1.17.0,1.17.0,True +elastic-transport,elasticsearch,8.11.0,8.17.1,True +elasticsearch,elasticsearch,7.13.4,9.0.0,True +elasticsearch1,elasticsearch,1.10.0,1.10.0,True +elasticsearch2,elasticsearch,2.5.1,2.5.1,True +elasticsearch5,elasticsearch,5.5.6,5.5.6,True +elasticsearch6,elasticsearch,6.8.2,6.8.2,True +elasticsearch7,elasticsearch,7.13.4,7.17.12,True +opensearch-py,elasticsearch,1.1.0,2.8.0,True +falcon,falcon,3.0.1,4.0.2,True +fastapi,fastapi,0.64.0,0.115.12,True +flask,flask,1.1.4,3.1.0,True +flask-cache,flask_cache,0.13.1,0.13.1,False +flask-caching,flask_cache,1.10.1,2.3.0,False +gevent,gevent,20.12.1,24.11.1,True +google-generativeai,google_generativeai,0.8.3,0.8.3,True +graphql-core,graphql,3.1.7,3.2.6,True +grpcio,grpc,1.34.1,1.68.1,True +httpx,httpx,0.17.1,0.27.2,True +jinja2,jinja2,2.10.3,3.1.4,True +confluent-kafka,kafka,1.9.2,2.6.2,True +kombu,kombu,4.6.11,5.4.2,False +langchain,langchain,0.1.20,0.3.18,True +langgraph,langgraph *,0.2.60,0.2.61,True +langgraph-checkpoint,langgraph *,2.0.9,2.0.9,True +litellm,litellm *,1.65.4,1.65.4,True +logbook,logbook,1.0.0,1.8.1,False +loguru,loguru,0.4.1,0.7.2,False +mako,mako,1.1.6,1.3.8,True +mariadb,mariadb,1.0.11,1.1.11,True +molten,molten,1.0.2,1.0.2,True +mongoengine,mongoengine,0.29.1,0.29.1,True +mysql-connector-python,mysql,8.0.5,9.0.0,True +mysqlclient,mysqldb,2.2.1,2.2.6,True +openai,openai,1.0.0,1.60.0,True +openai-agents,openai_agents,0.0.8,0.0.8,True +protobuf,protobuf,5.29.3,6.30.1,False +psycopg,psycopg,3.2.1,3.2.1,True +psycopg2-binary,psycopg,2.8.6,2.9.10,True +pylibmc,pylibmc,1.6.3,1.6.3,True +pymemcache,pymemcache,3.4.4,4.0.0,True +pymongo,pymongo,3.8.0,4.10.1,True +pymysql,pymysql,0.10.1,1.1.1,True +pynamodb,pynamodb *,5.5.1,5.5.1,True +pyodbc,pyodbc,4.0.39,5.2.0,True +pyramid,pyramid,1.10.8,2.0.2,True +pytest,pytest,6.2.5,8.1.1,False +pytest-bdd,pytest_bdd *,4.1.0,6.0.1,False +redis,redis,4.6.0,5.2.0,True +redis-py-cluster,rediscluster,2.0.0,2.1.3,True +requests,requests,2.22.0,2.32.3,True +rq,rq,1.8.1,1.16.2,True +sanic,sanic,20.12.7,24.6.0,True +snowflake-connector-python,snowflake,2.3.10,3.12.2,False +sqlalchemy,sqlalchemy,1.3.24,2.0.40,False +pysqlite3-binary,sqlite3,0.5.2.post3,0.5.2.post3,True +starlette,starlette,0.14.2,0.39.2,True +structlog,structlog,20.2.0,24.4.0,False +tornado,tornado *,6.2,6.4.1,False +urllib3,urllib3,1.25,2.2.3,False +valkey,valkey,6.0.2,6.0.2,True +google-cloud-aiplatform,vertexai,1.71.1,1.71.1,True +vertexai,vertexai,1.71.1,1.71.1,True +vertica-python,vertica *,0.6.14,0.7.4,True +yaaredis,yaaredis,2.0.4,3.0.0,True diff --git a/tests/contrib/celery/test_integration.py b/tests/contrib/celery/test_integration.py index 7917fd15f03..16cdfba85dc 100644 --- a/tests/contrib/celery/test_integration.py +++ b/tests/contrib/celery/test_integration.py @@ -648,6 +648,9 @@ def fn_task_parameters(user, force_logout=False): assert len(traces) == 2 assert len(traces[0]) + len(traces[1]) == 3 + @pytest.mark.no_getattr_patch + # this mark is added to prevent patching of getattr necessary for integration registry update + # see: https://github.com/DataDog/dd-trace-py/pull/13215 def test_beat_scheduler_tracing(self): @self.app.task def fn_task(): diff --git a/tests/contrib/conftest.py b/tests/contrib/conftest.py new file mode 100644 index 00000000000..f603f49c66e --- /dev/null +++ b/tests/contrib/conftest.py @@ -0,0 +1,56 @@ +import os +import sys + +import pytest + +from tests.contrib.integration_registry.registry_update_helpers.integration_registry_manager import registry_manager +from tests.contrib.integration_registry.registry_update_helpers.integration_update_orchestrator import ( + IntegrationUpdateOrchestrator, +) + + +@pytest.fixture(scope="function", autouse=True) +def manage_registry_patching(request): + """Conditionally patches getattr before each test and cleans up patch afterwards.""" + should_patch = not request.node.get_closest_marker("no_getattr_patch") + if should_patch: + registry_manager.patch_getattr() + + yield # allows test function to run + + # Always restore getattr and clear per-test state + registry_manager.cleanup_patch() + + +@pytest.fixture(scope="session", autouse=True) +def export_registry_data_at_end(request): + """Processes and exports accumulated registry data at the end of the session.""" + yield # allows test session to run + + # Process any modules that were patched and save the data for export + registry_manager.process_patched_objects() + if len(registry_manager.pending_updates) > 0: + IntegrationUpdateOrchestrator.export_registry_data(registry_manager.pending_updates, request) + # Always cleanup after session + registry_manager.cleanup_post_session() + + +def pytest_sessionfinish(session): + """Triggers the external registry update process and cleans up session data.""" + # integration registry data was stored in session.config._registry_session_data_file + data_file_path = getattr(session.config, "_registry_session_data_file", None) + + if not data_file_path or not os.path.exists(data_file_path): + IntegrationUpdateOrchestrator.cleanup_session_data(session) + return + + project_root = str(session.config.rootdir) + + try: + # run the integration registry update process + orchestrator = IntegrationUpdateOrchestrator(project_root) + orchestrator.run(data_file_path) + except Exception as e: + print(f"\nCritical error during registry update orchestration: {e}", file=sys.stderr) + finally: + IntegrationUpdateOrchestrator.cleanup_session_data(session) diff --git a/tests/contrib/integration_registry/__init__.py b/tests/contrib/integration_registry/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/contrib/integration_registry/conftest.py b/tests/contrib/integration_registry/conftest.py new file mode 100644 index 00000000000..3e8b5e0333e --- /dev/null +++ b/tests/contrib/integration_registry/conftest.py @@ -0,0 +1,173 @@ +import json +from pathlib import Path +from typing import Any +from typing import List +from typing import Set + +import pytest +import yaml + +import riotfile + + +@pytest.fixture(scope="module") +def project_root() -> Path: + return Path(__file__).parent.parent.parent.parent + + +@pytest.fixture(scope="module") +def contrib_dir(project_root: Path) -> Path: + return project_root / "ddtrace" / "contrib" + + +@pytest.fixture(scope="module") +def internal_contrib_dir(contrib_dir: Path) -> Path: + return contrib_dir / "internal" + + +@pytest.fixture(scope="module") +def registry_yaml_path(contrib_dir: Path) -> Path: + """Returns the path to the registry.yaml file.""" + return contrib_dir / "integration_registry" / "registry.yaml" + + +@pytest.fixture(scope="module") +def registry_schema_path(contrib_dir: Path) -> Path: + """Returns the path to the registry.schema.json file.""" + return contrib_dir / "integration_registry" / "_registry_schema.json" + + +@pytest.fixture(scope="module") +def registry_content(registry_yaml_path: Path) -> dict: + """Loads the entire content of registry.yaml as a dictionary.""" + if not registry_yaml_path.is_file(): + pytest.fail(f"Registry YAML file not found: {registry_yaml_path}") + try: + with open(registry_yaml_path, "r", encoding="utf-8") as f: + data = yaml.safe_load(f) + if not isinstance(data, dict): + pytest.fail(f"Invalid structure in {registry_yaml_path}: Expected root object.") + return data + except yaml.YAMLError as e: + pytest.fail(f"Error parsing YAML file {registry_yaml_path}: {e}") + except Exception as e: + pytest.fail(f"Error reading file {registry_yaml_path}: {e}") + return {} + + +@pytest.fixture(scope="module") +def registry_data(registry_content: dict, registry_yaml_path: Path) -> list[dict]: + """Extracts the list of integrations from the loaded YAML content.""" + integrations = registry_content.get("integrations") + if not isinstance(integrations, list): + pytest.fail(f"Invalid structure in {registry_yaml_path}: Expected 'integrations' key with a list value.") + if not all(isinstance(item, dict) for item in integrations): + pytest.fail(f"Invalid structure in {registry_yaml_path}: 'integrations' list should contain objects.") + return integrations + + +@pytest.fixture(scope="module") +def registry_schema(registry_schema_path: Path) -> dict: + """Loads the JSON schema definition.""" + if not registry_schema_path.is_file(): + pytest.fail(f"Schema JSON file not found: {registry_schema_path}") + try: + with open(registry_schema_path, "r", encoding="utf-8") as f: + schema = json.load(f) + return schema + except json.JSONDecodeError as e: + pytest.fail(f"Error parsing JSON schema file {registry_schema_path}: {e}") + except Exception as e: + pytest.fail(f"Error reading schema file {registry_schema_path}: {e}") + return {} + + +@pytest.fixture(scope="module") +def all_integration_names(registry_data: list[dict]) -> set[str]: + """Extracts all unique integration names from the registry data.""" + names = set() + for entry in registry_data: + name = entry.get("integration_name") + if name and isinstance(name, str): + names.add(name) + else: + pytest.fail(f"Found entry in registry without a valid string 'integration_name': {entry}") + if not names: + pytest.fail("No integration names found in loaded registry data.") + return names + + +@pytest.fixture(scope="module") +def external_integration_names(registry_data: list[dict]) -> set[str]: + """Extracts names of integrations marked as 'is_external_package: true'.""" + # This fixture depends on registry_data (from conftest.py) and remains here + names = set() + for entry in registry_data: + name = entry.get("integration_name") + is_external = entry.get("is_external_package") + if name and isinstance(name, str) and is_external is True: + names.add(name) + return names + + +@pytest.fixture(scope="module") +def untested_integrations(registry_data: list[dict]) -> set[str]: + """Extracts names of integrations marked as 'is_tested: false'.""" + # This fixture depends on registry_data (from conftest.py) and remains here + names = set() + for entry in registry_data: + name = entry.get("integration_name") + is_tested = entry.get("is_tested") + if name and isinstance(name, str) and is_tested is False: + names.add(name) + + # TODO: wconnti27: remove this and ensure this list populates registry.yaml + from ddtrace.contrib.integration_registry.mappings import EXCLUDED_FROM_TESTING + + for name in EXCLUDED_FROM_TESTING: + names.add(name) + return names + + +@pytest.fixture(scope="module") +def integration_dir_names(internal_contrib_dir: Path) -> set[str]: + """ + Scans ddtrace/contrib/internal and returns a set of all directory names. + """ + names = set() + if not internal_contrib_dir.is_dir(): + pytest.fail(f"Contrib internal directory not found: {internal_contrib_dir}") + + for item in internal_contrib_dir.iterdir(): + if item.is_dir() and item.name != "__pycache__": + names.add(item.name) + + if not names: + pytest.fail(f"No directories (excluding __pycache__) found in {internal_contrib_dir}") + return names + + +@pytest.fixture(scope="module") +def riot_venvs() -> set[str]: + """Gets all Venv defined in riotfile.py.""" + return riotfile.venv.venvs + + +@pytest.fixture(scope="module") +def riot_venv_names() -> set[str]: + """Finds all Venv names defined in riotfile.py.""" + + names: Set[str] = set() + nodes_to_visit: List[Any] = [riotfile.venv] + + while nodes_to_visit: + current_node = nodes_to_visit.pop() + if hasattr(current_node, "name") and isinstance(current_node.name, str): + names.add(current_node.name) + + if hasattr(current_node, "venvs") and isinstance(current_node.venvs, list): + nodes_to_visit.extend(current_node.venvs) + + if not names: + pytest.fail("No integration Venv names found in riotfile.venv structure.") + return names diff --git a/tests/contrib/integration_registry/registry_update_helpers/__init__.py b/tests/contrib/integration_registry/registry_update_helpers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/contrib/integration_registry/registry_update_helpers/integration.py b/tests/contrib/integration_registry/registry_update_helpers/integration.py new file mode 100644 index 00000000000..d837bf1207b --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration.py @@ -0,0 +1,149 @@ +class Integration: + """ + Represents an integration in the registry. + """ + + def __init__( + self, + integration_name: str, + is_external_package: bool = True, + dependency_names: list = None, + tested_versions_by_dependency: dict = None, + is_tested: bool = True, + ): + self.integration_name = integration_name + self.is_external_package = is_external_package + self.dependency_names = set(dependency_names or []) + # Initialize with a new dict if None is passed to avoid sharing the mutable default + self.tested_versions_by_dependency = ( + tested_versions_by_dependency if tested_versions_by_dependency is not None else {} + ) + self.is_tested = is_tested + + def _semver_compare(self, version1: str, version2: str) -> int: + """ + Compares two semantic version strings (X.Y.Z format). + Returns: + 1 if version1 > version2 + 0 if version1 == version2 + -1 if version1 < version2 + Handles basic X.Y.Z format, raises ValueError for invalid input. + """ + if version1 == version2: + return 0 + + v1_parts = [int(p) for p in version1.split(".")] + v2_parts = [int(p) for p in version2.split(".")] + + if v1_parts[0] > v2_parts[0]: + return 1 + if v1_parts[0] < v2_parts[0]: + return -1 + + if v1_parts[1] > v2_parts[1]: + return 1 + if v1_parts[1] < v2_parts[1]: + return -1 + + if v1_parts[2] > v2_parts[2]: + return 1 + if v1_parts[2] < v2_parts[2]: + return -1 + return 0 + + def should_update(self, new_dependency_versions: dict) -> bool: + """Checks if the integration should be updated based on the new dependency versions.""" + # skip if the integration is not for an external package + if not self.is_external_package: + return False + + for dep, dep_info in new_dependency_versions.items(): + # if the dependency is not in the registry, we need to update + if dep.lower() not in self.dependency_names: + return True + + # if the dependency version is not in the registry, we need to update + dep_version = dep_info.get("version") + if dep_version == "": + return False + min_version = self.tested_versions_by_dependency.get(dep.lower(), None).get("min", None) + + # if the dependency version is not in the registry, we need to update + if min_version is None: + return True + + # if the dependency version is less than the min version, we need to update + if self._semver_compare(dep_version, min_version) == -1: + return True + + # if the dependency version is greater than the max version, we need to update + max_version = self.tested_versions_by_dependency.get(dep.lower(), {}).get("max", None) + if max_version is None: + return True + if self._semver_compare(dep_version, max_version) == 1: + return True + return False + + def update(self, updates: dict, update_versions: bool = False, riot_venv: str = None) -> bool: + """Updates the integration with the new dependency versions.""" + # skip if the integration is not an external package + if not self.is_external_package: + return + + # update the dependency info + changed = False + for dep_name in updates.keys(): + dep_name_lower = dep_name.lower() + + if dep_name_lower in self.dependency_names: + continue + + # if the dependency is not in the registry, add it + self.dependency_names.add(dep_name_lower) + changed = True + + # only update the dependency versions if: + # 1 - we are NOT running in a riot venv as this may be a local script run from: + # `python scripts/integration_registry/update_and_format_registry.py` + # 2 - or if the riot venv is the same as the integration name, as this is a test suite run and + # we only update the integration being tested + if update_versions and (riot_venv is None or riot_venv == self.integration_name): + prev = self.tested_versions_by_dependency.copy() + for dep_name in updates.keys(): + dep_name_lower = dep_name.lower() + # if "version" is in the updates, this is an entry with 1 version that should be updated + # - { dep_name: { "version": "1.0.0" } } + if "version" in updates[dep_name]: + self.tested_versions_by_dependency[dep_name_lower] = self._update_dependency_versions( + dep_name_lower, updates[dep_name]["version"] + ) + # else this is an entry with min and max versions that should both be updated: + # - { dep_name: { "min": "1.0.0", "max": "2.0.0" } } + else: + self.tested_versions_by_dependency[dep_name_lower] = updates[dep_name] + changed = prev != self.tested_versions_by_dependency or changed + return changed + + def _update_dependency_versions(self, dep_name: str, dep_version: str) -> bool: + """Updates the dependency versions for the integration.""" + if dep_name not in self.tested_versions_by_dependency: + return {"min": dep_version, "max": dep_version} + elif self._semver_compare(dep_version, self.tested_versions_by_dependency[dep_name]["min"]) == -1: + return {"min": dep_version, "max": self.tested_versions_by_dependency[dep_name]["max"]} + elif self._semver_compare(dep_version, self.tested_versions_by_dependency[dep_name]["max"]) == 1: + return {"min": self.tested_versions_by_dependency[dep_name]["min"], "max": dep_version} + return self.tested_versions_by_dependency[dep_name] + + def to_dict(self) -> dict: + """Converts the Integration object to a dictionary for YAML serialization.""" + data = { + "integration_name": self.integration_name, + "is_external_package": self.is_external_package, + "is_tested": self.is_tested, + } + if self.dependency_names: + data["dependency_names"] = sorted(list(self.dependency_names)) + if self.tested_versions_by_dependency: + # Sort tested_versions_by_dependency by key for consistent output + data["tested_versions_by_dependency"] = dict(sorted(self.tested_versions_by_dependency.items())) + return data diff --git a/tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py b/tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py new file mode 100644 index 00000000000..5eecafe042a --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration_registry_manager.py @@ -0,0 +1,189 @@ +import builtins +from collections import defaultdict +import importlib.metadata +import traceback + + +class IntegrationRegistryManager: + """ + Watches for _datadog_patch attribute access on modules via getattr patching. + Collects integration and distribution names based on traceback and metadata. + Provides the collected data for external processing. + """ + + def __init__(self): + self.updated_packages = set() + self.packages_distributions = None + self.patched_objects = {} + self.processed_objects = set() + self.original_getattr = None + self.pending_updates = defaultdict( + lambda: defaultdict( + lambda: { + "top_level_module": "", + "version": "", + } + ) + ) + + def get_cached_packages_distributions(self): + """Gets package->distribution mapping, caching the result.""" + if self.packages_distributions is None: + try: + self.packages_distributions = importlib.metadata.packages_distributions() + except AttributeError: + try: + import importlib_metadata + + self.packages_distributions = importlib_metadata.packages_distributions() + except Exception: + self.packages_distributions = {} + except Exception: + self.packages_distributions = {} + return self.packages_distributions + + def _is_valid_patch_call(self, tb_string): + """Checks if the patch call originated from ddtrace.contrib.internal/*/patch.py.""" + # reverse the lines to check the most recent patch call first since some integrations call + # other integrations patches: + # e.g. mongoengine calls pymongo's patch + return any( + "ddtrace/contrib/internal" in line and "/patch.py" in line for line in reversed(tb_string.splitlines()) + ) + + def _get_integration_name_from_traceback(self, tb_string): + """Extracts integration name (directory name) from traceback string.""" + for line in reversed(tb_string.splitlines()): + if "ddtrace/contrib/internal/" in line: + try: + # e.g., ".../ddtrace/contrib/internal/flask/patch.py" -> "flask" + parts = line.split("ddtrace/contrib/internal/")[1].split("/") + if parts and parts[0]: + return parts[0] + except (IndexError, Exception): + continue + return None + + def _get_full_module_from_object(self, obj): + """Gets the full module name from the object, e.g., 'google.generativeai' or 'redis'.""" + attrs = ["__module__", "__name__"] + for attr in attrs: + try: + module_name = builtins.getattr(obj, attr) + # Return if we got a non-empty string + if isinstance(module_name, str) and module_name: + return module_name + except Exception: + continue + return None + + def _distribution_contains_module(self, distribution_name: str, full_module_name: str) -> bool: + """Checks if a distribution's files contain the specified module.""" + try: + dist_files = importlib.metadata.files(distribution_name) + if not dist_files: + return False + + # Module path components (e.g., ['google', 'generativeai']) + module_parts = full_module_name.split(".") + # Possible file paths for the module + # e.g., google/generativeai.py or google/generativeai/__init__.py + expected_path_py = "/".join(module_parts) + ".py" + expected_path_init = "/".join(module_parts) + "/__init__.py" + + for file in dist_files: + file_path = str(file) + if file_path.endswith(expected_path_py) or file_path.endswith(expected_path_init): + return True + except Exception: + return False + return False + + def process_patched_objects(self): + """ + Processes objects recorded via getattr patching. + Identifies integration/distribution pairs and accumulates them for export. + """ + self.pending_updates.clear() + pkg_dist_map = self.get_cached_packages_distributions() + + for obj, tb_string in list(self.patched_objects.items()): + if obj in self.processed_objects or not self._is_valid_patch_call(tb_string): + continue + + try: + full_module_name = self._get_full_module_from_object(obj) + except Exception: + self.processed_objects.add(obj) + continue + + if not full_module_name: + continue + + top_level_module = full_module_name.split(".", 1)[0] + candidate_distribution_names = pkg_dist_map.get(top_level_module, []) + integration_name = self._get_integration_name_from_traceback(tb_string) + + if not (integration_name and candidate_distribution_names): + continue + + for distribution_name in candidate_distribution_names: + # Check if this specific distribution actually contains the patched module + if not self._distribution_contains_module(distribution_name, full_module_name): + continue + + # check if we already have an update for this integration/distribution pair + update_key = f"{integration_name}:{distribution_name}" + if update_key in self.updated_packages: + continue + + # add the integration/dependency combo to pending updates + self.pending_updates[integration_name][distribution_name] = { + "top_level_module": top_level_module, + "version": importlib.metadata.version(distribution_name), + } + self.updated_packages.add(update_key) + + self.processed_objects.add(obj) + + def patch_getattr(self): + """Patches builtins.getattr to intercept _datadog_patch access.""" + if self.original_getattr is not None: + return + self.original_getattr = builtins.getattr + + def _wrapped_getattr(obj, name, *default): + og_getattr = self.original_getattr + + if name in ("_datadog_patch", "__datadog_patch"): + is_processed = obj in self.processed_objects + is_patched = obj in self.patched_objects + + if not is_processed and not is_patched: + tb = traceback.extract_stack()[:-1] + tb_string = "".join(traceback.format_list(tb)) + self.patched_objects[obj] = tb_string + + if default: + return og_getattr(obj, name, default[0]) + return og_getattr(obj, name) + + builtins.getattr = _wrapped_getattr + + def cleanup_patch(self): + """Restores getattr and clears internal state.""" + if self.original_getattr: + builtins.getattr = self.original_getattr + self.original_getattr = None + + def cleanup_post_session(self): + """Cleans up the registry manager after a session.""" + self.patched_objects.clear() + self.processed_objects.clear() + self.updated_packages.clear() + self.pending_updates.clear() + self.packages_distributions = None + self.cleanup_patch() + + +registry_manager = IntegrationRegistryManager() diff --git a/tests/contrib/integration_registry/registry_update_helpers/integration_registry_updater.py b/tests/contrib/integration_registry/registry_update_helpers/integration_registry_updater.py new file mode 100644 index 00000000000..23749592dde --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration_registry_updater.py @@ -0,0 +1,208 @@ +import json +import os +import pathlib +import sys +from typing import Tuple +from typing import Union + +from filelock import FileLock +import yaml + +from tests.contrib.integration_registry.registry_update_helpers.integration import Integration + + +class IntegrationRegistryUpdater: + """ + Handles loading, merging, and writing integration registry data using file locking. Checks if the registry needs + to be updated before merging/writing. + """ + + def __init__(self): + self.project_root = self._find_project_root() + if not self.project_root: + raise RuntimeError("Could not determine project root directory.") + + self.registry_yaml_path = self.project_root / "ddtrace" / "contrib" / "integration_registry" / "registry.yaml" + self.registry_lock_path = ( + self.project_root / "ddtrace" / "contrib" / "integration_registry" / "registry.yaml.lock" + ) + self.lock_timeout_seconds = 15 + self.lock = FileLock(self.registry_lock_path, timeout=self.lock_timeout_seconds) + self.raw_registry_data: dict[str, dict] = {} + self.integrations: dict[str, Integration] = {} + + def _find_project_root(self) -> Union[pathlib.Path, None]: + """Finds the project root by searching upwards for marker files.""" + current_dir = pathlib.Path(__file__).parent + for _ in range(5): + if (current_dir / "pyproject.toml").exists() or (current_dir / ".git").exists(): + return current_dir + if current_dir.parent == current_dir: + break + current_dir = current_dir.parent + return None + + def _load_integrations(self): + """Loads the integrations from the registry data into a class instance.""" + for integration in self.raw_registry_data.get("integrations", []): + if not isinstance(integration, dict): + continue + self.integrations[integration["integration_name"]] = Integration(**integration) + + def load_registry_data(self): + """Safely loads the main registry YAML using a file lock.""" + try: + self.lock.acquire(timeout=self.lock_timeout_seconds) + if not self.registry_yaml_path.exists(): + self.raw_registry_data = {} + return + with open(self.registry_yaml_path, "r", encoding="utf-8") as f: + self.raw_registry_data = yaml.safe_load(f) + if self.raw_registry_data: + self._load_integrations() + except Exception: + if self.lock.is_locked: + self.lock.release() + + def load_input_data(self, input_file_path_str: str) -> dict: + """Loads the JSON data from the specified input file.""" + input_file_path = pathlib.Path(input_file_path_str) + try: + with open(input_file_path, "r", encoding="utf-8") as f: + return json.load(f) + except Exception: + return {} + + def _needs_update(self, input_data: dict) -> bool: + """Checks if input_data contains info not present in registry_data.""" + for integration_name, updates in input_data.items(): + # if the integration is not tested, we don't need to update + new_deps = updates + if not new_deps: + continue + + # if the integration is not in the registry, we need to update + if integration_name not in self.integrations: + return True + + # check if the integration should be updated + if not self.integrations[integration_name].should_update(updates): + return False + return True + + def merge_data(self, new_dependency_versions: dict) -> Tuple[int, int]: + """Merges dependency info from new_dependency_versions into registry_data. Assumes check already done.""" + # loop through the new integration data and add the updates to the registry + added_integrations = 0 + updated_integrations = 0 + for integration_name, updates in new_dependency_versions.items(): + if not updates: + continue + + # if the integration is not in the registry, add it + if integration_name not in self.integrations: + self.integrations[integration_name] = Integration( + integration_name=integration_name, + is_external_package=True, + dependency_names=sorted(list(set(updates.keys()))), + ) + self.integrations[integration_name].update(updates, update_versions=True) + added_integrations += 1 + continue + else: + riot_venv = self._get_riot_venv_name() + + # update the existing integration + changed = self.integrations[integration_name].update(updates, update_versions=True, riot_venv=riot_venv) + if changed: + updated_integrations += 1 + + return added_integrations, updated_integrations + + def write_registry_data(self) -> bool: + """Safely writes the updated data back to registry YAML using a file lock.""" + # Convert Integration objects to dictionaries and sort by integration_name + integrations_list = sorted( + [integration.to_dict() for integration in self.integrations.values()], + key=lambda x: x["integration_name"], + ) + data_to_write = {"integrations": integrations_list} + try: + with open(self.registry_yaml_path, "w", encoding="utf-8") as f: + yaml.dump( + data_to_write, + f, + default_flow_style=False, + sort_keys=False, + indent=2, + width=100, + ) + return True + except Exception as e: + print(f"\nIntegrationRegistryUpdater: Failed to write updated registry data: {e}", file=sys.stderr) + return False + finally: + self._delete_lock_file() + if self.lock.is_locked: + self.lock.release() + + def _delete_lock_file(self): + """Deletes the lock file if it exists.""" + try: + if self.registry_lock_path.exists(): + self.registry_lock_path.unlink() + except OSError as e: + print(f"IntegrationRegistryUpdater: Failed to delete lock file: {e}", file=sys.stderr) + + def _get_riot_venv_name(self): + """Returns the name of the riot venv if this is being run from a riot job.""" + if os.environ.get("RIOT_VENV_NAME"): + # split venv name for special cases like "django:celery" to "django" + return os.environ.get("RIOT_VENV_NAME").split(":")[0] + return None + + def run(self, input_file_path_str: str) -> bool: + """ + Loads data, checks if update needed, merges/writes if necessary. + Returns True ONLY if changes were successfully written, False otherwise. + """ + input_data = self.load_input_data(input_file_path_str) + if not input_data: + return False + + changes_made = False + try: + self.load_registry_data() + + # if the registry data is up to date, we can skip the merge and write steps, and release the lock + if not self._needs_update(input_data): + if self.lock.is_locked: + self.lock.release() + return False + + # merge the input data into the registry data + added_integrations, updated_integrations = self.merge_data(input_data) + + # if no integrations were added or updated, we can skip the write step + if added_integrations == 0 and updated_integrations == 0: + return False + + changes_made = True + # write the updated registry data + if not self.write_registry_data(): + print("\nIntegrationRegistryUpdater: Failed to write updated registry data.", file=sys.stderr) + return False + + return changes_made + + except Exception as e: + print(f"\nIntegrationRegistryUpdater: Error during run: {e}", file=sys.stderr) + # Ensure lock is released on any exception if still held (e.g., error between load and write) + if self.lock.is_locked: + self.lock.release() + return False + finally: + # Ensure lock is always released and the lock file is deleted + if self.lock.is_locked: + self.lock.release() + self._delete_lock_file() diff --git a/tests/contrib/integration_registry/registry_update_helpers/integration_update_orchestrator.py b/tests/contrib/integration_registry/registry_update_helpers/integration_update_orchestrator.py new file mode 100644 index 00000000000..c1f1dabef4c --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration_update_orchestrator.py @@ -0,0 +1,198 @@ +import json +import os +import subprocess +import sys +import tempfile +import time +from typing import Union + + +class IntegrationUpdateOrchestrator: + TOOLING_VENV_DIR = ".venv-registry-tools" + TOOLING_DEPS = ["pyyaml", "riot", "filelock"] + REGISTRY_UPDATER_MODULE = "tests.contrib.integration_registry.registry_update_helpers.integration_registry_updater" + REGISTRY_UPDATER_CLASS = "IntegrationRegistryUpdater" + MAIN_UPDATE_SCRIPT = "scripts/integration_registry/update_and_format_registry.py" + UPDATER_LOCK_FILE = "ddtrace/contrib/integration_registry/registry.yaml.lock" + LOCK_MAX_WAIT_SECONDS = 15 + + def __init__(self, project_root: str): + self.project_root = project_root + self.tooling_env_path = os.path.join(project_root, self.TOOLING_VENV_DIR) + # Define path for the venv setup lock relative to project root + self.venv_lock_file_path = os.path.join(project_root, ".venv-registry-tools.lock") + self.updater_lock_file_path = os.path.join(project_root, self.UPDATER_LOCK_FILE) + + def _acquire_lock(self, lock_file_path): + start_time = time.monotonic() + while time.monotonic() - start_time < self.LOCK_MAX_WAIT_SECONDS: + try: + fd = os.open(lock_file_path, os.O_CREAT | os.O_EXCL | os.O_WRONLY) + os.close(fd) + return True + except FileExistsError: + time.sleep(0.5) + except Exception: + return False + return False + + def _release_lock(self, lock_file_path): + try: + os.remove(lock_file_path) + except Exception: + pass + + def _ensure_tooling_venv(self): + """Ensures the integration registry tools venv is created and up to date.""" + tooling_python = os.path.join(self.tooling_env_path, "bin", "python") + pip_timeout = 20 + + if os.path.exists(tooling_python): + try: + cmd = [tooling_python, "-m", "pip", "install", "-U"] + self.TOOLING_DEPS + if self._run_subprocess(cmd, pip_timeout, self.project_root, "pip install -U", verbose=False): + return True + except Exception: + return True + + try: + cmd = ["python3", "-m", "venv", self.tooling_env_path] + if not self._run_subprocess(cmd, 20, self.project_root, "venv creation", verbose=False): + return False + except Exception: + return False + + if not os.path.exists(tooling_python): + return False + try: + cmd = [tooling_python, "-m", "pip", "install"] + self.TOOLING_DEPS + if not self._run_subprocess(cmd, pip_timeout, self.project_root, "pip install", verbose=False): + return False + return True + except Exception: + return False + + def _run_subprocess(self, cmd: list, timeout: int, cwd: str, description: str, verbose: bool = True) -> bool: + """Helper to run subprocess. Prints stderr on failure by default.""" + try: + process = subprocess.run(cmd, check=True, capture_output=True, text=True, timeout=timeout, cwd=cwd) + if verbose: + if process.stdout: + print(f"\n--- stdout: {description} ---\n{process.stdout.strip()}", file=sys.stdout) + if process.stderr: + print(f"\n--- stderr: {description} ---\n{process.stderr.strip()}", file=sys.stdout) + return True + except subprocess.CalledProcessError as e: + if e.stderr: + # Only print stderr if it exists since the registry update command returns a non-zero exit code + # when no changes are needed + print(f"Error: {description} failed (code {e.returncode}).", file=sys.stderr) + return False + except Exception: + return False + + @staticmethod + def export_registry_data(data: dict, request) -> Union[str, None]: + """Exports registry data to a temporary file for pytest worker use.""" + data_file_path = None + try: + unique_id = f"pid{os.getpid()}" + worker_input = getattr(request.config, "workerinput", None) + if worker_input and "workerid" in worker_input: + unique_id += f"_{worker_input['workerid']}" + temp_dir = getattr(request.config, "_tmp_path_factory", None) + base_dir = temp_dir.getbasetemp() if temp_dir else None + fd, data_file_path = tempfile.mkstemp( + prefix=f"registry_data_{unique_id}_", suffix=".json", dir=base_dir, text=True + ) + with open(fd, "w", encoding="utf-8") as temp_f: + json.dump(data, temp_f) + request.config._registry_session_data_file = data_file_path + return data_file_path + except Exception: + if data_file_path and os.path.exists(data_file_path): + try: + os.remove(data_file_path) + except OSError: + pass + if hasattr(request.config, "_registry_session_data_file"): + delattr(request.config, "_registry_session_data_file") + return None + + @staticmethod + def cleanup_session_data(session): + data_file_path = getattr(session.config, "_registry_session_data_file", None) + if data_file_path and os.path.exists(data_file_path): + try: + os.remove(data_file_path) + except OSError: + pass + if hasattr(session.config, "_registry_session_data_file"): + delattr(session.config, "_registry_session_data_file") + + def run(self, data_file_path: str): + """Main method for orchestrating the integrationregistry update process.""" + venv_lock_acquired = False + updater_succeeded = False + + try: + # Setup Tooling Venv + try: + if not self._acquire_lock(self.venv_lock_file_path): + return + venv_lock_acquired = True + if not self._ensure_tooling_venv(): + return + finally: + if venv_lock_acquired: + self._release_lock(self.venv_lock_file_path) + + # Remove potentially stale updater lock file + if os.path.exists(self.updater_lock_file_path): + try: + os.remove(self.updater_lock_file_path) + except OSError: + pass + + # Run Update Process + tooling_python = os.path.join(self.tooling_env_path, "bin", "python") + if not os.path.exists(tooling_python): + return + + # 1. Run IntegrationRegistryUpdater + escaped_path = data_file_path.replace("'", "'\\''") + py_cmd = ( + f"import sys; sys.path.insert(0, '{self.project_root}'); " + f"from {self.REGISTRY_UPDATER_MODULE} import {self.REGISTRY_UPDATER_CLASS}; " + f"updater = {self.REGISTRY_UPDATER_CLASS}(); success = updater.run('{escaped_path}'); " + f"sys.exit(0 if success else 1);" + ) + cmd_updater = [tooling_python, "-c", py_cmd] + updater_succeeded = self._run_subprocess( + cmd_updater, 20, self.project_root, self.REGISTRY_UPDATER_CLASS, verbose=False + ) + + # UNCOMMENT TO RUN THE UPDATER LOCALLY, and comment out the above few lines, requires updating riotfile.py + # to include the following within the riot env: + # - "filelock" + # - "pyyaml" + # from tests.contrib.integration_registry.registry_update_helpers.integration_registry_updater import ( + # IntegrationRegistryUpdater + # ) + # updater = IntegrationRegistryUpdater() + # updater_succeeded = updater.run(data_file_path) + + # 2. Run Main IntegrationRegistry Update/Format Script if we have changes to the registry + if updater_succeeded: + script_path = os.path.join(self.project_root, self.MAIN_UPDATE_SCRIPT) + if os.path.exists(script_path): + cmd_main = [tooling_python, script_path] + self._run_subprocess(cmd_main, 20, self.project_root, "Main Update Script", verbose=True) + + finally: + # Cleanup updater's lock file + if os.path.exists(self.updater_lock_file_path): + try: + os.remove(self.updater_lock_file_path) + except OSError: + pass diff --git a/tests/contrib/integration_registry/test_external_dependencies.py b/tests/contrib/integration_registry/test_external_dependencies.py new file mode 100644 index 00000000000..582dac89c85 --- /dev/null +++ b/tests/contrib/integration_registry/test_external_dependencies.py @@ -0,0 +1,189 @@ +import subprocess +import sys +from typing import Any +from typing import Dict +from typing import List + +from packaging.version import InvalidVersion +from packaging.version import parse as parse_version +import pytest + + +def _validate_version_str(version_str: str, field_name: str, integration_name: str, dep_name: str) -> List[str]: + errors = [] + if version_str != "N/A": + try: + parse_version(version_str) + except InvalidVersion: + errors.append( + f"Integration '{integration_name}', Dependency '{dep_name}': Invalid SemVer format for '{field_name}': " + f"'{version_str}'." + ) + return errors + + +def _validate_external_tested_entry(entry: Dict[str, Any], name: str) -> List[str]: + errors = [] + dependency_names = entry.get("dependency_names") + if not dependency_names: + errors.append(f"External tested integration '{name}' is missing required field 'dependency_names'.") + elif not isinstance(dependency_names, list) or not all(isinstance(d, str) and d for d in dependency_names): + errors.append( + f"External integration '{name}' has an empty or invalid 'dependency_names' field (must be a non-empty " + "list of strings)." + ) + + version_map = entry.get("tested_versions_by_dependency") + if not version_map: + if dependency_names: + errors.append( + f"External tested integration '{name}' has 'dependency_names' but is missing " + "'tested_versions_by_dependency' map." + ) + elif not isinstance(version_map, dict): + errors.append(f"External integration '{name}' field 'tested_versions_by_dependency' is not a dictionary.") + elif dependency_names: # Only validate map content if dependency_names is valid + map_keys = set(version_map.keys()) + dep_name_set = set(dependency_names) + + if map_keys != dep_name_set: + missing_in_map = dep_name_set - map_keys + extra_in_map = map_keys - dep_name_set + if missing_in_map: + errors.append( + f"Integration '{name}': Dependencies {sorted(list(missing_in_map))} listed in 'dependency_names' " + "are missing from 'tested_versions_by_dependency' map." + ) + if extra_in_map: + errors.append( + f"Integration '{name}': Dependencies {sorted(list(extra_in_map))} found in " + "'tested_versions_by_dependency' map are not listed in 'dependency_names'." + ) + + for dep_name, version_info in version_map.items(): + if not isinstance(version_info, dict): + errors.append( + f"Integration '{name}', Dependency '{dep_name}': Value in 'tested_versions_by_dependency' is not a " + "dictionary." + ) + continue + min_v = version_info.get("min") + max_v = version_info.get("max") + if min_v is None and max_v is None: + errors.append( + f"Integration '{name}', Dependency '{dep_name}': Version info block must contain at least " + "'min' or 'max'." + ) + continue + + if min_v is not None: + errors.extend(_validate_version_str(min_v, "min", name, dep_name)) + if max_v is not None: + errors.extend(_validate_version_str(max_v, "max", name, dep_name)) + return errors + + +def _validate_non_external_entry(entry: Dict[str, Any], name: str) -> List[str]: + errors = [] + unexpected_fields = [ + "dependency_names", + "tested_versions_by_dependency", + "supported_version_min", + "supported_version_max", + ] + for field in unexpected_fields: + if field in entry: + errors.append(f"Non-external integration '{name}' unexpectedly contains field '{field}'.") + return errors + + +def test_external_package_requirements(registry_data: list[dict]): + all_errors: list[str] = [] + + for entry in registry_data: + name = entry.get("integration_name", f"UNKNOWN_ENTRY_AT_INDEX_{registry_data.index(entry)}") + is_external = entry.get("is_external_package") + is_tested = entry.get("is_tested", True) + + if is_external is None: + all_errors.append(f"Integration '{name}' is missing the required 'is_external_package' field.") + continue + + if is_external: + # special case since we have a few external integrations that are not tested + # (ie: aioredis which we plan to deprecate) + if is_tested is not False: + all_errors.extend(_validate_external_tested_entry(entry, name)) + else: + all_errors.extend(_validate_non_external_entry(entry, name)) + + assert not all_errors, "\n".join(all_errors) + + +def test_external_dependencies_exist_on_pypi(registry_data: list[dict]): + """ + Verify that package names listed in 'dependency_names' for external integrations + can be found on PyPI using 'pip index versions'. + """ + errors = [] + pip_command = [sys.executable, "-m", "pip"] + + print("\nChecking external dependencies against PyPI...") + checked_packages = set() + + for entry in registry_data: + if not entry.get("is_external_package"): + continue + + integration_name = entry.get("integration_name", "UNKNOWN_ENTRY") + dependency_names = entry.get("dependency_names", []) + + if not dependency_names: + continue + + if not isinstance(dependency_names, list): + errors.append( + f"External integration '{integration_name}' has invalid dependency_names (not a list): " + f"{dependency_names}" + ) + continue + + for dep_name in dependency_names: + if not isinstance(dep_name, str) or not dep_name: + errors.append( + f"External integration '{integration_name}' has invalid item in dependency_names list: " + f"{dep_name}" + ) + continue + + if dep_name in checked_packages: + continue + checked_packages.add(dep_name) + + command = pip_command + ["index", "versions", dep_name] + try: + result = subprocess.run(command, capture_output=True, text=True, check=False, timeout=30) + + if result.returncode != 0: + error_detail = f"Return Code: {result.returncode}" + if "no matching distribution found" in result.stderr.lower(): + error_detail = "No matching distribution found on PyPI (or configured index)." + else: + error_detail += f"\n Stderr: {result.stderr.strip()}" + errors.append( + f"Integration '{integration_name}': Dependency '{dep_name}' check failed. {error_detail}" + ) + + except subprocess.TimeoutExpired: + errors.append(f"Integration '{integration_name}': Timeout checking dependency '{dep_name}' on PyPI.") + except FileNotFoundError: + pytest.fail( + "Could not execute pip command. Ensure Python environment is correctly set up. Command: " + f"{' '.join(command)}" + ) + except Exception as e: + errors.append( + f"Integration '{integration_name}': Unexpected error checking dependency '{dep_name}': {e}" + ) + + assert not errors, "\n".join(errors) diff --git a/tests/contrib/integration_registry/test_registry_schema.py b/tests/contrib/integration_registry/test_registry_schema.py new file mode 100644 index 00000000000..43db4f78361 --- /dev/null +++ b/tests/contrib/integration_registry/test_registry_schema.py @@ -0,0 +1,59 @@ +from pathlib import Path + +import jsonschema +import pytest + + +def test_registry_conforms_to_schema(registry_yaml_path: Path, registry_content: dict, registry_schema: dict): + """Validates registry.yaml content against the defined JSON schema.""" + if jsonschema is None: + pytest.skip("jsonschema library not installed, skipping schema validation.") + + try: + jsonschema.validate(instance=registry_content, schema=registry_schema) + except jsonschema.ValidationError as e: + pytest.fail(f"Schema validation failed for {registry_yaml_path}:\n{e}", pytrace=False) + except Exception as e: + pytest.fail(f"An unexpected error occurred during schema validation: {e}") + + +def test_all_internal_dirs_accounted_for( + registry_yaml_path: Path, internal_contrib_dir: Path, project_root: Path, all_integration_names: set[str] +): + """ + Verify that every directory within ddtrace/contrib/internal is listed + as an 'integration_name' in registry.yaml. + """ + + accounted_for_dirs = all_integration_names + found_dirs_on_disk = set() + unaccounted_dirs = [] + + for item in internal_contrib_dir.iterdir(): + if item.is_dir() and item.name != "__pycache__": + dir_name = item.name + found_dirs_on_disk.add(dir_name) + if dir_name not in accounted_for_dirs: + unaccounted_dirs.append(dir_name) + + # Check for entries in YAML that don't have a corresponding directory + missing_dirs_in_yaml = accounted_for_dirs - found_dirs_on_disk + + error_messages = [] + if unaccounted_dirs: + error_messages.append( + f"\n\nUnaccounted Directories Found:\n" + f" The following directories exist in '{internal_contrib_dir.relative_to(project_root)}' \n" + f" but do NOT have a corresponding 'integration_name' entry in '{registry_yaml_path.name}'.\n" + f" Please add entries for them:\n" + f" - " + "\n - ".join(sorted(unaccounted_dirs)) + "\n" + ) + if missing_dirs_in_yaml: + error_messages.append( + f"\n\nMissing Directories for YAML Entries:\n" + f" The following integration names are listed in '{registry_yaml_path.name}'\n" + f" but do not have a corresponding directory in '{internal_contrib_dir.relative_to(project_root)}':\n\n" + f" - " + "\n - ".join(sorted(list(missing_dirs_in_yaml))) + "\n" + ) + + assert not error_messages, "\n".join(error_messages) diff --git a/tests/contrib/integration_registry/test_riotfile.py b/tests/contrib/integration_registry/test_riotfile.py new file mode 100644 index 00000000000..d2ba308b65a --- /dev/null +++ b/tests/contrib/integration_registry/test_riotfile.py @@ -0,0 +1,54 @@ +import pathlib + +from ddtrace.contrib.integration_registry.mappings import EXCLUDED_FROM_TESTING + + +def test_integrations_have_riot_envs( + integration_dir_names: set[str], + riot_venv_names: set[str], + project_root: pathlib.Path, + internal_contrib_dir: pathlib.Path, + untested_integrations: set[str], +): + """ + Verify that every integration directory in ddtrace/contrib/internal has a + corresponding Venv defined in riotfile.py. + """ + missing_riot_envs = integration_dir_names - riot_venv_names - untested_integrations + + contrib_internal_rel_path = internal_contrib_dir.relative_to(project_root) + + assert not missing_riot_envs, ( + f"\nThe following integration directories in '{contrib_internal_rel_path}' " + f"are MISSING a corresponding environment definition in 'riotfile.py':\n" + f" - " + "\n - ".join(sorted(list(missing_riot_envs))) + "\n" + "\nPlease add a Venv definition in riotfile.py with a matching 'name'." + ) + + +def test_contrib_tests_have_valid_contrib_venv_name(riot_venvs: set[str], integration_dir_names: set[str]): + """ + Verify that every riot venv with a test path that contains 'contrib' is an actual + contrib directory. + """ + + failed_venvs = [] + for venv in riot_venvs: + if venv.command and "tests/contrib" in venv.command: + # some venvs have sub-venvs in the form of venv-name:sub-venv-name, we only want the main one + # e.g. django:django_hosts -> django + venv.name = venv.name.split(":")[0] + if venv.name not in integration_dir_names: + if venv.name not in EXCLUDED_FROM_TESTING: + failed_venvs.append(venv) + + if failed_venvs: + failure_messages = [f"\n{'*' * 100}"] + for venv in failed_venvs: + failure_messages.append( + f"Venv '{venv.name}' has a test command that contains 'tests/contrib': {venv.command}, but " + f"is not an actual integration with directory in 'ddtrace/contrib/internal'. Please " + f"update 'riotfile.py' to place this Venv as a sub-venv of the integration it is testing.\n" + ) + failure_messages.append("*" * 100) + assert failed_venvs == [], "\n".join(failure_messages) diff --git a/tests/contrib/suitespec.yml b/tests/contrib/suitespec.yml index 310df7c41f9..d2727624b1b 100644 --- a/tests/contrib/suitespec.yml +++ b/tests/contrib/suitespec.yml @@ -126,6 +126,8 @@ components: httpx: - ddtrace/contrib/_httpx.py - ddtrace/contrib/internal/httpx/* + integration_registry: + - ddtrace/contrib/integration_registry/* jinja2: - ddtrace/contrib/_jinja2.py - ddtrace/contrib/internal/jinja2/* @@ -545,7 +547,7 @@ suites: - tests/contrib/django/* - tests/contrib/django_celery/* - tests/snapshots/tests.{suite}.* - pattern: django($|_celery) + pattern: ^(django|django:celery)$ runner: riot services: - postgres @@ -564,10 +566,10 @@ suites: - tests/snapshots/tests.{suite}.* - tests/contrib/django_hosts/* - tests/contrib/django_hosts/django_app/* - pattern: django_hosts$ + pattern: django:django_hosts runner: riot snapshot: true - djangorestframework: + django:djangorestframework: parallelism: 2 env: TEST_MEMCACHED_HOST: memcached @@ -581,6 +583,7 @@ suites: - '@django' - tests/contrib/djangorestframework/* - tests/contrib/djangorestframework/app/* + pattern: django:djangorestframework runner: riot services: - memcached @@ -700,7 +703,7 @@ suites: - tests/contrib/gevent/* runner: riot snapshot: false - graphene: + graphql:graphene: parallelism: 1 paths: - '@bootstrap' @@ -721,6 +724,7 @@ suites: - '@graphql' - tests/contrib/graphql/* - tests/snapshots/tests.contrib.graphql.* + pattern: graphql$ runner: riot snapshot: true grpc: @@ -773,6 +777,17 @@ suites: services: - httpbin_local snapshot: true + integration_registry: + paths: + - '@bootstrap' + - '@core' + - '@contrib' + - '@tracing' + - '@integration_registry' + - tests/contrib/integration_registry/* + runner: riot + snapshot: false + parallelism: 1 jinja2: parallelism: 2 paths: @@ -1197,7 +1212,7 @@ suites: - '@appsec' - tests/contrib/subprocess/* runner: riot - test_logging: + logging: parallelism: 1 paths: - '@bootstrap' diff --git a/tests/internal/test_module.py b/tests/internal/test_module.py index de71d586136..7b3029c3560 100644 --- a/tests/internal/test_module.py +++ b/tests/internal/test_module.py @@ -560,6 +560,8 @@ def test_public_modules_in_ddtrace_contrib(): "ddtrace.contrib.asgi", "ddtrace.contrib.bottle", "ddtrace.contrib.flask_cache", + "ddtrace.contrib.integration_registry.mappings", + "ddtrace.contrib.integration_registry.utils", "ddtrace.contrib.aiohttp", "ddtrace.contrib.dbapi_async", "ddtrace.contrib.wsgi", diff --git a/tests/suitespec.yml b/tests/suitespec.yml index 4213095da66..452b950b0f8 100644 --- a/tests/suitespec.yml +++ b/tests/suitespec.yml @@ -185,6 +185,12 @@ suites: pattern: integration-snapshot* runner: riot snapshot: true + integration_registry: + parallelism: 1 + paths: + - '@contrib' + - ddtrace/contrib/integration_registry/* + runner: riot internal: parallelism: 2 paths: