diff --git a/docs/deweloper/ai-search.md b/docs/deweloper/ai-search.md new file mode 100644 index 000000000..931de7b14 --- /dev/null +++ b/docs/deweloper/ai-search.md @@ -0,0 +1,180 @@ +# Wyszukiwanie przez AI (`ai_search`) + +Formularz „zapytaj po polsku" (`ai_search.views.ZapytanieAIView`) tłumaczy +pytanie w języku naturalnym (PL) na zapytanie [DjangoQL](https://github.com/ivelum/djangoql) +przy pomocy modelu Anthropic Claude, a następnie przekierowuje do +istniejącego edytora zapytań (`bpp:zapytanie`) z gotowym DSL-em. Aplikacja +loguje każde zapytanie wraz z kosztem w `ai_search.models.AISearchQuery` +(admin: read-only, `/admin/ai_search/aisearchquery/`). + +## Zmienne środowiskowe + +| Zmienna | Domyślna | Znaczenie | +|---|---|---| +| `BPP_AI_SEARCH_ENABLED` | `False` | Włącza feature (link w menu + działający formularz). Gdy wyłączone **lub** brak poświadczeń aktywnego backendu, personel z dostępem do edytora zapytań widzi ekran instrukcji konfiguracji (zamiast 404), a pozycja w menu ma dopisek „(konfiguracja)". Niezalogowani/bez uprawnień: bez zmian (niewidoczne). | +| `ANTHROPIC_API_KEY` | — | Klucz API Anthropic. Alternatywa dla `BPP_AI_API_KEY` (to drugie ma pierwszeństwo); SDK `anthropic` czyta `ANTHROPIC_API_KEY` ze środowiska jako fallback. | +| `BPP_AI_BACKEND` | `anthropic` | `anthropic` (natywny SDK, płatny, budżet PLN) albo `openai` (lokalny/self-hosted serwer OpenAI-compatible — darmowy, budżet nieaktywny). Patrz [„Modele lokalne"](#modele-lokalne) niżej. | +| `BPP_AI_BASE_URL` | `""` | Tylko dla `BPP_AI_BACKEND=openai` — adres API zgodny z OpenAI (np. `http://localhost:11434/v1` dla Ollama). | +| `BPP_AI_API_KEY` | `""` | Klucz API. Dla `openai` — klucz lokalnego serwera (pusty dla serwerów bez auth, np. Ollama). Dla `anthropic` — jednolita alternatywa dla `ANTHROPIC_API_KEY` (jeśli ustawione, ma pierwszeństwo). | +| `BPP_AI_MODEL` | `claude-sonnet-5` | Model używany do tłumaczenia NL->DSL. Dla `anthropic` musi mieć wpis w `BPP_AI_PRICING` (cennik) w `settings/base.py`; dla `openai` to nazwa modelu na lokalnym serwerze (np. `qwen3:8b`). | +| `BPP_AI_DAILY_BUDGET_PLN` / `BPP_AI_MONTHLY_BUDGET_PLN` | `20` / `300` | Twarde limity kosztu (PLN); po przekroczeniu `ai_search.budget.check_budget()` blokuje kolejne zapytania (widok zwraca 200 z komunikatem, nic nie loguje). | +| `BPP_AI_MAX_RETRIES` | `1` | Ile razy `translator.translate` ponawia zapytanie do modelu po błędzie składni DjangoQL (z konkretnym komunikatem błędu, linia/kolumna). | +| `BPP_AI_LLM_TIMEOUT` | `30` | Timeout (s) klienta `anthropic.Anthropic`. | +| `BPP_AI_SCHEMA_CACHE_TTL` | `86400` | TTL (s) cache'a compact-schematu (`ai_search.schema_export`) wysyłanego jako część system prompta. | +| `BPP_AI_FX_CACHE_TTL` | `86400` | TTL (s) cache'a kursu USD->PLN (NBP). | +| `BPP_AI_FX_FALLBACK` | `4.5` | Kurs awaryjny, gdy NBP i cache/Redis zawiodą (patrz też `ai_search.models.FxRate` — trwały fallback ostatniego znanego kursu). | +| `BPP_AI_MAX_FK_OPTIONS` | `100` | Powyżej tego progu `describe_schema_for_llm` nie wypisuje pojedynczych wartości `suggest_options` dla pola FK/wyboru (schemat rośnie liniowo z liczbą opcji). | + +## Dane wysyłane do Anthropic + +Do modelu trafia (jako część system prompta, patrz `ai_search.prompts` + +`ai_search.schema_export`): + +- **treść pytania użytkownika** (pole `pytanie`), +- **compact schema** modelu „rekord" lub „autor" — nazwy pól, typy, oraz + **`suggested_values`/`suggest_options` — realne wartości z bazy** + (np. lista źródeł, dyscyplin, jednostek) dla pól słownikowych, ograniczona + przez `BPP_AI_MAX_FK_OPTIONS`. To są **dane z produkcyjnej bazy BPP**, nie + dane osobowe pracowników/autorów per se, ale przy konfiguracji progu warto + pamiętać, że treść trafia do zewnętrznego API (Anthropic). + +Schemat jest cache'owany (`django.core.cache`, klucz +`ai_search:schema:`) i odświeżany: + +- automatycznie po wygaśnięciu TTL (`BPP_AI_SCHEMA_CACHE_TTL`), +- raz na dobę przez Celery beat (`ai_search.tasks.regenerate_schemas`, + wpis `ai-search-regenerate-schemas` w `CELERYBEAT_SCHEDULE`, + `src/django_bpp/settings/base.py`, 3:45 w nocy) — żeby nowe wartości + słownikowe (nowe źródła, dyscypliny itd.) pojawiły się w schemacie bez + czekania na wygaśnięcie cache. + +## Jak zmierzyć rozmiar / podejrzeć treść schematu + +```bash +# Wypisz aktualny (cache'owany, budowany w razie braku) schemat na stdout: +uv run python src/manage.py ai_search_schema_dump rekord +uv run python src/manage.py ai_search_schema_dump autor + +# Wymuś regenerację (pomija cache) i zmierz rozmiar w znakach: +uv run python src/manage.py ai_search_schema_dump rekord --regenerate | wc -c +``` + +Polecenie drukuje też liczbę znaków na stderr (`# rekord: 1234 znaków`) — +przydatne przy dostrajaniu `BPP_AI_MAX_FK_OPTIONS`, żeby schemat (a więc i +koszt tokenów input) nie rósł niekontrolowanie wraz z bazą. + +## Koszty + +`ai_search.pricing.cost_usd_from_usage` liczy koszt (USD) na podstawie +`usage` zwróconego przez SDK (`input_tokens`, `output_tokens`, +`cache_read_tokens`, `cache_write_tokens`) i cennika `BPP_AI_PRICING` w +`settings/base.py` (per model, z opcjonalnym intro-pricingiem do daty). +Nieznany model w cenniku podnosi `KeyError` — widok łapie ten wyjątek, +zgłasza do Rollbar i loguje wpis z `cost_usd=0`/`cost_pln=0` zamiast cichego +zera bez śladu w monitoringu. + +To dotyczy wyłącznie backendu `anthropic` — dla `BPP_AI_BACKEND=openai` +(model lokalny) widok w ogóle pomija pre-check budżetu i cennik/FX; koszt +jest zawsze logowany jako `0` (patrz sekcja niżej). + +## Modele lokalne + +### Backendy + +`ai_search.backends.get_backend()` wybiera implementację wg +`settings.BPP_AI_BACKEND`: + +- **`anthropic`** (domyślny) — natywny SDK `anthropic`, `messages.parse` + z ustrukturyzowanym `output_format`, prompt caching (blok `system` z + `cache_control: ephemeral`) i pełny cennik/budżet PLN + (`ai_search.budget`, `ai_search.pricing`, `ai_search.fx`). +- **`openai`** — dowolny lokalny/self-hosted serwer zgodny z OpenAI Chat + Completions API: [Ollama](https://ollama.com/), + [llama.cpp/llama-server](https://github.com/ggml-org/llama.cpp), + [vLLM](https://github.com/vllm-project/vllm), + [LM Studio](https://lmstudio.ai/), [LocalAI](https://localai.io/) — ten + sam backend obsługuje wszystkie, wystarczy inny `BPP_AI_BASE_URL`. + Prosi model o JSON zgodny ze schematem `DSLQuery` + (`response_format={"type": "json_schema", ...}`, `strict: True`), + `temperature=0`. Darmowy: widok (`ai_search.views.ZapytanieAIView`) + pomija pre-check budżetu, nie przekazuje `budget_check` do + `translator.translate`, i loguje `cost_usd=0`/`fx_rate=0`/`cost_pln=0` + bez wołania `pricing`/`fx` (model lokalny i tak nie ma wpisu w + `BPP_AI_PRICING`). + +Konfiguracja: `BPP_AI_BACKEND` / `BPP_AI_BASE_URL` / `BPP_AI_API_KEY` / +`BPP_AI_MODEL` (patrz tabela zmiennych środowiskowych wyżej). + +### Przykład: Ollama + +```bash +ollama pull qwen3:8b +ollama serve +``` + +```bash +# .env / środowisko: +BPP_AI_SEARCH_ENABLED=1 +BPP_AI_BACKEND=openai +BPP_AI_BASE_URL=http://localhost:11434/v1 +BPP_AI_MODEL=qwen3:8b +# BPP_AI_API_KEY pozostaw puste — Ollama nie wymaga auth. +``` + +Dla llama.cpp/llama-server, vLLM, LM Studio czy LocalAI zmienia się +wyłącznie `BPP_AI_BASE_URL` (i ewentualnie `BPP_AI_API_KEY`) — sam backend +(`openai`) zostaje ten sam. + +### Szacunek kontekstu (WAŻNE przy doborze modelu) + +Rozmiar system prompta wysyłanego do modelu to głównie compact-schema +(`ai_search.schema_export`, patrz `ai_search_schema_dump` wyżej) + reguły +i few-shot z `ai_search.prompts` + samo pytanie i miejsce na wyjście: + +- **Model „rekord", ze słownikowymi wartościami** + (`BPP_AI_MAX_FK_OPTIONS=100`, domyślne): **~31k tokenów**. +- **Model „rekord", bez wartości słownikowych** (`BPP_AI_MAX_FK_OPTIONS=0`): + **~22k tokenów** — chudszy schemat, ale gorsza trafność dla pytań + odwołujących się do konkretnych wartości (np. nazw źródeł/dyscyplin), + bo model ich po prostu nie widzi. +- Do tego reguły + few-shot (~1-2k tokenów) oraz pytanie + miejsce na + wyjście (~0,5k). +- Model „autor" ma zauważalnie mniejszy schemat niż „rekord". + +**Zalecane okno kontekstu modelu lokalnego: ≥ 32k tokenów** — komfortowo +dla wariantu z wartościami słownikowymi (domyślny). Dla modeli z +kontekstem 8k/16k: ustaw `BPP_AI_MAX_FK_OPTIONS=0` (chudszy ~22k schemat) +i licz się z ciaśniejszym zapasem na resztę promptu; ewentualnie ogranicz +się do modeli o szerszym oknie. + +### Zalecane modele OSS + +Klasa: mały-średni model instruct, dobry w ustrukturyzowanym JSON, +kontekst ≥32k, rozumiejący polski (samo pytanie jest po polsku — DSL +wyjściowy jest już w tokenach angielskich/DjangoQL): + +- **Qwen3** — rekomendacja główna (najlepszy stosunek JSON+PL wśród + modeli tej klasy). **4B/8B** dla lekkich instalacji, **14B/32B** dla + lepszej trafności na pytaniach dwuznacznych po polsku. + **Uwaga:** Qwen3 domyślnie ma włączony tryb „thinking" — potrafi + wygenerować blok rozumowania PRZED właściwym JSON-em, co przy stałym + `max_tokens=500` (patrz `backends.py`) grozi ucięciem odpowiedzi zanim + dojdzie do samego JSON-a. Wyłącz myślenie (np. prompt kończący się + `/no_think` albo odpowiednia flaga serwera inferencji). Walidator + DjangoQL + bounded-retry i tak wyłapią taki przypadek (zwrócony + niepoprawny JSON), ale lepiej uniknąć strat tokenów/czasu i wyłączyć + myślenie u źródła. +- **Llama 3.1 8B** (128k ctx), **Gemma 2 9B**, **Mistral** — alternatywy, + jeśli Qwen3 nie jest dostępny lub preferowany. +- Dla twardej gwarancji poprawnej składni JSON: **llama.cpp z GBNF** + (grammar-constrained decoding) — wymusza strukturę na poziomie + dekodowania, niezależnie od jakości modelu. + +**Uwaga kluczowa:** niezależnie od wybranego modelu lokalnego, gwarancją +poprawności końcowego zapytania jest walidator DjangoQL +(`translator.validate_query`, realny parser + `BppQLSchema`) w połączeniu +z bounded-retry (do `BPP_AI_MAX_RETRIES`, max. 2) — to jest mechanizm +**niezależny od backendu**. Słabszy model lokalny, który zwróci błędną +składnię, dostaje z powrotem dokładny komunikat błędu (linia/kolumna) i +ma szansę się poprawić, zupełnie tak samo jak przy backendzie +`anthropic`. diff --git a/docs/deweloper/index.md b/docs/deweloper/index.md index d273e087a..489959627 100644 --- a/docs/deweloper/index.md +++ b/docs/deweloper/index.md @@ -25,3 +25,5 @@ repozytorium. Poniższe strony rozwijają wybrane tematy: - [WeasyPrint na macOS](weasyprint-macos.md) — konfiguracja PDF lokalnie. - [Testy: Channels broadcast (flake)](testy-channels-broadcast.md) — diagnostyka niestabilnego testu. +- [Wyszukiwanie przez AI](ai-search.md) — feature „zapytaj po polsku" + (NL->DjangoQL), env-vary, koszty, cache schematu. diff --git a/docs/superpowers/plans/2026-07-04-ai-search.md b/docs/superpowers/plans/2026-07-04-ai-search.md new file mode 100644 index 000000000..11193bdb9 --- /dev/null +++ b/docs/superpowers/plans/2026-07-04-ai-search.md @@ -0,0 +1,1933 @@ +# Wyszukiwanie „przez sztuczną inteligencję" — plan implementacji + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Nowy tryb wyszukiwania — użytkownik pisze pytanie po polsku, Claude tłumaczy je na DjangoQL, po walidacji następuje redirect na istniejące „szukaj zapytaniem"; koszt logowany i ograniczony budżetami PLN. + +**Architecture:** Nowa apka `src/ai_search/` (izolowana, własny namespace URL `ai_search`). NL→DSL przez oficjalny SDK `anthropic` (`messages.parse`, structured outputs, `thinking` wyłączone). Walidacja przez `apply_search` + bounded retry z konkretnym błędem DjangoQL. Render przez redirect na `bpp:zapytanie?model=&query=`. Koszt liczony z `usage` × cennik (Decimal), przeliczany USD→PLN kursem NBP (cache + trwały fallback), budżety dzienny/miesięczny jako twardy blok. + +**Tech Stack:** Django, pytest + model_bakery, `anthropic` SDK, `djangoql-iplweb>=0.28.0`, `requests` (NBP), Django cache (Redis), django-environ (settings). + +## Global Constraints + +- **Max linia 88 znaków** (ruff). +- **NIE modyfikować istniejących migracji** w `src/*/migrations/`. +- **Wszystkie polecenia Pythona przez `uv run`.** +- **Zakaz `except: pass` / `except Exception: pass`** — logować (Rollbar dla tła), re-raise albo zwracać sensowny błąd. +- **Testy: pytest, funkcje bez klas, `@pytest.mark.django_db`, `model_bakery.baker`.** +- **Model:** `claude-sonnet-5` (SDK `anthropic`; NIE ustawiać `temperature`/`top_p`/`top_k` — Sonnet 5 je odrzuca; `thinking={"type":"disabled"}`). +- **Dostęp:** superuser LUB staff w grupie „wprowadzanie danych" (`user_can_use_query_editor`). +- **Kontrola kosztów:** wyłącznie budżety PLN (dzienny + miesięczny), twardy blok. Brak liczników liczby zapytań. +- **Baseline:** `make baseline-update` dopiero przy scalaniu (nie w gałęzi). +- Ikony w adminie/templatkach publicznych: publiczny frontend Foundation Icons (``). + +**Reużywane, istniejące punkty (nie zmieniać semantyki):** +- `bpp.views.zapytanie.user_can_use_query_editor` (`zapytanie.py:274`), `WprowadzanieDanychOrSuperuserMixin` (`:287`). +- `bpp.djangoql_schema.BppQLSchema` (`:232`), alias `BppZapytanieSchema` (`zapytanie.py:26`). +- `MODELS = {"rekord": Rekord, "autor": Autor}` (`zapytanie.py:36`), `MODEL_CHOICES` (`:31`). +- `_error_location(exc, query)` (`zapytanie.py:356`), `_format_error_text` (`:333`) — przenoszone w Tasku 5. +- Reverse istniejącego widoku: `bpp:zapytanie`. +- Filtr szablonowy `can_use_query_editor` (`bpp/templatetags/query_editor.py:8`). + +--- + +## Struktura plików + +``` +src/ai_search/ + __init__.py + apps.py # AiSearchConfig (name="ai_search") + models.py # AISearchQuery, FxRate + migrations/0001_initial.py + pricing.py # cost_usd_from_usage(usage, model, at_date) -> Decimal + fx.py # usd_to_pln_rate() -> Decimal (NBP + cache + FxRate + fallback) + schema_export.py # schema_for_llm(model_key) -> dict (Redis cache) + prompts.py # HARD_RULES, FEW_SHOT, build_system(schema_dict, model_key) + translator.py # translate(pytanie, model_key) -> TranslationResult + budget.py # check_budget() -> BudgetStatus ; spent_today/month + forms.py # AISearchForm + views.py # ZapytanieAIView + urls.py # app_name="ai_search"; path("", index, name="index") + templates/ai_search/zapytanie_ai.html + management/commands/ai_search_schema_dump.py # pomiar rozmiaru + ręczny podgląd + tests/ + __init__.py conftest.py + test_pricing.py test_fx.py test_schema_export.py + test_translator.py test_budget.py test_views.py + test_accuracy.py # skipif brak ANTHROPIC_API_KEY, wykluczony z CI + +src/bpp/djangoql_helpers.py # NOWY: _error_location, _format_error_text (Task 5) +``` + +Modyfikacje istniejących plików: +- `pyproject.toml` — dodać `anthropic`, bump `djangoql-iplweb>=0.28.0`. +- `src/django_bpp/settings/base.py` — INSTALLED_APPS += `ai_search`; sekcja settings `BPP_AI_*`. +- `src/django_bpp/urls.py` — include `ai_search.urls`. +- `src/bpp/views/zapytanie.py` — importować `_error_location`/`_format_error_text` z `bpp.djangoql_helpers` (re-export dla zgodności). +- `src/django_bpp/templates/top_bar.html` — pozycja „przez sztuczną inteligencję". + +--- + +## Task 1: Scaffold apki + zależności + settings + +**Files:** +- Create: `src/ai_search/__init__.py`, `src/ai_search/apps.py`, `src/ai_search/tests/__init__.py` +- Modify: `pyproject.toml`, `src/django_bpp/settings/base.py:365` (INSTALLED_APPS), koniec `base.py` (settings BPP_AI_*) +- Test: `src/ai_search/tests/test_app.py` + +**Interfaces:** +- Produces: apka `ai_search` w INSTALLED_APPS; settingsy `BPP_AI_SEARCH_ENABLED`, `BPP_AI_MODEL`, `BPP_AI_DAILY_BUDGET_PLN`, `BPP_AI_MONTHLY_BUDGET_PLN`, `BPP_AI_MAX_RETRIES`, `BPP_AI_LLM_TIMEOUT`, `BPP_AI_SCHEMA_CACHE_TTL`, `BPP_AI_FX_CACHE_TTL`, `BPP_AI_FX_FALLBACK`, `BPP_AI_PRICING`. + +- [ ] **Step 1: Dodaj zależności do pyproject.toml** + +W `[project].dependencies` zmień pin djangoql i dodaj anthropic: +```toml + "djangoql-iplweb>=0.28.0", + "anthropic>=0.40", +``` +(zastępując istniejące `"djangoql-iplweb>=0.27.2",`). + +- [ ] **Step 2: uv lock + sync** + +Run: `uv lock && uv sync` +Expected: lock zaktualizowany; `uv run python -c "import djangoql,anthropic;print(djangoql.__version__)"` → `0.28.0` (lub wyżej) bez błędu importu `anthropic`. + +- [ ] **Step 3: Utwórz szkielet apki** + +`src/ai_search/__init__.py` (pusty). +`src/ai_search/apps.py`: +```python +from django.apps import AppConfig + + +class AiSearchConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "ai_search" + verbose_name = "Wyszukiwanie przez AI" +``` +`src/ai_search/tests/__init__.py` (pusty). + +- [ ] **Step 4: Zarejestruj apkę w INSTALLED_APPS** + +W `src/django_bpp/settings/base.py` w liście `INSTALLED_APPS` dodaj `"ai_search",` bezpośrednio po `"bpp",` (linia ~414). + +- [ ] **Step 5: Dodaj sekcję settings BPP_AI_* na końcu base.py** + +Dopisz (używając `env` z django-environ, wzór jak reszta pliku): +```python +# --- Wyszukiwanie przez AI (ai_search) --- +BPP_AI_SEARCH_ENABLED = env("BPP_AI_SEARCH_ENABLED", default=False, cast=bool) +BPP_AI_MODEL = env("BPP_AI_MODEL", default="claude-sonnet-5") +BPP_AI_DAILY_BUDGET_PLN = env( + "BPP_AI_DAILY_BUDGET_PLN", default="20", cast=str +) +BPP_AI_MONTHLY_BUDGET_PLN = env( + "BPP_AI_MONTHLY_BUDGET_PLN", default="300", cast=str +) +BPP_AI_MAX_RETRIES = env("BPP_AI_MAX_RETRIES", default=1, cast=int) +BPP_AI_LLM_TIMEOUT = env("BPP_AI_LLM_TIMEOUT", default=30, cast=int) +BPP_AI_SCHEMA_CACHE_TTL = env("BPP_AI_SCHEMA_CACHE_TTL", default=86400, cast=int) +BPP_AI_FX_CACHE_TTL = env("BPP_AI_FX_CACHE_TTL", default=86400, cast=int) +BPP_AI_FX_FALLBACK = env("BPP_AI_FX_FALLBACK", default="4.5", cast=str) +# Cennik per model, USD za 1M tokenów. `intro_until` (ISO date) -> do tej daty +# obowiązują ceny intro. cache_read/cache_write to mnożniki ceny input. +BPP_AI_PRICING = { + "claude-sonnet-5": { + "input": "3.0", + "output": "15.0", + "intro_input": "2.0", + "intro_output": "10.0", + "intro_until": "2026-08-31", + "cache_read_mult": "0.1", + "cache_write_mult": "1.25", + }, +} +``` +Uwaga: kwoty jako `str`, w kodzie konwertowane na `Decimal` (unikamy floatów w pieniądzach). + +- [ ] **Step 6: Test — apka i settingsy ładują się** + +`src/ai_search/tests/test_app.py`: +```python +from django.apps import apps +from django.conf import settings + + +def test_app_registered(): + assert apps.is_installed("ai_search") + + +def test_ai_settings_present(): + assert hasattr(settings, "BPP_AI_MODEL") + assert settings.BPP_AI_MODEL + assert "claude-sonnet-5" in settings.BPP_AI_PRICING +``` + +- [ ] **Step 7: Uruchom test** + +Run: `uv run pytest src/ai_search/tests/test_app.py -v` +Expected: PASS (2). + +- [ ] **Step 8: Commit** + +```bash +git add pyproject.toml uv.lock src/ai_search/ src/django_bpp/settings/base.py +git commit -m "feat(ai-search): scaffold apki + zaleznosci (anthropic, djangoql 0.28) + settings" +``` + +--- + +## Task 2: Modele — AISearchQuery + FxRate + migracja + +**Files:** +- Create: `src/ai_search/models.py`, `src/ai_search/migrations/__init__.py` +- Test: `src/ai_search/tests/test_models.py` + +**Interfaces:** +- Produces: + - `AISearchQuery` z polami: `user (FK, null)`, `created (auto, db_index)`, `model (str)`, `pytanie (Text)`, `wygenerowany_query (Text, blank)`, `wybrany_model_danych (str)`, `input_tokens/output_tokens/cache_read_tokens/cache_write_tokens (int)`, `cost_usd/fx_rate/cost_pln (Decimal)`, `success (bool)`, `error (Text, null)`, `retried (bool)`. + - `FxRate` z polami: `rate (Decimal)`, `fetched_at (auto)`; klasmetoda `latest()` i `store(rate)`. + +- [ ] **Step 1: Napisz modele** + +`src/ai_search/models.py`: +```python +from decimal import Decimal + +from django.conf import settings +from django.db import models + + +class AISearchQuery(models.Model): + """Log pojedynczego zapytania NL->DSL wraz z kosztem.""" + + user = models.ForeignKey( + settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL + ) + created = models.DateTimeField(auto_now_add=True, db_index=True) + model = models.CharField(max_length=100) + pytanie = models.TextField() + wygenerowany_query = models.TextField(blank=True, default="") + wybrany_model_danych = models.CharField(max_length=32) + input_tokens = models.IntegerField(default=0) + output_tokens = models.IntegerField(default=0) + cache_read_tokens = models.IntegerField(default=0) + cache_write_tokens = models.IntegerField(default=0) + cost_usd = models.DecimalField(max_digits=12, decimal_places=6, default=Decimal("0")) + fx_rate = models.DecimalField(max_digits=10, decimal_places=4, default=Decimal("0")) + cost_pln = models.DecimalField(max_digits=12, decimal_places=4, default=Decimal("0")) + success = models.BooleanField(default=False) + error = models.TextField(null=True, blank=True) + retried = models.BooleanField(default=False) + + class Meta: + verbose_name = "zapytanie AI" + verbose_name_plural = "zapytania AI" + ordering = ("-created",) + + def __str__(self): + return f"{self.created:%Y-%m-%d %H:%M} {self.pytanie[:60]}" + + +class FxRate(models.Model): + """Trwały fallback ostatniego znanego kursu USD->PLN (gdy Redis+NBP padną).""" + + rate = models.DecimalField(max_digits=10, decimal_places=4) + fetched_at = models.DateTimeField(auto_now_add=True) + + class Meta: + ordering = ("-fetched_at",) + + @classmethod + def latest(cls): + return cls.objects.first() + + @classmethod + def store(cls, rate): + return cls.objects.create(rate=Decimal(str(rate))) +``` + +- [ ] **Step 2: Utwórz katalog migracji i wygeneruj migrację** + +```bash +mkdir -p src/ai_search/migrations && touch src/ai_search/migrations/__init__.py +uv run python src/manage.py makemigrations ai_search +``` +Expected: `src/ai_search/migrations/0001_initial.py` utworzone (AISearchQuery, FxRate). + +- [ ] **Step 3: Napisz testy modeli** + +`src/ai_search/tests/test_models.py`: +```python +from decimal import Decimal + +import pytest +from model_bakery import baker + +from ai_search.models import AISearchQuery, FxRate + + +@pytest.mark.django_db +def test_aisearchquery_str(): + q = baker.make(AISearchQuery, pytanie="ksiazki po 2020") + assert "ksiazki po 2020" in str(q) + + +@pytest.mark.django_db +def test_fxrate_store_and_latest(): + assert FxRate.latest() is None + FxRate.store("4.12") + FxRate.store("4.20") + assert FxRate.latest().rate == Decimal("4.2000") +``` + +- [ ] **Step 4: Uruchom testy** + +Run: `uv run pytest src/ai_search/tests/test_models.py -v` +Expected: PASS (2). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/models.py src/ai_search/migrations/ src/ai_search/tests/test_models.py +git commit -m "feat(ai-search): modele AISearchQuery + FxRate + migracja" +``` + +--- + +## Task 3: Wycena — pricing.py (koszt z usage) + +**Files:** +- Create: `src/ai_search/pricing.py` +- Test: `src/ai_search/tests/test_pricing.py` + +**Interfaces:** +- Consumes: `settings.BPP_AI_PRICING`. +- Produces: `cost_usd_from_usage(usage: dict, model: str, at_date: date) -> Decimal`, gdzie `usage` = `{"input_tokens","output_tokens","cache_read_tokens","cache_write_tokens"}`. + +- [ ] **Step 1: Napisz test (TDD)** + +`src/ai_search/tests/test_pricing.py`: +```python +from datetime import date +from decimal import Decimal + +from ai_search.pricing import cost_usd_from_usage + +USAGE = { + "input_tokens": 1_000_000, + "output_tokens": 100_000, + "cache_read_tokens": 0, + "cache_write_tokens": 0, +} + + +def test_intro_pricing_before_cutoff(): + # intro: input 2.0, output 10.0 -> 2 + 1 = 3.0 USD + cost = cost_usd_from_usage(USAGE, "claude-sonnet-5", date(2026, 7, 1)) + assert cost == Decimal("3.000000") + + +def test_standard_pricing_after_cutoff(): + # standard: input 3.0, output 15.0 -> 3 + 1.5 = 4.5 USD + cost = cost_usd_from_usage(USAGE, "claude-sonnet-5", date(2026, 9, 1)) + assert cost == Decimal("4.500000") + + +def test_cache_read_and_write_multipliers(): + usage = { + "input_tokens": 0, + "output_tokens": 0, + "cache_read_tokens": 1_000_000, + "cache_write_tokens": 1_000_000, + } + # standard input 3.0; read 0.1x=0.3, write 1.25x=3.75 -> 4.05 + cost = cost_usd_from_usage(usage, "claude-sonnet-5", date(2026, 9, 1)) + assert cost == Decimal("4.050000") + + +def test_unknown_model_raises(): + import pytest + + with pytest.raises(KeyError): + cost_usd_from_usage(USAGE, "no-such-model", date(2026, 9, 1)) +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_pricing.py -v` +Expected: FAIL (ModuleNotFoundError: ai_search.pricing). + +- [ ] **Step 3: Implementacja** + +`src/ai_search/pricing.py`: +```python +from datetime import date +from decimal import Decimal + +from django.conf import settings + +_MILLION = Decimal("1000000") + + +def _price(cfg: dict, key: str, at_date: date) -> Decimal: + """Cena input/output per 1M tokenów, z uwzględnieniem intro-pricingu.""" + intro_until = cfg.get("intro_until") + if intro_until and at_date <= date.fromisoformat(intro_until): + return Decimal(cfg[f"intro_{key}"]) + return Decimal(cfg[key]) + + +def cost_usd_from_usage(usage: dict, model: str, at_date: date) -> Decimal: + """Koszt (USD, Decimal) danego wywołania na podstawie usage i cennika. + + ``usage`` klucze: input_tokens, output_tokens, cache_read_tokens, + cache_write_tokens. Podnosi KeyError dla nieznanego modelu — brak ceny to + błąd, nie cichy koszt zero (patrz spec, KRYT. #1). + """ + cfg = settings.BPP_AI_PRICING[model] + in_price = _price(cfg, "input", at_date) + out_price = _price(cfg, "output", at_date) + read_mult = Decimal(cfg["cache_read_mult"]) + write_mult = Decimal(cfg["cache_write_mult"]) + + total = ( + Decimal(usage.get("input_tokens", 0)) * in_price + + Decimal(usage.get("output_tokens", 0)) * out_price + + Decimal(usage.get("cache_read_tokens", 0)) * in_price * read_mult + + Decimal(usage.get("cache_write_tokens", 0)) * in_price * write_mult + ) / _MILLION + return total.quantize(Decimal("0.000001")) +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_pricing.py -v` +Expected: PASS (4). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/pricing.py src/ai_search/tests/test_pricing.py +git commit -m "feat(ai-search): wycena kosztu z usage (Decimal, intro-pricing, cache mult)" +``` + +--- + +## Task 4: Kurs walutowy — fx.py (NBP + cache + trwały fallback) + +**Files:** +- Create: `src/ai_search/fx.py` +- Test: `src/ai_search/tests/test_fx.py` + +**Interfaces:** +- Consumes: `FxRate` (Task 2), `settings.BPP_AI_FX_CACHE_TTL`, `settings.BPP_AI_FX_FALLBACK`, Django cache, `requests`. +- Produces: `usd_to_pln_rate() -> Decimal`. Klucz cache: `"ai_search:fx:usdpln"`. + +- [ ] **Step 1: Napisz testy (TDD)** + +`src/ai_search/tests/test_fx.py`: +```python +from decimal import Decimal +from unittest import mock + +import pytest +from django.core.cache import cache + +from ai_search import fx +from ai_search.models import FxRate + + +@pytest.fixture(autouse=True) +def _clear_cache(): + cache.delete("ai_search:fx:usdpln") + yield + cache.delete("ai_search:fx:usdpln") + + +def _nbp_response(mid): + m = mock.Mock() + m.raise_for_status = mock.Mock() + m.json.return_value = {"rates": [{"mid": mid}]} + return m + + +@pytest.mark.django_db +def test_fetches_from_nbp_and_persists(): + with mock.patch("ai_search.fx.requests.get", return_value=_nbp_response(4.11)): + rate = fx.usd_to_pln_rate() + assert rate == Decimal("4.1100") + assert FxRate.latest().rate == Decimal("4.1100") + + +@pytest.mark.django_db +def test_uses_cache_without_second_http_call(): + with mock.patch("ai_search.fx.requests.get", return_value=_nbp_response(4.11)) as g: + fx.usd_to_pln_rate() + fx.usd_to_pln_rate() + assert g.call_count == 1 + + +@pytest.mark.django_db +def test_falls_back_to_db_when_nbp_down(): + FxRate.store("4.05") + with mock.patch("ai_search.fx.requests.get", side_effect=OSError("boom")): + rate = fx.usd_to_pln_rate() + assert rate == Decimal("4.0500") + + +@pytest.mark.django_db +def test_terminal_fallback_when_nothing_available(settings): + settings.BPP_AI_FX_FALLBACK = "4.5" + with mock.patch("ai_search.fx.requests.get", side_effect=OSError("boom")): + rate = fx.usd_to_pln_rate() + assert rate == Decimal("4.5") +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_fx.py -v` +Expected: FAIL (brak `ai_search.fx`). + +- [ ] **Step 3: Implementacja** + +`src/ai_search/fx.py`: +```python +import logging +from decimal import Decimal + +import requests +from django.conf import settings +from django.core.cache import cache + +logger = logging.getLogger(__name__) + +_CACHE_KEY = "ai_search:fx:usdpln" +_NBP_URL = "https://api.nbp.pl/api/exchangerates/rates/A/USD/?format=json" + + +def _fetch_nbp() -> Decimal: + resp = requests.get(_NBP_URL, timeout=10) + resp.raise_for_status() + mid = resp.json()["rates"][0]["mid"] + return Decimal(str(mid)).quantize(Decimal("0.0001")) + + +def usd_to_pln_rate() -> Decimal: + """Kurs USD->PLN. Kolejność: cache Redis -> NBP -> DB FxRate -> stała. + + Nigdy nie podnosi wyjątku — FX nie może zablokować feature'a; do wyceny + wystarczy ostatni znany / konserwatywny kurs. + """ + from ai_search.models import FxRate + + cached = cache.get(_CACHE_KEY) + if cached is not None: + return Decimal(cached) + + try: + rate = _fetch_nbp() + cache.set(_CACHE_KEY, str(rate), settings.BPP_AI_FX_CACHE_TTL) + FxRate.store(rate) + return rate + except (requests.RequestException, OSError, KeyError, ValueError) as exc: + logger.warning("NBP FX niedostępny (%s), używam fallbacku", exc) + + last = FxRate.latest() + if last is not None: + return last.rate + return Decimal(settings.BPP_AI_FX_FALLBACK) +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_fx.py -v` +Expected: PASS (4). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/fx.py src/ai_search/tests/test_fx.py +git commit -m "feat(ai-search): kurs USD->PLN z NBP (https) + cache + trwaly fallback" +``` + +--- + +## Task 5: Przeniesienie helpera błędów DjangoQL do współdzielonego modułu + +**Files:** +- Create: `src/bpp/djangoql_helpers.py` +- Modify: `src/bpp/views/zapytanie.py` (import + re-export dla zgodności) +- Test: `src/ai_search/tests/test_error_helper.py` + +**Interfaces:** +- Produces: `bpp.djangoql_helpers._error_location(exc, query) -> (line, column, mark)` i `_format_error_text(exc) -> str` (przeniesione 1:1 z `zapytanie.py`). `_locate_token` również. +- `zapytanie.py` re-eksportuje je, więc jego dotychczasowe użycia i testy działają bez zmian. + +- [ ] **Step 1: Utwórz współdzielony moduł (przenieś kod 1:1)** + +`src/bpp/djangoql_helpers.py` — przenieś **dokładnie** ciała `_format_error_text`, `_locate_token`, `_error_location`, `_error_payload` z `zapytanie.py:333-382` (razem z importami `re`, `ValidationError`): +```python +import re + +from django.core.exceptions import ValidationError + + +def _format_error_text(exc): + if isinstance(exc, ValidationError): + return "; ".join(exc.messages) + return str(exc) + + +def _locate_token(query, needle): + match = re.search(r"(? dict` (cache Redis, klucz `f"ai_search:schema:{model_key}"`), `regenerate(model_key) -> dict`. + +- [ ] **Step 1: Napisz testy (TDD)** + +`src/ai_search/tests/test_schema_export.py`: +```python +import pytest +from django.core.cache import cache + +from ai_search import schema_export + + +@pytest.fixture(autouse=True) +def _clear(): + for k in ("rekord", "autor"): + cache.delete(f"ai_search:schema:{k}") + yield + + +@pytest.mark.django_db +def test_schema_shape_rekord(): + data = schema_export.schema_for_llm("rekord") + assert "grammar" in data and "models" in data + assert "negation" in data["grammar"] + + +@pytest.mark.django_db +def test_schema_shape_autor(): + data = schema_export.schema_for_llm("autor") + assert data["models"] # niepusty słownik modeli + + +@pytest.mark.django_db +def test_cache_reused(monkeypatch): + calls = {"n": 0} + real = schema_export._build + + def counting(model_key): + calls["n"] += 1 + return real(model_key) + + monkeypatch.setattr(schema_export, "_build", counting) + schema_export.schema_for_llm("rekord") + schema_export.schema_for_llm("rekord") + assert calls["n"] == 1 + + +@pytest.mark.django_db +def test_unknown_model_key_raises(): + with pytest.raises(KeyError): + schema_export.schema_for_llm("nieistnieje") +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_schema_export.py -v` +Expected: FAIL (brak modułu). + +- [ ] **Step 3: Implementacja** + +`src/ai_search/schema_export.py`: +```python +import logging + +from django.conf import settings +from django.core.cache import cache +from djangoql.llm import describe_schema_for_llm + +from bpp.djangoql_schema import BppQLSchema +from bpp.views.zapytanie import MODELS + +logger = logging.getLogger(__name__) + + +def _cache_key(model_key: str) -> str: + return f"ai_search:schema:{model_key}" + + +def _build(model_key: str) -> dict: + """Zbuduj opis schematu dla danego klucza modelu (rekord/autor). + + Podnosi KeyError dla nieznanego klucza. describe_schema_for_llm sięga bazy + dla pól z suggest_options — dlatego wynik jest cache'owany.""" + model = MODELS[model_key] + return describe_schema_for_llm(BppQLSchema(model)) + + +def regenerate(model_key: str) -> dict: + data = _build(model_key) + cache.set(_cache_key(model_key), data, settings.BPP_AI_SCHEMA_CACHE_TTL) + return data + + +def schema_for_llm(model_key: str) -> dict: + cached = cache.get(_cache_key(model_key)) + if cached is not None: + return cached + return regenerate(model_key) +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_schema_export.py -v` +Expected: PASS (4). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/schema_export.py src/ai_search/tests/test_schema_export.py +git commit -m "feat(ai-search): eksport schematu DjangoQL dla LLM z cache Redis" +``` + +--- + +## Task 7: Komenda pomiaru rozmiaru schematu (KRYT. #3 ze specu) + +**Files:** +- Create: `src/ai_search/management/__init__.py`, `src/ai_search/management/commands/__init__.py`, `src/ai_search/management/commands/ai_search_schema_dump.py` +- Test: `src/ai_search/tests/test_schema_dump_command.py` + +**Interfaces:** +- Produces: `manage.py ai_search_schema_dump ` — drukuje JSON + na stderr przybliżoną liczbę znaków/tokenów (do decyzji o przycinaniu). + +- [ ] **Step 1: Test komendy** + +`src/ai_search/tests/test_schema_dump_command.py`: +```python +import pytest +from django.core.management import call_command + + +@pytest.mark.django_db +def test_dump_rekord_runs(capsys): + call_command("ai_search_schema_dump", "rekord") + out = capsys.readouterr().out + assert '"grammar"' in out +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_schema_dump_command.py -v` +Expected: FAIL (Unknown command). + +- [ ] **Step 3: Implementacja** + +Utwórz `__init__.py` w `management/` i `management/commands/`. +`src/ai_search/management/commands/ai_search_schema_dump.py`: +```python +import json + +from django.core.management.base import BaseCommand, CommandError + +from ai_search import schema_export + + +class Command(BaseCommand): + help = "Zrzuca opis schematu dla LLM i szacuje jego rozmiar (tokeny)." + + def add_arguments(self, parser): + parser.add_argument("model_key", choices=["rekord", "autor"]) + + def handle(self, *args, **options): + try: + data = schema_export.regenerate(options["model_key"]) + except KeyError as exc: + raise CommandError(f"Nieznany model: {exc}") + text = json.dumps(data, ensure_ascii=False, indent=2) + self.stdout.write(text) + # Zgrubne oszacowanie: ~4 znaki/token (angielski JSON). + chars = len(text) + self.stderr.write( + f"\n[rozmiar] {chars} znaków, ~{chars // 4} tokenów. " + f"Jeśli > ~30k tokenów — rozważ przycinanie suggested_values." + ) +``` + +- [ ] **Step 4: Uruchom test + realny pomiar** + +Run: `uv run pytest src/ai_search/tests/test_schema_dump_command.py -v` +Expected: PASS. +Następnie (pomiar, wynik do specu/planu): +`uv run python src/manage.py ai_search_schema_dump rekord >/dev/null` +Odczytaj z stderr szacunek tokenów. **Jeśli > ~30k** — dopisz w tym tasku follow-up: przycięcie w `schema_export._build` (np. usuwanie `suggested_values` z pól-pickerów przez post-processing dict-a). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/management/ src/ai_search/tests/test_schema_dump_command.py +git commit -m "feat(ai-search): komenda pomiaru rozmiaru schematu dla LLM" +``` + +--- + +## Task 8: Prompty — reguły + few-shot (prompts.py) + +**Files:** +- Create: `src/ai_search/prompts.py` +- Test: `src/ai_search/tests/test_prompts.py` + +**Interfaces:** +- Consumes: nic (dane statyczne + dict schematu). +- Produces: `build_system(schema_dict: dict, model_key: str) -> list` — lista bloków system dla SDK anthropic; ostatni blok (schema+reguły+few-shot) ma `cache_control: {"type":"ephemeral"}`. Pytanie użytkownika NIE jest tu zawarte. Stałe: `HARD_RULES: str`, `FEW_SHOT: dict[str, list[tuple[str,str]]]` (klucze "rekord"/"autor"). + +- [ ] **Step 1: Test (TDD)** + +`src/ai_search/tests/test_prompts.py`: +```python +from ai_search.prompts import FEW_SHOT, build_system + + +def test_build_system_has_cache_control_on_last_block(): + blocks = build_system({"grammar": {}, "models": {}}, "rekord") + assert blocks[-1]["cache_control"] == {"type": "ephemeral"} + assert "type" in blocks[-1] and blocks[-1]["type"] == "text" + + +def test_build_system_embeds_schema_and_rules(): + blocks = build_system({"grammar": {"x": 1}, "models": {}}, "rekord") + text = blocks[-1]["text"] + assert "grammar" in text # schemat wklejony + assert "not startswith" in text # reguła negacji + + +def test_few_shot_covers_both_models(): + assert FEW_SHOT["rekord"] and FEW_SHOT["autor"] +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_prompts.py -v` +Expected: FAIL. + +- [ ] **Step 3: Implementacja** + +`src/ai_search/prompts.py`: +```python +import json + +HARD_RULES = """\ +Tłumaczysz pytania w języku polskim na zapytania DSL DjangoQL dla systemu +bibliografii publikacji (BPP). Zwracasz WYŁĄCZNIE poprawne zapytanie w polu +`query`, albo `query=null` i wyjaśnienie po polsku w `error`, gdy pytania nie +da się wyrazić w tym DSL. + +ZASADY TWARDE: +- Stringi zawsze w podwójnych cudzysłowach. +- Relacje trawersujesz kropką, także wielopoziomowo + (np. autorzy.autor.nazwisko). +- Listy: pole in ("a", "b"). +- NIE MA samodzielnego operatora `not`. Negujesz operatorem: !=, !~, + not in, not startswith, not endswith. (poprawnie: rok != 2020; + błędnie: not rok = 2020) +- Łączenie warunków: `and` / `or`, grupowanie nawiasami. +- Jeśli pytanie jest oceniające/nieostre ("najlepsze", "ciekawe") i nie da się + go zmapować na pola — ustaw query=null i wyjaśnij w error. +""" + +FEW_SHOT = { + "rekord": [ + ("publikacje z 2024 roku", "rok = 2024"), + ("prace po 2020 zawierające w tytule nowotwór", + 'rok > 2020 and tytul_oryginalny ~ "nowotwor"'), + ("artykuły o charakterze AC", + 'charakter_formalny.skrot = "AC"'), + ("prace autora o nazwisku Kowalski", + 'autorzy.autor.nazwisko ~ "Kowalski"'), + ("publikacje z lat 2022-2024", "rok >= 2022 and rok <= 2024"), + ("prace bez przypisanego źródła", "zrodlo = None"), + ("tytuły niezawierające słowa raport", 'tytul_oryginalny !~ "raport"'), + ], + "autor": [ + ("autorzy o nazwisku zaczynającym się na Kow", + 'nazwisko startswith "Kow"'), + ("autorzy z imieniem Jan lub Anna", + 'imiona ~ "Jan" or imiona ~ "Anna"'), + ("autorzy z podanym ORCID", "orcid != None"), + ("autorki i autorzy bez pseudonimu", "pseudonim = None"), + ], +} + + +def _few_shot_text(model_key: str) -> str: + lines = ["PRZYKŁADY:"] + for pl, dsl in FEW_SHOT[model_key]: + lines.append(f'"{pl}" -> {dsl}') + return "\n".join(lines) + + +def build_system(schema_dict: dict, model_key: str) -> list: + """Bloki `system` dla SDK anthropic. Ostatni (stabilny) blok — schemat + + reguły + few-shot — oznaczony cache_control, żeby retry i szybkie kolejne + zapytania czytały go z cache.""" + schema_json = json.dumps(schema_dict, ensure_ascii=False) + text = ( + f"{HARD_RULES}\n\nSCHEMAT (model {model_key}):\n{schema_json}\n\n" + f"{_few_shot_text(model_key)}" + ) + return [{"type": "text", "text": text, "cache_control": {"type": "ephemeral"}}] +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_prompts.py -v` +Expected: PASS (3). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/prompts.py src/ai_search/tests/test_prompts.py +git commit -m "feat(ai-search): system prompt (reguly + few-shot) z cache_control" +``` + +--- + +## Task 9: Translator — SDK anthropic + walidacja + bounded retry + +**Files:** +- Create: `src/ai_search/translator.py` +- Test: `src/ai_search/tests/test_translator.py` + +**Interfaces:** +- Consumes: `anthropic` SDK, `ai_search.prompts.build_system`, `ai_search.schema_export.schema_for_llm`, `bpp.djangoql_helpers._error_location/_format_error_text`, `djangoql.queryset.apply_search`, `bpp.djangoql_schema.BppQLSchema`, `bpp.views.zapytanie.MODELS`, `settings.BPP_AI_MODEL/BPP_AI_MAX_RETRIES/BPP_AI_LLM_TIMEOUT`. +- Produces: + - dataclass `TranslationResult(query: str|None, error: str|None, usage: dict, attempts: int, retried: bool)` gdzie `usage` = zsumowane `{input_tokens,output_tokens,cache_read_tokens,cache_write_tokens}`. + - `translate(pytanie: str, model_key: str) -> TranslationResult`. + - `DSLQuery` (pydantic) `{query: Optional[str], error: Optional[str]}`. + - `validate_query(query: str, model_key: str) -> tuple[str|None, dict|None]` — zwraca `(None, None)` gdy OK, albo `(komunikat, {line,column,mark})`. + +- [ ] **Step 1: Testy (TDD, mockujemy SDK)** + +`src/ai_search/tests/test_translator.py`: +```python +from unittest import mock + +import pytest + +from ai_search import translator + + +def _fake_response(query, error=None, usage=None): + parsed = translator.DSLQuery(query=query, error=error) + resp = mock.Mock() + resp.parsed_output = parsed + resp.stop_reason = "end_turn" + u = usage or {} + resp.usage = mock.Mock( + input_tokens=u.get("input_tokens", 10), + output_tokens=u.get("output_tokens", 5), + cache_read_input_tokens=u.get("cache_read_tokens", 0), + cache_creation_input_tokens=u.get("cache_write_tokens", 0), + ) + return resp + + +@pytest.fixture(autouse=True) +def _schema(monkeypatch): + monkeypatch.setattr( + translator.schema_export, "schema_for_llm", + lambda k: {"grammar": {}, "models": {}}, + ) + + +@pytest.mark.django_db +def test_valid_query_first_try(): + with mock.patch.object( + translator, "_call_model", return_value=_fake_response("rok = 2024") + ) as call: + res = translator.translate("publikacje z 2024", "rekord") + assert res.query == "rok = 2024" + assert res.error is None + assert res.attempts == 1 + assert call.call_count == 1 + + +@pytest.mark.django_db +def test_null_query_passthrough(): + with mock.patch.object( + translator, "_call_model", + return_value=_fake_response(None, error="pytanie nieostre"), + ): + res = translator.translate("najlepsze prace", "rekord") + assert res.query is None + assert "nieostre" in res.error + + +@pytest.mark.django_db +def test_invalid_query_retries_then_succeeds(): + responses = [_fake_response('rok = "x'), _fake_response("rok = 2024")] + with mock.patch.object(translator, "_call_model", side_effect=responses): + res = translator.translate("prace z 2024", "rekord") + assert res.query == "rok = 2024" + assert res.retried is True + assert res.attempts == 2 + + +@pytest.mark.django_db +def test_invalid_after_retries_returns_error(settings): + settings.BPP_AI_MAX_RETRIES = 1 + bad = _fake_response('rok = "x') + with mock.patch.object(translator, "_call_model", return_value=bad) as call: + res = translator.translate("prace z 2024", "rekord") + assert res.query is None + assert res.error # komunikat błędu DjangoQL + assert call.call_count == 2 # 1 + 1 retry +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_translator.py -v` +Expected: FAIL (brak modułu). + +- [ ] **Step 3: Implementacja** + +`src/ai_search/translator.py`: +```python +import logging +from dataclasses import dataclass, field +from typing import Optional + +import anthropic +from django.conf import settings +from djangoql.exceptions import DjangoQLError +from djangoql.queryset import apply_search +from pydantic import BaseModel, ConfigDict + +from bpp.djangoql_helpers import _error_location, _format_error_text +from bpp.djangoql_schema import BppQLSchema +from bpp.views.zapytanie import MODELS +from django.core.exceptions import FieldError, ValidationError + +from ai_search import prompts, schema_export + +logger = logging.getLogger(__name__) + + +class DSLQuery(BaseModel): + model_config = ConfigDict(extra="forbid") + query: Optional[str] + error: Optional[str] + + +@dataclass +class TranslationResult: + query: Optional[str] = None + error: Optional[str] = None + usage: dict = field(default_factory=dict) + attempts: int = 0 + retried: bool = False + + +def validate_query(query: str, model_key: str): + """Zwraca (None, None) gdy zapytanie parsuje się poprawnie, inaczej + (komunikat, {line,column,mark}).""" + model = MODELS[model_key] + try: + apply_search(model.objects.all(), query, schema=BppQLSchema) + return None, None + except (DjangoQLError, FieldError, ValidationError, ValueError) as exc: + line, column, mark = _error_location(exc, query) + loc = {"line": line, "column": column, "mark": mark} if line else None + return _format_error_text(exc), loc + + +def _client() -> anthropic.Anthropic: + return anthropic.Anthropic(timeout=settings.BPP_AI_LLM_TIMEOUT) + + +def _call_model(system, messages): + """Pojedyncze wywołanie modelu (wydzielone dla testowalności).""" + return _client().messages.parse( + model=settings.BPP_AI_MODEL, + max_tokens=500, + thinking={"type": "disabled"}, + system=system, + messages=messages, + output_format=DSLQuery, + ) + + +def _extract_usage(resp) -> dict: + u = resp.usage + return { + "input_tokens": getattr(u, "input_tokens", 0) or 0, + "output_tokens": getattr(u, "output_tokens", 0) or 0, + "cache_read_tokens": getattr(u, "cache_read_input_tokens", 0) or 0, + "cache_write_tokens": getattr(u, "cache_creation_input_tokens", 0) or 0, + } + + +def _accumulate(total: dict, part: dict): + for k, v in part.items(): + total[k] = total.get(k, 0) + v + + +def translate(pytanie: str, model_key: str) -> TranslationResult: + """NL (polski) -> DjangoQL. Waliduje i, przy błędzie składni, zwraca do + modelu konkretny komunikat DjangoQL (linia/kolumna) i ponawia — bounded.""" + system = prompts.build_system(schema_export.schema_for_llm(model_key), model_key) + max_retries = settings.BPP_AI_MAX_RETRIES + total_usage: dict = {} + result = TranslationResult() + content = pytanie + + for attempt in range(max_retries + 1): + result.attempts = attempt + 1 + resp = _call_model(system, [{"role": "user", "content": content}]) + _accumulate(total_usage, _extract_usage(resp)) + result.usage = total_usage + + if getattr(resp, "stop_reason", None) == "refusal": + result.query = None + result.error = "Model odmówił odpowiedzi na to pytanie." + return result + + parsed = resp.parsed_output + if parsed.query is None: + result.query = None + result.error = parsed.error or "Nie można wyrazić pytania w DSL." + return result + + err, loc = validate_query(parsed.query, model_key) + if err is None: + result.query = parsed.query + result.error = None + return result + + # Błąd składni — przygotuj feedback do modelu i ponów (jeśli został budżet prób). + result.query = None + result.error = err + if attempt < max_retries: + result.retried = True + where = "" + if loc and loc.get("line"): + where = f" (linia {loc['line']}, kolumna {loc['column']})" + content = ( + f"{pytanie}\n\nPoprzednie zapytanie `{parsed.query}` zwróciło błąd " + f"DjangoQL: {err}{where}. Skoryguj i zwróć poprawne zapytanie." + ) + return result +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_translator.py -v` +Expected: PASS (4). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/translator.py src/ai_search/tests/test_translator.py +git commit -m "feat(ai-search): translator NL->DjangoQL (SDK anthropic) + walidacja + bounded retry" +``` + +--- + +## Task 10: Budżet — budget.py (agregacja + guard) + +**Files:** +- Create: `src/ai_search/budget.py` +- Test: `src/ai_search/tests/test_budget.py` + +**Interfaces:** +- Consumes: `AISearchQuery`, `settings.BPP_AI_DAILY_BUDGET_PLN/BPP_AI_MONTHLY_BUDGET_PLN`, `django.utils.timezone`. +- Produces: + - `spent_today() -> Decimal`, `spent_this_month() -> Decimal` (agregacja `cost_pln`, granice wg `TIME_ZONE`). + - dataclass `BudgetStatus(ok: bool, reason: str|None)`. + - `check_budget() -> BudgetStatus`. + +- [ ] **Step 1: Testy (TDD)** + +`src/ai_search/tests/test_budget.py`: +```python +from decimal import Decimal + +import pytest +from model_bakery import baker + +from ai_search import budget +from ai_search.models import AISearchQuery + + +@pytest.mark.django_db +def test_ok_when_under_budget(settings): + settings.BPP_AI_DAILY_BUDGET_PLN = "10" + settings.BPP_AI_MONTHLY_BUDGET_PLN = "100" + baker.make(AISearchQuery, cost_pln=Decimal("2")) + status = budget.check_budget() + assert status.ok is True + + +@pytest.mark.django_db +def test_blocks_when_daily_exceeded(settings): + settings.BPP_AI_DAILY_BUDGET_PLN = "5" + settings.BPP_AI_MONTHLY_BUDGET_PLN = "100" + baker.make(AISearchQuery, cost_pln=Decimal("6")) + status = budget.check_budget() + assert status.ok is False + assert "dzien" in status.reason.lower() or "dzień" in status.reason.lower() + + +@pytest.mark.django_db +def test_blocks_when_monthly_exceeded(settings): + settings.BPP_AI_DAILY_BUDGET_PLN = "1000" + settings.BPP_AI_MONTHLY_BUDGET_PLN = "5" + baker.make(AISearchQuery, cost_pln=Decimal("6")) + status = budget.check_budget() + assert status.ok is False + assert "mies" in status.reason.lower() +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_budget.py -v` +Expected: FAIL. + +- [ ] **Step 3: Implementacja** + +`src/ai_search/budget.py`: +```python +from dataclasses import dataclass +from decimal import Decimal +from typing import Optional + +from django.conf import settings +from django.db.models import Sum +from django.utils import timezone + +from ai_search.models import AISearchQuery + + +@dataclass +class BudgetStatus: + ok: bool + reason: Optional[str] = None + + +def _sum_since(dt) -> Decimal: + agg = AISearchQuery.objects.filter(created__gte=dt).aggregate(s=Sum("cost_pln")) + return agg["s"] or Decimal("0") + + +def spent_today() -> Decimal: + now = timezone.localtime() + start = now.replace(hour=0, minute=0, second=0, microsecond=0) + return _sum_since(start) + + +def spent_this_month() -> Decimal: + now = timezone.localtime() + start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) + return _sum_since(start) + + +def check_budget() -> BudgetStatus: + """Twardy blok, gdy dzienny lub miesięczny budżet PLN jest wyczerpany.""" + daily = Decimal(str(settings.BPP_AI_DAILY_BUDGET_PLN)) + monthly = Decimal(str(settings.BPP_AI_MONTHLY_BUDGET_PLN)) + if spent_today() >= daily: + return BudgetStatus( + ok=False, + reason="Dzienny limit kosztów AI został osiągnięty. " + "Spróbuj jutro lub użyj „szukaj zapytaniem”.", + ) + if spent_this_month() >= monthly: + return BudgetStatus( + ok=False, + reason="Miesięczny limit kosztów AI został osiągnięty. " + "Użyj „szukaj zapytaniem”.", + ) + return BudgetStatus(ok=True) +``` + +- [ ] **Step 4: Uruchom — ma przejść** + +Run: `uv run pytest src/ai_search/tests/test_budget.py -v` +Expected: PASS (3). + +- [ ] **Step 5: Commit** + +```bash +git add src/ai_search/budget.py src/ai_search/tests/test_budget.py +git commit -m "feat(ai-search): guard budzetowy (dzienny/miesieczny PLN, twardy blok)" +``` + +--- + +## Task 11: Widok + formularz + URL + szablon (redirect flow) + +**Files:** +- Create: `src/ai_search/forms.py`, `src/ai_search/views.py`, `src/ai_search/urls.py`, `src/ai_search/templates/ai_search/zapytanie_ai.html` +- Modify: `src/django_bpp/urls.py` (include) +- Test: `src/ai_search/tests/test_views.py` + +**Interfaces:** +- Consumes: `translator.translate`, `budget.check_budget`, `pricing.cost_usd_from_usage`, `fx.usd_to_pln_rate`, `AISearchQuery`, `WprowadzanieDanychOrSuperuserMixin`, `MODEL_CHOICES`, reverse `bpp:zapytanie`. +- Produces: URL `ai_search:index` (GET: formularz; POST: budżet→translate→log→redirect/render). Redirect: `bpp:zapytanie?model=&query=`; pytanie PL w `request.session["ai_search_last_question"]`. + +- [ ] **Step 1: Testy widoku (TDD, mock translatora)** + +`src/ai_search/tests/test_views.py`: +```python +from decimal import Decimal +from unittest import mock + +import pytest +from django.urls import reverse +from model_bakery import baker + +from ai_search import translator +from ai_search.models import AISearchQuery + + +@pytest.fixture +def staff_client(client, django_user_model): + u = django_user_model.objects.create_user( + username="ed", password="x", is_staff=True, is_superuser=True + ) + client.force_login(u) + return client + + +@pytest.mark.django_db +def test_anonymous_denied(client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + r = client.get(reverse("ai_search:index")) + assert r.status_code in (302, 403) + + +@pytest.mark.django_db +def test_get_form_visible_for_staff(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + r = staff_client.get(reverse("ai_search:index")) + assert r.status_code == 200 + + +@pytest.mark.django_db +def test_post_success_redirects_to_zapytanie(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + res = translator.TranslationResult( + query="rok = 2024", usage={"input_tokens": 10, "output_tokens": 5}, attempts=1 + ) + with mock.patch("ai_search.views.translator.translate", return_value=res), \ + mock.patch("ai_search.views.fx.usd_to_pln_rate", return_value=Decimal("4.1")): + r = staff_client.post( + reverse("ai_search:index"), + {"model": "rekord", "pytanie": "publikacje z 2024"}, + ) + assert r.status_code == 302 + assert reverse("bpp:zapytanie") in r.url + assert "query=rok" in r.url.replace("%20", " ") or "rok" in r.url + log = AISearchQuery.objects.get() + assert log.success is True + assert log.cost_pln > 0 + + +@pytest.mark.django_db +def test_post_blocked_by_budget(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + settings.BPP_AI_DAILY_BUDGET_PLN = "0" + r = staff_client.post( + reverse("ai_search:index"), + {"model": "rekord", "pytanie": "cokolwiek"}, + ) + assert r.status_code == 200 + assert b"limit" in r.content.lower() + assert AISearchQuery.objects.count() == 0 + + +@pytest.mark.django_db +def test_post_null_query_shows_error(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + res = translator.TranslationResult( + query=None, error="pytanie nieostre", usage={"input_tokens": 5}, attempts=1 + ) + with mock.patch("ai_search.views.translator.translate", return_value=res), \ + mock.patch("ai_search.views.fx.usd_to_pln_rate", return_value=Decimal("4.1")): + r = staff_client.post( + reverse("ai_search:index"), + {"model": "rekord", "pytanie": "najlepsze prace"}, + ) + assert r.status_code == 200 + assert "nieostre" in r.content.decode() + assert AISearchQuery.objects.get().success is False +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_views.py -v` +Expected: FAIL (NoReverseMatch / brak modułów). + +- [ ] **Step 3: Formularz** + +`src/ai_search/forms.py`: +```python +from django import forms + +from bpp.views.zapytanie import MODEL_CHOICES, MODEL_REKORD + + +class AISearchForm(forms.Form): + model = forms.ChoiceField( + choices=MODEL_CHOICES, + widget=forms.RadioSelect, + initial=MODEL_REKORD, + label="Model do przeszukania", + ) + pytanie = forms.CharField( + label="Zadaj pytanie po polsku", + widget=forms.Textarea( + attrs={ + "rows": 3, + "placeholder": "np. publikacje z 2024 roku autora Kowalskiego", + "autocomplete": "off", + } + ), + ) +``` + +- [ ] **Step 4: Widok** + +`src/ai_search/views.py`: +```python +import logging +from datetime import date +from decimal import Decimal +from urllib.parse import urlencode + +import rollbar +from django.conf import settings +from django.http import Http404, HttpResponseRedirect +from django.urls import reverse +from django.views.generic import FormView + +from bpp.views.zapytanie import WprowadzanieDanychOrSuperuserMixin + +from ai_search import budget, fx, pricing, translator +from ai_search.forms import AISearchForm +from ai_search.models import AISearchQuery + +logger = logging.getLogger(__name__) + + +class ZapytanieAIView(WprowadzanieDanychOrSuperuserMixin, FormView): + template_name = "ai_search/zapytanie_ai.html" + form_class = AISearchForm + + def dispatch(self, request, *args, **kwargs): + if not settings.BPP_AI_SEARCH_ENABLED: + raise Http404("Wyszukiwanie AI jest wyłączone.") + return super().dispatch(request, *args, **kwargs) + + def form_valid(self, form): + model_key = form.cleaned_data["model"] + pytanie = form.cleaned_data["pytanie"].strip() + + status = budget.check_budget() + if not status.ok: + return self.render_to_response( + self.get_context_data(form=form, blad=status.reason) + ) + + try: + result = translator.translate(pytanie, model_key) + except Exception: # błędy SDK/sieci — log + generyczny komunikat + rollbar.report_exc_info() + logger.exception("Błąd tłumaczenia AI") + return self.render_to_response( + self.get_context_data( + form=form, + blad="Usługa AI jest chwilowo niedostępna. Spróbuj później " + "lub użyj „szukaj zapytaniem”.", + ) + ) + + self._log(result, model_key, pytanie) + + if result.query: + self.request.session["ai_search_last_question"] = pytanie + params = urlencode({"model": model_key, "query": result.query}) + return HttpResponseRedirect(f"{reverse('bpp:zapytanie')}?{params}") + + return self.render_to_response( + self.get_context_data( + form=form, + blad=result.error or "Nie udało się przetłumaczyć pytania.", + wygenerowany_query=result.query, + ) + ) + + def _log(self, result, model_key, pytanie): + rate = fx.usd_to_pln_rate() + try: + cost_usd = pricing.cost_usd_from_usage( + result.usage, settings.BPP_AI_MODEL, date.today() + ) + except KeyError: + rollbar.report_exc_info() + logger.error("Brak ceny dla modelu %s — koszt nieznany", settings.BPP_AI_MODEL) + cost_usd = Decimal("0") + AISearchQuery.objects.create( + user=self.request.user if self.request.user.is_authenticated else None, + model=settings.BPP_AI_MODEL, + pytanie=pytanie, + wygenerowany_query=result.query or "", + wybrany_model_danych=model_key, + input_tokens=result.usage.get("input_tokens", 0), + output_tokens=result.usage.get("output_tokens", 0), + cache_read_tokens=result.usage.get("cache_read_tokens", 0), + cache_write_tokens=result.usage.get("cache_write_tokens", 0), + cost_usd=cost_usd, + fx_rate=rate, + cost_pln=(cost_usd * rate).quantize(Decimal("0.0001")), + success=bool(result.query), + error=result.error, + retried=result.retried, + ) +``` + +- [ ] **Step 5: URL apki + include w root** + +`src/ai_search/urls.py`: +```python +from django.urls import path + +from ai_search.views import ZapytanieAIView + +app_name = "ai_search" + +urlpatterns = [ + path("", ZapytanieAIView.as_view(), name="index"), +] +``` +W `src/django_bpp/urls.py` dodaj do listy tras (obok innych `include`): +```python + path( + "ai-search/", + include(("ai_search.urls", "ai_search"), namespace="ai_search"), + ), +``` + +- [ ] **Step 6: Szablon** + +`src/ai_search/templates/ai_search/zapytanie_ai.html`: +```django +{% extends "base.html" %} +{% block content %} +
+
+

