Skip to content

Commit 29e5498

Browse files
committed
build(compare-images): add python pixi configuration
Also add missing spatial_tolerance to emscripten package.
1 parent 8e72187 commit 29e5498

File tree

10 files changed

+3748
-29
lines changed

10 files changed

+3748
-29
lines changed

packages/compare-images/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ dist/
44
test/
55
package-lock.json
66
typescript/test/browser/demo-app/public
7-
micromamba/
7+
pyodide/

packages/compare-images/environment.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

packages/compare-images/package.json

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,24 @@
2323
"build:emscripten:debug": "itk-wasm pnpm-script build:emscripten:debug",
2424
"build:wasi": "itk-wasm pnpm-script build:wasi",
2525
"build:wasi:debug": "itk-wasm pnpm-script build:wasi:debug",
26-
"build:python:wasi": "itk-wasm pnpm-script build:python:wasi",
26+
"build:python:wasi": "echo 'No build:python:wasi script required with pixi'",
2727
"bindgen:typescript": "itk-wasm pnpm-script bindgen:typescript",
2828
"bindgen:python": "itk-wasm pnpm-script bindgen:python",
2929
"build:gen:typescript": "itk-wasm pnpm-script build:gen:typescript",
30-
"build:gen:python": "itk-wasm pnpm-script build:gen:python",
31-
"build:micromamba": "itk-wasm pnpm-script build:micromamba",
30+
"build:gen:python": "pnpm build:wasi && pnpm bindgen:python",
3231
"build:python:versionSync": "itk-wasm pnpm-script build:python:versionSync",
3332
"publish:python": "itk-wasm pnpm-script publish:python",
3433
"test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python",
3534
"test:data:download": "dam download test/data test/data.tar.gz bafybeiafli6egtmkcgany65po64w67hpqnmgwr5utqo6ycbbz7k5l33llu https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.171/compare-images-test-data.tar.gz",
3635
"test:data:pack": "dam pack test/data test/data.tar.gz",
37-
"test:python:wasi": "itk-wasm pnpm-script test:python:wasi",
38-
"test:python:emscripten": "itk-wasm pnpm-script test:python:emscripten",
39-
"test:python:dispatch": "itk-wasm pnpm-script test:python:emscripten",
40-
"test:python": "itk-wasm pnpm-script test:python"
36+
"test:python:wasi": "pixi run test-wasi",
37+
"test:python:emscripten": "pixi run test-emscripten",
38+
"test:python:dispatch": "pixi run test-dispatch",
39+
"test:python": "pixi run test-python"
4140
},
4241
"license": "Apache-2.0",
4342
"devDependencies": {
4443
"@itk-wasm/dam": "^1.1.0",
45-
"@thewtex/setup-micromamba": "^1.9.7",
4644
"itk-wasm": "workspace:^",
4745
"@itk-wasm/image-io-build": "workspace:^"
4846
}

packages/compare-images/pixi.lock

