Skip to content

Commit 207eb0c

Browse files
fix(security): update deps given CVE-2025-50181, CVE-2025-50182
fix(typer): workaround fastapi/typer#1240 refactor(performance): faster boot style(bucket): button layout
1 parent 42d745f commit 207eb0c

File tree

17 files changed

+193
-156
lines changed

17 files changed

+193
-156
lines changed

CHANGELOG.md

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

3-
(https://github.com/aignostics/python-sdk/compare/v0.2.63..0.2.64) - 2025-06-18
3+
(https://github.com/aignostics/python-sdk/compare/v0.2.64..0.2.65) - 2025-06-19
4+
5+
6+
- *(deps)* Bump urllib3 given CVEs CVE-2025-50181 and CVE-2025-50182 - ([f395d9a](https://github.com/aignostics/python-sdk/commit/f395d9a8f9a6a38fd7d5da9c52542a97bc36274b))
7+
8+
9+
(https://github.com/aignostics/python-sdk/compare/v0.2.63..v0.2.64) - 2025-06-18
410

511

612
- *(bucket)* Allow to select destination in bucket download gui - ([44a6611](https://github.com/aignostics/python-sdk/commit/44a66119bdab63d389f7b4d489e8b0e2a4222977))

CLI_REFERENCE.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ $ aignostics [OPTIONS] COMMAND [ARGS]...
1414
* `--show-completion`: Show completion for the current shell, to copy it or customize the installation.
1515
* `--help`: Show this message and exit.
1616

17-
🔬 Aignostics Python SDK v0.2.62 - built with love in Berlin 🐻
17+
🔬 Aignostics Python SDK v0.2.64 - built with love in Berlin 🐻
1818

1919
**Commands**:
2020

@@ -196,7 +196,7 @@ $ aignostics application run execute [OPTIONS] APPLICATION_VERSION_ID METADATA_C
196196

197197
* `--create-subdirectory-for-run / --no-create-subdirectory-for-run`: Create a subdirectory for the results of the run in the destination directory [default: create-subdirectory-for-run]
198198
* `--create-subdirectory-per-item / --no-create-subdirectory-per-item`: Create a subdirectory per item in the destination directory [default: create-subdirectory-per-item]
199-
* `--upload-prefix TEXT`: Prefix for the upload destination. If not given will be set to current milliseconds. [default: 1750197829503.505]
199+
* `--upload-prefix TEXT`: Prefix for the upload destination. If not given will be set to current milliseconds. [default: 1750311380957.609]
200200
* `--wait-for-completion / --no-wait-for-completion`: Wait for run completion and download results incrementally [default: wait-for-completion]
201201
* `--help`: Show this message and exit.
202202

@@ -252,7 +252,7 @@ $ aignostics application run upload [OPTIONS] APPLICATION_VERSION_ID METADATA_CS
252252

253253
**Options**:
254254

255-
* `--upload-prefix TEXT`: Prefix for the upload destination. If not given will be set to current milliseconds. [default: 1750197829503.5952]
255+
* `--upload-prefix TEXT`: Prefix for the upload destination. If not given will be set to current milliseconds. [default: 1750311380957.699]
256256
* `--help`: Show this message and exit.
257257

258258
#### `aignostics application run submit`
@@ -456,9 +456,6 @@ $ aignostics bucket find [OPTIONS] [WHAT]...
456456

457457
Download objects from bucket in Aignostics platform to local directory.
458458

459-
Raises:
460-
typer.Exit: If pattern is invalid regex or no objects found.
461-
462459
**Usage**:
463460

464461
```console

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.2.64
1+
0.2.65

aignostics.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,5 @@ app = BUNDLE(
7070
name='aignostics.app',
7171
icon='logo.ico',
7272
bundle_identifier='com.aignostics.launchpad',
73-
version='0.2.64'
73+
version='0.2.65'
7474
)

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.64"
30+
version = "0.2.65"
3131
release = version
3232
github_username = "aignostics"
3333
github_repository = "python-sdk"

examples/notebook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# requires-python = ">=3.13"
33
# dependencies = [
44
# "marimo",
5-
# "aignostics==0.2.64",
5+
# "aignostics==0.2.65",
66
# ]
77
# ///
88

noxfile.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ def audit(session: nox.Session) -> None:
8282
_setup_venv(session)
8383

8484
# pip-audit to check for vulnerabilities
85-
session.run("pip-audit", "-f", "json", "-o", "reports/vulnerabilities.json")
86-
_format_json_with_jq(session, "reports/vulnerabilities.json")
85+
try:
86+
session.run("pip-audit", "-f", "json", "-o", "reports/vulnerabilities.json")
87+
except CommandFailed:
88+
_format_json_with_jq(session, "reports/vulnerabilities.json")
89+
session.log("pip-audit failed with JSON output, retrying with default format")
90+
session.run("pip-audit")
8791

8892
# pip-licenses to check for compliance
8993
pip_licenses_base_args = [

pyproject.toml

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "aignostics"
3-
version = "0.2.64"
3+
version = "0.2.65"
44
description = "🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library."
55
readme = "README.md"
66
authors = [
@@ -75,7 +75,7 @@ requires-python = ">=3.11, <4.0"
7575
dependencies = [
7676
# From Template
7777
"fastapi[standard,all]>=0.115.13",
78-
"logfire[system-metrics]>=3.21.0",
78+
"logfire[system-metrics]>=3.21.1",
7979
"nicegui[native]>=2.20.0",
8080
"opentelemetry-instrumentation-fastapi>=0.53b0",
8181
"opentelemetry-instrumentation-httpx>=0.53b0",
@@ -94,11 +94,11 @@ dependencies = [
9494
# Custom
9595
"appdirs>=1.4.4",
9696
"auth0-python>=4.10.0",
97-
"boto3>=1.38.38",
97+
"boto3>=1.38.39",
9898
"dicom-validator>=0.7.1",
9999
"dicomweb-client[gcp]>=0.59.2",
100100
"duckdb>=0.10.0,<=1.4.0",
101-
"google-cloud-storage>=2.12.0",
101+
"google-cloud-storage>=3.1.1",
102102
"google-crc32c>=1.7.1",
103103
"highdicom>=0.25.1",
104104
"httpx>=0.28.1",
@@ -124,15 +124,15 @@ dependencies = [
124124
"shapely>=2.1.1",
125125
"show-in-file-manager>=1.1.5",
126126
"tqdm>=4.67.1",
127-
"urllib3>=2.2.3",
127+
"urllib3>=2.5.0",
128128
"wsidicom>=0.27.1",
129129
]
130130

131131
[project.optional-dependencies]
132132
jupyter = ["jupyter>=1.1.1"]
133133
marimo = [
134134
"cloudpathlib>=0.21.1",
135-
"marimo>=0.13.15",
135+
"marimo>=0.14.0",
136136
"matplotlib>=3.10.3",
137137
"shapely>=2.1.0",
138138
]
@@ -153,10 +153,10 @@ dev = [
153153
"pip-licenses @ git+https://github.com/neXenio/pip-licenses.git@master", # https://github.com/raimon49/pip-licenses/pull/224
154154
"pre-commit>=4.1.0",
155155
"pyinstaller>=6.14.0",
156-
"pyright>=1.1.401",
157-
"pytest>=8.4.0",
156+
"pyright>=1.1.402",
157+
"pytest>=8.4.1",
158158
"pytest-asyncio>=1.0.0",
159-
"pytest-cov>=6.1.1",
159+
"pytest-cov>=6.2.1",
160160
"pytest-docker>=3.2.2",
161161
"pytest-env>=1.1.5",
162162
"pytest-md-report>=0.7.0",
@@ -167,7 +167,7 @@ dev = [
167167
"pytest-timeout>=2.4.0",
168168
"pytest-watcher>=0.4.3",
169169
"pytest-xdist[psutil]>=3.7.0",
170-
"ruff>=0.11.12",
170+
"ruff>=0.12.0",
171171
"scalene>=1.5.51",
172172
"sphinx>=8.2.3",
173173
"sphinx-autobuild>=2024.10.3",
@@ -182,7 +182,7 @@ dev = [
182182
"swagger-plugin-for-sphinx>=5.1.0",
183183
"tomli>=2.1.0",
184184
"types-pyyaml>=6.0.12.20250516",
185-
"types-requests>=2.32.0.20250602",
185+
"types-requests>=2.32.4.20250611",
186186
"watchdog>=6.0.0",
187187
]
188188

@@ -215,6 +215,7 @@ override-dependencies = [ # https://github.com/astral-sh/uv/issues/4422
215215
"h11>=0.16.0", # CVE-2025-43859
216216
"tornado>=6.5.0", # CVE-2025-47287
217217
"jupyter-core>=5.8.1", # CVE-2025-30167
218+
"urllib3>=2.5.0", # CVE-2025-50181, CVE-2025-50182
218219
]
219220

220221
[tool.ruff]
@@ -352,7 +353,7 @@ source = ["src/"]
352353

353354

354355
[tool.bumpversion]
355-
current_version = "0.2.64"
356+
current_version = "0.2.65"
356357
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
357358
serialize = ["{major}.{minor}.{patch}"]
358359
search = "{current_version}"

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
sonar.projectKey=aignostics_python-sdk
22
sonar.organization=aignostics
3-
sonar.projectVersion=0.2.64
3+
sonar.projectVersion=0.2.65
44
sonar.projectDescription=🔬 Python SDK providing access to Aignostics AI services.
55
sonar.links.homepage=https://aignostics.readthedocs.io/en/latest/
66
sonar.links.scm=https://github.com/aignostics/python-sdk

src/aignostics/bucket/_gui.py

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ async def _select_data() -> None:
299299
return
300300

301301
bucket_form.destination = get_user_data_directory("datasets/idc")
302-
bucket_form.destination_label.set_text(f"Download to {bucket_form.destination!s}")
302+
bucket_form.destination_label.set_text(f"Will download to {bucket_form.destination!s}")
303303
await _update_button_states()
304304

305305
async def _select_destination() -> None:
@@ -323,7 +323,7 @@ async def _select_destination() -> None:
323323
)
324324
else:
325325
bucket_form.destination = path
326-
bucket_form.destination_label.set_text(f"Download to {bucket_form.destination!s}")
326+
bucket_form.destination_label.set_text(f"Will download to {bucket_form.destination!s}")
327327
bucket_form.destination_open_button.enable()
328328
ui.notify(f"You chose directory {bucket_form.destination}.", type="info")
329329
else:
@@ -338,29 +338,44 @@ def _open_destination() -> None:
338338
show_in_file_manager(str(bucket_form.destination))
339339

340340
with ui.row().classes("w-full gap-4"):
341-
bucket_form.download_button = (
342-
ui.button(
343-
"Download",
344-
icon="download",
345-
on_click=_download_selected,
346-
)
347-
.mark("BUTTON_DOWNLOAD_OBJECTS")
348-
.props("color=primary")
349-
.classes("w-1/5")
350-
)
351-
bucket_form.download_button.disable()
352-
353-
with ui.button("Data", on_click=_select_data, icon="folder_special", color="purple-400").mark(
354-
"BUTTON_DOWNLOAD_DESTINATION_DATA"
355-
):
356-
ui.tooltip("Use Launchpad datasets directory")
357-
358-
with ui.button("Custom", on_click=_select_destination, icon="folder").mark(
359-
"BUTTON_DOWNLOAD_DESTINATION"
360-
):
361-
ui.tooltip("Select a custom directory")
341+
with ui.column().classes("w-1/2"):
342+
with ui.row().classes("w-full"):
343+
bucket_form.download_button = (
344+
ui.button(
345+
"Download",
346+
icon="download",
347+
on_click=_download_selected,
348+
)
349+
.mark("BUTTON_DOWNLOAD_OBJECTS")
350+
.props("color=primary")
351+
)
352+
bucket_form.download_button.disable()
353+
354+
ui.space()
355+
356+
with ui.button("Data", on_click=_select_data, icon="folder_special", color="purple-400").mark(
357+
"BUTTON_DOWNLOAD_DESTINATION_DATA"
358+
):
359+
ui.tooltip("Use Launchpad datasets directory")
360+
361+
with ui.button("Custom", on_click=_select_destination, icon="folder").mark(
362+
"BUTTON_DOWNLOAD_DESTINATION"
363+
):
364+
ui.tooltip("Select a custom directory")
365+
with ui.row(align_items="center").classes("w-full"):
366+
bucket_form.destination_label = ui.label(
367+
MESSAGE_NO_DOWNLOAD_FOLDER_SELECTED
368+
if bucket_form.destination is None
369+
else str(f"Will download to {bucket_form.destination}")
370+
)
371+
ui.space()
372+
bucket_form.destination_open_button = ui.button(
373+
icon="folder_open", on_click=_open_destination, color="secondary"
374+
)
375+
bucket_form.destination_open_button.mark("BUTTON_OPEN_DESTINATION").disable()
362376

363377
ui.space()
378+
364379
bucket_form.delete_button = (
365380
ui.button(
366381
"Delete",
@@ -373,18 +388,6 @@ def _open_destination() -> None:
373388
)
374389
bucket_form.delete_button.disable()
375390

376-
with ui.row(align_items="center").classes("w-2/5"):
377-
ui.space()
378-
bucket_form.destination_label = ui.label(
379-
MESSAGE_NO_DOWNLOAD_FOLDER_SELECTED
380-
if bucket_form.destination is None
381-
else str(f"Download to {bucket_form.destination}")
382-
).classes("max-w-72")
383-
bucket_form.destination_open_button = ui.button(
384-
icon="folder_open", on_click=_open_destination, color="secondary"
385-
)
386-
bucket_form.destination_open_button.mark("BUTTON_OPEN_DESTINATION").disable()
387-
388391
# Progress card for downloads (initially hidden)
389392
with ui.card().classes("w-full") as progress_card:
390393
bucket_form.download_progress_card = progress_card

0 commit comments

Comments
 (0)