From 7ee54f8d40255c21f2f295f4e90460d1e63cd10a Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 21 Oct 2025 15:41:23 +0200 Subject: [PATCH 1/5] Refactored import statements in test files and added new tests for `pre_process`, `sum`, `two_df_sum`, and `sum_many` functions. Removed obsolete test file. --- test/test.py | 59 -------------------------- test/test_metadata.py | 8 ++-- test/test_pre_process.py | 63 +++++++++++++++++++++++++++ test/test_read_csv.py | 12 +++--- test/test_sleep.py | 9 ++-- test/test_sum.py | 54 ++++++++++++++++++++++++ test/test_sum_many.py | 82 ++++++++++++++++++++++++++++++++++++ test/test_two_df_sum.py | 60 ++++++++++++++++++++++++++ v6-session-basics/central.py | 4 +- v6-session-basics/partial.py | 4 +- 10 files changed, 280 insertions(+), 75 deletions(-) delete mode 100644 test/test.py create mode 100644 test/test_pre_process.py create mode 100644 test/test_sum.py create mode 100644 test/test_sum_many.py create mode 100644 test/test_two_df_sum.py diff --git a/test/test.py b/test/test.py deleted file mode 100644 index 54891a4..0000000 --- a/test/test.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Run this script to test your algorithm locally (without building a Docker -image) using the mock client. - -Run as: - - python test.py - -Make sure to do so in an environment where `vantage6-algorithm-tools` is -installed. This can be done by running: - - pip install vantage6-algorithm-tools -""" -from vantage6.algorithm.tools.mock_client import MockAlgorithmClient -from pathlib import Path - -# get path of current directory -current_path = Path(__file__).parent - -## Mock client -client = MockAlgorithmClient( - datasets=[ - # Data for first organization - [{ - "database": current_path / "test_data.csv", - "db_type": "csv", - "input_data": {} - }], - # Data for second organization - [{ - "database": current_path / "test_data.csv", - "db_type": "csv", - "input_data": {} - }] - ], - module="v6-session-basics" -) - -# list mock organizations -organizations = client.organization.list() -print(organizations) -org_ids = [organization["id"] for organization in organizations] - - -# Run the partial method for all organizations -task = client.task.create( - input_={ - "method":"read_csv", - "kwargs": { - # TODO define parameters for function 'read_csv' - } - }, - organizations=org_ids -) -print(task) - -# Get the results from the task -results = client.wait_for_results(task.get("id")) -print(results) diff --git a/test/test_metadata.py b/test/test_metadata.py index 8f95eb5..9d6c9fd 100644 --- a/test/test_metadata.py +++ b/test/test_metadata.py @@ -1,7 +1,7 @@ from importlib.resources import files -from vantage6.mock.mock_network import MockNetwork, MockUserClient import pytest +from vantage6.mock.network import MockNetwork, MockUserClient @pytest.fixture @@ -21,11 +21,12 @@ def mock_client() -> MockUserClient: "database": test_data, "db_type": "csv", }, - } - ] + }, + ], ) return MockUserClient(mock_network) + def test_metadata_function(mock_client: MockUserClient): """Test the metadata function""" # Get organizations @@ -39,6 +40,7 @@ def test_metadata_function(mock_client: MockUserClient): # Wait for results results = mock_client.wait_for_results(task.get("id")) + print(results) # Assertions assert results is not None diff --git a/test/test_pre_process.py b/test/test_pre_process.py new file mode 100644 index 0000000..a498e28 --- /dev/null +++ b/test/test_pre_process.py @@ -0,0 +1,63 @@ +from importlib.resources import files + +import pandas as pd +import pytest +from vantage6.mock.network import MockNetwork, MockUserClient + + +@pytest.fixture +def mock_client() -> MockUserClient: + test_data = files("v6-session-basics").joinpath("data/test_data.csv") + mock_network = MockNetwork( + module_name="v6-session-basics", + datasets=[ + { + "test_data_1": { + "database": pd.read_csv(test_data), + "db_type": "csv", + }, + }, + { + "test_data_1": { + "database": pd.read_csv(test_data), + "db_type": "csv", + }, + }, + ], + ) + return mock_network.user_client + + +def test_pre_process_function(mock_client: MockUserClient): + """Test the pre_process function""" + # Get organizations + # orgs = mock_client.organization.list() + # org_ids = [org["id"] for org in orgs] + DATAFRAME_ID = 1 + + # Check what dtype the dataframe has + old_response = mock_client.network.server.get_dataframe(DATAFRAME_ID) + old_dtypes = [ + column["dtype"] for column in old_response["columns"] if column["name"] == "Age" + ] + assert [str(dtype) for dtype in old_dtypes] == [ + "int64" for _ in range(len(old_dtypes)) + ] + + # Note that the tasks here are run in sequence, thus sleeping for 1 seconds will + # be multiplied by the number of organizations. + mock_client.dataframe.preprocess( + id_=DATAFRAME_ID, + image="mock-image", + method="pre_process", + arguments={"column": "Age", "dtype": "int32"}, + ) + + df_response = mock_client.network.server.get_dataframe(DATAFRAME_ID) + new_dtypes = [ + column["dtype"] for column in df_response["columns"] if column["name"] == "Age" + ] + assert old_dtypes != new_dtypes + assert [str(dtype) for dtype in new_dtypes] == [ + "int32" for _ in range(len(new_dtypes)) + ] diff --git a/test/test_read_csv.py b/test/test_read_csv.py index 14bb495..3945dea 100644 --- a/test/test_read_csv.py +++ b/test/test_read_csv.py @@ -1,8 +1,8 @@ from importlib.resources import files + import pandas as pd import pytest - -from vantage6.mock.mock_network import MockNetwork, MockUserClient +from vantage6.mock.network import MockNetwork, MockUserClient @pytest.fixture @@ -22,8 +22,8 @@ def mock_client() -> MockUserClient: "database": test_data, "db_type": "csv", }, - } - ] + }, + ], ) return MockUserClient(mock_network) @@ -41,7 +41,7 @@ def test_read_csv_function(mock_client: MockUserClient): arguments={}, action="data_extraction", label="test_data_1", - name="my_dataframe_by_frank" + name="my_dataframe_by_frank", ) # A data extraction job should create a dataframe on each node, lets check if this @@ -51,4 +51,4 @@ def test_read_csv_function(mock_client: MockUserClient): for node in mock_client.network.nodes: assert len(node.dataframes) == 1 assert "my_dataframe_by_frank" in node.dataframes - assert isinstance(node.dataframes["my_dataframe_by_frank"], pd.DataFrame) \ No newline at end of file + assert isinstance(node.dataframes["my_dataframe_by_frank"], pd.DataFrame) diff --git a/test/test_sleep.py b/test/test_sleep.py index b1d3961..dcf0834 100644 --- a/test/test_sleep.py +++ b/test/test_sleep.py @@ -1,7 +1,7 @@ from importlib.resources import files -from vantage6.mock.mock_network import MockNetwork, MockUserClient import pytest +from vantage6.mock.network import MockNetwork, MockUserClient @pytest.fixture @@ -21,11 +21,12 @@ def mock_client() -> MockUserClient: "database": test_data, "db_type": "csv", }, - } - ] + }, + ], ) return mock_network.user_client + def test_sleep_function(mock_client: MockUserClient): """Test the metadata function""" # Get organizations @@ -46,4 +47,4 @@ def test_sleep_function(mock_client: MockUserClient): assert len(results) == 2 # Two organizations for result in results: assert "sleep" in result - assert result["sleep"] == "done" \ No newline at end of file + assert result["sleep"] == "done" diff --git a/test/test_sum.py b/test/test_sum.py new file mode 100644 index 0000000..7fee9f5 --- /dev/null +++ b/test/test_sum.py @@ -0,0 +1,54 @@ +from importlib.resources import files + +import pandas as pd +import pytest +from vantage6.mock.network import MockNetwork, MockUserClient + +TEST_DATAFRAME = pd.read_csv(files("v6-session-basics").joinpath("data/test_data.csv")) +DATAFRAME_LABEL = "test_data_1" + + +@pytest.fixture +def mock_client() -> MockUserClient: + mock_network = MockNetwork( + module_name="v6-session-basics", + datasets=[ + { + DATAFRAME_LABEL: { + "database": TEST_DATAFRAME, + "db_type": "csv", + }, + }, + { + DATAFRAME_LABEL: { + "database": TEST_DATAFRAME, + "db_type": "csv", + }, + }, + ], + ) + return mock_network.user_client + + +def test_sum_function(mock_client: MockUserClient): + """Test the sum function""" + # Get organizations + orgs = mock_client.organization.list() + org_ids = [org["id"] for org in orgs] + + # Note that the tasks here are run in sequence, thus sleeping for 1 seconds will + # be multiplied by the number of organizations. + column_to_sum = "Age" + task = mock_client.task.create( + method="sum", + organizations=org_ids, + arguments={"column": column_to_sum}, + databases=[{"label": DATAFRAME_LABEL}], + ) + + print(task) + # Wait for results + results = mock_client.wait_for_results(task.get("id")) + + print(results) + assert results[0]["sum"] == TEST_DATAFRAME[column_to_sum].sum() diff --git a/test/test_sum_many.py b/test/test_sum_many.py new file mode 100644 index 0000000..cd17d2a --- /dev/null +++ b/test/test_sum_many.py @@ -0,0 +1,82 @@ +from importlib.resources import files + +import pandas as pd +import pytest +from vantage6.mock.network import MockNetwork, MockUserClient + +# Read full dataframe and split into 4 random subsets +full_df = pd.read_csv(files("v6-session-basics").joinpath("data/test_data.csv")) +TEST_DATAFRAME_1 = full_df.sample(n=10, random_state=42) +TEST_DATAFRAME_2 = full_df.sample(n=15, random_state=43) +TEST_DATAFRAME_3 = full_df.sample(n=11, random_state=44) +TEST_DATAFRAME_4 = full_df.sample(n=15, random_state=45) +DATAFRAME_LABEL_1 = "test_data_1" +DATAFRAME_LABEL_2 = "test_data_2" + + +@pytest.fixture +def mock_client() -> MockUserClient: + mock_network = MockNetwork( + module_name="v6-session-basics", + datasets=[ + { + DATAFRAME_LABEL_1: { + "database": TEST_DATAFRAME_1, + "db_type": "csv", + }, + DATAFRAME_LABEL_2: { + "database": TEST_DATAFRAME_2, + "db_type": "csv", + }, + }, + { + DATAFRAME_LABEL_1: { + "database": TEST_DATAFRAME_3, + "db_type": "csv", + }, + DATAFRAME_LABEL_2: { + "database": TEST_DATAFRAME_4, + "db_type": "csv", + }, + }, + ], + ) + return mock_network.user_client + + +def test_sum_many_function(mock_client: MockUserClient): + """Test the sum_many function""" + # Get organizations + orgs = mock_client.organization.list() + org_ids = [org["id"] for org in orgs] + + column_to_sum = "Age" + task = mock_client.task.create( + method="sum_many", + organizations=org_ids, + arguments={"column": column_to_sum}, + databases=[[{"label": DATAFRAME_LABEL_1}, {"label": DATAFRAME_LABEL_2}]], + ) + + # Wait for results + results = mock_client.wait_for_results(task.get("id")) + print(results) + + # # Verify results + assert results is not None + assert len(results) == len(org_ids) # Two organizations + + assert "sums" in results[0] + assert DATAFRAME_LABEL_1 in results[0]["sums"] + assert ( + results[0]["sums"][DATAFRAME_LABEL_1] == TEST_DATAFRAME_1[column_to_sum].sum() + ) + assert ( + results[0]["sums"][DATAFRAME_LABEL_2] == TEST_DATAFRAME_2[column_to_sum].sum() + ) + assert ( + results[1]["sums"][DATAFRAME_LABEL_1] == TEST_DATAFRAME_3[column_to_sum].sum() + ) + assert ( + results[1]["sums"][DATAFRAME_LABEL_2] == TEST_DATAFRAME_4[column_to_sum].sum() + ) diff --git a/test/test_two_df_sum.py b/test/test_two_df_sum.py new file mode 100644 index 0000000..67da2b5 --- /dev/null +++ b/test/test_two_df_sum.py @@ -0,0 +1,60 @@ +from importlib.resources import files + +import pandas as pd +import pytest +from vantage6.mock.network import MockNetwork, MockUserClient + +# Read full dataframe and split into 2 random subsets +full_df = pd.read_csv(files("v6-session-basics").joinpath("data/test_data.csv")) +TEST_DATAFRAME_1 = full_df.sample(n=10, random_state=42) +TEST_DATAFRAME_2 = full_df.sample(n=15, random_state=43) +DATAFRAME_LABEL_1 = "test_data_1" +DATAFRAME_LABEL_2 = "test_data_2" + + +@pytest.fixture +def mock_client() -> MockUserClient: + mock_network = MockNetwork( + module_name="v6-session-basics", + datasets=[ + { + DATAFRAME_LABEL_1: { + "database": TEST_DATAFRAME_1, + "db_type": "csv", + }, + DATAFRAME_LABEL_2: { + "database": TEST_DATAFRAME_2, + "db_type": "csv", + }, + } + ], + ) + return mock_network.user_client + + +def test_two_df_sum_function(mock_client: MockUserClient): + """Test the two_df_sum function""" + # Get organizations + orgs = mock_client.organization.list() + org_ids = [org["id"] for org in orgs] + + column_to_sum = "Age" + task = mock_client.task.create( + method="two_df_sum", + organizations=org_ids, + arguments={"column": column_to_sum}, + databases=[{"label": DATAFRAME_LABEL_1}, {"label": DATAFRAME_LABEL_2}], + ) + + # Wait for results + results = mock_client.wait_for_results(task.get("id")) + + print(results) + + # Verify results + assert results is not None + assert len(results) == len(org_ids) # One organization + assert ( + results[0]["sum"] + == TEST_DATAFRAME_1[column_to_sum].sum() + TEST_DATAFRAME_2[column_to_sum].sum() + ) diff --git a/v6-session-basics/central.py b/v6-session-basics/central.py index 6be08f5..6a62599 100644 --- a/v6-session-basics/central.py +++ b/v6-session-basics/central.py @@ -1,7 +1,7 @@ -from vantage6.common import info +from vantage6.algorithm.client import AlgorithmClient from vantage6.algorithm.decorator.action import central from vantage6.algorithm.decorator.algorithm_client import algorithm_client -from vantage6.algorithm.client import AlgorithmClient +from vantage6.common import info @central diff --git a/v6-session-basics/partial.py b/v6-session-basics/partial.py index d028e0b..d9455e1 100644 --- a/v6-session-basics/partial.py +++ b/v6-session-basics/partial.py @@ -15,11 +15,13 @@ federated, preprocessing, ) -from vantage6.algorithm.decorator.metadata import metadata, RunMetaData from vantage6.algorithm.decorator.data import dataframe, dataframes +from vantage6.algorithm.decorator.metadata import RunMetaData, metadata from vantage6.common import info + @metadata +@federated def metadata(metadata: RunMetaData) -> dict: return { "task_id": str(metadata.task_id), From 7f801395b1ade16e00abb93df44ec3bdabda02b0 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 29 Oct 2025 08:26:08 +0100 Subject: [PATCH 2/5] Updated the algorithm tools ro `a41` --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cdc0ba8..7e4ced0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ requires-python = ">=3.13" dependencies = [ "pandas", "pytest", - "vantage6-algorithm-tools==5.0.0a36", + "vantage6-algorithm-tools==5.0.0a41", ] authors = [ { name = "Bart van Beusekom", email = "b.vanbeusekom@iknl.nl" }, From 3975d865447857d39658c906abc798b340fba92a Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 29 Oct 2025 08:29:52 +0100 Subject: [PATCH 3/5] Allow prereleases --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 7e4ced0..adc2d7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,3 +38,4 @@ packages = ["v6-session-basics"] [tool.uv] dev-dependencies = [] +prerelease-mode = "allow" From e85e838fa8579b752c85fbe56826cb97dbcd7ddd Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 29 Oct 2025 08:32:52 +0100 Subject: [PATCH 4/5] `uv add` with prerelease flag --- pyproject.toml | 1 - uv.lock | 65 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index adc2d7f..7e4ced0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,4 +38,3 @@ packages = ["v6-session-basics"] [tool.uv] dev-dependencies = [] -prerelease-mode = "allow" diff --git a/uv.lock b/uv.lock index 57ee0d2..a1b5a23 100644 --- a/uv.lock +++ b/uv.lock @@ -220,6 +220,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -305,6 +314,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, ] +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + [[package]] name = "pandas" version = "2.3.2" @@ -332,6 +350,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload-time = "2025-08-21T10:28:05.377Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "psycopg2-binary" version = "2.9.10" @@ -384,11 +411,11 @@ wheels = [ [[package]] name = "pyfiglet" -version = "1.0.3" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/49/2554c0b7fef12c0b9633352bbd8751cc616f8e8880e0ebab7732c1535564/pyfiglet-1.0.3.tar.gz", hash = "sha256:bad3b55d2eccb30d4693ccfd94573c2a3477dd75f86a0e5465cea51bdbfe2875", size = 833445, upload-time = "2025-06-02T12:13:29.357Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/e3/0a86276ad2c383ce08d76110a8eec2fe22e7051c4b8ba3fa163a0b08c428/pyfiglet-1.0.4.tar.gz", hash = "sha256:db9c9940ed1bf3048deff534ed52ff2dafbbc2cd7610b17bb5eca1df6d4278ef", size = 1560615, upload-time = "2025-08-15T18:32:47.302Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/1d/f2cb03dd71a4dba891f808333fa505a6ed2762a8514d8ead7e423fa77e1b/pyfiglet-1.0.3-py3-none-any.whl", hash = "sha256:671bd101ca6a08dc2d94c6a2cda75a862c5e162b980af47d0ba4023837e36489", size = 1087203, upload-time = "2025-06-02T12:13:27.393Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5c/fe9f95abd5eaedfa69f31e450f7e2768bef121dbdf25bcddee2cd3087a16/pyfiglet-1.0.4-py3-none-any.whl", hash = "sha256:65b57b7a8e1dff8a67dc8e940a117238661d5e14c3e49121032bd404d9b2b39f", size = 1806118, upload-time = "2025-08-15T18:32:45.556Z" }, ] [[package]] @@ -418,6 +445,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, ] +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -596,13 +639,15 @@ version = "1.0.0" source = { editable = "." } dependencies = [ { name = "pandas" }, + { name = "pytest" }, { name = "vantage6-algorithm-tools" }, ] [package.metadata] requires-dist = [ { name = "pandas" }, - { name = "vantage6-algorithm-tools", specifier = "==5.0.0a36" }, + { name = "pytest" }, + { name = "vantage6-algorithm-tools", specifier = "==5.0.0a41" }, ] [package.metadata.requires-dev] @@ -610,7 +655,7 @@ dev = [] [[package]] name = "vantage6-algorithm-tools" -version = "5.0.0a36" +version = "5.0.0a41" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openpyxl" }, @@ -623,14 +668,14 @@ dependencies = [ { name = "sqlalchemy" }, { name = "vantage6-common" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/95/4cecf5c6497747cd7f91fa18a75782400d4051b2187b83797ec9a58ebb79/vantage6_algorithm_tools-5.0.0a36.tar.gz", hash = "sha256:cf6d467889059be54c33ccbda77a64cad51bc799749e83c7acfdf2df005a8887", size = 40234, upload-time = "2025-09-23T11:52:58.025Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/59/1a232eca6d9cf21c32a4e5b3c083e8ca56a04dab0c1fc5a181b0866dd4fa/vantage6_algorithm_tools-5.0.0a41.tar.gz", hash = "sha256:46ae718623e4367ce4e9c5d1ce5f8ecc4e56f27063dd9635f814b7e0127ae0d5", size = 51451, upload-time = "2025-10-27T15:21:08.58Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/7e/942d9925f80445bf2e30f66a4d20b2708084a4ec0afa49b0c7989e34bdf7/vantage6_algorithm_tools-5.0.0a36-py3-none-any.whl", hash = "sha256:47768497847a12e11abeb367b005b87234b46dd82d54b2cc6bd2444cf3a4d680", size = 44242, upload-time = "2025-09-23T11:52:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f8/c165babb0135f1135b2d00adff72e9ae826a5fb9491f7d4cb266f1c43d7d/vantage6_algorithm_tools-5.0.0a41-py3-none-any.whl", hash = "sha256:6c593a5ee1e73df685543c915f1e97cb3f805f5dbd4dbe819f5a47e27feb2999", size = 53471, upload-time = "2025-10-27T15:21:07.603Z" }, ] [[package]] name = "vantage6-common" -version = "5.0.0a36" +version = "5.0.0a41" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appdirs" }, @@ -645,7 +690,7 @@ dependencies = [ { name = "rich" }, { name = "schema" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/4d/ed06b07940116394291c792b28d34bad84809b3bcecde7c3500e1a6f64cb/vantage6_common-5.0.0a36.tar.gz", hash = "sha256:3d5dbe4398c4151fcd8fda3868e33de17e7b883fbb60aaf276092396a4739b68", size = 31339, upload-time = "2025-09-23T11:52:53.514Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/89/c1e0a171355a7f83d562194f0a1a180937b4d61efa7a845aa215df35cb0b/vantage6_common-5.0.0a41.tar.gz", hash = "sha256:af0c853ea589b6a408087d6ab0fe479f4baa5bc653bb82007e542aef8c88f773", size = 37239, upload-time = "2025-10-27T15:21:04.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/77/d178a6cdc4c5dd7c3cd2bed11818a59ee3b161d5a92564f56d78c2f737c8/vantage6_common-5.0.0a36-py3-none-any.whl", hash = "sha256:262c38a8e8ee182a61ff4578cf9718f4a663d6323fe679d133ea0561a0cca7fe", size = 37047, upload-time = "2025-09-23T11:52:52.042Z" }, + { url = "https://files.pythonhosted.org/packages/97/3d/9aa6f9883385d3de982ff81c4068d40ec2ba69efc2ec31153c0edddf0f91/vantage6_common-5.0.0a41-py3-none-any.whl", hash = "sha256:0eb23eb6b84bc46b0c23a68fa6b3333cec0ce5452fa1fc8577118d08b7aac945", size = 44090, upload-time = "2025-10-27T15:21:03.103Z" }, ] From 0bdb32352792c27bb08bf7443b19d4a669c9ad1b Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 29 Oct 2025 08:36:10 +0100 Subject: [PATCH 5/5] Allow prerelease in the building of the docker image --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c77d2ff..a593597 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,8 @@ ARG PKG_NAME="v6-session-basics" # install federated algorithm COPY . /app -RUN uv pip install --system -e /app +# TODO v5+ should remove --prerelease=allow when official release is made +RUN uv pip install --system -e /app --prerelease=allow # Set environment variable to make name of the package available within the # docker image.