python-daynest 0.1.8__tar.gz → 0.1.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_daynest-0.1.8 → python_daynest-0.1.10}/.gitignore +1 -0
- {python_daynest-0.1.8 → python_daynest-0.1.10}/PKG-INFO +1 -1
- {python_daynest-0.1.8 → python_daynest-0.1.10}/pyproject.toml +5 -5
- {python_daynest-0.1.8 → python_daynest-0.1.10}/src/daynest/__init__.py +4 -0
- {python_daynest-0.1.8 → python_daynest-0.1.10}/src/daynest/client.py +168 -36
- {python_daynest-0.1.8 → python_daynest-0.1.10}/src/daynest/models.py +67 -0
- {python_daynest-0.1.8 → python_daynest-0.1.10}/tests/test_client.py +188 -4
- {python_daynest-0.1.8 → python_daynest-0.1.10}/uv.lock +118 -103
- {python_daynest-0.1.8 → python_daynest-0.1.10}/src/daynest/exceptions.py +0 -0
- {python_daynest-0.1.8 → python_daynest-0.1.10}/tests/__init__.py +0 -0
- {python_daynest-0.1.8 → python_daynest-0.1.10}/tests/test_package.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "python-daynest"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.10"
|
|
4
4
|
description = "Python client library for the Daynest API"
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -10,10 +10,10 @@ dependencies = [
|
|
|
10
10
|
|
|
11
11
|
[dependency-groups]
|
|
12
12
|
dev = [
|
|
13
|
-
"pytest
|
|
14
|
-
"pytest-asyncio
|
|
15
|
-
"ruff
|
|
16
|
-
"pyright
|
|
13
|
+
"pytest==9.1.1",
|
|
14
|
+
"pytest-asyncio==1.4.0",
|
|
15
|
+
"ruff==0.15.22",
|
|
16
|
+
"pyright==1.1.411",
|
|
17
17
|
]
|
|
18
18
|
|
|
19
19
|
[build-system]
|
|
@@ -17,6 +17,8 @@ from daynest.models import (
|
|
|
17
17
|
DaynestApiResponse,
|
|
18
18
|
DaynestDashboard,
|
|
19
19
|
DaynestSummary,
|
|
20
|
+
MealPlan,
|
|
21
|
+
MealSlot,
|
|
20
22
|
PlannedItem,
|
|
21
23
|
RoutineTemplate,
|
|
22
24
|
)
|
|
@@ -33,6 +35,8 @@ __all__ = [
|
|
|
33
35
|
"DaynestApiResponse",
|
|
34
36
|
"DaynestSummary",
|
|
35
37
|
"DaynestDashboard",
|
|
38
|
+
"MealPlan",
|
|
39
|
+
"MealSlot",
|
|
36
40
|
"PlannedItem",
|
|
37
41
|
"RoutineTemplate",
|
|
38
42
|
"ChoreTemplate",
|
|
@@ -31,6 +31,8 @@ from daynest.models import (
|
|
|
31
31
|
DaynestApiResponse,
|
|
32
32
|
DaynestDashboard,
|
|
33
33
|
DaynestSummary,
|
|
34
|
+
MealPlan,
|
|
35
|
+
MealSlot,
|
|
34
36
|
PlannedItem,
|
|
35
37
|
RoutineTemplate,
|
|
36
38
|
)
|
|
@@ -203,7 +205,7 @@ class DaynestClient:
|
|
|
203
205
|
Returns (authorization_url, token_url) or None if the backend is
|
|
204
206
|
unreachable or the response is malformed. Does not require authentication.
|
|
205
207
|
"""
|
|
206
|
-
url = urljoin(f"{base_url.strip().rstrip('/')}/", "api/
|
|
208
|
+
url = urljoin(f"{base_url.strip().rstrip('/')}/", "api/auth/oidc-config")
|
|
207
209
|
owned = session is None
|
|
208
210
|
if owned:
|
|
209
211
|
session = aiohttp.ClientSession()
|
|
@@ -233,7 +235,7 @@ class DaynestClient:
|
|
|
233
235
|
return await self._cached_call(
|
|
234
236
|
"async_get_summary",
|
|
235
237
|
lambda: self._request_model(
|
|
236
|
-
path="/api/
|
|
238
|
+
path="/api/integrations/home-assistant/summary",
|
|
237
239
|
parser=DaynestSummary.from_dict,
|
|
238
240
|
),
|
|
239
241
|
)
|
|
@@ -243,58 +245,58 @@ class DaynestClient:
|
|
|
243
245
|
return await self._cached_call(
|
|
244
246
|
"async_get_dashboard",
|
|
245
247
|
lambda: self._request_model(
|
|
246
|
-
path="/api/
|
|
248
|
+
path="/api/integrations/home-assistant/dashboard",
|
|
247
249
|
parser=DaynestDashboard.from_dict,
|
|
248
250
|
),
|
|
249
251
|
)
|
|
250
252
|
|
|
251
253
|
async def async_get_user_settings(self) -> dict[str, Any]:
|
|
252
254
|
"""Fetch user settings for the authenticated integration user."""
|
|
253
|
-
return await self._cached_call("async_get_user_settings", lambda: self._request_dict("/api/
|
|
255
|
+
return await self._cached_call("async_get_user_settings", lambda: self._request_dict("/api/users/me/settings"))
|
|
254
256
|
|
|
255
257
|
async def async_update_user_settings(self, payload: dict[str, Any]) -> dict[str, Any]:
|
|
256
258
|
"""Patch user settings for the authenticated integration user."""
|
|
257
|
-
return await self._send_action("patch", path="/api/
|
|
259
|
+
return await self._send_action("patch", path="/api/users/me/settings", payload=payload)
|
|
258
260
|
|
|
259
261
|
async def async_complete_task(self, chore_instance_id: int) -> dict[str, Any]:
|
|
260
262
|
"""Complete a chore instance by ID."""
|
|
261
263
|
return await self._post_action(
|
|
262
|
-
path="/api/
|
|
264
|
+
path="/api/integrations/home-assistant/actions/complete-task",
|
|
263
265
|
payload={"chore_instance_id": chore_instance_id},
|
|
264
266
|
)
|
|
265
267
|
|
|
266
268
|
async def async_snooze_task(self, chore_instance_id: int, days: int = 1) -> dict[str, Any]:
|
|
267
269
|
"""Reschedule a chore instance N days into the future."""
|
|
268
270
|
return await self._post_action(
|
|
269
|
-
path="/api/
|
|
271
|
+
path="/api/integrations/home-assistant/actions/snooze-task",
|
|
270
272
|
payload={"chore_instance_id": chore_instance_id, "days": days},
|
|
271
273
|
)
|
|
272
274
|
|
|
273
275
|
async def async_mark_medication_taken(self, medication_dose_id: int) -> dict[str, Any]:
|
|
274
276
|
"""Mark a medication dose as taken."""
|
|
275
277
|
return await self._post_action(
|
|
276
|
-
path="/api/
|
|
278
|
+
path="/api/integrations/home-assistant/actions/mark-medication-taken",
|
|
277
279
|
payload={"medication_dose_id": medication_dose_id},
|
|
278
280
|
)
|
|
279
281
|
|
|
280
282
|
async def async_skip_task(self, chore_instance_id: int) -> dict[str, Any]:
|
|
281
283
|
"""Skip a chore instance."""
|
|
282
284
|
return await self._post_action(
|
|
283
|
-
path="/api/
|
|
285
|
+
path="/api/integrations/home-assistant/actions/skip-task",
|
|
284
286
|
payload={"chore_instance_id": chore_instance_id},
|
|
285
287
|
)
|
|
286
288
|
|
|
287
289
|
async def async_skip_medication(self, medication_dose_id: int) -> dict[str, Any]:
|
|
288
290
|
"""Skip a medication dose."""
|
|
289
291
|
return await self._post_action(
|
|
290
|
-
path="/api/
|
|
292
|
+
path="/api/integrations/home-assistant/actions/skip-medication",
|
|
291
293
|
payload={"medication_dose_id": medication_dose_id},
|
|
292
294
|
)
|
|
293
295
|
|
|
294
296
|
async def async_mark_planned_done(self, planned_item_id: int) -> dict[str, Any]:
|
|
295
297
|
"""Mark a planned item as done."""
|
|
296
298
|
return await self._post_action(
|
|
297
|
-
path="/api/
|
|
299
|
+
path="/api/integrations/home-assistant/actions/mark-planned-done",
|
|
298
300
|
payload={"planned_item_id": planned_item_id},
|
|
299
301
|
)
|
|
300
302
|
|
|
@@ -307,7 +309,7 @@ class DaynestClient:
|
|
|
307
309
|
query = urlencode({"start_date": date_from.isoformat(), "end_date": date_to.isoformat()})
|
|
308
310
|
payload = await self._cached_call(
|
|
309
311
|
"async_list_planned_items",
|
|
310
|
-
lambda: self._request_list(f"/api/
|
|
312
|
+
lambda: self._request_list(f"/api/planned-items?{query}"),
|
|
311
313
|
date_from.isoformat(),
|
|
312
314
|
date_to.isoformat(),
|
|
313
315
|
)
|
|
@@ -332,15 +334,21 @@ class DaynestClient:
|
|
|
332
334
|
"tags": tags or [],
|
|
333
335
|
"rrule": rrule,
|
|
334
336
|
}
|
|
335
|
-
result = await self._send_action("post", path="/api/
|
|
337
|
+
result = await self._send_action("post", path="/api/planned-items", payload=payload)
|
|
336
338
|
return PlannedItem.from_dict(result)
|
|
337
339
|
|
|
338
340
|
async def async_update_planned_item(
|
|
339
341
|
self,
|
|
340
342
|
item_id: int | None = None,
|
|
343
|
+
*,
|
|
344
|
+
scope: str = "this",
|
|
341
345
|
**fields: Any,
|
|
342
346
|
) -> PlannedItem:
|
|
343
|
-
"""Update a planned item.
|
|
347
|
+
"""Update a planned item.
|
|
348
|
+
|
|
349
|
+
scope: "this" (default), "future", or "all" — controls which items in a
|
|
350
|
+
recurring series are updated. Non-recurring items ignore this parameter.
|
|
351
|
+
"""
|
|
344
352
|
payload_fields = dict(fields)
|
|
345
353
|
resolved_item_id = item_id
|
|
346
354
|
if resolved_item_id is None:
|
|
@@ -352,20 +360,144 @@ class DaynestClient:
|
|
|
352
360
|
raise ValueError(msg)
|
|
353
361
|
if "planned_for" in payload_fields and isinstance(payload_fields["planned_for"], date):
|
|
354
362
|
payload_fields["planned_for"] = payload_fields["planned_for"].isoformat()
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
path
|
|
358
|
-
|
|
359
|
-
)
|
|
363
|
+
path = f"/api/planned-items/{resolved_item_id}"
|
|
364
|
+
if scope != "this":
|
|
365
|
+
path += f"?scope={scope}"
|
|
366
|
+
result = await self._send_action("put", path=path, payload=payload_fields)
|
|
360
367
|
return PlannedItem.from_dict(result)
|
|
361
368
|
|
|
362
|
-
async def async_delete_planned_item(
|
|
363
|
-
|
|
369
|
+
async def async_delete_planned_item(
|
|
370
|
+
self,
|
|
371
|
+
item_id: int | None = None,
|
|
372
|
+
*,
|
|
373
|
+
planned_item_id: int | None = None,
|
|
374
|
+
scope: str = "this",
|
|
375
|
+
) -> None:
|
|
376
|
+
"""Delete a planned item.
|
|
377
|
+
|
|
378
|
+
scope: "this" (default) or "future" — controls which items in a recurring
|
|
379
|
+
series are deleted. Non-recurring items ignore this parameter.
|
|
380
|
+
"""
|
|
364
381
|
resolved_item_id = item_id if item_id is not None else planned_item_id
|
|
365
382
|
if resolved_item_id is None:
|
|
366
383
|
msg = "item_id is required"
|
|
367
384
|
raise ValueError(msg)
|
|
368
|
-
|
|
385
|
+
path = f"/api/planned-items/{resolved_item_id}"
|
|
386
|
+
if scope != "this":
|
|
387
|
+
path += f"?scope={scope}"
|
|
388
|
+
await self._send_no_content_action("delete", path=path)
|
|
389
|
+
|
|
390
|
+
async def async_list_meal_plans(
|
|
391
|
+
self,
|
|
392
|
+
*,
|
|
393
|
+
week_start_from: date | None = None,
|
|
394
|
+
week_start_to: date | None = None,
|
|
395
|
+
) -> list[MealPlan]:
|
|
396
|
+
"""List meal plans, optionally filtered by week_start client-side."""
|
|
397
|
+
payload = await self._cached_call("async_list_meal_plans", lambda: self._request_list("/api/meal-plans"))
|
|
398
|
+
plans = [MealPlan.from_dict(item) for item in payload]
|
|
399
|
+
if week_start_from is not None:
|
|
400
|
+
plans = [plan for plan in plans if plan.week_start >= week_start_from]
|
|
401
|
+
if week_start_to is not None:
|
|
402
|
+
plans = [plan for plan in plans if plan.week_start <= week_start_to]
|
|
403
|
+
return plans
|
|
404
|
+
|
|
405
|
+
async def async_get_meal_plan_slots(self, meal_plan_id: int) -> list[MealSlot]:
|
|
406
|
+
"""Fetch and flatten slots for a meal plan week grid."""
|
|
407
|
+
payload = await self._cached_call(
|
|
408
|
+
"async_get_meal_plan_slots",
|
|
409
|
+
lambda: self._request_dict(f"/api/meal-plans/{meal_plan_id}/slots"),
|
|
410
|
+
meal_plan_id,
|
|
411
|
+
)
|
|
412
|
+
days = payload.get("days")
|
|
413
|
+
if not isinstance(days, list):
|
|
414
|
+
msg = "Malformed meal plan slots payload: expected days array"
|
|
415
|
+
raise DaynestMalformedResponseError(msg)
|
|
416
|
+
slots: list[MealSlot] = []
|
|
417
|
+
for day in days:
|
|
418
|
+
if not isinstance(day, dict):
|
|
419
|
+
continue
|
|
420
|
+
raw_slots = day.get("slots")
|
|
421
|
+
if not isinstance(raw_slots, dict):
|
|
422
|
+
continue
|
|
423
|
+
for raw_slot in raw_slots.values():
|
|
424
|
+
if isinstance(raw_slot, dict):
|
|
425
|
+
slots.append(MealSlot.from_dict(raw_slot))
|
|
426
|
+
return slots
|
|
427
|
+
|
|
428
|
+
async def async_list_shopping_lists(self, status: str = "active") -> list[dict[str, Any]]:
|
|
429
|
+
"""List shopping lists for the authenticated user."""
|
|
430
|
+
query = urlencode({"status": status})
|
|
431
|
+
return await self._cached_call(
|
|
432
|
+
"async_list_shopping_lists",
|
|
433
|
+
lambda: self._request_list(f"/api/shopping-lists?{query}"),
|
|
434
|
+
status,
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
async def async_list_shopping_items(self, shopping_list_id: int) -> list[dict[str, Any]]:
|
|
438
|
+
"""List planned items linked to a shopping list."""
|
|
439
|
+
payload = await self._cached_call(
|
|
440
|
+
"async_list_shopping_items",
|
|
441
|
+
lambda: self._request_list("/api/planned-items"),
|
|
442
|
+
)
|
|
443
|
+
return [
|
|
444
|
+
item
|
|
445
|
+
for item in payload
|
|
446
|
+
if item.get("module_key") == "shopping_list"
|
|
447
|
+
and str(item.get("linked_ref", "")) == str(shopping_list_id)
|
|
448
|
+
]
|
|
449
|
+
|
|
450
|
+
async def async_create_shopping_item(
|
|
451
|
+
self,
|
|
452
|
+
shopping_list_id: int,
|
|
453
|
+
*,
|
|
454
|
+
title: str,
|
|
455
|
+
planned_for: date | str,
|
|
456
|
+
notes: str | None = None,
|
|
457
|
+
tags: list[str] | None = None,
|
|
458
|
+
) -> dict[str, Any]:
|
|
459
|
+
"""Create an item linked to a shopping list."""
|
|
460
|
+
payload = {
|
|
461
|
+
"title": title,
|
|
462
|
+
"planned_for": planned_for.isoformat() if isinstance(planned_for, date) else planned_for,
|
|
463
|
+
"notes": notes,
|
|
464
|
+
"module_key": "shopping_list",
|
|
465
|
+
"linked_source": "shopping_list",
|
|
466
|
+
"linked_ref": str(shopping_list_id),
|
|
467
|
+
"priority": "normal",
|
|
468
|
+
"tags": tags or [],
|
|
469
|
+
}
|
|
470
|
+
return await self._send_action("post", path="/api/planned-items", payload=payload)
|
|
471
|
+
|
|
472
|
+
async def async_update_shopping_item(
|
|
473
|
+
self,
|
|
474
|
+
shopping_list_id: int,
|
|
475
|
+
item_id: int,
|
|
476
|
+
*,
|
|
477
|
+
title: str,
|
|
478
|
+
planned_for: date | str,
|
|
479
|
+
is_done: bool,
|
|
480
|
+
notes: str | None = None,
|
|
481
|
+
tags: list[str] | None = None,
|
|
482
|
+
priority: str = "normal",
|
|
483
|
+
) -> dict[str, Any]:
|
|
484
|
+
"""Update an item linked to a shopping list."""
|
|
485
|
+
payload = {
|
|
486
|
+
"title": title,
|
|
487
|
+
"planned_for": planned_for.isoformat() if isinstance(planned_for, date) else planned_for,
|
|
488
|
+
"notes": notes,
|
|
489
|
+
"module_key": "shopping_list",
|
|
490
|
+
"linked_source": "shopping_list",
|
|
491
|
+
"linked_ref": str(shopping_list_id),
|
|
492
|
+
"priority": priority,
|
|
493
|
+
"tags": tags or [],
|
|
494
|
+
"is_done": is_done,
|
|
495
|
+
}
|
|
496
|
+
return await self._send_action("put", path=f"/api/planned-items/{item_id}", payload=payload)
|
|
497
|
+
|
|
498
|
+
async def async_delete_shopping_item(self, item_id: int) -> None:
|
|
499
|
+
"""Delete an item linked to a shopping list."""
|
|
500
|
+
await self._send_no_content_action("delete", path=f"/api/planned-items/{item_id}")
|
|
369
501
|
|
|
370
502
|
async def async_get_calendar(
|
|
371
503
|
self,
|
|
@@ -383,7 +515,7 @@ class DaynestClient:
|
|
|
383
515
|
encoded_params = urlencode(params)
|
|
384
516
|
return await self._cached_call(
|
|
385
517
|
"async_get_calendar",
|
|
386
|
-
lambda: self._request_list(f"/api/
|
|
518
|
+
lambda: self._request_list(f"/api/integrations/home-assistant/calendar?{encoded_params}"),
|
|
387
519
|
start.isoformat(),
|
|
388
520
|
end.isoformat(),
|
|
389
521
|
event_type or "",
|
|
@@ -391,7 +523,7 @@ class DaynestClient:
|
|
|
391
523
|
|
|
392
524
|
async def async_list_routine_templates(self) -> list[RoutineTemplate]:
|
|
393
525
|
"""List routine templates."""
|
|
394
|
-
payload = await self._cached_call("async_list_routine_templates", lambda: self._request_list("/api/
|
|
526
|
+
payload = await self._cached_call("async_list_routine_templates", lambda: self._request_list("/api/templates/routines"))
|
|
395
527
|
return [RoutineTemplate.from_dict(item) for item in payload]
|
|
396
528
|
|
|
397
529
|
async def async_create_routine_template(
|
|
@@ -408,7 +540,7 @@ class DaynestClient:
|
|
|
408
540
|
"""Create a routine template."""
|
|
409
541
|
result = await self._send_action(
|
|
410
542
|
"post",
|
|
411
|
-
path="/api/
|
|
543
|
+
path="/api/templates/routines",
|
|
412
544
|
payload={
|
|
413
545
|
"name": name,
|
|
414
546
|
"every_n_days": every_n_days,
|
|
@@ -426,19 +558,19 @@ class DaynestClient:
|
|
|
426
558
|
payload_fields = dict(fields)
|
|
427
559
|
if "start_date" in payload_fields and isinstance(payload_fields["start_date"], date):
|
|
428
560
|
payload_fields["start_date"] = payload_fields["start_date"].isoformat()
|
|
429
|
-
result = await self._send_action("put", path=f"/api/
|
|
561
|
+
result = await self._send_action("put", path=f"/api/templates/routines/{template_id}", payload=payload_fields)
|
|
430
562
|
return RoutineTemplate.from_dict(result)
|
|
431
563
|
|
|
432
564
|
async def async_delete_routine_template(self, template_id: int) -> None:
|
|
433
565
|
"""Delete a routine template."""
|
|
434
|
-
await self._send_no_content_action("delete", path=f"/api/
|
|
566
|
+
await self._send_no_content_action("delete", path=f"/api/templates/routines/{template_id}")
|
|
435
567
|
|
|
436
568
|
async def async_list_chore_templates(self, *, tags: list[str] | None = None) -> list[ChoreTemplate]:
|
|
437
569
|
"""List chore templates."""
|
|
438
570
|
query = f"?{urlencode({'tags': ','.join(tags)})}" if tags else ""
|
|
439
571
|
payload = await self._cached_call(
|
|
440
572
|
"async_list_chore_templates",
|
|
441
|
-
lambda: self._request_list(f"/api/
|
|
573
|
+
lambda: self._request_list(f"/api/templates/chores{query}"),
|
|
442
574
|
",".join(tags or []),
|
|
443
575
|
)
|
|
444
576
|
return [ChoreTemplate.from_dict(item) for item in payload]
|
|
@@ -458,7 +590,7 @@ class DaynestClient:
|
|
|
458
590
|
"""Create a chore template."""
|
|
459
591
|
result = await self._send_action(
|
|
460
592
|
"post",
|
|
461
|
-
path="/api/
|
|
593
|
+
path="/api/templates/chores",
|
|
462
594
|
payload={
|
|
463
595
|
"name": name,
|
|
464
596
|
"every_n_days": every_n_days,
|
|
@@ -477,18 +609,18 @@ class DaynestClient:
|
|
|
477
609
|
payload_fields = dict(fields)
|
|
478
610
|
if "start_date" in payload_fields and isinstance(payload_fields["start_date"], date):
|
|
479
611
|
payload_fields["start_date"] = payload_fields["start_date"].isoformat()
|
|
480
|
-
result = await self._send_action("put", path=f"/api/
|
|
612
|
+
result = await self._send_action("put", path=f"/api/templates/chores/{template_id}", payload=payload_fields)
|
|
481
613
|
return ChoreTemplate.from_dict(result)
|
|
482
614
|
|
|
483
615
|
async def async_delete_chore_template(self, template_id: int) -> None:
|
|
484
616
|
"""Delete a chore template."""
|
|
485
|
-
await self._send_no_content_action("delete", path=f"/api/
|
|
617
|
+
await self._send_no_content_action("delete", path=f"/api/templates/chores/{template_id}")
|
|
486
618
|
|
|
487
619
|
async def async_get_calendar_month(self, year: int, month: int) -> list[CalendarDay]:
|
|
488
620
|
"""Fetch calendar month summaries."""
|
|
489
621
|
payload = await self._cached_call(
|
|
490
622
|
"async_get_calendar_month",
|
|
491
|
-
lambda: self._request_dict(f"/api/
|
|
623
|
+
lambda: self._request_dict(f"/api/calendar/month?{urlencode({'year': year, 'month': month})}"),
|
|
492
624
|
year,
|
|
493
625
|
month,
|
|
494
626
|
)
|
|
@@ -502,7 +634,7 @@ class DaynestClient:
|
|
|
502
634
|
"""Fetch calendar day details."""
|
|
503
635
|
payload = await self._cached_call(
|
|
504
636
|
"async_get_calendar_day",
|
|
505
|
-
lambda: self._request_dict(f"/api/
|
|
637
|
+
lambda: self._request_dict(f"/api/calendar/day?{urlencode({'date': target_date.isoformat()})}"),
|
|
506
638
|
target_date.isoformat(),
|
|
507
639
|
)
|
|
508
640
|
return CalendarDay.from_day_dict(payload)
|
|
@@ -519,7 +651,7 @@ class DaynestClient:
|
|
|
519
651
|
|
|
520
652
|
async def async_export_calendar_ics(self) -> bytes:
|
|
521
653
|
"""Export calendar iCalendar bytes."""
|
|
522
|
-
return await self._cached_call("async_export_calendar_ics", lambda: self._request_bytes("/api/
|
|
654
|
+
return await self._cached_call("async_export_calendar_ics", lambda: self._request_bytes("/api/calendar/export.ics"))
|
|
523
655
|
|
|
524
656
|
async def async_listen(
|
|
525
657
|
self,
|
|
@@ -541,7 +673,7 @@ class DaynestClient:
|
|
|
541
673
|
return
|
|
542
674
|
url = urljoin(
|
|
543
675
|
f"{self._base_url}/",
|
|
544
|
-
f"/api/
|
|
676
|
+
f"/api/today/stream?{urlencode({'token': token})}",
|
|
545
677
|
)
|
|
546
678
|
try:
|
|
547
679
|
async with session.get(
|
|
@@ -549,7 +681,7 @@ class DaynestClient:
|
|
|
549
681
|
headers={"Accept": "text/event-stream"},
|
|
550
682
|
timeout=None,
|
|
551
683
|
) as response:
|
|
552
|
-
self._check_response_status(response, "/api/
|
|
684
|
+
self._check_response_status(response, "/api/today/stream")
|
|
553
685
|
backoff_seconds = 1.0
|
|
554
686
|
event_name = "message"
|
|
555
687
|
data_lines: list[str] = []
|
|
@@ -178,6 +178,73 @@ class PlannedItem:
|
|
|
178
178
|
)
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
@dataclass(slots=True, frozen=True)
|
|
182
|
+
class MealPlan:
|
|
183
|
+
"""Typed model for a meal plan."""
|
|
184
|
+
|
|
185
|
+
id: int
|
|
186
|
+
user_id: int
|
|
187
|
+
name: str
|
|
188
|
+
week_start: date
|
|
189
|
+
notes: str | None
|
|
190
|
+
created_at: datetime
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def from_dict(cls, payload: dict[str, Any]) -> MealPlan:
|
|
194
|
+
if not isinstance(payload, dict):
|
|
195
|
+
msg = "Malformed meal plan payload: expected JSON object"
|
|
196
|
+
raise DaynestMalformedResponseError(msg)
|
|
197
|
+
return cls(
|
|
198
|
+
id=int(_require(payload, "id", context="meal plan")),
|
|
199
|
+
user_id=int(_require(payload, "user_id", context="meal plan")),
|
|
200
|
+
name=str(_require(payload, "name", context="meal plan")),
|
|
201
|
+
week_start=_parse_date(_require(payload, "week_start", context="meal plan"), field="week_start"),
|
|
202
|
+
notes=payload.get("notes") if isinstance(payload.get("notes"), str) else None,
|
|
203
|
+
created_at=_parse_datetime(_require(payload, "created_at", context="meal plan"), field="created_at"),
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(slots=True, frozen=True)
|
|
208
|
+
class MealSlot:
|
|
209
|
+
"""Typed model for a meal plan slot."""
|
|
210
|
+
|
|
211
|
+
id: int
|
|
212
|
+
meal_plan_id: int
|
|
213
|
+
slot_date: date
|
|
214
|
+
slot_type: str
|
|
215
|
+
title: str
|
|
216
|
+
recipe_url: str | None
|
|
217
|
+
ingredients_json: tuple[str, ...]
|
|
218
|
+
planned_item_id: int | None
|
|
219
|
+
|
|
220
|
+
@classmethod
|
|
221
|
+
def from_dict(cls, payload: dict[str, Any]) -> MealSlot:
|
|
222
|
+
if not isinstance(payload, dict):
|
|
223
|
+
msg = "Malformed meal slot payload: expected JSON object"
|
|
224
|
+
raise DaynestMalformedResponseError(msg)
|
|
225
|
+
ingredients = payload.get("ingredients_json")
|
|
226
|
+
ingredient_values = tuple(str(item) for item in ingredients) if isinstance(ingredients, list) else ()
|
|
227
|
+
planned_item_id_raw = payload.get("planned_item_id")
|
|
228
|
+
if planned_item_id_raw is not None:
|
|
229
|
+
try:
|
|
230
|
+
planned_item_id: int | None = int(planned_item_id_raw)
|
|
231
|
+
except (ValueError, TypeError) as err:
|
|
232
|
+
msg = "Malformed meal slot: planned_item_id is not a valid integer"
|
|
233
|
+
raise DaynestMalformedResponseError(msg) from err
|
|
234
|
+
else:
|
|
235
|
+
planned_item_id = None
|
|
236
|
+
return cls(
|
|
237
|
+
id=int(_require(payload, "id", context="meal slot")),
|
|
238
|
+
meal_plan_id=int(_require(payload, "meal_plan_id", context="meal slot")),
|
|
239
|
+
slot_date=_parse_date(_require(payload, "slot_date", context="meal slot"), field="slot_date"),
|
|
240
|
+
slot_type=str(_require(payload, "slot_type", context="meal slot")),
|
|
241
|
+
title=str(payload.get("title", "")),
|
|
242
|
+
recipe_url=payload.get("recipe_url") if isinstance(payload.get("recipe_url"), str) else None,
|
|
243
|
+
ingredients_json=ingredient_values,
|
|
244
|
+
planned_item_id=planned_item_id,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
|
|
181
248
|
@dataclass(slots=True, frozen=True)
|
|
182
249
|
class RoutineTemplate:
|
|
183
250
|
"""Typed model for a routine template."""
|
|
@@ -16,7 +16,7 @@ from daynest.exceptions import (
|
|
|
16
16
|
DaynestServerUnavailableError,
|
|
17
17
|
DaynestTimeoutError,
|
|
18
18
|
)
|
|
19
|
-
from daynest.models import CalendarDay, CalendarEvent, ChoreTemplate, DaynestDashboard, DaynestSummary, PlannedItem, RoutineTemplate
|
|
19
|
+
from daynest.models import CalendarDay, CalendarEvent, ChoreTemplate, DaynestDashboard, DaynestSummary, MealPlan, MealSlot, PlannedItem, RoutineTemplate
|
|
20
20
|
|
|
21
21
|
VALID_SUMMARY_PAYLOAD = {
|
|
22
22
|
"sensor_daynest_chores_due": 2,
|
|
@@ -564,7 +564,7 @@ class TestDaynestClientWriteMethods:
|
|
|
564
564
|
}
|
|
565
565
|
assert isinstance(result, PlannedItem)
|
|
566
566
|
assert result.id == 10
|
|
567
|
-
assert session.post.call_args[0][0].endswith("/api/
|
|
567
|
+
assert session.post.call_args[0][0].endswith("/api/planned-items")
|
|
568
568
|
|
|
569
569
|
async def test_update_planned_item_uses_expected_payload(self) -> None:
|
|
570
570
|
response = _make_mock_response(200, {**VALID_PLANNED_ITEM_PAYLOAD, "is_done": True})
|
|
@@ -585,7 +585,7 @@ class TestDaynestClientWriteMethods:
|
|
|
585
585
|
assert call_kwargs["json"]["planned_for"] == "2026-01-16"
|
|
586
586
|
assert call_kwargs["json"]["is_done"] is True
|
|
587
587
|
assert isinstance(result, PlannedItem)
|
|
588
|
-
assert session.put.call_args[0][0].endswith("/api/
|
|
588
|
+
assert session.put.call_args[0][0].endswith("/api/planned-items/10")
|
|
589
589
|
|
|
590
590
|
async def test_delete_planned_item_uses_expected_endpoint(self) -> None:
|
|
591
591
|
response = _make_mock_response(204, {})
|
|
@@ -596,7 +596,7 @@ class TestDaynestClientWriteMethods:
|
|
|
596
596
|
await client.async_delete_planned_item(planned_item_id=10)
|
|
597
597
|
|
|
598
598
|
call_args = session.delete.call_args[0]
|
|
599
|
-
assert call_args[0].endswith("/api/
|
|
599
|
+
assert call_args[0].endswith("/api/planned-items/10")
|
|
600
600
|
|
|
601
601
|
|
|
602
602
|
VALID_CALENDAR_PAYLOAD = [
|
|
@@ -918,3 +918,187 @@ class TestDaynestClientCacheAndSSE:
|
|
|
918
918
|
|
|
919
919
|
session.get.assert_not_called()
|
|
920
920
|
callback.assert_not_awaited()
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
@pytest.mark.unit
|
|
924
|
+
class TestDaynestClientMealPlanMethods:
|
|
925
|
+
"""Tests for meal plan client helpers."""
|
|
926
|
+
|
|
927
|
+
async def test_list_meal_plans_filters_by_week_start(self) -> None:
|
|
928
|
+
response = _make_mock_response(
|
|
929
|
+
200,
|
|
930
|
+
[
|
|
931
|
+
{
|
|
932
|
+
"id": 1,
|
|
933
|
+
"user_id": 2,
|
|
934
|
+
"name": "Past",
|
|
935
|
+
"week_start": "2026-05-25",
|
|
936
|
+
"notes": None,
|
|
937
|
+
"created_at": "2026-05-01T00:00:00",
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"id": 2,
|
|
941
|
+
"user_id": 2,
|
|
942
|
+
"name": "Current",
|
|
943
|
+
"week_start": "2026-06-01",
|
|
944
|
+
"notes": "Notes",
|
|
945
|
+
"created_at": "2026-05-01T00:00:00",
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
"id": 3,
|
|
949
|
+
"user_id": 2,
|
|
950
|
+
"name": "Next",
|
|
951
|
+
"week_start": "2026-06-08",
|
|
952
|
+
"notes": None,
|
|
953
|
+
"created_at": "2026-05-01T00:00:00",
|
|
954
|
+
},
|
|
955
|
+
],
|
|
956
|
+
)
|
|
957
|
+
client = _make_list_client(response)
|
|
958
|
+
|
|
959
|
+
plans = await client.async_list_meal_plans(
|
|
960
|
+
week_start_from=date(2026, 6, 1),
|
|
961
|
+
week_start_to=date(2026, 6, 8),
|
|
962
|
+
)
|
|
963
|
+
|
|
964
|
+
assert [plan.id for plan in plans] == [2, 3]
|
|
965
|
+
assert all(isinstance(plan, MealPlan) for plan in plans)
|
|
966
|
+
client._session.get.assert_called_once()
|
|
967
|
+
assert client._session.get.call_args.args[0] == "https://api.daynest.example/api/meal-plans"
|
|
968
|
+
|
|
969
|
+
async def test_get_meal_plan_slots_flattens_week_grid(self) -> None:
|
|
970
|
+
response = _make_mock_response(
|
|
971
|
+
200,
|
|
972
|
+
{
|
|
973
|
+
"meal_plan": {
|
|
974
|
+
"id": 2,
|
|
975
|
+
"user_id": 2,
|
|
976
|
+
"name": "Current",
|
|
977
|
+
"week_start": "2026-06-01",
|
|
978
|
+
"notes": None,
|
|
979
|
+
"created_at": "2026-05-01T00:00:00",
|
|
980
|
+
},
|
|
981
|
+
"days": [
|
|
982
|
+
{
|
|
983
|
+
"date": "2026-06-01",
|
|
984
|
+
"slots": {
|
|
985
|
+
"breakfast": {
|
|
986
|
+
"id": 10,
|
|
987
|
+
"meal_plan_id": 2,
|
|
988
|
+
"slot_date": "2026-06-01",
|
|
989
|
+
"slot_type": "breakfast",
|
|
990
|
+
"title": "Oats",
|
|
991
|
+
"recipe_url": "https://recipes.example/oats",
|
|
992
|
+
"ingredients_json": ["oats"],
|
|
993
|
+
"planned_item_id": None,
|
|
994
|
+
},
|
|
995
|
+
"dinner": {
|
|
996
|
+
"id": 11,
|
|
997
|
+
"meal_plan_id": 2,
|
|
998
|
+
"slot_date": "2026-06-01",
|
|
999
|
+
"slot_type": "dinner",
|
|
1000
|
+
"title": "Pasta",
|
|
1001
|
+
"recipe_url": None,
|
|
1002
|
+
"ingredients_json": [],
|
|
1003
|
+
"planned_item_id": 50,
|
|
1004
|
+
},
|
|
1005
|
+
},
|
|
1006
|
+
},
|
|
1007
|
+
],
|
|
1008
|
+
},
|
|
1009
|
+
)
|
|
1010
|
+
client = _make_list_client(response)
|
|
1011
|
+
|
|
1012
|
+
slots = await client.async_get_meal_plan_slots(2)
|
|
1013
|
+
|
|
1014
|
+
assert [slot.title for slot in slots] == ["Oats", "Pasta"]
|
|
1015
|
+
assert all(isinstance(slot, MealSlot) for slot in slots)
|
|
1016
|
+
assert slots[0].ingredients_json == ("oats",)
|
|
1017
|
+
assert slots[1].planned_item_id == 50
|
|
1018
|
+
assert client._session.get.call_args.args[0] == "https://api.daynest.example/api/meal-plans/2/slots"
|
|
1019
|
+
|
|
1020
|
+
async def test_get_meal_plan_slots_rejects_missing_days_array(self) -> None:
|
|
1021
|
+
response = _make_mock_response(200, {"meal_plan": {}, "days": "bad"})
|
|
1022
|
+
client = _make_list_client(response)
|
|
1023
|
+
|
|
1024
|
+
with pytest.raises(DaynestMalformedResponseError, match="expected days array"):
|
|
1025
|
+
await client.async_get_meal_plan_slots(2)
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
@pytest.mark.unit
|
|
1029
|
+
class TestDaynestClientShoppingLists:
|
|
1030
|
+
"""Tests for shopping-list helpers."""
|
|
1031
|
+
|
|
1032
|
+
async def test_list_shopping_lists_requests_active_lists(self) -> None:
|
|
1033
|
+
response = _make_mock_response(200, [{"id": 1, "name": "Groceries", "status": "active"}])
|
|
1034
|
+
client = _make_client(response)
|
|
1035
|
+
|
|
1036
|
+
result = await client.async_list_shopping_lists(status="active")
|
|
1037
|
+
|
|
1038
|
+
assert result == [{"id": 1, "name": "Groceries", "status": "active"}]
|
|
1039
|
+
client._session.get.assert_called_once()
|
|
1040
|
+
url = client._session.get.call_args.args[0]
|
|
1041
|
+
assert url == "https://api.daynest.example/api/shopping-lists?status=active"
|
|
1042
|
+
|
|
1043
|
+
async def test_list_shopping_items_filters_linked_planned_items(self) -> None:
|
|
1044
|
+
response = _make_mock_response(
|
|
1045
|
+
200,
|
|
1046
|
+
[
|
|
1047
|
+
{"id": 1, "title": "Milk", "module_key": "shopping_list", "linked_ref": "7"},
|
|
1048
|
+
{"id": 2, "title": "Other", "module_key": "shopping_list", "linked_ref": "8"},
|
|
1049
|
+
{"id": 3, "title": "Task", "module_key": None, "linked_ref": None},
|
|
1050
|
+
{"id": 4, "title": "Eggs", "module_key": "shopping_list", "linked_ref": 7},
|
|
1051
|
+
],
|
|
1052
|
+
)
|
|
1053
|
+
client = _make_client(response)
|
|
1054
|
+
|
|
1055
|
+
result = await client.async_list_shopping_items(7)
|
|
1056
|
+
|
|
1057
|
+
assert result == [
|
|
1058
|
+
{"id": 1, "title": "Milk", "module_key": "shopping_list", "linked_ref": "7"},
|
|
1059
|
+
{"id": 4, "title": "Eggs", "module_key": "shopping_list", "linked_ref": 7},
|
|
1060
|
+
]
|
|
1061
|
+
|
|
1062
|
+
async def test_create_shopping_item_posts_linked_planned_item(self) -> None:
|
|
1063
|
+
response = _make_mock_response(200, {"id": 1, "title": "Milk"})
|
|
1064
|
+
session = MagicMock(spec=aiohttp.ClientSession)
|
|
1065
|
+
session.post = MagicMock(return_value=response)
|
|
1066
|
+
client = DaynestClient(base_url="https://api.daynest.example", integration_key="key", session=session)
|
|
1067
|
+
|
|
1068
|
+
result = await client.async_create_shopping_item(7, title="Milk", planned_for="2026-01-15", notes="2L")
|
|
1069
|
+
|
|
1070
|
+
assert result == {"id": 1, "title": "Milk"}
|
|
1071
|
+
payload = session.post.call_args.kwargs["json"]
|
|
1072
|
+
assert payload["module_key"] == "shopping_list"
|
|
1073
|
+
assert payload["linked_ref"] == "7"
|
|
1074
|
+
assert payload["title"] == "Milk"
|
|
1075
|
+
|
|
1076
|
+
async def test_update_shopping_item_puts_linked_planned_item(self) -> None:
|
|
1077
|
+
response = _make_mock_response(200, {"id": 1, "title": "Milk"})
|
|
1078
|
+
session = MagicMock(spec=aiohttp.ClientSession)
|
|
1079
|
+
session.put = MagicMock(return_value=response)
|
|
1080
|
+
client = DaynestClient(base_url="https://api.daynest.example", integration_key="key", session=session)
|
|
1081
|
+
|
|
1082
|
+
result = await client.async_update_shopping_item(
|
|
1083
|
+
7,
|
|
1084
|
+
1,
|
|
1085
|
+
title="Milk",
|
|
1086
|
+
planned_for="2026-01-15",
|
|
1087
|
+
is_done=True,
|
|
1088
|
+
)
|
|
1089
|
+
|
|
1090
|
+
assert result == {"id": 1, "title": "Milk"}
|
|
1091
|
+
assert session.put.call_args.args[0] == "https://api.daynest.example/api/planned-items/1"
|
|
1092
|
+
payload = session.put.call_args.kwargs["json"]
|
|
1093
|
+
assert payload["linked_ref"] == "7"
|
|
1094
|
+
assert payload["is_done"] is True
|
|
1095
|
+
|
|
1096
|
+
async def test_delete_shopping_item_deletes_planned_item(self) -> None:
|
|
1097
|
+
response = _make_mock_response(204, None)
|
|
1098
|
+
session = MagicMock(spec=aiohttp.ClientSession)
|
|
1099
|
+
session.delete = MagicMock(return_value=response)
|
|
1100
|
+
client = DaynestClient(base_url="https://api.daynest.example", integration_key="key", session=session)
|
|
1101
|
+
|
|
1102
|
+
await client.async_delete_shopping_item(1)
|
|
1103
|
+
|
|
1104
|
+
assert session.delete.call_args.args[0] == "https://api.daynest.example/api/planned-items/1"
|
|
@@ -13,7 +13,7 @@ wheels = [
|
|
|
13
13
|
|
|
14
14
|
[[package]]
|
|
15
15
|
name = "aiohttp"
|
|
16
|
-
version = "3.
|
|
16
|
+
version = "3.14.1"
|
|
17
17
|
source = { registry = "https://pypi.org/simple" }
|
|
18
18
|
dependencies = [
|
|
19
19
|
{ name = "aiohappyeyeballs" },
|
|
@@ -22,78 +22,93 @@ dependencies = [
|
|
|
22
22
|
{ name = "frozenlist" },
|
|
23
23
|
{ name = "multidict" },
|
|
24
24
|
{ name = "propcache" },
|
|
25
|
+
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
25
26
|
{ name = "yarl" },
|
|
26
27
|
]
|
|
27
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
28
|
+
sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794, upload-time = "2026-06-07T21:09:35.529Z" }
|
|
28
29
|
wheels = [
|
|
29
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
30
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
31
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
32
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
33
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
34
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
37
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
38
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
66
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
67
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
69
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
70
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
71
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
72
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
73
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
74
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
75
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
76
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
77
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
78
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
79
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
80
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
81
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
82
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
83
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
84
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
85
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
86
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
87
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
88
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
89
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
90
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
91
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
92
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
93
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
94
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
95
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
96
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
30
|
+
{ url = "https://files.pythonhosted.org/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", size = 757402, upload-time = "2026-06-07T21:06:40.311Z" },
|
|
31
|
+
{ url = "https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d", size = 512310, upload-time = "2026-06-07T21:06:42.207Z" },
|
|
32
|
+
{ url = "https://files.pythonhosted.org/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", size = 512448, upload-time = "2026-06-07T21:06:43.813Z" },
|
|
33
|
+
{ url = "https://files.pythonhosted.org/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", size = 1766854, upload-time = "2026-06-07T21:06:45.391Z" },
|
|
34
|
+
{ url = "https://files.pythonhosted.org/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", size = 1740884, upload-time = "2026-06-07T21:06:47.413Z" },
|
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", size = 1810034, upload-time = "2026-06-07T21:06:50.165Z" },
|
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", size = 1904054, upload-time = "2026-06-07T21:06:52.035Z" },
|
|
37
|
+
{ url = "https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c", size = 1790278, upload-time = "2026-06-07T21:06:54.049Z" },
|
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", size = 1591795, upload-time = "2026-06-07T21:06:55.911Z" },
|
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", size = 1728397, upload-time = "2026-06-07T21:06:57.777Z" },
|
|
40
|
+
{ url = "https://files.pythonhosted.org/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", size = 1766504, upload-time = "2026-06-07T21:07:00.009Z" },
|
|
41
|
+
{ url = "https://files.pythonhosted.org/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", size = 1777806, upload-time = "2026-06-07T21:07:02.064Z" },
|
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", size = 1580707, upload-time = "2026-06-07T21:07:03.942Z" },
|
|
43
|
+
{ url = "https://files.pythonhosted.org/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", size = 1798121, upload-time = "2026-06-07T21:07:05.987Z" },
|
|
44
|
+
{ url = "https://files.pythonhosted.org/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", size = 1767580, upload-time = "2026-06-07T21:07:07.873Z" },
|
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/3e/61/a0c0a8f327a9c52095cdd8e312391b00d3ed64ab6c72bb5c33d8ec251cf7/aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4", size = 452771, upload-time = "2026-06-07T21:07:09.669Z" },
|
|
46
|
+
{ url = "https://files.pythonhosted.org/packages/df/d9/ea367c75f16ac9c6cdc8febb25e8318fa21a2b1bc8d6514d4b2d890bface/aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271", size = 479873, upload-time = "2026-06-07T21:07:11.538Z" },
|
|
47
|
+
{ url = "https://files.pythonhosted.org/packages/03/64/8d96784a7851156db8a4c6c3f6f91042fdf39fb15a4cc38c8b3c14833c45/aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847", size = 448073, upload-time = "2026-06-07T21:07:13.637Z" },
|
|
48
|
+
{ url = "https://files.pythonhosted.org/packages/bc/97/bd137012dd97e1649162b099135a80e1fd59aaa807b2430fc448d1029aff/aiohttp-3.14.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:b3a03285a7f9c7b016324574a6d92a1c895da6b978cb8f1deee3ac72bc6da178", size = 506882, upload-time = "2026-06-07T21:07:15.501Z" },
|
|
49
|
+
{ url = "https://files.pythonhosted.org/packages/ef/79/e5cc690e9d922a66887ceeaca53a8ffd5a7b0be3816142b7abc433742d89/aiohttp-3.14.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:2a73f487ab8ef5abbb24b7aa9b73e98eaba9e9e031804ff2416f02eca315ccaf", size = 515270, upload-time = "2026-06-07T21:07:17.53Z" },
|
|
50
|
+
{ url = "https://files.pythonhosted.org/packages/fe/22/a73ccbf9dbd6e26dda0b24d5fd5db7da92ee3383a79f47677ffb834c5c5b/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd", size = 485841, upload-time = "2026-06-07T21:07:19.555Z" },
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/3b/b9/57ed8eaf596321c2ad747bd480fb1700dbd7177c60dfc9e4c187f629662e/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe", size = 492088, upload-time = "2026-06-07T21:07:21.581Z" },
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/78/c0/5ebe5270a7c140d7c6f79dcb018640225f14d406c149e4eec04a7d82fe71/aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4", size = 501564, upload-time = "2026-06-07T21:07:23.388Z" },
|
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/75/7f/8cdaa24fc7983865e0915153b96a9ac5bcdd3548d64c5a27d17cecccad2d/aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876", size = 751998, upload-time = "2026-06-07T21:07:25.046Z" },
|
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/b2/f4/c4227aacfacc5cb0cc2d119b65301d177912a6842cd64e120c47af76064f/aiohttp-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dfd6e47d3c44c2279907607f73a4240b88c69eb8b90da7e2441a8045dfd21da", size = 510918, upload-time = "2026-06-07T21:07:27.28Z" },
|
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/ab/01/a2d5f96cd4e74424864d30bc0a7e44d0a12dacdcfa91b5b2d1bd3dca6bf3/aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6", size = 508657, upload-time = "2026-06-07T21:07:29.252Z" },
|
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/e8/ed/3c0fb5c500fdd8e7ebc10d1889c04384fffa1a9163eac1356088ca9da1b1/aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96", size = 1757907, upload-time = "2026-06-07T21:07:31.03Z" },
|
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/0b/ab/d4c924d9bd5be3050c226612413ce68cb54c70d2c31b661bfc8d9a5b6a70/aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f", size = 1737565, upload-time = "2026-06-07T21:07:33.031Z" },
|
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/19/2a/37326821ff779084020cdc33224d20b19f42f4183a500ff92022a739eda7/aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296", size = 1799018, upload-time = "2026-06-07T21:07:35.003Z" },
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/b3/4f/6e947ba73e4ce09070761c05ed3a8ceb7c21f5e46798671d8b2aac0e4626/aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa", size = 1894416, upload-time = "2026-06-07T21:07:36.956Z" },
|
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/9d/6e/dbf1d0625dc711fb2851f4f3c3055c39ed58bae92082d8c627dbe6013736/aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451", size = 1783881, upload-time = "2026-06-07T21:07:39.063Z" },
|
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/44/c2/5e25098a67268ed369483ae7d1a58bd0a13d03aab860d2a0e4a6eb25b046/aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c", size = 1587572, upload-time = "2026-06-07T21:07:41.058Z" },
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/2a/bd/cf9cee17e140f942a3de73e658a543aa8fbf35a5fc67a9d2538d52d77f0b/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca", size = 1722137, upload-time = "2026-06-07T21:07:43.014Z" },
|
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/89/6d/5684f8c59045c96f81a18cefbc1fbbd79d25b88f1c622f2a5c5c08fcb632/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09", size = 1755953, upload-time = "2026-06-07T21:07:45.933Z" },
|
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/a8/40/35caf3170f8359760740a7d9aa0fff2e344bef98e1d1186f5a0f6dec17e6/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397", size = 1766479, upload-time = "2026-06-07T21:07:48.047Z" },
|
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/6d/a1/b0c61e7a137f0d81de49a82023a6df73c3c16d6fefb0f8e4a93d21639002/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080", size = 1580077, upload-time = "2026-06-07T21:07:50.069Z" },
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/0b/41/194ea4623693009fcefebef7aef63c141754f153e9cd0d39d3b9e36c175c/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345", size = 1791688, upload-time = "2026-06-07T21:07:52.106Z" },
|
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/ba/45/4de841f005cfe1fd63e2a2fe011262c515e2a62aa6994b15947e7d717ac9/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588", size = 1761094, upload-time = "2026-06-07T21:07:54.113Z" },
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/e4/ae/dbce10533d3896d544d5053939ed75b7dc31a1b0973d959b1b5ae21028d6/aiohttp-3.14.1-cp313-cp313-win32.whl", hash = "sha256:e509a55f681e6158c20f70f102f9cf61fb20fbc382272bc6d94b7343f2582780", size = 452662, upload-time = "2026-06-07T21:07:56.06Z" },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/7b/d9/0bf1a19362c32f06229da5e7ddfcec91f93474d6307f7a2d3135e9c674dc/aiohttp-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:1ac8531b638959718e18c2207fbfe297819875da46a740b29dfa29beba64355a", size = 479748, upload-time = "2026-06-07T21:07:58.319Z" },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/22/0a/62e7232dc9484fbec112ceb32efb6a624cc7994ec6e2b019286f17c4e8f2/aiohttp-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:250d14af67f6b6a1a4a811049b1afa69d61d617fca6bf33149b3ab1a6dbcf7b8", size = 447723, upload-time = "2026-06-07T21:08:00.154Z" },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/c4/a1/5fafa04e1ca91ddb47608699d60649c1c6db3cf41c99e78fc4056f9513db/aiohttp-3.14.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:7c106c26852ca1c2047c6b80384f17100b4e439af276f21ef3d4e2f450ae7e15", size = 508531, upload-time = "2026-06-07T21:08:02.093Z" },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/fa/2e/bfa02f699d87ffc86d5959270b28f1cb410add3ccaced8ed2e0b8a5238fc/aiohttp-3.14.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:20205f7f5ade7aaec9f4b500549bbc071b046453aed72f9c06dcab87896a83e8", size = 514718, upload-time = "2026-06-07T21:08:04.476Z" },
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/85/a5/9594ad6289eebbc97d167c44213d557807f90e59115caad24de21ad2c3b1/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:62a759436b29e677181a9e76bab8b8f689a29cb9c535f45f7c48c9c830d3f8c3", size = 487918, upload-time = "2026-06-07T21:08:06.377Z" },
|
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/b4/61/16a32c36c3c49edec122a3dc811f2057df2f94d3b14aa107c8017d981618/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2964cbf553df4d7a57348da44d961d871895fc1ee4e8c322b2a95612c7b17fba", size = 494014, upload-time = "2026-06-07T21:08:08.263Z" },
|
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/9b/89/3ebcf96ed99c05bec9c434aaac6963fd3cbab4a786ae739908a144d9ce44/aiohttp-3.14.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:237651caadc3a59badd39319c54642b5299e9cc98a3a194310e55d5bb9f5e397", size = 502398, upload-time = "2026-06-07T21:08:10.244Z" },
|
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/fd/3d/b74870a0c2d40c355928cd5b96c7a11fa821b8a40fc41365e64479b151fb/aiohttp-3.14.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:896e12dfdbbab9d8f7e16d2b28c6769a60126fa92095d1ebf9473d02593a2448", size = 758018, upload-time = "2026-06-07T21:08:12.447Z" },
|
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/d3/66/f42f5c984d99e49c6cff5f26f590750f2e2f7ef1fcfb99966ab5be1b632e/aiohttp-3.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d03f281ed22579314ba00821ce20115a7c0ac430660b4cc05704a3f818b3e004", size = 512462, upload-time = "2026-06-07T21:08:14.624Z" },
|
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983", size = 512824, upload-time = "2026-06-07T21:08:16.572Z" },
|
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/26/97/2aa0e5ba0727dc3bd5aaebb7ccbc510f7dfb7fb961ec87497cd496635ab1/aiohttp-3.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fe1f1087cbadb280b5e1bb054a4f00d1423c74d6626c5e48400d871d34ecefe", size = 1749898, upload-time = "2026-06-07T21:08:18.635Z" },
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/00/8d/e97f6c96c891d457c8479d92a514ba194d0412f981d72c70341ee18488ed/aiohttp-3.14.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:367a9314fdc79dab0fac96e216cb41dd73c85bdca85306ce8999118ba7e0f333", size = 1710114, upload-time = "2026-06-07T21:08:20.892Z" },
|
|
81
|
+
{ url = "https://files.pythonhosted.org/packages/6f/e6/aa8d7e863048c8fceb5cd6ce74017311cec3ead07847387e12265fb4444e/aiohttp-3.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24f677ebe83749039e7bdf862ff0bbb16818ae4193d4ef96505e269375bcce0", size = 1802541, upload-time = "2026-06-07T21:08:23.044Z" },
|
|
82
|
+
{ url = "https://files.pythonhosted.org/packages/83/a8/72193137de57fda4ebfae4563182d082c8856e3b6e9871d0b46f028fb369/aiohttp-3.14.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c83afe0ba876be7e943d2e0ba645809ad441575d2840c895c21ee5de93b9377a", size = 1875776, upload-time = "2026-06-07T21:08:25.288Z" },
|
|
83
|
+
{ url = "https://files.pythonhosted.org/packages/a0/18/938441025db6769a3464596b2410af3afde0b21eb2f204c6f766f68af4bd/aiohttp-3.14.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:634e385930fb6d2d479cf3aa66515955863b77a5e3c2b5894ca259a25b308602", size = 1760329, upload-time = "2026-06-07T21:08:27.363Z" },
|
|
84
|
+
{ url = "https://files.pythonhosted.org/packages/60/29/bf2496b4065e76e09fe48015aaffe5ce161d8f089b06ac6982070f653076/aiohttp-3.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeea07c4397bbc57719c4eed8f9c284874d4f175f9b6d57f7a1546b976d455ca", size = 1587293, upload-time = "2026-06-07T21:08:29.805Z" },
|
|
85
|
+
{ url = "https://files.pythonhosted.org/packages/49/a2/2136674d52123b1354bd05dd5753c318db47dc0c927cc70b27bab3755456/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:335c0cc3e3545ce98dcb9cfcb836f40c3411f43fa03dab757597d80c89af8a35", size = 1714756, upload-time = "2026-06-07T21:08:32.094Z" },
|
|
86
|
+
{ url = "https://files.pythonhosted.org/packages/a7/b9/e5fd2e6f915503081c0f9b1e8540947037929c70c191da2e4d54b31a21a1/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ae6be797afdef264e8a84864a85b196ca06045586481b3df8a967322fd2fa844", size = 1721052, upload-time = "2026-06-07T21:08:34.167Z" },
|
|
87
|
+
{ url = "https://files.pythonhosted.org/packages/63/5a/2833e324a2263e104e31e2e91bc5bbee81bc499afd32203faee048a883f0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:8560b4d712474335d08907db7973f71912d3a9a8f1dee992ec06b5d2fe359496", size = 1766888, upload-time = "2026-06-07T21:08:36.95Z" },
|
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/57/fa/dea6511870913162f3b2e8c42a7614eb203a4540b8c2da43e0bfb0548f3c/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7edd08e0a5deb1e8564a2fcd8f4561014a3f05252334671bbf55ddd47db0e5", size = 1581679, upload-time = "2026-06-07T21:08:39.292Z" },
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/14/bd/3cf0d55e71784b33534e9710a67d382d900598b4787fbce6cc7317f8c42a/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:b6ff7fcee63287ae57b5df3e4f5957ce032122802509246dec1a5bcc55904c95", size = 1782021, upload-time = "2026-06-07T21:08:41.407Z" },
|
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/c1/af/14bb5843eccbe234f4dfb78ab73e549d99727247e62ae5d62cbd22eaf5b0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ffbb2f4ec1ceaff7e07d43922954da26b223d188bf30658e561b98e23089444", size = 1742574, upload-time = "2026-06-07T21:08:43.795Z" },
|
|
91
|
+
{ url = "https://files.pythonhosted.org/packages/f2/1e/fbeb7af9210a67ac0f9c9bec0f8f4568497924e33137a3d5b48e1cf85f3f/aiohttp-3.14.1-cp314-cp314-win32.whl", hash = "sha256:a9875b46d910cff3ea2f5962f9d266b465459fe634e22556ab9bd6fc1192eea0", size = 457773, upload-time = "2026-06-07T21:08:46.168Z" },
|
|
92
|
+
{ url = "https://files.pythonhosted.org/packages/f0/2b/13e8d741a9ec5db7d900c060554cf8352ab85e44e2a4469ebb9d377bda17/aiohttp-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:af8b4b81a960eeaf1234971ac3cd0ba5901f3cd42eae42a46b4d089a8b492719", size = 485001, upload-time = "2026-06-07T21:08:48.401Z" },
|
|
93
|
+
{ url = "https://files.pythonhosted.org/packages/df/30/491acfa2c4d6c3ff59c49a14fc1b50be3241e25bbb0c84c09e2da4d11395/aiohttp-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:cf4491381b1b57425c315a56a439251b1bdac07b2275f19a8c44bc57744532ec", size = 453809, upload-time = "2026-06-07T21:08:50.7Z" },
|
|
94
|
+
{ url = "https://files.pythonhosted.org/packages/34/e3/19dbe1a1f4cc6230eb9e314de7fe68053b0992f9302b27d12141a0b5db53/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:819c054312f1af92947e6a55883d1b66feefab11531a7fc45e0fb9b63880b5c2", size = 793320, upload-time = "2026-06-07T21:08:52.775Z" },
|
|
95
|
+
{ url = "https://files.pythonhosted.org/packages/7f/20/1b7182219ba1b108430d6e4dc53d25ae02dcfcf5a045b33af4e8c5167527/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10ee9c1753a8f706345b22496c79fbddb5be0599e0823f3738b1534058e25340", size = 529077, upload-time = "2026-06-07T21:08:55Z" },
|
|
96
|
+
{ url = "https://files.pythonhosted.org/packages/b9/c8/14ce60ec31a2e5f5274bb17d383a6f7a3aabca31ac04eee05585bbadab16/aiohttp-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1601cc37baf5750ccacae618ec2daf020769581695550e3b654a911f859c563d", size = 532476, upload-time = "2026-06-07T21:08:57.176Z" },
|
|
97
|
+
{ url = "https://files.pythonhosted.org/packages/7e/02/9ac85e081e53da2e061b02fa7758fe0a12d17b8ce2d1f5e6c7cb76730328/aiohttp-3.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d6e0ac9da31c9c04c84e1c0182ad8d6df35965a85cae29cd71d089621b3ae94", size = 1922347, upload-time = "2026-06-07T21:08:59.563Z" },
|
|
98
|
+
{ url = "https://files.pythonhosted.org/packages/c0/3e/d3ba07a0ab38b5389e10bec4362d21e10a4f667cba2d79ba30837b3a5059/aiohttp-3.14.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e8f2d660c350b3d0e259c7a7e3d9b7fc8b41210cbcc3d4a7076ff0a5e5c2fdc", size = 1786465, upload-time = "2026-06-07T21:09:01.909Z" },
|
|
99
|
+
{ url = "https://files.pythonhosted.org/packages/0b/cb/e2ee978a00cfb2df829704a69528b18154eba5939f45bc1efa8f33aee4c5/aiohttp-3.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4691802dda97be727f79d86818acaad7eb8e9252626a1d6b519fedbb92d5e251", size = 1909423, upload-time = "2026-06-07T21:09:04.357Z" },
|
|
100
|
+
{ url = "https://files.pythonhosted.org/packages/73/5d/1430334858b1022b58ae50399a918f0bd6fe8fa7fa183598d657ff61e040/aiohttp-3.14.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c389c482a7e9b9dc3ee2701ac46c4125297a3818875b9c305ddb603c04828fd1", size = 2001906, upload-time = "2026-06-07T21:09:06.722Z" },
|
|
101
|
+
{ url = "https://files.pythonhosted.org/packages/66/4e/560c7472d3d198a23aa5c8b19a5115bf6a9b77b7d3e4bb363da320430ad2/aiohttp-3.14.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc0cacab7ba4e56f0f81c82a98c09bed2f39c940107b03a34b168bdf7597edd3", size = 1877095, upload-time = "2026-06-07T21:09:09.011Z" },
|
|
102
|
+
{ url = "https://files.pythonhosted.org/packages/0d/f1/4745806578d447db4a784a8591e2dae3afdfc2bcb96f8f81271b13df6543/aiohttp-3.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:979ed4717f59b8bb12e3963378fa285d93d367e15bcd66c721311826d3c44a6c", size = 1676222, upload-time = "2026-06-07T21:09:11.461Z" },
|
|
103
|
+
{ url = "https://files.pythonhosted.org/packages/6a/c9/48255813cca749a229ef0ab476004ec623728ad79a9c0840616f6c076325/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:38e1e7daaea81df51c952e18483f323d878499a1e2bfe564790e0f9701d6f203", size = 1842922, upload-time = "2026-06-07T21:09:14.118Z" },
|
|
104
|
+
{ url = "https://files.pythonhosted.org/packages/3d/c0/bbd054e2bee909f529523a5af3891052606af5143c09f5f183ec3b234676/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4132e72c608fe9fecb8f409113567605915b83e9bdd3ea56538d2f9cd35002f1", size = 1825035, upload-time = "2026-06-07T21:09:16.447Z" },
|
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/a8/ae/90395d4376deceb74e09ec26b6adf7d2015a6f8802d6d84446af860fef04/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eefd9cc9b6d4a2db5f00a26bc3e4f9acf71926a6ec557cd56c9c6f27c290b665", size = 1849512, upload-time = "2026-06-07T21:09:18.742Z" },
|
|
106
|
+
{ url = "https://files.pythonhosted.org/packages/93/bd/fb25f3049957553d4ce0ba6ae480aa2f592a6985497fca590837d16c1be0/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b165790117eea512d7f3fb22f1f6dad3d55a7189571993eb015591c1401276d1", size = 1668571, upload-time = "2026-06-07T21:09:21.458Z" },
|
|
107
|
+
{ url = "https://files.pythonhosted.org/packages/3f/22/7f73303d64dd567ff3addca90b556690ed1233a47b8f55d242fb90af3681/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ed09c7eb1c391271c2ed0314a51903e72a3acb653d5ccfc264cdf3ef11f8269d", size = 1881159, upload-time = "2026-06-07T21:09:23.813Z" },
|
|
108
|
+
{ url = "https://files.pythonhosted.org/packages/44/be/0474c5a8b5640e1e4aa1923430a91f4151be82e511373fe764189b89aef5/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:99abd37084b82f5830c635fddd0b4993b9742a66eb746dacf433c8590e8f9e3c", size = 1841409, upload-time = "2026-06-07T21:09:26.207Z" },
|
|
109
|
+
{ url = "https://files.pythonhosted.org/packages/7b/3c/bb4a7cba26956cb3da4553cc2056cf67be5b5ff6e6d8fa4fbdff73bfb7ae/aiohttp-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:47ddf841cdecc810749921d25606dee45857d12d2ad5ddb7b5bd7eab12e4b365", size = 494166, upload-time = "2026-06-07T21:09:28.505Z" },
|
|
110
|
+
{ url = "https://files.pythonhosted.org/packages/8a/84/ec80c2c1f66a952555a9f86df6b33af65108a6febfa0471b69013a12f807/aiohttp-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e78b522b7a6e27e0b25d19b247b75039ac4c94f99823e3c9e53ae1603a9f7e9", size = 530255, upload-time = "2026-06-07T21:09:30.843Z" },
|
|
111
|
+
{ url = "https://files.pythonhosted.org/packages/2a/71/6e22be134a4061ada85a92951b842f2657f17d926b727f3f94c56ae963d6/aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6", size = 469640, upload-time = "2026-06-07T21:09:33.028Z" },
|
|
97
112
|
]
|
|
98
113
|
|
|
99
114
|
[[package]]
|
|
@@ -465,20 +480,20 @@ wheels = [
|
|
|
465
480
|
|
|
466
481
|
[[package]]
|
|
467
482
|
name = "pyright"
|
|
468
|
-
version = "1.1.
|
|
483
|
+
version = "1.1.411"
|
|
469
484
|
source = { registry = "https://pypi.org/simple" }
|
|
470
485
|
dependencies = [
|
|
471
486
|
{ name = "nodeenv" },
|
|
472
487
|
{ name = "typing-extensions" },
|
|
473
488
|
]
|
|
474
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
489
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7e/ab/265f7dc69d28113ebba19092e57b075f41543b2ed048429c5f56e2b88eac/pyright-1.1.411.tar.gz", hash = "sha256:d885a0551f2e763b089a02702174e7f4ba77548cddabc972ab86d1f7f1b0f998", size = 4112861, upload-time = "2026-06-25T02:14:06.37Z" }
|
|
475
490
|
wheels = [
|
|
476
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
491
|
+
{ url = "https://files.pythonhosted.org/packages/0a/49/385be530a6a5b78d1cbcd5c2e38debc8959a2fc6bdb716f4e581002979fc/pyright-1.1.411-py3-none-any.whl", hash = "sha256:dc7c72a8e2700c55baa127554040e067041ea53ccfd50bf96308cc4291c7d5d9", size = 6181526, upload-time = "2026-06-25T02:14:04.691Z" },
|
|
477
492
|
]
|
|
478
493
|
|
|
479
494
|
[[package]]
|
|
480
495
|
name = "pytest"
|
|
481
|
-
version = "9.
|
|
496
|
+
version = "9.1.1"
|
|
482
497
|
source = { registry = "https://pypi.org/simple" }
|
|
483
498
|
dependencies = [
|
|
484
499
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
@@ -487,27 +502,27 @@ dependencies = [
|
|
|
487
502
|
{ name = "pluggy" },
|
|
488
503
|
{ name = "pygments" },
|
|
489
504
|
]
|
|
490
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
505
|
+
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" }
|
|
491
506
|
wheels = [
|
|
492
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
507
|
+
{ url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
|
|
493
508
|
]
|
|
494
509
|
|
|
495
510
|
[[package]]
|
|
496
511
|
name = "pytest-asyncio"
|
|
497
|
-
version = "1.
|
|
512
|
+
version = "1.4.0"
|
|
498
513
|
source = { registry = "https://pypi.org/simple" }
|
|
499
514
|
dependencies = [
|
|
500
515
|
{ name = "pytest" },
|
|
501
516
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
502
517
|
]
|
|
503
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
518
|
+
sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" }
|
|
504
519
|
wheels = [
|
|
505
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
520
|
+
{ url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" },
|
|
506
521
|
]
|
|
507
522
|
|
|
508
523
|
[[package]]
|
|
509
524
|
name = "python-daynest"
|
|
510
|
-
version = "0.1.
|
|
525
|
+
version = "0.1.10"
|
|
511
526
|
source = { editable = "." }
|
|
512
527
|
dependencies = [
|
|
513
528
|
{ name = "aiohttp" },
|
|
@@ -526,35 +541,35 @@ requires-dist = [{ name = "aiohttp", specifier = ">=3.9" }]
|
|
|
526
541
|
|
|
527
542
|
[package.metadata.requires-dev]
|
|
528
543
|
dev = [
|
|
529
|
-
{ name = "pyright", specifier = "
|
|
530
|
-
{ name = "pytest", specifier = "
|
|
531
|
-
{ name = "pytest-asyncio", specifier = "
|
|
532
|
-
{ name = "ruff", specifier = "
|
|
544
|
+
{ name = "pyright", specifier = "==1.1.411" },
|
|
545
|
+
{ name = "pytest", specifier = "==9.1.1" },
|
|
546
|
+
{ name = "pytest-asyncio", specifier = "==1.4.0" },
|
|
547
|
+
{ name = "ruff", specifier = "==0.15.22" },
|
|
533
548
|
]
|
|
534
549
|
|
|
535
550
|
[[package]]
|
|
536
551
|
name = "ruff"
|
|
537
|
-
version = "0.15.
|
|
552
|
+
version = "0.15.22"
|
|
538
553
|
source = { registry = "https://pypi.org/simple" }
|
|
539
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
554
|
+
sdist = { url = "https://files.pythonhosted.org/packages/3a/06/ae069393fc66e8ff33036d4b368003833bf6e88ccf182e17e7a2f1c754fd/ruff-0.15.22.tar.gz", hash = "sha256:3f15175b1fb580126f58285a5dae6b2ea89000136d980c64499211f116b54809", size = 4785063, upload-time = "2026-07-16T15:14:13.244Z" }
|
|
540
555
|
wheels = [
|
|
541
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
542
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
543
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
544
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
545
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
546
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
547
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
548
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
549
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
550
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
551
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
552
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
553
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
554
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
555
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
556
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
557
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
556
|
+
{ url = "https://files.pythonhosted.org/packages/23/18/ee54b7ae1e121be7a28ea6da4b67564ebb0530e183a54415ab7e3bcd2c4e/ruff-0.15.22-py3-none-linux_armv6l.whl", hash = "sha256:44423e73493737f5e7c5b41d475483898ff37afcdae38bc3da5085e29af1c2d8", size = 10781258, upload-time = "2026-07-16T15:13:19.452Z" },
|
|
557
|
+
{ url = "https://files.pythonhosted.org/packages/2f/d2/2520cb14761ddbeaf57642a76942fc36adcbdbe53b4532241995f6fc485c/ruff-0.15.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b82c6482946e9eda7ff2e091d25b8bad3f718684e1916d41bd56873cee05b697", size = 10999477, upload-time = "2026-07-16T15:13:23.318Z" },
|
|
558
|
+
{ url = "https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f", size = 10466716, upload-time = "2026-07-16T15:13:26.162Z" },
|
|
559
|
+
{ url = "https://files.pythonhosted.org/packages/1e/cc/44eaaf0844e028182f2d0a8f2190d0f359159aed0a9e5ab861d892f1ae2a/ruff-0.15.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:742a29cf29bddb7c8327895d6a10e0e6c5b38a96dd407af9b5d0857f809c0576", size = 10892644, upload-time = "2026-07-16T15:13:29.229Z" },
|
|
560
|
+
{ url = "https://files.pythonhosted.org/packages/9f/21/8edf559014d2b0f82beea19cfb713993ad802ccda16868769979c6090a84/ruff-0.15.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72af58b951b0ae395935ae79763dc349bc0eb706319d28f7a33ad2cfb3cfc178", size = 10576719, upload-time = "2026-07-16T15:13:32.35Z" },
|
|
561
|
+
{ url = "https://files.pythonhosted.org/packages/bf/1e/3a13abd392a3b50b62e5938a831f9ab6e588358cacad5c18545b716d2182/ruff-0.15.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d425005c1835eb24e2ee4161cb90e8db263415f4a71c8c72c33abaa6c0c224", size = 11376494, upload-time = "2026-07-16T15:13:35.958Z" },
|
|
562
|
+
{ url = "https://files.pythonhosted.org/packages/bf/3e/422d3d95bcf04dd78e1aeac22184d4f9a8fb2c01865d39d44618484a0317/ruff-0.15.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b9b3f8779a4f08c969defc3c8c35abffaa757e601ed5ae66d6d1db6519969a", size = 12208370, upload-time = "2026-07-16T15:13:39.185Z" },
|
|
563
|
+
{ url = "https://files.pythonhosted.org/packages/1e/91/5d065a0e0a02bf4813f5119ad278462eed081d2b832eb7c021ade0ec9e65/ruff-0.15.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e0dd1b2e4d3d585f897a0d137cbf4eaf6223bef4e8ce34d6bb12556c5f9249e", size = 11581098, upload-time = "2026-07-16T15:13:42.132Z" },
|
|
564
|
+
{ url = "https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb", size = 11399422, upload-time = "2026-07-16T15:13:45.2Z" },
|
|
565
|
+
{ url = "https://files.pythonhosted.org/packages/18/80/c843a5176cddbceb0b7e8dd41cf9993490796c1c469348d384f5a5c13c56/ruff-0.15.22-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fabfd168afdf29fee5be98b831efa9683c94d7c5a3b58b9ce5a2e38444589a74", size = 11381683, upload-time = "2026-07-16T15:13:48.46Z" },
|
|
566
|
+
{ url = "https://files.pythonhosted.org/packages/d4/00/8485de0ae92239438a36cfc51350db9b9e85c9ebdfaea91b18e422706662/ruff-0.15.22-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:225dbf095a87f1d9f90f5fd7924d2613ee452a75a4308c63a8f50f761787aa7c", size = 10850295, upload-time = "2026-07-16T15:13:51.655Z" },
|
|
567
|
+
{ url = "https://files.pythonhosted.org/packages/fa/91/24977ec2ec72eaf15e4394ace2959fdff2dd1e14f03e005e838023407169/ruff-0.15.22-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296", size = 10579640, upload-time = "2026-07-16T15:13:54.79Z" },
|
|
568
|
+
{ url = "https://files.pythonhosted.org/packages/9c/47/9b51216951974df1f263ac19da550d34252e0ed7218c25f10c5ef9ed7517/ruff-0.15.22-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1606c510bd7215680d32efab38965f7cdec3ef69f5170a3f4791404ffdd5262", size = 11105077, upload-time = "2026-07-16T15:13:57.915Z" },
|
|
569
|
+
{ url = "https://files.pythonhosted.org/packages/c2/47/20e9d4a3b8016778acea5fc32bb50d35d207500a17ddb529ffa6996feef8/ruff-0.15.22-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:630479b18625f5ffc373f77603a22a9f8ac0acd7ff0501178b5db28ec71e9c64", size = 11490980, upload-time = "2026-07-16T15:14:01.032Z" },
|
|
570
|
+
{ url = "https://files.pythonhosted.org/packages/4d/76/3f72d8fc38c1cb77b38c56a70da9d0c17700cc1cc50f9649c9d3c8f5ba71/ruff-0.15.22-py3-none-win32.whl", hash = "sha256:e5ba0e4a13fd14abbed2a77b517a3911290c6c6c59ef67784328d1668fab76cf", size = 10789165, upload-time = "2026-07-16T15:14:04.16Z" },
|
|
571
|
+
{ url = "https://files.pythonhosted.org/packages/cb/46/4965251734c2b6fcdca1b1b187d20bcac3af0ee5b083b89c910bb961ce3a/ruff-0.15.22-py3-none-win_amd64.whl", hash = "sha256:9be63ba1eb936acd2d1342fb8337c356353706fce233b2a15a09a97037e6acde", size = 11938297, upload-time = "2026-07-16T15:14:07.316Z" },
|
|
572
|
+
{ url = "https://files.pythonhosted.org/packages/57/c9/e69b1ff4c8b69093ef08b8919ab767af0569666865b39c30a8795d88d3c6/ruff-0.15.22-py3-none-win_arm64.whl", hash = "sha256:e1168075b72158510839f250027659cdd78476f40507dd517892304c41318661", size = 11298172, upload-time = "2026-07-16T15:14:10.51Z" },
|
|
558
573
|
]
|
|
559
574
|
|
|
560
575
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|