langgraph-checkpoint-postgres 2.0.22__tar.gz → 2.0.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/PKG-INFO +1 -1
  2. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/__init__.py +26 -10
  3. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/aio.py +27 -11
  4. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/store/postgres/base.py +1 -0
  5. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/pyproject.toml +1 -1
  6. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/uv.lock +26 -26
  7. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/.gitignore +0 -0
  8. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/Makefile +0 -0
  9. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/README.md +0 -0
  10. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/_ainternal.py +0 -0
  11. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/_internal.py +0 -0
  12. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/base.py +0 -0
  13. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/py.typed +0 -0
  14. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/checkpoint/postgres/shallow.py +0 -0
  15. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/store/postgres/__init__.py +0 -0
  16. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/store/postgres/aio.py +0 -0
  17. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/langgraph/store/postgres/py.typed +0 -0
  18. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/__init__.py +0 -0
  19. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/compose-postgres.yml +0 -0
  20. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/conftest.py +0 -0
  21. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/embed_test_utils.py +0 -0
  22. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/test_async.py +0 -0
  23. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/test_async_store.py +0 -0
  24. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/test_store.py +0 -0
  25. {langgraph_checkpoint_postgres-2.0.22 → langgraph_checkpoint_postgres-2.0.23}/tests/test_sync.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-checkpoint-postgres
3
- Version: 2.0.22
3
+ Version: 2.0.23
4
4
  Summary: Library with a Postgres implementation of LangGraph checkpoint saver.
5
5
  Project-URL: Repository, https://www.github.com/langchain-ai/langgraph
6
6
  License-Expression: MIT
@@ -289,6 +289,7 @@ class PostgresSaver(BasePostgresSaver):
289
289
  )
290
290
 
291
291
  copy = checkpoint.copy()
292
+ copy["channel_values"] = copy["channel_values"].copy()
292
293
  next_config = {
293
294
  "configurable": {
294
295
  "thread_id": thread_id,
@@ -297,16 +298,28 @@ class PostgresSaver(BasePostgresSaver):
297
298
  }
298
299
  }
299
300
 
301
+ # inline primitive values in checkpoint table
302
+ # others are stored in blobs table
303
+ blob_values = {}
304
+ for k, v in checkpoint["channel_values"].items():
305
+ if v is None or isinstance(v, (str, int, float, bool)):
306
+ pass
307
+ else:
308
+ blob_values[k] = copy["channel_values"].pop(k)
309
+
300
310
  with self._cursor(pipeline=True) as cur:
