dataeval-flow 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/.gitignore +3 -0
  2. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/PKG-INFO +139 -21
  3. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/README.md +131 -3
  4. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/pyproject.toml +61 -29
  5. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/__init__.py +17 -1
  6. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/__main__.py +9 -1
  7. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_state.py +1 -1
  8. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_base.py +2 -2
  9. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_params.py +2 -2
  10. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_section.py +3 -3
  11. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/app.py +3 -2
  12. dataeval_flow-0.1.1/src/dataeval_flow/_logging.py +158 -0
  13. dataeval_flow-0.1.1/src/dataeval_flow/_version.py +24 -0
  14. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/cache.py +30 -33
  15. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/__init__.py +8 -0
  16. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/_loader.py +3 -3
  17. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/_merge.py +7 -5
  18. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/__init__.py +6 -1
  19. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_task.py +4 -0
  20. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_workflow.py +20 -0
  21. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/dataset.py +10 -10
  22. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/embeddings.py +2 -2
  23. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/preprocessing.py +7 -5
  24. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/runner.py +7 -7
  25. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflow/__init__.py +5 -3
  26. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflow/orchestrator.py +22 -10
  27. dataeval_flow-0.1.1/src/dataeval_flow/workflows/cleaning/_internal.py +135 -0
  28. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/cleaning/workflow.py +38 -198
  29. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/drift/workflow.py +19 -19
  30. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/ood/workflow.py +25 -25
  31. dataeval_flow-0.1.1/src/dataeval_flow/workflows/parameter_sweep/__init__.py +5 -0
  32. dataeval_flow-0.1.1/src/dataeval_flow/workflows/parameter_sweep/outputs.py +50 -0
  33. dataeval_flow-0.1.1/src/dataeval_flow/workflows/parameter_sweep/params.py +64 -0
  34. dataeval_flow-0.1.1/src/dataeval_flow/workflows/parameter_sweep/workflow.py +359 -0
  35. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/prioritization/workflow.py +15 -15
  36. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/splitting/workflow.py +10 -10
  37. dataeval_flow-0.1.0/src/dataeval_flow/_logging.py +0 -102
  38. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/LICENSE +0 -0
  39. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/__init__.py +0 -0
  40. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/__init__.py +0 -0
  41. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
  42. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_discover.py +0 -0
  43. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_execution.py +0 -0
  44. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
  45. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_item.py +0 -0
  46. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_registry.py +0 -0
  47. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_model/_undo.py +0 -0
  48. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
  49. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
  50. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
  51. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
  52. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_panes/_widgets.py +0 -0
  53. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
  54. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
  55. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_model.py +0 -0
  56. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
  57. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
  58. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
  59. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +0 -0
  60. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
  61. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/_rendering.py +0 -0
  62. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
  63. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +0 -0
  64. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/_app/cli.py +0 -0
  65. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/_models.py +0 -0
  66. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/_paths.py +0 -0
  67. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_dataset.py +0 -0
  68. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_extractor.py +0 -0
  69. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_metadata.py +0 -0
  70. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
  71. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/config/schemas/_selection.py +0 -0
  72. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/metadata.py +0 -0
  73. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/py.typed +0 -0
  74. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/selection.py +0 -0
  75. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflow/_text_report.py +0 -0
  76. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflow/base.py +0 -0
  77. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/__init__.py +0 -0
  78. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
  79. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
  80. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/analysis/params.py +0 -0
  81. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/analysis/workflow.py +0 -0
  82. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
  83. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/cleaning/outputs.py +0 -0
  84. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/cleaning/params.py +0 -0
  85. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/cleaning/report.py +0 -0
  86. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
  87. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
  88. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/drift/params.py +0 -0
  89. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/drift/report.py +0 -0
  90. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
  91. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
  92. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/ood/params.py +0 -0
  93. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/ood/report.py +0 -0
  94. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
  95. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
  96. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/prioritization/params.py +0 -0
  97. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
  98. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
  99. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
  100. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/splitting/params.py +0 -0
  101. {dataeval_flow-0.1.0 → dataeval_flow-0.1.1}/src/dataeval_flow/workflows/splitting/report.py +0 -0
@@ -15,6 +15,9 @@ __pycache__/
15
15
  *.egg-info/
16
16
  dist/
17
17
  build/
18
+ # hatch-vcs writes the runtime version file at build/install time;
19
+ # source of truth is git tags. Do not commit.
20
+ src/dataeval_flow/_version.py
18
21
 
19
22
  # Cache
20
23
  .pytest_cache/
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataeval-flow
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: DataEval Workflows container for data evaluation
5
5
  Project-URL: Repository, https://gitlab.jatic.net/jatic/aria/dataeval-flow
6
6
  License-Expression: MIT
7
7
  License-File: LICENSE
8
8
  Classifier: Development Status :: 3 - Alpha
9
9
  Classifier: Intended Audience :: Science/Research
10
- Classifier: License :: OSI Approved :: MIT License
11
10
  Classifier: Programming Language :: Python :: 3
12
11
  Classifier: Programming Language :: Python :: 3.10
13
12
  Classifier: Programming Language :: Python :: 3.11
@@ -15,51 +14,42 @@ Classifier: Programming Language :: Python :: 3.12
15
14
  Classifier: Programming Language :: Python :: 3.13
16
15
  Classifier: Topic :: Scientific/Engineering
17
16
  Classifier: Typing :: Typed
18
- Requires-Python: <3.14,>=3.10
19
- Requires-Dist: dataeval==1.0.4
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: dataeval==1.0.6
20
19
  Requires-Dist: datasets>=4.0.0
21
20
  Requires-Dist: maite-datasets>=0.0.12
21
+ Requires-Dist: numpy>=1.24.2
22
22
  Requires-Dist: pydantic>=2.0
23
23
  Requires-Dist: pyyaml>=6.0
24
24
  Provides-Extra: all-cpu
25
25
  Requires-Dist: onnx>=1.15; extra == 'all-cpu'
26
26
  Requires-Dist: onnxruntime>=1.20; extra == 'all-cpu'
27
27
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cpu'
28
- Requires-Dist: textual>=3.0; extra == 'all-cpu'
28
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cpu'
29
29
  Requires-Dist: torch>=2.2.0; extra == 'all-cpu'
30
30
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cpu'
31
31
  Provides-Extra: all-cu118
32
32
  Requires-Dist: onnx>=1.15; extra == 'all-cu118'
33
33
  Requires-Dist: onnxruntime-gpu>=1.20; extra == 'all-cu118'
34
34
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu118'
35
- Requires-Dist: textual>=3.0; extra == 'all-cu118'
35
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cu118'
36
36
  Requires-Dist: torch>=2.2.0; extra == 'all-cu118'
37
37
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cu118'
38
- Provides-Extra: all-cu124
39
- Requires-Dist: onnx>=1.15; extra == 'all-cu124'
40
- Requires-Dist: onnxruntime-gpu>=1.20; extra == 'all-cu124'
41
- Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu124'
42
- Requires-Dist: textual>=3.0; extra == 'all-cu124'
43
- Requires-Dist: torch>=2.2.0; extra == 'all-cu124'
44
- Requires-Dist: torchvision>=0.17.0; extra == 'all-cu124'
45
38
  Provides-Extra: all-cu128
46
39
  Requires-Dist: onnx>=1.15; extra == 'all-cu128'
47
40
  Requires-Dist: onnxruntime-gpu>=1.23.2; extra == 'all-cu128'
48
41
  Requires-Dist: opencv-python-headless>=4.8.0; extra == 'all-cu128'
49
- Requires-Dist: textual>=3.0; extra == 'all-cu128'
42
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'all-cu128'
50
43
  Requires-Dist: torch>=2.2.0; extra == 'all-cu128'
51
44
  Requires-Dist: torchvision>=0.17.0; extra == 'all-cu128'
52
45
  Provides-Extra: app
53
- Requires-Dist: textual>=3.0; extra == 'app'
46
+ Requires-Dist: textual>=3.0; (python_version < '3.14') and extra == 'app'
54
47
  Provides-Extra: cpu
55
48
  Requires-Dist: torch>=2.2.0; extra == 'cpu'
56
49
  Requires-Dist: torchvision>=0.17.0; extra == 'cpu'
57
50
  Provides-Extra: cu118
58
51
  Requires-Dist: torch>=2.2.0; extra == 'cu118'
59
52
  Requires-Dist: torchvision>=0.17.0; extra == 'cu118'
60
- Provides-Extra: cu124
61
- Requires-Dist: torch>=2.2.0; extra == 'cu124'
62
- Requires-Dist: torchvision>=0.17.0; extra == 'cu124'
63
53
  Provides-Extra: cu128
64
54
  Requires-Dist: torch>=2.2.0; extra == 'cu128'
65
55
  Requires-Dist: torchvision>=0.17.0; extra == 'cu128'
@@ -77,6 +67,19 @@ Description-Content-Type: text/markdown
77
67
 
78
68
  Workflow orchestration for DataEval with GPU support.
79
69
 
