From a9a23b93bfed9331bcedfbe00f9fc448d1db26e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 10:03:59 +0200 Subject: [PATCH 01/29] Bump sqlparse from 0.4.4 to 0.5.0 (#558) Bumps [sqlparse](https://github.com/andialbrecht/sqlparse) from 0.4.4 to 0.5.0. - [Changelog](https://github.com/andialbrecht/sqlparse/blob/master/CHANGELOG) - [Commits](https://github.com/andialbrecht/sqlparse/compare/0.4.4...0.5.0) --- updated-dependencies: - dependency-name: sqlparse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 188a4728a..e0971e36c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3408,19 +3408,18 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlparse" -version = "0.4.4" +version = "0.5.0" description = "A non-validating SQL parser." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, ] [package.extras] -dev = ["build", "flake8"] +dev = ["build", "hatch"] doc = ["sphinx"] -test = ["pytest", "pytest-cov"] [[package]] name = "sympy" From 36eb46f371616b35921aebfc6362726c586b0754 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 09:50:19 +0200 Subject: [PATCH 02/29] Bump tqdm from 4.66.1 to 4.66.3 (#569) Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.66.1 to 4.66.3. - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.66.1...v4.66.3) --- updated-dependencies: - dependency-name: tqdm dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index e0971e36c..64d65d07e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3667,13 +3667,13 @@ scipy = ["scipy"] [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.3" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.3-py3-none-any.whl", hash = "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53"}, + {file = "tqdm-4.66.3.tar.gz", hash = "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5"}, ] [package.dependencies] From fa7f0f1f21578fc56410b593782f3aacae182a48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 08:51:38 +0200 Subject: [PATCH 03/29] Bump werkzeug from 3.0.1 to 3.0.3 (#570) Bumps [werkzeug](https://github.com/pallets/werkzeug) from 3.0.1 to 3.0.3. - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/3.0.1...3.0.3) --- updated-dependencies: - dependency-name: werkzeug dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 64d65d07e..80ed6f4c9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3889,13 +3889,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "werkzeug" -version = "3.0.1" +version = "3.0.3" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, + {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, ] [package.dependencies] From a05fcd5963fd5135e799b408ff7094ae8d95eac5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 08:52:55 +0200 Subject: [PATCH 04/29] Bump jinja2 from 3.1.3 to 3.1.4 (#571) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.3...3.1.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 80ed6f4c9..04501eadb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1095,13 +1095,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] From b2fc3e6d975a47a9d2897aad4cf8cf8bcb8244bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 09:14:52 +0200 Subject: [PATCH 05/29] Bump mlflow from 2.10.1 to 2.12.1 (#575) Bumps [mlflow](https://github.com/mlflow/mlflow) from 2.10.1 to 2.12.1. - [Release notes](https://github.com/mlflow/mlflow/releases) - [Changelog](https://github.com/mlflow/mlflow/blob/master/CHANGELOG.md) - [Commits](https://github.com/mlflow/mlflow/compare/v2.10.1...v2.12.1) --- updated-dependencies: - dependency-name: mlflow dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 138 +++++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 65 deletions(-) diff --git a/poetry.lock b/poetry.lock index 04501eadb..4b48efdc8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -32,6 +32,20 @@ typing-extensions = ">=4" [package.extras] tz = ["backports.zoneinfo"] +[[package]] +name = "aniso8601" +version = "9.0.1" +description = "A library for parsing ISO 8601 strings." +optional = false +python-versions = "*" +files = [ + {file = "aniso8601-9.0.1-py2.py3-none-any.whl", hash = "sha256:1d2b7ef82963909e93c4f24ce48d4de9e66009a21bf1c1e1c85bdd0812fe412f"}, + {file = "aniso8601-9.0.1.tar.gz", hash = "sha256:72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973"}, +] + +[package.extras] +dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] + [[package]] name = "appdirs" version = "1.4.4" @@ -456,26 +470,6 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "databricks-cli" -version = "0.18.0" -description = "A command line interface for Databricks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "databricks-cli-0.18.0.tar.gz", hash = "sha256:87569709eda9af3e9db8047b691e420b5e980c62ef01675575c0d2b9b4211eb7"}, - {file = "databricks_cli-0.18.0-py2.py3-none-any.whl", hash = "sha256:1176a5f42d3e8af4abfc915446fb23abc44513e325c436725f5898cbb9e3384b"}, -] - -[package.dependencies] -click = ">=7.0" -oauthlib = ">=3.1.0" -pyjwt = ">=1.7.0" -requests = ">=2.17.3" -six = ">=1.10.0" -tabulate = ">=0.7.7" -urllib3 = ">=1.26.7,<3" - [[package]] name = "deprecated" version = "1.2.14" @@ -806,6 +800,51 @@ requests-oauthlib = ">=0.7.0" [package.extras] tool = ["click (>=6.0.0)"] +[[package]] +name = "graphene" +version = "3.3" +description = "GraphQL Framework for Python" +optional = false +python-versions = "*" +files = [ + {file = "graphene-3.3-py2.py3-none-any.whl", hash = "sha256:bb3810be33b54cb3e6969506671eb72319e8d7ba0d5ca9c8066472f75bf35a38"}, + {file = "graphene-3.3.tar.gz", hash = "sha256:529bf40c2a698954217d3713c6041d69d3f719ad0080857d7ee31327112446b0"}, +] + +[package.dependencies] +aniso8601 = ">=8,<10" +graphql-core = ">=3.1,<3.3" +graphql-relay = ">=3.1,<3.3" + +[package.extras] +dev = ["black (==22.3.0)", "coveralls (>=3.3,<4)", "flake8 (>=4,<5)", "iso8601 (>=1,<2)", "mock (>=4,<5)", "pytest (>=6,<7)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=3.4,<4)", "pytest-cov (>=3,<4)", "pytest-mock (>=3,<4)", "pytz (==2022.1)", "snapshottest (>=0.6,<1)"] +test = ["coveralls (>=3.3,<4)", "iso8601 (>=1,<2)", "mock (>=4,<5)", "pytest (>=6,<7)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=3.4,<4)", "pytest-cov (>=3,<4)", "pytest-mock (>=3,<4)", "pytz (==2022.1)", "snapshottest (>=0.6,<1)"] + +[[package]] +name = "graphql-core" +version = "3.2.3" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] + +[[package]] +name = "graphql-relay" +version = "3.2.0" +description = "Relay library for graphql-core" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c"}, + {file = "graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5"}, +] + +[package.dependencies] +graphql-core = ">=3.2,<3.3" + [[package]] name = "greenlet" version = "3.0.3" @@ -1635,25 +1674,25 @@ files = [ [[package]] name = "mlflow" -version = "2.10.1" -description = "MLflow: A Platform for ML Development and Productionization" +version = "2.12.2" +description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = false python-versions = ">=3.8" files = [ - {file = "mlflow-2.10.1-py3-none-any.whl", hash = "sha256:3dddb8a011ab3671d0c6da806549fdc84d39eb853b1bc29e8b3df50115ba5b6c"}, - {file = "mlflow-2.10.1.tar.gz", hash = "sha256:d534e658a979517f56478fc7f0b1a19451700078a725242e789fe63c87d46815"}, + {file = "mlflow-2.12.2-py3-none-any.whl", hash = "sha256:38dd04710fe64ee8229b7233b4d91db32c3ff887934c40d926246a566c886c0b"}, + {file = "mlflow-2.12.2.tar.gz", hash = "sha256:d712f1af9d44f1eb9e1baee8ca64f7311e185b7572fc3c1e0a83a4c8ceff6aad"}, ] [package.dependencies] alembic = "<1.10.0 || >1.10.0,<2" click = ">=7.0,<9" cloudpickle = "<4" -databricks-cli = ">=0.8.7,<1" docker = ">=4.0.0,<8" entrypoints = "<1" Flask = "<4" -gitpython = ">=2.1.0,<4" -gunicorn = {version = "<22", markers = "platform_system != \"Windows\""} +gitpython = ">=3.1.9,<4" +graphene = "<4" +gunicorn = {version = "<23", markers = "platform_system != \"Windows\""} importlib-metadata = ">=3.7.0,<4.7.0 || >4.7.0,<8" Jinja2 = [ {version = ">=2.11,<4", markers = "platform_system != \"Windows\""}, @@ -1662,11 +1701,11 @@ Jinja2 = [ markdown = ">=3.3,<4" matplotlib = "<4" numpy = "<2" -packaging = "<24" +packaging = "<25" pandas = "<3" protobuf = ">=3.12.0,<5" pyarrow = ">=4.0.0,<16" -pytz = "<2024" +pytz = "<2025" pyyaml = ">=5.1,<7" querystring-parser = "<2" requests = ">=2.17.3,<3" @@ -1674,14 +1713,14 @@ scikit-learn = "<2" scipy = "<2" sqlalchemy = ">=1.4.0,<3" sqlparse = ">=0.4.0,<1" -waitress = {version = "<3", markers = "platform_system == \"Windows\""} +waitress = {version = "<4", markers = "platform_system == \"Windows\""} [package.extras] aliyun-oss = ["aliyunstoreplugin"] -databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore (>1.34)", "google-cloud-storage (>=1.30.0)"] -extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] -gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] +databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "google-cloud-storage (>=1.30.0)"] +extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "mlserver (>=1.2.0,!=1.3.1,<1.4.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<1.4.0)", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] +gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "pydantic (>=1.0,<3)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<1)"] sqlserver = ["mlflow-dbstore"] xethub = ["mlflow-xethub"] @@ -2373,23 +2412,6 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pymdown-extensions" version = "10.7" @@ -3435,20 +3457,6 @@ files = [ [package.dependencies] mpmath = ">=0.19" -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, - {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, -] - -[package.extras] -widechars = ["wcwidth"] - [[package]] name = "tensorboard" version = "2.14.0" From 495d5b9454becba63fb4ba23b1852cc05f210307 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 09:35:45 +0200 Subject: [PATCH 06/29] Bump gunicorn from 21.2.0 to 22.0.0 (#576) Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 21.2.0 to 22.0.0. - [Release notes](https://github.com/benoitc/gunicorn/releases) - [Commits](https://github.com/benoitc/gunicorn/compare/21.2.0...22.0.0) --- updated-dependencies: - dependency-name: gunicorn dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4b48efdc8..2f2b3b9b9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -984,22 +984,23 @@ protobuf = ["grpcio-tools (>=1.60.1)"] [[package]] name = "gunicorn" -version = "21.2.0" +version = "22.0.0" description = "WSGI HTTP Server for UNIX" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, - {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, + {file = "gunicorn-22.0.0-py3-none-any.whl", hash = "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9"}, + {file = "gunicorn-22.0.0.tar.gz", hash = "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"}, ] [package.dependencies] packaging = "*" [package.extras] -eventlet = ["eventlet (>=0.24.1)"] +eventlet = ["eventlet (>=0.24.1,!=0.36.0)"] gevent = ["gevent (>=1.4.0)"] setproctitle = ["setproctitle"] +testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"] tornado = ["tornado (>=0.2)"] [[package]] From bdd102a6e42197a5a416625225798f47bf8314b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 09:14:39 +0200 Subject: [PATCH 07/29] Bump requests from 2.31.0 to 2.32.0 (#578) updated-dependencies: - dependency-name: requests dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2f2b3b9b9..7ff18c8fc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2909,13 +2909,13 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, + {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, ] [package.dependencies] From beccd4cddccee82ea305537489323e1df8237d82 Mon Sep 17 00:00:00 2001 From: Gensollen Date: Wed, 22 May 2024 15:35:13 +0200 Subject: [PATCH 08/29] [CI] Run tests through GitHub Actions (#573) * try a simple workflow first * try running on new ubuntu VM * fixes * bump poetry version to 1.8.3 * try removing caching.. * add workflow for testing tsv tools --- .github/workflows/test_cli.yml | 46 +++++++++++++++++++++++++++ .github/workflows/test_tsvtools.yml | 48 +++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 .github/workflows/test_cli.yml create mode 100644 .github/workflows/test_tsvtools.yml diff --git a/.github/workflows/test_cli.yml b/.github/workflows/test_cli.yml new file mode 100644 index 000000000..d8309b2e1 --- /dev/null +++ b/.github/workflows/test_cli.yml @@ -0,0 +1,46 @@ +name: CLI Tests + +on: + push: + branches: ["dev"] + pull_request: + branches: ["dev"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-cli: + runs-on: + - self-hosted + - Linux + - ubuntu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run CLI tests + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_cli_report.xml \ + --disable-warnings \ + --verbose \ + test_cli.py diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml new file mode 100644 index 000000000..bddbb80d2 --- /dev/null +++ b/.github/workflows/test_tsvtools.yml @@ -0,0 +1,48 @@ +name: TSV Tools Tests + +on: + push: + branches: ["dev"] + pull_request: + branches: ["dev"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-tsvtools: + runs-on: + - self-hosted + - Linux + - ubuntu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for TSV tools + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_tsvtools_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/tmp \ + --input_data_directory=/mnt/data/data_ci \ + test_tsvtools.py From 2861e9d8da889f7546be9776e1a496bb8cd83e61 Mon Sep 17 00:00:00 2001 From: Gensollen Date: Thu, 23 May 2024 14:22:24 +0200 Subject: [PATCH 09/29] [CI] Skip tests when PR is in draft mode (#592) * try skipping test_tsvtools when PR is in draft mode * trigger CI * add a cpu tag to avoid running cpu tests on gpu machines * run also on refactoring branch --- .github/workflows/test_cli.yml | 6 ++++-- .github/workflows/test_tsvtools.yml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_cli.yml b/.github/workflows/test_cli.yml index d8309b2e1..750f1cd00 100644 --- a/.github/workflows/test_cli.yml +++ b/.github/workflows/test_cli.yml @@ -2,9 +2,9 @@ name: CLI Tests on: push: - branches: ["dev"] + branches: ["dev", "refactoring"] pull_request: - branches: ["dev"] + branches: ["dev", "refactoring"] permissions: contents: read @@ -19,10 +19,12 @@ env: jobs: test-cli: + if: github.event.pull_request.draft == false runs-on: - self-hosted - Linux - ubuntu + - cpu steps: - uses: actions/checkout@v4 - uses: snok/install-poetry@v1 diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml index bddbb80d2..5a8c7896a 100644 --- a/.github/workflows/test_tsvtools.yml +++ b/.github/workflows/test_tsvtools.yml @@ -2,9 +2,9 @@ name: TSV Tools Tests on: push: - branches: ["dev"] + branches: ["dev", "refactoring"] pull_request: - branches: ["dev"] + branches: ["dev", "refactoring"] permissions: contents: read @@ -19,10 +19,12 @@ env: jobs: test-tsvtools: + if: github.event.pull_request.draft == false runs-on: - self-hosted - Linux - ubuntu + - cpu steps: - uses: actions/checkout@v4 - uses: snok/install-poetry@v1 From f5de25105e2db3e87619b7782eb6873a0066c3c6 Mon Sep 17 00:00:00 2001 From: Gensollen Date: Thu, 23 May 2024 14:28:57 +0200 Subject: [PATCH 10/29] [CI] Test train workflow on GPU machine (#590) * add test workflow on GPU for train * fix conda path * fix conflicting workdir * only run on non-draft PRs * run also on refactoring branch --- .github/workflows/test_train.yml | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/test_train.yml diff --git a/.github/workflows/test_train.yml b/.github/workflows/test_train.yml new file mode 100644 index 000000000..a65a92a56 --- /dev/null +++ b/.github/workflows/test_train.yml @@ -0,0 +1,53 @@ +name: Train Tests (GPU) + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-train-gpu: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - gpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for Train on GPU + run: | + make env.conda + source "${HOME}/miniconda3/etc/profile.d/conda.sh" + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_train_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/actions_runner_workdir/train \ + --input_data_directory=/mnt/data/clinicadl_data_ci/data_ci \ + -k test_train + - name: Cleaning + run: | + rm -rf $HOME/actions_runner_workdir/train/* From 69b3538d5397c94e0c3b7e306648ca1dd0720b7a Mon Sep 17 00:00:00 2001 From: Gensollen Date: Thu, 23 May 2024 15:51:54 +0200 Subject: [PATCH 11/29] [CI] Port remaining GPU tests to GitHub Actions (#593) * add workflow for testing interpretation task * add workflow for testing random search task * add workflow for testing resume task * add workflow for testing transfer learning task * trigger CI * trigger CI --- .github/workflows/test_interpret.yml | 53 ++++++++++++++++++++ .github/workflows/test_random_search.yml | 53 ++++++++++++++++++++ .github/workflows/test_resume.yml | 53 ++++++++++++++++++++ .github/workflows/test_transfer_learning.yml | 53 ++++++++++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 .github/workflows/test_interpret.yml create mode 100644 .github/workflows/test_random_search.yml create mode 100644 .github/workflows/test_resume.yml create mode 100644 .github/workflows/test_transfer_learning.yml diff --git a/.github/workflows/test_interpret.yml b/.github/workflows/test_interpret.yml new file mode 100644 index 000000000..0163bf583 --- /dev/null +++ b/.github/workflows/test_interpret.yml @@ -0,0 +1,53 @@ +name: Interpretation Tests (GPU) + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-interpret-gpu: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - gpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for Interpret task on GPU + run: | + make env.conda + source "${HOME}/miniconda3/etc/profile.d/conda.sh" + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_interpret_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/actions_runner_workdir/interpret \ + --input_data_directory=/mnt/data/clinicadl_data_ci/data_ci \ + test_interpret.py + - name: Cleaning + run: | + rm -rf $HOME/actions_runner_workdir/interpret/* diff --git a/.github/workflows/test_random_search.yml b/.github/workflows/test_random_search.yml new file mode 100644 index 000000000..529f1fda1 --- /dev/null +++ b/.github/workflows/test_random_search.yml @@ -0,0 +1,53 @@ +name: Random Search Tests (GPU) + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-random-search-gpu: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - gpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run Random Search tests on GPU + run: | + make env.conda + source "${HOME}/miniconda3/etc/profile.d/conda.sh" + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_random_search_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/actions_runner_workdir/random_search \ + --input_data_directory=/mnt/data/clinicadl_data_ci/data_ci \ + test_random_search.py + - name: Cleaning + run: | + rm -rf $HOME/actions_runner_workdir/random_search/* diff --git a/.github/workflows/test_resume.yml b/.github/workflows/test_resume.yml new file mode 100644 index 000000000..b789a21f6 --- /dev/null +++ b/.github/workflows/test_resume.yml @@ -0,0 +1,53 @@ +name: Resume Tests (GPU) + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-resume-gpu: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - gpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run resume tests on GPU + run: | + make env.conda + source "${HOME}/miniconda3/etc/profile.d/conda.sh" + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_resume_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/actions_runner_workdir/resume \ + --input_data_directory=/mnt/data/clinicadl_data_ci/data_ci \ + test_resume.py + - name: Cleaning + run: | + rm -rf $HOME/actions_runner_workdir/resume/* diff --git a/.github/workflows/test_transfer_learning.yml b/.github/workflows/test_transfer_learning.yml new file mode 100644 index 000000000..61238d4e1 --- /dev/null +++ b/.github/workflows/test_transfer_learning.yml @@ -0,0 +1,53 @@ +name: Transfer Learning Tests (GPU) + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-transfer-learning-gpu: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - gpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for Transfer Learning on GPU + run: | + make env.conda + source "${HOME}/miniconda3/etc/profile.d/conda.sh" + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_transfer_learning_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/actions_runner_workdir/transfer_learning \ + --input_data_directory=/mnt/data/clinicadl_data_ci/data_ci \ + test_transfer_learning.py + - name: Cleaning + run: | + rm -rf $HOME/actions_runner_workdir/transfer_learning/* From c9d9252ae4436a7a17d8812fdea97f2b01e0c0cb Mon Sep 17 00:00:00 2001 From: Gensollen Date: Fri, 24 May 2024 09:43:01 +0200 Subject: [PATCH 12/29] [CI] Remove GPU pipeline from Jenkinsfile (#594) --- .jenkins/Jenkinsfile | 207 ------------------------------------------- 1 file changed, 207 deletions(-) diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index f7bd3dafb..033182681 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -252,214 +252,7 @@ pipeline { } } } - stage('GPU') { - agent { - label 'gpu' - } - environment { - CONDA_HOME = "$HOME/miniconda3" - CONDA_ENV = "$WORKSPACE/env" - PATH = "$HOME/.local/bin:$PATH" - TMP_DIR = "$HOME/tmp" - INPUT_DATA_DIR = '/mnt/data/clinicadl_data_ci/data_ci' - } - stages { - stage('Build Env') { - steps { - echo 'Installing clinicadl sources in Linux...' - echo "My branch name is ${BRANCH_NAME}" - sh "echo 'My branch name is ${BRANCH_NAME}'" - sh 'printenv' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - source "${CONDA_HOME}/etc/profile.d/conda.sh" - make env.conda - conda activate "${CONDA_ENV}" - conda info - echo "Install clinicadl using poetry..." - cd $WORKSPACE - make env - # Show clinicadl help message - echo "Display clinicadl help message" - clinicadl --help - conda deactivate - ''' - } - } - stage('Train tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing train task...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - clinicadl --help - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_train_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - -k "test_train" - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_train_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Transfer learning tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing transfer learning...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - clinicadl --help - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_transfer_learning_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_transfer_learning.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_transfer_learning_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Resume tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing resume...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - clinicadl --help - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_resume_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_resume.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_resume_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Interpretation tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing interpret task...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - set +x - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - clinicadl --help - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_interpret_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_interpret.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_interpret_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Random search tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing random search...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh '''#!/usr/bin/env bash - set +x - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - clinicadl --help - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_random_search_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_random_search.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_random_search_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - } - post { - // Clean after build - cleanup { - cleanWs(deleteDirs: true, - notFailBuild: true, - patterns: [[pattern: 'env', type: 'INCLUDE']]) - } - } - } } } } -// post { -// failure { -// mail to: 'clinicadl-ci@inria.fr', -// subject: "Failed Pipeline: ${currentBuild.fullDisplayName}", -// body: "Something is wrong with ${env.BUILD_URL}" -// mattermostSend( -// color: "#FF0000", -// message: "ClinicaDL Build FAILED: ${env.JOB_NAME} #${env.BUILD_NUMBER} (<${env.BUILD_URL}|Link to build>)" -// ) -// } -// } } From 753f04e49e266ec3767cd91bcefda18370718fec Mon Sep 17 00:00:00 2001 From: Gensollen Date: Fri, 24 May 2024 12:06:06 +0200 Subject: [PATCH 13/29] [CI] Port remaining non GPU tests to GitHub Actions (#581) * add cleaning step to test_tsvtools pipeline * add test_generate pipeline * add test_predict pipeline * add test_prepare_data pipeline * add test_quality_checks pipeline * add refactoring target branch, cpu tag, and draft PR filter * trigger CI --- .github/workflows/test_generate.yml | 53 +++++++++++++++++++++++ .github/workflows/test_predict.yml | 53 +++++++++++++++++++++++ .github/workflows/test_prepare_data.yml | 53 +++++++++++++++++++++++ .github/workflows/test_quality_checks.yml | 53 +++++++++++++++++++++++ .github/workflows/test_tsvtools.yml | 5 ++- 5 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/test_generate.yml create mode 100644 .github/workflows/test_predict.yml create mode 100644 .github/workflows/test_prepare_data.yml create mode 100644 .github/workflows/test_quality_checks.yml diff --git a/.github/workflows/test_generate.yml b/.github/workflows/test_generate.yml new file mode 100644 index 000000000..51ac863b2 --- /dev/null +++ b/.github/workflows/test_generate.yml @@ -0,0 +1,53 @@ +name: Generate Tests + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-generate: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - cpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for generate task + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_generate_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/tmp/generate \ + --input_data_directory=/mnt/data/data_ci \ + test_generate.py + - name: Cleaning + run: | + rm -rf $HOME/tmp/generate diff --git a/.github/workflows/test_predict.yml b/.github/workflows/test_predict.yml new file mode 100644 index 000000000..8ec5976e4 --- /dev/null +++ b/.github/workflows/test_predict.yml @@ -0,0 +1,53 @@ +name: Predict Tests + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-predict: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - cpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for predict task + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_predict_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/tmp/predict \ + --input_data_directory=/mnt/data/data_ci \ + test_predict.py + - name: Cleaning + run: | + rm -rf $HOME/tmp/predict/* diff --git a/.github/workflows/test_prepare_data.yml b/.github/workflows/test_prepare_data.yml new file mode 100644 index 000000000..8dccd217f --- /dev/null +++ b/.github/workflows/test_prepare_data.yml @@ -0,0 +1,53 @@ +name: Prepare data Tests + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-prepare-data: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - cpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for prepare data task + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_prepare_data_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/tmp/prepare_data \ + --input_data_directory=/mnt/data/data_ci \ + test_prepare_data.py + - name: Cleaning + run: | + rm -rf $HOME/tmp/prepare_data/* diff --git a/.github/workflows/test_quality_checks.yml b/.github/workflows/test_quality_checks.yml new file mode 100644 index 000000000..1cf0414e2 --- /dev/null +++ b/.github/workflows/test_quality_checks.yml @@ -0,0 +1,53 @@ +name: Quality Check Tests + +on: + push: + branches: ["dev", "refactoring"] + pull_request: + branches: ["dev", "refactoring"] + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +env: + POETRY_VERSION: '1.8.3' + PYTHON_VERSION: '3.11' + +jobs: + test-quality-check: + if: github.event.pull_request.draft == false + runs-on: + - self-hosted + - Linux + - ubuntu + - cpu + steps: + - uses: actions/checkout@v4 + - uses: snok/install-poetry@v1 + with: + version: ${{ env.POETRY_VERSION }} + virtualenvs-create: false + - uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Run tests for Quality Check + run: | + make env.conda + source /builds/miniconda3/etc/profile.d/conda.sh + conda activate "${{ github.workspace }}"/env + make install + cd tests + poetry run pytest --verbose \ + --junitxml=./test-reports/test_quality_check_report.xml \ + --disable-warnings \ + --verbose \ + --basetemp=$HOME/tmp/quality_checks \ + --input_data_directory=/mnt/data/data_ci \ + test_qc.py + - name: Cleaning + run: | + rm -rf $HOME/tmp/quality_checks/* diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml index 5a8c7896a..811c6d4f4 100644 --- a/.github/workflows/test_tsvtools.yml +++ b/.github/workflows/test_tsvtools.yml @@ -45,6 +45,9 @@ jobs: --junitxml=./test-reports/test_tsvtools_report.xml \ --disable-warnings \ --verbose \ - --basetemp=$HOME/tmp \ + --basetemp=$HOME/tmp/tsv_tools \ --input_data_directory=/mnt/data/data_ci \ test_tsvtools.py + - name: Cleaning + run: | + rm -rf $HOME/tmp/tsv_tools/* From c424d77f2273966d89571f5c9a0da08fffc5dff4 Mon Sep 17 00:00:00 2001 From: Gensollen Date: Fri, 24 May 2024 13:07:56 +0200 Subject: [PATCH 14/29] [CI] Remove jenkins related things (#595) --- .jenkins/Jenkinsfile | 258 ---------------------------- .jenkins/scripts/find_env.sh | 39 ----- .jenkins/scripts/generate_wheels.sh | 31 ---- 3 files changed, 328 deletions(-) delete mode 100644 .jenkins/Jenkinsfile delete mode 100755 .jenkins/scripts/find_env.sh delete mode 100755 .jenkins/scripts/generate_wheels.sh diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile deleted file mode 100644 index 033182681..000000000 --- a/.jenkins/Jenkinsfile +++ /dev/null @@ -1,258 +0,0 @@ -#!/usr/bin/env groovy - -// Continuous Integration script for clinicadl -// Author: mauricio.diaz@inria.fr - -pipeline { - options { - timeout(time: 1, unit: 'HOURS') - disableConcurrentBuilds(abortPrevious: true) - } - agent none - stages { - stage('Functional tests') { - failFast false - parallel { - stage('No GPU') { - agent { - label 'cpu' - } - environment { - CONDA_HOME = "$HOME/miniconda" - CONDA_ENV = "$WORKSPACE/env" - PATH = "$HOME/.local/bin:$PATH" - TMP_DIR = "$HOME/tmp" - INPUT_DATA_DIR = '/mnt/data/clinicadl_data_ci/data_ci' - } - stages { - stage('Build Env') { - steps { - echo 'Installing clinicadl sources in Linux...' - echo "My branch name is ${BRANCH_NAME}" - sh "echo 'My branch name is ${BRANCH_NAME}'" - sh 'printenv' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - set +x - source "${CONDA_HOME}/etc/profile.d/conda.sh" - make env.conda - conda activate "${CONDA_ENV}" - conda info - echo "Install clinicadl using poetry..." - cd $WORKSPACE - make env - # Show clinicadl help message - echo "Display clinicadl help message" - clinicadl --help - conda deactivate - ''' - } - } - stage('CLI tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing pipeline instantiation...' - sh 'echo "Agent name: ${NODE_NAME}"' - sh ''' - set +x - echo $WORKSPACE - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - conda list - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_cli_report.xml \ - --verbose \ - --disable-warnings \ - test_cli.py - conda deactivate - ''' - } - } - } - stage('tsvtools tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing tsvtool tasks...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_tsvtool_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_tsvtools.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_tsvtool_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Quality check tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing quality check tasks...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_quality_check_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_qc.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_quality_check_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Generate tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing generate task...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_generate_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_generate.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_generate_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Prepare data tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing prepare_data task...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_prepare_data_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_prepare_data.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_prepare_data_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - stage('Predict tests Linux') { - steps { - catchError(buildResult: 'FAILURE', stageResult: 'UNSTABLE') { - echo 'Testing predict...' - sh "echo 'Agent name: ${NODE_NAME}'" - sh ''' - source "${CONDA_HOME}/etc/profile.d/conda.sh" - conda activate "${CONDA_ENV}" - cd $WORKSPACE/tests - poetry run pytest \ - --junitxml=./test-reports/test_predict_report.xml \ - --verbose \ - --disable-warnings \ - --basetemp=$TMP_DIR \ - --input_data_directory=$INPUT_DATA_DIR \ - test_predict.py - conda deactivate - ''' - } - } - post { - always { - junit 'tests/test-reports/test_predict_report.xml' - } - success { - sh 'rm -rf ${TMP_DIR}/*' - } - } - } - // stage('Meta-maps analysis') { - // environment { - // PATH = "$HOME/miniconda3/bin:$HOME/miniconda/bin:$PATH" - // } - // steps { - // echo 'Testing maps-analysis task...' - // sh 'echo "Agent name: ${NODE_NAME}"' - // sh '''#!/usr/bin/env bash - // set +x - // eval "$(conda shell.bash hook)" - // conda activate "${WORKSPACE}/env" - // cd $WORKSPACE/tests - // pytest \ - // --junitxml=./test-reports/test_meta-analysis_report.xml \ - // --verbose \ - // --disable-warnings \ - // test_meta_maps.py - // conda deactivate - // ''' - // } - // post { - // always { - // junit 'tests/test-reports/test_meta-analysis_report.xml' - // sh 'rm -rf $WORKSPACE/tests/data/dataset' - // } - // } - // } - } - post { - // Clean after build - cleanup { - cleanWs(deleteDirs: true, - notFailBuild: true, - patterns: [[pattern: 'env', type: 'INCLUDE']]) - } - } - } - } - } - } -} diff --git a/.jenkins/scripts/find_env.sh b/.jenkins/scripts/find_env.sh deleted file mode 100755 index a68fff821..000000000 --- a/.jenkins/scripts/find_env.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# A shell script to launch clinica in CI machines - -# Name of the Conda environment according to the branch -CLINICA_ENV_BRANCH="clinicadl_test" - -set -e -set +x - -ENV_EXISTS=0 -# Verify that the conda environment corresponding to the branch exists, otherwise -# create it. -ENVS=$(conda env list | awk '{print $1}' ) -echo $ENVS - -for ENV in $ENVS -do - if [[ "$ENV " == *"$CLINICA_ENV_BRANCH "* ]] - then - echo "Find Conda environment named $ENV, continue." - conda activate $CLINICA_ENV_BRANCH - cd $WORKSPACE/ - poetry install - conda deactivate - ENV_EXISTS=1 - break - fi; -done -if [ "$ENV_EXISTS" = 0 ]; then - echo "Conda env $CLINICA_ENV_BRANCH not found... Creating" - conda create -y -f environment.yml - echo "Conda env $CLINICA_ENV_BRANCH was created." - conda activate $CLINICA_ENV_BRANCH - cd $WORKSPACE/ - poetry install - echo "ClinicaDL has been installed in $CLINICA_ENV_BRANCH." - conda deactivate - cd $WORKSPACE -fi diff --git a/.jenkins/scripts/generate_wheels.sh b/.jenkins/scripts/generate_wheels.sh deleted file mode 100755 index 326d55074..000000000 --- a/.jenkins/scripts/generate_wheels.sh +++ /dev/null @@ -1,31 +0,0 @@ -#! /bin/sh - -#--------------------------------------# -# ClinicaDL package creations ( wheel) -#--------------------------------------# -# -# WARNING: Activate a conda environment with the right pip version. -# Use at your own risk. - - -CURRENT_DIR=$(pwd) -echo $CURRENT_DIR - -# ensure we are in the right dir -SCRIPT_DIR=`(dirname $0)` -cd "$SCRIPT_DIR" -echo "Entering ${SCRIPT_DIR}/../../" -cd "${SCRIPT_DIR}/../../" -ls - -# clean pycache stuff -rm -rf dist build clinicadl.egg-info/ -find -name "*__pycache__*" -exec rm {} \-rf \; -find -name "*.pyc*" -exec rm {} \-rf \; - -set -o errexit -set -e -# generate wheel -poetry build -# come back to directory of -cd $CURRENT_DIR From 52d7561f8b6aab078d6ef2c33a6a9b97ad3e852f Mon Sep 17 00:00:00 2001 From: thibaultdvx <154365476+thibaultdvx@users.noreply.github.com> Date: Thu, 30 May 2024 11:34:05 +0200 Subject: [PATCH 15/29] Add flags to run CI tests locally (#596) --- tests/conftest.py | 19 +++++++++++++++++++ tests/test_train_ae.py | 14 ++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 7251b5b8f..e5a4a7302 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,10 +14,29 @@ def pytest_addoption(parser): action="store", help="Directory for (only-read) inputs for tests", ) + parser.addoption( + "--no-gpu", + action="store_true", + help="""To run tests on cpu. Default is False. + To use carefully, only to run tests locally. Should not be used in final CI tests. + Concretely, the tests won't fail if gpu option is false in the output MAPS whereas + it is true in the reference MAPS.""", + ) + parser.addoption( + "--adapt-base-dir", + action="store_true", + help="""To virtually change the base directory in the paths stored in the MAPS of the CI data. + Default is False. + To use carefully, only to run tests locally. Should not be used in final CI tests. + Concretely, the tests won't fail if only the base directories differ in the paths stored + in the output and reference MAPS.""", + ) @pytest.fixture def cmdopt(request): config_param = {} config_param["input"] = request.config.getoption("--input_data_directory") + config_param["no-gpu"] = request.config.getoption("--no-gpu") + config_param["adapt-base-dir"] = request.config.getoption("--adapt-base-dir") return config_param diff --git a/tests/test_train_ae.py b/tests/test_train_ae.py index ab9c057ff..311e145d0 100644 --- a/tests/test_train_ae.py +++ b/tests/test_train_ae.py @@ -88,6 +88,9 @@ def test_train_ae(cmdopt, tmp_path, test_name): else: raise NotImplementedError(f"Test {test_name} is not implemented.") + if cmdopt["no-gpu"]: + test_input.append("--no-gpu") + if tmp_out_dir.is_dir(): shutil.rmtree(tmp_out_dir) @@ -101,6 +104,17 @@ def test_train_ae(cmdopt, tmp_path, test_name): if test_name == "patch_multi_ae": json_data_out["multi_network"] = True + if cmdopt["no-gpu"]: + json_data_ref["gpu"] = False + if cmdopt["adapt-base-dir"]: + base_dir = base_dir.resolve() + ref_base_dir = Path(json_data_ref["caps_directory"]).parents[2] + json_data_ref["caps_directory"] = str( + base_dir / Path(json_data_ref["caps_directory"]).relative_to(ref_base_dir) + ) + json_data_ref["tsv_path"] = str( + base_dir / Path(json_data_ref["tsv_path"]).relative_to(ref_base_dir) + ) assert json_data_out == json_data_ref # ["mode"] == mode assert compare_folders( From 39d22fddbdf613ea1b793e6593d8b84d4440db0a Mon Sep 17 00:00:00 2001 From: Gensollen Date: Thu, 30 May 2024 13:43:39 +0200 Subject: [PATCH 16/29] [CI] Remove duplicated verbose flag in test pipelines (#598) --- .github/workflows/test_cli.yml | 2 +- .github/workflows/test_generate.yml | 2 +- .github/workflows/test_interpret.yml | 2 +- .github/workflows/test_predict.yml | 2 +- .github/workflows/test_prepare_data.yml | 2 +- .github/workflows/test_quality_checks.yml | 2 +- .github/workflows/test_random_search.yml | 2 +- .github/workflows/test_resume.yml | 2 +- .github/workflows/test_train.yml | 2 +- .github/workflows/test_transfer_learning.yml | 2 +- .github/workflows/test_tsvtools.yml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test_cli.yml b/.github/workflows/test_cli.yml index 750f1cd00..802511c9d 100644 --- a/.github/workflows/test_cli.yml +++ b/.github/workflows/test_cli.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_cli_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_generate.yml b/.github/workflows/test_generate.yml index 51ac863b2..e0149760f 100644 --- a/.github/workflows/test_generate.yml +++ b/.github/workflows/test_generate.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_generate_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_interpret.yml b/.github/workflows/test_interpret.yml index 0163bf583..7cfd9d56b 100644 --- a/.github/workflows/test_interpret.yml +++ b/.github/workflows/test_interpret.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_interpret_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_predict.yml b/.github/workflows/test_predict.yml index 8ec5976e4..f12740dac 100644 --- a/.github/workflows/test_predict.yml +++ b/.github/workflows/test_predict.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_predict_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_prepare_data.yml b/.github/workflows/test_prepare_data.yml index 8dccd217f..8209b9fa2 100644 --- a/.github/workflows/test_prepare_data.yml +++ b/.github/workflows/test_prepare_data.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_prepare_data_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_quality_checks.yml b/.github/workflows/test_quality_checks.yml index 1cf0414e2..701460266 100644 --- a/.github/workflows/test_quality_checks.yml +++ b/.github/workflows/test_quality_checks.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_quality_check_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_random_search.yml b/.github/workflows/test_random_search.yml index 529f1fda1..314afc353 100644 --- a/.github/workflows/test_random_search.yml +++ b/.github/workflows/test_random_search.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_random_search_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_resume.yml b/.github/workflows/test_resume.yml index b789a21f6..78a229913 100644 --- a/.github/workflows/test_resume.yml +++ b/.github/workflows/test_resume.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_resume_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_train.yml b/.github/workflows/test_train.yml index a65a92a56..599725225 100644 --- a/.github/workflows/test_train.yml +++ b/.github/workflows/test_train.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_train_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_transfer_learning.yml b/.github/workflows/test_transfer_learning.yml index 61238d4e1..4664a97a3 100644 --- a/.github/workflows/test_transfer_learning.yml +++ b/.github/workflows/test_transfer_learning.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_transfer_learning_report.xml \ --disable-warnings \ --verbose \ diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml index 811c6d4f4..9f3bfeb02 100644 --- a/.github/workflows/test_tsvtools.yml +++ b/.github/workflows/test_tsvtools.yml @@ -41,7 +41,7 @@ jobs: conda activate "${{ github.workspace }}"/env make install cd tests - poetry run pytest --verbose \ + poetry run pytest \ --junitxml=./test-reports/test_tsvtools_report.xml \ --disable-warnings \ --verbose \ From 571662c4598101fd969158b1d337ff5046974a1d Mon Sep 17 00:00:00 2001 From: Gensollen Date: Thu, 30 May 2024 15:54:16 +0200 Subject: [PATCH 17/29] [DOC] Update the Python version used for creating the conda environment in README (#600) * update python version used for creating conda env in README * investigate * fix --- .github/workflows/test_cli.yml | 2 +- .github/workflows/test_generate.yml | 2 +- .github/workflows/test_interpret.yml | 2 +- .github/workflows/test_predict.yml | 2 +- .github/workflows/test_prepare_data.yml | 2 +- .github/workflows/test_quality_checks.yml | 2 +- .github/workflows/test_random_search.yml | 2 +- .github/workflows/test_resume.yml | 2 +- .github/workflows/test_train.yml | 2 +- .github/workflows/test_transfer_learning.yml | 2 +- .github/workflows/test_tsvtools.yml | 2 +- README.md | 19 +++++++++---------- 12 files changed, 20 insertions(+), 21 deletions(-) diff --git a/.github/workflows/test_cli.yml b/.github/workflows/test_cli.yml index 802511c9d..4efd2b024 100644 --- a/.github/workflows/test_cli.yml +++ b/.github/workflows/test_cli.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run CLI tests run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_generate.yml b/.github/workflows/test_generate.yml index e0149760f..8fc54c025 100644 --- a/.github/workflows/test_generate.yml +++ b/.github/workflows/test_generate.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for generate task run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_interpret.yml b/.github/workflows/test_interpret.yml index 7cfd9d56b..13db354a9 100644 --- a/.github/workflows/test_interpret.yml +++ b/.github/workflows/test_interpret.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for Interpret task on GPU run: | - make env.conda source "${HOME}/miniconda3/etc/profile.d/conda.sh" + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_predict.yml b/.github/workflows/test_predict.yml index f12740dac..e6d790b2a 100644 --- a/.github/workflows/test_predict.yml +++ b/.github/workflows/test_predict.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for predict task run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_prepare_data.yml b/.github/workflows/test_prepare_data.yml index 8209b9fa2..753634f76 100644 --- a/.github/workflows/test_prepare_data.yml +++ b/.github/workflows/test_prepare_data.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for prepare data task run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_quality_checks.yml b/.github/workflows/test_quality_checks.yml index 701460266..25d1bc752 100644 --- a/.github/workflows/test_quality_checks.yml +++ b/.github/workflows/test_quality_checks.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for Quality Check run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_random_search.yml b/.github/workflows/test_random_search.yml index 314afc353..78ddc2df0 100644 --- a/.github/workflows/test_random_search.yml +++ b/.github/workflows/test_random_search.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run Random Search tests on GPU run: | - make env.conda source "${HOME}/miniconda3/etc/profile.d/conda.sh" + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_resume.yml b/.github/workflows/test_resume.yml index 78a229913..6d145339b 100644 --- a/.github/workflows/test_resume.yml +++ b/.github/workflows/test_resume.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run resume tests on GPU run: | - make env.conda source "${HOME}/miniconda3/etc/profile.d/conda.sh" + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_train.yml b/.github/workflows/test_train.yml index 599725225..b3852bb09 100644 --- a/.github/workflows/test_train.yml +++ b/.github/workflows/test_train.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for Train on GPU run: | - make env.conda source "${HOME}/miniconda3/etc/profile.d/conda.sh" + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_transfer_learning.yml b/.github/workflows/test_transfer_learning.yml index 4664a97a3..9a3a583a3 100644 --- a/.github/workflows/test_transfer_learning.yml +++ b/.github/workflows/test_transfer_learning.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for Transfer Learning on GPU run: | - make env.conda source "${HOME}/miniconda3/etc/profile.d/conda.sh" + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml index 9f3bfeb02..9e388b8e7 100644 --- a/.github/workflows/test_tsvtools.yml +++ b/.github/workflows/test_tsvtools.yml @@ -36,8 +36,8 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Run tests for TSV tools run: | - make env.conda source /builds/miniconda3/etc/profile.d/conda.sh + make env.conda conda activate "${{ github.workspace }}"/env make install cd tests diff --git a/README.md b/README.md index 05b5f3a09..dae486a72 100755 --- a/README.md +++ b/README.md @@ -33,34 +33,33 @@ ## About the project This repository hosts ClinicaDL, the deep learning extension of [Clinica](https://github.com/aramis-lab/clinica), -a python library to process neuroimaging data in [BIDS](https://bids.neuroimaging.io/index.html) format. +a Python library to process neuroimaging data in [BIDS](https://bids.neuroimaging.io/index.html) format. > **Disclaimer:** this software is **under development**. Some features can change between different releases and/or commits. -To access the full documentation of the project, follow the link -[https://clinicadl.readthedocs.io/](https://clinicadl.readthedocs.io/). +To access the full documentation of the project, follow the link [https://clinicadl.readthedocs.io/](https://clinicadl.readthedocs.io/). If you find a problem when using it or if you want to provide us feedback, please [open an issue](https://github.com/aramis-lab/ad-dl/issues) or write on the [forum](https://groups.google.com/forum/#!forum/clinica-user). ## Getting started + ClinicaDL currently supports macOS and Linux. We recommend to use `conda` or `virtualenv` for the installation of ClinicaDL -as it guarantees the correct management of libraries depending on common -packages: +as it guarantees the correct management of libraries depending on common packages: ```{.sourceCode .bash} -conda create --name ClinicaDL python=3.8 +conda create --name ClinicaDL python=3.10 conda activate ClinicaDL pip install clinicadl ``` -## Tutorial -Visit our [hands-on tutorial web -site](https://aramislab.paris.inria.fr/clinicadl/tuto) to start -using **ClinicaDL** directly in a Google Colab instance! +## Tutorial + +Visit our [hands-on tutorial web site](https://aramislab.paris.inria.fr/clinicadl/tuto) +to start using **ClinicaDL** directly in a Google Colab instance! ## Related Repositories From d54d59cfd1bc954ff026cf2cbba9a0ba9647c4ea Mon Sep 17 00:00:00 2001 From: thibaultdvx <154365476+thibaultdvx@users.noreply.github.com> Date: Fri, 31 May 2024 13:38:12 +0200 Subject: [PATCH 18/29] Flag for local tests (#608) * add no-gpu and adapt-base-dir flag --- tests/test_interpret.py | 3 ++ tests/test_random_search.py | 12 ++++--- tests/test_resume.py | 26 ++++++++++++-- tests/test_train_ae.py | 25 +++++-------- tests/test_train_cnn.py | 13 +++++-- tests/test_train_from_json.py | 28 ++++++++++----- tests/test_transfer_learning.py | 42 +++++++++++++++------- tests/testing_tools.py | 62 ++++++++++++++++++++++++++++++++- 8 files changed, 164 insertions(+), 47 deletions(-) diff --git a/tests/test_interpret.py b/tests/test_interpret.py index 8030e4c98..d84147e97 100644 --- a/tests/test_interpret.py +++ b/tests/test_interpret.py @@ -61,6 +61,9 @@ def test_interpret(cmdopt, tmp_path, test_name): else: raise NotImplementedError(f"Test {test_name} is not implemented.") + if cmdopt["no-gpu"]: + cnn_input.append("--no-gpu") + run_interpret(cnn_input, tmp_out_dir, ref_dir) diff --git a/tests/test_random_search.py b/tests/test_random_search.py index e1c530513..5b68787e8 100644 --- a/tests/test_random_search.py +++ b/tests/test_random_search.py @@ -1,6 +1,5 @@ # coding: utf8 -import json import os import shutil from os.path import join @@ -8,7 +7,7 @@ import pytest -from tests.testing_tools import compare_folders +from .testing_tools import change_gpu_in_toml, compare_folders # random searxh for ROI with CNN @@ -34,10 +33,12 @@ def test_random_search(cmdopt, tmp_path, test_name): else: raise NotImplementedError(f"Test {test_name} is not implemented.") - run_test_random_search(toml_path, generate_input, tmp_out_dir, ref_dir) + run_test_random_search( + toml_path, generate_input, tmp_out_dir, ref_dir, cmdopt["no-gpu"] + ) -def run_test_random_search(toml_path, generate_input, tmp_out_dir, ref_dir): +def run_test_random_search(toml_path, generate_input, tmp_out_dir, ref_dir, no_gpu): if os.path.exists(tmp_out_dir): shutil.rmtree(tmp_out_dir) @@ -45,6 +46,9 @@ def run_test_random_search(toml_path, generate_input, tmp_out_dir, ref_dir): os.makedirs(tmp_out_dir, exist_ok=True) shutil.copy(toml_path, tmp_out_dir) + if no_gpu: + change_gpu_in_toml(tmp_out_dir / "random_search.toml") + flag_error_generate = not os.system("clinicadl " + " ".join(generate_input)) performances_flag = os.path.exists( tmp_out_dir / "job-1" / "split-0" / "best-loss" / "train" diff --git a/tests/test_resume.py b/tests/test_resume.py index 3cf883c32..cdf6031ee 100644 --- a/tests/test_resume.py +++ b/tests/test_resume.py @@ -1,15 +1,14 @@ # coding: utf8 import json -import os import shutil from os import system -from os.path import join from pathlib import Path import pytest from clinicadl import MapsManager -from tests.testing_tools import compare_folders + +from .testing_tools import modify_maps @pytest.fixture( @@ -33,6 +32,18 @@ def test_resume(cmdopt, tmp_path, test_name): shutil.copytree(input_dir / test_name, tmp_out_dir / test_name) maps_stopped = tmp_out_dir / test_name + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: # modify the input MAPS + with open(maps_stopped / "maps.json", "r") as f: + config = json.load(f) + config = modify_maps( + maps=config, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + with open(maps_stopped / "maps.json", "w") as f: + json.dump(config, f) + flag_error = not system(f"clinicadl -vv train resume {maps_stopped}") assert flag_error @@ -48,4 +59,13 @@ def test_resume(cmdopt, tmp_path, test_name): json_data_out = json.load(out) with open(ref_dir / "maps_image_cnn" / "maps.json", "r") as ref: json_data_ref = json.load(ref) + + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + json_data_ref = modify_maps( + maps=json_data_ref, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + assert json_data_ref == json_data_out diff --git a/tests/test_train_ae.py b/tests/test_train_ae.py index 311e145d0..b20749258 100644 --- a/tests/test_train_ae.py +++ b/tests/test_train_ae.py @@ -3,12 +3,11 @@ import json import os import shutil -from os.path import join from pathlib import Path import pytest -from tests.testing_tools import clean_folder, compare_folders +from .testing_tools import clean_folder, compare_folders, modify_maps @pytest.fixture( @@ -27,8 +26,8 @@ def test_train_ae(cmdopt, tmp_path, test_name): base_dir = Path(cmdopt["input"]) input_dir = base_dir / "train" / "in" ref_dir = base_dir / "train" / "ref" - tmp_out_dir = base_dir / "train" / "out" - # tmp_out_dir.mkdir(parents=True) + tmp_out_dir = tmp_path / "train" / "out" + tmp_out_dir.mkdir(parents=True) clean_folder(tmp_out_dir, recreate=True) @@ -102,18 +101,12 @@ def test_train_ae(cmdopt, tmp_path, test_name): with open(ref_dir / ("maps_" + test_name) / "maps.json", "r") as ref: json_data_ref = json.load(ref) - if test_name == "patch_multi_ae": - json_data_out["multi_network"] = True - if cmdopt["no-gpu"]: - json_data_ref["gpu"] = False - if cmdopt["adapt-base-dir"]: - base_dir = base_dir.resolve() - ref_base_dir = Path(json_data_ref["caps_directory"]).parents[2] - json_data_ref["caps_directory"] = str( - base_dir / Path(json_data_ref["caps_directory"]).relative_to(ref_base_dir) - ) - json_data_ref["tsv_path"] = str( - base_dir / Path(json_data_ref["tsv_path"]).relative_to(ref_base_dir) + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + json_data_ref = modify_maps( + maps=json_data_ref, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], ) assert json_data_out == json_data_ref # ["mode"] == mode diff --git a/tests/test_train_cnn.py b/tests/test_train_cnn.py index da5b3a3f1..761fedbee 100644 --- a/tests/test_train_cnn.py +++ b/tests/test_train_cnn.py @@ -3,12 +3,11 @@ import json import os import shutil -from os.path import join from pathlib import Path import pytest -from tests.testing_tools import compare_folders +from .testing_tools import compare_folders, modify_maps @pytest.fixture( @@ -101,6 +100,9 @@ def test_train_cnn(cmdopt, tmp_path, test_name): else: raise NotImplementedError(f"Test {test_name} is not implemented.") + if cmdopt["no-gpu"]: + test_input.append("--no-gpu") + if tmp_out_dir.is_dir(): shutil.rmtree(tmp_out_dir) @@ -117,6 +119,13 @@ def test_train_cnn(cmdopt, tmp_path, test_name): with open(ref_dir / ("maps_" + test_name) / "maps.json", "r") as ref: json_data_ref = json.load(ref) + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + json_data_ref = modify_maps( + maps=json_data_ref, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) assert json_data_out == json_data_ref # ["mode"] == mode assert compare_folders( diff --git a/tests/test_train_from_json.py b/tests/test_train_from_json.py index f48791d31..363af9aff 100644 --- a/tests/test_train_from_json.py +++ b/tests/test_train_from_json.py @@ -1,17 +1,14 @@ -import os -import pathlib +import json import shutil -from os import path, system -from os.path import join +from os import system from pathlib import Path -from .testing_tools import compare_folders_with_hashes, create_hashes_dict, models_equal +from .testing_tools import compare_folders_with_hashes, create_hashes_dict, modify_maps def test_json_compatibility(cmdopt, tmp_path): base_dir = Path(cmdopt["input"]) input_dir = base_dir / "train_from_json" / "in" - ref_dir = base_dir / "train_from_json" / "ref" tmp_out_dir = tmp_path / "train_from_json" / "out" tmp_out_dir.mkdir(parents=True) @@ -22,6 +19,19 @@ def test_json_compatibility(cmdopt, tmp_path): if reproduced_maps_dir.exists(): shutil.rmtree(reproduced_maps_dir) + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: # virtually modify the input MAPS + with open(config_json, "r") as f: + config = json.load(f) + config_json = tmp_out_dir / "modified_maps.json" + config = modify_maps( + maps=config, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + with open(config_json, "w+") as f: + json.dump(config, f) + flag_error = not system( f"clinicadl train from_json {str(config_json)} {str(reproduced_maps_dir)} -s {split}" ) @@ -31,7 +41,6 @@ def test_json_compatibility(cmdopt, tmp_path): def test_determinism(cmdopt, tmp_path): base_dir = Path(cmdopt["input"]) input_dir = base_dir / "train_from_json" / "in" - ref_dir = base_dir / "train_from_json" / "ref" tmp_out_dir = tmp_path / "train_from_json" / "out" tmp_out_dir.mkdir(parents=True) @@ -50,8 +59,11 @@ def test_determinism(cmdopt, tmp_path): str(maps_dir), "-c", str(input_dir / "reproducibility_config.toml"), - "--no-gpu", ] + + if cmdopt["no-gpu"]: + test_input.append("--no-gpu") + # Run first experiment flag_error = not system("clinicadl " + " ".join(test_input)) assert flag_error diff --git a/tests/test_transfer_learning.py b/tests/test_transfer_learning.py index 95713d7ad..b9c3f999b 100644 --- a/tests/test_transfer_learning.py +++ b/tests/test_transfer_learning.py @@ -1,12 +1,11 @@ import json import os import shutil -from os.path import join from pathlib import Path import pytest -from tests.testing_tools import compare_folders +from .testing_tools import compare_folders, modify_maps # Everything is tested on roi except for cnn --> multicnn (patch) as multicnn is not implemented for roi. @@ -41,7 +40,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): str(caps_roi_path), extract_roi_str, str(labels_path), - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_ae"), "-c", str(config_path), ] @@ -55,7 +54,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): "-c", str(config_path), "--transfer_path", - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_ae"), ] name = "aeTOae" elif test_name == "transfer_ae_cnn": @@ -65,7 +64,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): str(caps_roi_path), extract_roi_str, str(labels_path), - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_ae"), "-c", str(config_path), ] @@ -79,7 +78,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): "-c", str(config_path), "--transfer_path", - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_ae"), ] name = "aeTOcnn" elif test_name == "transfer_cnn_cnn": @@ -89,7 +88,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): str(caps_roi_path), extract_roi_str, str(labels_path), - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_cnn"), "-c", str(config_path), ] @@ -103,7 +102,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): "-c", str(config_path), "--transfer_path", - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_cnn"), ] name = "cnnTOcnn" elif test_name == "transfer_cnn_multicnn": @@ -113,7 +112,7 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): str(caps_roi_path), extract_roi_str, str(labels_path), - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_cnn"), "-c", str(config_path), ] @@ -127,12 +126,17 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): "-c", str(config_path), "--transfer_path", - str(tmp_out_dir), + str(tmp_out_dir / "maps_roi_cnn"), + "--multi_network", ] - name = "cnnTOcnn" + name = "cnnTOmulticnn" else: raise NotImplementedError(f"Test {test_name} is not implemented.") + if cmdopt["no-gpu"]: + source_task.append("--no-gpu") + target_task.append("--no-gpu") + if tmp_out_dir.exists(): shutil.rmtree(tmp_out_dir) if tmp_target_dir.exists(): @@ -148,9 +152,21 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): with open(ref_dir / ("maps_roi_" + name) / "maps.json", "r") as ref: json_data_ref = json.load(ref) - json_data_ref["transfer_path"] = json_data_out["transfer_path"] - json_data_ref["gpu"] = json_data_out["gpu"] + ref_source_dir = Path(json_data_ref["transfer_path"]).parent + json_data_ref["transfer_path"] = str( + tmp_out_dir / Path(json_data_ref["transfer_path"]).relative_to(ref_source_dir) + ) + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + json_data_ref = modify_maps( + maps=json_data_ref, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + # TODO: remove and update data json_data_ref["caps_directory"] = json_data_out["caps_directory"] + json_data_ref["gpu"] = json_data_out["gpu"] + ### assert json_data_out == json_data_ref # ["mode"] == mode assert compare_folders( diff --git a/tests/testing_tools.py b/tests/testing_tools.py index d4cb29c8a..ff7eb97b1 100644 --- a/tests/testing_tools.py +++ b/tests/testing_tools.py @@ -1,7 +1,7 @@ import pathlib from os import PathLike from pathlib import Path -from typing import Dict, List +from typing import Any, Dict, List def ignore_pattern(file_path: pathlib.Path, ignore_pattern_list: List[str]) -> bool: @@ -166,3 +166,63 @@ def clean_folder(path, recreate=True): rmtree(abs_path) if recreate: makedirs(abs_path) + + +def modify_maps( + maps: Dict[str, Any], + base_dir: Path, + no_gpu: bool = False, + adapt_base_dir: bool = False, +) -> Dict[str, Any]: + """ + Modifies a MAPS dictionary if the user passed --no-gpu or --adapt-base-dir flags. + + Parameters + ---------- + maps : Dict[str, Any] + The MAPS dictionary. + base_dir : Path + The base directory, where CI data are stored. + no_gpu : bool (optional, default=False) + Whether the user activated the --no-gpu flag. + adapt_base_dir : bool (optional, default=False) + Whether the user activated the --adapt-base-dir flag. + + Returns + ------- + Dict[str, Any] + The modified MAPS dictionary. + """ + if no_gpu: + maps["gpu"] = False + if adapt_base_dir: + base_dir = base_dir.resolve() + ref_base_dir = Path(maps["caps_directory"]).parents[2] + maps["caps_directory"] = str( + base_dir / Path(maps["caps_directory"]).relative_to(ref_base_dir) + ) + maps["tsv_path"] = str( + base_dir / Path(maps["tsv_path"]).relative_to(ref_base_dir) + ) + return maps + + +def change_gpu_in_toml(toml_path: Path) -> None: + """ + Changes GPU to false in a TOML config file. + + Parameters + ---------- + toml_path : Path + The TOML file. + """ + import toml + + config = toml.load(toml_path) + try: + config["Computational"]["gpu"] = False + except KeyError: + config["Computational"] = {"gpu": False} + f = open(toml_path, "w") + toml.dump(config, f) + f.close() From f20e7fb31abe444d9204ce92665af43265f284d9 Mon Sep 17 00:00:00 2001 From: HuguesRoy <149707970+HuguesRoy@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:53:33 +0200 Subject: [PATCH 19/29] Update quality_check.py (#609) * Update quality_check.py --- clinicadl/quality_check/t1_linear/quality_check.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clinicadl/quality_check/t1_linear/quality_check.py b/clinicadl/quality_check/t1_linear/quality_check.py index c684858ea..86d85366d 100755 --- a/clinicadl/quality_check/t1_linear/quality_check.py +++ b/clinicadl/quality_check/t1_linear/quality_check.py @@ -141,7 +141,10 @@ def quality_check( qc_df = pd.DataFrame(columns=columns) qc_df["pass"] = qc_df["pass"].astype(bool) softmax = torch.nn.Softmax(dim=1) - logger.info(f"Quality check will be performed over {len(dataloader)} images.") + + logger.info( + f"Quality check will be performed over {len(dataloader.dataset)} images." + ) for data in dataloader: logger.debug(f"Processing subject {data['participant_id']}.") From f6f382aba02e4cb8cc3a2f79f355ea7e8f1f54ed Mon Sep 17 00:00:00 2001 From: thibaultdvx <154365476+thibaultdvx@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:22:11 +0200 Subject: [PATCH 20/29] Fix issue in compare_folders (#610) * add FileNotFound error in tree --- tests/test_generate.py | 4 +- tests/test_predict.py | 69 ++++++++++++++++++++++----------- tests/test_qc.py | 14 +++---- tests/test_random_search.py | 24 ++++++------ tests/test_resume.py | 2 +- tests/test_train_ae.py | 13 +++---- tests/test_train_from_json.py | 2 +- tests/test_transfer_learning.py | 25 ++++++------ tests/testing_tools.py | 51 ++++++++++++++++++------ 9 files changed, 128 insertions(+), 76 deletions(-) diff --git a/tests/test_generate.py b/tests/test_generate.py index 78ad55156..9fc03535b 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -46,12 +46,12 @@ def test_generate(cmdopt, tmp_path, test_name): "t1-linear", ] elif test_name == "hypometabolic_example": - output_folder = str(tmp_out_dir / test_name) + output_folder = tmp_out_dir / test_name test_input = [ "generate", "hypometabolic", data_caps_pet, - output_folder, + str(output_folder), "--n_subjects", "2", "--pathology", diff --git a/tests/test_predict.py b/tests/test_predict.py index 34427eeeb..c6b6a39fa 100644 --- a/tests/test_predict.py +++ b/tests/test_predict.py @@ -1,6 +1,5 @@ # coding: utf8 import json -import os import shutil from os.path import exists from pathlib import Path @@ -8,7 +7,8 @@ import pytest from clinicadl import MapsManager -from tests.testing_tools import clean_folder, compare_folders + +from .testing_tools import compare_folders, modify_maps @pytest.fixture( @@ -33,46 +33,71 @@ def test_predict(cmdopt, tmp_path, test_name): tmp_out_dir.mkdir(parents=True) if test_name == "predict_image_classification": - model_folder = input_dir / "maps_image_cnn" + maps_name = "maps_image_cnn" modes = ["image"] use_labels = True elif test_name == "predict_slice_classification": - model_folder = input_dir / "maps_slice_cnn" + maps_name = "maps_slice_cnn" modes = ["image", "slice"] use_labels = True elif test_name == "predict_patch_regression": - model_folder = input_dir / "maps_patch_cnn" + maps_name = "maps_patch_cnn" modes = ["image", "patch"] use_labels = False elif test_name == "predict_roi_regression": - model_folder = input_dir / "maps_roi_cnn" + maps_name = "maps_roi_cnn" modes = ["image", "roi"] use_labels = False elif test_name == "predict_patch_multi_classification": - model_folder = input_dir / "maps_patch_multi_cnn" + maps_name = "maps_patch_multi_cnn" modes = ["image", "patch"] use_labels = False elif test_name == "predict_roi_reconstruction": - model_folder = input_dir / "maps_roi_ae" + maps_name = "maps_roi_ae" modes = ["roi"] use_labels = False else: raise NotImplementedError(f"Test {test_name} is not implemented.") - out_dir = str(model_folder / "split-0/best-loss/test-RANDOM") + shutil.copytree(input_dir / maps_name, tmp_out_dir / maps_name) + model_folder = tmp_out_dir / maps_name + + if cmdopt["adapt-base-dir"]: + with open(model_folder / "maps.json", "r") as f: + config = json.load(f) + config = modify_maps( + maps=config, + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + with open(model_folder / "maps.json", "w") as f: + json.dump(config, f, skipkeys=True, indent=4) + + with open(model_folder / "groups/test-RANDOM/maps.json", "r") as f: + config = json.load(f) + config = modify_maps( + maps=config, + base_dir=base_dir, + no_gpu=False, + adapt_base_dir=cmdopt["adapt-base-dir"], + ) + with open(model_folder / "groups/test-RANDOM/maps.json", "w") as f: + json.dump(config, f, skipkeys=True, indent=4) - if exists(out_dir): - shutil.rmtree(out_dir) + tmp_out_subdir = str(model_folder / "split-0/best-loss/test-RANDOM") + if exists(tmp_out_subdir): + shutil.rmtree(tmp_out_subdir) - # Correction of JSON file for ROI - if "roi" in modes: - json_path = model_folder / "maps.json" - with open(json_path, "r") as f: - parameters = json.load(f) - parameters["roi_list"] = ["leftHippocampusBox", "rightHippocampusBox"] - json_data = json.dumps(parameters, skipkeys=True, indent=4) - with open(json_path, "w") as f: - f.write(json_data) + # # Correction of JSON file for ROI + # if "roi" in modes: + # json_path = model_folder / "maps.json" + # with open(json_path, "r") as f: + # parameters = json.load(f) + # parameters["roi_list"] = ["leftHippocampusBox", "rightHippocampusBox"] + # json_data = json.dumps(parameters, skipkeys=True, indent=4) + # with open(json_path, "w") as f: + # f.write(json_data) maps_manager = MapsManager(model_folder, verbose="debug") maps_manager.predict( @@ -91,7 +116,7 @@ def test_predict(cmdopt, tmp_path, test_name): maps_manager.get_metrics(data_group="test-RANDOM", mode=mode) assert compare_folders( - tmp_out_dir / test_name, - ref_dir / test_name, + tmp_out_dir / maps_name, + input_dir / maps_name, tmp_out_dir, ) diff --git a/tests/test_qc.py b/tests/test_qc.py index 910c357d4..9b03c2151 100644 --- a/tests/test_qc.py +++ b/tests/test_qc.py @@ -22,29 +22,29 @@ def test_qc(cmdopt, tmp_path, test_name): tmp_out_dir.mkdir(parents=True) if test_name == "t1-linear": - out_tsv = str(tmp_out_dir / "QC.tsv") + out_tsv = tmp_out_dir / "QC.tsv" test_input = [ "t1-linear", str(input_dir / "caps"), - out_tsv, + str(out_tsv), "--no-gpu", ] elif test_name == "t1-volume": - out_dir = str(tmp_out_dir / "QC_T1V") + out_dir = tmp_out_dir / "QC_T1V" test_input = [ "t1-volume", str(input_dir / "caps_T1V"), - out_dir, + str(out_dir), "Ixi549Space", ] elif test_name == "pet-linear": - out_tsv = str(tmp_out_dir / "QC_pet.tsv") + out_tsv = tmp_out_dir / "QC_pet.tsv" test_input = [ "pet-linear", str(input_dir / "caps_pet"), - out_tsv, + str(out_tsv), "18FFDG", "cerebellumPons2", "--threshold", @@ -73,7 +73,7 @@ def test_qc(cmdopt, tmp_path, test_name): assert out_df.equals(ref_df) elif test_name == "t1-volume": - assert compare_folders(out_dir, str(ref_dir / "QC_T1V"), tmp_out_dir) + assert compare_folders(out_dir, ref_dir / "QC_T1V", tmp_out_dir) elif test_name == "pet-linear": out_df = pd.read_csv(out_tsv, sep="\t") diff --git a/tests/test_random_search.py b/tests/test_random_search.py index 5b68787e8..864f8b1fa 100644 --- a/tests/test_random_search.py +++ b/tests/test_random_search.py @@ -7,7 +7,7 @@ import pytest -from .testing_tools import change_gpu_in_toml, compare_folders +from .testing_tools import compare_folders, modify_toml # random searxh for ROI with CNN @@ -25,6 +25,9 @@ def test_random_search(cmdopt, tmp_path, test_name): input_dir = base_dir / "randomSearch" / "in" ref_dir = base_dir / "randomSearch" / "ref" tmp_out_dir = tmp_path / "randomSearch" / "out" + + if os.path.exists(tmp_out_dir): + shutil.rmtree(tmp_out_dir) tmp_out_dir.mkdir(parents=True) if test_name == "rs_roi_cnn": @@ -33,21 +36,16 @@ def test_random_search(cmdopt, tmp_path, test_name): else: raise NotImplementedError(f"Test {test_name} is not implemented.") - run_test_random_search( - toml_path, generate_input, tmp_out_dir, ref_dir, cmdopt["no-gpu"] - ) - - -def run_test_random_search(toml_path, generate_input, tmp_out_dir, ref_dir, no_gpu): - if os.path.exists(tmp_out_dir): - shutil.rmtree(tmp_out_dir) - # Write random_search.toml file - os.makedirs(tmp_out_dir, exist_ok=True) shutil.copy(toml_path, tmp_out_dir) - if no_gpu: - change_gpu_in_toml(tmp_out_dir / "random_search.toml") + if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + modify_toml( + toml_path=tmp_out_dir / "random_search.toml", + base_dir=base_dir, + no_gpu=cmdopt["no-gpu"], + adapt_base_dir=cmdopt["adapt-base-dir"], + ) flag_error_generate = not os.system("clinicadl " + " ".join(generate_input)) performances_flag = os.path.exists( diff --git a/tests/test_resume.py b/tests/test_resume.py index cdf6031ee..5827bda0f 100644 --- a/tests/test_resume.py +++ b/tests/test_resume.py @@ -42,7 +42,7 @@ def test_resume(cmdopt, tmp_path, test_name): adapt_base_dir=cmdopt["adapt-base-dir"], ) with open(maps_stopped / "maps.json", "w") as f: - json.dump(config, f) + json.dump(config, f, skipkeys=True, indent=4) flag_error = not system(f"clinicadl -vv train resume {maps_stopped}") assert flag_error diff --git a/tests/test_train_ae.py b/tests/test_train_ae.py index b20749258..c7fbcb276 100644 --- a/tests/test_train_ae.py +++ b/tests/test_train_ae.py @@ -33,8 +33,10 @@ def test_train_ae(cmdopt, tmp_path, test_name): labels_path = str(input_dir / "labels_list" / "2_fold") config_path = str(input_dir / "train_config.toml") + split = 0 + if test_name == "image_ae": - split = [0, 0] + split = 1 test_input = [ "train", "reconstruction", @@ -45,10 +47,9 @@ def test_train_ae(cmdopt, tmp_path, test_name): "-c", config_path, "--split", - "1", + str(split), ] elif test_name == "patch_multi_ae": - split = [0, 0] test_input = [ "train", "reconstruction", @@ -61,7 +62,6 @@ def test_train_ae(cmdopt, tmp_path, test_name): "--multi_network", ] elif test_name == "roi_ae": - split = [0, 0] test_input = [ "train", "reconstruction", @@ -73,7 +73,6 @@ def test_train_ae(cmdopt, tmp_path, test_name): config_path, ] elif test_name == "slice_ae": - split = [0, 0] test_input = [ "train", "reconstruction", @@ -116,7 +115,7 @@ def test_train_ae(cmdopt, tmp_path, test_name): tmp_path, ) assert compare_folders( - tmp_out_dir / f"split-{split[0]}" / "best-loss", - ref_dir / ("maps_" + test_name) / f"split-{split[1]}" / "best-loss", + tmp_out_dir / f"split-{split}" / "best-loss", + ref_dir / ("maps_" + test_name) / f"split-{split}" / "best-loss", tmp_path, ) diff --git a/tests/test_train_from_json.py b/tests/test_train_from_json.py index 363af9aff..06b307b0f 100644 --- a/tests/test_train_from_json.py +++ b/tests/test_train_from_json.py @@ -30,7 +30,7 @@ def test_json_compatibility(cmdopt, tmp_path): adapt_base_dir=cmdopt["adapt-base-dir"], ) with open(config_json, "w+") as f: - json.dump(config, f) + json.dump(config, f, skipkeys=True, indent=4) flag_error = not system( f"clinicadl train from_json {str(config_json)} {str(reproduced_maps_dir)} -s {split}" diff --git a/tests/test_transfer_learning.py b/tests/test_transfer_learning.py index b9c3f999b..d49cbd61f 100644 --- a/tests/test_transfer_learning.py +++ b/tests/test_transfer_learning.py @@ -152,20 +152,23 @@ def test_transfer_learning(cmdopt, tmp_path, test_name): with open(ref_dir / ("maps_roi_" + name) / "maps.json", "r") as ref: json_data_ref = json.load(ref) - ref_source_dir = Path(json_data_ref["transfer_path"]).parent - json_data_ref["transfer_path"] = str( - tmp_out_dir / Path(json_data_ref["transfer_path"]).relative_to(ref_source_dir) - ) - if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: - json_data_ref = modify_maps( - maps=json_data_ref, - base_dir=base_dir, - no_gpu=cmdopt["no-gpu"], - adapt_base_dir=cmdopt["adapt-base-dir"], - ) + # TODO : uncomment when CI data are correct + # ref_source_dir = Path(json_data_ref["transfer_path"]).parent + # json_data_ref["transfer_path"] = str( + # tmp_out_dir / Path(json_data_ref["transfer_path"]).relative_to(ref_source_dir) + # ) + # if cmdopt["no-gpu"] or cmdopt["adapt-base-dir"]: + # json_data_ref = modify_maps( + # maps=json_data_ref, + # base_dir=base_dir, + # no_gpu=cmdopt["no-gpu"], + # adapt_base_dir=cmdopt["adapt-base-dir"], + # ) # TODO: remove and update data json_data_ref["caps_directory"] = json_data_out["caps_directory"] json_data_ref["gpu"] = json_data_out["gpu"] + json_data_ref["transfer_path"] = json_data_out["transfer_path"] + json_data_ref["tsv_path"] = json_data_out["tsv_path"] ### assert json_data_out == json_data_ref # ["mode"] == mode diff --git a/tests/testing_tools.py b/tests/testing_tools.py index ff7eb97b1..4044d1022 100644 --- a/tests/testing_tools.py +++ b/tests/testing_tools.py @@ -95,6 +95,9 @@ def tree(dir_: PathLike, file_out: PathLike): """ from pathlib import Path + if not dir_.is_dir(): + raise FileNotFoundError(f"No directory found at {dir_}.") + file_content = "" for path in sorted(Path(dir_).rglob("*")): @@ -104,8 +107,6 @@ def tree(dir_: PathLike, file_out: PathLike): spacer = " " * depth file_content = file_content + f"{spacer}+ {path.name}\n" - print(file_content) - Path(file_out).write_text(file_content) @@ -201,28 +202,54 @@ def modify_maps( maps["caps_directory"] = str( base_dir / Path(maps["caps_directory"]).relative_to(ref_base_dir) ) - maps["tsv_path"] = str( - base_dir / Path(maps["tsv_path"]).relative_to(ref_base_dir) - ) + try: + maps["tsv_path"] = str( + base_dir / Path(maps["tsv_path"]).relative_to(ref_base_dir) + ) + except KeyError: # maps with only caps directory + pass return maps -def change_gpu_in_toml(toml_path: Path) -> None: +def modify_toml( + toml_path: Path, + base_dir: Path, + no_gpu: bool = False, + adapt_base_dir: bool = False, +) -> None: """ - Changes GPU to false in a TOML config file. + Modifies a TOML file if the user passed --no-gpu or --adapt-base-dir flags. Parameters ---------- toml_path : Path - The TOML file. + The path of the TOML file. + base_dir : Path + The base directory, where CI data are stored. + no_gpu : bool (optional, default=False) + Whether the user activated the --no-gpu flag. + adapt_base_dir : bool (optional, default=False) + Whether the user activated the --adapt-base-dir flag. """ import toml config = toml.load(toml_path) - try: - config["Computational"]["gpu"] = False - except KeyError: - config["Computational"] = {"gpu": False} + if no_gpu: + try: + config["Computational"]["gpu"] = False + except KeyError: + config["Computational"] = {"gpu": False} + if adapt_base_dir: + random_search_config = config["Random_Search"] + base_dir = base_dir.resolve() + ref_base_dir = Path(random_search_config["caps_directory"]).parents[2] + random_search_config["caps_directory"] = str( + base_dir + / Path(random_search_config["caps_directory"]).relative_to(ref_base_dir) + ) + random_search_config["tsv_path"] = str( + base_dir / Path(random_search_config["tsv_path"]).relative_to(ref_base_dir) + ) f = open(toml_path, "w") toml.dump(config, f) f.close() From 52f94928e57b0c407e75c232684bf2479fd2d1ef Mon Sep 17 00:00:00 2001 From: Gensollen Date: Tue, 4 Jun 2024 18:45:20 +0200 Subject: [PATCH 21/29] [INFRA] Update the Makefile `check.lock` target (#603) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5c8ca37d1..a7b469b16 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ help: Makefile .PHONY: check.lock check.lock: - @$(POETRY) lock --check + @$(POETRY) check --lock ## build : Build the package. .PHONY: build From 996cdd51e02bcbd4899a41aaf89addebc90183ee Mon Sep 17 00:00:00 2001 From: Gensollen Date: Fri, 7 Jun 2024 16:23:13 +0200 Subject: [PATCH 22/29] [CI] Run unit tests and linter on refactoring branch (#618) * run unit tests on refactoring * run linter on refactoring --- .github/workflows/lint.yaml | 4 ++-- .github/workflows/test.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 466dd1c2f..1a2b6f7d9 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -2,9 +2,9 @@ name: 'Lint codebase' on: pull_request: - branches: [ dev ] + branches: [ "dev", "refactoring" ] push: - branches: [ dev ] + branches: [ "dev", "refactoring" ] permissions: contents: read diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5e0fdde33..219e86c2b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,9 +2,9 @@ name: Test on: push: - branches: [dev] + branches: ["dev", "refactoring"] pull_request: - branches: [dev] + branches: ["dev", "refactoring"] permissions: contents: read From d0d5cd220387c91396430046a4585b4ec7a6aeec Mon Sep 17 00:00:00 2001 From: thibaultdvx <154365476+thibaultdvx@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:32:02 +0200 Subject: [PATCH 23/29] Trigger tests when undrafted (#623) * add ready_for_review event --- .github/workflows/test_cli.yml | 1 + .github/workflows/test_generate.yml | 1 + .github/workflows/test_interpret.yml | 1 + .github/workflows/test_predict.yml | 1 + .github/workflows/test_prepare_data.yml | 1 + .github/workflows/test_quality_checks.yml | 1 + .github/workflows/test_random_search.yml | 1 + .github/workflows/test_resume.yml | 1 + .github/workflows/test_train.yml | 1 + .github/workflows/test_transfer_learning.yml | 1 + .github/workflows/test_tsvtools.yml | 1 + 11 files changed, 11 insertions(+) diff --git a/.github/workflows/test_cli.yml b/.github/workflows/test_cli.yml index 4efd2b024..5949fab4d 100644 --- a/.github/workflows/test_cli.yml +++ b/.github/workflows/test_cli.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_generate.yml b/.github/workflows/test_generate.yml index 8fc54c025..d3b9ed1d3 100644 --- a/.github/workflows/test_generate.yml +++ b/.github/workflows/test_generate.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_interpret.yml b/.github/workflows/test_interpret.yml index 13db354a9..f20d08194 100644 --- a/.github/workflows/test_interpret.yml +++ b/.github/workflows/test_interpret.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_predict.yml b/.github/workflows/test_predict.yml index e6d790b2a..c49094a12 100644 --- a/.github/workflows/test_predict.yml +++ b/.github/workflows/test_predict.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_prepare_data.yml b/.github/workflows/test_prepare_data.yml index 753634f76..6452703f8 100644 --- a/.github/workflows/test_prepare_data.yml +++ b/.github/workflows/test_prepare_data.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_quality_checks.yml b/.github/workflows/test_quality_checks.yml index 25d1bc752..ffa071db3 100644 --- a/.github/workflows/test_quality_checks.yml +++ b/.github/workflows/test_quality_checks.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_random_search.yml b/.github/workflows/test_random_search.yml index 78ddc2df0..f7910cb84 100644 --- a/.github/workflows/test_random_search.yml +++ b/.github/workflows/test_random_search.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_resume.yml b/.github/workflows/test_resume.yml index 6d145339b..57a72dcd0 100644 --- a/.github/workflows/test_resume.yml +++ b/.github/workflows/test_resume.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_train.yml b/.github/workflows/test_train.yml index b3852bb09..93f390341 100644 --- a/.github/workflows/test_train.yml +++ b/.github/workflows/test_train.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_transfer_learning.yml b/.github/workflows/test_transfer_learning.yml index 9a3a583a3..e82196ce3 100644 --- a/.github/workflows/test_transfer_learning.yml +++ b/.github/workflows/test_transfer_learning.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read diff --git a/.github/workflows/test_tsvtools.yml b/.github/workflows/test_tsvtools.yml index 9e388b8e7..fda362139 100644 --- a/.github/workflows/test_tsvtools.yml +++ b/.github/workflows/test_tsvtools.yml @@ -5,6 +5,7 @@ on: branches: ["dev", "refactoring"] pull_request: branches: ["dev", "refactoring"] + types: [opened, synchronize, reopened, ready_for_review] permissions: contents: read From dca38025aad321c91004d008d8138b58064bf1f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 06:26:24 +0200 Subject: [PATCH 24/29] Bump urllib3 from 1.26.18 to 1.26.19 (#625) Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.18 to 1.26.19. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/1.26.19/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.18...1.26.19) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7ff18c8fc..1bdaec5d2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3765,13 +3765,13 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "1.26.19" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, + {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [package.extras] From b8d402b2d4cdba4684121e25ac7ecfda1b72cd87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:00:37 +0200 Subject: [PATCH 25/29] Bump certifi from 2024.2.2 to 2024.7.4 (#634) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.2.2 to 2024.7.4. - [Commits](https://github.com/certifi/python-certifi/compare/2024.02.02...2024.07.04) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1bdaec5d2..97152db70 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "absl-py" @@ -117,13 +117,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] From 6dc2956c6cfbbbd54cc6c9e73037b8a4e9832e14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:24:44 +0200 Subject: [PATCH 26/29] Bump zipp from 3.17.0 to 3.19.1 (#635) Bumps [zipp](https://github.com/jaraco/zipp) from 3.17.0 to 3.19.1. - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.17.0...v3.19.1) --- updated-dependencies: - dependency-name: zipp dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 97152db70..6568d898e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4008,18 +4008,18 @@ files = [ [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, + {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From b30aac8f7ceccc4dec30cb1a7152d0073f9e075e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:28:22 +0200 Subject: [PATCH 27/29] Bump setuptools from 69.0.3 to 70.0.0 (#636) Bumps [setuptools](https://github.com/pypa/setuptools) from 69.0.3 to 70.0.0. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v69.0.3...v70.0.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6568d898e..ffcc4073b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3261,19 +3261,18 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "69.0.3" +version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" From f6d3f25c98fd5e5fbed3725064e0c292d16ff2ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 09:14:07 +0200 Subject: [PATCH 28/29] Bump sentry-sdk from 1.40.1 to 2.8.0 (#638) Bumps [sentry-sdk](https://github.com/getsentry/sentry-python) from 1.40.1 to 2.8.0. - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/1.40.1...2.8.0) --- updated-dependencies: - dependency-name: sentry-sdk dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index ffcc4073b..7599d7299 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3116,39 +3116,44 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "sentry-sdk" -version = "1.40.1" +version = "2.8.0" description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "sentry-sdk-1.40.1.tar.gz", hash = "sha256:1bb9cf4ac317906d20787693b5e7f3e42160a90e8bbf1fc544f91c52fa76b68f"}, - {file = "sentry_sdk-1.40.1-py2.py3-none-any.whl", hash = "sha256:69fc5e7512371547207821d801485f45e3c62db629f02f56f58431a10864ac34"}, + {file = "sentry_sdk-2.8.0-py2.py3-none-any.whl", hash = "sha256:6051562d2cfa8087bb8b4b8b79dc44690f8a054762a29c07e22588b1f619bfb5"}, + {file = "sentry_sdk-2.8.0.tar.gz", hash = "sha256:aa4314f877d9cd9add5a0c9ba18e3f27f99f7de835ce36bd150e48a41c7c646f"}, ] [package.dependencies] certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} +urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] arq = ["arq (>=0.23)"] asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] chalice = ["chalice (>=1.16.0)"] clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] -grpcio = ["grpcio (>=1.21.1)"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] -pure-eval = ["asttokens", "executing", "pure_eval"] +opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] @@ -3157,7 +3162,7 @@ sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=5)"] +tornado = ["tornado (>=6)"] [[package]] name = "setproctitle" From fa85c2c6f7dc446e491c9674a7cec4ded350a7dd Mon Sep 17 00:00:00 2001 From: nburgos Date: Mon, 19 Aug 2024 15:23:30 +0200 Subject: [PATCH 29/29] Update LICENSE.txt to 2024 (#645) Update copyright from 2016-2020 to 2016-2024 --- LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.txt b/LICENSE.txt index d787d31c8..f25d0afe5 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright © 2016-2020 ARAMIS Lab, http://aramislab.fr/ +Copyright © 2016-2024 ARAMIS Lab, http://aramislab.fr/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal