diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85024ed73b..57a282970e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -204,6 +204,64 @@ jobs: pip install --require-hashes -r ${{ github.workspace }}/.github/pipelines/requirements-build.txt python -m build --wheel + analyzer-evaluation: + name: Analyzer Evaluation Report + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + UV_CACHE_DIR: /mnt/uv-cache + UV_PROJECT_ENVIRONMENT: /mnt/uv-venv + UV_LINK_MODE: hardlink + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 + with: + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: '3.13' + + - name: Install uv + run: python -m pip install uv==0.11.6 + + - name: Prepare uv directories on /mnt + run: | + sudo mkdir -p "$UV_CACHE_DIR" "$UV_PROJECT_ENVIRONMENT" + sudo chown -R "$(id -u):$(id -g)" "$UV_CACHE_DIR" "$UV_PROJECT_ENVIRONMENT" + + - name: Cache uv downloads + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.0 + with: + path: ${{ env.UV_CACHE_DIR }} + key: uv-eval-${{ runner.os }}-${{ hashFiles('presidio-analyzer/uv.lock') }} + restore-keys: | + uv-eval-${{ runner.os }}- + + - name: Install dependencies + working-directory: presidio-analyzer + run: | + # The evaluation runs the default (spaCy) recipe only, so install the + # base analyzer plus the `evaluation` group (presidio-evaluator) and + # `dev` (pip, for spaCy's model download) — no `transformers`/`gliner` + # extras, which conflict with presidio-evaluator's transformers>=5. + # presidio-evaluator tokenizes with en_core_web_sm and the analyzer's + # default NER uses en_core_web_lg. + uv sync --locked --group dev --group evaluation --python 3.13 + uv run --no-sync python -m spacy download en_core_web_sm + uv run --no-sync python -m spacy download en_core_web_lg + + - name: Run golden-dataset evaluation + working-directory: presidio-analyzer + run: | + # Report-only for now: the presidio-evaluator report is published to + # the workflow summary; regression gating against baselines is a + # follow-up (the --fail-on-regression flag exists but is not passed). + uv run --no-sync python -m tests.evaluation.run_evaluation \ + --output evaluation_report.md + cat evaluation_report.md >> "$GITHUB_STEP_SUMMARY" + build-platform-images: name: Build ${{ matrix.image }} (${{ matrix.platform }}) runs-on: ${{ matrix.runner }} diff --git a/presidio-analyzer/pyproject.toml b/presidio-analyzer/pyproject.toml index 7b9b2ad89f..7aca752282 100644 --- a/presidio-analyzer/pyproject.toml +++ b/presidio-analyzer/pyproject.toml @@ -84,6 +84,31 @@ dev = [ "pre-commit", "diff-cover", ] +# Detection-quality evaluation harness (tests/evaluation). Kept in its own +# group — not the `dev` group and not an extra — so the general test matrix +# does not pull presidio-evaluator's heavy deps into every Python cell. Only +# the dedicated CI evaluation job installs it (`--group evaluation`). +# presidio-evaluator supports Python 3.11-3.13; the marker keeps `uv lock` +# resolvable across the analyzer's wider 3.10-3.14 range. +evaluation = [ + "presidio-evaluator (>=0.3,<0.4) ; python_version >= '3.11' and python_version < '3.14'", +] + +[tool.uv] +# presidio-evaluator (evaluation group) requires transformers>=5, while the +# `transformers` extra pins transformers<5. They are never installed together +# — the evaluation CI job uses the default spaCy recipe — so declare them +# mutually exclusive and let uv resolve them in separate forks. +conflicts = [ + [ + { extra = "transformers" }, + { group = "evaluation" }, + ], + [ + { extra = "gliner" }, + { group = "evaluation" }, + ], +] [tool.coverage.run] relative_files = true diff --git a/presidio-analyzer/tests/evaluation/README.md b/presidio-analyzer/tests/evaluation/README.md new file mode 100644 index 0000000000..086ed8971e --- /dev/null +++ b/presidio-analyzer/tests/evaluation/README.md @@ -0,0 +1,159 @@ +# Analyzer evaluation harness + +A CI harness that measures analyzer detection quality (per-entity +precision / recall / F2) and latency against a curated, hand-annotated golden +dataset, using the org's own +[`presidio-evaluator`](https://github.com/data-privacy-stack/presidio-research) +package as the scoring engine. It addresses +[#1639](https://github.com/data-privacy-stack/presidio/issues/1639) (evaluate +precision/recall/latency during CI) and +[#1810](https://github.com/data-privacy-stack/presidio/issues/1810) (curated +PII/PHI benchmark dataset), and lays the groundwork for the recipes comparison +in [#1809](https://github.com/data-privacy-stack/presidio/issues/1809). + +## Installing + +`presidio-evaluator` is in the `evaluation` dependency group (not installed by +the default test matrix). From the `presidio-analyzer` directory: + +```sh +uv sync --group dev --group evaluation +uv run python -m spacy download en_core_web_sm # tokenization +uv run python -m spacy download en_core_web_lg # default NER +``` + +## Running it + +```sh +python -m tests.evaluation.run_evaluation # report to stdout +python -m tests.evaluation.run_evaluation --output report.md +python -m tests.evaluation.run_evaluation --iou 0.75 # stricter span overlap + +# evaluate another analyzer configuration (e.g. transformers): +python -m tests.evaluation.run_evaluation \ + --analyzer-conf path/to/analyzer_conf.yaml \ + --write-baseline tests/evaluation/baselines/my_config.json + +# enforce the baseline locally (CI does not do this yet): +python -m tests.evaluation.run_evaluation --fail-on-regression +``` + +The end-to-end smoke run also executes under `pytest tests/evaluation` when the +`evaluation` group is installed (it is skipped otherwise), and a CI job +publishes the report to the workflow step summary on every PR. + +## Design decisions + +**Scoring engine is `presidio-evaluator`.** Rather than a bespoke evaluator, +scoring uses `presidio-evaluator`'s span-based `SpanEvaluator` (character IoU) +wrapped around `PresidioAnalyzerWrapper`, with F-beta = 2 (recall-weighted), +matching Presidio's documented evaluation convention. `presidio-evaluator` is +the org's own sibling package (`data-privacy-stack/presidio-research`), already +referenced by `docs/evaluation/index.md`, so this reuses the standard data +model (`InputSample`/`Span`), metrics and error analysis instead of reinventing +them. This harness is the thin CI layer on top: dataset, baseline ratchet, +markdown report and gating flags. + +**The `CanonicalMapper` step is skipped.** `presidio-evaluator`'s entity +hierarchy/mapper reconciles differing label spaces between a model and a +dataset. Our golden dataset is annotated with the analyzer's own entity names, +so predictions and annotations already share a label space — mapping is +unnecessary, and skipping it keeps the report keyed by raw Presidio entity +types and the run deterministic (no interactive resolution). + +**Enforcement is built in but switched off.** The report compares every run +against the checked-in baseline (`baselines/spacy_en.json`) and shows +per-entity F2 deltas; `--fail-on-regression` exits non-zero when overall or +per-entity F2 drops more than `--f2-tolerance` (default 0.02) below the +baseline. CI runs report-only: switching enforcement on is a one-line CI +change, deliberately left as a maintainer decision once the numbers have proven +stable across real PRs (a new spaCy model release can shift NER results with no +code change). + +**Updating the baseline** is part of the PR that changes behavior: +`python -m tests.evaluation.run_evaluation --write-baseline +tests/evaluation/baselines/spacy_en.json`, committed alongside the code, so +reviewers see the metric change explicitly in the diff. + +**Curated golden set now, synthetic generation later.** A checked-in, +hand-annotated dataset is deterministic, reviewable in diffs, and cheap to run +per-PR. The template + Faker synthetic generation described in #1639 (available +in `presidio-evaluator` as `PresidioSentenceFaker`) is the right tool for +scaling coverage with every new recognizer, and is planned as a follow-up +phase — its output is `InputSample`s, the same type this harness already +consumes. + +**Evaluated entities are a fixed allowlist.** Predictions for entity types not +declared in the dataset (`entities` in `golden_en.json`) are excluded via +`entities_to_keep`, so recognizers without golden coverage don't pollute the +report with unreviewable false positives. Adding coverage for a new entity = +adding annotated samples + the entity to the allowlist. + +**Per-PR CI evaluates the default configuration only.** That covers spaCy NER +(`PERSON`, `LOCATION`, `DATE_TIME`) plus the predefined pattern/checksum +recognizers. HuggingFace, GLiNER and transformers recognizers are optional +extras with large model downloads — and their `transformers>=?` pins conflict +with `presidio-evaluator`'s, so they are declared mutually exclusive in +`[tool.uv] conflicts` and not run per-PR. The runner already supports them via +`--analyzer-conf ` with a separate baseline per configuration; wiring +them into a scheduled nightly job is roadmap step 4. + +## Dataset + +`datasets/golden_en.json` — 46 English samples, 93 annotated spans across 12 +entity types (`PERSON`, `LOCATION`, `DATE_TIME`, `EMAIL_ADDRESS`, +`PHONE_NUMBER`, `CREDIT_CARD`, `US_SSN`, `IP_ADDRESS`, `URL`, `IBAN_CODE`, +`CRYPTO`, `UK_NHS`), organized in categories per #1810: + +- `simple` — single-entity one-liners +- `medium` — multi-entity texts (support tickets, clinical notes, logs) +- `long` — full documents (discharge summary, incident report, KYC) +- `edge` — lowercase/inverted names, hyphenated names, adjacent entities, + entities at text boundaries, inline IDs +- `negative` — no PII, but tempting lookalikes (version numbers, room + numbers, quantities) + +Entity values are checksum-valid where recognizers validate (Luhn for cards, +mod-97 for IBANs, NHS check digit, SSN excluded ranges), reusing values from +the unit tests where possible. Span offsets are validated by +`test_golden_dataset.py::TestDatasetIntegrity`, so every annotation is +guaranteed to match its text slice. + +> Note: per-entity `support` in the report is computed by `presidio-evaluator` +> from its token/span reconstruction and may differ slightly from the raw gold +> span count. + +### Extending the dataset + +`generate_golden_en.py` is the source of truth — samples are defined as +interleaved text parts and `(value, entity_type)` tuples, so offsets are +computed rather than hand-counted. To add coverage (e.g. for a new recognizer): + +1. Add samples to `SAMPLES` in `generate_golden_en.py` (and the entity type + to `ENTITIES` if new). +2. Regenerate: `python -m tests.evaluation.generate_golden_en` +3. Regenerate the baseline: `... run_evaluation --write-baseline + tests/evaluation/baselines/spacy_en.json` +4. Commit all three; a sync test fails if the JSON drifts from the generator, + so the JSON can never be hand-edited. + +### Other languages + +The dataset format is language-agnostic: one file per language +(`golden_en.json` today, e.g. `golden_de.json` later), each declaring its +`language` and evaluated entity list. What is still English-only is the runner, +which builds a default `AnalyzerEngine`; another language means adding a +per-language engine configuration and installing its model in the CI job. +Planned alongside the nightly matrix (roadmap step 4). + +## Roadmap + +1. **(this PR)** `presidio-evaluator`-based harness + golden dataset + + baselines and regression detection (enforcement off) + report-only CI job. +2. Switch `--fail-on-regression` on in CI once metrics have proven stable — + a one-line CI change plus a baseline-update note in CONTRIBUTING. +3. Synthetic data generation via `PresidioSentenceFaker` (templates + Faker + providers); contributing a recognizer requires contributing templates (#1639). +4. Nightly multi-configuration matrix (spaCy / transformers / GLiNER / LLM) + with per-configuration baselines and non-English datasets, feeding the + fast/balanced/accurate recipes comparison (#1809). diff --git a/presidio-analyzer/tests/evaluation/__init__.py b/presidio-analyzer/tests/evaluation/__init__.py new file mode 100644 index 0000000000..d9d4c34431 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/__init__.py @@ -0,0 +1,24 @@ +"""Analyzer detection-quality evaluation for CI. + +A thin wrapper around ``presidio-evaluator`` that scores the analyzer against +a curated golden dataset and produces a per-entity precision/recall/F2 report +plus baseline regression comparison. See tests/evaluation/README.md. +""" + +from tests.evaluation.evaluation import ( + EntityScore, + EvaluationReport, + Mismatch, + default_dataset_path, + load_input_samples, + run_evaluation, +) + +__all__ = [ + "EntityScore", + "EvaluationReport", + "Mismatch", + "default_dataset_path", + "load_input_samples", + "run_evaluation", +] diff --git a/presidio-analyzer/tests/evaluation/baseline.py b/presidio-analyzer/tests/evaluation/baseline.py new file mode 100644 index 0000000000..e80e79d796 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/baseline.py @@ -0,0 +1,97 @@ +"""Baseline persistence and regression comparison for evaluation reports. + +A baseline is a checked-in snapshot of per-entity F2 metrics for one analyzer +configuration. Comparing a fresh report against it turns absolute numbers into +deltas and, when enforcement is switched on via ``--fail-on-regression``, lets +CI fail when F2 drops more than a tolerance below the baseline. + +Throughput is deliberately not part of the baseline: it depends on the machine +running the evaluation and would make regressions non-reproducible. +""" + +import json +from pathlib import Path +from typing import Dict, List + +from tests.evaluation.evaluation import EvaluationReport + +DEFAULT_F2_TOLERANCE = 0.02 + + +def default_baseline_path() -> Path: + """Path of the checked-in baseline for the default (spaCy) config.""" + return Path(__file__).parent / "baselines" / "spacy_en.json" + + +def report_to_baseline(report: EvaluationReport, config_name: str) -> Dict: + """Snapshot an evaluation report as a baseline dict.""" + return { + "config": config_name, + "overall": { + "precision": round(report.overall_precision, 4), + "recall": round(report.overall_recall, 4), + "f2": round(report.overall_f2, 4), + }, + "per_entity": { + entity: { + "support": score.support, + "precision": round(score.precision, 4), + "recall": round(score.recall, 4), + "f2": round(score.f2, 4), + } + for entity, score in sorted(report.per_entity.items()) + }, + } + + +def save_baseline(report: EvaluationReport, config_name: str, path: Path) -> None: + """Write a baseline snapshot to disk.""" + path.parent.mkdir(parents=True, exist_ok=True) + baseline = report_to_baseline(report, config_name) + path.write_text(json.dumps(baseline, indent=2) + "\n", encoding="utf-8") + + +def load_baseline(path: Path) -> Dict: + """Load a baseline snapshot from disk.""" + with open(path, encoding="utf-8") as f: + return json.load(f) + + +def compare_to_baseline( + report: EvaluationReport, + baseline: Dict, + f2_tolerance: float = DEFAULT_F2_TOLERANCE, +) -> List[str]: + """Compare a report against a baseline and describe regressions. + + :param report: Fresh evaluation report. + :param baseline: Baseline dict, as produced by :func:`report_to_baseline`. + :param f2_tolerance: Maximum allowed F2 drop before it counts as a + regression, both overall and per entity type. + :return: Human-readable regression descriptions; empty when the report + is within tolerance. Entities absent from the baseline are skipped + (they are new coverage, not regressions). + """ + regressions = [] + + overall_drop = baseline["overall"]["f2"] - report.overall_f2 + if overall_drop > f2_tolerance: + regressions.append( + f"overall F2 dropped {overall_drop:.3f} " + f"(baseline {baseline['overall']['f2']:.3f}, " + f"current {report.overall_f2:.3f}, tolerance {f2_tolerance})" + ) + + for entity, score in sorted(report.per_entity.items()): + baseline_entity = baseline["per_entity"].get(entity) + if baseline_entity is None: + continue + drop = baseline_entity["f2"] - score.f2 + if drop > f2_tolerance: + regressions.append( + f"{entity} F2 dropped {drop:.3f} " + f"(baseline {baseline_entity['f2']:.3f}, " + f"current {score.f2:.3f}, tolerance {f2_tolerance})" + ) + + return regressions diff --git a/presidio-analyzer/tests/evaluation/baselines/spacy_en.json b/presidio-analyzer/tests/evaluation/baselines/spacy_en.json new file mode 100644 index 0000000000..a7089e5794 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/baselines/spacy_en.json @@ -0,0 +1,82 @@ +{ + "config": "default (spacy en)", + "overall": { + "precision": 0.9512, + "recall": 0.975, + "f2": 0.9701 + }, + "per_entity": { + "CREDIT_CARD": { + "support": 6, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "CRYPTO": { + "support": 2, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "DATE_TIME": { + "support": 11, + "precision": 0.7333, + "recall": 1.0, + "f2": 0.9322 + }, + "EMAIL_ADDRESS": { + "support": 11, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "IBAN_CODE": { + "support": 3, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "IP_ADDRESS": { + "support": 6, + "precision": 0.8333, + "recall": 0.8333, + "f2": 0.8333 + }, + "LOCATION": { + "support": 7, + "precision": 0.7, + "recall": 1.0, + "f2": 0.9211 + }, + "PERSON": { + "support": 20, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "PHONE_NUMBER": { + "support": 6, + "precision": 0.8333, + "recall": 0.8333, + "f2": 0.8333 + }, + "UK_NHS": { + "support": 3, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + }, + "URL": { + "support": 7, + "precision": 1.0, + "recall": 0.7143, + "f2": 0.7576 + }, + "US_SSN": { + "support": 4, + "precision": 1.0, + "recall": 1.0, + "f2": 1.0 + } + } +} diff --git a/presidio-analyzer/tests/evaluation/datasets/golden_en.json b/presidio-analyzer/tests/evaluation/datasets/golden_en.json new file mode 100644 index 0000000000..4b22661b7a --- /dev/null +++ b/presidio-analyzer/tests/evaluation/datasets/golden_en.json @@ -0,0 +1,894 @@ +{ + "version": 1, + "language": "en", + "entities": [ + "PERSON", + "LOCATION", + "DATE_TIME", + "EMAIL_ADDRESS", + "PHONE_NUMBER", + "CREDIT_CARD", + "US_SSN", + "IP_ADDRESS", + "URL", + "IBAN_CODE", + "CRYPTO", + "UK_NHS" + ], + "samples": [ + { + "id": "person_simple_001", + "category": "simple", + "text": "My name is David Johnson and I am calling about my account.", + "spans": [ + { + "entity_type": "PERSON", + "start": 11, + "end": 24, + "entity_value": "David Johnson" + } + ] + }, + { + "id": "person_simple_002", + "category": "simple", + "text": "Please forward the report to Maria Garcia in accounting.", + "spans": [ + { + "entity_type": "PERSON", + "start": 29, + "end": 41, + "entity_value": "Maria Garcia" + } + ] + }, + { + "id": "email_simple_001", + "category": "simple", + "text": "Contact us at support@acme-corp.com for further details.", + "spans": [ + { + "entity_type": "EMAIL_ADDRESS", + "start": 14, + "end": 35, + "entity_value": "support@acme-corp.com" + } + ] + }, + { + "id": "email_simple_002", + "category": "simple", + "text": "Her personal address is jane.doe+billing@gmail.com.", + "spans": [ + { + "entity_type": "EMAIL_ADDRESS", + "start": 24, + "end": 50, + "entity_value": "jane.doe+billing@gmail.com" + } + ] + }, + { + "id": "phone_simple_001", + "category": "simple", + "text": "Call (212) 555-0143 to reschedule your appointment.", + "spans": [ + { + "entity_type": "PHONE_NUMBER", + "start": 5, + "end": 19, + "entity_value": "(212) 555-0143" + } + ] + }, + { + "id": "phone_simple_002", + "category": "simple", + "text": "You can reach the office at +1-312-555-0198.", + "spans": [ + { + "entity_type": "PHONE_NUMBER", + "start": 28, + "end": 43, + "entity_value": "+1-312-555-0198" + } + ] + }, + { + "id": "credit_card_simple_001", + "category": "simple", + "text": "The payment was made with card 4111 1111 1111 1111.", + "spans": [ + { + "entity_type": "CREDIT_CARD", + "start": 31, + "end": 50, + "entity_value": "4111 1111 1111 1111" + } + ] + }, + { + "id": "credit_card_simple_002", + "category": "simple", + "text": "Charge the amount to 5555555555554444 as usual.", + "spans": [ + { + "entity_type": "CREDIT_CARD", + "start": 21, + "end": 37, + "entity_value": "5555555555554444" + } + ] + }, + { + "id": "ssn_simple_001", + "category": "simple", + "text": "The applicant's social security number is 078-05-1123.", + "spans": [ + { + "entity_type": "US_SSN", + "start": 42, + "end": 53, + "entity_value": "078-05-1123" + } + ] + }, + { + "id": "ip_simple_001", + "category": "simple", + "text": "A login attempt was made from 192.168.1.101.", + "spans": [ + { + "entity_type": "IP_ADDRESS", + "start": 30, + "end": 43, + "entity_value": "192.168.1.101" + } + ] + }, + { + "id": "ip_simple_002", + "category": "simple", + "text": "The server listens on 2001:db8:85a3::8a2e:370:7334 for IPv6 traffic.", + "spans": [ + { + "entity_type": "IP_ADDRESS", + "start": 22, + "end": 50, + "entity_value": "2001:db8:85a3::8a2e:370:7334" + } + ] + }, + { + "id": "url_simple_001", + "category": "simple", + "text": "The installation guide is at https://docs.example-project.org/setup.", + "spans": [ + { + "entity_type": "URL", + "start": 29, + "end": 67, + "entity_value": "https://docs.example-project.org/setup" + } + ] + }, + { + "id": "iban_simple_001", + "category": "simple", + "text": "Please transfer the funds to DE89 3704 0044 0532 0130 00.", + "spans": [ + { + "entity_type": "IBAN_CODE", + "start": 29, + "end": 56, + "entity_value": "DE89 3704 0044 0532 0130 00" + } + ] + }, + { + "id": "crypto_simple_001", + "category": "simple", + "text": "Send the bitcoin payment to 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.", + "spans": [ + { + "entity_type": "CRYPTO", + "start": 28, + "end": 62, + "entity_value": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" + } + ] + }, + { + "id": "nhs_simple_001", + "category": "simple", + "text": "The patient's NHS number is 401-023-2137.", + "spans": [ + { + "entity_type": "UK_NHS", + "start": 28, + "end": 40, + "entity_value": "401-023-2137" + } + ] + }, + { + "id": "date_simple_001", + "category": "simple", + "text": "The invoice was issued on March 5, 2024.", + "spans": [ + { + "entity_type": "DATE_TIME", + "start": 26, + "end": 39, + "entity_value": "March 5, 2024" + } + ] + }, + { + "id": "location_simple_001", + "category": "simple", + "text": "She recently moved to Barcelona for a new role.", + "spans": [ + { + "entity_type": "LOCATION", + "start": 22, + "end": 31, + "entity_value": "Barcelona" + } + ] + }, + { + "id": "location_simple_002", + "category": "simple", + "text": "The conference will be hosted in Toronto, Canada.", + "spans": [ + { + "entity_type": "LOCATION", + "start": 33, + "end": 40, + "entity_value": "Toronto" + }, + { + "entity_type": "LOCATION", + "start": 42, + "end": 48, + "entity_value": "Canada" + } + ] + }, + { + "id": "support_ticket_001", + "category": "medium", + "text": "Customer Alice Brown reported that she cannot log in. Her registered email is alice.brown@example.com and her callback number is (415) 555-0132.", + "spans": [ + { + "entity_type": "PERSON", + "start": 9, + "end": 20, + "entity_value": "Alice Brown" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 78, + "end": 101, + "entity_value": "alice.brown@example.com" + }, + { + "entity_type": "PHONE_NUMBER", + "start": 129, + "end": 143, + "entity_value": "(415) 555-0132" + } + ] + }, + { + "id": "hr_note_001", + "category": "medium", + "text": "Robert King joined the team on January 12, 2023 and relocated from Chicago to Seattle.", + "spans": [ + { + "entity_type": "PERSON", + "start": 0, + "end": 11, + "entity_value": "Robert King" + }, + { + "entity_type": "DATE_TIME", + "start": 31, + "end": 47, + "entity_value": "January 12, 2023" + }, + { + "entity_type": "LOCATION", + "start": 67, + "end": 74, + "entity_value": "Chicago" + }, + { + "entity_type": "LOCATION", + "start": 78, + "end": 85, + "entity_value": "Seattle" + } + ] + }, + { + "id": "bank_note_001", + "category": "medium", + "text": "Wire sent to IBAN IL62 0108 0000 0009 9999 999 on behalf of Daniel Cohen. Reference card ending was replaced by 4111111111111111.", + "spans": [ + { + "entity_type": "IBAN_CODE", + "start": 18, + "end": 46, + "entity_value": "IL62 0108 0000 0009 9999 999" + }, + { + "entity_type": "PERSON", + "start": 60, + "end": 72, + "entity_value": "Daniel Cohen" + }, + { + "entity_type": "CREDIT_CARD", + "start": 112, + "end": 128, + "entity_value": "4111111111111111" + } + ] + }, + { + "id": "server_log_001", + "category": "medium", + "text": "Failed SSH login from 203.0.113.42 targeting host 198.51.100.7; alert emailed to secops@corp-infra.io.", + "spans": [ + { + "entity_type": "IP_ADDRESS", + "start": 22, + "end": 34, + "entity_value": "203.0.113.42" + }, + { + "entity_type": "IP_ADDRESS", + "start": 50, + "end": 62, + "entity_value": "198.51.100.7" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 81, + "end": 101, + "entity_value": "secops@corp-infra.io" + } + ] + }, + { + "id": "order_confirmation_001", + "category": "medium", + "text": "Hi Emily Watson, your order will arrive on Friday, June 21. Track it at https://shipping.example.com/track?id=98765.", + "spans": [ + { + "entity_type": "PERSON", + "start": 3, + "end": 15, + "entity_value": "Emily Watson" + }, + { + "entity_type": "DATE_TIME", + "start": 43, + "end": 58, + "entity_value": "Friday, June 21" + }, + { + "entity_type": "URL", + "start": 72, + "end": 115, + "entity_value": "https://shipping.example.com/track?id=98765" + } + ] + }, + { + "id": "clinical_note_001", + "category": "medium", + "text": "Patient Margaret Hill (NHS 4010232137) attended a follow-up on 12 May 2024. Next of kin can be reached at +44 20 7946 0958.", + "spans": [ + { + "entity_type": "PERSON", + "start": 8, + "end": 21, + "entity_value": "Margaret Hill" + }, + { + "entity_type": "UK_NHS", + "start": 27, + "end": 37, + "entity_value": "4010232137" + }, + { + "entity_type": "DATE_TIME", + "start": 63, + "end": 74, + "entity_value": "12 May 2024" + }, + { + "entity_type": "PHONE_NUMBER", + "start": 106, + "end": 122, + "entity_value": "+44 20 7946 0958" + } + ] + }, + { + "id": "travel_itinerary_001", + "category": "medium", + "text": "James Miller flies from London to New York on October 3rd. Confirmation was sent to j.miller@travelmail.net.", + "spans": [ + { + "entity_type": "PERSON", + "start": 0, + "end": 12, + "entity_value": "James Miller" + }, + { + "entity_type": "LOCATION", + "start": 24, + "end": 30, + "entity_value": "London" + }, + { + "entity_type": "LOCATION", + "start": 34, + "end": 42, + "entity_value": "New York" + }, + { + "entity_type": "DATE_TIME", + "start": 46, + "end": 57, + "entity_value": "October 3rd" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 84, + "end": 107, + "entity_value": "j.miller@travelmail.net" + } + ] + }, + { + "id": "signature_block_001", + "category": "medium", + "text": "Best regards,\nSarah Connor\nHead of Operations\nsarah.connor@cyber-systems.com\n+1 (617) 555-0170\nhttps://www.cyber-systems.com", + "spans": [ + { + "entity_type": "PERSON", + "start": 14, + "end": 26, + "entity_value": "Sarah Connor" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 46, + "end": 76, + "entity_value": "sarah.connor@cyber-systems.com" + }, + { + "entity_type": "PHONE_NUMBER", + "start": 77, + "end": 94, + "entity_value": "+1 (617) 555-0170" + }, + { + "entity_type": "URL", + "start": 95, + "end": 124, + "entity_value": "https://www.cyber-systems.com" + } + ] + }, + { + "id": "payment_dispute_001", + "category": "medium", + "text": "On April 2, 2024, a charge on card 378282246310005 was disputed by Carlos Ruiz. His SSN on file is 078-05-1123.", + "spans": [ + { + "entity_type": "DATE_TIME", + "start": 3, + "end": 16, + "entity_value": "April 2, 2024" + }, + { + "entity_type": "CREDIT_CARD", + "start": 35, + "end": 50, + "entity_value": "378282246310005" + }, + { + "entity_type": "PERSON", + "start": 67, + "end": 78, + "entity_value": "Carlos Ruiz" + }, + { + "entity_type": "US_SSN", + "start": 99, + "end": 110, + "entity_value": "078-05-1123" + } + ] + }, + { + "id": "crypto_report_001", + "category": "medium", + "text": "The wallet 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy received funds routed through 104.26.10.229; details published at https://chain-audit.example.io/report.", + "spans": [ + { + "entity_type": "CRYPTO", + "start": 11, + "end": 45, + "entity_value": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy" + }, + { + "entity_type": "IP_ADDRESS", + "start": 76, + "end": 89, + "entity_value": "104.26.10.229" + }, + { + "entity_type": "URL", + "start": 112, + "end": 149, + "entity_value": "https://chain-audit.example.io/report" + } + ] + }, + { + "id": "discharge_summary_001", + "category": "long", + "text": "DISCHARGE SUMMARY\n\nPatient Kenji Nakamura was admitted on 3 February 2024 and discharged on 9 February 2024. NHS number: 401 023 2137. The patient lives in Manchester with his daughter Yuki Nakamura, who can be contacted on +44 161 496 0735 or at yuki.nakamura@familymail.co.uk. Follow-up scheduled for March 1, 2024 at the outpatient clinic.", + "spans": [ + { + "entity_type": "PERSON", + "start": 27, + "end": 41, + "entity_value": "Kenji Nakamura" + }, + { + "entity_type": "DATE_TIME", + "start": 58, + "end": 73, + "entity_value": "3 February 2024" + }, + { + "entity_type": "DATE_TIME", + "start": 92, + "end": 107, + "entity_value": "9 February 2024" + }, + { + "entity_type": "UK_NHS", + "start": 121, + "end": 133, + "entity_value": "401 023 2137" + }, + { + "entity_type": "LOCATION", + "start": 156, + "end": 166, + "entity_value": "Manchester" + }, + { + "entity_type": "PERSON", + "start": 185, + "end": 198, + "entity_value": "Yuki Nakamura" + }, + { + "entity_type": "PHONE_NUMBER", + "start": 224, + "end": 240, + "entity_value": "+44 161 496 0735" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 247, + "end": 277, + "entity_value": "yuki.nakamura@familymail.co.uk" + }, + { + "entity_type": "DATE_TIME", + "start": 303, + "end": 316, + "entity_value": "March 1, 2024" + } + ] + }, + { + "id": "incident_report_001", + "category": "long", + "text": "INCIDENT 4471 SUMMARY\n\nBetween 02:00 and 04:30 UTC we observed repeated credential-stuffing attempts against https://login.example-bank.com originating from 185.220.101.5 and 185.220.101.34. The on-call engineer, Priya Sharma, blocked both addresses and notified fraud-team@example-bank.com. No cardholder data was exposed; the honeypot card number 4012888888881881 recorded no authorization attempts.", + "spans": [ + { + "entity_type": "DATE_TIME", + "start": 31, + "end": 50, + "entity_value": "02:00 and 04:30 UTC" + }, + { + "entity_type": "URL", + "start": 109, + "end": 139, + "entity_value": "https://login.example-bank.com" + }, + { + "entity_type": "IP_ADDRESS", + "start": 157, + "end": 170, + "entity_value": "185.220.101.5" + }, + { + "entity_type": "IP_ADDRESS", + "start": 175, + "end": 189, + "entity_value": "185.220.101.34" + }, + { + "entity_type": "PERSON", + "start": 213, + "end": 225, + "entity_value": "Priya Sharma" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 263, + "end": 290, + "entity_value": "fraud-team@example-bank.com" + }, + { + "entity_type": "CREDIT_CARD", + "start": 349, + "end": 365, + "entity_value": "4012888888881881" + } + ] + }, + { + "id": "kyc_paragraph_001", + "category": "long", + "text": "KYC VERIFICATION\n\nApplicant Fatima Al-Sayed, residing in Dubai, provided SSN 078-05-1123 and settlement account GB29 NWBK 6016 1331 9268 19. Identity confirmed via video call on 11 November 2023; certificate archived at https://kyc.example-verify.com/cases/8842.", + "spans": [ + { + "entity_type": "PERSON", + "start": 28, + "end": 43, + "entity_value": "Fatima Al-Sayed" + }, + { + "entity_type": "LOCATION", + "start": 57, + "end": 62, + "entity_value": "Dubai" + }, + { + "entity_type": "US_SSN", + "start": 77, + "end": 88, + "entity_value": "078-05-1123" + }, + { + "entity_type": "IBAN_CODE", + "start": 112, + "end": 139, + "entity_value": "GB29 NWBK 6016 1331 9268 19" + }, + { + "entity_type": "DATE_TIME", + "start": 178, + "end": 194, + "entity_value": "11 November 2023" + }, + { + "entity_type": "URL", + "start": 220, + "end": 261, + "entity_value": "https://kyc.example-verify.com/cases/8842" + } + ] + }, + { + "id": "meeting_minutes_001", + "category": "long", + "text": "Minutes — infrastructure sync, Tuesday, 14 May\n\nAttendees: Lars Eriksson, Nina Petrova (remote from Berlin).\n\nLars Eriksson reported that the gateway at 10.0.0.254 will be decommissioned. Action items were mailed to infra-sync@corp-example.com.", + "spans": [ + { + "entity_type": "DATE_TIME", + "start": 31, + "end": 46, + "entity_value": "Tuesday, 14 May" + }, + { + "entity_type": "PERSON", + "start": 59, + "end": 72, + "entity_value": "Lars Eriksson" + }, + { + "entity_type": "PERSON", + "start": 74, + "end": 86, + "entity_value": "Nina Petrova" + }, + { + "entity_type": "LOCATION", + "start": 100, + "end": 106, + "entity_value": "Berlin" + }, + { + "entity_type": "PERSON", + "start": 110, + "end": 123, + "entity_value": "Lars Eriksson" + }, + { + "entity_type": "IP_ADDRESS", + "start": 153, + "end": 163, + "entity_value": "10.0.0.254" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 216, + "end": 243, + "entity_value": "infra-sync@corp-example.com" + } + ] + }, + { + "id": "edge_lowercase_name_001", + "category": "edge", + "text": "appointment note: dr nakamura kenji will see the patient today", + "spans": [ + { + "entity_type": "PERSON", + "start": 21, + "end": 35, + "entity_value": "nakamura kenji" + } + ] + }, + { + "id": "edge_hyphenated_name_001", + "category": "edge", + "text": "Anne-Marie O'Neill signed the consent form.", + "spans": [ + { + "entity_type": "PERSON", + "start": 0, + "end": 18, + "entity_value": "Anne-Marie O'Neill" + } + ] + }, + { + "id": "edge_name_at_start_001", + "category": "edge", + "text": "Thomas Anderson requested a password reset.", + "spans": [ + { + "entity_type": "PERSON", + "start": 0, + "end": 15, + "entity_value": "Thomas Anderson" + } + ] + }, + { + "id": "edge_entity_at_end_001", + "category": "edge", + "text": "For any billing questions email billing@example-corp.net", + "spans": [ + { + "entity_type": "EMAIL_ADDRESS", + "start": 32, + "end": 56, + "entity_value": "billing@example-corp.net" + } + ] + }, + { + "id": "edge_adjacent_entities_001", + "category": "edge", + "text": "Escalated to John Smith john.smith@corp-example.com for review.", + "spans": [ + { + "entity_type": "PERSON", + "start": 13, + "end": 23, + "entity_value": "John Smith" + }, + { + "entity_type": "EMAIL_ADDRESS", + "start": 24, + "end": 51, + "entity_value": "john.smith@corp-example.com" + } + ] + }, + { + "id": "edge_inline_id_001", + "category": "edge", + "text": "Case #078-05-1123 was closed after identity verification.", + "spans": [ + { + "entity_type": "US_SSN", + "start": 6, + "end": 17, + "entity_value": "078-05-1123" + } + ] + }, + { + "id": "edge_spaced_card_001", + "category": "edge", + "text": "Card on file: 5555 5555 5555 4444 (primary).", + "spans": [ + { + "entity_type": "CREDIT_CARD", + "start": 14, + "end": 33, + "entity_value": "5555 5555 5555 4444" + } + ] + }, + { + "id": "edge_url_query_001", + "category": "edge", + "text": "Reset your password at https://auth.example.com/reset?token=abc123&user=456.", + "spans": [ + { + "entity_type": "URL", + "start": 23, + "end": 75, + "entity_value": "https://auth.example.com/reset?token=abc123&user=456" + } + ] + }, + { + "id": "negative_version_001", + "category": "negative", + "text": "Please upgrade the client to version 10.2.1 before the rollout.", + "spans": [] + }, + { + "id": "negative_numbers_001", + "category": "negative", + "text": "The warehouse stores 4111 pallets across 16 aisles.", + "spans": [] + }, + { + "id": "negative_tech_001", + "category": "negative", + "text": "The API returns a JSON object with numeric identifiers for each record.", + "spans": [] + }, + { + "id": "negative_metrics_001", + "category": "negative", + "text": "Server response time improved by 20 percent after the caching change.", + "spans": [] + }, + { + "id": "negative_room_001", + "category": "negative", + "text": "The workshop takes place in room 402, building C.", + "spans": [] + }, + { + "id": "negative_product_001", + "category": "negative", + "text": "Model XR-500 ships with a 250 GB drive and dual fans.", + "spans": [] + } + ] +} diff --git a/presidio-analyzer/tests/evaluation/evaluation.py b/presidio-analyzer/tests/evaluation/evaluation.py new file mode 100644 index 0000000000..618b3566d0 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/evaluation.py @@ -0,0 +1,280 @@ +"""Analyzer evaluation on top of ``presidio-evaluator``. + +This module is a thin CI-oriented wrapper around the org's +``presidio-evaluator`` package (``data-privacy-stack/presidio-research``). It +converts the checked-in golden dataset into ``InputSample``s, runs the +analyzer through ``PresidioAnalyzerWrapper`` + ``SpanEvaluator``, and reduces +the result to a small, serializable report used for the per-PR CI summary and +baseline comparison. + +Scoring is span-based (character IoU) with F-beta = 2 (recall-weighted), +matching Presidio's documented evaluation convention. The ``CanonicalMapper`` +entity-hierarchy step is intentionally skipped: the golden dataset is +annotated with the analyzer's own entity names, so predictions and +annotations already share a label space and no mapping is required. +""" + +import json +import time +from dataclasses import dataclass, field +from pathlib import Path +from typing import Dict, List, Optional + + +@dataclass +class EntityScore: + """Per-entity metrics for one entity type (F-beta = 2).""" + + entity_type: str + support: int = 0 + true_positives: int = 0 + false_positives: int = 0 + false_negatives: int = 0 + precision: float = 0.0 + recall: float = 0.0 + f2: float = 0.0 + + +@dataclass +class Mismatch: + """A single false positive / false negative / wrong-entity error.""" + + kind: str # "false_positive" | "false_negative" | "wrong_entity" + entity_type: str + text: str + + +@dataclass +class EvaluationReport: + """Reduced, serializable result of an evaluation run.""" + + per_entity: Dict[str, EntityScore] + overall_precision: float = 0.0 + overall_recall: float = 0.0 + overall_f2: float = 0.0 + n_samples: int = 0 + total_chars: int = 0 + total_seconds: float = 0.0 + mismatches: List[Mismatch] = field(default_factory=list) + + @property + def chars_per_second(self) -> float: + """Analyzer throughput over the whole dataset.""" + return self.total_chars / self.total_seconds if self.total_seconds else 0.0 + + def to_markdown( + self, max_mismatches: int = 25, baseline: Optional[Dict] = None + ) -> str: + """Render the report as markdown. + + :param max_mismatches: Cap on the number of mismatch rows included. + :param baseline: Optional baseline dict (see ``baseline.py``); when + given, an F2-delta column is added to the per-entity table. + """ + overall = ( + f"**Overall (PII): precision {self.overall_precision:.3f} | " + f"recall {self.overall_recall:.3f} | F2 {self.overall_f2:.3f}" + ) + if baseline: + overall += ( + f" ({_round_delta(self.overall_f2 - baseline['overall']['f2']):+.3f}" + " vs baseline)" + ) + overall += "**" + + header = "| Entity | Support | TP | FP | FN | Precision | Recall | F2 |" + separator = "|---|---|---|---|---|---|---|---|" + if baseline: + header += " F2 Δ |" + separator += "---|" + + lines = [ + "## Analyzer evaluation report", + "", + "Engine: `presidio-evaluator` SpanEvaluator (char IoU, β=2)", + "", + f"Samples: {self.n_samples} | Characters: {self.total_chars} | " + f"Throughput: {self.chars_per_second:,.0f} chars/sec | " + f"Total analyze time: {self.total_seconds:.2f}s", + "", + overall, + "", + header, + separator, + ] + for entity_type in sorted(self.per_entity): + m = self.per_entity[entity_type] + row = ( + f"| {m.entity_type} | {m.support} | {m.true_positives} " + f"| {m.false_positives} | {m.false_negatives} " + f"| {m.precision:.3f} | {m.recall:.3f} | {m.f2:.3f} |" + ) + if baseline: + baseline_entity = baseline["per_entity"].get(entity_type) + if baseline_entity is None: + row += " new |" + else: + row += f" {_round_delta(m.f2 - baseline_entity['f2']):+.3f} |" + lines.append(row) + + if self.mismatches: + shown = min(len(self.mismatches), max_mismatches) + lines += [ + "", + f"### Mismatches (first {shown} of {len(self.mismatches)})", + "", + "| Kind | Entity | Text |", + "|---|---|---|", + ] + for mismatch in self.mismatches[:max_mismatches]: + text = mismatch.text.replace("|", "\\|").replace("\n", " ") + lines.append(f"| {mismatch.kind} | {mismatch.entity_type} | `{text}` |") + + lines.append("") + return "\n".join(lines) + + +def _round_delta(delta: float) -> float: + """Round a metric delta for display, normalizing negative zero.""" + return round(delta, 3) + 0.0 + + +def load_input_samples(path: Path): + """Load the golden dataset as ``presidio_evaluator.InputSample``s. + + :param path: Path to a golden dataset JSON file. + :return: Dict with ``language``, ``entities`` and ``samples`` + (a list of ``InputSample``). + """ + from presidio_evaluator import InputSample, Span + + with open(path, encoding="utf-8") as f: + raw = json.load(f) + + samples = [] + for sample in raw["samples"]: + spans = [ + Span( + entity_type=span["entity_type"], + entity_value=span["entity_value"], + start_position=span["start"], + end_position=span["end"], + ) + for span in sample["spans"] + ] + samples.append( + InputSample( + full_text=sample["text"], + spans=spans, + create_tags_from_span=True, + metadata={"category": sample["category"], "id": sample["id"]}, + ) + ) + return { + "language": raw["language"], + "entities": raw["entities"], + "samples": samples, + } + + +_ERROR_KIND = { + "FP": "false_positive", + "FN": "false_negative", + "WrongEntity": "wrong_entity", +} + + +def _build_report(evaluation_result, entities, n_samples, total_chars, elapsed): + """Reduce a presidio-evaluator ``EvaluationResult`` to ``EvaluationReport``.""" + per_entity = {entity: EntityScore(entity_type=entity) for entity in entities} + for entity, metrics in (evaluation_result.per_type or {}).items(): + per_entity[entity] = EntityScore( + entity_type=entity, + support=int(metrics.num_annotated), + true_positives=int(metrics.true_positives), + false_positives=int(metrics.false_positives), + false_negatives=int(metrics.false_negatives), + precision=float(metrics.precision), + recall=float(metrics.recall), + f2=float(metrics.f_beta), + ) + + mismatches = [] + for error in evaluation_result.model_errors or []: + error_type = getattr(error.error_type, "value", str(error.error_type)) + entity = error.annotation if error_type == "FN" else error.prediction + mismatches.append( + Mismatch( + kind=_ERROR_KIND.get(error_type, error_type), + entity_type=entity, + text=str(error.token), + ) + ) + + return EvaluationReport( + per_entity=per_entity, + overall_precision=float(evaluation_result.pii_precision or 0.0), + overall_recall=float(evaluation_result.pii_recall or 0.0), + overall_f2=float(evaluation_result.pii_f or 0.0), + n_samples=n_samples, + total_chars=total_chars, + total_seconds=elapsed, + mismatches=mismatches, + ) + + +def run_evaluation( + dataset_path: Optional[Path] = None, + iou_threshold: float = 0.5, + analyzer_conf: Optional[Path] = None, + score_threshold: float = 0.4, +) -> EvaluationReport: + """Evaluate an analyzer configuration against the golden dataset. + + :param dataset_path: Dataset file; defaults to the checked-in golden set. + :param iou_threshold: Character IoU threshold for span matching. + :param analyzer_conf: Optional full analyzer YAML configuration; when + omitted, the default AnalyzerEngine is used. + :param score_threshold: Minimum analyzer confidence to keep a prediction. + """ + from presidio_analyzer import ( + AnalyzerEngine, + AnalyzerEngineProvider, + ) + from presidio_evaluator.evaluation import SpanEvaluator + from presidio_evaluator.models import PresidioAnalyzerWrapper + + dataset = load_input_samples(dataset_path or default_dataset_path()) + samples = dataset["samples"] + entities = dataset["entities"] + + if analyzer_conf: + engine = AnalyzerEngineProvider( + analyzer_engine_conf_file=analyzer_conf + ).create_engine() + else: + engine = AnalyzerEngine() + + wrapper = PresidioAnalyzerWrapper( + analyzer_engine=engine, + entities_to_keep=entities, + language=dataset["language"], + score_threshold=score_threshold, + ) + + start = time.perf_counter() + results_df = wrapper.predict_dataset(samples) + elapsed = time.perf_counter() - start + + evaluator = SpanEvaluator(iou_threshold=iou_threshold, entities_to_keep=entities) + evaluation_result = evaluator.calculate_score_on_df(results_df, beta=2) + + total_chars = sum(len(sample.full_text) for sample in samples) + return _build_report( + evaluation_result, entities, len(samples), total_chars, elapsed + ) + + +def default_dataset_path() -> Path: + """Path of the checked-in English golden dataset.""" + return Path(__file__).parent / "datasets" / "golden_en.json" diff --git a/presidio-analyzer/tests/evaluation/generate_golden_en.py b/presidio-analyzer/tests/evaluation/generate_golden_en.py new file mode 100644 index 0000000000..35b65d7ffa --- /dev/null +++ b/presidio-analyzer/tests/evaluation/generate_golden_en.py @@ -0,0 +1,241 @@ +"""Source of truth for the English golden dataset. + +Regenerate ``datasets/golden_en.json`` after editing the samples below:: + + python -m tests.evaluation.generate_golden_en + +Each sample is a list of parts: plain strings, or (value, entity_type) +tuples. Character offsets are computed by concatenation, so annotations are +correct by construction — never edit the JSON by hand. A sync test +(``test_golden_dataset.py``) fails if the committed JSON drifts from this +module. + +Entity values are checksum-valid where the recognizer validates (credit card +Luhn, IBAN mod-97, NHS check digit, SSN excluded ranges) — taken from the +repo's own unit tests where possible. +""" + +import json +from pathlib import Path +from typing import Dict + +P = "PERSON" +LOC = "LOCATION" +DT = "DATE_TIME" +EMAIL = "EMAIL_ADDRESS" +PHONE = "PHONE_NUMBER" +CC = "CREDIT_CARD" +SSN = "US_SSN" +IP = "IP_ADDRESS" +URL = "URL" +IBAN = "IBAN_CODE" +CRYPTO = "CRYPTO" +NHS = "UK_NHS" + +ENTITIES = [P, LOC, DT, EMAIL, PHONE, CC, SSN, IP, URL, IBAN, CRYPTO, NHS] + +# (id, category, parts) +SAMPLES = [ + # ------------------------------------------------ simple: one entity each + ("person_simple_001", "simple", + ["My name is ", ("David Johnson", P), " and I am calling about my account."]), + ("person_simple_002", "simple", + ["Please forward the report to ", ("Maria Garcia", P), " in accounting."]), + ("email_simple_001", "simple", + ["Contact us at ", ("support@acme-corp.com", EMAIL), " for further details."]), + ("email_simple_002", "simple", + ["Her personal address is ", ("jane.doe+billing@gmail.com", EMAIL), "."]), + ("phone_simple_001", "simple", + ["Call ", ("(212) 555-0143", PHONE), " to reschedule your appointment."]), + ("phone_simple_002", "simple", + ["You can reach the office at ", ("+1-312-555-0198", PHONE), "."]), + ("credit_card_simple_001", "simple", + ["The payment was made with card ", ("4111 1111 1111 1111", CC), "."]), + ("credit_card_simple_002", "simple", + ["Charge the amount to ", ("5555555555554444", CC), " as usual."]), + ("ssn_simple_001", "simple", + ["The applicant's social security number is ", ("078-05-1123", SSN), "."]), + ("ip_simple_001", "simple", + ["A login attempt was made from ", ("192.168.1.101", IP), "."]), + ("ip_simple_002", "simple", + ["The server listens on ", ("2001:db8:85a3::8a2e:370:7334", IP), " for IPv6 traffic."]), + ("url_simple_001", "simple", + ["The installation guide is at ", ("https://docs.example-project.org/setup", URL), "."]), + ("iban_simple_001", "simple", + ["Please transfer the funds to ", ("DE89 3704 0044 0532 0130 00", IBAN), "."]), + ("crypto_simple_001", "simple", + ["Send the bitcoin payment to ", ("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", CRYPTO), "."]), + ("nhs_simple_001", "simple", + ["The patient's NHS number is ", ("401-023-2137", NHS), "."]), + ("date_simple_001", "simple", + ["The invoice was issued on ", ("March 5, 2024", DT), "."]), + ("location_simple_001", "simple", + ["She recently moved to ", ("Barcelona", LOC), " for a new role."]), + ("location_simple_002", "simple", + ["The conference will be hosted in ", ("Toronto", LOC), ", ", ("Canada", LOC), "."]), + + # -------------------------------------------- medium: multi-entity texts + ("support_ticket_001", "medium", + ["Customer ", ("Alice Brown", P), " reported that she cannot log in. ", + "Her registered email is ", ("alice.brown@example.com", EMAIL), + " and her callback number is ", ("(415) 555-0132", PHONE), "."]), + ("hr_note_001", "medium", + [("Robert King", P), " joined the team on ", ("January 12, 2023", DT), + " and relocated from ", ("Chicago", LOC), " to ", ("Seattle", LOC), "."]), + ("bank_note_001", "medium", + ["Wire sent to IBAN ", ("IL62 0108 0000 0009 9999 999", IBAN), + " on behalf of ", ("Daniel Cohen", P), + ". Reference card ending was replaced by ", ("4111111111111111", CC), "."]), + ("server_log_001", "medium", + ["Failed SSH login from ", ("203.0.113.42", IP), + " targeting host ", ("198.51.100.7", IP), + "; alert emailed to ", ("secops@corp-infra.io", EMAIL), "."]), + ("order_confirmation_001", "medium", + ["Hi ", ("Emily Watson", P), ", your order will arrive on ", + ("Friday, June 21", DT), ". Track it at ", + ("https://shipping.example.com/track?id=98765", URL), "."]), + ("clinical_note_001", "medium", + ["Patient ", ("Margaret Hill", P), " (NHS ", ("4010232137", NHS), ")", + " attended a follow-up on ", ("12 May 2024", DT), + ". Next of kin can be reached at ", ("+44 20 7946 0958", PHONE), "."]), + ("travel_itinerary_001", "medium", + [("James Miller", P), " flies from ", ("London", LOC), " to ", ("New York", LOC), + " on ", ("October 3rd", DT), ". Confirmation was sent to ", + ("j.miller@travelmail.net", EMAIL), "."]), + ("signature_block_001", "medium", + ["Best regards,\n", ("Sarah Connor", P), "\nHead of Operations\n", + ("sarah.connor@cyber-systems.com", EMAIL), "\n", ("+1 (617) 555-0170", PHONE), + "\n", ("https://www.cyber-systems.com", URL)]), + ("payment_dispute_001", "medium", + ["On ", ("April 2, 2024", DT), ", a charge on card ", + ("378282246310005", CC), " was disputed by ", ("Carlos Ruiz", P), + ". His SSN on file is ", ("078-05-1123", SSN), "."]), + ("crypto_report_001", "medium", + ["The wallet ", ("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy", CRYPTO), + " received funds routed through ", ("104.26.10.229", IP), + "; details published at ", ("https://chain-audit.example.io/report", URL), "."]), + + # ---------------------------------------------- long / complex documents + ("discharge_summary_001", "long", + ["DISCHARGE SUMMARY\n\nPatient ", ("Kenji Nakamura", P), + " was admitted on ", ("3 February 2024", DT), + " and discharged on ", ("9 February 2024", DT), + ". NHS number: ", ("401 023 2137", NHS), + ". The patient lives in ", ("Manchester", LOC), + " with his daughter ", ("Yuki Nakamura", P), + ", who can be contacted on ", ("+44 161 496 0735", PHONE), + " or at ", ("yuki.nakamura@familymail.co.uk", EMAIL), + ". Follow-up scheduled for ", ("March 1, 2024", DT), + " at the outpatient clinic."]), + ("incident_report_001", "long", + ["INCIDENT 4471 SUMMARY\n\nBetween ", ("02:00 and 04:30 UTC", DT), + " we observed repeated credential-stuffing attempts against ", + ("https://login.example-bank.com", URL), + " originating from ", ("185.220.101.5", IP), " and ", ("185.220.101.34", IP), + ". The on-call engineer, ", ("Priya Sharma", P), + ", blocked both addresses and notified ", ("fraud-team@example-bank.com", EMAIL), + ". No cardholder data was exposed; the honeypot card number ", + ("4012888888881881", CC), " recorded no authorization attempts."]), + ("kyc_paragraph_001", "long", + ["KYC VERIFICATION\n\nApplicant ", ("Fatima Al-Sayed", P), + ", residing in ", ("Dubai", LOC), + ", provided SSN ", ("078-05-1123", SSN), + " and settlement account ", ("GB29 NWBK 6016 1331 9268 19", IBAN), + ". Identity confirmed via video call on ", ("11 November 2023", DT), + "; certificate archived at ", + ("https://kyc.example-verify.com/cases/8842", URL), "."]), + ("meeting_minutes_001", "long", + ["Minutes — infrastructure sync, ", ("Tuesday, 14 May", DT), + "\n\nAttendees: ", ("Lars Eriksson", P), ", ", ("Nina Petrova", P), + " (remote from ", ("Berlin", LOC), ").\n\n", + ("Lars Eriksson", P), " reported that the gateway at ", ("10.0.0.254", IP), + " will be decommissioned. Action items were mailed to ", + ("infra-sync@corp-example.com", EMAIL), "."]), + + # ----------------------------------------------------------- edge cases + ("edge_lowercase_name_001", "edge", + ["appointment note: dr ", ("nakamura kenji", P), " will see the patient today"]), + ("edge_hyphenated_name_001", "edge", + [("Anne-Marie O'Neill", P), " signed the consent form."]), + ("edge_name_at_start_001", "edge", + [("Thomas Anderson", P), " requested a password reset."]), + ("edge_entity_at_end_001", "edge", + ["For any billing questions email ", ("billing@example-corp.net", EMAIL)]), + ("edge_adjacent_entities_001", "edge", + ["Escalated to ", ("John Smith", P), " ", ("john.smith@corp-example.com", EMAIL), + " for review."]), + ("edge_inline_id_001", "edge", + ["Case #", ("078-05-1123", SSN), " was closed after identity verification."]), + ("edge_spaced_card_001", "edge", + ["Card on file: ", ("5555 5555 5555 4444", CC), " (primary)."]), + ("edge_url_query_001", "edge", + ["Reset your password at ", + ("https://auth.example.com/reset?token=abc123&user=456", URL), "."]), + + # ------------------------------------- negatives: no PII, tempting text + ("negative_version_001", "negative", + ["Please upgrade the client to version 10.2.1 before the rollout."]), + ("negative_numbers_001", "negative", + ["The warehouse stores 4111 pallets across 16 aisles."]), + ("negative_tech_001", "negative", + ["The API returns a JSON object with numeric identifiers for each record."]), + ("negative_metrics_001", "negative", + ["Server response time improved by 20 percent after the caching change."]), + ("negative_room_001", "negative", + ["The workshop takes place in room 402, building C."]), + ("negative_product_001", "negative", + ["Model XR-500 ships with a 250 GB drive and dual fans."]), +] + + +def build_dataset() -> Dict: + """Build the dataset dict from the sample definitions above.""" + samples_json = [] + for sample_id, category, parts in SAMPLES: + text = "" + spans = [] + for part in parts: + if isinstance(part, str): + text += part + else: + value, entity_type = part + spans.append({ + "entity_type": entity_type, + "start": len(text), + "end": len(text) + len(value), + "entity_value": value, + }) + text += value + samples_json.append({ + "id": sample_id, + "category": category, + "text": text, + "spans": spans, + }) + + return { + "version": 1, + "language": "en", + "entities": ENTITIES, + "samples": samples_json, + } + + +def dataset_to_json(dataset: Dict) -> str: + """Serialize a dataset dict exactly as the committed file stores it.""" + return json.dumps(dataset, indent=2, ensure_ascii=False) + "\n" + + +def main() -> None: + """Regenerate the committed golden dataset file.""" + dataset = build_dataset() + out = Path(__file__).parent / "datasets" / "golden_en.json" + out.write_text(dataset_to_json(dataset), encoding="utf-8") + print( + f"wrote {out} with {len(dataset['samples'])} samples, " + f"{sum(len(s['spans']) for s in dataset['samples'])} spans" + ) + + +if __name__ == "__main__": + main() diff --git a/presidio-analyzer/tests/evaluation/run_evaluation.py b/presidio-analyzer/tests/evaluation/run_evaluation.py new file mode 100644 index 0000000000..ee53d806a6 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/run_evaluation.py @@ -0,0 +1,147 @@ +"""Run the golden-dataset evaluation and emit a markdown report. + +Usage (from the presidio-analyzer directory, with the ``evaluation`` extra +installed):: + + python -m tests.evaluation.run_evaluation [--output report.md] [--iou 0.5] + +Scoring uses ``presidio-evaluator``'s span-based ``SpanEvaluator`` (character +IoU, F-beta = 2). By default the default AnalyzerEngine is evaluated and, when +the checked-in baseline exists, F2 deltas against it are added to the report. + +Other analyzer configurations (e.g. transformers, GLiNER) can be evaluated +with ``--analyzer-conf ``; pair with ``--baseline`` / ``--write-baseline`` +to track their metrics separately. + +Regression enforcement exists but is off by default: pass +``--fail-on-regression`` to exit non-zero when overall or per-entity F2 drops +more than ``--f2-tolerance`` below the baseline. CI currently runs report-only; +switching enforcement on is a one-line CI change once the numbers have proven +stable. +""" + +import argparse +import sys +from pathlib import Path +from typing import List, Optional + +from tests.evaluation.baseline import ( + DEFAULT_F2_TOLERANCE, + compare_to_baseline, + default_baseline_path, + load_baseline, + save_baseline, +) +from tests.evaluation.evaluation import run_evaluation + +DEFAULT_CONFIG_NAME = "default (spacy en)" + + +def main(argv: Optional[List[str]] = None) -> int: + """CLI entry point; returns the process exit code.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--dataset", + type=Path, + default=None, + help="Path to a golden dataset JSON (default: bundled golden_en.json)", + ) + parser.add_argument( + "--analyzer-conf", + type=Path, + default=None, + help="Full analyzer YAML configuration to evaluate " + "(default: the default AnalyzerEngine)", + ) + parser.add_argument( + "--output", + type=Path, + default=None, + help="File to write the markdown report to (default: stdout)", + ) + parser.add_argument( + "--iou", + type=float, + default=0.5, + help="Character IoU threshold for span matching (default: 0.5)", + ) + parser.add_argument( + "--score-threshold", + type=float, + default=0.4, + help="Minimum analyzer confidence to keep a prediction (default: 0.4)", + ) + parser.add_argument( + "--baseline", + type=Path, + default=None, + help="Baseline JSON to compare against (default: the checked-in " + "spaCy baseline when evaluating the default configuration)", + ) + parser.add_argument( + "--write-baseline", + type=Path, + default=None, + metavar="PATH", + help="Write the run's metrics as a new baseline to PATH and exit", + ) + parser.add_argument( + "--fail-on-regression", + action="store_true", + help="Exit non-zero when F2 drops below the baseline by more than " + "the tolerance (off by default; CI runs report-only)", + ) + parser.add_argument( + "--f2-tolerance", + type=float, + default=DEFAULT_F2_TOLERANCE, + help=f"Allowed F2 drop before a regression is reported " + f"(default: {DEFAULT_F2_TOLERANCE})", + ) + args = parser.parse_args(argv) + + report = run_evaluation( + dataset_path=args.dataset, + iou_threshold=args.iou, + analyzer_conf=args.analyzer_conf, + score_threshold=args.score_threshold, + ) + + config_name = ( + str(args.analyzer_conf) if args.analyzer_conf else DEFAULT_CONFIG_NAME + ) + if args.write_baseline: + save_baseline(report, config_name=config_name, path=args.write_baseline) + print(f"wrote baseline to {args.write_baseline}") + return 0 + + baseline = None + baseline_path = args.baseline + if baseline_path is None and args.analyzer_conf is None: + default_path = default_baseline_path() + if default_path.exists(): + baseline_path = default_path + if baseline_path: + baseline = load_baseline(baseline_path) + + markdown = report.to_markdown(baseline=baseline) + if args.output: + args.output.write_text(markdown, encoding="utf-8") + else: + sys.stdout.write(markdown) + + if baseline: + regressions = compare_to_baseline( + report, baseline, f2_tolerance=args.f2_tolerance + ) + if regressions: + for regression in regressions: + print(f"REGRESSION: {regression}", file=sys.stderr) + if args.fail_on_regression: + return 1 + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/presidio-analyzer/tests/evaluation/test_baseline.py b/presidio-analyzer/tests/evaluation/test_baseline.py new file mode 100644 index 0000000000..1a71ee7f7b --- /dev/null +++ b/presidio-analyzer/tests/evaluation/test_baseline.py @@ -0,0 +1,153 @@ +"""Unit tests for baseline persistence and regression comparison. + +These tests build ``EvaluationReport``s directly and do not require +``presidio-evaluator`` to be installed. +""" + +from tests.evaluation.baseline import ( + compare_to_baseline, + load_baseline, + report_to_baseline, + save_baseline, +) +from tests.evaluation.evaluation import EntityScore, EvaluationReport + + +def _score(entity, tp, fp, fn, beta=2): + precision = tp / (tp + fp) if (tp + fp) else 0.0 + recall = tp / (tp + fn) if (tp + fn) else 0.0 + if precision + recall == 0: + f2 = 0.0 + else: + b2 = beta * beta + f2 = (1 + b2) * precision * recall / (b2 * precision + recall) + return EntityScore( + entity_type=entity, + support=tp + fn, + true_positives=tp, + false_positives=fp, + false_negatives=fn, + precision=precision, + recall=recall, + f2=f2, + ) + + +def _report(per_entity_counts): + """Build an EvaluationReport from {entity: (tp, fp, fn)}.""" + per_entity = { + entity: _score(entity, tp, fp, fn) + for entity, (tp, fp, fn) in per_entity_counts.items() + } + total_tp = sum(s.true_positives for s in per_entity.values()) + total_fp = sum(s.false_positives for s in per_entity.values()) + total_fn = sum(s.false_negatives for s in per_entity.values()) + precision = total_tp / (total_tp + total_fp) if (total_tp + total_fp) else 0.0 + recall = total_tp / (total_tp + total_fn) if (total_tp + total_fn) else 0.0 + f2 = 0.0 if precision + recall == 0 else 5 * precision * recall / ( + 4 * precision + recall + ) + return EvaluationReport( + per_entity=per_entity, + overall_precision=precision, + overall_recall=recall, + overall_f2=f2, + ) + + +class TestBaselineRoundTrip: + def test_save_and_load(self, tmp_path): + report = _report({"PERSON": (9, 1, 1), "EMAIL_ADDRESS": (5, 0, 0)}) + path = tmp_path / "baseline.json" + + save_baseline(report, config_name="test-config", path=path) + baseline = load_baseline(path) + + assert baseline["config"] == "test-config" + assert baseline["per_entity"]["PERSON"]["support"] == 10 + assert baseline["per_entity"]["EMAIL_ADDRESS"]["f2"] == 1.0 + assert baseline["overall"]["recall"] == round(report.overall_recall, 4) + + def test_report_matches_own_baseline(self): + report = _report({"PERSON": (9, 1, 1)}) + baseline = report_to_baseline(report, config_name="test") + + assert compare_to_baseline(report, baseline) == [] + + +class TestCompareToBaseline: + def test_detects_per_entity_regression(self): + good = _report({"PERSON": (10, 0, 0), "URL": (10, 0, 0)}) + baseline = report_to_baseline(good, config_name="test") + regressed = _report({"PERSON": (10, 0, 0), "URL": (5, 5, 5)}) + + regressions = compare_to_baseline(regressed, baseline) + + assert any("URL" in r for r in regressions) + assert not any(r.startswith("PERSON") for r in regressions) + + def test_detects_overall_regression(self): + good = _report({"PERSON": (10, 0, 0)}) + baseline = report_to_baseline(good, config_name="test") + regressed = _report({"PERSON": (7, 3, 3)}) + + regressions = compare_to_baseline(regressed, baseline) + + assert any(r.startswith("overall") for r in regressions) + + def test_drop_within_tolerance_is_not_a_regression(self): + good = _report({"PERSON": (100, 0, 0)}) + baseline = report_to_baseline(good, config_name="test") + slightly_worse = _report({"PERSON": (99, 0, 1)}) + + assert compare_to_baseline(slightly_worse, baseline, f2_tolerance=0.02) == [] + + def test_improvement_is_not_a_regression(self): + weak = _report({"PERSON": (5, 5, 5)}) + baseline = report_to_baseline(weak, config_name="test") + improved = _report({"PERSON": (10, 0, 0)}) + + assert compare_to_baseline(improved, baseline) == [] + + def test_entity_missing_from_baseline_is_skipped(self): + # A weak new entity affects the overall micro average, but must not + # produce a per-entity regression of its own. + baseline = report_to_baseline( + _report({"PERSON": (10, 0, 0)}), config_name="test" + ) + with_new_entity = _report({"PERSON": (10, 0, 0), "UK_NHS": (0, 0, 5)}) + + regressions = compare_to_baseline(with_new_entity, baseline) + + assert not any(r.startswith("UK_NHS") for r in regressions) + assert any(r.startswith("overall") for r in regressions) + + +class TestMarkdownWithBaseline: + def test_delta_column_present(self): + report = _report({"PERSON": (10, 0, 0)}) + baseline = report_to_baseline( + _report({"PERSON": (5, 5, 5)}), config_name="test" + ) + + markdown = report.to_markdown(baseline=baseline) + + assert "F2 Δ |" in markdown + assert "vs baseline" in markdown + + def test_new_entity_marked_as_new(self): + report = _report({"PERSON": (10, 0, 0), "UK_NHS": (3, 0, 0)}) + baseline = report_to_baseline( + _report({"PERSON": (10, 0, 0)}), config_name="test" + ) + + markdown = report.to_markdown(baseline=baseline) + + assert "| UK_NHS | 3 | 3 | 0 | 0 | 1.000 | 1.000 | 1.000 | new |" in markdown + + def test_no_delta_column_without_baseline(self): + report = _report({"PERSON": (10, 0, 0)}) + + markdown = report.to_markdown() + + assert "F2 Δ" not in markdown diff --git a/presidio-analyzer/tests/evaluation/test_evaluation_smoke.py b/presidio-analyzer/tests/evaluation/test_evaluation_smoke.py new file mode 100644 index 0000000000..8562beff40 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/test_evaluation_smoke.py @@ -0,0 +1,95 @@ +"""End-to-end smoke run of the presidio-evaluator pipeline. + +Skipped entirely when ``presidio-evaluator`` (the ``evaluation`` extra) is not +installed, so the general test matrix stays light. Floors are deliberately +loose: they catch a broken pipeline (no recognizers loaded, engine +misconfigured), not quality regressions. +""" + +import json + +import pytest + +pytest.importorskip("presidio_evaluator") + +from tests.evaluation.baseline import ( # noqa: E402 + default_baseline_path, + load_baseline, +) +from tests.evaluation.evaluation import ( # noqa: E402 + default_dataset_path, + run_evaluation, +) +from tests.evaluation.run_evaluation import main # noqa: E402 + + +@pytest.fixture(scope="module") +def entities(): + with open(default_dataset_path(), encoding="utf-8") as f: + return json.load(f)["entities"] + + +@pytest.fixture(scope="module") +def n_samples(): + with open(default_dataset_path(), encoding="utf-8") as f: + return len(json.load(f)["samples"]) + + +@pytest.fixture(scope="module") +def report(): + return run_evaluation() + + +def test_metrics_are_reported_for_all_entities(report, entities, n_samples): + assert set(report.per_entity) == set(entities) + assert report.n_samples == n_samples + + +def test_detection_is_not_catastrophically_broken(report): + assert report.overall_recall > 0.5, report.to_markdown() + assert report.overall_precision > 0.5, report.to_markdown() + + +def test_structured_recognizers_detect_simple_cases(report): + for entity in ("EMAIL_ADDRESS", "CREDIT_CARD", "IBAN_CODE", "US_SSN"): + assert report.per_entity[entity].recall > 0.5, report.to_markdown() + + +def test_committed_baseline_covers_dataset_entities(entities): + baseline = load_baseline(default_baseline_path()) + assert set(baseline["per_entity"]) == set(entities) + + +def test_cli_report_baseline_roundtrip_and_gating(tmp_path): + # One flow to avoid repeated engine loads: write a fresh baseline, verify + # self-comparison passes gating, then verify a doctored baseline trips + # --fail-on-regression. + baseline_path = tmp_path / "baseline.json" + assert main(["--write-baseline", str(baseline_path)]) == 0 + + report_path = tmp_path / "report.md" + exit_code = main( + [ + "--baseline", str(baseline_path), + "--output", str(report_path), + "--fail-on-regression", + ] + ) + assert exit_code == 0 + markdown = report_path.read_text(encoding="utf-8") + assert "## Analyzer evaluation report" in markdown + assert "F2 Δ |" in markdown + + baseline = json.loads(baseline_path.read_text(encoding="utf-8")) + baseline["overall"]["f2"] = 1.0 + doctored_path = tmp_path / "doctored.json" + doctored_path.write_text(json.dumps(baseline), encoding="utf-8") + + exit_code = main( + [ + "--baseline", str(doctored_path), + "--output", str(report_path), + "--fail-on-regression", + ] + ) + assert exit_code == 1 diff --git a/presidio-analyzer/tests/evaluation/test_golden_dataset.py b/presidio-analyzer/tests/evaluation/test_golden_dataset.py new file mode 100644 index 0000000000..36f92e4669 --- /dev/null +++ b/presidio-analyzer/tests/evaluation/test_golden_dataset.py @@ -0,0 +1,67 @@ +"""Integrity checks for the golden dataset. + +These are pure-Python (no ``presidio-evaluator`` needed) and always run. The +end-to-end smoke evaluation lives in ``test_evaluation_smoke.py``. +""" + +import json + +import pytest + +from tests.evaluation.evaluation import default_dataset_path +from tests.evaluation.generate_golden_en import build_dataset, dataset_to_json + + +@pytest.fixture(scope="module") +def raw_dataset(): + with open(default_dataset_path(), encoding="utf-8") as f: + return json.load(f) + + +class TestDatasetIntegrity: + def test_dataset_matches_generator(self): + # The JSON file is generated, never hand-edited; regenerate with + # `python -m tests.evaluation.generate_golden_en` after changing + # the sample definitions. + committed = default_dataset_path().read_text(encoding="utf-8") + assert committed == dataset_to_json(build_dataset()), ( + "datasets/golden_en.json is out of sync with " + "generate_golden_en.py; regenerate it with " + "`python -m tests.evaluation.generate_golden_en`" + ) + + def test_sample_ids_are_unique(self, raw_dataset): + ids = [sample["id"] for sample in raw_dataset["samples"]] + assert len(ids) == len(set(ids)) + + def test_spans_match_text_offsets(self, raw_dataset): + for sample in raw_dataset["samples"]: + text = sample["text"] + for span in sample["spans"]: + sliced = text[span["start"] : span["end"]] + assert sliced == span["entity_value"], ( + f"{sample['id']}: span [{span['start']}:{span['end']}] is " + f"{sliced!r}, expected {span['entity_value']!r}" + ) + + def test_span_entity_types_are_declared(self, raw_dataset): + declared = set(raw_dataset["entities"]) + for sample in raw_dataset["samples"]: + for span in sample["spans"]: + assert span["entity_type"] in declared, ( + f"{sample['id']}: {span['entity_type']} missing from " + f"the dataset's declared entity list" + ) + + def test_every_declared_entity_has_gold_spans(self, raw_dataset): + annotated = { + span["entity_type"] + for sample in raw_dataset["samples"] + for span in sample["spans"] + } + assert annotated == set(raw_dataset["entities"]) + + def test_negative_samples_have_no_spans(self, raw_dataset): + for sample in raw_dataset["samples"]: + if sample["category"] == "negative": + assert sample["spans"] == [] diff --git a/presidio-analyzer/uv.lock b/presidio-analyzer/uv.lock index 1462cc818f..14c6288988 100644 --- a/presidio-analyzer/uv.lock +++ b/presidio-analyzer/uv.lock @@ -2,17 +2,47 @@ version = 1 revision = 3 requires-python = ">=3.10, <3.15" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.11'", -] + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version < '3.11' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version < '3.11' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", +] +conflicts = [[ + { package = "presidio-analyzer", extra = "transformers" }, + { package = "presidio-analyzer", group = "evaluation" }, +], [ + { package = "presidio-analyzer", extra = "gliner" }, + { package = "presidio-analyzer", group = "evaluation" }, +]] [[package]] name = "absl-py" @@ -28,9 +58,9 @@ name = "accelerate" version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" } }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (extra != 'extra-17-presidio-analyzer-gliner' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra != 'extra-17-presidio-analyzer-gliner' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, @@ -58,12 +88,12 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "async-timeout", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "yarl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794, upload-time = "2026-06-07T21:09:35.529Z" } @@ -194,7 +224,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -224,9 +254,9 @@ name = "anyio" version = "4.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } wheels = [ @@ -332,8 +362,8 @@ name = "blis" version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d0/d0/d8cc8c9a4488a787e7fa430f6055e5bd1ddb22c340a751d9e901b82e2efe/blis-1.3.3.tar.gz", hash = "sha256:034d4560ff3cc43e8aa37e188451b0440e3261d989bb8a42ceee865607715ecd", size = 2644873, upload-time = "2025-11-17T12:28:30.511Z" } wheels = [ @@ -397,7 +427,7 @@ name = "cffi" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } wheels = [ @@ -622,7 +652,7 @@ name = "click" version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } wheels = [ @@ -634,7 +664,7 @@ name = "cloudpathlib" version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/19/58bc6b5d7d0f81c7209b05445af477e147c486552f96665a5912211839b9/cloudpathlib-0.24.0.tar.gz", hash = "sha256:c521a984e77b47e656fe78e20a7e3e260e0ab45fc69e33ac01094227c979e34a", size = 53600, upload-time = "2026-04-30T00:54:43.265Z" } wheels = [ @@ -667,7 +697,7 @@ name = "confection" version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ca/65/efd0fe8a936fc8ca2978cb7b82581fb20d901c6039e746a808f746b7647b/confection-1.3.3.tar.gz", hash = "sha256:f0f6810d567ff73993fe74d218ca5e1ffb6a44fb03f391257fc5d033546cbfaa", size = 54895, upload-time = "2026-03-24T18:45:24.331Z" } wheels = [ @@ -774,7 +804,7 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version <= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] [[package]] @@ -782,8 +812,8 @@ name = "cryptography" version = "49.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } wheels = [ @@ -839,21 +869,27 @@ name = "cuda-bindings" version = "13.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder" }, + { name = "cuda-pathfinder", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/a9/21/8464d133752951c154feafb3b65c297e7d80f301183d220bec4c830f1441/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:120fcc53d57903df529c3486962c56528cba5b7d6c57c99537320ed9922c8b86", size = 6073403, upload-time = "2026-05-29T23:11:36.22Z" }, { url = "https://files.pythonhosted.org/packages/a8/1f/5ef51f5fbaa5d4d3201bb3d7555af028ec1aa4416275ccbf73c9e34e3d2d/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9851b0caa8bfd3bc6fa054eaf57bea7c8e9c3a62db2d2621224677f49f3c53d0", size = 6675244, upload-time = "2026-05-29T23:11:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/fc/64/bb17e4d168569ef7be05c44474fe3dc19278d60a69ba228e45a431c86444/cuda_bindings-13.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:c0c4b1a995098c46695c24257a342dc97d6e6d3f3050b944c9f43bd26d734051", size = 5625597, upload-time = "2026-05-29T23:11:40.808Z" }, { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" }, { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" }, + { url = "https://files.pythonhosted.org/packages/93/f7/0e35987a21914f84068061dcf4b61466ccbce1c62ddc9727596d5ed0c26f/cuda_bindings-13.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:507b0e19e7f934c5e30f30f0244ad70a75812619a7d3a0d742543caae1bd50f1", size = 5664286, upload-time = "2026-05-29T23:11:47.719Z" }, { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/7c/95/872a0392122f1fb43fcb06869790ef3171f37beee9f7db8f441739113570/cuda_bindings-13.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:b134dd8c5c66ae4c4ad814f7aee88fd215353c077010cbc47e3b55ed35ec9eff", size = 5875099, upload-time = "2026-05-29T23:11:54.635Z" }, { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2f/6a0dd496550c6fafbf6aeb1bf40242eeabb2fd138a43892aabb4be8224c2/cuda_bindings-13.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:18c8c167c8907b8f02531ca810534315c458dabef31f7965095619bf647b9202", size = 5830027, upload-time = "2026-05-29T23:12:01.205Z" }, { url = "https://files.pythonhosted.org/packages/b1/81/bff68ce829999c1e4209c761bbf903b1c06ec570416ddb25020864ad5907/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ab2f74ed65bfef4163ba07a8db16f1085e0729291db12a2423aff84ee8278b8", size = 6013639, upload-time = "2026-05-29T23:12:03.509Z" }, { url = "https://files.pythonhosted.org/packages/d4/e0/c8a1f0c8f9ffdea4f5fe6dbab89b326cef4d85caf489dad39e209da89416/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd4c814d311ec08c981f6dded1dbe7d4b371067ee4f6c14cccec4bde9590f80", size = 6534419, upload-time = "2026-05-29T23:12:05.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/2734be44dbc80ac082ec23a86b41c8294992dcb90033645ed1bc50aafe4c/cuda_bindings-13.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:8de12ef60bf40756852cb62bbb40460609269f6ece522903d1cc93d73a3ececb", size = 5961055, upload-time = "2026-05-29T23:12:07.971Z" }, { url = "https://files.pythonhosted.org/packages/52/b8/83b1f563925b290f2d11a01a77a84013ba56052fe3653a5bef3ccfbb43d6/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c772dfff49681541d59630c90f858e173ac926b9c593a2b7123f2a1043cc76", size = 5809771, upload-time = "2026-05-29T23:12:10.422Z" }, { url = "https://files.pythonhosted.org/packages/12/20/e79b4bfe98f075195afb6343d41c498f9dbd2d161d7021d4d28bceb83581/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36febb7c1079d68a981dbbd8d5a67235b399802b82075c9388624719607e52b9", size = 6358584, upload-time = "2026-05-29T23:12:12.767Z" }, + { url = "https://files.pythonhosted.org/packages/27/2a/b59bcac016ab9985d6b48a5d05b0d698461a159ca03ee11c4abd54da2ac4/cuda_bindings-13.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61120b5e4f4a63f67efd7e7396914cb9ef871bb1f0021e990fb70277be240a4d", size = 6740329, upload-time = "2026-05-29T23:12:15.153Z" }, ] [[package]] @@ -874,43 +910,43 @@ wheels = [ [package.optional-dependencies] cublas = [ - { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cudart = [ - { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-runtime", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cufft = [ - { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cufft", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cufile = [ - { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "nvidia-cufile", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (sys_platform != 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cupti = [ - { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-cupti", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] curand = [ - { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-curand", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cusolver = [ - { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cusolver", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cusparse", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] cusparse = [ - { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusparse", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] nvjitlink = [ - { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] nvrtc = [ - { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] nvtx = [ - { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvtx", marker = "(python_full_version < '3.11' and platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'linux' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] [[package]] @@ -1024,13 +1060,25 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] +[[package]] +name = "faker" +version = "40.35.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/a1/79278f517de8437a51af4cbce9cb86b0085fc22554e7ebffc6cb43bcb957/faker-40.35.0.tar.gz", hash = "sha256:13495348ec6f80d22c8c1654906ffeae336d485fea476544642ea24b120d9e13", size = 2025535, upload-time = "2026-07-22T17:18:42.589Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/c4/d217ea24d07fbdb00c81c83325fc814ee72ed93c70978ea5d4150604c305/faker-40.35.0-py3-none-any.whl", hash = "sha256:804224bc4ea6644256dd2ef5c951563bea318cb19be3505461c9c424c90181ec", size = 2062734, upload-time = "2026-07-22T17:18:40.919Z" }, +] + [[package]] name = "filelock" version = "3.29.7" @@ -1200,13 +1248,15 @@ name = "gliner" version = "0.2.27" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub" }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "onnxruntime", version = "1.27.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "onnxruntime", version = "1.27.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "sentencepiece" }, { name = "torch" }, { name = "tqdm" }, - { name = "transformers" }, + { name = "transformers", version = "4.57.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "transformers", version = "5.6.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/37/c456f6be21a95ed2c635d00bd6049d99a3b31490129a2b19965b0a60ec58/gliner-0.2.27.tar.gz", hash = "sha256:071de0819d83c34468ede02f75a38f618bc0c69262582127dccf3bb787db4c0c", size = 225241, upload-time = "2026-06-15T14:38:38.422Z" } wheels = [ @@ -1442,21 +1492,70 @@ wheels = [ name = "huggingface-hub" version = "0.36.2" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "filelock", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "fsspec", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "hf-xet", marker = "(python_full_version < '3.11' and platform_machine == 'aarch64') or (python_full_version >= '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.11' and platform_machine == 'amd64') or (python_full_version >= '3.14' and platform_machine == 'amd64') or (python_full_version < '3.11' and platform_machine == 'arm64') or (python_full_version >= '3.14' and platform_machine == 'arm64') or (python_full_version < '3.11' and platform_machine == 'x86_64') or (python_full_version >= '3.14' and platform_machine == 'x86_64') or (platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'aarch64' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'amd64' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'arm64' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'x86_64' and extra == 'extra-17-presidio-analyzer-transformers') or (platform_machine == 'aarch64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'amd64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'arm64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "packaging", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pyyaml", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "requests", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tqdm", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, ] +[[package]] +name = "huggingface-hub" +version = "1.24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", +] +dependencies = [ + { name = "click", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "filelock", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "fsspec", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "hf-xet", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'AMD64' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'aarch64' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'amd64' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'arm64' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and platform_machine == 'AMD64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and platform_machine == 'aarch64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and platform_machine == 'amd64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and platform_machine == 'arm64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and platform_machine == 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'AMD64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'aarch64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'amd64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'arm64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (platform_machine == 'x86_64' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "httpx", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "packaging", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pyyaml", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tqdm", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "typing-extensions", marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/9b/d3bb4e7d792835daf34dd7091bbc7d7b4e0437d9388f1ea7239cce49f478/huggingface_hub-1.24.0.tar.gz", hash = "sha256:18431ff4daae0749aa9ba102fc952e314c98e1d30ebdec5319d85ca0a83e1ae5", size = 921848, upload-time = "2026-07-17T09:54:01.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/c3/aeaaf3911d2529614be18d1c8b5496afc185560e76568063d517283318af/huggingface_hub-1.24.0-py3-none-any.whl", hash = "sha256:6ed4120a84a6beec900640aa7e346bd766a6b7341e41526fef5dc8bd81fb7d59", size = 771904, upload-time = "2026-07-17T09:53:59.106Z" }, +] + [[package]] name = "humanfriendly" version = "10.0" @@ -1625,6 +1724,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/f7/18a1afcd64f35314b68c1f23afcd9994d0bc13e65cc77517afff4e83986d/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d613743df53199b1aa256a7d328340da6d7078aac7705a7db9d7a791e9cfd2", size = 343885, upload-time = "2026-06-29T13:05:12.087Z" }, ] +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + [[package]] name = "langextract" version = "1.6.0" @@ -1638,10 +1746,10 @@ dependencies = [ { name = "google-genai" }, { name = "ml-collections" }, { name = "more-itertools" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "pydantic" }, { name = "python-dotenv" }, { name = "pyyaml" }, @@ -1823,7 +1931,7 @@ name = "multidict" version = "6.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } wheels = [ @@ -2020,6 +2128,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/66/4fce8755f25d77324401886c00017c556be7ca3039575b94037aff905385/murmurhash-1.0.15-cp314-cp314t-win_arm64.whl", hash = "sha256:c22e56c6a0b70598a66e456de5272f76088bc623688da84ef403148a6d41851d", size = 26219, upload-time = "2025-11-14T09:51:03.563Z" }, ] +[[package]] +name = "narwhals" +version = "2.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/1d/58946e5aab18393e793bd4add6985b95d0e01c3a2d832f38f54468b10dcd/narwhals-2.24.0.tar.gz", hash = "sha256:b5c0f684ccd9d7475b564111e319a4964abcf2baf79d3cf6b1003d06ac9b828d", size = 661143, upload-time = "2026-07-13T10:49:19.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/85/a5bfaebfd305ac18b57b0854d74e37e586809061a91fda62f0bd50c8518e/narwhals-2.24.0-py3-none-any.whl", hash = "sha256:42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489", size = 461030, upload-time = "2026-07-13T10:49:17.571Z" }, +] + [[package]] name = "networkx" version = "3.4.2" @@ -2037,15 +2154,36 @@ name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", ] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ @@ -2131,15 +2269,36 @@ name = "numpy" version = "2.4.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", ] sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } wheels = [ @@ -2221,11 +2380,12 @@ name = "nvidia-cublas" version = "13.1.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cuda-nvrtc" }, + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/45/9e/2f562daf80eb8f7a685fb7bea4fda71f6048e4f359d6fdd1b6e70206cb2f/nvidia_cublas-13.1.1.3-py3-none-win_amd64.whl", hash = "sha256:b6cdce694e47ff6aadf0a69df1cab6628d696f5ff56e8d16af50309d855fa20f", size = 404358158, upload-time = "2026-04-08T18:47:26.987Z" }, ] [[package]] @@ -2235,6 +2395,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/b74b10025c1205695c5676373f2edd3e87a7202cc62ead0dfbc373b0f6ea/nvidia_cuda_cupti-13.0.85-py3-none-win_amd64.whl", hash = "sha256:683f58d301548deeefcb8f6fac1b8d907691b9d8b18eccab417f51e362102f00", size = 7736776, upload-time = "2025-09-04T08:38:08.38Z" }, ] [[package]] @@ -2244,6 +2405,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/4a/af/345fedb9f4c76c84ab4fa445b36bd4048a4d9db60e6bc76b4f913ff4b852/nvidia_cuda_nvrtc-13.0.88-py3-none-win_amd64.whl", hash = "sha256:6bcd4e7f8e205cbe644f5a98f2f799bef9556fefc89dd786e79a16312ce49872", size = 76807835, upload-time = "2025-09-04T08:39:15.274Z" }, ] [[package]] @@ -2253,6 +2415,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/b7/94/6b867483bec07da24ffa32736c79fabb94ef3a7af4d787a9d4a974868576/nvidia_cuda_runtime-13.0.96-py3-none-win_amd64.whl", hash = "sha256:f79298c8a098cec150a597c8eba58ecdab96e3bdc4b9bc4f9983635031740492", size = 2927037, upload-time = "2025-10-09T09:04:23.782Z" }, ] [[package]] @@ -2260,11 +2423,12 @@ name = "nvidia-cudnn-cu13" version = "9.20.0.48" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas" }, + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/78/39/21507455b1bca8b5702a9e9fc6ce73735f216f558dac2c9ede58e4d456b8/nvidia_cudnn_cu13-9.20.0.48-py3-none-win_amd64.whl", hash = "sha256:af8139732b99c0118be65ea5aac97f0d46018f8c552889e49d2fb0c6261a4a24", size = 350712614, upload-time = "2026-03-09T19:31:11.398Z" }, ] [[package]] @@ -2272,11 +2436,12 @@ name = "nvidia-cufft" version = "12.0.0.61" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, + { url = "https://files.pythonhosted.org/packages/85/b2/f8af21a2ed1beed337a6a02c5a28aeb85441f4d578ec3d529543c775ea4b/nvidia_cufft-12.0.0.61-py3-none-win_amd64.whl", hash = "sha256:2abce5b39d2f5ae12730fb7e5db6696533e36c26e2d3e8fd1750bdd2853364eb", size = 213342123, upload-time = "2025-09-04T08:40:51.145Z" }, ] [[package]] @@ -2295,6 +2460,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, + { url = "https://files.pythonhosted.org/packages/99/27/72103153b1ffc00e09fdc40ac970235343dcd1ea8bd762e84d2d73219ffa/nvidia_curand-10.4.0.35-py3-none-win_amd64.whl", hash = "sha256:65b1710aa6961d326b411e314b374290904c5ddf41dc3f766ebc3f1d7d4ca69f", size = 55242481, upload-time = "2025-08-04T10:30:41.831Z" }, ] [[package]] @@ -2302,13 +2468,14 @@ name = "nvidia-cusolver" version = "12.0.4.66" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas" }, - { name = "nvidia-cusparse" }, - { name = "nvidia-nvjitlink" }, + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cusparse", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, + { url = "https://files.pythonhosted.org/packages/99/ef/332a0101260ca78a1daef046bf0b06199e8ed4dac1d2aa698289c358169c/nvidia_cusolver-12.0.4.66-py3-none-win_amd64.whl", hash = "sha256:16515bd33a8e76bb54d024cfa068fa68d30e80fc34b9e1090813ea9362e0cb65", size = 193551444, upload-time = "2025-09-04T08:41:46.813Z" }, ] [[package]] @@ -2316,11 +2483,12 @@ name = "nvidia-cusparse" version = "12.6.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'emscripten' and extra != 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers') or (sys_platform == 'win32' and extra != 'group-17-presidio-analyzer-evaluation')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, + { url = "https://files.pythonhosted.org/packages/02/b0/b043d6f3480f102f885cf87fc3ffd3edcb5e23b855025a50e2ef4d059185/nvidia_cusparse-12.6.3.3-py3-none-win_amd64.whl", hash = "sha256:cbcf42feb737bd7ec15b4c0a63e62351886bd3f975027b8815d7f720a2b5ea79", size = 143783033, upload-time = "2025-09-04T08:42:12.391Z" }, ] [[package]] @@ -2330,6 +2498,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/31/83/f3647ce26916c94a6ca4ff1810623e2c405cff2dea6e78d29516b2514df9/nvidia_cusparselt_cu13-0.8.1-py3-none-win_amd64.whl", hash = "sha256:dccbd362f91a7b9024d1f55ee9f548ac065027ff15d8c8b0db889ab3a8f31215", size = 156885108, upload-time = "2025-09-05T18:51:35.958Z" }, ] [[package]] @@ -2348,6 +2517,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/f0/ee/580ca6f29dcab0221db8706badca1bbbb084f1975c4d4e83329c3a7e31f0/nvidia_nvjitlink-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:26a6de7fb4c8fdaa7703d3dad720d6d427ddfea5c48a528fd97c11733ad830e5", size = 40742423, upload-time = "2026-05-26T16:54:51.613Z" }, { url = "https://files.pythonhosted.org/packages/69/30/45414e35ff2eee7db3da037e5707037ccf9d2b5218ffbdb055ea4d5aa98a/nvidia_nvjitlink-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ce48b37dfeb3cb1eae4cf85adacb47d7a6539ea2272870c9a3628ce275c2037e", size = 39168635, upload-time = "2026-05-26T16:54:13.906Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/ec9c05a108095828dfc58840978c627b3c313fdf2a567c6de9ffbbb46901/nvidia_nvjitlink-13.3.33-py3-none-win_amd64.whl", hash = "sha256:4297ee49639b4f2e07255a1d69b3acc7ab2d011bb892b403e91ac98368962e3b", size = 37766359, upload-time = "2026-05-26T17:11:28.96Z" }, ] [[package]] @@ -2366,6 +2536,7 @@ source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/d2/50/0e2220f8620a177de994211186ffc5bfa9f2ce1e1282797f8f90096f9f88/nvidia_nvtx-13.0.85-py3-none-win_amd64.whl", hash = "sha256:d66ea44254dd3c6eacc300047af6e1288d2269dd072b417e0adffbf479e18519", size = 137066, upload-time = "2025-09-04T08:39:25.649Z" }, ] [[package]] @@ -2492,10 +2663,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "python-dateutil", marker = "python_full_version < '3.11'" }, - { name = "pytz", marker = "python_full_version < '3.11'" }, - { name = "tzdata", marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "python-dateutil", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pytz", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tzdata", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -2553,20 +2724,41 @@ name = "pandas" version = "3.0.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, - { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'emscripten' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (sys_platform == 'win32' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } wheels = [ @@ -2646,6 +2838,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, ] +[[package]] +name = "plotly" +version = "6.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "packaging", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/07/795c79dbce40c39bece88e69d049babbd23ffa95b5d117f248db8ea03abb/plotly-6.9.0.tar.gz", hash = "sha256:967ad33e8c704fed051800d11d985eb206a9c795c14206b30a6f463ed9c67d0d", size = 6919903, upload-time = "2026-07-09T14:55:59.982Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/18/d8544811ab076f876c4892b3714f5b0dad335e1dc33aef826df431b8325d/plotly-6.9.0-py3-none-any.whl", hash = "sha256:36bebe2f1bb13884774fe61689c329071446f6ce4a8927fb1f0d6fb24f581236", size = 9909646, upload-time = "2026-07-09T14:55:55.421Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -2737,8 +2942,8 @@ version = "2.2.363" source = { editable = "." } dependencies = [ { name = "click" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "phonenumbers" }, { name = "pydantic" }, { name = "pyyaml" }, @@ -2758,10 +2963,12 @@ azure-ai-language = [ ] gliner = [ { name = "gliner" }, - { name = "huggingface-hub" }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "onnxruntime", version = "1.27.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "transformers" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "onnxruntime", version = "1.27.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "transformers", version = "4.57.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "transformers", version = "5.6.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] langextract = [ { name = "azure-identity" }, @@ -2772,17 +2979,17 @@ langextract = [ ] server = [ { name = "flask" }, - { name = "gunicorn", marker = "sys_platform != 'win32'" }, - { name = "waitress", marker = "sys_platform == 'win32'" }, + { name = "gunicorn", marker = "sys_platform != 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "waitress", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] stanza = [ { name = "stanza" }, ] transformers = [ { name = "accelerate" }, - { name = "huggingface-hub" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" } }, { name = "spacy-huggingface-pipelines" }, - { name = "transformers" }, + { name = "transformers", version = "4.57.6", source = { registry = "https://pypi.org/simple" } }, ] [package.dev-dependencies] @@ -2796,6 +3003,9 @@ dev = [ { name = "python-dotenv" }, { name = "ruff" }, ] +evaluation = [ + { name = "presidio-evaluator", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] [package.metadata] requires-dist = [ @@ -2844,6 +3054,42 @@ dev = [ { name = "python-dotenv" }, { name = "ruff" }, ] +evaluation = [{ name = "presidio-evaluator", marker = "python_full_version >= '3.11' and python_full_version < '3.14'", specifier = ">=0.3,<0.4" }] + +[[package]] +name = "presidio-anonymizer" +version = "2.2.362" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/01/1c3404e8da63a979ae951b8822576bc0e52ca3a46a624ac9439786990c6d/presidio_anonymizer-2.2.362-py3-none-any.whl", hash = "sha256:b2d81542cb797360d18506a1aa73ea0dfacc44abca15248c81dd062f582e6b2b", size = 36603, upload-time = "2026-03-15T12:40:38.651Z" }, +] + +[[package]] +name = "presidio-evaluator" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faker", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "plotly", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "presidio-analyzer", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "presidio-anonymizer", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "python-dotenv", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "requests", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "scikit-learn", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "spacy", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "tqdm", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "transformers", version = "5.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "xmltodict", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/fb/321e2cdecd77d6662e2364fc4737496ed2879f3f4edbecba0b13eb3c1024/presidio_evaluator-0.3.tar.gz", hash = "sha256:f9e55e86ebc6f36c0f698e467761b3249b0006d10e586063a5c342ccef828a92", size = 2537356, upload-time = "2026-07-21T14:42:47.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/7b/f793dfa08ac21adb30599281dbc251280c6cb44328d7bf376eaf2b814d08/presidio_evaluator-0.3-py3-none-any.whl", hash = "sha256:ce774c5dd7567925b0913697471bae56fd6af73b45e39dd15d64a6db649eb51b", size = 693624, upload-time = "2026-07-21T14:42:45.12Z" }, +] [[package]] name = "propcache" @@ -3203,7 +3449,7 @@ name = "pyjwt" version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } wheels = [ @@ -3229,13 +3475,13 @@ name = "pytest" version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ @@ -3585,6 +3831,187 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/fc/7eedc3510d97878876e32774eebbeb61c43f148a96e915c84229a3e967aa/safetensors-0.8.0-cp310-abi3-win_arm64.whl", hash = "sha256:f7838e5135a406ad3e02efdcb8cf2e5397d368b0154537c4fec682dbc544d452", size = 340500, upload-time = "2026-06-09T07:52:26.745Z" }, ] +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "narwhals", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version == '3.11.*' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.12' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.12' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "threadpoolctl", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/be/e844fd9586e66540a15b71924d17a6cbc1bb749e81ddd0a796bcdba4c055/scikit_learn-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9db6f4d34e68c8899e4cab27fdf8eafe6ed21f2ba52ceb25ea250cd237f8e47b", size = 8789686, upload-time = "2026-06-02T11:53:05.439Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/ff880f62677a17d035817d543cb0fc8727d01eccbee81c5f7fc733a9d856/scikit_learn-1.9.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f401448645a3e7bc115aa3c094097865155b34bff1cba8101857d9104e99074c", size = 8256782, upload-time = "2026-06-02T11:53:08.904Z" }, + { url = "https://files.pythonhosted.org/packages/25/64/eb40435e1a508ab1b4e284ce43ae80f6a162e5be5e38ed5a6fab467a9ea4/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd3a8ef0c758555a3b23c03adaa858af32f7736785ded50ad5991f59c4ed03fa", size = 8992419, upload-time = "2026-06-02T11:53:11.551Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/4810a28e473185429e45a57eebcc91fc991b33d889cc0676063e671db03d/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7e254636164090da847715a27f8e5478feb98c40a9e0ee90cbd277de9e5ceb8", size = 9281411, upload-time = "2026-06-02T11:53:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/be3d369f40d8178ba3bd86635d132e08cb5329b023e4669d9426d84bc007/scikit_learn-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:5dc1818c77575d149e25fce9ef82dd7b7263ae372f03494158668ad632a69759", size = 8272736, upload-time = "2026-06-02T11:53:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/37/79/a733f02dc2118da7e77a134b34f39f40201a353311b011d20859d2db3556/scikit_learn-1.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:366652351f092b219c248f1e72821e841960a63d8f358f1dcfd54dc1cbdbbc28", size = 7919564, upload-time = "2026-06-02T11:53:21.2Z" }, + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/cf3310626b6d48d3e9be69a1223f9180360b5e6edb045f50fade723ce494/scikit_learn-1.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:80746d63bd4b6eaca54d36fe5feaf4d28bb38dc6f9470f81c7cad7c40155f119", size = 8705188, upload-time = "2026-06-02T11:53:41.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/04/5acd7ae280c5f93b6ac5ef6cdec14eef4c8d1cd91d85b3292989c94d96b1/scikit_learn-1.9.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5b934c45c252844a91d69fda3a34cff5e7307e1db10d77cb10a3980312c74713", size = 8228299, upload-time = "2026-06-02T11:53:44.817Z" }, + { url = "https://files.pythonhosted.org/packages/0c/39/ffe829a5b8ecb40a518724a997794657fdc354ada5e8fe8e64d998c0bac9/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:38c3dcb9a1ffb85505ec53d54c7b4aea0cff70050425a7760c2af661ac85df05", size = 8789690, upload-time = "2026-06-02T11:53:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/1f/88/8dab5de10c638c083772a6be83a3d8106ced492f74a928c8693638e5bb50/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da76d09304a4706db7cc1e3ebaa3b6b98a67365cc11d2996c4f1e58ba47df714", size = 9087723, upload-time = "2026-06-02T11:53:50.702Z" }, + { url = "https://files.pythonhosted.org/packages/20/3f/7917ca72464038f6240ec70c29f94862d08a34a74291ae4d4ec5eb8186a0/scikit_learn-1.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5808d98f15c6bf6d9d96d2348c1997392a5888ce7097e664105f930c4bca1277", size = 8184330, upload-time = "2026-06-02T11:53:53.396Z" }, + { url = "https://files.pythonhosted.org/packages/78/c7/15739eb2f61fda3c54639e9942414e5a19ad8a8d1f5a3266afad7cb7df80/scikit_learn-1.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:d77f54c017633791bc0225a43e2f8d03745fdcfe4880268fcc4df15f505dec2e", size = 7840653, upload-time = "2026-06-02T11:53:56.035Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/c9a35cf59b20a86fec24d306f1547b78dec194b08d367ce2a3e4854169d9/scikit_learn-1.9.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9656acd4e93f74e0b66c8a36c88830a99252dfa900044d36bc2212ae89a47162", size = 8713289, upload-time = "2026-06-02T11:53:58.788Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a7/552a7821597c632b907f7bfe8f36f9f572777af8ef8a48353041cf8e091a/scikit_learn-1.9.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:24360002ae845e7866522b0a5bbf690802e7bc388cac8663502e78aa98598aa2", size = 8245141, upload-time = "2026-06-02T11:54:01.694Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/f4a0c4fe9711154cddabf913471153af79056382ddc612cfe5ee0ff4b72e/scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5162ad10a418c8a282dde04c9aa06965de3e9a65f33c1440c0ae69bb1a09d913", size = 8847671, upload-time = "2026-06-02T11:54:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/f0/af/4d72d9e475ac83719160c662619e4bf7b95c19507cd582e7d0167a3c3dae/scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fea2cc5677ab49d6f5bade978c866da44957b712d92e9635e8b4f723013c3cb", size = 9118104, upload-time = "2026-06-02T11:54:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d5/6a58eea2cb9abbb9b3f2bb8b2cfb3243d1152d69f442d256c7af71304769/scikit_learn-1.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:64fa347efc1c839c487433e40c5144d38c336e8a2b59c81aa8660373945c2673", size = 8290674, upload-time = "2026-06-02T11:54:10.087Z" }, + { url = "https://files.pythonhosted.org/packages/65/5b/d4c879cf358f1187141cf90ced473f087183489090244f50c124a2ee478b/scikit_learn-1.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:1b944b6db288f6b926e3650026ddafb988929de95d11fc2cc5fa117773c9ba42", size = 7978807, upload-time = "2026-06-02T11:54:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/8a/43/bfae3121ec67ae09150d453c442c7c1cc166e9aefe056e6ab3b7728a5cfc/scikit_learn-1.9.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4ccacf04ca5f4b492158a5f28afe0ace43f81b2571e4b9a66d34848b46128949", size = 9031941, upload-time = "2026-06-02T11:54:15.436Z" }, + { url = "https://files.pythonhosted.org/packages/75/b0/20a4546eb17f3b25d3c66df15810411c14ed5065bcfab50b53c96fb627b2/scikit_learn-1.9.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ee1a8db2c18c08e34c7412d4b10be1cac214cd4ea7dc9715a6a327eb49a37c96", size = 8613528, upload-time = "2026-06-02T11:54:18.842Z" }, + { url = "https://files.pythonhosted.org/packages/18/3c/e440e039bb82cd19004edaaad00acbde0fb9b461083c3ecf37941c557312/scikit_learn-1.9.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:147e9329ef0e39f75d4cffa02b2aa48d827832684926cd5210d9a2cb5c57246b", size = 8855050, upload-time = "2026-06-02T11:54:21.699Z" }, + { url = "https://files.pythonhosted.org/packages/43/26/b341b8dab5998da6270a3a42c2152c578501354d36f944b5856757035ef8/scikit_learn-1.9.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bad8f8b9950321b54c965fdcbac6c6c55e79e16646b49977bcf3668d3870a1a", size = 9097190, upload-time = "2026-06-02T11:54:24.454Z" }, + { url = "https://files.pythonhosted.org/packages/fb/de/b650b4d69b84468cfa2e28a3ff7b8103743029e6446ce1a97fe060ef688c/scikit_learn-1.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:78fc56eafd4edb9575d2d8950d1dd152061abb573341a1cb7e099fc40f6c6666", size = 8963204, upload-time = "2026-06-02T11:54:27.428Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f3/ff83d76d7418112e5a61326443cdda87be3545dd8d6599c95b2481a4419e/scikit_learn-1.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:051075bda8b7aab87b1906ab3d4740a1e1224a19d7b3781a576736edc94e76aa", size = 8222661, upload-time = "2026-06-02T11:54:30.192Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' and python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, + { url = "https://files.pythonhosted.org/packages/05/52/9c0136c2de7ae0779b7b366447766cec6d9f0702c56bb8ffeb04c8fd3af4/scipy-1.18.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:09143f676d157d9f546d663504ef9c1becb819824f1afc018814176411942446", size = 31036107, upload-time = "2026-06-19T15:00:14.03Z" }, + { url = "https://files.pythonhosted.org/packages/02/73/0291a64843270f4efb86cdcf2ee0f2048631b65ec6b405398b2b4dbf11bf/scipy-1.18.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5efe260f69417b97ddae455bfb5a95e8359f7f66ad7fa9522a60feb66f169520", size = 28663303, upload-time = "2026-06-19T15:00:16.819Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0f/10ffa0b697a572f4e0d48b92a88895d366422f019f723e7e14a84c050dac/scipy-1.18.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:68363b7eaacd8b5dd426df56d782cc156468ac79a127a1b87ca597d6e2e82197", size = 20404960, upload-time = "2026-06-19T15:00:19.635Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d2/e896cea21ba8edd6c81d4c55b1ffcc717e79698dcbebf9641b4cfb4c6622/scipy-1.18.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:c5557d8be5da8e41353fcd4d21491fdbab83b062fc579e94dc09a7c8ab4f669b", size = 23034074, upload-time = "2026-06-19T15:00:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b2/e83ea34279a52c03374477c74006256ec78df65fc877baa4617d6de1d202/scipy-1.18.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d13bca67c096d89fb95ced0d8921807300fce0275643aef9533cc63a0773468", size = 33942038, upload-time = "2026-06-19T15:00:24.964Z" }, + { url = "https://files.pythonhosted.org/packages/f6/af/e8fe5fb136f51e2b01678b92cb4106d10d8cd68ec147ead2e7cb0ac75398/scipy-1.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a46f9273dbd0eb1cefba61c9b8648b4dfe3cbc14a080176f9a73e44b8336dc7f", size = 35266390, upload-time = "2026-06-19T15:00:28.059Z" }, + { url = "https://files.pythonhosted.org/packages/3a/49/2c5cbb907b56695fc67517811d1db234dfd83381a84814ec220aded2794d/scipy-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5aba46108853ddfc77906b6557aac839d2b52e900c1d72a1180adaaab58d265f", size = 35551324, upload-time = "2026-06-19T15:00:31.014Z" }, + { url = "https://files.pythonhosted.org/packages/bb/73/eda39f7a2d306ff0ffc574afd13c0bbb6d10a603d9a413998ee269487a80/scipy-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b6f758e35f12757b5d95c00bc6de2438e229c2664b7a92e96f205959d9f2dfa4", size = 37404785, upload-time = "2026-06-19T15:00:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d2/ae881ee28d014f38e0ccbfd974a06a919ba9af34f1f74bf42b5301891d63/scipy-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1afac4a847207c7ff8efd321734a50b06d0280b3b2a2c0fc2f413101747ad7c7", size = 36554943, upload-time = "2026-06-19T15:00:36.903Z" }, + { url = "https://files.pythonhosted.org/packages/70/3a/21154e2d54eb3639c6bf4dbae2e531c68356bfe95990daa30df33b30d556/scipy-1.18.0-cp313-cp313-win_arm64.whl", hash = "sha256:c5dbddf60e58c2312316d097271a8e73d40eaf2eabfa4d95ed7d3695bbf2ce7b", size = 24350911, upload-time = "2026-06-19T15:00:40.062Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/915a19b3de2f7430062b509653563db1633ddbb6f021b06731521115d4e2/scipy-1.18.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4c256ee70c0d1a8a2ace807e199ccd4e3f57037433842abb3fb36bc17eaa9578", size = 31036253, upload-time = "2026-06-19T15:00:43.216Z" }, + { url = "https://files.pythonhosted.org/packages/d7/88/b72def7262e150d16be13fca37a96481138d624e700340bc3362a7588929/scipy-1.18.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:2ef3abc54a4ffc53765374b0d5728532dfdd2585ed23f6b11c206a1f0b1b9af8", size = 28673758, upload-time = "2026-06-19T15:00:46.663Z" }, + { url = "https://files.pythonhosted.org/packages/91/02/2e636a61a525632c373cf6a9c24442a3ffb79e364d38e98b32042964ac32/scipy-1.18.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2a6af57bd9e4a75d70e4117e78a1bbee84f79ae3fbb6d0111005d6ebcc4cb8d", size = 20415514, upload-time = "2026-06-19T15:00:49.399Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b6/2135974442f6aba159d9d39d774a1c8cb19947016725d69fecc685df45bf/scipy-1.18.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:3f1ac564d3bf6c03d861d2cd87a1bea0da2887136f7fb1bf519c05a8971452d6", size = 23034398, upload-time = "2026-06-19T15:00:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/f6/e6/ba89ec5abf6ee9257c0d1ec985573f3ae32742c24bc03e016388a40b1b15/scipy-1.18.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40395a5fcd1abee49a5c7aaa98c29db393eedc835138560a588c47ec16156690", size = 33998032, upload-time = "2026-06-19T15:00:54.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/c4/bc41eb19b0fd0db868f4132920879019318d80cc522ad8f2bca4611af808/scipy-1.18.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ca01e8ae69f1b18e9a58d91afead31be3cef0dd905a10249dac559ee15460a0", size = 35283333, upload-time = "2026-06-19T15:00:58.152Z" }, + { url = "https://files.pythonhosted.org/packages/53/a4/cbdeef6eb3830a8462a9d4ada814de5fc984345cc9ecf17cbec51a036f1e/scipy-1.18.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7a7f3b01647384dbc3a711e8c6778e0aabbe93959249fef5c7393396bcac0867", size = 35610216, upload-time = "2026-06-19T15:01:01.155Z" }, + { url = "https://files.pythonhosted.org/packages/80/4d/b2b82502b65f661d1b789c1665dcdf315d5f12194e06fc0b37946294ebae/scipy-1.18.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6aa94e78ec192a30063a5e72e561c28af769dc311190b24fe91774eff1969709", size = 37418960, upload-time = "2026-06-19T15:01:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/902d836831474b0ab5a37d16404f7bc5fafd9efba632890e271ba952635f/scipy-1.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:2d8bbdc6c817f5b4006a54d799d4f5bab6f910193cbb9a1ff310833d4d270f61", size = 37288845, upload-time = "2026-06-19T15:01:07.822Z" }, + { url = "https://files.pythonhosted.org/packages/b6/43/8d73b337a3bdb14daa0314f0434210747c02d79d729ce1777574a817dcf6/scipy-1.18.0-cp314-cp314-win_arm64.whl", hash = "sha256:18e9575f1569b2c54174e6159d32942e03731177f63dce7975f0a0c88d102f5b", size = 24988971, upload-time = "2026-06-19T15:01:11.076Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b4/f11918b0508a2787031a0499a03fbe3546f3bb5ca05d01038c45b278c09a/scipy-1.18.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f351e0dd702687d12a402b867a1b4146a256923e1c38317cbc472f6372b94707", size = 31399325, upload-time = "2026-06-19T15:01:13.723Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d1/1f287b57c0ff0ee5185dff3946d92c8017d39b0e431f0ae79a3ff1859512/scipy-1.18.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7c7a51b33ce387193c97f228320cf8e87361daa1bba750638677729598b3e677", size = 29092110, upload-time = "2026-06-19T15:01:16.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1a/7b74eb6c392fdcb27d414c0e7558a6d0231eb3b6d73571f479bb81ea8794/scipy-1.18.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:84031d7b052a54fae2f8632e0ec802073d385476eb9a63079bce6e23ef9283d4", size = 20833811, upload-time = "2026-06-19T15:01:20.488Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ad/f3941716320a7b9cb4d68734a903b45fe16eff5fb7da7e16f2e619304979/scipy-1.18.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:56abf29a7c067dde59be8b9a22d606a4ea1b2f2a4b756d9d903c62818f5dacce", size = 23396644, upload-time = "2026-06-19T15:01:23.364Z" }, + { url = "https://files.pythonhosted.org/packages/22/22/1446b62ffe07f9719b7d9b1b6a4e05a772833ae8f441fe4c22c34c9b250f/scipy-1.18.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ad44305cfa24b1ba5803cbbebf033590ccbac1aa5d612d727b785325ab408b0", size = 34079318, upload-time = "2026-06-19T15:01:26.002Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/b87da667098bb470fa30c7011b0ba351ee976dd395c78798c66e941665a3/scipy-1.18.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:945c1761b93f38d7f99ae81ae80c63e621471608c7eeead563f6df025585cd58", size = 35324320, upload-time = "2026-06-19T15:01:28.881Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a1/c7932f91909759b0267f75fdea34e91309f96b895757534b76a90b6b4344/scipy-1.18.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a4441f15d620578772a49e5ab48c0ee1f7a0220e387110283062729136b2553", size = 35699541, upload-time = "2026-06-19T15:01:31.968Z" }, + { url = "https://files.pythonhosted.org/packages/f7/86/5185061a1fcc41d18c5dc2463969b3a3964b31d9ac67b2fb05d4c7ff7670/scipy-1.18.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9aac6192fac56bf2ca534389d24623f07b39ff83317d58287285e7fbd622ff76", size = 37472480, upload-time = "2026-06-19T15:01:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/31/8e/f04c68e39919a010d34f2ee1367fd705b0a25a02f609d755f0bfbc0a15fc/scipy-1.18.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e40baea28ae7f5475c779741e2d90b1247c78531207b49c7030e698ff81cee3f", size = 37365390, upload-time = "2026-06-19T15:01:38.091Z" }, + { url = "https://files.pythonhosted.org/packages/d5/19/969dc072906c84dd0a3b05dcf57ea750936087d7873549e408b35cfc3f97/scipy-1.18.0-cp314-cp314t-win_arm64.whl", hash = "sha256:368e0a705903c466aa5f08eefb39e6b1b6b2d659e7352a31fd9e2438365be0f8", size = 25279661, upload-time = "2026-06-19T15:01:40.817Z" }, +] + [[package]] name = "sentencepiece" version = "0.2.2" @@ -3700,8 +4127,8 @@ dependencies = [ { name = "cymem" }, { name = "jinja2" }, { name = "murmurhash" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "packaging" }, { name = "preshed" }, { name = "pydantic" }, @@ -3766,7 +4193,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "spacy" }, { name = "torch" }, - { name = "transformers" }, + { name = "transformers", version = "4.57.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/ca/07667af54b4efb3ee204db6db6ba9a3e7d7baf59219e5c86f7888121be06/spacy_huggingface_pipelines-0.0.4.tar.gz", hash = "sha256:35b409ed7d20c5b36d788912570e3444ec1b0c344255e847bf722b3286279e95", size = 11685, upload-time = "2023-06-02T18:18:03.859Z" } wheels = [ @@ -3856,15 +4283,16 @@ version = "1.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "emoji" }, - { name = "huggingface-hub" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or python_full_version >= '3.14' or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "platformdirs" }, { name = "protobuf" }, { name = "requests" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "torch" }, { name = "tqdm" }, { name = "udtools" }, @@ -3914,8 +4342,8 @@ dependencies = [ { name = "confection" }, { name = "cymem" }, { name = "murmurhash" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "packaging" }, { name = "preshed" }, { name = "pydantic" }, @@ -3966,6 +4394,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/ef/1648fda54e9689058335ff54f650a7a314db2a42e21af1b83949b2dc748e/thinc-8.3.13-cp314-cp314-win_arm64.whl", hash = "sha256:11754fada9ad5ba2e02d5f3f234f940e24015b82333db58372f4a6aedad9b43f", size = 1667687, upload-time = "2026-03-23T07:22:34.967Z" }, ] +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + [[package]] name = "tldextract" version = "5.3.1" @@ -3986,7 +4423,8 @@ name = "tokenizers" version = "0.22.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } wheels = [ @@ -4070,20 +4508,20 @@ name = "torch" version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, - { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "cuda-bindings", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, - { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "setuptools" }, { name = "sympy" }, - { name = "triton", marker = "sys_platform == 'linux'" }, + { name = "triton", marker = "sys_platform == 'linux' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "typing-extensions" }, ] wheels = [ @@ -4118,7 +4556,7 @@ name = "tqdm" version = "4.68.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/5f/57ff8b434839e70dab45601284ea413e947a63799891b7553e5960a793a8/tqdm-4.68.4.tar.gz", hash = "sha256:19829c9673638f2a0b8617da4cdcb927e831cd88bcfcb6e78d42a4d1af131520", size = 792418, upload-time = "2026-07-07T09:58:18.369Z" } wheels = [ @@ -4129,24 +4567,95 @@ wheels = [ name = "transformers" version = "4.57.6" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11'", +] dependencies = [ - { name = "filelock" }, - { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "requests" }, - { name = "safetensors" }, - { name = "tokenizers" }, - { name = "tqdm" }, + { name = "filelock", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "huggingface-hub", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-transformers') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-gliner' and extra != 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "packaging", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "pyyaml", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "regex", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "requests", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "safetensors", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tokenizers", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, + { name = "tqdm", marker = "(python_full_version < '3.11' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version < '3.11' and extra != 'group-17-presidio-analyzer-evaluation') or (python_full_version >= '3.14' and extra == 'extra-17-presidio-analyzer-gliner') or (python_full_version >= '3.14' and extra != 'group-17-presidio-analyzer-evaluation') or extra == 'extra-17-presidio-analyzer-transformers' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c4/35/67252acc1b929dc88b6602e8c4a982e64f31e733b804c14bc24b47da35e6/transformers-4.57.6.tar.gz", hash = "sha256:55e44126ece9dc0a291521b7e5492b572e6ef2766338a610b9ab5afbb70689d3", size = 10134912, upload-time = "2026-01-16T10:38:39.284Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/03/b8/e484ef633af3887baeeb4b6ad12743363af7cce68ae51e938e00aaa0529d/transformers-4.57.6-py3-none-any.whl", hash = "sha256:4c9e9de11333ddfe5114bc872c9f370509198acf0b87a832a0ab9458e2bd0550", size = 11993498, upload-time = "2026-01-16T10:38:31.289Z" }, ] +[[package]] +name = "transformers" +version = "5.6.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "packaging", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "pyyaml", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "regex", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "safetensors", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "tokenizers", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "tqdm", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, + { name = "typer", marker = "python_full_version >= '3.11' and python_full_version < '3.14' and extra != 'extra-17-presidio-analyzer-transformers'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a4/e9/c6c80a07690142a7d05444271f47b9f3c8aac7dea01d52e1137ee480ad78/transformers-5.6.2.tar.gz", hash = "sha256:e657134c3e5a6bc00a3c35f4e2674bb51adfcd89898495b788a18552bac2b91a", size = 8311867, upload-time = "2026-04-23T18:33:29.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/95/0b0218149b0d6f14df35f5b8f676fa83df4f19ed253c3cc447107ef86eca/transformers-5.6.2-py3-none-any.whl", hash = "sha256:f8d3a1bb96778fed9b8aabfd0dd6e19843e4b0f2bb6b59f32b8a92051b0f348f", size = 10364898, upload-time = "2026-04-23T18:33:26.081Z" }, +] + +[[package]] +name = "transformers" +version = "5.14.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "huggingface-hub", version = "1.24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "packaging", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "pyyaml", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "regex", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "safetensors", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "tokenizers", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "tqdm", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "typer", marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/fb/2a2ba88f325e68a921d8b69ff63b477830b2e73ade9a3c8c8cab2f06d741/transformers-5.14.1.tar.gz", hash = "sha256:60d196c27781eacf8637e2b533f517582907ad6f9ae142046d6b69431a5b2173", size = 9295927, upload-time = "2026-07-16T09:41:57.773Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/67/8d85ca2323233ae3c0365a659c4e52ee1f587b440e4bc577e7d8e4416d0f/transformers-5.14.1-py3-none-any.whl", hash = "sha256:9db974c4079ede2d1a3ea7ca5a240df33f2cc26fc2b36ba64c5f2a4f43b6e725", size = 11625234, upload-time = "2026-07-16T09:41:54.143Z" }, +] + [[package]] name = "triton" version = "3.7.1" @@ -4172,7 +4681,7 @@ version = "0.26.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, { name = "rich" }, { name = "shellingham" }, ] @@ -4255,7 +4764,7 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, { name = "python-discovery" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/d9/b477fddb68840b570af8b22afe9b035cbc277b5fb7b33dea390617a8b10f/virtualenv-21.6.1.tar.gz", hash = "sha256:15f978b7cd329f24855ff4a0c4b4899cc7678589f49adbdcbbb4d3232e641128", size = 5526620, upload-time = "2026-07-10T19:33:53.312Z" } wheels = [ @@ -4276,7 +4785,7 @@ name = "wasabi" version = "1.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-presidio-analyzer-gliner' and extra == 'group-17-presidio-analyzer-evaluation') or (extra == 'extra-17-presidio-analyzer-transformers' and extra == 'group-17-presidio-analyzer-evaluation')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/f9/054e6e2f1071e963b5e746b48d1e3727470b2a490834d18ad92364929db3/wasabi-1.1.3.tar.gz", hash = "sha256:4bb3008f003809db0c3e28b4daf20906ea871a2bb43f9914197d540f4f2e0878", size = 30391, upload-time = "2024-05-31T16:56:18.99Z" } wheels = [ @@ -4517,6 +5026,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/d2/6317eb6d4554855bbf12d61857774af34747bf88a42c19bf306de67e2fa3/wrapt-2.2.2-py3-none-any.whl", hash = "sha256:5bad217350f19ce99ca5b5e71d406765ea86fe541628426772b657375ee1c048", size = 61460, upload-time = "2026-06-20T23:49:42.966Z" }, ] +[[package]] +name = "xmltodict" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/70/80f3b7c10d2630aa66414bf23d210386700aa390547278c789afa994fd7e/xmltodict-1.0.4.tar.gz", hash = "sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61", size = 26124, upload-time = "2026-02-22T02:21:22.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/34/98a2f52245f4d47be93b580dae5f9861ef58977d73a79eb47c58f1ad1f3a/xmltodict-1.0.4-py3-none-any.whl", hash = "sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a", size = 13580, upload-time = "2026-02-22T02:21:21.039Z" }, +] + [[package]] name = "yarl" version = "1.24.2"