eval-toolkit 0.27.1__py3-none-any.whl

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.
@@ -0,0 +1,314 @@
1
+ Metadata-Version: 2.4
2
+ Name: eval-toolkit
3
+ Version: 0.27.1
4
+ Summary: Reusable evaluation contracts for binary classification: metrics, bootstrap CIs, calibration, artifacts, and evidence gates.
5
+ Project-URL: Homepage, https://github.com/brandon-behring/eval-toolkit
6
+ Project-URL: Repository, https://github.com/brandon-behring/eval-toolkit.git
7
+ Project-URL: Issues, https://github.com/brandon-behring/eval-toolkit/issues
8
+ Project-URL: Changelog, https://github.com/brandon-behring/eval-toolkit/blob/main/CHANGELOG.md
9
+ Author: Brandon Behring
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: binary-classification,bootstrap,calibration,evaluation,machine-learning,metrics
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering
21
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.13
24
+ Requires-Dist: jsonschema>=4.21
25
+ Requires-Dist: numpy>=1.26
26
+ Requires-Dist: scikit-learn>=1.4
27
+ Requires-Dist: scipy>=1.11
28
+ Provides-Extra: all
29
+ Requires-Dist: hypothesis>=6.100; extra == 'all'
30
+ Requires-Dist: matplotlib>=3.8; extra == 'all'
31
+ Requires-Dist: pandas>=2.0; extra == 'all'
32
+ Requires-Dist: pillow>=10.0; extra == 'all'
33
+ Requires-Dist: pyarrow>=15.0; extra == 'all'
34
+ Requires-Dist: pyyaml>=6.0; extra == 'all'
35
+ Provides-Extra: dataframe
36
+ Requires-Dist: pandas>=2.0; extra == 'dataframe'
37
+ Provides-Extra: dev
38
+ Requires-Dist: black>=24.0; extra == 'dev'
39
+ Requires-Dist: hypothesis>=6.100; extra == 'dev'
40
+ Requires-Dist: matplotlib>=3.8; extra == 'dev'
41
+ Requires-Dist: mypy>=1.10; extra == 'dev'
42
+ Requires-Dist: pandas>=2.0; extra == 'dev'
43
+ Requires-Dist: pillow>=10.0; extra == 'dev'
44
+ Requires-Dist: pre-commit>=3.7; extra == 'dev'
45
+ Requires-Dist: pyarrow>=15.0; extra == 'dev'
46
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
47
+ Requires-Dist: pytest-mpl>=0.16; extra == 'dev'
48
+ Requires-Dist: pytest>=8.0; extra == 'dev'
49
+ Requires-Dist: pyyaml>=6.0; extra == 'dev'
50
+ Requires-Dist: ruff>=0.5; extra == 'dev'
51
+ Requires-Dist: sybil>=10.0; extra == 'dev'
52
+ Provides-Extra: parquet
53
+ Requires-Dist: pyarrow>=15.0; extra == 'parquet'
54
+ Provides-Extra: plotting
55
+ Requires-Dist: matplotlib>=3.8; extra == 'plotting'
56
+ Requires-Dist: pillow>=10.0; extra == 'plotting'
57
+ Provides-Extra: property
58
+ Requires-Dist: hypothesis>=6.100; extra == 'property'
59
+ Provides-Extra: validation
60
+ Provides-Extra: yaml
61
+ Requires-Dist: pyyaml>=6.0; extra == 'yaml'
62
+ Description-Content-Type: text/markdown
63
+
64
+ # eval-toolkit
65
+
66
+ A **methodology-aware evaluation harness for binary classification**:
67
+ metrics, bootstrap CIs, calibration, leakage detection, splitting,
68
+ threshold selection, dataset loading, reproducibility manifests, and a
69
+ slice-aware orchestrator that ties them together. Pure
70
+ numpy/scipy/sklearn core; pandas/matplotlib/hypothesis are optional
71
+ extras; PyTorch / HuggingFace / `datasets` are *consumer-side* (never
72
+ required).
73
+
74
+ Library-grade by design — every public function is type-annotated,
75
+ every math kernel is documented with LaTeX + literature references,
76
+ statistical validity (bootstrap CIs, MDE estimates, paired-difference
77
+ tests) is built in, and the JSON outputs (`results.json` /
78
+ `results_full.json` / `manifest.json`) ship with versioned [JSON
79
+ Schemas](src/eval_toolkit/schemas/) so downstream parsers can gate on
80
+ format changes.
81
+
82
+ ## Three-tier architecture
83
+
84
+ ```
85
+ ┌─ Tier 3 ─ Reproducibility scaffolding ─────────────────┐
86
+ │ manifest.json + seeds + git_sha + data_hashes + │
87
+ │ gpu_info + leakage_report (NeurIPS-aligned) │
88
+ ├─ Tier 2 ─ Protocol-based orchestration ────────────────┤
89
+ │ Scorer / SliceAwareScorer / LeakageCheck / Splitter │
90
+ │ ThresholdSelector / DatasetLoader / SimilarityStrategy│
91
+ │ Versioned (opt-in: per-object versions in manifest) │
92
+ ├─ Tier 1 ─ Functional core ─────────────────────────────┤
93
+ │ pr_auc / roc_auc / ECE variants / Brier / bootstrap_ci│
94
+ │ paired_bootstrap_diff / cv_clt_ci / mde_from_ci │
95
+ │ reliability_curve / fit_temperature / fit_isotonic │
96
+ └────────────────────────────────────────────────────────┘
97
+ ```
98
+
99
+ Pick the tier your task needs. Ad-hoc analysis: just call the
100
+ functional core. Full eval pipelines: implement the Protocols. Every
101
+ run: capture the manifest.
102
+
103
+ ## Documentation
104
+
105
+ - **[Getting started](docs/getting-started.md)** — end-to-end
106
+ walkthrough for new users: install, define a Scorer, build slices,
107
+ run `evaluate()`, persist results, add a claim, render a plot.
108
+ - **[Methodology curriculum](docs/methodology/README.md)** — 16
109
+ chapters on splits, metrics, calibration, evidence gates,
110
+ prediction artifacts, and more.
111
+ - **[Schema reference](docs/schemas.md)** — field-by-field semantics
112
+ for `results.v1.json`, `results_full.v1.json`, `manifest.v1.json`.
113
+ - **[Migration guides](docs/MIGRATION.md)** — v0.6→v0.7, v0.7→v0.8,
114
+ v0.8→v0.9.
115
+ - **[Extending](docs/extending.md)** — Protocol-by-Protocol guide for
116
+ custom Scorers, Splitters, LeakageChecks, ThresholdSelectors,
117
+ DatasetLoaders, EvidenceGates.
118
+ - **[Repo strategy](docs/repo-strategy.md)** — how the package is
119
+ organized, the 6-bucket target shape, and the checklist that
120
+ governs when to extract a sub-package into its own repo.
121
+
122
+ ## Methodology
123
+
124
+ What good binary-classification evaluation looks like, with each
125
+ concern mapped to the toolkit primitive that operationalizes it.
126
+
127
+ - [`docs/methodology/`](docs/methodology/README.md) — the curriculum
128
+ (16 chapters). Recommended reading order:
129
+ [`leakage`](docs/methodology/leakage.md) →
130
+ [`splits`](docs/methodology/splits.md) →
131
+ [`thresholds`](docs/methodology/thresholds.md) →
132
+ [`calibration`](docs/methodology/calibration.md) →
133
+ [`comparison`](docs/methodology/comparison.md) →
134
+ [`bootstrap`](docs/methodology/bootstrap.md) →
135
+ [`length_stratification`](docs/methodology/length_stratification.md) →
136
+ [`text_dedup`](docs/methodology/text_dedup.md) →
137
+ [`versioning`](docs/methodology/versioning.md) →
138
+ [`fairness`](docs/methodology/fairness.md) →
139
+ [`reproducibility`](docs/methodology/reproducibility.md) →
140
+ [`testing`](docs/methodology/testing.md) →
141
+ [`reading_list`](docs/methodology/reading_list.md).
142
+ - [`docs/MIGRATION.md`](docs/MIGRATION.md) — per-version migration
143
+ guides (v0.6→v0.7, v0.7→v0.8).
144
+ - [`docs/roadmap.md`](docs/roadmap.md) — forward-looking tracker;
145
+ v1.0.0 path; consumer gap-doc cross-links.
146
+
147
+ ## Extending eval-toolkit
148
+
149
+ How to plug your own scorers / leakage checks / splitters / loaders /
150
+ threshold selectors into the harness.
151
+
152
+ - [`docs/extending.md`](docs/extending.md) — Protocol-by-Protocol
153
+ guide, ~50-line full-harness recipe, project-layout pointer.
154
+
155
+ ## Worked examples
156
+
157
+ - [`docs/examples/prompt_injection_walkthrough.md`](docs/examples/prompt_injection_walkthrough.md)
158
+ — End-to-end prompt-injection eval on a synthetic OWASP LLM01:2025
159
+ fixture; cross-links to the
160
+ [showcase repo](https://github.com/brandon-behring/prompt_injection_classifier_showcase)
161
+ for the real Lakera PINT walkthrough.
162
+ - [`docs/examples/pytorch_scorer_example.md`](docs/examples/pytorch_scorer_example.md)
163
+ — HuggingFace transformer + LoRA `Scorer` adapter (batched inference,
164
+ GPU/CPU placement, deterministic-mode setup).
165
+
166
+ ## Install
167
+
168
+ ```bash
169
+ uv venv
170
+ uv pip install -e .[dev]
171
+ ```
172
+
173
+ For consumers who only need the math kernels (no plotting, no pandas):
174
+
175
+ ```bash
176
+ pip install eval-toolkit # core only: numpy/scipy/sklearn
177
+ pip install "eval-toolkit[plotting]" # adds matplotlib + pillow
178
+ pip install "eval-toolkit[dataframe]" # adds pandas
179
+ pip install "eval-toolkit[all]" # everything
180
+ ```
181
+
182
+ ## Quick examples
183
+
184
+ ### Metrics
185
+
186
+ ```python
187
+ import numpy as np
188
+ from eval_toolkit import pr_auc, roc_auc, expected_calibration_error
189
+
190
+ rng = np.random.default_rng(42)
191
+ y = rng.integers(0, 2, size=200)
192
+ # Clip to [0, 1] — ECE only meaningful on calibrated probabilities.
193
+ s = np.clip(y + rng.normal(0, 0.3, size=200), 0, 1)
194
+
195
+ print(f"PR-AUC: {pr_auc(y, s):.3f}")
196
+ print(f"ROC-AUC: {roc_auc(y, s):.3f}")
197
+ print(f"ECE (10 bins): {expected_calibration_error(y, s, n_bins=10):.3f}")
198
+ ```
199
+
200
+ ### Bootstrap confidence intervals
201
+
202
+ ```python
203
+ from eval_toolkit import bootstrap_ci, paired_bootstrap_diff, pr_auc
204
+
205
+ ci = bootstrap_ci(y, s, pr_auc, n_resamples=1000, seed=42)
206
+ print(f"PR-AUC: {ci.point_estimate:.3f} 95% CI: [{ci.ci_low:.3f}, {ci.ci_high:.3f}]")
207
+
208
+ # Paired bootstrap on the lift between two scorers (s_baseline must be in [0, 1] too).
209
+ s_baseline = np.clip(rng.normal(0.5, 0.3, size=200), 0, 1)
210
+ diff = paired_bootstrap_diff(y, s_baseline, s, pr_auc, n_resamples=1000, seed=42)
211
+ print(f"Δ PR-AUC: {diff.delta:.3f} overlaps zero: {diff.overlaps_zero}")
212
+ ```
213
+
214
+ ### Temperature scaling (Guo et al. 2017)
215
+
216
+ ```python
217
+ from eval_toolkit import fit_temperature
218
+
219
+ logits = rng.normal(size=(500, 2))
220
+ labels = (logits[:, 1] > logits[:, 0]).astype(int)
221
+ result = fit_temperature(logits, labels)
222
+ print(f"Optimal T: {result['temperature']:.3f}")
223
+ print(f"NLL: {result['nll_pre']:.3f} -> {result['nll_post']:.3f}")
224
+ ```
225
+
226
+ ### Reproducibility manifest (NeurIPS-aligned)
227
+
228
+ ```python
229
+ import tempfile
230
+ from pathlib import Path
231
+ from eval_toolkit import build_manifest, write_manifest
232
+
233
+ with tempfile.TemporaryDirectory() as run_dir:
234
+ # data_files: {name: path} → eval_toolkit hashes the files for you;
235
+ # versioned: any object with a `version` attribute (e.g. a scorer or
236
+ # leakage check) is captured by name → version in the manifest.
237
+ manifest = build_manifest(
238
+ run_id="quickstart-demo",
239
+ config={"threshold_criterion": "max_f1", "seed": 42},
240
+ seeds={"global": 42, "bootstrap": 42},
241
+ )
242
+ write_manifest(manifest, Path(run_dir))
243
+ # → run_dir/manifest.json: schema_version, git_sha, dirty_flag, code_versions,
244
+ # env (python+platform), seeds, data_hashes, versioned_objects, gpu_info
245
+ ```
246
+
247
+ ## Modules
248
+
249
+ | Module | Purpose |
250
+ |---|---|
251
+ | `eval_toolkit.metrics` | PR-AUC, ROC-AUC, ECE variants, Brier decomposition, prior-shift projection |
252
+ | `eval_toolkit.thresholds` | `ThresholdSelector` Protocol + 6 reference impls (max-F1, target-recall/precision/FPR, Youden-J, cost-sensitive) |
253
+ | `eval_toolkit.operating_points` | Fit thresholds on mixed-class slices and apply them to mixed or single-class target slices with provenance |
254
+ | `eval_toolkit.bootstrap` | BCa + paired bootstrap, MDE estimates, two-level operating-point bootstrap, K-fold CLT-corrected CI |
255
+ | `eval_toolkit.calibration` | Reliability curves, Bayes-optimal thresholds, isotonic/Platt/temperature scaling |
256
+ | `eval_toolkit.harness` | `Scorer` Protocol + `evaluate(...)` + `evaluate_folded(...)` slice-aware orchestrators |
257
+ | `eval_toolkit.leakage` | `LeakageCheck` Protocol + 7 reference impls (exact / near / encoding-obfuscated / cross-split / label-conflict / group / temporal); `Versioned` opt-in Protocol |
258
+ | `eval_toolkit.splits` | `Splitter` Protocol + 5 reference impls (holdout / stratified / group / source-disjoint / time-series) |
259
+ | `eval_toolkit.loaders` | `DatasetLoader` Protocol + 4 reference impls (DataFrame / SingleSlice / ParquetGlob / HF datasets) with Croissant-compatible `describe()` |
260
+ | `eval_toolkit.manifest` | `RunManifest` (NeurIPS-aligned) + source-role / guardrail metadata + `build_manifest` / `write_manifest` |
261
+ | `eval_toolkit.claims` | Generic evidence gates and `ClaimReport` for claim-mode vs exploratory-mode checks |
262
+ | `eval_toolkit.text_dedup` | `SimilarityStrategy` Protocol + 5 strategies (TF-IDF / hash / embedding / Jaccard / MinHash-LSH); `near_dedup` / `cross_dedup` orchestrators |
263
+ | `eval_toolkit.plotting` | PR curves, reliability diagrams, confusion matrices, score histograms, lift CIs |
264
+ | `eval_toolkit.provenance` | File hashing, run-directory layout, figure metadata sidecar |
265
+ | `eval_toolkit/schemas/` | Bundled JSON Schemas (`results.v1.json`, `results_full.v1.json`, `manifest.v1.json`) — load via `importlib.resources.files("eval_toolkit") / "schemas"` (not an importable Python module) |
266
+ | `eval_toolkit.paths` | Repo-relative path normalization |
267
+ | `eval_toolkit.seeds` | `set_global_seeds` (random + numpy + optional torch) |
268
+ | `eval_toolkit.config` | `frozen_config` decorator + `from_yaml` loader |
269
+ | `eval_toolkit.docs` | Anchor-based markdown rendering with formatter registry |
270
+
271
+ ## Fast iteration loop
272
+
273
+ For development, skip slow tests with:
274
+
275
+ ```bash
276
+ make fast # or: nox -s fast
277
+ # under the hood: uv run pytest -m "not slow" -q
278
+ ```
279
+
280
+ CI runs the full suite (including `slow`) on every push. The `slow`
281
+ marker is applied to tests exceeding ~2s (mostly Hypothesis property
282
+ tests with large `max_examples` and a few bootstrap tests with
283
+ `n_resamples >= 200`). `make fast` keeps the developer iteration loop
284
+ under ~30 seconds.
285
+
286
+ ## Downstream contract testing (v4 sibling-smoke)
287
+
288
+ A separate CI workflow (`.github/workflows/v4-smoke.yml`) checks out
289
+ the downstream consumer `prompt-injection-v4` at `main`, installs it
290
+ with this branch's eval-toolkit as an editable sibling dep (via v4's
291
+ `[tool.uv.sources]`), and runs v4's fast `-m smoke` suite. This catches
292
+ contract regressions at PR time rather than in v4's own CI post-merge.
293
+
294
+ The workflow requires a `HF_TOKEN` repo secret (gated HuggingFace
295
+ datasets used by v4's smoke fixtures). Set it at:
296
+ `https://github.com/brandon-behring/eval-toolkit/settings/secrets/actions`
297
+
298
+ The workflow runs with `continue-on-error: true` during a 2-3 week
299
+ trial period; it'll be promoted to a required gate once the false-
300
+ positive rate (from independent v4 main breakage or HF rate-limits)
301
+ is characterized.
302
+
303
+ ## Standards
304
+
305
+ See [`STYLE.md`](STYLE.md) for the full reconciled coding standards (formatting,
306
+ naming, errors, docstrings, tests, packaging).
307
+
308
+ ## Versioning
309
+
310
+ Semver from v0.1.0. See [`CHANGELOG.md`](CHANGELOG.md).
311
+
312
+ ## License
313
+
314
+ MIT — see [`LICENSE`](LICENSE).
@@ -0,0 +1,36 @@
1
+ eval_toolkit/__init__.py,sha256=jXtUumPAckGEUq6yKzouWeV6Ijm0VwS6CWc12tbpGpg,11202
2
+ eval_toolkit/__main__.py,sha256=vvpb6rCQBjEJm1dTR0smtByrlJhx8RUvvIdrOm8mtvg,5807
3
+ eval_toolkit/_version.py,sha256=Vn17cRk3n5FrF8Qk1_y919scG-HD6basX1ieIMZkVes,92
4
+ eval_toolkit/analysis.py,sha256=LdO-SQNZTqD9OGBHX-HiLGTq89DvZ5j_Vp5K7Iy0t8Q,6798
5
+ eval_toolkit/artifacts.py,sha256=s4ShmEiHj3vdb1t3medzh9nEav5QQEFfiXvDIZN3lfM,14107
6
+ eval_toolkit/bootstrap.py,sha256=XrOzy1q6COHBGTlw3oSIiR3lEpy5KnXWssV0r_S-fLQ,47964
7
+ eval_toolkit/calibration.py,sha256=zk8cW-q9vAyQZb3Rr-PdPuqhVhq29ITl0h7NDhMozF0,41960
8
+ eval_toolkit/claims.py,sha256=CGVyltfCAs4PkyIp5R59qGCHpyEO1e7L0OsEt7vHAw8,23796
9
+ eval_toolkit/config.py,sha256=GTRI5kY7manl4GDnfCzIsO8k90OiLBtt77SD1KEINC4,3253
10
+ eval_toolkit/docs.py,sha256=stk1F_nyX3nBgdJN_Hwk88_mh9aCgHfGQdTduq1Qis4,8754
11
+ eval_toolkit/evidence.py,sha256=uHRYrIp7YxadojRnz0jdznvySgJWtdOYFcnHp_d20xI,2475
12
+ eval_toolkit/harness.py,sha256=F0lILnlVdSpJPUBNcOpkYfpf8i2AHUGOVrxR47DH_5I,46684
13
+ eval_toolkit/leakage.py,sha256=xborrDqdf8hWHBjbcSXEcgKr2F8C3J0Itg5AZ7J4gBc,42271
14
+ eval_toolkit/loaders.py,sha256=IPgapA97G3u7uOsG6JRyZ5HKaGf97LMl09MzdXIuSE4,15789
15
+ eval_toolkit/manifest.py,sha256=FqhTvAedzKwq9bTU43KVLIhbKtX6bSyotK9jZGtqBxA,25385
16
+ eval_toolkit/metrics.py,sha256=i0Jla2dolGQ3Dqor3OgvPrCEGt-sesC40eKjGE1podg,59625
17
+ eval_toolkit/operating_points.py,sha256=IAOiOIMuGGE61q_z10VKAzPsjmGltzH0RKV2sYPpSag,6646
18
+ eval_toolkit/paths.py,sha256=oS3nsqXLQJpyI6l73PKsCQe9vM2icw6gSEopgfuw35s,4156
19
+ eval_toolkit/plotting.py,sha256=I8caaWUXM6G9FV3TiFDAs_zqrQkdWSEUzCkhodsQw4A,32867
20
+ eval_toolkit/protocols.py,sha256=QobXqvqI3esfznwlMQZ7qoGN3fV-APMDcEvmaJPnzbU,2654
21
+ eval_toolkit/provenance.py,sha256=mG5E7h1uBp1nQpgNuERC2OxUzTymkdYbn5QzKWzqFV8,7897
22
+ eval_toolkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ eval_toolkit/seeds.py,sha256=54fhkO0V6mjTcy1f5nKWY3u4_NQamfW9LaGywPIlwO4,4180
24
+ eval_toolkit/splits.py,sha256=rkU6XHFpntTU354SGe_ppSL7PSu7Qm1gaaSAFra5kjI,18168
25
+ eval_toolkit/text_dedup.py,sha256=8_jYYdxL-_sXgKNLCglYNEmXiWCSRjpL3blVQOX1R6w,52902
26
+ eval_toolkit/thresholds.py,sha256=uxnDYCPEQ2YxVHnM7IWtqsccLoyoHhOYdNqRgWWkYeM,30220
27
+ eval_toolkit/schemas/manifest.v1.json,sha256=hNoyOqcsvxJMHm_fvNRc7hLAYe5UMy90-UVEZNDgV_4,5390
28
+ eval_toolkit/schemas/manifest.v2.json,sha256=fW8PqIRHy3VCrfniiFz4DyJbz1B1Z0PCqr4nImhXJTs,7044
29
+ eval_toolkit/schemas/manifest.v3.json,sha256=lca1u9PbSYpBAQ_8melv4OUhBqn57ZhRs6qLXSKWcWA,5924
30
+ eval_toolkit/schemas/results.v1.json,sha256=jDK9bs4VECZwP2PEAAGhQYFGJANDglHkXsTjgxLPvGM,3182
31
+ eval_toolkit/schemas/results_full.v1.json,sha256=gFQa5vG8lRJR2lJORojB-ltI5sCGaLIfwseoHEbNHOI,2760
32
+ eval_toolkit-0.27.1.dist-info/METADATA,sha256=Z23WDxq8fg8c1uTPpMz6IdSz1LjVPHmJHaVkwy_jVHI,14312
33
+ eval_toolkit-0.27.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
34
+ eval_toolkit-0.27.1.dist-info/entry_points.txt,sha256=sMt5QJp6AXbj6k1oMIFXNY5jqzmpzQK0loqqAWzamGo,60
35
+ eval_toolkit-0.27.1.dist-info/licenses/LICENSE,sha256=ILekgpB5bjyOq3gi8MyG43Bd0fdQSoylFnWdeJgw5AA,1072
36
+ eval_toolkit-0.27.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ eval-toolkit = eval_toolkit.__main__:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brandon Behring
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.