eval-toolkit 0.27.1__tar.gz → 0.27.2__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 (124) hide show
  1. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/CHANGELOG.md +34 -0
  2. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/PKG-INFO +1 -1
  3. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/_version.py +1 -1
  4. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/harness.py +2 -1
  5. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/leakage.py +3 -3
  6. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/loaders.py +6 -3
  7. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/splits.py +1 -6
  8. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/.gitignore +0 -0
  9. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/LICENSE +0 -0
  10. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/README.md +0 -0
  11. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/STYLE.md +0 -0
  12. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/methodology/README.md +0 -0
  13. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/README.md +0 -0
  14. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/datasets/README.md +0 -0
  15. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/papers/data-integrity/README.md +0 -0
  16. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/papers/eval-ecosystem/README.md +0 -0
  17. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/papers/inference/README.md +0 -0
  18. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/docs/research/papers/prompt-injection/README.md +0 -0
  19. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/pyproject.toml +0 -0
  20. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/__init__.py +0 -0
  21. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/__main__.py +0 -0
  22. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/analysis.py +0 -0
  23. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/artifacts.py +0 -0
  24. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/bootstrap.py +0 -0
  25. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/calibration.py +0 -0
  26. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/claims.py +0 -0
  27. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/config.py +0 -0
  28. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/docs.py +0 -0
  29. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/evidence.py +0 -0
  30. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/manifest.py +0 -0
  31. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/metrics.py +0 -0
  32. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/operating_points.py +0 -0
  33. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/paths.py +0 -0
  34. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/plotting.py +0 -0
  35. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/protocols.py +0 -0
  36. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/provenance.py +0 -0
  37. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/py.typed +0 -0
  38. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/schemas/manifest.v1.json +0 -0
  39. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/schemas/manifest.v2.json +0 -0
  40. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/schemas/manifest.v3.json +0 -0
  41. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/schemas/results.v1.json +0 -0
  42. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/schemas/results_full.v1.json +0 -0
  43. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/seeds.py +0 -0
  44. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/text_dedup.py +0 -0
  45. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/src/eval_toolkit/thresholds.py +0 -0
  46. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_bootstrap_distribution.png +0 -0
  47. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_confusion_matrix_grid.png +0 -0
  48. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_lift_ci.png +0 -0
  49. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_metric_bars.png +0 -0
  50. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_pr_curve.png +0 -0
  51. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_reliability_diagram.png +0 -0
  52. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/baseline/test_plotting_visual/plot_score_histograms.png +0 -0
  53. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/conftest.py +0 -0
  54. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/golden/docs/expected.md +0 -0
  55. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/golden/docs/input.md +0 -0
  56. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/golden/docs/metrics.json +0 -0
  57. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/strategies.py +0 -0
  58. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_analysis.py +0 -0
  59. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_artifacts.py +0 -0
  60. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_bootstrap_edge_cases.py +0 -0
  61. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_bootstrap_props.py +0 -0
  62. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_bootstrap_research_grounded.py +0 -0
  63. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_bootstrap_unit.py +0 -0
  64. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_calibration_bootstrap_chain.py +0 -0
  65. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_calibration_optimization_failures.py +0 -0
  66. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_calibration_props.py +0 -0
  67. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_calibration_research_grounded.py +0 -0
  68. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_calibration_unit.py +0 -0
  69. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_claims.py +0 -0
  70. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_claims_coverage.py +0 -0
  71. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_claims_props.py +0 -0
  72. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_cli.py +0 -0
  73. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_config.py +0 -0
  74. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_coverage_gap.py +0 -0
  75. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_dedup_split_leakage_chain.py +0 -0
  76. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_docs_golden.py +0 -0
  77. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_docs_props.py +0 -0
  78. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_evidence_validators.py +0 -0
  79. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_harness_edge_cases.py +0 -0
  80. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_harness_internals.py +0 -0
  81. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_harness_smoke.py +0 -0
  82. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_harness_v07.py +0 -0
  83. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_harness_v22.py +0 -0
  84. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_import_boundaries.py +0 -0
  85. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_leakage.py +0 -0
  86. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_leakage_error_paths.py +0 -0
  87. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_leakage_props.py +0 -0
  88. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_loaders.py +0 -0
  89. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_loaders_coverage.py +0 -0
  90. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_loaders_props.py +0 -0
  91. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_manifest.py +0 -0
  92. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_manifest_contamination_round_trip.py +0 -0
  93. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_manifest_props.py +0 -0
  94. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_manifest_validation.py +0 -0
  95. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_metrics_props.py +0 -0
  96. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_metrics_stratified_subsets.py +0 -0
  97. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_metrics_unit.py +0 -0
  98. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_misc_coverage.py +0 -0
  99. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_numeric_edge_cases.py +0 -0
  100. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_operating_points.py +0 -0
  101. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_operating_points_props.py +0 -0
  102. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_paths.py +0 -0
  103. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_plotting_edge.py +0 -0
  104. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_plotting_smoke.py +0 -0
  105. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_plotting_visual.py +0 -0
  106. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_protocol_conformance.py +0 -0
  107. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_provenance.py +0 -0
  108. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_reference_equivalence.py +0 -0
  109. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_reproducibility_integration.py +0 -0
  110. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_schemas.py +0 -0
  111. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_seeds.py +0 -0
  112. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_splits.py +0 -0
  113. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_splits_leakage_integration.py +0 -0
  114. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_splits_props.py +0 -0
  115. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_text_dedup.py +0 -0
  116. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_text_dedup_coverage.py +0 -0
  117. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_text_dedup_props.py +0 -0
  118. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_text_dedup_strategies.py +0 -0
  119. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_thresholds.py +0 -0
  120. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_thresholds_constant_score.py +0 -0
  121. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_thresholds_coverage.py +0 -0
  122. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_thresholds_props.py +0 -0
  123. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_thresholds_research_grounded.py +0 -0
  124. {eval_toolkit-0.27.1 → eval_toolkit-0.27.2}/tests/test_v09_contracts.py +0 -0
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.27.2] — 2026-05-15 — fix base-install pandas import
11
+
12
+ Base install of `eval-toolkit` (no extras) was broken in 0.27.1: every
13
+ attempt to `from eval_toolkit import evaluate` raised
14
+ `ModuleNotFoundError: No module named 'pandas'` because four modules
15
+ imported pandas at top level despite pandas being declared in the
16
+ `[dataframe]` optional extra. This patch restores the documented
17
+ contract: base install gives pure-numpy primitives; pandas is only
18
+ needed for the `[dataframe]` / `[parquet]` capabilities.
19
+
20
+ ### Fixed
21
+
22
+ - `src/eval_toolkit/harness.py`: moved `import pandas as pd` under
23
+ `if TYPE_CHECKING:` (annotation-only use at `EvalSlice.df`).
24
+ - `src/eval_toolkit/loaders.py`: moved top-level pandas import under
25
+ `if TYPE_CHECKING:` for the `DataFrameLoader.df` annotation; added a
26
+ function-local `import pandas as pd` inside
27
+ `ParquetGlobLoader.load_splits` where `pd.read_parquet` / `pd.concat`
28
+ are actually called. Calling the parquet path still requires pandas
29
+ (via the `[parquet]` extra) — that's documented behavior, not a
30
+ regression.
31
+ - `src/eval_toolkit/leakage.py`: removed dead top-level pandas import.
32
+ Doctest examples already `>>> import pandas as pd` themselves.
33
+ - `src/eval_toolkit/splits.py`: removed dead top-level pandas import
34
+ and unused `Sequence` import. Doctest example imports pandas itself.
35
+
36
+ ### Added
37
+
38
+ - `.github/workflows/ci.yml`: new `test-base-install` job. Creates a
39
+ fresh Py3.13 venv, `pip install .` with no extras, then exercises
40
+ every public top-level import. Sanity check fails if pandas leaks
41
+ into the base venv. Regression guard against this entire class of
42
+ bug. Closes #13.
43
+
10
44
  ## [0.27.1] — 2026-05-15 — first PyPI release (Trusted Publishing)
