Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class ShowVersion(ApiBaseTask):

## Changelog

### Version 26.3.0
### Version 26.3.1

#### 🚀 Features

Expand Down
30 changes: 11 additions & 19 deletions digitalai/release/integration/base_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,46 +178,38 @@ def get_release_api_client(self,

:param server_address: Optional Release server URL. Defaults to the task's server URL.
:param username: Optional username. Defaults to the task user's username.
:param password: Optional password. Defaults to the task user's password.
:param password: Optional password. Defaults to the task user's password. When a
password is available but no username is, it is treated as a personal access token.
:param personal_access_token: Optional personal access token for authentication.
:param timeout: Optional default timeout (in seconds) applied to every request.
Accepts a single float or a (connect, read) tuple. Can be overridden per call.
:param kwargs: Additional session parameters (e.g., headers).
"""
task_user = self.get_task_user()
server_address = server_address or self.get_release_server_url()
username = username or (task_user and task_user.username)
password = password or (task_user and task_user.password)

# A password without a username is treated as a personal access token.
token = personal_access_token or (None if username else password)

if personal_access_token:
if token:
if not server_address:
raise ValueError(
"Cannot connect to Release API without server URL. "
"Make sure that the release server URL is available."
)
return ReleaseAPIClient(server_address,
personal_access_token=personal_access_token,
personal_access_token=token,
timeout=timeout,
**kwargs)

username = username or (task_user and task_user.username)
password = password or (task_user and task_user.password)
self._validate_api_credentials(server_address, username, password)
return ReleaseAPIClient(server_address, username, password, timeout=timeout, **kwargs)

def _validate_api_credentials(self, server_address: str = None,
username: str = None, password: str = None) -> None:
"""
Validates that the necessary credentials are available for connecting to the Release API.
"""
task_user = self.get_task_user()
if not all([
server_address or self.get_release_server_url(),
username or (task_user and task_user.username),
password or (task_user and task_user.password)
]):
if not all([server_address, username, password]):
raise ValueError(
"Cannot connect to Release API without server URL, username, or password. "
"Make sure that the 'Run as user' property is set on the release."
)
return ReleaseAPIClient(server_address, username, password, timeout=timeout, **kwargs)



4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "digitalai_release_sdk"
version = "26.3.0"
version = "26.3.1"
description = "Digital.ai Release SDK"
readme = "README.md"
license = "MIT"
Expand All @@ -19,7 +19,7 @@ classifiers = [
"Operating System :: OS Independent"
]
dependencies = [
"digitalai-release-api-client==26.3.0",
"digitalai-release-api-client==26.3.1",
"dataclasses-json>=0.6.7, <1.0.0",
"pycryptodomex>=3.23.0, <4.0.0",
"python-dateutil>=2.9.0, <3.0.0",
Expand Down
11 changes: 7 additions & 4 deletions tests/release/integration/test_base_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def test_get_task_user_returns_none_without_release_context(self):
task = self._task()
self.assertIsNone(task.get_task_user())

def test_validate_api_credentials_raises_without_user(self):
def test_get_release_api_client_raises_without_task_user(self):
task = self._task()
task.release_server_url = "http://localhost:5516"
with self.assertRaises(ValueError):
Expand Down Expand Up @@ -158,10 +158,13 @@ def test_get_release_api_client_raises_when_password_missing(self):
with self.assertRaises(ValueError):
task.get_release_api_client()

def test_get_release_api_client_raises_when_username_missing(self):
def test_get_release_api_client_uses_password_as_token_when_username_missing(self):
task = self._task(None, "secret")
with self.assertRaises(ValueError):
task.get_release_api_client()
with mock.patch("digitalai.release.integration.base_task.ReleaseAPIClient") as fake_client:
client = task.get_release_api_client()
fake_client.assert_called_once_with(
self.SERVER_URL, personal_access_token="secret", timeout=None)
self.assertIs(client, fake_client.return_value)

def test_get_release_api_client_raises_when_credentials_blank(self):
task = self._task("", "")
Expand Down
10 changes: 5 additions & 5 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading