diff --git a/.gitlab/tests.yml b/.gitlab/tests.yml index b6cc09ad3bd..fa48a97e11d 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 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/1079860.txt b/.riot/requirements/1079860.txt new file mode 100644 index 00000000000..f7bc7e1af14 --- /dev/null +++ b/.riot/requirements/1079860.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 --resolver=backtracking .riot/requirements/1079860.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==24.2 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==8.3.5 +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/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/fb47988.txt b/.riot/requirements/16cebb7.txt similarity index 68% rename from .riot/requirements/fb47988.txt rename to .riot/requirements/16cebb7.txt index e9cc2d8236d..730907cf123 100644 --- a/.riot/requirements/fb47988.txt +++ b/.riot/requirements/16cebb7.txt @@ -2,17 +2,17 @@ # 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/16cebb7.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 @@ -21,9 +21,9 @@ parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==8.3.5 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/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/1cc7f49.txt b/.riot/requirements/1a1efbd.txt similarity index 66% rename from .riot/requirements/1cc7f49.txt rename to .riot/requirements/1a1efbd.txt index 644fd59d910..798bb12e8fc 100644 --- a/.riot/requirements/1cc7f49.txt +++ b/.riot/requirements/1a1efbd.txt @@ -2,16 +2,16 @@ # 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/1a1efbd.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 @@ -20,9 +20,9 @@ parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==8.3.5 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/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/1cf47d6.txt b/.riot/requirements/1cf47d6.txt new file mode 100644 index 00000000000..86fbda8186d --- /dev/null +++ b/.riot/requirements/1cf47d6.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 --resolver=backtracking .riot/requirements/1cf47d6.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==24.2 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==8.3.5 +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/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/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/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/4288d15.txt b/.riot/requirements/4288d15.txt new file mode 100644 index 00000000000..41936e3fa4b --- /dev/null +++ b/.riot/requirements/4288d15.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/4288d15.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +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==24.2 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==8.3.5 +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/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/8ba611b.txt b/.riot/requirements/8ba611b.txt new file mode 100644 index 00000000000..7771081cb55 --- /dev/null +++ b/.riot/requirements/8ba611b.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/8ba611b.in +# +attrs==25.3.0 +coverage[toml]==7.8.0 +exceptiongroup==1.2.2 +glob2==0.7 +hypothesis==6.45.0 +importlib-metadata==8.6.1 +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==24.2 +parse==1.20.2 +parse-type==0.6.4 +pluggy==1.5.0 +py==1.11.0 +pytest==8.3.5 +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/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/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/1d44438.txt b/.riot/requirements/d188248.txt similarity index 66% rename from .riot/requirements/1d44438.txt rename to .riot/requirements/d188248.txt index 5a2fbefacd8..c77f70d8ca2 100644 --- a/.riot/requirements/1d44438.txt +++ b/.riot/requirements/d188248.txt @@ -2,16 +2,16 @@ # 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/d188248.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 @@ -20,9 +20,9 @@ parse==1.20.2 parse-type==0.6.4 pluggy==1.5.0 py==1.11.0 -pytest==8.3.4 +pytest==8.3.5 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/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/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..bad03981c05 --- /dev/null +++ b/ddtrace/contrib/integration_registry/README.md @@ -0,0 +1,154 @@ +# 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. A full test run of the newly added integration suite is required for this process. This is 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 this case get: `redis-py-cluster`. Then we can update the registry since we now know the dependency name of interest, and the related integration name. + +## 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..8541d2f4af9 --- /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.1 + max: 1.65.1 + +- 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 09764c3c132..58da4048abf 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 09764c3c132..58da4048abf 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 815f7950f1a..4e3637e7153 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,7 +1545,7 @@ 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, @@ -1604,7 +1604,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 +1677,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 +1713,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={ @@ -2742,6 +2742,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..f7039295972 100644 --- a/scripts/freshvenvs.py +++ b/scripts/freshvenvs.py @@ -14,42 +14,18 @@ from packaging.version import Version from pip import _internal +from ddtrace.contrib.integration_registry.mappings import DEPENDENCY_TO_INTEGRATION_MAPPING +from ddtrace.contrib.integration_registry.mappings import INTEGRATION_TO_DEPENDENCY_MAPPING + +# add project root to path to import riotfile sys.path.append(str(pathlib.Path(__file__).parent.parent.resolve())) -import riotfile # noqa: 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..a766295e087 100755 --- a/scripts/run-test-suite +++ b/scripts/run-test-suite @@ -76,3 +76,7 @@ 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 commit the changes." diff --git a/supported_versions_output.json b/supported_versions_output.json index ae5b33c5f61..dd3bf659dd1 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,396 @@ "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", - "pinned": "true", "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": "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": "8.17.0", + "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": "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.1", + "max_tracer_supported": "1.65.1", + "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 +506,135 @@ "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": "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 +642,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..af51d6cc9fc 100644 --- a/supported_versions_table.csv +++ b/supported_versions_table.csv @@ -1,76 +1,92 @@ -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.1,1.65.1,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 +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..8f1c6ebb9db --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration.py @@ -0,0 +1,121 @@ +class Integration: + """ + Represents an integration in the registry. + """ + + def __init__( + self, + integration_name: str, + is_external_package: bool = True, + dependency_names: list = [], + 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) + # 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.""" + 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) -> 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 + if update_versions: + # update the dependency versions + prev = self.tested_versions_by_dependency.copy() + for dep_name in updates.keys(): + dep_name_lower = dep_name.lower() + self.tested_versions_by_dependency[dep_name_lower] = updates[dep_name] + changed = prev != self.tested_versions_by_dependency or changed + return changed + + 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..61bcdfab71a --- /dev/null +++ b/tests/contrib/integration_registry/registry_update_helpers/integration_registry_updater.py @@ -0,0 +1,193 @@ +import json +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: + # update the existing integration + changed = self.integrations[integration_name].update(updates, update_versions=True) + 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 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 + self.merge_data(input_data) + + changes_made = True + 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: