Skip to content

Commit 7fa9997

Browse files
Merge branch 'main' into fix/legacy-mpp-multiple-dcm-files
2 parents 55c4343 + 3f588bc commit 7fa9997

32 files changed

+1187
-116
lines changed

.github/dependabot.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ updates:
2020
- "dependabot"
2121
- "dependencies"
2222
- "skip:test:long_running"
23+
- "skip:codecov"
2324
schedule:
2425
interval: "cron"
2526
cronjob: "0 1 * * 1-5"

.github/labels.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@
9494
description: Skip unit tests
9595
color: "614318"
9696

97+
- name: skip:codecov
98+
description: Skip Codecov reporting and check
99+
color: "8b4512"
100+
97101
- name: skip:ketryx
98102
description: Skip Ketryx ALM reporting and checks
99103
color: "8b4513"
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
name: "> Stress Test (5 minutely)"
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
platform_environment:
7+
description: 'Environment to test against, that is staging or production'
8+
required: false
9+
default: 'staging'
10+
type: string
11+
branch:
12+
description: 'Branch to checkout (leave empty for default branch)'
13+
required: false
14+
default: ''
15+
type: string
16+
secrets:
17+
AIGNOSTICS_CLIENT_ID_DEVICE_STAGING:
18+
required: true
19+
AIGNOSTICS_REFRESH_TOKEN_STAGING:
20+
required: true
21+
GCP_CREDENTIALS_STAGING:
22+
required: true
23+
AIGNOSTICS_CLIENT_ID_DEVICE_PRODUCTION:
24+
required: true
25+
AIGNOSTICS_REFRESH_TOKEN_PRODUCTION:
26+
required: true
27+
GCP_CREDENTIALS_PRODUCTION:
28+
required: true
29+
SENTRY_DSN:
30+
required: true
31+
32+
env:
33+
# https://gist.github.com/NodeJSmith/e7e37f2d3f162456869f015f842bcf15
34+
PYTHONIOENCODING: "utf8"
35+
AIGNOSTICS_PLATFORM_ENVIRONMENT: ${{ inputs.platform_environment }}
36+
37+
jobs:
38+
test-scheduled-hourly:
39+
runs-on: ubuntu-latest
40+
permissions:
41+
contents: read
42+
id-token: write
43+
steps:
44+
- name: Checkout
45+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
46+
with:
47+
ref: ${{ inputs.branch || github.ref }}
48+
fetch-depth: 0
49+
50+
- name: Install uv
51+
uses: astral-sh/setup-uv@2ddd2b9cb38ad8efd50337e8ab201519a34c9f24 # v7.1.1
52+
with:
53+
version-file: "pyproject.toml"
54+
enable-cache: true
55+
cache-dependency-glob: uv.lock
56+
57+
- name: Install dev tools
58+
shell: bash
59+
run: .github/workflows/_install_dev_tools.bash
60+
61+
- name: Install Python, venv and dependencies
62+
shell: bash
63+
run: uv sync --all-extras --frozen --link-mode=copy
64+
65+
- name: Create .env file
66+
uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3
67+
with:
68+
# The following 3 lines are correct even if vscode complains
69+
envkey_AIGNOSTICS_API_ROOT: ${{ inputs.platform_environment == 'staging' && 'https://platform-staging.aignostics.com' || 'https://platform.aignostics.com' }}
70+
envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ inputs.platform_environment == 'staging' && secrets.AIGNOSTICS_CLIENT_ID_DEVICE_STAGING || secrets.AIGNOSTICS_CLIENT_ID_DEVICE_PRODUCTION }}
71+
envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ inputs.platform_environment == 'staging' && secrets.AIGNOSTICS_REFRESH_TOKEN_STAGING || secrets.AIGNOSTICS_REFRESH_TOKEN_PRODUCTION }}
72+
envkey_AIGNOSTICS_SENTRY_ENABLED: true
73+
envkey_AIGNOSTICS_SENTRY_DSN: ${{ secrets.SENTRY_DSN}}
74+
envkey_AIGNOSTICS_SENTRY_DEBUG: false
75+
envkey_AIGNOSTICS_SENTRY_SEND_DEFAULT_PII: false
76+
envkey_AIGNOSTICS_SENTRY_SAMPLE_RATE: 0
77+
envkey_AIGNOSTICS_SENTRY_TRACES_SAMPLE_RATE: 0
78+
envkey_AIGNOSTICS_SENTRY_PROFILES_SAMPLE_RATE: 0
79+
fail_on_empty: false
80+
81+
- name: Set up GCP credentials for bucket access
82+
shell: bash
83+
env:
84+
GCP_CREDENTIALS: ${{ inputs.platform_environment == 'staging' && secrets.GCP_CREDENTIALS_STAGING || secrets.GCP_CREDENTIALS_PRODUCTION }}
85+
run: |
86+
echo "$GCP_CREDENTIALS" | base64 -d > credentials.json
87+
echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV
88+
89+
- name: Test / stress
90+
shell: bash
91+
run: |
92+
set +e
93+
make test_stress

.github/workflows/_test.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,23 @@ jobs:
222222

223223
- name: Upload coverage reports to Codecov
224224
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
225-
if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') && matrix.runner == 'ubuntu-latest' }}
225+
if: |
226+
!cancelled() &&
227+
(env.GITHUB_WORKFLOW_RUNTIME != 'ACT') &&
228+
matrix.runner == 'ubuntu-latest' &&
229+
!contains(inputs.commit_message, 'skip:ketryx') &&
230+
!contains(github.event.pull_request.labels.*.name, 'skip:ketryx')
226231
with:
227232
token: ${{ secrets.CODECOV_TOKEN }}
228233
slug: aignostics/python-sdk
229234

230235
- name: Upload test results to Codecov
231-
if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') && matrix.runner == 'ubuntu-latest' }}
236+
if: |
237+
!cancelled() &&
238+
(env.GITHUB_WORKFLOW_RUNTIME != 'ACT') &&
239+
matrix.runner == 'ubuntu-latest' &&
240+
!contains(inputs.commit_message, 'skip:ketryx') &&
241+
!contains(github.event.pull_request.labels.*.name, 'skip:ketryx')
232242
uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1
233243
with:
234244
token: ${{ secrets.CODECOV_TOKEN }}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: "+ Stress Testing / Staging (5 minutely)"
2+
3+
on:
4+
schedule:
5+
- cron: '*/5 * * * *'
6+
workflow_dispatch:
7+
inputs:
8+
branch:
9+
description: 'Branch to test (leave empty for main)'
10+
required: false
11+
type: string
12+
default: ''
13+
14+
jobs:
15+
scheduled-testing-staging-5-minutely:
16+
uses: ./.github/workflows/_scheduled-test-stress.yml
17+
with:
18+
platform_environment: "staging"
19+
permissions:
20+
contents: read
21+
id-token: write
22+
secrets:
23+
AIGNOSTICS_CLIENT_ID_DEVICE_STAGING: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE_STAGING }}
24+
AIGNOSTICS_REFRESH_TOKEN_STAGING: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN_STAGING }}
25+
GCP_CREDENTIALS_STAGING: ${{ secrets.GCP_CREDENTIALS_STAGING }}
26+
AIGNOSTICS_CLIENT_ID_DEVICE_PRODUCTION: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE_PRODUCTION }}
27+
AIGNOSTICS_REFRESH_TOKEN_PRODUCTION: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN_PRODUCTION }}
28+
GCP_CREDENTIALS_PRODUCTION: ${{ secrets.GCP_CREDENTIALS_PRODUCTION }}
29+
SENTRY_DSN: ${{ secrets.SENTRY_DSN }} # For metrics and heartbeat

CHANGELOG.md

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,67 @@
11
[🔬 Aignostics Python SDK](https://aignostics.readthedocs.io/en/latest/)
22

3-
# [0.2.204](https://github.com/aignostics/python-sdk/compare/v0.2.203..0.2.204) - 2025-11-20
3+
# [0.2.209](https://github.com/aignostics/python-sdk/compare/v0.2.208..0.2.209) - 2025-11-21
4+
5+
### ⛰️ Features
6+
7+
- *(application)* Allow to list and describe application and runs with the output being json - ([c995ebe](https://github.com/aignostics/python-sdk/commit/c995ebe616a6f8c28a7f709404d5ed6469c5aaff))
8+
- *(application)* Allow to cancel runs matching a filter with criteria including application id, application version and tags. includes --dry-run option - ([c995ebe](https://github.com/aignostics/python-sdk/commit/c995ebe616a6f8c28a7f709404d5ed6469c5aaff))
9+
- Feat/logging-redirect - ([15de455](https://github.com/aignostics/python-sdk/commit/15de4552b72008308d16f6184527ff9e9fcc0e3e))
10+
11+
### 🧪 Testing
12+
13+
- *(platform)* More tags for test_platform_special_app_submit - ([8c8beac](https://github.com/aignostics/python-sdk/commit/8c8beac0ea18f11b9c7f64312f683fd9f2e98796))
14+
- *(platform)* Staging: L4, on-demand every 5 min - ([17a9edc](https://github.com/aignostics/python-sdk/commit/17a9edc710ef3ae429e172665e7dc55ccbb6f3a0))
15+
- *(stress)* Support stress_only tests that only run on make test_stress and 5-minutely stress test schedule - ([8a16b36](https://github.com/aignostics/python-sdk/commit/8a16b36d237fcc5b64f3efc7440f063fb0c91703))
16+
- *(stress)* Target 0.0.0-test.retry.bug.20.11 - ([2dc98bc](https://github.com/aignostics/python-sdk/commit/2dc98bc78980f1241604f1faccc4b705fd89e8cb))
17+
- *(stress)* 5 minute stress tests - ([6a2a0e1](https://github.com/aignostics/python-sdk/commit/6a2a0e14dc123dce8af192a32e11250608763701))
18+
19+
### ⚙️ Miscellaneous Tasks
20+
21+
- *(docs)* Fix Utils Module Specification - ([a1ebc4a](https://github.com/aignostics/python-sdk/commit/a1ebc4aac221969f404687520a9286bfcac38fb1))
22+
- *(docs)* Fix SPEC_WSI_SERVICE.md - ([07b991a](https://github.com/aignostics/python-sdk/commit/07b991a3ede2596ed043499a1ad7db1349cf4073))
23+
- *(stress)* Workflow - ([ce39147](https://github.com/aignostics/python-sdk/commit/ce391478dcb38ce2b75b572d135948e6a2499912))
24+
25+
26+
# [v0.2.208](https://github.com/aignostics/python-sdk/compare/v0.2.207..v0.2.208) - 2025-11-21
27+
28+
### ⛰️ Features
29+
30+
- *(application)* Show duration in run sidebar - ([ed583fd](https://github.com/aignostics/python-sdk/commit/ed583fd5a15e404ba5d3cf8296d0bde8280d90e6))
31+
32+
33+
# [v0.2.207](https://github.com/aignostics/python-sdk/compare/v0.2.206..v0.2.207) - 2025-11-20
34+
35+
### 🧪 Testing
36+
37+
- *(application)* Auto-cancel custom pipeline tests - ([987d025](https://github.com/aignostics/python-sdk/commit/987d025a839f74429fbe3a2cd2aa6234df4d9ff8))
38+
- *(system)* Mark test as sequential - ([0b90d06](https://github.com/aignostics/python-sdk/commit/0b90d066fae002b217eeb79af525b49d224b741d))
39+
40+
41+
# [v0.2.206](https://github.com/aignostics/python-sdk/compare/v0.2.205..v0.2.206) - 2025-11-20
42+
43+
### 🐛 Bug Fixes
44+
45+
- *(application)* Pipeline settings in GUI and CLI ([#271](https://github.com/orhun/git-cliff/issues/271)) - ([feaa047](https://github.com/aignostics/python-sdk/commit/feaa047d2608a302e162260606045b8c026e20fe))
46+
47+
### 🚜 Refactor
48+
49+
- *(application)* Reduce max items in sidebar from 500 to 200 - ([e8f07a9](https://github.com/aignostics/python-sdk/commit/e8f07a9659a009cf814930aafd4b32671354d680))
50+
51+
### 🧪 Testing
52+
53+
- *(application)* Proper integration tests for pipeline settings in GUI and CLI - ([feaa047](https://github.com/aignostics/python-sdk/commit/feaa047d2608a302e162260606045b8c026e20fe))
54+
- *(platform,staging)* Switch to A100, ON_DEMAND, 1 (was L4, SPOT, 1) - ([4b8be3d](https://github.com/aignostics/python-sdk/commit/4b8be3d17527a8de71342a1fb693e73ce2aa7197))
55+
56+
57+
# [v0.2.205](https://github.com/aignostics/python-sdk/compare/v0.2.204..v0.2.205) - 2025-11-20
58+
59+
### ⛰️ Features
60+
61+
- *(application)* GUI and CLI now use L4, SPOT, max=gpu=1 as defaults - ([37873c7](https://github.com/aignostics/python-sdk/commit/37873c72f39688300b63b06188f14e3a53daaf76))
62+
63+
64+
# [v0.2.204](https://github.com/aignostics/python-sdk/compare/v0.2.203..v0.2.204) - 2025-11-20
465

566
### 🧪 Testing
667

Makefile

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ $(error Python version validation failed. See error message above.)
2121
endif
2222

2323
# Define all PHONY targets
24-
.PHONY: act all audit bump clean codegen dist dist_native docs docker_build gui_watch install lint pre_commit_run_all profile setup test test_coverage_reset test_default test_e2e test_e2e_matrix test_integration test_integration_matrix test_long_running test_scheduled test_sequential test_unit test_unit_matrix test_very_long_running update_from_template
24+
.PHONY: act all audit bump clean codegen dist dist_native docs docker_build gui_watch install lint pre_commit_run_all profile setup test test_coverage_reset test_default test_e2e test_e2e_matrix test_integration test_integration_matrix test_long_running test_scheduled test_stress test_sequential test_unit test_unit_matrix test_very_long_running update_from_template
2525

2626

2727
# Main target i.e. default sessions defined in noxfile.py
@@ -63,40 +63,40 @@ test_default:
6363

6464
## Run unit tests (non-sociable tests)
6565
test_unit:
66-
XDIST_WORKER_FACTOR=0.0 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "unit and not long_running and not very_long_running" --cov-append
66+
XDIST_WORKER_FACTOR=0.0 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "unit and not long_running and not very_long_running and not stress_only" --cov-append
6767

6868
test_unit_matrix:
69-
XDIST_WORKER_FACTOR=0.5 uv run --all-extras nox -s test -- -m "unit and not long_running and not very_long_running" --cov-append
69+
XDIST_WORKER_FACTOR=0.5 uv run --all-extras nox -s test -- -m "unit and not long_running and not very_long_running and not stress_only" --cov-append
7070

7171
## Run integration tests (test real layer/module interactions with mocked external services)
7272
test_integration:
73-
XDIST_WORKER_FACTOR=0.2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "integration and not long_running and not very_long_running" --cov-append
74-
73+
XDIST_WORKER_FACTOR=0.2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "integration and not long_running and not very_long_running and not stress_only" --cov-append
7574
test_integration_matrix:
76-
XDIST_WORKER_FACTOR=0.5 uv run --all-extras nox -s test -- -m "integration and not long_running and not very_long_running" --cov-append
75+
XDIST_WORKER_FACTOR=0.5 uv run --all-extras nox -s test -- -m "integration and not long_running and not very_long_running and not stress_only" --cov-append
7776

7877
## Run e2e tests (test complete workflows with real external services)
7978
test_e2e:
80-
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "e2e and not long_running and not very_long_running" --cov-append
81-
79+
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "e2e and not long_running and not very_long_running and not stress_only" --cov-append
8280
test_e2e_matrix:
83-
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -- -m "e2e and not long_running and not very_long_running" --cov-append
81+
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -- -m "e2e and not long_running and not very_long_running and not stress_only" --cov-append
8482

8583
## Run tests marked as long_running
8684
test_long_running:
87-
XDIST_WORKER_FACTOR=2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m long_running --cov-append
88-
85+
XDIST_WORKER_FACTOR=2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "long_running and not stress_only" --cov-append
8986
## Run tests marked as very_long_running
9087
test_very_long_running:
91-
XDIST_WORKER_FACTOR=2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m very_long_running --cov-append
88+
XDIST_WORKER_FACTOR=2 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "very_long_running and not stress_only" --cov-append
9289

9390
## Run tests marked as scheduled or scheduled_only
9491
test_scheduled:
95-
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "(scheduled or scheduled_only)"
96-
92+
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "(scheduled or scheduled_only) and not stress_only"
9793
## Run tests marked as sequential
9894
test_sequential:
99-
uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m sequential
95+
uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "sequential and not stress_only"
96+
97+
## Run stress tests marked as such
98+
test_stress:
99+
XDIST_WORKER_FACTOR=1 uv run --all-extras nox -s test -p $(PYTHON_VERSION) -- -m "(stress or stress_only)"
100100

101101
## Reset test coverage data
102102
test_coverage_reset:

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.2.204
1+
0.2.209

aignostics.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ else:
137137
name='aignostics.app',
138138
icon='logo.ico',
139139
bundle_identifier='com.aignostics.launchpad',
140-
version='0.2.204',
140+
version='0.2.209',
141141
info_plist={
142142
'NSPrincipalClass': 'NSApplication',
143143
'NSAppleScriptEnabled': False,

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
project = "aignostics"
2828
author = "Helmut Hoffer von Ankershoffen"
2929
copyright = f" (c) 2025-{datetime.now(UTC).year} Aignostics GmbH, Author: {author}" # noqa: A001
30-
version = "0.2.204"
30+
version = "0.2.209"
3131
release = version
3232
github_username = "aignostics"
3333
github_repository = "python-sdk"

0 commit comments

Comments
 (0)