Lines changed: 3638 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compare-images/pixi.toml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[project]
2+
authors = ["Matt McCormick <[email protected]>"]
3+
channels = ["conda-forge"]
4+
description = "Compare images with a tolerance for regression testing."
5+
name = "compare-images"
6+
platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"]
7+
version = "0.1.0"
8+
9+
[tasks]
10+
11+
[dependencies]
12+
python = "3.12.*"
13+
pnpm = ">=9.12.1,<10"
14+
15+
[feature.python.dependencies]
16+
pytest = ">=8.3.3,<9"
17+
pip = ">=24.2,<25"
18+
19+
[feature.python.pypi-dependencies]
20+
hatch = ">=1.13.0, <2"
21+
itkwasm-compare-images-wasi = { path = "python/itkwasm-compare-images-wasi", editable = true }
22+
itkwasm-compare-images = { path = "python/itkwasm-compare-images", editable = true }
23+
pyodide-py = ">=0.26.3, <0.27"
24+
pytest-pyodide = ">=0.58.3, <0.59"
25+
itk-webassemblyinterface = ">=1.0b175, <2"
26+
itkwasm-image-io = ">=1.3.0, <2"
27+
28+
[feature.python.tasks.test-wasi]
29+
cmd = "pytest"
30+
cwd = "python/itkwasm-compare-images-wasi"
31+
description = "Run tests for itkwasm-compare-images-wasi"
32+
33+
[feature.python.tasks.download-pyodide]
34+
cmd = '''curl -L https://github.com/pyodide/pyodide/releases/download/0.26.3/pyodide-0.26.3.tar.bz2 -o pyodide.tar.bz2 &&
35+
tar xjf pyodide.tar.bz2 &&
36+
rm pyodide.tar.bz2'''
37+
outputs = ["pyodide"]
38+
description = "Download Pyodide"
39+
40+
[feature.python.tasks.test-emscripten]
41+
cmd = '''mkdir -p dist/pyodide &&
42+
cp -r ../../pyodide dist/ &&
43+
hatch build -t wheel ./dist/pyodide/ &&
44+
pytest --dist-dir=./dist/pyodide --rt=chrome'''
45+
cwd = "python/itkwasm-compare-images-emscripten"
46+
depends-on = ["download-pyodide"]
47+
description = "Run tests for itkwasm-compare-images-emscripten"
48+
49+
[feature.python.tasks.serve-emscripten]
50+
cmd = '''mkdir -p dist/pyodide &&
51+
cp -r ../../pyodide dist/ &&
52+
hatch build -t wheel ./dist/pyodide/ &&
53+
echo \"\nVisit http://localhost:8877/console.html\n\" &&
54+
python -m http.server --directory=./dist/pyodide 8877'''
55+
cwd = "python/itkwasm-compare-images-emscripten"
56+
depends-on = ["download-pyodide"]
57+
description = "Serve itkwasm-compare-images-emscripten for development"
58+
59+
[feature.python.tasks.test-dispatch]
60+
cmd = '''mkdir -p dist/pyodide &&
61+
cp -r ../../pyodide dist/ &&
62+
hatch build -t wheel ./dist/pyodide/ &&
63+
cp ../itkwasm-compare-images-emscripten/dist/pyodide/itkwasm_compare_images_emscripten*.whl ./dist/pyodide/ &&
64+
pytest --dist-dir=./dist/pyodide --rt=chrome'''
65+
cwd = "python/itkwasm-compare-images"
66+
depends-on = ["download-pyodide"]
67+
description = "Run tests for itkwasm-compare-images"
68+
69+
[feature.python.tasks.serve-dispatch]
70+
cmd = '''mkdir -p dist/pyodide &&
71+
cp -r ../../pyodide dist/ &&
72+
hatch build -t wheel ./dist/pyodide/ &&
73+
echo \"\nVisit http://localhost:8877/console.html\n\" &&
74+
python -m http.server --directory=./dist/pyodide 8877'''
75+
cwd = "python/itkwasm-compare-images"
76+
depends-on = ["download-pyodide"]
77+
description = "Serve itkwasm-compare-images for development"
78+
79+
[feature.python.tasks.test-python]
80+
cmd = "echo 'Testing all Python packages'"
81+
depends-on = ["test-wasi", "test-emscripten", "test-dispatch"]
82+
description = "Run tests for all Python packages"
83+
84+
[environments]
85+
python = ["python"]

packages/compare-images/python/itkwasm-compare-images-emscripten/itkwasm_compare_images_emscripten/compare_double_images_async.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ async def compare_double_images_async(
1818
test_image: Image,
1919
baseline_images: List[Image] = [],
2020
difference_threshold: float = 0,
21+
spatial_tolerance: float = 1e-08,
2122
radius_tolerance: int = 0,
2223
number_of_pixels_tolerance: int = 0,
2324
ignore_boundary_pixels: bool = False,
@@ -33,6 +34,9 @@ async def compare_double_images_async(
3334
:param difference_threshold: Intensity difference for pixels to be considered different.
3435
:type difference_threshold: float
3536
37+
:param spatial_tolerance: Tolerance for comparing spatial overlap (origin and direction matrix).
38+
:type spatial_tolerance: float
39+
3640
:param radius_tolerance: Radius of the neighborhood around a pixel to search for similar intensity values.
3741
:type radius_tolerance: int
3842
@@ -59,6 +63,8 @@ async def compare_double_images_async(
5963
kwargs["baselineImages"] = to_js(baseline_images)
6064
if difference_threshold:
6165
kwargs["differenceThreshold"] = to_js(difference_threshold)
66+
if spatial_tolerance:
67+
kwargs["spatialTolerance"] = to_js(spatial_tolerance)
6268
if radius_tolerance:
6369
kwargs["radiusTolerance"] = to_js(radius_tolerance)
6470
if number_of_pixels_tolerance:

packages/compare-images/python/itkwasm-compare-images-emscripten/itkwasm_compare_images_emscripten/js_package.py

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/compare-images/python/itkwasm-compare-images/test/fixtures.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
def package_wheel():
1212
return f"itkwasm_compare_images-{test_package_version}-py3-none-any.whl"
1313

14+
@pytest.fixture
15+
def emscripten_package_wheel():
16+
return f"itkwasm_compare_images_emscripten-{test_package_version}-py3-none-any.whl"
17+
1418
@pytest.fixture
1519
def input_data():
1620
from pathlib import Path

packages/compare-images/python/itkwasm-compare-images/test/test_compare_images_async.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
pytest.skip("Skipping pyodide tests on older Python", allow_module_level=True)
55

66
from pytest_pyodide import run_in_pyodide
7-
from .fixtures import package_wheel, input_data
7+
from .fixtures import emscripten_package_wheel, package_wheel, input_data
88

99
@run_in_pyodide(packages=['micropip', 'numpy'])
10-
async def test_compare_double_images_async(selenium, package_wheel, input_data):
10+
async def test_compare_double_images_async(selenium, emscripten_package_wheel, package_wheel, input_data):
1111
import micropip
12+
await micropip.install(emscripten_package_wheel)
1213
await micropip.install(package_wheel)
1314
await micropip.install('itkwasm-image-io-emscripten')
1415
def write_input_data_to_fs(input_data, filename):
@@ -42,8 +43,9 @@ def write_input_data_to_fs(input_data, filename):
4243
assert difference_image_rendering.imageType.componentType == 'uint8'
4344

4445
@run_in_pyodide(packages=['micropip', 'numpy'])
45-
async def test_compare_images_async(selenium, package_wheel, input_data):
46+
async def test_compare_images_async(selenium, emscripten_package_wheel, package_wheel, input_data):
4647
import micropip
48+
await micropip.install(emscripten_package_wheel)
4749
await micropip.install(package_wheel)
4850
await micropip.install('itkwasm-image-io-emscripten')
4951
def write_input_data_to_fs(input_data, filename):
@@ -110,8 +112,8 @@ def write_input_data_to_fs(input_data, filename):
110112
assert metrics['numberOfPixelsWithDifferences'] == 26477
111113
assert metrics['minimumDifference'] == 0.002273026683894841
112114
assert metrics['maximumDifference'] == 312.2511648746159
113-
assert metrics['totalDifference'] == 3121703.1639738297
114-
assert metrics['meanDifference'] == 117.90244982338746
115+
assert (abs(metrics['totalDifference'] - 3121703.1639738297) < 100)
116+
assert (abs(metrics['meanDifference'] - 117.90244982338746) < 1)
115117

116118
assert difference_image.imageType.componentType == 'float64'
117119
assert difference_image_rendering.imageType.componentType == 'uint8'

pnpm-lock.yaml

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)