70
+ ## Target Audience
71
+
72
+ <!-- start JATIC interop -->
73
+
74
+ DataEval Flow is intended for data scientists, ML engineers, and T&E engineers
75
+ who want to run automated data-evaluation pipelines — outlier and duplicate
76
+ detection, drift and OOD monitoring, dataset splitting, prioritization, and
77
+ statistical analysis — against their image datasets and models. For users of
78
+ the JATIC product suite, DataEval Flow has native interoperability when using
79
+ MAITE-compliant datasets and models.
80
+
81
+ <!-- end JATIC interop -->
82
+
80
83
  ## Quick Start
81
84
 
82
85
  ```bash
@@ -93,6 +96,32 @@ docker run --gpus all \
93
96
  dataeval:cu118
94
97
  ```
95
98
 
99
+ ## Pulling pre-built images
100
+
101
+ Pre-built, cosign-signed images are published to Harbor for every merge to `main` and every release tag. Pull one of these instead of building from source if you don't need to modify the code.
102
+
103
+ **Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
104
+
105
+ ```bash
106
+ docker pull harbor.jatic.net/aria/dataeval:cu118 # cpu / cu118 / cu128
107
+ ```
108
+
109
+ **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
110
+
111
+ ```bash
112
+ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
113
+ ```
114
+
115
+ **Verifying the signature** — every published image is signed with [cosign](https://docs.sigstore.dev/cosign/). The public key is committed at [docker/cosign.pub](docker/cosign.pub).
116
+
117
+ ```bash
118
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu118
119
+ ```
120
+
121
+ Then drop the `dataeval:cu118` reference in the Quick Start `docker run` commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118` (or pinned version) and skip step 1.
122
+
123
+ > **Note on feature branches.** Containers are only built and published from `main` and release tags — no image is produced for MRs or topic branches. If you want to run a feature branch as a container, check it out and follow the Quick Start to build locally; the resulting image will pick up the branch's version via `git describe`.
124
+
96
125
  ## Requirements
97
126
 
98
127
  | Requirement | Version |
@@ -253,7 +282,7 @@ Configs can be saved as YAML or JSON.
253
282
 
254
283
  The Docker build may appear frozen during the `uv sync` step:
255
284
 
256
- ```
285
+ ```text
257
286
  => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
258
287
  ```
259
288
 
@@ -272,19 +301,68 @@ The Docker build may appear frozen during the `uv sync` step:
272
301
  The `dataeval_flow` package can be used standalone without Docker.
273
302
 
274
303
  **Installation:**
304
+
305
+ Three installer toolchains are supported. Choose whichever fits your environment;
306
+ all three install the same dependencies pinned in their respective lockfiles.
307
+
308
+ `uv` (default toolchain):
309
+
275
310
  ```bash
276
311
  git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
277
312
  cd dataeval-flow
278
- uv sync
313
+ uv sync --extra cpu # or cu118 / cu128 for CUDA variants
279
314
  ```
280
315
 
316
+ `pip` from PyPI (no source checkout). PyTorch is hosted on a separate
317
+ wheel index, so pass `--extra-index-url` matching the variant you want
318
+ (omit it and you'll get the CUDA-bundled manylinux build of torch from
319
+ PyPI, which is much larger):
320
+
321
+ ```bash
322
+ # CPU-only PyTorch
323
+ pip install "dataeval-flow[cpu]" --extra-index-url https://download.pytorch.org/whl/cpu
324
+
325
+ # CUDA 11.8 PyTorch
326
+ pip install "dataeval-flow[cu118]" --extra-index-url https://download.pytorch.org/whl/cu118
327
+
328
+ # CUDA 12.8 PyTorch
329
+ pip install "dataeval-flow[cu128]" --extra-index-url https://download.pytorch.org/whl/cu128
330
+ ```
331
+
332
+ `poetry` (source checkout; uses committed `poetry.lock`):
333
+
334
+ ```bash
335
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
336
+ cd dataeval-flow
337
+ poetry install
338
+ ```
339
+
340
+ `conda` / `mamba` (source checkout; uses committed `environment.yml`):
341
+
342
+ ```bash
343
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
344
+ cd dataeval-flow
345
+ conda env create -f environment.yml
346
+ conda activate dataeval-flow
347
+ pip install -e . # install the package itself; conda manages deps
348
+ ```
349
+
350
+ Notes:
351
+
352
+ - PyTorch is installed from PyPI/`download.pytorch.org` in every path
353
+ (it is no longer maintained on conda-forge).
354
+ - GPU variants (`cu118`, `cu128`) are only wired through `uv` and
355
+ `pip` today; the Poetry/conda paths install the CPU build of PyTorch.
356
+
281
357
  **CLI Usage:**
358
+
282
359
  ```bash
283
360
  python -m dataeval_flow --config /path/to/config --output /path/to/output
284
361
  python -m dataeval_flow --data /path/to/data --output /path/to/output
285
362
  ```
286
363
 
287
364
  **Python API Usage:**
365
+
288
366
  ```python
289
367
  from pathlib import Path
290
368
  from dataeval_flow import load_config, run_tasks
@@ -295,11 +373,51 @@ print(results[0].report())
295
373
  ```
296
374
 
297
375
  **Development:**
376
+
298
377
  ```bash
299
378
  uv sync --group dev
300
379
  nox
301
380
  ```
302
381
 
382
+ ## Versioning
383
+
384
+ The package version is **derived from git tags** — there is no hardcoded version anywhere in the source tree. `hatch-vcs` reads `git describe --tags` at build/install time and writes the resolved version to a generated `src/dataeval_flow/_version.py` (gitignored), which `dataeval_flow.__init__` imports at runtime.
385
+
386
+ **Release flow for container images:**
387
+
388
+ 1. Push a semver tag (e.g. `v0.2.0`) — this is the single source of truth for the release version.
389
+ 2. The `push:docker` CI job runs `git describe --tags --always --dirty | sed 's/^v//'` to resolve `${VERSION}`, then passes `--build-arg DATAEVAL_FLOW_VERSION="${VERSION}"` to `docker buildx build` for both the `test` and `prod` stages.
390
+ 3. The `prod` stage in [docker/Dockerfile.j2](docker/Dockerfile.j2) redeclares the ARG and:
391
+ - Bakes the resolved version into `/app/src/dataeval_flow/_version.py` so `dataeval_flow.__version__` matches the wheel version at runtime.
392
+ - Stamps the OCI `org.opencontainers.image.version` label with the same value.
393
+ 4. The image is pushed to Harbor and cosign-signed.
394
+
395
+ The `ARG DATAEVAL_FLOW_VERSION="…"` default rendered into each committed `docker/Dockerfile.<variant>` by `docker/generate.py` is only used for **local** `docker build` invocations that don't pass `--build-arg`. Release builds always override it, so the committed default is allowed to drift from the latest tag and does not need to be regenerated at release time.
396
+
303
397
  ## License
304
398
 
305
- MIT
399
+ MIT — see [LICENSE](LICENSE).
400
+
401
+ ## Contributing
402
+
403
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for bug reports and contribution
404
+ guidelines, and [BRANCHING.md](BRANCHING.md) for the branching and release
405
+ strategy.
406
+
407
+ ## Contact
408
+
409
+ For questions or feedback, reach out to <dataeval-flow@ariacoustics.com>.
410
+
411
+ ## Acknowledgement
412
+
413
+ ### CDAO Funding Acknowledgement
414
+
415
+ <!-- start acknowledgement -->
416
+
417
+ This material is based upon work supported by the Chief Digital and Artificial
418
+ Intelligence Office under Contract No. W519TC-23-9-2033. The views and
419
+ conclusions contained herein are those of the author(s) and should not be
420
+ interpreted as necessarily representing the official policies or endorsements,
421
+ either expressed or implied, of the U.S. Government.
422
+
423
+ <!-- end acknowledgement -->
@@ -2,6 +2,19 @@
2
2
 
3
3
  Workflow orchestration for DataEval with GPU support.
4
4
 
5
+ ## Target Audience
6
+
7
+ <!-- start JATIC interop -->
8
+
9
+ DataEval Flow is intended for data scientists, ML engineers, and T&E engineers
10
+ who want to run automated data-evaluation pipelines — outlier and duplicate
11
+ detection, drift and OOD monitoring, dataset splitting, prioritization, and
12
+ statistical analysis — against their image datasets and models. For users of
13
+ the JATIC product suite, DataEval Flow has native interoperability when using
14
+ MAITE-compliant datasets and models.
15
+
16
+ <!-- end JATIC interop -->
17
+
5
18
  ## Quick Start
6
19
 
7
20
  ```bash
@@ -18,6 +31,32 @@ docker run --gpus all \
18
31
  dataeval:cu118
19
32
  ```
20
33
 
34
+ ## Pulling pre-built images
35
+
36
+ Pre-built, cosign-signed images are published to Harbor for every merge to `main` and every release tag. Pull one of these instead of building from source if you don't need to modify the code.
37
+
38
+ **Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
39
+
40
+ ```bash
41
+ docker pull harbor.jatic.net/aria/dataeval:cu118 # cpu / cu118 / cu128
42
+ ```
43
+
44
+ **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
45
+
46
+ ```bash
47
+ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
48
+ ```
49
+
50
+ **Verifying the signature** — every published image is signed with [cosign](https://docs.sigstore.dev/cosign/). The public key is committed at [docker/cosign.pub](docker/cosign.pub).
51
+
52
+ ```bash
53
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu118
54
+ ```
55
+
56
+ Then drop the `dataeval:cu118` reference in the Quick Start `docker run` commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118` (or pinned version) and skip step 1.
57
+
58
+ > **Note on feature branches.** Containers are only built and published from `main` and release tags — no image is produced for MRs or topic branches. If you want to run a feature branch as a container, check it out and follow the Quick Start to build locally; the resulting image will pick up the branch's version via `git describe`.
59
+
21
60
  ## Requirements
22
61
 
23
62
  | Requirement | Version |
@@ -178,7 +217,7 @@ Configs can be saved as YAML or JSON.
178
217
 
179
218
  The Docker build may appear frozen during the `uv sync` step:
180
219
 
181
- ```
220
+ ```text
182
221
  => [builder 7/7] RUN uv sync --frozen --no-dev --no-install-project 1139.3s
183
222
  ```
184
223
 
@@ -197,19 +236,68 @@ The Docker build may appear frozen during the `uv sync` step:
197
236
  The `dataeval_flow` package can be used standalone without Docker.
198
237
 
199
238
  **Installation:**
239
+
240
+ Three installer toolchains are supported. Choose whichever fits your environment;
241
+ all three install the same dependencies pinned in their respective lockfiles.
242
+
243
+ `uv` (default toolchain):
244
+
200
245
  ```bash
201
246
  git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
202
247
  cd dataeval-flow
203
- uv sync
248
+ uv sync --extra cpu # or cu118 / cu128 for CUDA variants
204
249
  ```
205
250
 
251
+ `pip` from PyPI (no source checkout). PyTorch is hosted on a separate
252
+ wheel index, so pass `--extra-index-url` matching the variant you want
253
+ (omit it and you'll get the CUDA-bundled manylinux build of torch from
254
+ PyPI, which is much larger):
255
+
256
+ ```bash
257
+ # CPU-only PyTorch
258
+ pip install "dataeval-flow[cpu]" --extra-index-url https://download.pytorch.org/whl/cpu
259
+
260
+ # CUDA 11.8 PyTorch
261
+ pip install "dataeval-flow[cu118]" --extra-index-url https://download.pytorch.org/whl/cu118
262
+
263
+ # CUDA 12.8 PyTorch
264
+ pip install "dataeval-flow[cu128]" --extra-index-url https://download.pytorch.org/whl/cu128
265
+ ```
266
+
267
+ `poetry` (source checkout; uses committed `poetry.lock`):
268
+
269
+ ```bash
270
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
271
+ cd dataeval-flow
272
+ poetry install
273
+ ```
274
+
275
+ `conda` / `mamba` (source checkout; uses committed `environment.yml`):
276
+
277
+ ```bash
278
+ git clone https://gitlab.jatic.net/jatic/aria/dataeval-flow.git
279
+ cd dataeval-flow
280
+ conda env create -f environment.yml
281
+ conda activate dataeval-flow
282
+ pip install -e . # install the package itself; conda manages deps
283
+ ```
284
+
285
+ Notes:
286
+
287
+ - PyTorch is installed from PyPI/`download.pytorch.org` in every path
288
+ (it is no longer maintained on conda-forge).
289
+ - GPU variants (`cu118`, `cu128`) are only wired through `uv` and
290
+ `pip` today; the Poetry/conda paths install the CPU build of PyTorch.
291
+
206
292
  **CLI Usage:**
293
+
207
294
  ```bash
208
295
  python -m dataeval_flow --config /path/to/config --output /path/to/output
209
296
  python -m dataeval_flow --data /path/to/data --output /path/to/output
210
297
  ```
211
298
 
212
299
  **Python API Usage:**
300
+
213
301
  ```python
214
302
  from pathlib import Path
215
303
  from dataeval_flow import load_config, run_tasks
@@ -220,11 +308,51 @@ print(results[0].report())
220
308
  ```
221
309
 
222
310
  **Development:**
311
+
223
312
  ```bash
224
313
  uv sync --group dev
225
314
  nox
226
315
  ```
227
316
 
317
+ ## Versioning
318
+
319
+ The package version is **derived from git tags** — there is no hardcoded version anywhere in the source tree. `hatch-vcs` reads `git describe --tags` at build/install time and writes the resolved version to a generated `src/dataeval_flow/_version.py` (gitignored), which `dataeval_flow.__init__` imports at runtime.
320
+
321
+ **Release flow for container images:**
322
+
323
+ 1. Push a semver tag (e.g. `v0.2.0`) — this is the single source of truth for the release version.
324
+ 2. The `push:docker` CI job runs `git describe --tags --always --dirty | sed 's/^v//'` to resolve `${VERSION}`, then passes `--build-arg DATAEVAL_FLOW_VERSION="${VERSION}"` to `docker buildx build` for both the `test` and `prod` stages.
325
+ 3. The `prod` stage in [docker/Dockerfile.j2](docker/Dockerfile.j2) redeclares the ARG and:
326
+ - Bakes the resolved version into `/app/src/dataeval_flow/_version.py` so `dataeval_flow.__version__` matches the wheel version at runtime.
327
+ - Stamps the OCI `org.opencontainers.image.version` label with the same value.
328
+ 4. The image is pushed to Harbor and cosign-signed.
329
+
330
+ The `ARG DATAEVAL_FLOW_VERSION="…"` default rendered into each committed `docker/Dockerfile.<variant>` by `docker/generate.py` is only used for **local** `docker build` invocations that don't pass `--build-arg`. Release builds always override it, so the committed default is allowed to drift from the latest tag and does not need to be regenerated at release time.
331
+
228
332
  ## License
229
333
 
230
- MIT
334
+ MIT — see [LICENSE](LICENSE).
335
+
336
+ ## Contributing
337
+
338
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for bug reports and contribution
339
+ guidelines, and [BRANCHING.md](BRANCHING.md) for the branching and release
340
+ strategy.
341
+
342
+ ## Contact
343
+
344
+ For questions or feedback, reach out to <dataeval-flow@ariacoustics.com>.
345
+
346
+ ## Acknowledgement
347
+
348
+ ### CDAO Funding Acknowledgement
349
+
350
+ <!-- start acknowledgement -->
351
+
352
+ This material is based upon work supported by the Chief Digital and Artificial
353
+ Intelligence Office under Contract No. W519TC-23-9-2033. The views and
354
+ conclusions contained herein are those of the author(s) and should not be
355
+ interpreted as necessarily representing the official policies or endorsements,
356
+ either expressed or implied, of the U.S. Government.
357
+
358
+ <!-- end acknowledgement -->
@@ -1,14 +1,13 @@
1
1
  [project]
2
2
  name = "dataeval-flow"
3
- version = "0.1.0"
3
+ dynamic = ["version"]
4
4
  description = "DataEval Workflows container for data evaluation"
5
5
  readme = "README.md"
6
6
  license = "MIT"
7
- requires-python = ">=3.10,<3.14"
7
+ requires-python = ">=3.10"
8
8
  classifiers = [
9
9
  "Development Status :: 3 - Alpha",
10
10
  "Intended Audience :: Science/Research",
11
- "License :: OSI Approved :: MIT License",
12
11
  "Programming Language :: Python :: 3",
13
12
  "Programming Language :: Python :: 3.10",
14
13
  "Programming Language :: Python :: 3.11",
@@ -18,9 +17,10 @@ classifiers = [
18
17
  "Typing :: Typed",
19
18
  ]
20
19
  dependencies = [
21
- "dataeval==1.0.4",
20
+ "dataeval==1.0.6",
22
21
  "datasets>=4.0.0",
23
22
  "maite-datasets>=0.0.12",
23
+ "numpy>=1.24.2",
24
24
  "pydantic>=2.0",
25
25
  "pyyaml>=6.0",
26
26
  ]
@@ -28,17 +28,15 @@ dependencies = [
28
28
  [project.optional-dependencies]
29
29
  cpu = ["torch>=2.2.0", "torchvision>=0.17.0"]
30
30
  cu118 = ["torch>=2.2.0", "torchvision>=0.17.0"]
31
- cu124 = ["torch>=2.2.0", "torchvision>=0.17.0"]
32
31
  cu128 = ["torch>=2.2.0", "torchvision>=0.17.0"]
33
32
  onnx = ["onnx>=1.15", "onnxruntime>=1.20"]
34
33
  onnx-gpu = ["onnx>=1.15", "onnxruntime-gpu>=1.20"]
35
34
  opencv = ["opencv-python-headless>=4.8.0"]
36
- app = ["textual>=3.0"]
35
+ app = ["textual>=3.0; python_version < '3.14'"]
37
36
  # Convenience extras for common combinations
38
- all-cpu = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime>=1.20", "opencv-python-headless>=4.8.0", "textual>=3.0"]
39
- all-cu118 = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime-gpu>=1.20", "opencv-python-headless>=4.8.0", "textual>=3.0"]
40
- all-cu124 = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime-gpu>=1.20", "opencv-python-headless>=4.8.0", "textual>=3.0"]
41
- all-cu128 = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime-gpu>=1.23.2", "opencv-python-headless>=4.8.0", "textual>=3.0"]
37
+ all-cpu = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime>=1.20", "opencv-python-headless>=4.8.0", "textual>=3.0; python_version < '3.14'"]
38
+ all-cu118 = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime-gpu>=1.20", "opencv-python-headless>=4.8.0", "textual>=3.0; python_version < '3.14'"]
39
+ all-cu128 = ["torch>=2.2.0", "torchvision>=0.17.0", "onnx>=1.15", "onnxruntime-gpu>=1.23.2", "opencv-python-headless>=4.8.0", "textual>=3.0; python_version < '3.14'"]
42
40
 
43
41
  [project.urls]
44
42
  Repository = "https://gitlab.jatic.net/jatic/aria/dataeval-flow"
@@ -52,6 +50,11 @@ base = [
52
50
  "nox-uv>=0.6.2",
53
51
  "uv>=0.8.0",
54
52
  ]
53
+ lock = [
54
+ { include-group = "base" },
55
+ "pyproject2conda>=0.22",
56
+ "poetry>=2.2.0; python_version<'3.14'",
57
+ ]
55
58
  lint = [
56
59
  { include-group = "base" },
57
60
  "ruff>=0.11",
@@ -65,6 +68,12 @@ test = [
65
68
  "pytest-xdist>=3.6.1",
66
69
  "coverage[toml]>=7.6",
67
70
  ]
71
+ verify = [
72
+ { include-group = "base" },
73
+ "pytest>=8.3",
74
+ "pytest-asyncio>=0.24",
75
+ "pyyaml>=6.0",
76
+ ]
68
77
  type = [
69
78
  { include-group = "base" },
70
79
  "pyright[nodejs]>=1.1.400",
@@ -88,6 +97,12 @@ docker = [
88
97
  "jinja2>=3.1",
89
98
  "pyyaml>=6.0",
90
99
  ]
100
+ security = [ # keep in sync with [tool.uv.constraint-dependencies]
101
+ "pillow>=12.2.0",
102
+ # "setuptools>=82.0.0", excluded due to conflict with pytorch
103
+ "onnx>=1.21.0",
104
+ "urllib3>=2.7.0"
105
+ ]
91
106
  dev = [
92
107
  { include-group = "lint" },
93
108
  { include-group = "type" },
@@ -97,21 +112,19 @@ dev = [
97
112
  [tool.uv]
98
113
  # Pin minimum versions for transitive deps with known CVEs
99
114
  constraint-dependencies = [
100
- "pillow>=12.1.1", # CVE-2026-25990: OOB write via PSD image
101
- "setuptools>=82.0.0", # CVE-2026-23949: (jaraco_context) path traversal in tarball()
102
- # CVE-2026-24049: (wheel) privilege escalation via unpack
103
- "onnx>=1.20.1", # CVE-2026-28500: Untrusted Repository Warnings Suppressed by silent=True
115
+ "pillow>=12.2.0",
116
+ "setuptools>=82.0.0",
117
+ "onnx>=1.21.0",
118
+ "urllib3>=2.7.0"
104
119
  ]
105
120
 
106
121
  conflicts = [
107
122
  [
108
123
  { extra = "cpu" },
109
124
  { extra = "cu118" },
110
- { extra = "cu124" },
111
125
  { extra = "cu128" },
112
126
  { extra = "all-cpu" },
113
127
  { extra = "all-cu118" },
114
- { extra = "all-cu124" },
115
128
  { extra = "all-cu128" },
116
129
  ],
117
130
  [
@@ -119,7 +132,6 @@ conflicts = [
119
132
  { extra = "onnx-gpu" },
120
133
  { extra = "all-cpu" },
121
134
  { extra = "all-cu118" },
122
- { extra = "all-cu124" },
123
135
  { extra = "all-cu128" },
124
136
  ]
125
137
  ]
@@ -134,11 +146,6 @@ name = "pytorch-cu118"
134
146
  url = "https://download.pytorch.org/whl/cu118"
135
147
  explicit = true
136
148
 
137
- [[tool.uv.index]]
138
- name = "pytorch-cu124"
139
- url = "https://download.pytorch.org/whl/cu124"
140
- explicit = true
141
-
142
149
  [[tool.uv.index]]
143
150
  name = "pytorch-cu128"
144
151
  url = "https://download.pytorch.org/whl/cu128"
@@ -150,8 +157,6 @@ torch = [
150
157
  { index = "pytorch-cpu", extra = "all-cpu" },
151
158
  { index = "pytorch-cu118", extra = "cu118" },
152
159
  { index = "pytorch-cu118", extra = "all-cu118" },
153
- { index = "pytorch-cu124", extra = "cu124" },
154
- { index = "pytorch-cu124", extra = "all-cu124" },
155
160
  { index = "pytorch-cu128", extra = "cu128" },
156
161
  { index = "pytorch-cu128", extra = "all-cu128" },
157
162
  ]
@@ -160,18 +165,40 @@ torchvision = [
160
165
  { index = "pytorch-cpu", extra = "all-cpu" },
161
166
  { index = "pytorch-cu118", extra = "cu118" },
162
167
  { index = "pytorch-cu118", extra = "all-cu118" },
163
- { index = "pytorch-cu124", extra = "cu124" },
164
- { index = "pytorch-cu124", extra = "all-cu124" },
165
168
  { index = "pytorch-cu128", extra = "cu128" },
166
169
  { index = "pytorch-cu128", extra = "all-cu128" },
167
170
  ]
168
171
 
172
+ [tool.poetry]
173
+ version = "0.0.0"
174
+
175
+ [[tool.poetry.source]]
176
+ name = "pytorch-cpu"
177
+ url = "https://download.pytorch.org/whl/cpu"
178
+ # `supplemental` (not `explicit`) is required so the `torch`/`torchvision`
179
+ # source override below applies to transitive requests too.
180
+ priority = "supplemental"
181
+
182
+ [tool.poetry.dependencies]
183
+ torch = { version = ">=2.2.0", source = "pytorch-cpu", optional = true }
184
+ torchvision = { version = ">=0.17.0", source = "pytorch-cpu", optional = true }
185
+
186
+ [tool.pyproject2conda.dependencies]
187
+ # `dataeval` is available on conda-forge. `maite-datasets` is PyPI-only.
188
+ maite-datasets = { pip = true }
189
+
169
190
  # --- Build System ---
170
191
 
171
192
  [build-system]
172
- requires = ["hatchling"]
193
+ requires = ["hatchling", "hatch-vcs"]
173
194
  build-backend = "hatchling.build"
174
195
 
196
+ [tool.hatch.version]
197
+ source = "vcs"
198
+
199
+ [tool.hatch.build.hooks.vcs]
200
+ version-file = "src/dataeval_flow/_version.py"
201
+
175
202
  [tool.hatch.build.targets.sdist]
176
203
  include = ["src/dataeval_flow"]
177
204
 
@@ -184,6 +211,8 @@ include = ["src/dataeval_flow"]
184
211
  # --- Pytest ---
185
212
 
186
213
  [tool.pytest.ini_options]
214
+ # Only unit tests run here (and under the coverage gate). The requirements
215
+ # verification suite (verification/) runs in its own `nox -s verify` session.
187
216
  testpaths = ["tests"]
188
217
  pythonpath = ["src"]
189
218
  asyncio_mode = "auto"
@@ -205,6 +234,7 @@ source = ["src/dataeval_flow"]
205
234
  branch = true
206
235
  concurrency = ["multiprocessing"]
207
236
  parallel = true
237
+ omit = ["src/dataeval_flow/_version.py"]
208
238
 
209
239
  [tool.coverage.report]
210
240
  exclude_also = [
@@ -213,6 +243,7 @@ exclude_also = [
213
243
  "if TYPE_CHECKING:",
214
244
  ]
215
245
  include = ["*/src/dataeval_flow/*"]
246
+ omit = ["src/dataeval_flow/_version.py"]
216
247
  fail_under = 90
217
248
  show_missing = true
218
249
 
@@ -241,6 +272,7 @@ exclude = [
241
272
  ".tox",
242
273
  ".nox",
243
274
  "prototype",
275
+ "src/dataeval_flow/_version.py",
244
276
  ]
245
277
  line-length = 120
246
278
  target-version = "py310"
@@ -258,7 +290,7 @@ ignore = [
258
290
  "C416",
259
291
  ]
260
292
  fixable = ["ALL"]
261
- per-file-ignores = { "tests/*" = ["ANN", "S101", "D", "SLF001", "ARG002", "PT019"], "docs/*" = ["D", "E402", "E501", "S101"] }
293
+ per-file-ignores = { "tests/*" = ["ANN", "S101", "D", "SLF001", "ARG002", "PT019"], "docs/*" = ["D", "E402", "E501", "S101"], "verification/*" = ["ANN", "S101", "D", "SLF001", "ARG001", "ARG002", "PT011", "PT019"] }
262
294
 
263
295
  [tool.ruff.lint.pydocstyle]
264
296
  convention = "pep257"
@@ -273,5 +305,5 @@ indent-style = "space"
273
305
  # --- Codespell ---
274
306
 
275
307
  [tool.codespell]
276
- skip = "./*env*,./output,./htmlcov,./.nox,uv.lock,./docs/source/notebooks/*,./docker/cosign.pub,./docker/Dockerfile.*,*.onnx"
308
+ skip = "./*env*,./output,./htmlcov,./.nox,*.lock,./docs/source/notebooks/*,./docker/cosign.pub,./docker/Dockerfile.*,*.onnx"
277
309
  ignore-words-list = ["statics"]