feat: enhance configuration and error handling in project setup

- Added new ignore rule for Ruff to allow temporary paths in tests.
- Introduced MyPy overrides for specific modules to ignore errors.
- Refactored `Cleanup` and `ExperimentTracking` classes to remove async keywords from methods, improving consistency in method signatures.
- Updated `Training` class methods to handle synchronous operations, enhancing performance and clarity.
- Adjusted `requirements.txt` to remove unnecessary Git dependency, streamlining project setup.
This commit is contained in:
vitor-aignosi
2026-04-07 10:25:17 -03:00
parent 6b1df7c3a7
commit 09ee92f100
21 changed files with 500 additions and 309 deletions

View File

@@ -1,6 +1,5 @@
"""Unit tests for ExperimentTracking class with 100% coverage."""
import asyncio
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
@@ -185,7 +184,7 @@ def test_execute_update_success(
mock_engine.begin.return_value.__enter__.return_value = mock_connection
et.engine = mock_engine
result = asyncio.run(et._execute_update('UPDATE test SET x = :x', {'x': 1}))
result = et._execute_update('UPDATE test SET x = :x', {'x': 1})
assert result == {'rowcount': 1}
mock_connection.execute.assert_called_once()
@@ -212,7 +211,7 @@ def test_update_experiment_run_status_success(
mock_execute = MagicMock()
async def mock_execute_update(*args, **kwargs):
def mock_execute_update(*args, **kwargs):
mock_execute(*args, **kwargs)
return {'rowcount': 1}
@@ -226,7 +225,7 @@ def test_update_experiment_run_status_success(
'status': 'running',
}
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
mock_execute.assert_called_once()
call_args = mock_execute.call_args
@@ -255,7 +254,7 @@ def test_update_experiment_run_status_missing_status(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -264,9 +263,9 @@ def test_update_experiment_run_status_missing_status(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_status_with_error_success(
@@ -290,7 +289,7 @@ def test_update_experiment_run_status_with_error_success(
mock_execute = MagicMock()
async def mock_execute_update(*args, **kwargs):
def mock_execute_update(*args, **kwargs):
mock_execute(*args, **kwargs)
return {'rowcount': 1}
@@ -305,7 +304,7 @@ def test_update_experiment_run_status_with_error_success(
'error_message': 'Test error',
}
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
mock_execute.assert_called_once()
call_args = mock_execute.call_args
@@ -336,7 +335,7 @@ def test_update_experiment_run_status_with_error_truncate_message(
mock_execute = MagicMock()
async def mock_execute_update(*args, **kwargs):
def mock_execute_update(*args, **kwargs):
mock_execute(*args, **kwargs)
return {'rowcount': 1}
@@ -352,7 +351,7 @@ def test_update_experiment_run_status_with_error_truncate_message(
'error_message': long_error,
}
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
call_args = mock_execute.call_args
assert len(call_args[0][1]['error_message']) == 1024
@@ -377,7 +376,7 @@ def test_update_experiment_run_status_with_error_missing_error_message(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -387,9 +386,9 @@ def test_update_experiment_run_status_with_error_missing_error_message(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_model_saved_success(
@@ -413,7 +412,7 @@ def test_update_experiment_run_model_saved_success(
mock_execute = MagicMock()
async def mock_execute_update(*args, **kwargs):
def mock_execute_update(*args, **kwargs):
mock_execute(*args, **kwargs)
return {'rowcount': 1}
@@ -428,7 +427,7 @@ def test_update_experiment_run_model_saved_success(
'run_name': 'run_001',
}
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
mock_execute.assert_called_once()
call_args = mock_execute.call_args
@@ -457,7 +456,7 @@ def test_update_experiment_run_model_saved_missing_run_name(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -467,9 +466,9 @@ def test_update_experiment_run_model_saved_missing_run_name(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_invalid_update_type(
@@ -491,7 +490,7 @@ def test_update_experiment_run_invalid_update_type(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -500,9 +499,9 @@ def test_update_experiment_run_invalid_update_type(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_no_rows_updated(
@@ -524,11 +523,11 @@ def test_update_experiment_run_no_rows_updated(
metrics_controller=mock_metrics_controller,
)
async def mock_execute_update(*args, **kwargs):
def mock_execute_update(*args, **kwargs):
return {'rowcount': 0}
et._execute_update = mock_execute_update
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -538,9 +537,9 @@ def test_update_experiment_run_no_rows_updated(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_status_with_error_missing_status(
@@ -562,7 +561,7 @@ def test_update_experiment_run_status_with_error_missing_status(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -572,9 +571,9 @@ def test_update_experiment_run_status_with_error_missing_status(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_update_experiment_run_model_saved_missing_status(
@@ -596,7 +595,7 @@ def test_update_experiment_run_model_saved_missing_status(
metrics_controller=mock_metrics_controller,
)
et.send_notification_async = AsyncMock()
et.send_notification = MagicMock()
input_data = {
'metadata': {'workflow_id': 'test-123'},
@@ -606,9 +605,9 @@ def test_update_experiment_run_model_saved_missing_status(
}
with pytest.raises(RuntimeError):
asyncio.run(et.update_experiment_run(input_data))
et.update_experiment_run(input_data)
et.send_notification_async.assert_awaited_once()
et.send_notification.assert_called_once()
def test_experiment_tracking_del_with_engine_no_super_del(