From 9fb81ef556cff7b7acd84bcac195c811588306d2 Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Fri, 25 Sep 2026 11:58:55 -0300 Subject: [PATCH] SIENTIAPDE-1646 Pin sqlalchemy<2.1 to fix psycopg driver break; use tmp_path in retrain - sqlalchemy 2.1 defaults postgresql:// URLs to psycopg (v3), but sientia_do only ships psycopg2-binary, breaking with "No module named psycopg" - Replace hardcoded 'tmp' mkdtemp mock with pytest tmp_path fixture in retrain_model tests to avoid writing to a fake path --- requirements-local.txt | 4 +++- requirements.txt | 4 +++- tests/laborious/activities/test_mlflow.py | 12 ++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/requirements-local.txt b/requirements-local.txt index 492e0ba..77aabf1 100644 --- a/requirements-local.txt +++ b/requirements-local.txt @@ -1,6 +1,8 @@ temporalio psycopg2-binary -sqlalchemy +# SQLAlchemy 2.1 makes psycopg (v3) the default driver for postgresql:// URLs; sientia_do +# builds that URL and ships only psycopg2-binary, so 2.1 fails with "No module named psycopg". +sqlalchemy<2.1 asyncua==1.0.6 redis git+ssh://git@github.com/Aignosi/sientia-dataops-library.git@1.12.2 diff --git a/requirements.txt b/requirements.txt index 4e57c46..e2cdfcb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,8 @@ temporalio psycopg2-binary -sqlalchemy +# SQLAlchemy 2.1 makes psycopg (v3) the default driver for postgresql:// URLs; sientia_do +# builds that URL and ships only psycopg2-binary, so 2.1 fails with "No module named psycopg". +sqlalchemy<2.1 asyncua==1.0.6 redis sientia_do>=1.12.2 diff --git a/tests/laborious/activities/test_mlflow.py b/tests/laborious/activities/test_mlflow.py index 700e9b3..c6b56cf 100644 --- a/tests/laborious/activities/test_mlflow.py +++ b/tests/laborious/activities/test_mlflow.py @@ -375,9 +375,9 @@ def test_request_predict_failure(mock_to_datetime, mock_from_dataframe, mlflow): @patch('laborious.activities.mlflow.rmtree') @patch('laborious.activities.mlflow.to_datetime') def test_retrain_model_success_data_success_retrain( - mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow + mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow, tmp_path ): - mock_mkdtemp.return_value = 'tmp' + mock_mkdtemp.return_value = str(tmp_path) mock_to_datetime.side_effect = lambda idx, **kwargs: pd.DatetimeIndex(idx) mv_alias = MagicMock() @@ -428,9 +428,9 @@ def test_retrain_model_success_data_success_retrain( @patch('laborious.activities.mlflow.rmtree') @patch('laborious.activities.mlflow.to_datetime') def test_retrain_model_success_with_payload_data( - mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow + mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow, tmp_path ): - mock_mkdtemp.return_value = 'tmp' + mock_mkdtemp.return_value = str(tmp_path) mock_to_datetime.side_effect = lambda idx, **kwargs: pd.DatetimeIndex(idx) mv_alias = MagicMock(run_id='src') mlflow.mlflow_repository._client.get_model_version_by_alias.return_value = mv_alias @@ -473,9 +473,9 @@ def test_retrain_model_success_with_payload_data( @patch('laborious.activities.mlflow.rmtree') @patch('laborious.activities.mlflow.to_datetime') def test_retrain_model_always_uses_retrain_even_with_full_retrain_flag( - mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow + mock_to_datetime, mock_rmtree, mock_mkdtemp, mock_log_artifact, mlflow, tmp_path ): - mock_mkdtemp.return_value = 'tmp' + mock_mkdtemp.return_value = str(tmp_path) mock_to_datetime.side_effect = lambda idx, **kwargs: pd.DatetimeIndex(idx) mv_alias = MagicMock(run_id='src') mlflow.mlflow_repository._client.get_model_version_by_alias.return_value = mv_alias