301
- cur.executemany(
302
- self.UPSERT_CHECKPOINT_BLOBS_SQL,
303
- self._dump_blobs(
304
- thread_id,
305
- checkpoint_ns,
306
- copy.pop("channel_values"), # type: ignore[misc]
307
- new_versions,
308
- ),
309
- )
311
+ if blob_versions := {
312
+ k: v for k, v in new_versions.items() if k in blob_values
313
+ }:
314
+ cur.executemany(
315
+ self.UPSERT_CHECKPOINT_BLOBS_SQL,
316
+ self._dump_blobs(
317
+ thread_id,
318
+ checkpoint_ns,
319
+ blob_values,
320
+ blob_versions,
321
+ ),
322
+ )
310
323
  cur.execute(
311
324
  self.UPSERT_CHECKPOINTS_SQL,
312
325
  (
@@ -439,7 +452,10 @@ class PostgresSaver(BasePostgresSaver):
439
452
  },
440
453
  {
441
454
  **value["checkpoint"],
442
- "channel_values": self._load_blobs(value["channel_values"]),
455
+ "channel_values": {
456
+ **value["checkpoint"].get("channel_values"),
457
+ **self._load_blobs(value["channel_values"]),
458
+ },
443
459
  },
444
460
  value["metadata"],
445
461
  (
@@ -245,6 +245,7 @@ class AsyncPostgresSaver(BasePostgresSaver):
245
245
  )
246
246
 
247
247
  copy = checkpoint.copy()
248
+ copy["channel_values"] = copy["channel_values"].copy()
248
249
  next_config = {
249
250
  "configurable": {
250
251
  "thread_id": thread_id,
@@ -253,17 +254,29 @@ class AsyncPostgresSaver(BasePostgresSaver):
253
254
  }
254
255
  }
255
256
 
257
+ # inline primitive values in checkpoint table
258
+ # others are stored in blobs table
259
+ blob_values = {}
260
+ for k, v in checkpoint["channel_values"].items():
261
+ if v is None or isinstance(v, (str, int, float, bool)):
262
+ pass
263
+ else:
264
+ blob_values[k] = copy["channel_values"].pop(k)
265
+
256
266
  async with self._cursor(pipeline=True) as cur:
257
- await cur.executemany(
258
- self.UPSERT_CHECKPOINT_BLOBS_SQL,
259
- await asyncio.to_thread(
260
- self._dump_blobs,
261
- thread_id,
262
- checkpoint_ns,
263
- copy.pop("channel_values"), # type: ignore[misc]
264
- new_versions,
265
- ),
266
- )
267
+ if blob_versions := {
268
+ k: v for k, v in new_versions.items() if k in blob_values
269
+ }:
270
+ await cur.executemany(
271
+ self.UPSERT_CHECKPOINT_BLOBS_SQL,
272
+ await asyncio.to_thread(
273
+ self._dump_blobs,
274
+ thread_id,
275
+ checkpoint_ns,
276
+ blob_values,
277
+ blob_versions,
278
+ ),
279
+ )
267
280
  await cur.execute(
268
281
  self.UPSERT_CHECKPOINTS_SQL,
269
282
  (
@@ -397,7 +410,10 @@ class AsyncPostgresSaver(BasePostgresSaver):
397
410
  },
398
411
  {
399
412
  **value["checkpoint"],
400
- "channel_values": self._load_blobs(value["channel_values"]),
413
+ "channel_values": {
414
+ **value["checkpoint"].get("channel_values"),
415
+ **self._load_blobs(value["channel_values"]),
416
+ },
401
417
  },
402
418
  value["metadata"],
403
419
  (
@@ -756,6 +756,7 @@ class PostgresStore(BaseStore, BasePostgresStore[_pg_internal.Conn]):
756
756
  If provided, will create a connection pool and use it instead of a single connection.
757
757
  This overrides the `pipeline` argument.
758
758
  index: The index configuration for the store.
759
+ ttl: The TTL configuration for the store.
759
760
 
760
761
  Returns:
761
762
  PostgresStore: A new PostgresStore instance.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "langgraph-checkpoint-postgres"
7
- version = "2.0.22"
7
+ version = "2.0.23"
8
8
  description = "Library with a Postgres implementation of LangGraph checkpoint saver."
9
9
  authors = []
10
10
  requires-python = ">=3.9"
@@ -28,11 +28,11 @@ wheels = [
28
28
 
29
29
  [[package]]
30
30
  name = "certifi"
31
- version = "2025.6.15"
31
+ version = "2025.7.9"
32
32
  source = { registry = "https://pypi.org/simple" }
33
- sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload-time = "2025-06-15T02:45:51.329Z" }
33
+ sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386, upload-time = "2025-07-09T02:13:58.874Z" }
34
34
  wheels = [
35
- { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload-time = "2025-06-15T02:45:49.977Z" },
35
+ { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230, upload-time = "2025-07-09T02:13:57.007Z" },
36
36
  ]
37
37
 
38
38
  [[package]]
@@ -334,7 +334,7 @@ dev = [
334
334
 
335
335
  [[package]]
336
336
  name = "langgraph-checkpoint-postgres"
337
- version = "2.0.22"
337
+ version = "2.0.23"
338
338
  source = { editable = "." }
339
339
  dependencies = [
340
340
  { name = "langgraph-checkpoint" },
@@ -381,7 +381,7 @@ dev = [
381
381
 
382
382
  [[package]]
383
383
  name = "langsmith"
384
- version = "0.4.4"
384
+ version = "0.4.5"
385
385
  source = { registry = "https://pypi.org/simple" }
386
386
  dependencies = [
387
387
  { name = "httpx" },
@@ -392,9 +392,9 @@ dependencies = [
392
392
  { name = "requests-toolbelt" },
393
393
  { name = "zstandard" },
394
394
  ]
395
- sdist = { url = "https://files.pythonhosted.org/packages/20/c8/8d2e0fc438d2d3d8d4300f7684ea30a754344ed00d7ba9cc2705241d2a5f/langsmith-0.4.4.tar.gz", hash = "sha256:70c53bbff24a7872e88e6fa0af98270f4986a6e364f9e85db1cc5636defa4d66", size = 352105, upload-time = "2025-06-27T19:20:36.207Z" }
395
+ sdist = { url = "https://files.pythonhosted.org/packages/5c/92/7885823f3d13222f57773921f0da19b37d628c64607491233dc853a0f6ea/langsmith-0.4.5.tar.gz", hash = "sha256:49444bd8ccd4e46402f1b9ff1d686fa8e3a31b175e7085e72175ab8ec6164a34", size = 352235, upload-time = "2025-07-10T22:08:04.505Z" }
396
396
  wheels = [
397
- { url = "https://files.pythonhosted.org/packages/1d/33/a3337eb70d795495a299a1640d7a75f17fb917155a64309b96106e7b9452/langsmith-0.4.4-py3-none-any.whl", hash = "sha256:014c68329bd085bd6c770a6405c61bb6881f82eb554ce8c4d1984b0035fd1716", size = 367687, upload-time = "2025-06-27T19:20:33.839Z" },
397
+ { url = "https://files.pythonhosted.org/packages/c8/10/ad3107b666c3203b7938d10ea6b8746b9735c399cf737a51386d58e41d34/langsmith-0.4.5-py3-none-any.whl", hash = "sha256:4167717a2cccc4dff5809dbddc439628e836f6fd13d4fdb31ea013bc8d5cfaf5", size = 367795, upload-time = "2025-07-10T22:08:02.548Z" },
398
398
  ]
399
399
 
400
400
  [[package]]
@@ -977,27 +977,27 @@ wheels = [
977
977
 
978
978
  [[package]]
979
979
  name = "ruff"
980
- version = "0.12.2"
980
+ version = "0.12.3"
981
981
  source = { registry = "https://pypi.org/simple" }
982
- sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239, upload-time = "2025-07-03T16:40:19.566Z" }
982
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/2a/43955b530c49684d3c38fcda18c43caf91e99204c2a065552528e0552d4f/ruff-0.12.3.tar.gz", hash = "sha256:f1b5a4b6668fd7b7ea3697d8d98857390b40c1320a63a178eee6be0899ea2d77", size = 4459341, upload-time = "2025-07-11T13:21:16.086Z" }
983
983
  wheels = [
984
- { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761, upload-time = "2025-07-03T16:39:38.847Z" },
985
- { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659, upload-time = "2025-07-03T16:39:42.294Z" },
986
- { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769, upload-time = "2025-07-03T16:39:44.75Z" },
987
- { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602, upload-time = "2025-07-03T16:39:47.652Z" },
988
- { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772, upload-time = "2025-07-03T16:39:49.641Z" },
989
- { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173, upload-time = "2025-07-03T16:39:52.069Z" },
990
- { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002, upload-time = "2025-07-03T16:39:54.551Z" },
991
- { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330, upload-time = "2025-07-03T16:39:57.55Z" },
992
- { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717, upload-time = "2025-07-03T16:39:59.78Z" },
993
- { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659, upload-time = "2025-07-03T16:40:01.934Z" },
994
- { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012, upload-time = "2025-07-03T16:40:04.363Z" },
995
- { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799, upload-time = "2025-07-03T16:40:06.514Z" },
996
- { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507, upload-time = "2025-07-03T16:40:08.708Z" },
997
- { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609, upload-time = "2025-07-03T16:40:10.836Z" },
998
- { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823, upload-time = "2025-07-03T16:40:13.203Z" },
999
- { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831, upload-time = "2025-07-03T16:40:15.478Z" },
1000
- { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334, upload-time = "2025-07-03T16:40:17.677Z" },
984
+ { url = "https://files.pythonhosted.org/packages/e2/fd/b44c5115539de0d598d75232a1cc7201430b6891808df111b8b0506aae43/ruff-0.12.3-py3-none-linux_armv6l.whl", hash = "sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2", size = 10430499, upload-time = "2025-07-11T13:20:26.321Z" },
985
+ { url = "https://files.pythonhosted.org/packages/43/c5/9eba4f337970d7f639a37077be067e4ec80a2ad359e4cc6c5b56805cbc66/ruff-0.12.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041", size = 11213413, upload-time = "2025-07-11T13:20:30.017Z" },
986
+ { url = "https://files.pythonhosted.org/packages/e2/2c/fac3016236cf1fe0bdc8e5de4f24c76ce53c6dd9b5f350d902549b7719b2/ruff-0.12.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fa6b24600cf3b750e48ddb6057e901dd5b9aa426e316addb2a1af185a7509882", size = 10586941, upload-time = "2025-07-11T13:20:33.046Z" },
987
+ { url = "https://files.pythonhosted.org/packages/c5/0f/41fec224e9dfa49a139f0b402ad6f5d53696ba1800e0f77b279d55210ca9/ruff-0.12.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2506961bf6ead54887ba3562604d69cb430f59b42133d36976421bc8bd45901", size = 10783001, upload-time = "2025-07-11T13:20:35.534Z" },
988
+ { url = "https://files.pythonhosted.org/packages/0d/ca/dd64a9ce56d9ed6cad109606ac014860b1c217c883e93bf61536400ba107/ruff-0.12.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4faaff1f90cea9d3033cbbcdf1acf5d7fb11d8180758feb31337391691f3df0", size = 10269641, upload-time = "2025-07-11T13:20:38.459Z" },
989
+ { url = "https://files.pythonhosted.org/packages/63/5c/2be545034c6bd5ce5bb740ced3e7014d7916f4c445974be11d2a406d5088/ruff-0.12.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40dced4a79d7c264389de1c59467d5d5cefd79e7e06d1dfa2c75497b5269a5a6", size = 11875059, upload-time = "2025-07-11T13:20:41.517Z" },
990
+ { url = "https://files.pythonhosted.org/packages/8e/d4/a74ef1e801ceb5855e9527dae105eaff136afcb9cc4d2056d44feb0e4792/ruff-0.12.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0262d50ba2767ed0fe212aa7e62112a1dcbfd46b858c5bf7bbd11f326998bafc", size = 12658890, upload-time = "2025-07-11T13:20:44.442Z" },
991
+ { url = "https://files.pythonhosted.org/packages/13/c8/1057916416de02e6d7c9bcd550868a49b72df94e3cca0aeb77457dcd9644/ruff-0.12.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12371aec33e1a3758597c5c631bae9a5286f3c963bdfb4d17acdd2d395406687", size = 12232008, upload-time = "2025-07-11T13:20:47.374Z" },
992
+ { url = "https://files.pythonhosted.org/packages/f5/59/4f7c130cc25220392051fadfe15f63ed70001487eca21d1796db46cbcc04/ruff-0.12.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:560f13b6baa49785665276c963edc363f8ad4b4fc910a883e2625bdb14a83a9e", size = 11499096, upload-time = "2025-07-11T13:20:50.348Z" },
993
+ { url = "https://files.pythonhosted.org/packages/d4/01/a0ad24a5d2ed6be03a312e30d32d4e3904bfdbc1cdbe63c47be9d0e82c79/ruff-0.12.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023040a3499f6f974ae9091bcdd0385dd9e9eb4942f231c23c57708147b06311", size = 11688307, upload-time = "2025-07-11T13:20:52.945Z" },
994
+ { url = "https://files.pythonhosted.org/packages/93/72/08f9e826085b1f57c9a0226e48acb27643ff19b61516a34c6cab9d6ff3fa/ruff-0.12.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:883d844967bffff5ab28bba1a4d246c1a1b2933f48cb9840f3fdc5111c603b07", size = 10661020, upload-time = "2025-07-11T13:20:55.799Z" },
995
+ { url = "https://files.pythonhosted.org/packages/80/a0/68da1250d12893466c78e54b4a0ff381370a33d848804bb51279367fc688/ruff-0.12.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2120d3aa855ff385e0e562fdee14d564c9675edbe41625c87eeab744a7830d12", size = 10246300, upload-time = "2025-07-11T13:20:58.222Z" },
996
+ { url = "https://files.pythonhosted.org/packages/6a/22/5f0093d556403e04b6fd0984fc0fb32fbb6f6ce116828fd54306a946f444/ruff-0.12.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b16647cbb470eaf4750d27dddc6ebf7758b918887b56d39e9c22cce2049082b", size = 11263119, upload-time = "2025-07-11T13:21:01.503Z" },
997
+ { url = "https://files.pythonhosted.org/packages/92/c9/f4c0b69bdaffb9968ba40dd5fa7df354ae0c73d01f988601d8fac0c639b1/ruff-0.12.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e1417051edb436230023575b149e8ff843a324557fe0a265863b7602df86722f", size = 11746990, upload-time = "2025-07-11T13:21:04.524Z" },
998
+ { url = "https://files.pythonhosted.org/packages/fe/84/7cc7bd73924ee6be4724be0db5414a4a2ed82d06b30827342315a1be9e9c/ruff-0.12.3-py3-none-win32.whl", hash = "sha256:dfd45e6e926deb6409d0616078a666ebce93e55e07f0fb0228d4b2608b2c248d", size = 10589263, upload-time = "2025-07-11T13:21:07.148Z" },
999
+ { url = "https://files.pythonhosted.org/packages/07/87/c070f5f027bd81f3efee7d14cb4d84067ecf67a3a8efb43aadfc72aa79a6/ruff-0.12.3-py3-none-win_amd64.whl", hash = "sha256:a946cf1e7ba3209bdef039eb97647f1c77f6f540e5845ec9c114d3af8df873e7", size = 11695072, upload-time = "2025-07-11T13:21:11.004Z" },
1000
+ { url = "https://files.pythonhosted.org/packages/e0/30/f3eaf6563c637b6e66238ed6535f6775480db973c836336e4122161986fc/ruff-0.12.3-py3-none-win_arm64.whl", hash = "sha256:5f9c7c9c8f84c2d7f27e93674d27136fbf489720251544c4da7fb3d742e011b1", size = 10805855, upload-time = "2025-07-11T13:21:13.547Z" },
1001
1001
  ]
1002
1002
 
1003
1003
  [[package]]