11
45
 
12
46
  Functionally identical to v0.27.0; bumped to 0.27.1 because the `v0.27.0`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eval-toolkit
3
- Version: 0.27.1
3
+ Version: 0.27.2
4
4
  Summary: Reusable evaluation contracts for binary classification: metrics, bootstrap CIs, calibration, artifacts, and evidence gates.
5
5
  Project-URL: Homepage, https://github.com/brandon-behring/eval-toolkit
6
6
  Project-URL: Repository, https://github.com/brandon-behring/eval-toolkit.git
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.27.1"
5
+ __version__ = "0.27.2"
@@ -40,7 +40,6 @@ from pathlib import Path
40
40
  from typing import TYPE_CHECKING, Final, Literal, cast
41
41
 
42
42
  import numpy as np
43
- import pandas as pd
44
43
 
45
44
  from eval_toolkit.artifacts import (
46
45
  error_metric,
@@ -66,6 +65,8 @@ from eval_toolkit.protocols import Scorer, SliceAwareScorer
66
65
  from eval_toolkit.thresholds import TargetFPRSelector
67
66
 
68
67
  if TYPE_CHECKING:
68
+ import pandas as pd
69
+
69
70
  from eval_toolkit.leakage import LeakageCheck
70
71
  from eval_toolkit.splits import Splitter
71
72
 
@@ -42,7 +42,6 @@ from dataclasses import dataclass, field
42
42
  from typing import Literal, Protocol, runtime_checkable
43
43
 
44
44
  import numpy as np
45
- import pandas as pd
46
45
 
47
46
  from eval_toolkit.harness import EvalSlice
48
47
  from eval_toolkit.text_dedup import (
@@ -1048,5 +1047,6 @@ def run_leakage_checks(
1048
1047
  return LeakageReport(findings=findings)
1049
1048
 
1050
1049
 
1051
- # Suppress unused-import warnings: pd / np are referenced in Examples blocks.
1052
- _ = (pd, np)
1050
+ # Suppress unused-import warning: np is referenced in Examples blocks.
1051
+ # pandas is imported lazily inside the doctest itself (see Examples above).
1052
+ _ = (np,)
@@ -32,13 +32,14 @@ import glob as _glob
32
32
  from collections.abc import Mapping, Sequence
33
33
  from dataclasses import dataclass
34
34
  from pathlib import Path
35
- from typing import Any, Protocol, cast, runtime_checkable
36
-
37
- import pandas as pd
35
+ from typing import TYPE_CHECKING, Any, Protocol, cast, runtime_checkable
38
36
 
39
37
  from eval_toolkit.harness import EvalSlice
40
38
  from eval_toolkit.provenance import file_sha256
41
39
 
40
+ if TYPE_CHECKING:
41
+ import pandas as pd
42
+
42
43
  __all__ = [
43
44
  "DataFrameLoader",
44
45
  "DatasetLoader",
@@ -269,6 +270,8 @@ class ParquetGlobLoader:
269
270
  If any split's loaded DataFrame is missing ``feature_col`` or
270
271
  ``label_col``.
271
272
  """
273
+ import pandas as pd # function-local: pandas is in the [parquet]/[dataframe] extra
274
+
272
275
  files_by_split = self._resolve_files()
273
276
  out: dict[str, EvalSlice] = {}
274
277
  for split_name, files in files_by_split.items():
@@ -18,12 +18,11 @@ can be fed into the harness directly.
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
- from collections.abc import Iterator, Sequence
21
+ from collections.abc import Iterator
22
22
  from dataclasses import dataclass
23
23
  from typing import Protocol, runtime_checkable
24
24
 
25
25
  import numpy as np
26
- import pandas as pd
27
26
  from sklearn.model_selection import (
28
27
  GroupKFold,
29
28
  StratifiedKFold,
@@ -514,7 +513,3 @@ def iter_folds_with_pool(
514
513
  # PoolBuilder's keys (train, val, possibly more) take precedence;
515
514
  # test is reattached from the Splitter.
516
515
  yield {**built, "test": test}
517
-
518
-
519
- # Suppress unused-import warnings: pd / Sequence are referenced indirectly.
520
- _ = (pd, Sequence)
File without changes
File without changes
File without changes
File without changes