Szukaj przez sztuczną inteligencję

+

Zadaj pytanie po polsku — zamienimy je na zapytanie i pokażemy wyniki.

+ + {% if blad %} + + {% endif %} + {% if wygenerowany_query %} +
+ Wygenerowane zapytanie: {{ wygenerowany_query }} +
+ {% endif %} + +
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+ +{% endblock %} +``` +(Jeśli `base.html` ma inną nazwę bloku niż `content` — dopasuj do wzoru z `bpp/zapytanie.html`.) + +- [ ] **Step 7: Uruchom testy widoku** + +Run: `uv run pytest src/ai_search/tests/test_views.py -v` +Expected: PASS (5). + +- [ ] **Step 8: Commit** + +```bash +git add src/ai_search/forms.py src/ai_search/views.py src/ai_search/urls.py \ + src/ai_search/templates/ src/django_bpp/urls.py src/ai_search/tests/test_views.py +git commit -m "feat(ai-search): widok+formularz+URL+szablon (budzet, log, redirect na zapytanie)" +``` + +--- + +## Task 12: Integracja z menu top-bar + +**Files:** +- Modify: `src/django_bpp/templates/top_bar.html:34-41` +- Test: `src/ai_search/tests/test_menu.py` + +**Interfaces:** +- Consumes: filtr `can_use_query_editor`, `settings.BPP_AI_SEARCH_ENABLED`, `ai_search:index`. + +- [ ] **Step 1: Test obecności/gate pozycji menu** + +`src/ai_search/tests/test_menu.py`: +```python +import pytest +from django.urls import reverse + + +@pytest.fixture +def staff_client(client, django_user_model): + u = django_user_model.objects.create_user( + username="ed", password="x", is_staff=True, is_superuser=True + ) + client.force_login(u) + return client + + +@pytest.mark.django_db +def test_menu_item_shown_when_enabled(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = True + r = staff_client.get("/") + assert reverse("ai_search:index") in r.content.decode() + + +@pytest.mark.django_db +def test_menu_item_hidden_when_disabled(staff_client, settings): + settings.BPP_AI_SEARCH_ENABLED = False + r = staff_client.get("/") + assert reverse("ai_search:index") not in r.content.decode() +``` + +- [ ] **Step 2: Uruchom — ma paść** + +Run: `uv run pytest src/ai_search/tests/test_menu.py -v` +Expected: FAIL (linku brak). + +- [ ] **Step 3: Udostępnij flagę w kontekście szablonu** + +Sprawdź, czy `BPP_AI_SEARCH_ENABLED` jest widoczne w szablonach. Jeśli jest context processor eksponujący `settings` (poszukaj `context_processors` w `settings/base.py`) — użyj go. W przeciwnym razie dodaj lekki context processor: +`src/ai_search/context_processors.py`: +```python +from django.conf import settings + + +def ai_search_flags(request): + return {"BPP_AI_SEARCH_ENABLED": settings.BPP_AI_SEARCH_ENABLED} +``` +i dopisz `"ai_search.context_processors.ai_search_flags"` do `TEMPLATES[0]["OPTIONS"]["context_processors"]` w `base.py`. + +- [ ] **Step 4: Dodaj pozycję menu** + +W `src/django_bpp/templates/top_bar.html`, wewnątrz `
  • diff --git a/src/django_bpp/urls.py b/src/django_bpp/urls.py index 20768cd39..e6aad055a 100644 --- a/src/django_bpp/urls.py +++ b/src/django_bpp/urls.py @@ -225,6 +225,10 @@ def protected_media_serve(request, path, document_root=None): include(("nowe_raporty.urls", "nowe_raporty"), namespace="nowe_raporty"), ), path("raport_slotow/", include("raport_slotow.urls")), + path( + "ai-search/", + include(("ai_search.urls", "ai_search"), namespace="ai_search"), + ), url(r"^bpp/", include(("bpp.urls", "bpp"), namespace="bpp")), url(r"^oswiadczenia/", include("oswiadczenia.urls", namespace="oswiadczenia")), path( diff --git a/uv.lock b/uv.lock index d03df7e50..390d8c3fa 100644 --- a/uv.lock +++ b/uv.lock @@ -50,21 +50,49 @@ name = "amqp" version = "5.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "vine" }, + { name = "vine", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/79/fc/ec94a357dfc6683d8c86f8b4cfa5416a4c36b28052ec8260c77aca96a443/amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432", size = 129013, upload-time = "2024-11-12T19:55:44.051Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/26/99/fc813cd978842c26c82534010ea849eee9ab3a13ea2b74e95cb9c99e747b/amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", size = 50944, upload-time = "2024-11-12T19:55:41.782Z" }, ] +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anthropic" +version = "0.120.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "distro", marker = "platform_python_implementation != 'PyPy'" }, + { name = "docstring-parser", marker = "platform_python_implementation != 'PyPy'" }, + { name = "httpx", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jiter", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydantic", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sniffio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/10/4ca013cb166f226bd89e0aeb0fcaff94f45ddf716d4925ce89475d3c587b/anthropic-0.120.2.tar.gz", hash = "sha256:9722efc10c27a30a69f5338ddacdb35bc6a64297a4e4ba729bf83af873d5fb3a", size = 1008421, upload-time = "2026-07-28T17:38:26.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/af/0f5db57b9397a0f3b7fc204cbef143401a7cadaf982330f97f1ce3d39f34/anthropic-0.120.2-py3-none-any.whl", hash = "sha256:0f0bc2b381dc0eb41c8d886b815d79c2041cd2374f83aed36f574b6dc9c579c1", size = 1022851, upload-time = "2026-07-28T17:38:25.466Z" }, +] + [[package]] name = "anyio" version = "4.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "idna", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sniffio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" } wheels = [ @@ -85,8 +113,8 @@ name = "arrow" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "python-dateutil" }, - { name = "tzdata" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzdata", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } wheels = [ @@ -143,10 +171,10 @@ name = "autobahn" version = "24.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "hyperlink" }, - { name = "setuptools" }, - { name = "txaio" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "hyperlink", marker = "platform_python_implementation != 'PyPy'" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "txaio", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/f2/8dffb3b709383ba5b47628b0cc4e43e8d12d59eecbddb62cfccac2e7cf6a/autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", size = 482700, upload-time = "2024-08-02T09:26:48.241Z" } wheels = [ @@ -176,8 +204,8 @@ name = "azure-core" version = "1.41.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, - { name = "typing-extensions" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a6/f3/b416179e408990df5db0d516283022dde0f5d0111d98c1a848e41853e81c/azure_core-1.41.0.tar.gz", hash = "sha256:f46ff5dfcd230f25cf1c19e8a34b8dc08a337b2503e268bb600a16c00db8ad5a", size = 381042, upload-time = "2026-05-07T23:30:54.302Z" } wheels = [ @@ -189,10 +217,10 @@ name = "azure-storage-blob" version = "12.29.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "azure-core" }, - { name = "cryptography" }, - { name = "isodate" }, - { name = "typing-extensions" }, + { name = "azure-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "isodate", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/25/fdcf1e381922dbab8ba23d6fd78d397fe6cbac6b480310218834b7bc91fe/azure_storage_blob-12.29.0.tar.gz", hash = "sha256:2824ddd7ebc9056034ebc76b17971a38e9aa5835abb0d565b9700493f2a6c657", size = 611359, upload-time = "2026-05-15T03:34:59.865Z" } wheels = [ @@ -292,8 +320,8 @@ name = "beautifulsoup4" version = "4.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, + { name = "soupsieve", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } wheels = [ @@ -305,7 +333,7 @@ name = "bibtexparser" version = "2.0.0b9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pylatexenc" }, + { name = "pylatexenc", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f4/37/e21f79f5116ad1fb92a8eb0e8a005cad59eb24660003982840daa6b9fafd/bibtexparser-2.0.0b9.tar.gz", hash = "sha256:bcddf796cfe321bb92c17c844ca65d81731fb753a1dd0e82bc76a9947aa0f360", size = 40435, upload-time = "2026-01-29T19:47:52.605Z" } wheels = [ @@ -326,7 +354,7 @@ name = "bleach" version = "6.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "webencodings" }, + { name = "webencodings", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } wheels = [ @@ -338,9 +366,9 @@ name = "boto3" version = "1.43.22" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "botocore" }, - { name = "jmespath" }, - { name = "s3transfer" }, + { name = "botocore", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jmespath", marker = "platform_python_implementation != 'PyPy'" }, + { name = "s3transfer", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/64/31/32388d5ec332ffe81d8f3650860f94b66294009172d188c390cad58c6f5f/boto3-1.43.22.tar.gz", hash = "sha256:2a7fe12d8e0731bb8aa7c1e59b4ccc770fda031b8659c2f6f497393bdcec3051", size = 113203, upload-time = "2026-06-03T19:33:13.39Z" } wheels = [ @@ -352,9 +380,9 @@ name = "botocore" version = "1.43.22" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jmespath" }, - { name = "python-dateutil" }, - { name = "urllib3" }, + { name = "jmespath", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/cf/840f1b8db16d45e3807c23d1ea779723eed1cd9cf3b6c49e16f372d2a777/botocore-1.43.22.tar.gz", hash = "sha256:b00de525e538289ed4a7a85263f1be4e47473c124cec87be6b23be49356bf745", size = 15458781, upload-time = "2026-06-03T19:33:02.882Z" } wheels = [ @@ -366,191 +394,194 @@ name = "bpp-iplweb" version = "202607.1398" source = { editable = "." } dependencies = [ - { name = "arrow" }, - { name = "babel" }, - { name = "beautifulsoup4" }, - { name = "bibtexparser" }, - { name = "celery" }, - { name = "celery-singleton" }, - { name = "channels", extra = ["daphne"] }, - { name = "channels-redis" }, - { name = "chardet" }, - { name = "crispy-bootstrap3" }, - { name = "crispy-bootstrap5" }, - { name = "crispy-forms-foundation" }, - { name = "crossrefapi" }, - { name = "cryptography" }, - { name = "cssmin" }, - { name = "dbfread" }, - { name = "dj-pagination" }, - { name = "django" }, - { name = "django-admin-sortable2" }, - { name = "django-admin-tools" }, - { name = "django-altcha" }, - { name = "django-autocomplete-light" }, - { name = "django-autoslug" }, - { name = "django-axes" }, - { name = "django-braces" }, - { name = "django-cacheops" }, - { name = "django-celery-email" }, - { name = "django-celery-results" }, - { name = "django-channels-broadcast" }, - { name = "django-classy-tags" }, - { name = "django-columns" }, - { name = "django-compressor" }, - { name = "django-constance" }, - { name = "django-cookie-law" }, - { name = "django-countdown" }, - { name = "django-crispy-forms" }, - { name = "django-dbtemplates-iplweb" }, - { name = "django-denorm-iplweb" }, - { name = "django-dirtyfields" }, - { name = "django-dsl" }, - { name = "django-dynamic-admin-columns" }, - { name = "django-easy-audit" }, - { name = "django-environ" }, - { name = "django-extensions" }, - { name = "django-favicon-plus-reloaded" }, - { name = "django-filter" }, - { name = "django-first-run-wizard" }, - { name = "django-flexible-reports" }, - { name = "django-formdefaults" }, - { name = "django-formtools" }, - { name = "django-fsm-2" }, - { name = "django-grappelli" }, - { name = "django-group-by" }, - { name = "django-import-export" }, - { name = "django-liveops", extra = ["celery"] }, - { name = "django-loginas" }, - { name = "django-messages-extends" }, - { name = "django-minify-html" }, - { name = "django-model-utils" }, - { name = "django-mptt" }, - { name = "django-multiseek" }, - { name = "django-oauth-toolkit" }, - { name = "django-password-policies-iplweb" }, - { name = "django-pbn-client" }, - { name = "django-pg-baseline" }, - { name = "django-polish-inflection" }, - { name = "django-prometheus" }, - { name = "django-querysetsequence" }, - { name = "django-redis-iplweb" }, - { name = "django-reversion" }, - { name = "django-reversion-compare" }, - { name = "django-sendfile2" }, - { name = "django-session-security" }, - { name = "django-site-blog" }, - { name = "django-soft-delete" }, - { name = "django-static-sitemaps" }, - { name = "django-tables2" }, - { name = "django-tabular-permissions" }, - { name = "django-taggit" }, - { name = "django-templated-email" }, - { name = "django-tinymce" }, - { name = "django-weasyprint" }, - { name = "django-webmaster-verification" }, - { name = "djangoql-iplweb" }, - { name = "djangorestframework" }, - { name = "dspace-rest-client" }, - { name = "gunicorn" }, - { name = "isbnlib" }, - { name = "langdetect" }, - { name = "markdown" }, - { name = "moai-iplweb" }, - { name = "mozilla-django-oidc" }, - { name = "nh3" }, - { name = "numpy" }, - { name = "openpyxl" }, - { name = "ortools" }, - { name = "pandas" }, - { name = "pathspec" }, - { name = "pbn-client" }, - { name = "pillow" }, - { name = "psycopg2-binary" }, - { name = "pygad" }, - { name = "pymed-iplweb" }, - { name = "pyoai" }, - { name = "pypandoc" }, - { name = "python-dateutil" }, - { name = "python-docx" }, - { name = "questionary" }, - { name = "requests" }, - { name = "requests-oauthlib" }, - { name = "rjsmin" }, - { name = "rollbar" }, - { name = "simplejson" }, - { name = "sqlparse" }, - { name = "tablib" }, - { name = "thefuzz" }, - { name = "tqdm" }, - { name = "twisted", extra = ["http2", "tls"] }, - { name = "unidecode" }, - { name = "urllib3" }, - { name = "uvicorn", extra = ["standard"] }, - { name = "uvicorn-worker" }, - { name = "watchdog" }, - { name = "weasyprint" }, - { name = "wosclient" }, - { name = "xhtml2pdf" }, - { name = "xlrd" }, + { name = "anthropic", marker = "platform_python_implementation != 'PyPy'" }, + { name = "arrow", marker = "platform_python_implementation != 'PyPy'" }, + { name = "babel", marker = "platform_python_implementation != 'PyPy'" }, + { name = "beautifulsoup4", marker = "platform_python_implementation != 'PyPy'" }, + { name = "bibtexparser", marker = "platform_python_implementation != 'PyPy'" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "celery-singleton", marker = "platform_python_implementation != 'PyPy'" }, + { name = "channels", extra = ["daphne"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "channels-redis", marker = "platform_python_implementation != 'PyPy'" }, + { name = "chardet", marker = "platform_python_implementation != 'PyPy'" }, + { name = "crispy-bootstrap3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "crispy-bootstrap5", marker = "platform_python_implementation != 'PyPy'" }, + { name = "crispy-forms-foundation", marker = "platform_python_implementation != 'PyPy'" }, + { name = "crossrefapi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cssmin", marker = "platform_python_implementation != 'PyPy'" }, + { name = "dbfread", marker = "platform_python_implementation != 'PyPy'" }, + { name = "dj-pagination", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-admin-sortable2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-admin-tools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-altcha", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-autocomplete-light", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-autoslug", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-axes", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-braces", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-cacheops", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-celery-email", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-celery-results", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-channels-broadcast", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-classy-tags", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-columns", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-compressor", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-constance", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-cookie-law", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-countdown", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-crispy-forms", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dbtemplates-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-denorm-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dirtyfields", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dsl", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dynamic-admin-columns", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-easy-audit", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-environ", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-extensions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-favicon-plus-reloaded", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-filter", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-first-run-wizard", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-flexible-reports", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-formdefaults", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-formtools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-fsm-2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-grappelli", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-group-by", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-import-export", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-liveops", extra = ["celery"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-loginas", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-messages-extends", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-minify-html", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-model-utils", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-mptt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-multiseek", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-oauth-toolkit", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-password-policies-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-pbn-client", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-pg-baseline", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-polish-inflection", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-prometheus", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-querysetsequence", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-redis-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-reversion", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-reversion-compare", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-sendfile2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-session-security", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-site-blog", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-soft-delete", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-static-sitemaps", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-tables2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-tabular-permissions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-taggit", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-templated-email", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-tinymce", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-weasyprint", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-webmaster-verification", marker = "platform_python_implementation != 'PyPy'" }, + { name = "djangoql-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "djangorestframework", marker = "platform_python_implementation != 'PyPy'" }, + { name = "dspace-rest-client", marker = "platform_python_implementation != 'PyPy'" }, + { name = "gunicorn", marker = "platform_python_implementation != 'PyPy'" }, + { name = "isbnlib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "langdetect", marker = "platform_python_implementation != 'PyPy'" }, + { name = "markdown", marker = "platform_python_implementation != 'PyPy'" }, + { name = "moai-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "mozilla-django-oidc", marker = "platform_python_implementation != 'PyPy'" }, + { name = "nh3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "numpy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "openai", marker = "platform_python_implementation != 'PyPy'" }, + { name = "openpyxl", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ortools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pandas", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pathspec", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pbn-client", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pillow", marker = "platform_python_implementation != 'PyPy'" }, + { name = "psycopg2-binary", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pygad", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pymed-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyoai", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pypandoc", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-docx", marker = "platform_python_implementation != 'PyPy'" }, + { name = "questionary", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests-oauthlib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rjsmin", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rollbar", marker = "platform_python_implementation != 'PyPy'" }, + { name = "simplejson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sqlparse", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tablib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "thefuzz", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tqdm", marker = "platform_python_implementation != 'PyPy'" }, + { name = "twisted", extra = ["http2", "tls"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "unidecode", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "uvicorn", extra = ["standard"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "uvicorn-worker", marker = "platform_python_implementation != 'PyPy'" }, + { name = "watchdog", marker = "platform_python_implementation != 'PyPy'" }, + { name = "weasyprint", marker = "platform_python_implementation != 'PyPy'" }, + { name = "wosclient", marker = "platform_python_implementation != 'PyPy'" }, + { name = "xhtml2pdf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "xlrd", marker = "platform_python_implementation != 'PyPy'" }, ] [package.optional-dependencies] baseline-rebuild = [ - { name = "testcontainers" }, + { name = "testcontainers", marker = "platform_python_implementation != 'PyPy'" }, ] ldap = [ - { name = "django-auth-ldap" }, + { name = "django-auth-ldap", marker = "platform_python_implementation != 'PyPy'" }, ] office365 = [ - { name = "django-microsoft-auth" }, + { name = "django-microsoft-auth", marker = "platform_python_implementation != 'PyPy'" }, ] [package.dev-dependencies] dev = [ - { name = "bumpver" }, - { name = "django-debug-toolbar" }, - { name = "django-dev-helpers" }, - { name = "django-dynamic-fixture" }, - { name = "django-run-site" }, - { name = "django-webtest" }, - { name = "djlint" }, - { name = "ipdb" }, - { name = "ipython" }, - { name = "model-bakery" }, - { name = "nest-asyncio" }, - { name = "playwright" }, - { name = "pre-commit" }, - { name = "psutil" }, - { name = "pyparsing" }, - { name = "pytest" }, - { name = "pytest-cov" }, - { name = "pytest-django" }, - { name = "pytest-env" }, - { name = "pytest-httpserver" }, - { name = "pytest-mock" }, - { name = "pytest-playwright" }, - { name = "pytest-recording" }, - { name = "pytest-repeat" }, - { name = "pytest-rerunfailures" }, - { name = "pytest-split" }, - { name = "pytest-testcontainers" }, - { name = "pytest-testcontainers-django" }, - { name = "pytest-timeout" }, - { name = "pytest-tqdm" }, - { name = "pytest-xdist" }, - { name = "ruff" }, - { name = "testcontainers" }, - { name = "towncrier" }, - { name = "twine" }, - { name = "vcrpy" }, - { name = "vulture" }, - { name = "webtest" }, - { name = "werkzeug" }, + { name = "bumpver", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-debug-toolbar", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dev-helpers", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dynamic-fixture", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-run-site", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-webtest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "djlint", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ipdb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ipython", marker = "platform_python_implementation != 'PyPy'" }, + { name = "model-bakery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "nest-asyncio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "playwright", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pre-commit", marker = "platform_python_implementation != 'PyPy'" }, + { name = "psutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyparsing", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-cov", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-env", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-httpserver", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-mock", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-playwright", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-recording", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-repeat", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-rerunfailures", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-split", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-testcontainers", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-testcontainers-django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-timeout", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-tqdm", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-xdist", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ruff", marker = "platform_python_implementation != 'PyPy'" }, + { name = "testcontainers", marker = "platform_python_implementation != 'PyPy'" }, + { name = "towncrier", marker = "platform_python_implementation != 'PyPy'" }, + { name = "twine", marker = "platform_python_implementation != 'PyPy'" }, + { name = "vcrpy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "vulture", marker = "platform_python_implementation != 'PyPy'" }, + { name = "webtest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "werkzeug", marker = "platform_python_implementation != 'PyPy'" }, ] [package.metadata] requires-dist = [ + { name = "anthropic", specifier = ">=0.40" }, { name = "arrow", specifier = ">=1.3,<2" }, { name = "babel", specifier = ">=2.17" }, { name = "beautifulsoup4", specifier = ">=4.15.0" }, @@ -647,6 +678,7 @@ requires-dist = [ { name = "mozilla-django-oidc", specifier = ">=5.0.2,<6" }, { name = "nh3", specifier = ">=0.3.6" }, { name = "numpy", specifier = ">=2.4.6" }, + { name = "openai", specifier = ">=1.50" }, { name = "openpyxl", specifier = ">=3.1.5" }, { name = "ortools", specifier = ">=9.15.6755" }, { name = "pandas", specifier = ">=3.0.5" }, @@ -780,7 +812,7 @@ name = "brotlicffi" version = "1.1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/95/9d/70caa61192f570fcf0352766331b735afa931b4c6bc9a348a0925cc13288/brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13", size = 465192, upload-time = "2023-09-14T14:22:40.707Z" } wheels = [ @@ -797,10 +829,10 @@ name = "bumpver" version = "2026.1132" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "colorama" }, - { name = "lexid" }, - { name = "toml" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "colorama", marker = "platform_python_implementation != 'PyPy'" }, + { name = "lexid", marker = "platform_python_implementation != 'PyPy'" }, + { name = "toml", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/22/c0c9bf9e7ad6877e4c7c3dedd464e390d9fadb8927c61d6d77547eb17539/bumpver-2026.1132.tar.gz", hash = "sha256:80b223c23fca9bc9dd569b7a44680949d34bee23a738860d9a9b36f1abe3b0e0", size = 116784, upload-time = "2026-05-22T18:40:32.333Z" } wheels = [ @@ -812,15 +844,15 @@ name = "celery" version = "5.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "billiard" }, - { name = "click" }, - { name = "click-didyoumean" }, - { name = "click-plugins" }, - { name = "click-repl" }, - { name = "kombu" }, - { name = "python-dateutil" }, - { name = "tzlocal" }, - { name = "vine" }, + { name = "billiard", marker = "platform_python_implementation != 'PyPy'" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "click-didyoumean", marker = "platform_python_implementation != 'PyPy'" }, + { name = "click-plugins", marker = "platform_python_implementation != 'PyPy'" }, + { name = "click-repl", marker = "platform_python_implementation != 'PyPy'" }, + { name = "kombu", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzlocal", marker = "platform_python_implementation != 'PyPy'" }, + { name = "vine", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e8/b4/a1233943ab5c8ea05fb877a88a0a0622bf47444b99e4991a8045ac37ea1d/celery-5.6.3.tar.gz", hash = "sha256:177006bd2054b882e9f01be59abd8529e88879ef50d7918a7050c5a9f4e12912", size = 1742243, upload-time = "2026-03-26T12:14:51.76Z" } wheels = [ @@ -832,8 +864,8 @@ name = "celery-singleton" version = "0.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "celery" }, - { name = "redis" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "redis", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/23/f0/ef4c769215086812a9e968bf9309fbd90bfe663d5175742e9386e1e1e052/celery-singleton-0.3.1.tar.gz", hash = "sha256:260ce4978e631f8682ea0ccb03d7f3b87d42bc20e04e9bd46ddb78a2f8035d1e", size = 4659, upload-time = "2021-01-14T16:23:40.801Z" } wheels = [ @@ -854,7 +886,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -933,8 +965,8 @@ name = "channels" version = "4.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "django" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/92/b18d4bb54d14986a8b35215a1c9e6a7f9f4d57ca63ac9aee8290ebb4957d/channels-4.3.2.tar.gz", hash = "sha256:f2bb6bfb73ad7fb4705041d07613c7b4e69528f01ef8cb9fb6c21d9295f15667", size = 27023, upload-time = "2025-11-20T15:13:05.102Z" } wheels = [ @@ -943,7 +975,7 @@ wheels = [ [package.optional-dependencies] daphne = [ - { name = "daphne" }, + { name = "daphne", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -951,10 +983,10 @@ name = "channels-redis" version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "channels" }, - { name = "msgpack" }, - { name = "redis" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "channels", marker = "platform_python_implementation != 'PyPy'" }, + { name = "msgpack", marker = "platform_python_implementation != 'PyPy'" }, + { name = "redis", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/69/fd3407ad407a80e72ca53850eb7a4c306273e67d5bbb71a86d0e6d088439/channels_redis-4.3.0.tar.gz", hash = "sha256:740ee7b54f0e28cf2264a940a24453d3f00526a96931f911fcb69228ef245dd2", size = 31440, upload-time = "2025-07-22T13:48:46.087Z" } wheels = [ @@ -1076,7 +1108,7 @@ name = "click" version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, ] 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 = [ @@ -1088,7 +1120,7 @@ name = "click-didyoumean" version = "0.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/30/ce/217289b77c590ea1e7c24242d9ddd6e249e52c795ff10fac2c50062c48cb/click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463", size = 3089, upload-time = "2024-03-24T08:22:07.499Z" } wheels = [ @@ -1100,7 +1132,7 @@ name = "click-plugins" version = "1.1.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c3/a4/34847b59150da33690a36da3681d6bbc2ec14ee9a846bc30a6746e5984e4/click_plugins-1.1.1.2.tar.gz", hash = "sha256:d7af3984a99d243c131aa1a828331e7630f4a88a9741fd05c927b204bcf92261", size = 8343, upload-time = "2025-06-25T00:47:37.555Z" } wheels = [ @@ -1112,8 +1144,8 @@ name = "click-repl" version = "0.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "prompt-toolkit" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "prompt-toolkit", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/a2/57f4ac79838cfae6912f997b4d1a64a858fb0c86d7fcaae6f7b58d267fca/click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9", size = 10449, upload-time = "2023-06-15T12:43:51.141Z" } wheels = [ @@ -1248,7 +1280,7 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version <= '3.11' and platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -1256,8 +1288,8 @@ name = "crispy-bootstrap3" version = "2024.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-crispy-forms" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-crispy-forms", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/80/ca6242629ea7405b4d6deb206f94dc3e2bff355ba139e94827f3be944eff/crispy-bootstrap3-2024.1.tar.gz", hash = "sha256:343c696ae1a854ac0ccad25e9e7d782400783034220a11aa179d1d799acf6161", size = 29205, upload-time = "2024-01-13T09:04:54.782Z" } wheels = [ @@ -1269,8 +1301,8 @@ name = "crispy-bootstrap5" version = "2026.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-crispy-forms" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-crispy-forms", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/e8/05e1170f6b8fbfe4098392bdca813c2094659853a438919234d4663009b1/crispy_bootstrap5-2026.3.tar.gz", hash = "sha256:e7f5adb36acfbb456444c46e82c436931c796c539e9c620be4fa9dc9c9d6679c", size = 23452, upload-time = "2026-03-01T10:08:00.459Z" } wheels = [ @@ -1282,8 +1314,8 @@ name = "crispy-forms-foundation" version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-crispy-forms" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-crispy-forms", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/46/a3/baf46ed6d9a160444f50e579892bdfab97375142eb1dbec3ffcd49305079/crispy_forms_foundation-1.1.0.tar.gz", hash = "sha256:5f4544787277599e281964c0a5ffdac1d606613bd7bf4ce50a60554dd9eb3100", size = 21214, upload-time = "2025-07-16T01:09:39.086Z" } @@ -1292,9 +1324,9 @@ name = "crossrefapi" version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ipython" }, - { name = "requests" }, - { name = "urllib3" }, + { name = "ipython", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f7/c7/bd020af76301bfede41869b3c18f3efb6fac7dd064371d2a9956bc3306c4/crossrefapi-1.7.0.tar.gz", hash = "sha256:598f27a3cc1bd8d29770de284b0b1315c820de1d70894084945d5265e6fe2dae", size = 13444, upload-time = "2025-07-03T20:39:49.223Z" } wheels = [ @@ -1306,7 +1338,7 @@ name = "cryptography" version = "50.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" } wheels = [ @@ -1362,9 +1394,9 @@ name = "cssbeautifier" version = "1.15.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "editorconfig" }, - { name = "jsbeautifier" }, - { name = "six" }, + { name = "editorconfig", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jsbeautifier", marker = "platform_python_implementation != 'PyPy'" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f7/01/fdf41c1e5f93d359681976ba10410a04b299d248e28ecce1d4e88588dde4/cssbeautifier-1.15.4.tar.gz", hash = "sha256:9bb08dc3f64c101a01677f128acf01905914cf406baf87434dcde05b74c0acf5", size = 25376, upload-time = "2025-02-27T17:53:51.341Z" } wheels = [ @@ -1382,8 +1414,8 @@ name = "cssselect2" version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tinycss2" }, - { name = "webencodings" }, + { name = "tinycss2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "webencodings", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } wheels = [ @@ -1395,9 +1427,9 @@ name = "daphne" version = "4.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "autobahn" }, - { name = "twisted", extra = ["tls"] }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "autobahn", marker = "platform_python_implementation != 'PyPy'" }, + { name = "twisted", extra = ["tls"], marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/64/d3/65ff32c01cc64d44441b038dbb7cfb0c6a5507a1c937b3d41bd99af7bdc4/daphne-4.2.2.tar.gz", hash = "sha256:6c3527d4ce32630ae054dfb0ef5578e9a35d2f39f0ebcd02ef4f9129a121ce8d", size = 47601, upload-time = "2026-06-03T10:53:13.31Z" } wheels = [ @@ -1440,6 +1472,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + [[package]] name = "dj-pagination" version = "2.5.0" @@ -1454,9 +1495,9 @@ name = "django" version = "5.2.16" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "sqlparse" }, - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sqlparse", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzdata", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/26/889449d521ae508b26de715954faecd8bcf3f740affb81b2d146a83b42a5/django-5.2.16.tar.gz", hash = "sha256:59ea02020c3136fce14bef0bbece21a10a4febef5eed1c51c22ae468efa22200", size = 10890894, upload-time = "2026-07-07T13:52:17.005Z" } wheels = [ @@ -1468,7 +1509,7 @@ name = "django-admin-sortable2" version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e2/09/cc2d19412e47aaf627f54f9b5b544de73553bd71e25d417dd62e91b36edd/django_admin_sortable2-2.3.1.tar.gz", hash = "sha256:e397d08606f9e0da73e52661b841021ecab21be6f74783408e625ccddfe975af", size = 67497, upload-time = "2026-01-22T14:20:29.049Z" } wheels = [ @@ -1489,8 +1530,8 @@ name = "django-altcha" version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "altcha" }, - { name = "django" }, + { name = "altcha", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/7d/c77f7a0b6aac8d08d27c0e7de98217c37413bdc641c496c228076875a645/django_altcha-1.0.0.tar.gz", hash = "sha256:06a4f437b086a0c296b53e02dbd7f783ce07972150b8238dbae6da8cfb284efa", size = 61790, upload-time = "2026-04-21T10:40:57.301Z" } wheels = [ @@ -1502,7 +1543,7 @@ name = "django-appconf" version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/a9/dcf95ff3fa0620b6818fc02276fbbb8926e7f286039b6d015e56e8b7af39/django-appconf-1.1.0.tar.gz", hash = "sha256:9fcead372f82a0f21ee189434e7ae9c007cbb29af1118c18251720f3d06243e4", size = 15986, upload-time = "2025-02-13T16:09:40.258Z" } wheels = [ @@ -1514,8 +1555,8 @@ name = "django-auth-ldap" version = "5.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "python-ldap" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-ldap", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a6/6d/d3ceb4b49e7153811a4b2d92bbe198a5ef2e2820469add3d6dc129ef2fab/django_auth_ldap-5.3.0.tar.gz", hash = "sha256:743d8107b146240b46f7e97207dc06cb11facc0cd70dce490b7ca09dd5643d19", size = 55272, upload-time = "2025-12-26T15:00:14.272Z" } wheels = [ @@ -1527,7 +1568,7 @@ name = "django-autocomplete-light" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5d/ca/1288c2c7597484340c6ba5e3911c84b552511310633954d7aa496610e45a/django_autocomplete_light-5.0.0.tar.gz", hash = "sha256:115ee3541ee4a7ddd1b92396ea75d0f38d0b91899b0dc17259310975c728b32e", size = 117640, upload-time = "2026-06-18T01:43:28.909Z" } wheels = [ @@ -1548,8 +1589,8 @@ name = "django-axes" version = "8.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "django" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f0/b4/00c701a22d46288e3eb1340a1c141f5b4002572ce836a3e8d069f1e1de8a/django_axes-8.3.1.tar.gz", hash = "sha256:d57e923c0ba33cf45275253dd1313c3a3ff04bec686b38d677beb2b3d43c7bcd", size = 254715, upload-time = "2026-02-11T20:19:52.172Z" } wheels = [ @@ -1561,7 +1602,7 @@ name = "django-braces" version = "1.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/c0/eb3e27e817eb4ba39d9c66fbd53139cb4db7073f5e6e71c28ce4d8b706da/django_braces-1.17.0.tar.gz", hash = "sha256:3a6fe630d3d91fef0711bfe1088d14af00c245559f79f6298040ed2b2f757337", size = 54227, upload-time = "2025-03-18T02:03:02.354Z" } wheels = [ @@ -1573,9 +1614,9 @@ name = "django-cacheops" version = "7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "funcy" }, - { name = "redis" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "funcy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "redis", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1b/92/9df8a60ee959c214705ec3d3ccf80820097672a0260b149cf2751e818086/django_cacheops-7.2.tar.gz", hash = "sha256:cbc11cc0321295a3644e27bcb26940f08cb9c2e71d3ee506cbcff0bdda1a9f33", size = 72751, upload-time = "2025-04-20T04:36:19.068Z" } wheels = [ @@ -1587,9 +1628,9 @@ name = "django-celery-email" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "celery" }, - { name = "django" }, - { name = "django-appconf" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-appconf", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/48/78/95c9959978c1b8abd587735cf084065b0ac8196580f6f30b2c9e9636401a/django-celery-email-3.0.0.tar.gz", hash = "sha256:5546cbba80952cc3b8a0ffa4206ce90a4a996a7ffd1c385a2bdb65903ca18ece", size = 12644, upload-time = "2019-12-11T15:32:11.6Z" } wheels = [ @@ -1601,8 +1642,8 @@ name = "django-celery-results" version = "2.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "celery" }, - { name = "django" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a6/b5/9966c28e31014c228305e09d48b19b35522a8f941fe5af5f81f40dc8fa80/django_celery_results-2.6.0.tar.gz", hash = "sha256:9abcd836ae6b61063779244d8887a88fe80bbfaba143df36d3cb07034671277c", size = 83985, upload-time = "2025-04-10T08:23:52.677Z" } wheels = [ @@ -1614,10 +1655,10 @@ name = "django-channels-broadcast" version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "channels" }, - { name = "django" }, - { name = "nest-asyncio" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "channels", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "nest-asyncio", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c4/5f/e27abab494bafeaab136f3cbd42adb89379721b66fa4b78222b6460e09b7/django_channels_broadcast-0.2.2.tar.gz", hash = "sha256:a472bd4620a5c26d193aaa5703f1b0357e250c788d40b2f1f13a5f2e1097fc12", size = 71223, upload-time = "2026-07-11T11:12:18.838Z" } wheels = [ @@ -1629,7 +1670,7 @@ name = "django-classy-tags" version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/7f/18da9d8fcc469fc7aa74abc526aacaa3cc7180ad2208f80d43e8b670aed6/django-classy-tags-4.1.0.tar.gz", hash = "sha256:c8d9d1aa2fa6e71c4d866df4dd11d23a69b8d25bbb750b2490a17b161774ee59", size = 24692, upload-time = "2023-07-29T09:06:18.646Z" } wheels = [ @@ -1641,7 +1682,7 @@ name = "django-columns" version = "0.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/5a/5178d6f6d070e91877b163a21f9990b57d62c9f146a41c8e3fcf0493e5b5/django-columns-0.1.0.tar.gz", hash = "sha256:cd5ffb9b1e31908dba058344fc0e7def2367f13b6fa4c9a6b801e29fc864fdf9", size = 5621, upload-time = "2014-05-12T20:50:19.316Z" } @@ -1650,10 +1691,10 @@ name = "django-compressor" version = "4.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-appconf" }, - { name = "rcssmin" }, - { name = "rjsmin" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-appconf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rcssmin", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rjsmin", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a2/e4/c6d87b1341d744ceafa85eeceb2adabb1c62b795b8207cbc580fb70df8f4/django_compressor-4.6.0.tar.gz", hash = "sha256:c7478feab98f3368780591f9ee28a433350f5277dd28811f7f710f5bc6dff3c0", size = 99735, upload-time = "2025-11-10T13:12:11.439Z" } wheels = [ @@ -1674,8 +1715,8 @@ name = "django-cookie-law" version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-classy-tags" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-classy-tags", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/9b/ff89a562a6662a3cb58e73cdcc4cd110701eb0d77611487e8250b0d2a77e/django-cookie-law-2.2.0.tar.gz", hash = "sha256:c3c6c10a01b257886077dd170ead11a49448b5bdfd06e81acc5c7c4e2292d4c8", size = 16605, upload-time = "2022-03-11T10:13:38.693Z" } wheels = [ @@ -1687,7 +1728,7 @@ name = "django-countdown" version = "0.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/cf/24ef6118a39789aab8a4cf79d4e2f7e5673496bcf7961c0ce1aa465bd1b5/django_countdown-0.2.0.tar.gz", hash = "sha256:d87ed080bf91ab388c3a28acb046df8e56c392c483a369126166e641d625145c", size = 30539, upload-time = "2026-05-13T09:30:12.006Z" } wheels = [ @@ -1699,7 +1740,7 @@ name = "django-crispy-forms" version = "2.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bc/f5/b79e3ed7cae871d5d71bf3448d627e1fabab769358bb90808bec056556fe/django_crispy_forms-2.7.tar.gz", hash = "sha256:4c59bed60417375cba26cebb2c67ab350b655934670270b1c89dbcd7e60f1b4c", size = 1097842, upload-time = "2026-07-29T11:12:12.081Z" } wheels = [ @@ -1711,7 +1752,7 @@ name = "django-dbtemplates-iplweb" version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django-appconf" }, + { name = "django-appconf", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d8/6d/2e4267b5dc5ea2be0e8bad07ca1bcf76fa74d6463b72dc9dd123917c04ce/django_dbtemplates_iplweb-4.4.0.tar.gz", hash = "sha256:8f870373545949f7fc3c7db2bc807b3bdfd769c3d2146f50575e6cc84aa25f1c", size = 85424, upload-time = "2026-07-04T11:05:12.013Z" } wheels = [ @@ -1723,8 +1764,8 @@ name = "django-debug-toolbar" version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "sqlparse" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sqlparse", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/ac/3ac674f99c64bfbcd9ae3d7f5f3577f23ea52884e5ac36842e1f024dce03/django_debug_toolbar-7.0.0.tar.gz", hash = "sha256:ef7494c5b459c149e87cc2da88d86e944064945e86bd7b2d879093586b5fefbf", size = 359560, upload-time = "2026-06-19T00:21:23.346Z" } wheels = [ @@ -1736,10 +1777,10 @@ name = "django-denorm-iplweb" version = "1.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "celery" }, - { name = "celery-singleton" }, - { name = "django" }, - { name = "tqdm" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, + { name = "celery-singleton", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tqdm", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/2c/172efaa431f4e899d46d1d459bdd2e04b0fb80276a5031a7fd86fa8daf8d/django_denorm_iplweb-1.12.2.tar.gz", hash = "sha256:5ff32ec58a2f183e0ba969370c83062bd2d39e539f043083fb808e761a06c285", size = 97341, upload-time = "2026-06-18T19:42:28.144Z" } wheels = [ @@ -1751,7 +1792,7 @@ name = "django-dev-helpers" version = "0.1.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9c/1d/c4b69b80aaeb9698c30a750dfb72f685a757478210b62492a1d8a5d3dc31/django_dev_helpers-0.1.14.tar.gz", hash = "sha256:239eebf28d067c71a0d0a99c5f8569778ec71e43c108d7f8a3f6805f006b6e97", size = 118946, upload-time = "2026-07-12T13:21:30.423Z" } wheels = [ @@ -1763,7 +1804,7 @@ name = "django-dirtyfields" version = "1.9.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8e/0d/0c7d727f7f14f82450b72e5213c6ed0da3d16add2de2e59d46aea6b6eaa2/django_dirtyfields-1.9.9.tar.gz", hash = "sha256:c11c8e03827166d2c91f6634a4d10f5aa5cc7ea430d60e5bd576b3ebf319172f", size = 22209, upload-time = "2026-01-22T13:48:58.777Z" } wheels = [ @@ -1775,8 +1816,8 @@ name = "django-dsl" version = "0.1.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "ply" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ply", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/14/635aadf7907adf8eeb024b5444af35cd55d0a223c3bf8f870af0d5f3b7da/django_dsl-0.1.14.tar.gz", hash = "sha256:d90409b9f0176c9f6f916ac0f8bc7ed7ae5a0686ad05b74ffd364ab5facf0d09", size = 8493, upload-time = "2026-05-31T21:06:33.272Z" } wheels = [ @@ -1788,8 +1829,8 @@ name = "django-dynamic-admin-columns" version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-admin-sortable2" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-admin-sortable2", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/11/e32d659149e3cf84d3fbeb4ce0c7a7cb8d2951da7d38278725ce4ce6e851/django_dynamic_admin_columns-0.5.0.tar.gz", hash = "sha256:44757685f971d1956d48f8a1b84ef89958c33d000a9ab15295f6f7c215b75e71", size = 50993, upload-time = "2026-05-31T21:16:14.995Z" } wheels = [ @@ -1810,7 +1851,7 @@ name = "django-easy-audit" version = "1.3.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/3e/ad1b812e580fabe91af7f8c4897b4fe6c4ede696f829a0152e24abd156da/django_easy_audit-1.3.9.tar.gz", hash = "sha256:931b9b6c8411e2b49e980989cbfd4dfd9fd3ea3b350846f9b92686bf7d275f8f", size = 41852, upload-time = "2026-06-30T03:07:30.952Z" } wheels = [ @@ -1831,7 +1872,7 @@ name = "django-extensions" version = "4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/b3/ed0f54ed706ec0b54fd251cc0364a249c6cd6c6ec97f04dc34be5e929eac/django_extensions-4.1.tar.gz", hash = "sha256:7b70a4d28e9b840f44694e3f7feb54f55d495f8b3fa6c5c0e5e12bcb2aa3cdeb", size = 283078, upload-time = "2025-04-11T01:15:39.617Z" } wheels = [ @@ -1843,8 +1884,8 @@ name = "django-favicon-plus-reloaded" version = "1.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "pillow" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pillow", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/35/0d/86d1fb1eebbbadeacf4d420cee9206b737c77609e01c93aab0cec7d344f3/django_favicon_plus_reloaded-1.2.4.tar.gz", hash = "sha256:e8363eb783e18c0ab02b8f1e2705d8648e01933bebda1f89cb7e9b00964e2380", size = 8560, upload-time = "2026-02-11T19:11:05.885Z" } wheels = [ @@ -1856,7 +1897,7 @@ name = "django-filter" version = "26.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/3e/563965173d4cbb5fc308087e7b3d11a115b7b67273d093622480b1e31f78/django_filter-26.1.tar.gz", hash = "sha256:66ea04031b068c77c86e1ac26ced7a3f8f13ce797f5795751707e3deefc58054", size = 144299, upload-time = "2026-07-11T09:27:02.767Z" } wheels = [ @@ -1868,7 +1909,7 @@ name = "django-first-run-wizard" version = "0.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/04/7eefcc00d4c157249c482e5f28db6795ff42dd3b7ab353717dde89801300/django_first_run_wizard-0.2.0.tar.gz", hash = "sha256:9b3c52d0f0f6d9ba4c5ef6843103d321ab9f58ce233a1feff970286316530af1", size = 27234, upload-time = "2026-07-12T17:03:05.888Z" } wheels = [ @@ -1880,14 +1921,14 @@ name = "django-flexible-reports" version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "bleach" }, - { name = "django" }, - { name = "django-dsl" }, - { name = "django-tables2" }, - { name = "djangoql-iplweb" }, - { name = "lxml" }, - { name = "pypandoc" }, - { name = "tablib" }, + { name = "bleach", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-dsl", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-tables2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "djangoql-iplweb", marker = "platform_python_implementation != 'PyPy'" }, + { name = "lxml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pypandoc", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tablib", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/44/5a/cf1d02255d2e664d5decb7d8216f0714dbe446cc518573a2baa7acd617f2/django_flexible_reports-0.4.1.tar.gz", hash = "sha256:2965052069ab298ca1077e2d910d71eb6274baed41845f9add696da863e199ad", size = 34147, upload-time = "2026-07-24T12:15:56.014Z" } wheels = [ @@ -1899,7 +1940,7 @@ name = "django-formdefaults" version = "0.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0c/50/3d1065763d88baf2b78d68f5f478b018a4aef2fa26f36d4956fbef792cb3/django_formdefaults-0.6.2.tar.gz", hash = "sha256:de565336a806e8aebad8506f1ea5bf883abbd7a75d9ab7063bb527dfeb0b943b", size = 27976, upload-time = "2026-05-12T10:07:20.342Z" } wheels = [ @@ -1911,7 +1952,7 @@ name = "django-formtools" version = "2.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/40/fe/48cf5d38070577b83288f2bfd16a85aa864213d27d7dc7e8ec0feaa0a8ce/django_formtools-2.7.tar.gz", hash = "sha256:52b30c08571108023937e4b5d96a5cc35282ff0a2e51630aeea00e27d723d3ac", size = 92473, upload-time = "2026-07-09T16:06:34.341Z" } wheels = [ @@ -1923,9 +1964,9 @@ name = "django-fsm-2" version = "4.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-stubs-ext" }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-stubs-ext", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.12' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fa/eb/594712952364f0b1f009b9c414940a09031d07fe95bb888e92f50aa9a550/django_fsm_2-4.2.4.tar.gz", hash = "sha256:0e395afd03ff504afd476e8568ca213aafc3324bd4e5427e5b3287f7b1e7d979", size = 21544, upload-time = "2026-03-16T20:33:33.476Z" } wheels = [ @@ -1955,9 +1996,9 @@ name = "django-import-export" version = "4.4.2.dev0+iplweb" source = { git = "https://github.com/mpasternak/django-import-export.git?rev=d6ee0d39194fee31437affbdc6fee5ce549b4b8f#d6ee0d39194fee31437affbdc6fee5ce549b4b8f" } dependencies = [ - { name = "diff-match-patch" }, - { name = "django" }, - { name = "tablib" }, + { name = "diff-match-patch", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tablib", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -1965,7 +2006,7 @@ name = "django-js-asset" version = "3.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e6/91/c63f136f553ec24fc46ccf20ac7292a8df04815b383975b6f3f7f0060217/django_js_asset-3.1.2.tar.gz", hash = "sha256:1fc7584199ed1941ed7c8e7b87ca5524bb0f2ba941561d2a104e88ee9f07bedd", size = 9471, upload-time = "2025-03-04T15:22:49.789Z" } wheels = [ @@ -1977,9 +2018,9 @@ name = "django-liveops" version = "0.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "channels" }, - { name = "django" }, - { name = "django-channels-broadcast" }, + { name = "channels", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-channels-broadcast", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/10/29/4123555061c6f6f8bd7eeb83113e7cdb7a9a8989049ea15a30ce9841f90b/django_liveops-0.4.0.tar.gz", hash = "sha256:afec32be5093e5906e9e10818b128db30ebb20f39800a0fa2cd8392ba2bd23dd", size = 278916, upload-time = "2026-07-11T14:32:44.098Z" } wheels = [ @@ -1988,7 +2029,7 @@ wheels = [ [package.optional-dependencies] celery = [ - { name = "celery" }, + { name = "celery", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -2014,10 +2055,10 @@ name = "django-microsoft-auth" version = "3.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "pyjwt", extra = ["crypto"] }, - { name = "requests" }, - { name = "requests-oauthlib" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyjwt", extra = ["crypto"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests-oauthlib", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/12/de/549f316f6a463a7f93e1f72cd8f1b186b821ced4aa4b89bf6421c243529b/django_microsoft_auth-3.0.1.tar.gz", hash = "sha256:e149b35e8061e12f060b4fc31a6bea1e0cb32047801a076aeb972d68f1f97655", size = 52289, upload-time = "2022-10-28T16:59:07.573Z" } wheels = [ @@ -2029,9 +2070,9 @@ name = "django-minify-html" version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asgiref" }, - { name = "django" }, - { name = "minify-html" }, + { name = "asgiref", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "minify-html", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/aa/28cc8441ebe49d96b4c6727eb834ec949ac23865f56297b9cef54032ba75/django_minify_html-1.14.0.tar.gz", hash = "sha256:43c1c31c353ed40acfed4ddc15663bc6892c7745b09172e767dc944577e6241a", size = 10540, upload-time = "2025-10-27T14:44:31.259Z" } wheels = [ @@ -2043,7 +2084,7 @@ name = "django-model-utils" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/60/5e232c32a2c977cc1af8c70a38ef436598bc649ad89c2c4568454edde2c9/django_model_utils-5.0.0.tar.gz", hash = "sha256:041cdd6230d2fbf6cd943e1969318bce762272077f4ecd333ab2263924b4e5eb", size = 80559, upload-time = "2024-09-04T11:35:22.858Z" } wheels = [ @@ -2055,7 +2096,7 @@ name = "django-mptt" version = "0.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django-js-asset" }, + { name = "django-js-asset", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/25/04bb8e4384f3484dabbd0e2a84946f1c972b95b07512509a17aaa361be0f/django_mptt-0.18.0.tar.gz", hash = "sha256:cf5661357ff22bc64e20d3341c26e538aa54583aea0763cfe6aaec0ab8e3a8ee", size = 71407, upload-time = "2025-08-26T09:27:01.05Z" } wheels = [ @@ -2067,9 +2108,9 @@ name = "django-multiseek" version = "0.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-autocomplete-light" }, - { name = "python-dateutil" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-autocomplete-light", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/8b/d41fad5c84a8e5f99a64825c3786d78312559f8ac9cd24fb63275331d5f0/django_multiseek-0.10.2.tar.gz", hash = "sha256:e85ba2ea95452b171899d72c97a64a4755044aed1cb29a8cd5617f9756323545", size = 39406, upload-time = "2026-06-01T09:57:57.713Z" } wheels = [ @@ -2081,11 +2122,11 @@ name = "django-oauth-toolkit" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "jwcrypto" }, - { name = "oauthlib" }, - { name = "requests" }, - { name = "urllib3" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jwcrypto", marker = "platform_python_implementation != 'PyPy'" }, + { name = "oauthlib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/a7/f185dc058f859b104c1fed06ab25eeebbb7e182c3e25c6f7e11e8df3f739/django_oauth_toolkit-3.4.0.tar.gz", hash = "sha256:e43bef1568d6322b44175e27eff82ed7d7cf210889a07d10b8a64e4190ff1351", size = 220227, upload-time = "2026-07-24T02:50:38.186Z" } wheels = [ @@ -2097,7 +2138,7 @@ name = "django-password-policies-iplweb" version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/df/7b934230c45c74b0c8baa419d99aeb18edb5dbc8526ab79a77a4b7fe0a07/django_password_policies_iplweb-0.9.0.tar.gz", hash = "sha256:4ea38dd5d261e7e7c8694fd8447ca9ce7bceb51a6efac5a609870d81bcadfd43", size = 91109, upload-time = "2026-04-07T13:18:01.688Z" } wheels = [ @@ -2109,8 +2150,8 @@ name = "django-pbn-client" version = "0.2.2" source = { git = "https://github.com/iplweb/django-pbn-client.git?rev=bb952e98967a96f96cd3773e3dcfcaf4555c8690#bb952e98967a96f96cd3773e3dcfcaf4555c8690" } dependencies = [ - { name = "django" }, - { name = "pbn-client" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pbn-client", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -2118,8 +2159,8 @@ name = "django-pg-baseline" version = "0.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "testcontainers" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "testcontainers", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/13/65d21c9470a605afdab5e7893ab404a0d01da1b051bd9b1b74299df9bc8a/django_pg_baseline-0.3.0.tar.gz", hash = "sha256:c28186891b0d80bf462aca91947c36eec70504f32933ac6cf93d20052bcceade", size = 25503, upload-time = "2026-05-09T16:27:44.095Z" } wheels = [ @@ -2131,8 +2172,8 @@ name = "django-polish-inflection" version = "0.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "polish-inflection" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "polish-inflection", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/18/6ffa24109e2b5454da33a6f0133708d276f07be678047e0a454d17f36ed3/django_polish_inflection-0.1.0.tar.gz", hash = "sha256:8dad5539a323d12faa7910dc6b9ad2677563b12418420c2e77f580f1fb3139a4", size = 191748, upload-time = "2026-07-03T20:04:10.564Z" } wheels = [ @@ -2144,8 +2185,8 @@ name = "django-prometheus" version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "prometheus-client" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "prometheus-client", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/c7/dc39c4c19f7b35e827a486d08376de1fad31c50decb26c56e32668314f13/django_prometheus-2.5.0.tar.gz", hash = "sha256:4837b3c3734d8350880839ab8235aafd250b668c348e159d4aecc3cbefeee53e", size = 26465, upload-time = "2026-05-26T19:04:00.77Z" } wheels = [ @@ -2157,7 +2198,7 @@ name = "django-querysetsequence" version = "0.18" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/f6/22906bc0d74b17bd8203e7038b1159f8b228426a3ad24b0912388dcf980e/django_querysetsequence-0.18.tar.gz", hash = "sha256:008435bd44cf291de21238d26efda4a14f4dcb5f01adb19da8339f634f3a9338", size = 30432, upload-time = "2025-05-13T23:27:38.476Z" } wheels = [ @@ -2169,8 +2210,8 @@ name = "django-redis-iplweb" version = "6.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "redis" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "redis", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/24/55/890106c7ff23f444cd3857d2e3c05f7ea329c9608f803e3d66cf615e421f/django_redis_iplweb-6.0.1.tar.gz", hash = "sha256:faa67d5d6d83d27376912dfd3a34feda696d08e767deeb802b51d69d490ce8d0", size = 60877, upload-time = "2026-04-26T19:29:06.654Z" } wheels = [ @@ -2182,7 +2223,7 @@ name = "django-render-block" version = "0.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6b/2f/588cf58f7b37ab3b7994727d590381aed747173ef5670457c798518621dc/django_render_block-0.11.tar.gz", hash = "sha256:17886dd3bff222fe8a2f019509c6c53e0e4a38fe684e80d48e8697a879e1301b", size = 12432, upload-time = "2025-05-13T11:48:51.333Z" } wheels = [ @@ -2194,7 +2235,7 @@ name = "django-reversion" version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/93/0240c12e07f882e11bc4028b6d5570ff6305ac6237843853b9238895be3a/django_reversion-6.3.0.tar.gz", hash = "sha256:0aa54eb334694f522fd234743978c614d45aa785edc70a6177267cdaaf06f967", size = 79028, upload-time = "2026-06-12T19:55:46.603Z" } wheels = [ @@ -2206,10 +2247,10 @@ name = "django-reversion-compare" version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "diff-match-patch" }, - { name = "django" }, - { name = "django-reversion" }, - { name = "rich" }, + { name = "diff-match-patch", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-reversion", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rich", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f9/28/54ba992a2d1e716fe8950b90791688a5890de4f6f68b0e78a86c8abfaabe/django_reversion_compare-0.19.2.tar.gz", hash = "sha256:b27f0616759eb529693956dca776009d9608900c90a97b09aefeede5d6703bee", size = 194226, upload-time = "2026-02-06T17:18:40.352Z" } wheels = [ @@ -2221,8 +2262,8 @@ name = "django-run-site" version = "0.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docker" }, - { name = "testcontainers", extra = ["redis"] }, + { name = "docker", marker = "platform_python_implementation != 'PyPy'" }, + { name = "testcontainers", extra = ["redis"], marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/0f/6a7672afff91505ce93fd8f1bd132621c2e7c1500d147f532b1425ecf4ee/django_run_site-0.20.1.tar.gz", hash = "sha256:a04428c0b34922cf798ff38110387d39504f9a3054952d292c198eb8fbcdacf5", size = 245407, upload-time = "2026-07-12T13:20:36.663Z" } wheels = [ @@ -2234,7 +2275,7 @@ name = "django-sendfile2" version = "0.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6b/8d/18b884f5316329c914b6851f21fd1d88752627ab8da7dd0f0970cf2b58db/django_sendfile2-0.7.2.tar.gz", hash = "sha256:d0939d52217d314b110d0b7b15ace5063d96aeb4980b7e0f94c020c2e25646f8", size = 27488, upload-time = "2025-04-06T14:09:42.806Z" } wheels = [ @@ -2246,7 +2287,7 @@ name = "django-session-security" version = "2.6.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/7a/69a922ce628b7d91acb48101170741662f641cf7810d4a6273e3e37c702b/django_session_security-2.6.8.tar.gz", hash = "sha256:f8949d021eee5e237385413a1173bb90c3bd80ce2d56e412a5644608de815109", size = 104281, upload-time = "2026-04-24T14:41:42.034Z" } wheels = [ @@ -2258,8 +2299,8 @@ name = "django-site-blog" version = "0.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "django-model-utils" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django-model-utils", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/3c/3eae4a5043fdf5516fe67df690ebf863916d2e97be924d781eec32451fd9/django_site_blog-0.2.1.tar.gz", hash = "sha256:b5d47cb50c7c2994100a548aee603e92dcf91d8f19d172c5914fe079b5e583f8", size = 13639, upload-time = "2026-05-13T15:46:12.582Z" } wheels = [ @@ -2271,7 +2312,7 @@ name = "django-soft-delete" version = "1.0.23" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/98/c7c52a85b070b1703774df817b6460a7714655302a2d503f6447544f1a29/django_soft_delete-1.0.23.tar.gz", hash = "sha256:814659f0d19d4f2afc58b31ff73f88f0af66715ccef3b4fcd8f6b3a011d59b2a", size = 22458, upload-time = "2026-02-21T17:48:41.345Z" } wheels = [ @@ -2283,9 +2324,9 @@ name = "django-static-sitemaps" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "setuptools" }, - { name = "six" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/37/86/7d902fe13a60abc8601c6450a940973e2e4f9d4a409b34d6adb4f5ceaa66/django-static-sitemaps-5.0.0.tar.gz", hash = "sha256:4580bda5bbaa4dbf40bc8bbde5936e1675eac1c7b76f65286705befeeefbaa85", size = 8660, upload-time = "2024-02-18T09:04:01.556Z" } @@ -2294,8 +2335,8 @@ name = "django-stubs-ext" version = "6.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "typing-extensions" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fb/e6/5dcdaa785ec3eed5fc196c7e68fb7ad9d9fe6d5acccea4690e65f2546417/django_stubs_ext-6.0.3.tar.gz", hash = "sha256:3307d42132bc295d5744de6276bc5fdf6896efc70f891e21c0ae8bdf529d2762", size = 6663, upload-time = "2026-04-18T15:10:53.667Z" } wheels = [ @@ -2307,7 +2348,7 @@ name = "django-tables2" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e2/95/8e28e76c04b91d15cf595607040e2e821fd48b517428c2bae5d62af89b18/django_tables2-3.0.0.tar.gz", hash = "sha256:3c5343f72663b0d6684e8e6cbcb16caae10d7621a51c1cf3c581f57ce605f8ee", size = 130242, upload-time = "2026-04-13T07:42:44.463Z" } wheels = [ @@ -2325,7 +2366,7 @@ name = "django-taggit" version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/a6/f1beaf8f552fe90c153cc039316ebab942c23dfbc88588dde081fefca816/django_taggit-6.1.0.tar.gz", hash = "sha256:c4d1199e6df34125dd36db5eb0efe545b254dec3980ce5dd80e6bab3e78757c3", size = 38151, upload-time = "2024-09-29T08:07:39.477Z" } wheels = [ @@ -2337,7 +2378,7 @@ name = "django-templated-email" version = "3.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django-render-block" }, + { name = "django-render-block", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/d3/689aee2477dcef5b1fca187897373882fb5aae9f58d1d0a207b8ee7acb94/django_templated_email-3.1.1.tar.gz", hash = "sha256:9c48863d96b89096fa84c6b48523920e90d55397d2895c752fdde5c228aee70f", size = 17026, upload-time = "2025-08-21T17:40:35.162Z" } wheels = [ @@ -2349,7 +2390,7 @@ name = "django-tinymce" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/71/e9556c8bc1d99c0cb4081af0abc6440d7cf53c87b6c7da7b117f2de24881/django_tinymce-5.0.0.tar.gz", hash = "sha256:6257669ed596accf5fa967ff3061276b2c5352baac1bbc658fcd8252b12ca38a", size = 1161002, upload-time = "2025-10-21T19:25:25.831Z" } wheels = [ @@ -2361,8 +2402,8 @@ name = "django-weasyprint" version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, - { name = "weasyprint" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "weasyprint", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/5a/e4109aac85db984a020f4a3cff9836af13ee8bf5bdcf6e61818ea9422a48/django_weasyprint-2.5.0.tar.gz", hash = "sha256:362956b650d2a053967471c0ce15857f08e30253a3eeb746aef7c459d3ee9cf9", size = 14436, upload-time = "2026-04-10T23:03:34.315Z" } wheels = [ @@ -2374,7 +2415,7 @@ name = "django-webmaster-verification" version = "0.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/44/3d/f5ddb42ceeedda3098fa691920d77e44b33813834bc44fce40f0ce3fcdeb/django-webmaster-verification-0.4.3.tar.gz", hash = "sha256:1cc6958ee4142da63c1b3e03e537cce6051c740cb1adf6afb68ddb1cc85f4e8f", size = 7125, upload-time = "2022-02-09T09:01:54.524Z" } wheels = [ @@ -2386,7 +2427,7 @@ name = "django-webtest" version = "1.9.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "webtest" }, + { name = "webtest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/4c/2c6f4dc32c785b4ed760878f972e0934dba3a4d4cedbfdf4fbce24225808/django_webtest-1.9.14.tar.gz", hash = "sha256:edbdc62f74b84e53ad3b49821e839669c812fafabb54ede713b45209bf732aeb", size = 29289, upload-time = "2025-10-06T21:08:10.761Z" } wheels = [ @@ -2398,7 +2439,7 @@ name = "djangoql-iplweb" version = "0.31.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ply" }, + { name = "ply", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/67/1143e2369e8cd09fab96356fc6ab998fc3c3b7561916b0642355bbf0cc7d/djangoql_iplweb-0.31.1.tar.gz", hash = "sha256:722b922ce2a1b209e4253c29bd4c618179b4d7fe76bb4c444c7e230384845421", size = 318089, upload-time = "2026-07-11T07:58:17.355Z" } wheels = [ @@ -2410,7 +2451,7 @@ name = "djangorestframework" version = "3.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ca/d7/c016e69fac19ff8afdc89db9d31d9ae43ae031e4d1993b20aca179b8301a/djangorestframework-3.17.1.tar.gz", hash = "sha256:a6def5f447fe78ff853bff1d47a3c59bf38f5434b031780b351b0c73a62db1a5", size = 905742, upload-time = "2026-03-24T16:58:33.705Z" } wheels = [ @@ -2422,13 +2463,13 @@ name = "djlint" version = "1.43.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "cssbeautifier" }, - { name = "jsbeautifier" }, - { name = "json5" }, - { name = "pathspec" }, - { name = "pyyaml" }, - { name = "regex" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cssbeautifier", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jsbeautifier", marker = "platform_python_implementation != 'PyPy'" }, + { name = "json5", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pathspec", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyyaml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "regex", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/33/7efcde4581d1295c1e64a75b6d1ac444b4c2557b668e73032070ff5fc081/djlint-1.43.2.tar.gz", hash = "sha256:5a783d9b419b0833be1a13f213c0ea5e4a86aa505bd5d159884a2a349d06f7e8", size = 79429, upload-time = "2026-08-01T18:11:35.424Z" } wheels = [ @@ -2485,15 +2526,24 @@ name = "docker" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywin32", marker = "sys_platform == 'win32'" }, - { name = "requests" }, - { name = "urllib3" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, ] +[[package]] +name = "docstring-parser" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, +] + [[package]] name = "docutils" version = "0.21.2" @@ -2508,10 +2558,10 @@ name = "dspace-rest-client" version = "0.1.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pysocks" }, - { name = "pysolr" }, - { name = "requests" }, - { name = "smart-open", extra = ["all"] }, + { name = "pysocks", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pysolr", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "smart-open", extra = ["all"], marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/2b/d23dc1619e223c8992a661654222a9f318ce08020c56b216160bbb12173f/dspace_rest_client-0.1.17.tar.gz", hash = "sha256:6a4e91fdaab415a203a2450e7894c258e64fbbc9db128128c9f164528b9a2a46", size = 32393, upload-time = "2026-03-03T04:25:26.587Z" } wheels = [ @@ -2615,8 +2665,8 @@ wheels = [ [package.optional-dependencies] woff = [ { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, - { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" }, - { name = "zopfli" }, + { name = "brotlicffi", marker = "platform_python_implementation != 'CPython' and platform_python_implementation != 'PyPy'" }, + { name = "zopfli", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -2647,11 +2697,11 @@ name = "google-api-core" version = "2.31.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-auth" }, - { name = "googleapis-common-protos" }, - { name = "proto-plus" }, - { name = "protobuf" }, - { name = "requests" }, + { name = "google-auth", marker = "platform_python_implementation != 'PyPy'" }, + { name = "googleapis-common-protos", marker = "platform_python_implementation != 'PyPy'" }, + { name = "proto-plus", marker = "platform_python_implementation != 'PyPy'" }, + { name = "protobuf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/22/155cadf1d49272a9cf48f3168c0f3874fa13397297e611a5ea00cd093880/google_api_core-2.31.0.tar.gz", hash = "sha256:2be84ee0f584c48e6bde1b36766e23348b361fb7e55e56135fc76ce1c397f9c2", size = 176492, upload-time = "2026-06-03T14:52:17.257Z" } wheels = [ @@ -2663,8 +2713,8 @@ name = "google-auth" version = "2.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "pyasn1-modules" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyasn1-modules", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/ad/ff781329bbbdc0974a098d996e89c9e1f7024262f9e3eec442fbb9ad1ac6/google_auth-2.53.0.tar.gz", hash = "sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c", size = 335844, upload-time = "2026-05-15T20:53:07.928Z" } wheels = [ @@ -2676,8 +2726,8 @@ name = "google-cloud-core" version = "2.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-api-core" }, - { name = "google-auth" }, + { name = "google-api-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-auth", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/dd/1eef226e470369b26824a505c34482c0b493bc35fe8e0c6b003b5feca21a/google_cloud_core-2.6.0.tar.gz", hash = "sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83", size = 36001, upload-time = "2026-05-07T08:04:04.124Z" } wheels = [ @@ -2689,12 +2739,12 @@ name = "google-cloud-storage" version = "3.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-api-core" }, - { name = "google-auth" }, - { name = "google-cloud-core" }, - { name = "google-crc32c" }, - { name = "google-resumable-media" }, - { name = "requests" }, + { name = "google-api-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-auth", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-cloud-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-crc32c", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-resumable-media", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/09/8953e2993e604c8882fd441b5b2de624a2dfe7e6144c6166d7b477509596/google_cloud_storage-3.11.0.tar.gz", hash = "sha256:498bf37c999028f69a245f586b5e50d89f59df1fafc0e3a93783ac56be2a456b", size = 17335639, upload-time = "2026-06-03T16:14:04.649Z" } wheels = [ @@ -2736,7 +2786,7 @@ name = "google-resumable-media" version = "2.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-crc32c" }, + { name = "google-crc32c", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/48/f8/1ca5781d6be9cb9f73f7d40f4958c4bd1226a60598e3e39e1d6aaf838c4b/google_resumable_media-2.10.0.tar.gz", hash = "sha256:e324bc9d0fdae4c52a08ae90456edc4e71ece858399e1217ac0eb3a51d6bc6ee", size = 2164570, upload-time = "2026-06-03T16:14:26.103Z" } wheels = [ @@ -2748,7 +2798,7 @@ name = "googleapis-common-protos" version = "1.75.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf" }, + { name = "protobuf", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } wheels = [ @@ -2810,7 +2860,7 @@ name = "gunicorn" version = "26.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, + { name = "packaging", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/b7/a4a3f632f823e432ce6bc65f62961b7980c898c77f075a2f7118cb3846fe/gunicorn-26.0.0.tar.gz", hash = "sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf", size = 727286, upload-time = "2026-05-05T06:38:25.529Z" } wheels = [ @@ -2831,8 +2881,8 @@ name = "h2" version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "hpack" }, - { name = "hyperframe" }, + { name = "hpack", marker = "platform_python_implementation != 'PyPy'" }, + { name = "hyperframe", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } wheels = [ @@ -2853,14 +2903,27 @@ name = "html5lib" version = "1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, - { name = "webencodings" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, + { name = "webencodings", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215, upload-time = "2020-06-22T23:32:38.834Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173, upload-time = "2020-06-22T23:32:36.781Z" }, ] +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "h11", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + [[package]] name = "httptools" version = "0.8.0" @@ -2904,6 +2967,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" }, ] +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "certifi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "httpcore", marker = "platform_python_implementation != 'PyPy'" }, + { name = "idna", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + [[package]] name = "hyperframe" version = "6.1.0" @@ -2918,7 +2996,7 @@ name = "hyperlink" version = "21.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "idna" }, + { name = "idna", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743, upload-time = "2021-01-08T05:51:20.972Z" } wheels = [ @@ -2930,7 +3008,7 @@ name = "id" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "urllib3" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", size = 18088, upload-time = "2026-02-04T16:19:41.26Z" } wheels = [ @@ -2969,7 +3047,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp" }, + { name = "zipp", marker = "python_full_version < '3.12' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -2981,7 +3059,7 @@ name = "incremental" version = "24.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/27/87/156b374ff6578062965afe30cc57627d35234369b3336cf244b240c8d8e6/incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9", size = 28157, upload-time = "2024-07-29T20:03:55.441Z" } wheels = [ @@ -3011,8 +3089,8 @@ name = "ipdb" version = "0.13.13" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "decorator" }, - { name = "ipython" }, + { name = "decorator", marker = "platform_python_implementation != 'PyPy'" }, + { name = "ipython", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/1b/7e07e7b752017f7693a0f4d41c13e5ca29ce8cbcfdcc1fd6c4ad8c0a27a0/ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726", size = 17042, upload-time = "2023-03-09T15:40:57.487Z" } wheels = [ @@ -3024,16 +3102,16 @@ name = "ipython" version = "8.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "decorator", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jedi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "matplotlib-inline", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pexpect", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pygments", marker = "platform_python_implementation != 'PyPy'" }, + { name = "stack-data", marker = "platform_python_implementation != 'PyPy'" }, + { name = "traitlets", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.12' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } wheels = [ @@ -3063,7 +3141,7 @@ name = "jaraco-classes" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "more-itertools" }, + { name = "more-itertools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } wheels = [ @@ -3075,7 +3153,7 @@ name = "jaraco-context" version = "6.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, + { name = "backports-tarfile", marker = "python_full_version < '3.12' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ @@ -3087,7 +3165,7 @@ name = "jaraco-functools" version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "more-itertools" }, + { name = "more-itertools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } wheels = [ @@ -3099,7 +3177,7 @@ name = "jedi" version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "parso" }, + { name = "parso", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ @@ -3120,13 +3198,99 @@ name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jiter" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431, upload-time = "2026-06-29T13:05:13.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/3f/fae6cc967d120ec89e31c5418a51176d8278b3087fbb384a9176754f353c/jiter-0.16.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:67fddeda1688f0cce2d2ae83ccf8a80f79936f2d2997d6cc2261f82fdb54a4d3", size = 309289, upload-time = "2026-06-29T13:02:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/97c6c3562c077f6247d6e6ce5c82562500b6316c0d928e97e106b7a1321a/jiter-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c90c0f63df322be920eda6ce622e3083d8906ba267f8220fe7873213b8b4430e", size = 315181, upload-time = "2026-06-29T13:02:53.964Z" }, + { url = "https://files.pythonhosted.org/packages/7b/89/d8d073f8aa2667e46c6c0873f86fe4a512bba4293cc730f626a076211a62/jiter-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64c0203212098470032aabcde9356fc168f377aade3e43def61dfe17e92f2037", size = 340939, upload-time = "2026-06-29T13:02:55.412Z" }, + { url = "https://files.pythonhosted.org/packages/87/c9/db4fda3ed73fb864139305e935e5b8b38a5a24692a5a9dd356c22f1b9c8d/jiter-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12288303c9844e61e1651d02a9a6f6633e47d39f897d6991d1427161ce6b746e", size = 364932, upload-time = "2026-06-29T13:02:57.28Z" }, + { url = "https://files.pythonhosted.org/packages/a2/74/52b5e86241057f52ddd7c9a580f90effb51f9d06239f6fc612279b91a838/jiter-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cf109d010b4b05a105afb3d43be36a21322d345ad3111e13d15f680afef0e5b", size = 461132, upload-time = "2026-06-29T13:02:58.994Z" }, + { url = "https://files.pythonhosted.org/packages/a9/87/544a700f7447c1f31c5d7833821a4daa5683165c2d5a094fbf5b5800c3dc/jiter-0.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62c1b7fe1f77925acf5af68b6140b8810fa87dfd4dc0a9c8568ec2fa2a10429c", size = 374857, upload-time = "2026-06-29T13:03:00.455Z" }, + { url = "https://files.pythonhosted.org/packages/40/cd/0fcc3f7d39183674d5bfa9ec640faaeb506c60be7c8f94625dfba366e37c/jiter-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8597d23c87f59294f83bcb6229b9ed1fccee13dbba967b46930d2f1759466fee", size = 347053, upload-time = "2026-06-29T13:03:02.045Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ae/c7e64e7932ad597fa395b61440b249ada6366716e25c6e08dd2afbd021e6/jiter-0.16.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3126a5dbad56401989ac769aca0cb56005bfb3e2366eea0ca99d1a91c3c1ee03", size = 356153, upload-time = "2026-06-29T13:03:03.706Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/1c719044f14da814e1a060191ab19b96f3e99207bc5b4bfc6d6be34b3f80/jiter-0.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b4717bdb35ae456f831a6b08d01880fff399887a6bbc526a583a406e484eea", size = 393956, upload-time = "2026-06-29T13:03:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/3b/dc/7b2f303a2847207e265503853a2d964a55354cffd62a5f2936c155486798/jiter-0.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adff21bc78edfe086c15eb495b900306076de378dc2337c132401fc39bd79c91", size = 521081, upload-time = "2026-06-29T13:03:06.886Z" }, + { url = "https://files.pythonhosted.org/packages/c2/5f/501cf6e1e09caeb420195179ffc6f62aca603f1220ec53fd80d0d70b3e56/jiter-0.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dab907db06fc593645e73109acf4581ba5b548897d28b9348dc41ddc8343b2d3", size = 552085, upload-time = "2026-06-29T13:03:08.339Z" }, + { url = "https://files.pythonhosted.org/packages/79/54/aa5be86520113b79455c3877f3d1f07a348098df4083ba3688e9537e52dd/jiter-0.16.0-cp311-cp311-win32.whl", hash = "sha256:560b2cf3fb03240cd34f27409a238547488708f05b7c3924f571a60422251ec7", size = 206755, upload-time = "2026-06-29T13:03:09.653Z" }, + { url = "https://files.pythonhosted.org/packages/64/ec/2feb893eb330bd69b413866f4d5daada33c3962f1c6f270c91ca2d87fdf9/jiter-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:e431cfc9caf44c1d5459ff77d4e64cbf85fddb6a35dad836a15c6a9ec23087c1", size = 199155, upload-time = "2026-06-29T13:03:10.979Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9c/ca040d94415048a3666fc237774df8151c96f8d2b661cbe3b184acc95876/jiter-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:2a8e9e39cf083016137aa5cadafe3188adc2ba6ba1fbf1e5d18889ad3e9ad056", size = 194403, upload-time = "2026-06-29T13:03:12.341Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/52ace16ed031354f0539749a49e4bf33797d82bea5137910835fa4b09793/jiter-0.16.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:67c3bc1760f8c99d805dcab4e644027142a53b1d5d861f18780ebdbd5d40b72a", size = 306943, upload-time = "2026-06-29T13:03:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/94/2e/34957c2c1b661c252ba9bcc60ae0bddc27e0f7202c6073326a13c5390eec/jiter-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5af7780e4a26bd7d0d989592bf9ef12ebf806b74ab709223ecca37c749872ea9", size = 307779, upload-time = "2026-06-29T13:03:15.418Z" }, + { url = "https://files.pythonhosted.org/packages/88/6c/59bd309cab4460c54cf1079f3eb7fe7af6a4c895c5c957a53378693bad2b/jiter-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5bf78d0e05e45cfdd66558893938d59afe3d1b1a824a202039b20e607d25a72", size = 335826, upload-time = "2026-06-29T13:03:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8c/f5ef7b65f0df47afa16596969defb281ebb86e96df346d62be6fd853d620/jiter-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4444a83f946605990c98f625cdd3d2725bfb818158760c5748c653170a20e0e", size = 362573, upload-time = "2026-06-29T13:03:18.781Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0b/ace4354da061ee38844a0c27dc2c21eecd27aea119e8da324bea987522d0/jiter-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a23f0e4f957e1be65752d2dfac9a5a06b1917af8dc85deb639c3b9d02e31290", size = 457979, upload-time = "2026-06-29T13:03:20.293Z" }, + { url = "https://files.pythonhosted.org/packages/55/40/c0253d3772eb9dcd8e6606ee9b2d53ec8e5b814589c47f140aa585f21eaa/jiter-0.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c22a488f7b9218e245a0025a9ba6b100e2e54700831cf4cf16833a27fba3ad01", size = 372302, upload-time = "2026-06-29T13:03:21.739Z" }, + { url = "https://files.pythonhosted.org/packages/a8/d2/4839422241aa12860ce597b20068727094ba0bc480723c74924ca5bad483/jiter-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46add52f4ad47a08bfb1219f3e673da972191489a33016edefdb5ea55bfa8c48", size = 343805, upload-time = "2026-06-29T13:03:23.384Z" }, + { url = "https://files.pythonhosted.org/packages/e2/59/e196888a05befdda7dbe299b722d56f2f6eec65402bc34c0a3306d595feb/jiter-0.16.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:9c8a956fd72c2cf1e730d01ea080341f13aa0a97a4a33b51abebe725b7ae9ca9", size = 351107, upload-time = "2026-06-29T13:03:24.815Z" }, + { url = "https://files.pythonhosted.org/packages/ec/74/4cd9e0fca65232136400354b630fbfcd2de634e22ccbb96567725981b548/jiter-0.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:561926e0573ffe4a32498420a76d64b16c513e1ab413b9d28158a8764ac701e5", size = 388441, upload-time = "2026-06-29T13:03:26.266Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8c/554691e48bc711299c0a293dd8a6179e24b2d66a54dc295421fcf64569c0/jiter-0.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:44d019fa8cdaf89bf29c71b39e3712143fdd0ac76725c6ef954f9957a5ea8730", size = 516354, upload-time = "2026-06-29T13:03:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/a4/cb/01e9d69dc2cc6759d4f91e230b34489c4fdb2518992650633f9e20bece89/jiter-0.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0df91907609837f33341b8e6fe73b95991fdaa57caf1a0fbd343dffe826f386f", size = 547880, upload-time = "2026-06-29T13:03:29.534Z" }, + { url = "https://files.pythonhosted.org/packages/79/70/2953195f1c6ad00f49fa67e13df7e60acb3dd4f387101bc15abccddd905e/jiter-0.16.0-cp312-cp312-win32.whl", hash = "sha256:51d7b836acb0108d7c77df1742332cac2a1fa04a74d6dacec46e7091f0e91274", size = 203473, upload-time = "2026-06-29T13:03:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/05/2909a8b10699a4d560f8c502b6b2c5f3991b682b1922c1eedda242b225bd/jiter-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1878349266f8ee36ecb1375cc5ba2f115f35fd9f0a1a4119e725e379126647f7", size = 196905, upload-time = "2026-06-29T13:03:32.472Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a9/6b82bb1c8d7790d602489b967b982a909e5d092875a6c2ade96444c8dfc5/jiter-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2ed5738ae4af18271a51a528b8811b0cbfa4a1858de9d83359e4169855d6a331", size = 190618, upload-time = "2026-06-29T13:03:34.672Z" }, + { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203, upload-time = "2026-06-29T13:03:36.243Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489, upload-time = "2026-06-29T13:03:37.846Z" }, + { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453, upload-time = "2026-06-29T13:03:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625, upload-time = "2026-06-29T13:03:40.597Z" }, + { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958, upload-time = "2026-06-29T13:03:42.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017, upload-time = "2026-06-29T13:03:43.658Z" }, + { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320, upload-time = "2026-06-29T13:03:45.226Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520, upload-time = "2026-06-29T13:03:46.671Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550, upload-time = "2026-06-29T13:03:48.361Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424, upload-time = "2026-06-29T13:03:49.881Z" }, + { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981, upload-time = "2026-06-29T13:03:51.363Z" }, + { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853, upload-time = "2026-06-29T13:03:53.015Z" }, + { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160, upload-time = "2026-06-29T13:03:54.447Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862, upload-time = "2026-06-29T13:03:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239, upload-time = "2026-06-29T13:03:57.205Z" }, + { url = "https://files.pythonhosted.org/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928, upload-time = "2026-06-29T13:03:58.643Z" }, + { url = "https://files.pythonhosted.org/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998, upload-time = "2026-06-29T13:04:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112, upload-time = "2026-06-29T13:04:01.52Z" }, + { url = "https://files.pythonhosted.org/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807, upload-time = "2026-06-29T13:04:03.214Z" }, + { url = "https://files.pythonhosted.org/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181, upload-time = "2026-06-29T13:04:04.629Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927, upload-time = "2026-06-29T13:04:06.067Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754, upload-time = "2026-06-29T13:04:07.477Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553, upload-time = "2026-06-29T13:04:08.92Z" }, + { url = "https://files.pythonhosted.org/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900, upload-time = "2026-06-29T13:04:10.407Z" }, + { url = "https://files.pythonhosted.org/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754, upload-time = "2026-06-29T13:04:12.046Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381, upload-time = "2026-06-29T13:04:13.413Z" }, + { url = "https://files.pythonhosted.org/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578, upload-time = "2026-06-29T13:04:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154, upload-time = "2026-06-29T13:04:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458, upload-time = "2026-06-29T13:04:17.707Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739, upload-time = "2026-06-29T13:04:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911, upload-time = "2026-06-29T13:04:21.257Z" }, + { url = "https://files.pythonhosted.org/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747, upload-time = "2026-06-29T13:04:22.677Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225, upload-time = "2026-06-29T13:04:24.441Z" }, + { url = "https://files.pythonhosted.org/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169, upload-time = "2026-06-29T13:04:25.884Z" }, + { url = "https://files.pythonhosted.org/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332, upload-time = "2026-06-29T13:04:27.302Z" }, + { url = "https://files.pythonhosted.org/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377, upload-time = "2026-06-29T13:04:28.731Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746, upload-time = "2026-06-29T13:04:30.319Z" }, + { url = "https://files.pythonhosted.org/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292, upload-time = "2026-06-29T13:04:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259, upload-time = "2026-06-29T13:04:33.721Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523, upload-time = "2026-06-29T13:04:35.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366, upload-time = "2026-06-29T13:04:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516, upload-time = "2026-06-29T13:04:38.004Z" }, + { url = "https://files.pythonhosted.org/packages/06/d3/8e278946d43eeca2585b4dd0834a887cd71136329b837f3a16ed86a8b4b0/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:850ccb1d7eedb4200f4014b1c0e8a577de114fc3cd88faad646dcc9bc4bb12ad", size = 304518, upload-time = "2026-06-29T13:05:00.172Z" }, + { url = "https://files.pythonhosted.org/packages/72/43/28d4ef495028bf0506a413d4db3f4eb3e7288a382e0f065f306a17bbeb5e/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:e34e97bda77eb63242a410243c071e28ac7e0d8c0948c5ee658498690a4b2f2f", size = 310207, upload-time = "2026-06-29T13:05:02.123Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ca/c366b1012da1d640de975d9683acd44e4d150d9068845d0ca2610435253f/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7dc85ea77d4abbae8bad0d3538678aedee75bceec4e2f6c8dfb1c74772e5aa5", size = 342771, upload-time = "2026-06-29T13:05:03.55Z" }, + { url = "https://files.pythonhosted.org/packages/16/52/50cc4056fc1ae02e7154704e7ecc89df0afb8300222cfe8a52d3f67e4730/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ca7fae79f6d99cd9a042b75f917eaada7b895cfc7dd2ee3a16089dcaec7a85", size = 346468, upload-time = "2026-06-29T13:05:05.452Z" }, + { url = "https://files.pythonhosted.org/packages/98/ab/664fd8c4be028b2bedd3d2ff08769c4ede23d0dbc87a77c62384a0515b5d/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:f17d61a28b4b3e0e3e2ba98490c70501403b4d196f78732439160e7fd3678127", size = 303106, upload-time = "2026-06-29T13:05:07.118Z" }, + { url = "https://files.pythonhosted.org/packages/1a/07/421f1d5b65493a76e16027b848aba6a7d28073ae75944fa4289cc914d39f/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:96e38eea538c8ddf853a35727c7be0741c76c13f04148ac5c116222f50ece3b3", size = 304658, upload-time = "2026-06-29T13:05:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/0a/db/bba1155f01a01c3c37a89425d571da751bbedf5c54247b831a04cb971798/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d284fb8d94d5855d60c44fefcab4bf966f1da6fada73992b01f6f0c9bc0c6702", size = 339719, upload-time = "2026-06-29T13:05:10.41Z" }, + { 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 = "jmespath" version = "1.1.0" @@ -3141,8 +3305,8 @@ name = "jsbeautifier" version = "1.15.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "editorconfig" }, - { name = "six" }, + { name = "editorconfig", marker = "platform_python_implementation != 'PyPy'" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ea/98/d6cadf4d5a1c03b2136837a435682418c29fdeb66be137128544cecc5b7a/jsbeautifier-1.15.4.tar.gz", hash = "sha256:5bb18d9efb9331d825735fbc5360ee8f1aac5e52780042803943aa7f854f7592", size = 75257, upload-time = "2025-02-27T17:53:53.252Z" } wheels = [ @@ -3163,8 +3327,8 @@ name = "jwcrypto" version = "1.5.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "typing-extensions" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/7e/53c14813521693e931e420d9db00efe317419ff194495903bce03402275e/jwcrypto-1.5.8.tar.gz", hash = "sha256:c3d7114b6f6e65b52f6b7da817eb8cb8423e1da31e1ef13508447c81ecbdcc34", size = 90772, upload-time = "2026-06-24T19:36:50.782Z" } wheels = [ @@ -3176,13 +3340,13 @@ name = "keyring" version = "25.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, - { name = "jaraco-classes" }, - { name = "jaraco-context" }, - { name = "jaraco-functools" }, - { name = "jeepney", marker = "sys_platform == 'linux'" }, - { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, - { name = "secretstorage", marker = "sys_platform == 'linux'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.12' and platform_python_implementation != 'PyPy'" }, + { name = "jaraco-classes", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jaraco-context", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jaraco-functools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jeepney", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "secretstorage", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } wheels = [ @@ -3194,10 +3358,10 @@ name = "kombu" version = "5.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "amqp" }, - { name = "packaging" }, - { name = "tzdata" }, - { name = "vine" }, + { name = "amqp", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzdata", marker = "platform_python_implementation != 'PyPy'" }, + { name = "vine", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b6/a5/607e533ed6c83ae1a696969b8e1c137dfebd5759a2e9682e26ff1b97740b/kombu-5.6.2.tar.gz", hash = "sha256:8060497058066c6f5aed7c26d7cd0d3b574990b09de842a8c5aaed0b92cc5a55", size = 472594, upload-time = "2025-12-29T20:30:07.779Z" } wheels = [ @@ -3209,7 +3373,7 @@ name = "langdetect" version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/72/a3add0e4eec4eb9e2569554f7c70f4a3c27712f40e3284d483e88094cc0e/langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0", size = 981474, upload-time = "2021-05-07T07:54:13.562Z" } @@ -3409,7 +3573,7 @@ name = "markdown-it-py" version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mdurl" }, + { name = "mdurl", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ @@ -3495,7 +3659,7 @@ name = "matplotlib-inline" version = "0.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "traitlets" }, + { name = "traitlets", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } wheels = [ @@ -3552,14 +3716,14 @@ name = "moai-iplweb" version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "paste" }, - { name = "pastedeploy" }, - { name = "pastescript" }, - { name = "pyoai" }, - { name = "sqlalchemy" }, - { name = "webob" }, - { name = "wsgi-intercept" }, - { name = "wsgiutils" }, + { name = "paste", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pastedeploy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pastescript", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyoai", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sqlalchemy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "webob", marker = "platform_python_implementation != 'PyPy'" }, + { name = "wsgi-intercept", marker = "platform_python_implementation != 'PyPy'" }, + { name = "wsgiutils", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/13/d2624e206d90885e93a49cb1320774abc82a239fa10ff06ec20210240b74/moai_iplweb-2.0.2.tar.gz", hash = "sha256:6109e12181ef2f473667372da6f785fbfb2c14724019a991847a299538243038", size = 36259, upload-time = "2026-04-19T20:57:07.637Z" } wheels = [ @@ -3571,7 +3735,7 @@ name = "model-bakery" version = "1.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "django" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f9/49/3e5b51d7af52bf39e348767c1feb16c97d18654a8e3f3306eb4b899e98cf/model_bakery-1.24.0.tar.gz", hash = "sha256:6469223c9fb0eccb021d5c33667b914e9208dd2282d7dc1e55394c2310a7687d", size = 28372, upload-time = "2026-06-23T21:55:23.19Z" } wheels = [ @@ -3592,10 +3756,10 @@ name = "mozilla-django-oidc" version = "5.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "django" }, - { name = "pyjwt" }, - { name = "requests" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyjwt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/5e/d5906dc016253d248eabf3608a6bbfd0df75a993a467cf7cf0a0c7f2b18a/mozilla_django_oidc-5.0.2.tar.gz", hash = "sha256:4e953dcd963c036daaa2ac42b5bb6ea89a1c6ea7be0387c2022a59aca2f83043", size = 57360, upload-time = "2025-12-19T16:11:40.685Z" } wheels = [ @@ -3805,12 +3969,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, ] +[[package]] +name = "openai" +version = "2.53.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "distro", marker = "platform_python_implementation != 'PyPy'" }, + { name = "httpx", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jiter", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydantic", marker = "platform_python_implementation != 'PyPy'" }, + { name = "sniffio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tqdm", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/cf/36e3e7235fdf6d125c052acc0970924611b17a20a4fe580596faf4566a65/openai-2.53.0.tar.gz", hash = "sha256:baf5802ad08980e1d9d561e1b996e800c8bcd14af5847c6d0e7a5cc59e4d4116", size = 1099435, upload-time = "2026-08-03T21:42:01.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/0f/cc6afea3542a5142c5d8fc8211c5e059a8375105d004a41dfa2c7948dbb0/openai-2.53.0-py3-none-any.whl", hash = "sha256:c694ffc747a3c4d1663ef2b07b811315a476164ee5efa3a993967349ebca7618", size = 1659829, upload-time = "2026-08-03T21:41:59.581Z" }, +] + [[package]] name = "openpyxl" version = "3.1.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "et-xmlfile" }, + { name = "et-xmlfile", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } wheels = [ @@ -3822,12 +4005,12 @@ name = "ortools" version = "9.15.6755" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "absl-py" }, - { name = "immutabledict" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "protobuf" }, - { name = "typing-extensions" }, + { name = "absl-py", marker = "platform_python_implementation != 'PyPy'" }, + { name = "immutabledict", marker = "platform_python_implementation != 'PyPy'" }, + { name = "numpy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pandas", marker = "platform_python_implementation != 'PyPy'" }, + { name = "protobuf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/0b/16/a08369f1d2022b5aea8d9ceede08df417622015447b817019e11ef4a1d9b/ortools-9.15.6755-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:55e291560d2fdb9590656cbee06ba99ee7f2476bd7d316ff757eeab33e9b20d6", size = 23886068, upload-time = "2026-01-14T15:38:55.095Z" }, @@ -3861,7 +4044,7 @@ name = "oscrypto" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asn1crypto" }, + { name = "asn1crypto", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/81/a7654e654a4b30eda06ef9ad8c1b45d1534bfd10b5c045d0c0f6b16fecd2/oscrypto-1.3.0.tar.gz", hash = "sha256:6f5fef59cb5b3708321db7cca56aed8ad7e662853351e7991fcf60ec606d47a4", size = 184590, upload-time = "2022-03-18T01:53:26.889Z" } wheels = [ @@ -3882,9 +4065,9 @@ name = "pandas" version = "3.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, + { name = "numpy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dateutil", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzdata", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'emscripten') or (platform_python_implementation != 'PyPy' and sys_platform == 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } wheels = [ @@ -3936,10 +4119,10 @@ name = "paramiko" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "bcrypt" }, - { name = "cryptography" }, - { name = "invoke" }, - { name = "pynacl" }, + { name = "bcrypt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "invoke", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pynacl", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/93/dcc25d52f49022ae6175d15e6bd751f1acc99b98bc61fc55e5155a7be2e7/paramiko-5.0.0.tar.gz", hash = "sha256:36763b5b95c2a0dcfdf1abc48e48156ee425b21efe2f0e787c2dd5a95c0e5e79", size = 1548586, upload-time = "2026-05-09T18:28:52.256Z" } wheels = [ @@ -3960,7 +4143,7 @@ name = "paste" version = "3.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d7/1c/6bc9040bf9b4cfc9334f66d2738f952384c106c48882adf6097fed3da966/paste-3.10.1.tar.gz", hash = "sha256:1c3d12065a5e8a7a18c0c7be1653a97cf38cc3e9a5a0c8334a9dd992d3a05e4a", size = 652629, upload-time = "2024-05-01T11:41:08.536Z" } wheels = [ @@ -3981,9 +4164,9 @@ name = "pastescript" version = "3.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "paste" }, - { name = "pastedeploy" }, - { name = "setuptools" }, + { name = "paste", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pastedeploy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/c3/a12bc48375d6408eeef371a5c386ef4f62dac56ae35ae2eab042e00689e6/pastescript-3.7.0.tar.gz", hash = "sha256:536f028dfb6e5329c67b32299e1c9303f91264e49793cc6916eb0a73eb4a2521", size = 98747, upload-time = "2025-01-22T16:15:28.827Z" } wheels = [ @@ -4004,8 +4187,8 @@ name = "pbn-client" version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, - { name = "simplejson" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "simplejson", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fb/53/ef61b6f58592eef44a27a216e9a7687a782a09f5e3f2d499860e59bd9c0d/pbn_client-0.2.2.tar.gz", hash = "sha256:21b78873fbea40c4e13cee39c75ea3e1411429dd21a9c772c2fac83963e3f6c4", size = 64750, upload-time = "2026-08-05T07:27:16.427Z" } wheels = [ @@ -4017,7 +4200,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -4102,8 +4285,8 @@ name = "playwright" version = "1.62.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet" }, - { name = "pyee" }, + { name = "greenlet", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyee", marker = "platform_python_implementation != 'PyPy'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/6c/5b/ca2abcf3aa69f9fb510215e3064f30b57fe57657c8d04ede45bb966d5606/playwright-1.62.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:d8da938f3748841a8754f2e1f0216902c1c8f8ae3720de8b32ccf8e6913a7c4f", size = 43732091, upload-time = "2026-07-31T17:00:44.178Z" }, @@ -4139,8 +4322,8 @@ name = "polish-inflection" version = "0.7.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "marisa-trie" }, - { name = "polish-inflection-data" }, + { name = "marisa-trie", marker = "platform_python_implementation != 'PyPy'" }, + { name = "polish-inflection-data", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/21/53697694f0f813f5cc8c6a61c02b3d797edbe9337734d1dab749c690d2bd/polish_inflection-0.7.3.tar.gz", hash = "sha256:28aed6b2043e005298b1191f383c94a2d9eb29aa0210865d31f78b5baa96dc92", size = 70472, upload-time = "2026-07-03T20:21:01.566Z" } wheels = [ @@ -4161,11 +4344,11 @@ name = "pre-commit" version = "4.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, + { name = "cfgv", marker = "platform_python_implementation != 'PyPy'" }, + { name = "identify", marker = "platform_python_implementation != 'PyPy'" }, + { name = "nodeenv", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyyaml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "virtualenv", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/3a/ddb78f32a0814e66b18a099377a106a2dcdce92d86a034d69d65df9b256e/pre_commit-4.6.1.tar.gz", hash = "sha256:03e809865c7d178b9979d06c761fcbfe6808fdaded8581a745bb110e52050421", size = 198646, upload-time = "2026-07-21T20:56:58.225Z" } wheels = [ @@ -4195,7 +4378,7 @@ name = "prompt-toolkit" version = "3.0.52" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wcwidth" }, + { name = "wcwidth", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } wheels = [ @@ -4207,7 +4390,7 @@ name = "proto-plus" version = "1.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf" }, + { name = "protobuf", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/56/e647b0c675392d2da368da7b6f158f7368b18542fd6f7d7400a2f39de000/proto_plus-1.28.0.tar.gz", hash = "sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9", size = 57221, upload-time = "2026-05-07T08:04:50.811Z" } wheels = [ @@ -4341,7 +4524,7 @@ name = "pyasn1-modules" version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyasn1" }, + { name = "pyasn1", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } wheels = [ @@ -4379,6 +4562,123 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, ] +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydantic-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-inspection", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + [[package]] name = "pydyf" version = "0.11.0" @@ -4393,7 +4693,7 @@ name = "pyee" version = "13.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } wheels = [ @@ -4405,8 +4705,8 @@ name = "pygad" version = "3.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cloudpickle" }, - { name = "numpy" }, + { name = "cloudpickle", marker = "platform_python_implementation != 'PyPy'" }, + { name = "numpy", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a4/af/05a6d18c27d196cbdce1131aef480441928940dfa33d55dc95dc701b420b/pygad-3.7.0.tar.gz", hash = "sha256:9858226f1b1482ab845b3129152fe9ca4457a7bcae5804717647beacd00b734c", size = 266300, upload-time = "2026-06-05T22:38:52.979Z" } wheels = [ @@ -4427,13 +4727,13 @@ name = "pyhanko" version = "0.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asn1crypto" }, - { name = "cryptography" }, - { name = "lxml" }, - { name = "pyhanko-certvalidator" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tzlocal" }, + { name = "asn1crypto", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "lxml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyhanko-certvalidator", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyyaml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tzlocal", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bf/d5/9be7c6a62d9fe9ad824f4a3144e7f55bff11198446fe4ec7f96cd3f9673c/pyhanko-0.32.0.tar.gz", hash = "sha256:47df283f14289b9df72071c3e5c52c426998f1850e21bff9d6451e4369595820", size = 411900, upload-time = "2025-11-22T16:22:07.543Z" } wheels = [ @@ -4445,11 +4745,11 @@ name = "pyhanko-certvalidator" version = "0.29.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asn1crypto" }, - { name = "cryptography" }, - { name = "oscrypto" }, - { name = "requests" }, - { name = "uritools" }, + { name = "asn1crypto", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "oscrypto", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "uritools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a0/3d/3e41e3b492b84e327c2340c380439c6805f9d2a3b574f662041958f19373/pyhanko_certvalidator-0.29.0.tar.gz", hash = "sha256:8ebb98e742e4a2e2347374535c1329abf77c398addb31e623f33645ace02efa4", size = 93212, upload-time = "2025-09-12T22:05:37.207Z" } wheels = [ @@ -4467,7 +4767,7 @@ wheels = [ [package.optional-dependencies] crypto = [ - { name = "cryptography" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -4481,7 +4781,7 @@ name = "pymed-iplweb" version = "0.8.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/44/85/5600c04401f34e2c6b13f243f41db6aa52342040ffc941908b1c3b9ab210/pymed_iplweb-0.8.11.tar.gz", hash = "sha256:ec24b07388fdec59fcb8ccfb926e5254f27ef06b039b017c80162bccb158854a", size = 11535, upload-time = "2026-04-16T11:50:21.128Z" } wheels = [ @@ -4493,7 +4793,7 @@ name = "pynacl" version = "1.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/9a/4019b524b03a13438637b11538c82781a5eda427394380381af8f04f467a/pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c", size = 3511692, upload-time = "2026-01-01T17:48:10.851Z" } wheels = [ @@ -4528,8 +4828,8 @@ name = "pyoai" version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "lxml" }, - { name = "six" }, + { name = "lxml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/3c/0ad6e6d50fc355be718fe667541797a27d0252641983b7925df685ef2163/pyoai-2.5.0.tar.gz", hash = "sha256:029521e1f6a819511feb4299a6181b5c312e8a71f7cddc4547e27001e7552be0", size = 106528, upload-time = "2017-07-03T15:06:47.99Z" } @@ -4538,8 +4838,8 @@ name = "pyopenssl" version = "26.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3f/e8/7325d258199b159eb2c03fe32107533e2832e70e63f4fb88a6aa00023201/pyopenssl-26.4.0.tar.gz", hash = "sha256:28dfcce0162b9211413e26dfbfdf1d24317fbeba18fc93c12400a1856b2a0bc7", size = 182046, upload-time = "2026-08-01T19:50:50.512Z" } wheels = [ @@ -4596,8 +4896,8 @@ name = "pysolr" version = "3.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, - { name = "setuptools" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "setuptools", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0d/2a/b6c793a17e173524ccc7a90cdd8ebb65264f6ebcdb1942eba2478ec3a85e/pysolr-3.11.0.tar.gz", hash = "sha256:bbd0e7467835316880f994b55386c9bc3c146733c17d85a3fed317755976c40a", size = 63983, upload-time = "2025-11-18T10:42:40.247Z" } @@ -4606,11 +4906,11 @@ name = "pytest" version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, + { name = "colorama", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "iniconfig", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pluggy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pygments", marker = "platform_python_implementation != 'PyPy'" }, ] 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 = [ @@ -4622,8 +4922,8 @@ name = "pytest-base-url" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "requests" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702, upload-time = "2024-01-31T22:43:00.81Z" } wheels = [ @@ -4635,9 +4935,9 @@ name = "pytest-cov" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, - { name = "pluggy" }, - { name = "pytest" }, + { name = "coverage", extra = ["toml"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "pluggy", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ @@ -4649,7 +4949,7 @@ name = "pytest-django" version = "4.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/2b/db9a193df89e5660137f5428063bcc2ced7ad790003b26974adf5c5ceb3b/pytest_django-4.12.0.tar.gz", hash = "sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758", size = 91156, upload-time = "2026-02-14T18:40:49.235Z" } wheels = [ @@ -4661,8 +4961,8 @@ name = "pytest-env" version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "python-dotenv" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dotenv", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/65/49/08ee056f9cc655e437abcf2ae399884844b623223476ae6a77244131db03/pytest_env-1.7.0.tar.gz", hash = "sha256:0c1dc1101fb8d3ab3611e8f8d657ba06c3c0c167fc85c90457e5b27f2508f43e", size = 16408, upload-time = "2026-07-21T13:09:21.834Z" } wheels = [ @@ -4674,7 +4974,7 @@ name = "pytest-httpserver" version = "1.1.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "werkzeug" }, + { name = "werkzeug", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/17/ad187f46998814014f7cda309de700b87c0eb4b2e111e18bc8c819be7116/pytest_httpserver-1.1.5.tar.gz", hash = "sha256:dc3d82e1fe00e491829d8939c549bf4bd9b39a260f87113c619b9d517c2f8ff1", size = 70974, upload-time = "2026-02-14T13:27:23.412Z" } wheels = [ @@ -4686,7 +4986,7 @@ name = "pytest-mock" version = "3.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" } wheels = [ @@ -4698,10 +4998,10 @@ name = "pytest-playwright" version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "playwright" }, - { name = "pytest" }, - { name = "pytest-base-url" }, - { name = "python-slugify" }, + { name = "playwright", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-base-url", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-slugify", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/ef/172eb8e23c80491fc72f1401c72f9305663873649351306a38b18406b0c9/pytest_playwright-0.8.0.tar.gz", hash = "sha256:7888d4a2443160c82e0c506c437076679f86b36d1910427250d90fbf1843a981", size = 17132, upload-time = "2026-05-18T10:16:15.919Z" } wheels = [ @@ -4713,8 +5013,8 @@ name = "pytest-recording" version = "0.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "vcrpy" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "vcrpy", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/32/9c/f4027c5f1693847b06d11caf4b4f6bb09f22c1581ada4663877ec166b8c6/pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c", size = 26576, upload-time = "2025-05-08T10:41:11.231Z" } wheels = [ @@ -4726,7 +5026,7 @@ name = "pytest-repeat" version = "0.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/d4/69e9dbb9b8266df0b157c72be32083403c412990af15c7c15f7a3fd1b142/pytest_repeat-0.9.4.tar.gz", hash = "sha256:d92ac14dfaa6ffcfe6917e5d16f0c9bc82380c135b03c2a5f412d2637f224485", size = 6488, upload-time = "2025-04-07T14:59:53.077Z" } wheels = [ @@ -4738,8 +5038,8 @@ name = "pytest-rerunfailures" version = "16.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, - { name = "pytest" }, + { name = "packaging", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635, upload-time = "2026-07-01T06:30:56.813Z" } wheels = [ @@ -4751,7 +5051,7 @@ name = "pytest-split" version = "0.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/16/8af4c5f2ceb3640bb1f78dfdf5c184556b10dfe9369feaaad7ff1c13f329/pytest_split-0.11.0.tar.gz", hash = "sha256:8ebdb29cc72cc962e8eb1ec07db1eeb98ab25e215ed8e3216f6b9fc7ce0ec2b5", size = 13421, upload-time = "2026-02-03T09:14:31.469Z" } wheels = [ @@ -4763,9 +5063,9 @@ name = "pytest-testcontainers" version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docker" }, - { name = "pytest" }, - { name = "testcontainers" }, + { name = "docker", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "testcontainers", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3c/ab/e71331e7ed6ecfd87755bd17c0b79462ca50f5e6b52592432b47d1fd9cfc/pytest_testcontainers-0.2.2.tar.gz", hash = "sha256:8df25594dc022773d4cbb4ee78f99810b0b3ae1ad9b5c0dea731e45ac85311db", size = 37465, upload-time = "2026-06-29T14:29:04.438Z" } wheels = [ @@ -4777,10 +5077,10 @@ name = "pytest-testcontainers-django" version = "0.2.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "pytest-django" }, - { name = "pytest-testcontainers" }, - { name = "testcontainers" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-django", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest-testcontainers", marker = "platform_python_implementation != 'PyPy'" }, + { name = "testcontainers", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/1d/f4ab596c6ec7606dcfb2ad6a27e2ff18044ff7beabef48cf88610df4d42d/pytest_testcontainers_django-0.2.5.tar.gz", hash = "sha256:f4d20576ea0826224307e06b102b44d504881eef65acbacc3ac2a50328625e4f", size = 30776, upload-time = "2026-06-29T14:32:45.311Z" } wheels = [ @@ -4792,7 +5092,7 @@ name = "pytest-timeout" version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } wheels = [ @@ -4804,8 +5104,8 @@ name = "pytest-tqdm" version = "0.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "tqdm" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tqdm", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/27/08b7a2e45d469fd052a6c6719946300160a8bf5603b101922363922e0f69/pytest_tqdm-0.4.0.tar.gz", hash = "sha256:eefa4e26145e7ad7d4f3e1ec23c5000f4115d74ea1c19daa7487ca70e832e19a", size = 15113, upload-time = "2026-07-13T15:11:57.19Z" } wheels = [ @@ -4817,8 +5117,8 @@ name = "pytest-xdist" version = "3.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "execnet" }, - { name = "pytest" }, + { name = "execnet", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pytest", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } wheels = [ @@ -4900,7 +5200,7 @@ name = "python-dateutil" version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ @@ -4912,8 +5212,8 @@ name = "python-discovery" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, - { name = "platformdirs" }, + { name = "filelock", marker = "platform_python_implementation != 'PyPy'" }, + { name = "platformdirs", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/48/60/e88788207d81e46362cfbef0d4aaf4c0f49efc3c12d4c3fa3f542c34ebec/python_discovery-1.3.1.tar.gz", hash = "sha256:62f6db28064c9613e7ca76cb3f00c38c839a07c31c00dfe7ed0986493d2150a6", size = 68011, upload-time = "2026-05-12T20:53:36.336Z" } wheels = [ @@ -4925,8 +5225,8 @@ name = "python-docx" version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "lxml" }, - { name = "typing-extensions" }, + { name = "lxml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256, upload-time = "2025-06-16T20:46:27.921Z" } wheels = [ @@ -4947,8 +5247,8 @@ name = "python-ldap" version = "3.4.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyasn1" }, - { name = "pyasn1-modules" }, + { name = "pyasn1", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyasn1-modules", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0c/88/8d2797decc42e1c1cdd926df4f005e938b0643d0d1219c08c2b5ee8ae0c0/python_ldap-3.4.5.tar.gz", hash = "sha256:b2f6ef1c37fe2c6a5a85212efe71311ee21847766a7d45fcb711f3b270a5f79a", size = 388482, upload-time = "2025-10-10T20:00:39.06Z" } @@ -4957,7 +5257,7 @@ name = "python-slugify" version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "text-unidecode" }, + { name = "text-unidecode", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } wheels = [ @@ -5052,7 +5352,7 @@ name = "questionary" version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "prompt-toolkit" }, + { name = "prompt-toolkit", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f6/45/eafb0bba0f9988f6a2520f9ca2df2c82ddfa8d67c95d6625452e97b204a5/questionary-2.1.1.tar.gz", hash = "sha256:3d7e980292bb0107abaa79c68dd3eee3c561b83a0f89ae482860b181c8bd412d", size = 25845, upload-time = "2025-08-28T19:00:20.851Z" } wheels = [ @@ -5189,9 +5489,9 @@ name = "readme-renderer" version = "44.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docutils" }, - { name = "nh3" }, - { name = "pygments" }, + { name = "docutils", marker = "platform_python_implementation != 'PyPy'" }, + { name = "nh3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pygments", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } wheels = [ @@ -5203,7 +5503,7 @@ name = "redis" version = "7.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, + { name = "async-timeout", marker = "python_full_version < '3.11.3' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/7f/3759b1d0d72b7c92f0d70ffd9dc962b7b7b5ee74e135f9d7d8ab06b8a318/redis-7.4.0.tar.gz", hash = "sha256:64a6ea7bf567ad43c964d2c30d82853f8df927c5c9017766c55a1d1ed95d18ad", size = 4943913, upload-time = "2026-03-24T09:14:37.53Z" } wheels = [ @@ -5319,8 +5619,8 @@ name = "reportlab" version = "4.4.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "charset-normalizer" }, - { name = "pillow" }, + { name = "charset-normalizer", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pillow", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/35/ec/f7a50b3cbee58407090bd1f2a9db2f1a23052c5de3bc7408024ca776ee02/reportlab-4.4.6.tar.gz", hash = "sha256:8792c87c23dd034d17530e6ebe4164d61bcc8f7b0eac203fe13cc03cc2c1c607", size = 3910805, upload-time = "2025-12-10T12:37:21.17Z" } wheels = [ @@ -5332,10 +5632,10 @@ name = "requests" version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, + { name = "certifi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "charset-normalizer", marker = "platform_python_implementation != 'PyPy'" }, + { name = "idna", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ @@ -5347,8 +5647,8 @@ name = "requests-oauthlib" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "oauthlib" }, - { name = "requests" }, + { name = "oauthlib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } wheels = [ @@ -5360,7 +5660,7 @@ name = "requests-toolbelt" version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } wheels = [ @@ -5381,8 +5681,8 @@ name = "rich" version = "14.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, + { name = "markdown-it-py", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pygments", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } wheels = [ @@ -5438,8 +5738,8 @@ name = "rlpycairo" version = "0.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "freetype-py" }, - { name = "pycairo" }, + { name = "freetype-py", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pycairo", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/24/09b18821e06de45394d34dda706d34169db6bddd6a403346caa3496b3668/rlpycairo-0.4.0.tar.gz", hash = "sha256:07c2c3c47828e83d9c09657a54ecbcd1a97aac9dc199780234456d3473faadc7", size = 7692, upload-time = "2025-08-15T12:25:22.761Z" } wheels = [ @@ -5451,7 +5751,7 @@ name = "rollbar" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3b/3f/92e8c728e42aba86db5f8d6e2e9c23926b2d8df81a02cdcab0c044e285e9/rollbar-1.4.0.tar.gz", hash = "sha256:98ad7f90012c791d0b40eac51b6fe688b1cadcc4aadff772fc0a23efe75fb5fc", size = 94401, upload-time = "2026-07-10T16:32:15.518Z" } wheels = [ @@ -5488,7 +5788,7 @@ name = "s3transfer" version = "0.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "botocore" }, + { name = "botocore", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e0/1f/12417f7f493fc45e1f9fd5d4a9b6c125cf8d2cf3f8ddbdfab3e76406e9d6/s3transfer-0.18.0.tar.gz", hash = "sha256:3760b8b7ec1315da54048b2d626276732bee4300d054d492d4e1d43e20d4ecbd", size = 160560, upload-time = "2026-05-28T19:39:09.124Z" } wheels = [ @@ -5500,8 +5800,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "jeepney" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "jeepney", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -5513,10 +5813,10 @@ name = "service-identity" version = "24.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs" }, - { name = "cryptography" }, - { name = "pyasn1" }, - { name = "pyasn1-modules" }, + { name = "attrs", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cryptography", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyasn1", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyasn1-modules", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/a5/dfc752b979067947261dbbf2543470c58efe735c3c1301dd870ef27830ee/service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09", size = 39245, upload-time = "2024-10-26T07:21:57.736Z" } wheels = [ @@ -5610,7 +5910,7 @@ name = "smart-open" version = "7.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wrapt" }, + { name = "wrapt", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/d8/1481294b2d110b805c0f5d23ef34158b7d5d4283633c0d34c69ea89bb76b/smart_open-7.0.5.tar.gz", hash = "sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18", size = 71693, upload-time = "2024-10-04T13:58:32.442Z" } wheels = [ @@ -5619,14 +5919,14 @@ wheels = [ [package.optional-dependencies] all = [ - { name = "azure-common" }, - { name = "azure-core" }, - { name = "azure-storage-blob" }, - { name = "boto3" }, - { name = "google-cloud-storage" }, - { name = "paramiko" }, - { name = "requests" }, - { name = "zstandard" }, + { name = "azure-common", marker = "platform_python_implementation != 'PyPy'" }, + { name = "azure-core", marker = "platform_python_implementation != 'PyPy'" }, + { name = "azure-storage-blob", marker = "platform_python_implementation != 'PyPy'" }, + { name = "boto3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "google-cloud-storage", marker = "platform_python_implementation != 'PyPy'" }, + { name = "paramiko", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "zstandard", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -5652,7 +5952,7 @@ name = "sqlalchemy" version = "1.4.54" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "greenlet", marker = "(platform_machine == 'AMD64' and platform_python_implementation != 'PyPy') or (platform_machine == 'WIN32' and platform_python_implementation != 'PyPy') or (platform_machine == 'aarch64' and platform_python_implementation != 'PyPy') or (platform_machine == 'amd64' and platform_python_implementation != 'PyPy') or (platform_machine == 'ppc64le' and platform_python_implementation != 'PyPy') or (platform_machine == 'win32' and platform_python_implementation != 'PyPy') or (platform_machine == 'x86_64' and platform_python_implementation != 'PyPy')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/af/20290b55d469e873cba9d41c0206ab5461ff49d759989b3fe65010f9d265/sqlalchemy-1.4.54.tar.gz", hash = "sha256:4470fbed088c35dc20b78a39aaf4ae54fe81790c783b3264872a0224f437c31a", size = 8470350, upload-time = "2024-09-05T15:54:10.398Z" } wheels = [ @@ -5682,9 +5982,9 @@ name = "stack-data" version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, + { name = "asttokens", marker = "platform_python_implementation != 'PyPy'" }, + { name = "executing", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pure-eval", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } wheels = [ @@ -5696,11 +5996,11 @@ name = "svglib" version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cssselect2" }, - { name = "lxml" }, - { name = "reportlab" }, - { name = "rlpycairo" }, - { name = "tinycss2" }, + { name = "cssselect2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "lxml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "reportlab", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rlpycairo", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tinycss2", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/16/6b5f9f8c8b18d9ab5112d11e2d6c40c965e3d7ab2948b744685fe6d2f9f5/svglib-1.6.0.tar.gz", hash = "sha256:4c38a274a744ef0d1677f55d5d62fc0fb798819f813e52872a796e615741733d", size = 1318276, upload-time = "2025-09-25T09:48:37.839Z" } wheels = [ @@ -5721,11 +6021,11 @@ name = "testcontainers" version = "4.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docker" }, - { name = "python-dotenv" }, - { name = "typing-extensions" }, - { name = "urllib3" }, - { name = "wrapt" }, + { name = "docker", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dotenv", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, + { name = "wrapt", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/13/2cc466bddf26d0085f30a2b2bd56b7f8708b54a54db833eec97c5c69129b/testcontainers-4.15.0.tar.gz", hash = "sha256:085cde086337632e19002719460b7b80bbab2bdd51bb3ea04f77d0de96504706", size = 95340, upload-time = "2026-07-24T23:08:01.731Z" } wheels = [ @@ -5734,7 +6034,7 @@ wheels = [ [package.optional-dependencies] redis = [ - { name = "redis" }, + { name = "redis", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -5751,7 +6051,7 @@ name = "thefuzz" version = "0.22.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "rapidfuzz" }, + { name = "rapidfuzz", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/4b/d3eb25831590d6d7d38c2f2e3561d3ba41d490dc89cd91d9e65e7c812508/thefuzz-0.22.1.tar.gz", hash = "sha256:7138039a7ecf540da323792d8592ef9902b1d79eb78c147d4f20664de79f3680", size = 19993, upload-time = "2024-01-19T19:18:23.135Z" } wheels = [ @@ -5763,7 +6063,7 @@ name = "tinycss2" version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "webencodings" }, + { name = "webencodings", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } wheels = [ @@ -5775,7 +6075,7 @@ name = "tinyhtml5" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "webencodings" }, + { name = "webencodings", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/03/6111ed99e9bf7dfa1c30baeef0e0fb7e0bd387bd07f8e5b270776fe1de3f/tinyhtml5-2.0.0.tar.gz", hash = "sha256:086f998833da24c300c414d9fe81d9b368fd04cb9d2596a008421cbc705fcfcc", size = 179507, upload-time = "2024-10-29T15:37:14.078Z" } wheels = [ @@ -5850,8 +6150,8 @@ name = "towncrier" version = "25.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "jinja2" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "jinja2", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c2/eb/5bf25a34123698d3bbab39c5bc5375f8f8bcbcc5a136964ade66935b8b9d/towncrier-25.8.0.tar.gz", hash = "sha256:eef16d29f831ad57abb3ae32a0565739866219f1ebfbdd297d32894eb9940eb1", size = 76322, upload-time = "2025-08-30T11:41:55.393Z" } wheels = [ @@ -5863,7 +6163,7 @@ name = "tqdm" version = "4.70.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } wheels = [ @@ -5884,15 +6184,15 @@ name = "twine" version = "6.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "id" }, - { name = "keyring", marker = "platform_machine != 'ppc64le' and platform_machine != 's390x'" }, - { name = "packaging" }, - { name = "readme-renderer" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "rfc3986" }, - { name = "rich" }, - { name = "urllib3" }, + { name = "id", marker = "platform_python_implementation != 'PyPy'" }, + { name = "keyring", marker = "platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_python_implementation != 'PyPy'" }, + { name = "packaging", marker = "platform_python_implementation != 'PyPy'" }, + { name = "readme-renderer", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests-toolbelt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rfc3986", marker = "platform_python_implementation != 'PyPy'" }, + { name = "rich", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } wheels = [ @@ -5904,13 +6204,13 @@ name = "twisted" version = "26.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs" }, - { name = "automat" }, - { name = "constantly" }, - { name = "hyperlink" }, - { name = "incremental" }, - { name = "typing-extensions" }, - { name = "zope-interface" }, + { name = "attrs", marker = "platform_python_implementation != 'PyPy'" }, + { name = "automat", marker = "platform_python_implementation != 'PyPy'" }, + { name = "constantly", marker = "platform_python_implementation != 'PyPy'" }, + { name = "hyperlink", marker = "platform_python_implementation != 'PyPy'" }, + { name = "incremental", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "zope-interface", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/db/97/6e9beb1e78247ae6dc34114f27d538cf2cb183c4afcd3609dfdf2b0439c8/twisted-26.4.0.tar.gz", hash = "sha256:dbfd0fe1ee409d0243fdd7a6a6ff14f4948cec1fd78e0376291f805e1501fae9", size = 3575095, upload-time = "2026-05-11T11:24:51.861Z" } wheels = [ @@ -5919,13 +6219,13 @@ wheels = [ [package.optional-dependencies] http2 = [ - { name = "h2" }, - { name = "priority" }, + { name = "h2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "priority", marker = "platform_python_implementation != 'PyPy'" }, ] tls = [ - { name = "idna" }, - { name = "pyopenssl" }, - { name = "service-identity" }, + { name = "idna", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyopenssl", marker = "platform_python_implementation != 'PyPy'" }, + { name = "service-identity", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -5946,6 +6246,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + [[package]] name = "tzdata" version = "2025.2" @@ -5960,7 +6272,7 @@ name = "tzlocal" version = "5.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ @@ -5999,8 +6311,8 @@ name = "uvicorn" version = "0.51.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "h11" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "h11", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412, upload-time = "2026-07-08T10:59:05.962Z" } wheels = [ @@ -6009,12 +6321,12 @@ wheels = [ [package.optional-dependencies] standard = [ - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, + { name = "httptools", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-dotenv", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyyaml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles", marker = "platform_python_implementation != 'PyPy'" }, + { name = "websockets", marker = "platform_python_implementation != 'PyPy'" }, ] [[package]] @@ -6022,8 +6334,8 @@ name = "uvicorn-worker" version = "0.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "gunicorn" }, - { name = "uvicorn" }, + { name = "gunicorn", marker = "platform_python_implementation != 'PyPy'" }, + { name = "uvicorn", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/59/9101b9c0680fd80e9d26c07deb822a5d18a324339fcf9cd017885ee808ad/uvicorn_worker-0.4.0.tar.gz", hash = "sha256:8ee5306070d8f38dce124adce488c3c0b50f20cf0c0222b12c66188da7214493", size = 9361, upload-time = "2025-09-20T10:47:01.218Z" } wheels = [ @@ -6061,8 +6373,8 @@ name = "vcrpy" version = "8.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyyaml" }, - { name = "wrapt" }, + { name = "pyyaml", marker = "platform_python_implementation != 'PyPy'" }, + { name = "wrapt", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/39/d5/8a1f8eb603e2d35fbb0ecd1e309d0c5c18a0ecfc8c0a8f04088bbc8f833b/vcrpy-8.3.0.tar.gz", hash = "sha256:46d64e77e8d95e5c76c7d9a94ff05d8b38b2ae4e1d4869eb0235024b6fcb5212", size = 96117, upload-time = "2026-07-04T14:27:01.608Z" } wheels = [ @@ -6083,10 +6395,10 @@ name = "virtualenv" version = "21.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, - { name = "python-discovery" }, + { name = "distlib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "filelock", marker = "platform_python_implementation != 'PyPy'" }, + { name = "platformdirs", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-discovery", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/e1/665267cea4767debd19f584667a9197c2098b5e7f67a502da9f3a086ab37/virtualenv-21.3.2.tar.gz", hash = "sha256:3ecda97894a6fc1c53106356f488690e5c86278c1f693f3fc0805ac85a513686", size = 7613810, upload-time = "2026-05-12T14:44:18.01Z" } wheels = [ @@ -6143,7 +6455,7 @@ name = "watchfiles" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, + { name = "anyio", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } wheels = [ @@ -6239,14 +6551,14 @@ name = "weasyprint" version = "69.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, - { name = "cssselect2" }, - { name = "fonttools", extra = ["woff"] }, - { name = "pillow" }, - { name = "pydyf" }, - { name = "pyphen" }, - { name = "tinycss2" }, - { name = "tinyhtml5" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "cssselect2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "fonttools", extra = ["woff"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "pillow", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydyf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyphen", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tinycss2", marker = "platform_python_implementation != 'PyPy'" }, + { name = "tinyhtml5", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/53/dcc3885c2f7a47faa45f6b8b801412f5f9e055173a52801ef01c09943c5a/weasyprint-69.0.tar.gz", hash = "sha256:a7a32f39ca16bd82ef11de99c92ea4b5f14951c9033af035e451ce4f4ee0a88c", size = 1549834, upload-time = "2026-06-02T14:42:17.765Z" } wheels = [ @@ -6267,7 +6579,7 @@ name = "webob" version = "1.8.10" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "legacy-cgi", marker = "python_full_version >= '3.13'" }, + { name = "legacy-cgi", marker = "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/f9/974eafebfd0bd442b8848899fe7d30675c93f750c313e1a6fe61acbde1e3/webob-1.8.10.tar.gz", hash = "sha256:1c963a11f307bc3f624fbab9dde737701eae255f32981b7a5486a88db1767c2b", size = 280796, upload-time = "2026-06-02T19:56:47.268Z" } wheels = [ @@ -6321,9 +6633,9 @@ name = "webtest" version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "beautifulsoup4" }, - { name = "waitress" }, - { name = "webob" }, + { name = "beautifulsoup4", marker = "platform_python_implementation != 'PyPy'" }, + { name = "waitress", marker = "platform_python_implementation != 'PyPy'" }, + { name = "webob", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/c8/8ffba1782700eb06e9b9169156698c6ba95c05b66cda3fc9e025b6b3b649/WebTest-3.0.0.tar.gz", hash = "sha256:54bd969725838d9861a9fa27f8d971f79d275d94ae255f5c501f53bb6d9929eb", size = 75871, upload-time = "2021-08-19T12:40:07.234Z" } wheels = [ @@ -6335,7 +6647,7 @@ name = "werkzeug" version = "3.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } wheels = [ @@ -6347,8 +6659,8 @@ name = "wosclient" version = "0.1.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "requests" }, + { name = "click", marker = "platform_python_implementation != 'PyPy'" }, + { name = "requests", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/37/a1/5d170a12144cf75f06ec01f6ddd991b38f79ca8f018ae9831723207cc62d/wosclient-0.1.5.tar.gz", hash = "sha256:ca8e3c40cac64fdb22c3b0627ef8b9d115a38ffea237fc23c4197d34f0a4f384", size = 12655, upload-time = "2018-04-22T14:37:34.041Z" } wheels = [ @@ -6419,7 +6731,7 @@ name = "wsgi-intercept" version = "1.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, + { name = "six", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4a/ed/28202fddeff86871b8a8d1fbb32878fe9df5592d5fd0fbac4ab81764202a/wsgi_intercept-1.13.1.tar.gz", hash = "sha256:79bd6c639ab11f7eabe5d18ad9a20f62ee82a1c435124a876cffd8038f6c24c1", size = 29288, upload-time = "2024-08-08T08:16:35.519Z" } wheels = [ @@ -6437,15 +6749,15 @@ name = "xhtml2pdf" version = "0.2.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "arabic-reshaper" }, - { name = "html5lib" }, - { name = "pillow" }, - { name = "pyhanko" }, - { name = "pyhanko-certvalidator" }, - { name = "pypdf" }, - { name = "python-bidi" }, - { name = "reportlab" }, - { name = "svglib" }, + { name = "arabic-reshaper", marker = "platform_python_implementation != 'PyPy'" }, + { name = "html5lib", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pillow", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyhanko", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pyhanko-certvalidator", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pypdf", marker = "platform_python_implementation != 'PyPy'" }, + { name = "python-bidi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "reportlab", marker = "platform_python_implementation != 'PyPy'" }, + { name = "svglib", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/da/9a/3b29831d8617ecbcf0b0aaa2b3e1b24f3fd1bbd204678ae86e9fee2f4239/xhtml2pdf-0.2.17.tar.gz", hash = "sha256:09ddbc31aa0e38a16f2f3cb73be89af5f7c968c17a564afdd685d280e39c526d", size = 139727, upload-time = "2025-02-23T23:17:02.484Z" } wheels = [