cachekit 0.9.0__tar.gz → 0.10.0__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 (92) hide show
  1. {cachekit-0.9.0 → cachekit-0.10.0}/Cargo.lock +16 -234
  2. {cachekit-0.9.0 → cachekit-0.10.0}/Cargo.toml +1 -1
  3. {cachekit-0.9.0 → cachekit-0.10.0}/PKG-INFO +1 -1
  4. {cachekit-0.9.0 → cachekit-0.10.0}/pyproject.toml +4 -1
  5. {cachekit-0.9.0 → cachekit-0.10.0}/rust/Cargo.toml +1 -1
  6. {cachekit-0.9.0 → cachekit-0.10.0}/rust/src/python_bindings.rs +2 -1
  7. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/__init__.py +1 -1
  8. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/base.py +37 -2
  9. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/backend.py +12 -4
  10. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/error_handler.py +14 -0
  11. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/backend.py +114 -0
  12. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/cache_handler.py +66 -2
  13. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/settings.py +3 -2
  14. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/l1_cache.py +16 -0
  15. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/metrics_collection.py +0 -1
  16. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/arrow_serializer.py +7 -4
  17. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/auto_serializer.py +3 -1
  18. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/base.py +1 -1
  19. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/encryption_wrapper.py +5 -2
  20. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/orjson_serializer.py +2 -1
  21. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/standard_serializer.py +2 -1
  22. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/wrapper.py +11 -4
  23. {cachekit-0.9.0 → cachekit-0.10.0}/LICENSE +0 -0
  24. {cachekit-0.9.0 → cachekit-0.10.0}/README.md +0 -0
  25. {cachekit-0.9.0 → cachekit-0.10.0}/rust/Makefile +0 -0
  26. {cachekit-0.9.0 → cachekit-0.10.0}/rust/README.md +0 -0
  27. {cachekit-0.9.0 → cachekit-0.10.0}/rust/TEST_EXPANSION_SUMMARY.md +0 -0
  28. {cachekit-0.9.0 → cachekit-0.10.0}/rust/src/lib.rs +0 -0
  29. {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/audits.toml +0 -0
  30. {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/config.toml +0 -0
  31. {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/imports.lock +0 -0
  32. {cachekit-0.9.0 → cachekit-0.10.0}/rust/tsan_suppressions.txt +0 -0
  33. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/__init__.py +0 -0
  34. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/base_config.py +0 -0
  35. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/__init__.py +0 -0
  36. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/client.py +0 -0
  37. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/config.py +0 -0
  38. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/session.py +0 -0
  39. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/errors.py +0 -0
  40. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/__init__.py +0 -0
  41. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/config.py +0 -0
  42. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/__init__.py +0 -0
  43. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/backend.py +0 -0
  44. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/config.py +0 -0
  45. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/error_handler.py +0 -0
  46. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/provider.py +0 -0
  47. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/__init__.py +0 -0
  48. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/backend.py +0 -0
  49. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/client.py +0 -0
  50. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/config.py +0 -0
  51. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/error_handler.py +0 -0
  52. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/provider.py +0 -0
  53. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/__init__.py +0 -0
  54. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/decorator.py +0 -0
  55. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/nested.py +0 -0
  56. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/singleton.py +0 -0
  57. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/validation.py +0 -0
  58. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/__init__.py +0 -0
  59. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/intent.py +0 -0
  60. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/local_wrapper.py +0 -0
  61. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/main.py +0 -0
  62. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/orchestrator.py +0 -0
  63. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/session.py +0 -0
  64. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/stats_context.py +0 -0
  65. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/tenant_context.py +0 -0
  66. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/utils/__init__.py +0 -0
  67. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/wrapper.py +0 -0
  68. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/di.py +0 -0
  69. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/hash_utils.py +0 -0
  70. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/health.py +0 -0
  71. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/hiredis_compat.py +0 -0
  72. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/imports.py +0 -0
  73. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/__init__.py +0 -0
  74. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/channel.py +0 -0
  75. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/event.py +0 -0
  76. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/redis_channel.py +0 -0
  77. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/key_generator.py +0 -0
  78. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/logging.py +0 -0
  79. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/__init__.py +0 -0
  80. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/correlation_tracking.py +0 -0
  81. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/pool_monitor.py +0 -0
  82. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/protocols.py +0 -0
  83. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/object_cache.py +0 -0
  84. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/py.typed +0 -0
  85. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/__init__.py +0 -0
  86. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/adaptive_timeout.py +0 -0
  87. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/async_metrics.py +0 -0
  88. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/circuit_breaker.py +0 -0
  89. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/error_classification.py +0 -0
  90. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/load_control.py +0 -0
  91. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/profiles.py +0 -0
  92. {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/__init__.py +0 -0
@@ -245,9 +245,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
245
245
 
246
246
  [[package]]
247
247
  name = "cachekit-core"
248
- version = "0.2.0"
248
+ version = "0.2.1"
249
249
  source = "registry+https://github.com/rust-lang/crates.io-index"
250
- checksum = "9622b3c3e47fcf7abfde287c557e6171674e37842a2dd26fda03f63720542f17"
250
+ checksum = "01870e86fa79ca9ee521b5b9c2bcff8428eab95fb343f75d35a6fce159bb1577"
251
251
  dependencies = [
252
252
  "aes",
253
253
  "aes-gcm",
@@ -271,7 +271,7 @@ dependencies = [
271
271
 
272
272
  [[package]]
273
273
  name = "cachekit-rs"
274
- version = "0.9.0"
274
+ version = "0.10.0"
275
275
  dependencies = [
276
276
  "cachekit-core",
277
277
  "criterion",
@@ -676,12 +676,6 @@ version = "1.0.7"
676
676
  source = "registry+https://github.com/rust-lang/crates.io-index"
677
677
  checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
678
678
 
679
- [[package]]
680
- name = "foldhash"
681
- version = "0.1.5"
682
- source = "registry+https://github.com/rust-lang/crates.io-index"
683
- checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
684
-
685
679
  [[package]]
686
680
  name = "generic-array"
687
681
  version = "0.14.7"
@@ -713,23 +707,10 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
713
707
  dependencies = [
714
708
  "cfg-if",
715
709
  "libc",
716
- "r-efi 5.3.0",
710
+ "r-efi",
717
711
  "wasip2",
718
712
  ]
719
713
 
720
- [[package]]
721
- name = "getrandom"
722
- version = "0.4.2"
723
- source = "registry+https://github.com/rust-lang/crates.io-index"
724
- checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
725
- dependencies = [
726
- "cfg-if",
727
- "libc",
728
- "r-efi 6.0.0",
729
- "wasip2",
730
- "wasip3",
731
- ]
732
-
733
714
  [[package]]
734
715
  name = "ghash"
735
716
  version = "0.5.1"
@@ -757,15 +738,6 @@ dependencies = [
757
738
  "zerocopy",
758
739
  ]
759
740
 
760
- [[package]]
761
- name = "hashbrown"
762
- version = "0.15.5"
763
- source = "registry+https://github.com/rust-lang/crates.io-index"
764
- checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
765
- dependencies = [
766
- "foldhash",
767
- ]
768
-
769
741
  [[package]]
770
742
  name = "hashbrown"
771
743
  version = "0.16.1"
@@ -847,12 +819,6 @@ dependencies = [
847
819
  "serde",
848
820
  ]
849
821
 
850
- [[package]]
851
- name = "id-arena"
852
- version = "2.3.0"
853
- source = "registry+https://github.com/rust-lang/crates.io-index"
854
- checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
855
-
856
822
  [[package]]
857
823
  name = "indexmap"
858
824
  version = "2.13.0"
@@ -860,18 +826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
860
826
  checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
861
827
  dependencies = [
862
828
  "equivalent",
863
- "hashbrown 0.16.1",
864
- "serde",
865
- "serde_core",
866
- ]
867
-
868
- [[package]]
869
- name = "indoc"
870
- version = "2.0.7"
871
- source = "registry+https://github.com/rust-lang/crates.io-index"
872
- checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
873
- dependencies = [
874
- "rustversion",
829
+ "hashbrown",
875
830
  ]
876
831
 
877
832
  [[package]]
@@ -949,12 +904,6 @@ version = "1.5.0"
949
904
  source = "registry+https://github.com/rust-lang/crates.io-index"
950
905
  checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
951
906
 
952
- [[package]]
953
- name = "leb128fmt"
954
- version = "0.1.0"
955
- source = "registry+https://github.com/rust-lang/crates.io-index"
956
- checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
957
-
958
907
  [[package]]
959
908
  name = "libc"
960
909
  version = "0.2.183"
@@ -1012,15 +961,6 @@ dependencies = [
1012
961
  "libc",
1013
962
  ]
1014
963
 
1015
- [[package]]
1016
- name = "memoffset"
1017
- version = "0.9.1"
1018
- source = "registry+https://github.com/rust-lang/crates.io-index"
1019
- checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
1020
- dependencies = [
1021
- "autocfg",
1022
- ]
1023
-
1024
964
  [[package]]
1025
965
  name = "miniz_oxide"
1026
966
  version = "0.8.9"
@@ -1173,16 +1113,6 @@ dependencies = [
1173
1113
  "zerocopy",
1174
1114
  ]
1175
1115
 
1176
- [[package]]
1177
- name = "prettyplease"
1178
- version = "0.2.37"
1179
- source = "registry+https://github.com/rust-lang/crates.io-index"
1180
- checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
1181
- dependencies = [
1182
- "proc-macro2",
1183
- "syn",
1184
- ]
1185
-
1186
1116
  [[package]]
1187
1117
  name = "proc-macro-error-attr2"
1188
1118
  version = "2.0.0"
@@ -1286,36 +1216,32 @@ dependencies = [
1286
1216
 
1287
1217
  [[package]]
1288
1218
  name = "pyo3"
1289
- version = "0.25.1"
1219
+ version = "0.29.0"
1290
1220
  source = "registry+https://github.com/rust-lang/crates.io-index"
1291
- checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
1221
+ checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
1292
1222
  dependencies = [
1293
- "indoc",
1294
1223
  "libc",
1295
- "memoffset",
1296
1224
  "once_cell",
1297
1225
  "portable-atomic",
1298
1226
  "pyo3-build-config",
1299
1227
  "pyo3-ffi",
1300
1228
  "pyo3-macros",
1301
- "unindent",
1302
1229
  ]
1303
1230
 
1304
1231
  [[package]]
1305
1232
  name = "pyo3-build-config"
1306
- version = "0.25.1"
1233
+ version = "0.29.0"
1307
1234
  source = "registry+https://github.com/rust-lang/crates.io-index"
1308
- checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
1235
+ checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
1309
1236
  dependencies = [
1310
- "once_cell",
1311
1237
  "target-lexicon",
1312
1238
  ]
1313
1239
 
1314
1240
  [[package]]
1315
1241
  name = "pyo3-ffi"
1316
- version = "0.25.1"
1242
+ version = "0.29.0"
1317
1243
  source = "registry+https://github.com/rust-lang/crates.io-index"
1318
- checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
1244
+ checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
1319
1245
  dependencies = [
1320
1246
  "libc",
1321
1247
  "pyo3-build-config",
@@ -1323,9 +1249,9 @@ dependencies = [
1323
1249
 
1324
1250
  [[package]]
1325
1251
  name = "pyo3-macros"
1326
- version = "0.25.1"
1252
+ version = "0.29.0"
1327
1253
  source = "registry+https://github.com/rust-lang/crates.io-index"
1328
- checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
1254
+ checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
1329
1255
  dependencies = [
1330
1256
  "proc-macro2",
1331
1257
  "pyo3-macros-backend",
@@ -1335,13 +1261,12 @@ dependencies = [
1335
1261
 
1336
1262
  [[package]]
1337
1263
  name = "pyo3-macros-backend"
1338
- version = "0.25.1"
1264
+ version = "0.29.0"
1339
1265
  source = "registry+https://github.com/rust-lang/crates.io-index"
1340
- checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
1266
+ checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
1341
1267
  dependencies = [
1342
1268
  "heck",
1343
1269
  "proc-macro2",
1344
- "pyo3-build-config",
1345
1270
  "quote",
1346
1271
  "syn",
1347
1272
  ]
@@ -1376,12 +1301,6 @@ version = "5.3.0"
1376
1301
  source = "registry+https://github.com/rust-lang/crates.io-index"
1377
1302
  checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1378
1303
 
1379
- [[package]]
1380
- name = "r-efi"
1381
- version = "6.0.0"
1382
- source = "registry+https://github.com/rust-lang/crates.io-index"
1383
- checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1384
-
1385
1304
  [[package]]
1386
1305
  name = "rand"
1387
1306
  version = "0.9.2"
@@ -1771,7 +1690,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1771
1690
  checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
1772
1691
  dependencies = [
1773
1692
  "fastrand",
1774
- "getrandom 0.4.2",
1693
+ "getrandom 0.3.4",
1775
1694
  "once_cell",
1776
1695
  "rustix 1.1.4",
1777
1696
  "windows-sys 0.61.2",
@@ -1900,18 +1819,6 @@ version = "1.0.24"
1900
1819
  source = "registry+https://github.com/rust-lang/crates.io-index"
1901
1820
  checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
1902
1821
 
1903
- [[package]]
1904
- name = "unicode-xid"
1905
- version = "0.2.6"
1906
- source = "registry+https://github.com/rust-lang/crates.io-index"
1907
- checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
1908
-
1909
- [[package]]
1910
- name = "unindent"
1911
- version = "0.2.4"
1912
- source = "registry+https://github.com/rust-lang/crates.io-index"
1913
- checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
1914
-
1915
1822
  [[package]]
1916
1823
  name = "universal-hash"
1917
1824
  version = "0.5.1"
@@ -1984,15 +1891,6 @@ dependencies = [
1984
1891
  "wit-bindgen",
1985
1892
  ]
1986
1893
 
1987
- [[package]]
1988
- name = "wasip3"
1989
- version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
1990
- source = "registry+https://github.com/rust-lang/crates.io-index"
1991
- checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
1992
- dependencies = [
1993
- "wit-bindgen",
1994
- ]
1995
-
1996
1894
  [[package]]
1997
1895
  name = "wasm-bindgen"
1998
1896
  version = "0.2.114"
@@ -2038,40 +1936,6 @@ dependencies = [
2038
1936
  "unicode-ident",
2039
1937
  ]
2040
1938
 
2041
- [[package]]
2042
- name = "wasm-encoder"
2043
- version = "0.244.0"
2044
- source = "registry+https://github.com/rust-lang/crates.io-index"
2045
- checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
2046
- dependencies = [
2047
- "leb128fmt",
2048
- "wasmparser",
2049
- ]
2050
-
2051
- [[package]]
2052
- name = "wasm-metadata"
2053
- version = "0.244.0"
2054
- source = "registry+https://github.com/rust-lang/crates.io-index"
2055
- checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
2056
- dependencies = [
2057
- "anyhow",
2058
- "indexmap",
2059
- "wasm-encoder",
2060
- "wasmparser",
2061
- ]
2062
-
2063
- [[package]]
2064
- name = "wasmparser"
2065
- version = "0.244.0"
2066
- source = "registry+https://github.com/rust-lang/crates.io-index"
2067
- checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
2068
- dependencies = [
2069
- "bitflags 2.11.0",
2070
- "hashbrown 0.15.5",
2071
- "indexmap",
2072
- "semver",
2073
- ]
2074
-
2075
1939
  [[package]]
2076
1940
  name = "web-sys"
2077
1941
  version = "0.3.91"
@@ -2307,88 +2171,6 @@ name = "wit-bindgen"
2307
2171
  version = "0.51.0"
2308
2172
  source = "registry+https://github.com/rust-lang/crates.io-index"
2309
2173
  checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
2310
- dependencies = [
2311
- "wit-bindgen-rust-macro",
2312
- ]
2313
-
2314
- [[package]]
2315
- name = "wit-bindgen-core"
2316
- version = "0.51.0"
2317
- source = "registry+https://github.com/rust-lang/crates.io-index"
2318
- checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
2319
- dependencies = [
2320
- "anyhow",
2321
- "heck",
2322
- "wit-parser",
2323
- ]
2324
-
2325
- [[package]]
2326
- name = "wit-bindgen-rust"
2327
- version = "0.51.0"
2328
- source = "registry+https://github.com/rust-lang/crates.io-index"
2329
- checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
2330
- dependencies = [
2331
- "anyhow",
2332
- "heck",
2333
- "indexmap",
2334
- "prettyplease",
2335
- "syn",
2336
- "wasm-metadata",
2337
- "wit-bindgen-core",
2338
- "wit-component",
2339
- ]
2340
-
2341
- [[package]]
2342
- name = "wit-bindgen-rust-macro"
2343
- version = "0.51.0"
2344
- source = "registry+https://github.com/rust-lang/crates.io-index"
2345
- checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
2346
- dependencies = [
2347
- "anyhow",
2348
- "prettyplease",
2349
- "proc-macro2",
2350
- "quote",
2351
- "syn",
2352
- "wit-bindgen-core",
2353
- "wit-bindgen-rust",
2354
- ]
2355
-
2356
- [[package]]
2357
- name = "wit-component"
2358
- version = "0.244.0"
2359
- source = "registry+https://github.com/rust-lang/crates.io-index"
2360
- checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
2361
- dependencies = [
2362
- "anyhow",
2363
- "bitflags 2.11.0",
2364
- "indexmap",
2365
- "log",
2366
- "serde",
2367
- "serde_derive",
2368
- "serde_json",
2369
- "wasm-encoder",
2370
- "wasm-metadata",
2371
- "wasmparser",
2372
- "wit-parser",
2373
- ]
2374
-
2375
- [[package]]
2376
- name = "wit-parser"
2377
- version = "0.244.0"
2378
- source = "registry+https://github.com/rust-lang/crates.io-index"
2379
- checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
2380
- dependencies = [
2381
- "anyhow",
2382
- "id-arena",
2383
- "indexmap",
2384
- "log",
2385
- "semver",
2386
- "serde",
2387
- "serde_derive",
2388
- "serde_json",
2389
- "unicode-xid",
2390
- "wasmparser",
2391
- ]
2392
2174
 
2393
2175
  [[package]]
2394
2176
  name = "xxhash-rust"
@@ -4,7 +4,7 @@ members = ["rust"]
4
4
  exclude = ["rust/fuzz"]
5
5
 
6
6
  [workspace.dependencies]
7
- pyo3 = { version = "0.25", features = ["extension-module"] }
7
+ pyo3 = { version = "0.29", features = ["extension-module"] }
8
8
  serde = { version = "1.0", features = ["derive"] }
9
9
  serde_json = "1.0"
10
10
  bincode = "1.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cachekit
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "cachekit"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "Production-ready Redis caching for Python with intelligent reliability features and Rust-powered performance"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -208,6 +208,9 @@ dev = [
208
208
  "pytest-markdown-docs>=0.6.0",
209
209
  "pytest-redis>=3.0.0",
210
210
  "pymemcache>=4.0.0",
211
+ # Competitive comparison suite (tests/competitive/ benchmarks cachekit vs these)
212
+ "cachetools>=5.3.0",
213
+ "aiocache>=0.12.0",
211
214
  # Code quality
212
215
  "basedpyright>=1.32.1",
213
216
  "ruff>=0.6.0",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "cachekit-rs"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  edition = "2021"
5
5
  authors = ["cachekit Contributors"]
6
6
  description = "High-performance storage engine for caching with compression and encryption"
@@ -187,7 +187,8 @@ impl PyZeroKnowledgeEncryptor {
187
187
  encryption_time_micros: metrics.encryption_time_micros,
188
188
  hardware_accelerated: metrics.hardware_accelerated,
189
189
  };
190
- Python::with_gil(|py| Py::new(py, py_metrics))
190
+ // pyo3 0.29 renamed Python::with_gil -> Python::attach (GIL/free-threaded terminology).
191
+ Python::attach(|py| Py::new(py, py_metrics))
191
192
  }
192
193
  }
193
194
 
@@ -68,7 +68,7 @@ Example Usage:
68
68
  ```
69
69
  """
70
70
 
71
- __version__ = "0.9.0"
71
+ __version__ = "0.10.0"
72
72
 
73
73
  from collections.abc import Callable
74
74
  from typing import Any, TypeVar
@@ -32,9 +32,9 @@ class BaseBackend(Protocol):
32
32
 
33
33
  Example:
34
34
  >>> from cachekit.backends import BaseBackend, RedisBackend
35
- >>> backend = RedisBackend()
36
- >>> isinstance(backend, BaseBackend) # Runtime checkable protocol
35
+ >>> issubclass(RedisBackend, BaseBackend) # structural (runtime-checkable) protocol
37
36
  True
37
+ >>> backend = RedisBackend() # doctest: +SKIP
38
38
  >>> backend.set("key", b"value", ttl=60) # doctest: +SKIP
39
39
  >>> data = backend.get("key") # doctest: +SKIP
40
40
  """
@@ -175,6 +175,41 @@ class TTLInspectableBackend(Protocol):
175
175
  ...
176
176
 
177
177
 
178
+ @runtime_checkable
179
+ class BufferHandle(Protocol):
180
+ """A borrowed, zero-copy view of a cached value plus the resource backing it.
181
+
182
+ Returned by ``BufferReadableBackend.get_buffer``. ``view`` aliases backend-owned memory (e.g.
183
+ mmap'd file pages), not a heap copy — so the consumer must finish reading and ``close()``
184
+ before the view is touched again. The view DANGLES after close (touching it can segfault), so
185
+ it must never be stored (e.g. in L1) nor returned past the read call frame (#171).
186
+ """
187
+
188
+ view: memoryview
189
+ """Zero-copy view of the payload (valid only until close())."""
190
+
191
+ def close(self) -> None:
192
+ """Release the view and its backing resource. Idempotent."""
193
+ ...
194
+
195
+
196
+ @runtime_checkable
197
+ class BufferReadableBackend(Protocol):
198
+ """Optional protocol for backends that can return a zero-copy buffer instead of materializing
199
+ the whole value on the heap.
200
+
201
+ Lets large plaintext values (e.g. uncompressed Arrow IPC) be read without copying the payload.
202
+ Only the File backend implements this today (mmap, POSIX). Backends that don't implement it
203
+ are simply read via ``get`` as usual.
204
+ """
205
+
206
+ def get_buffer(self, key: str) -> Optional[BufferHandle]:
207
+ """Return a borrowed zero-copy handle for ``key``, or None when the value is not mappable
208
+ (missing/expired/too large/non-POSIX) — the caller then falls back to ``get``. The caller
209
+ MUST ``close()`` the handle when done reading."""
210
+ ...
211
+
212
+
178
213
  @runtime_checkable
179
214
  class LockableBackend(Protocol):
180
215
  """Optional protocol for backends supporting distributed locking.
@@ -27,6 +27,13 @@ if TYPE_CHECKING:
27
27
  # Module-level logger
28
28
  _logger = get_structured_logger(__name__)
29
29
 
30
+ # Lock capability token travels in this request header, never the query string:
31
+ # a ?lock_id= query leaks the token into access/proxy logs and OpenTelemetry
32
+ # http.url spans (CWE-532), letting anyone with log access replay it. The SaaS
33
+ # handler dual-reads this header + the legacy ?lock_id= query during rollout,
34
+ # preferring the header. See protocol spec/saas-api.md (DELETE .../lock).
35
+ LOCK_ID_HEADER = "X-CacheKit-Lock-Id"
36
+
30
37
 
31
38
  def _inject_metrics_headers(stats: _FunctionStats | None) -> dict[str, str]:
32
39
  """Extract cache metrics and format as HTTP headers.
@@ -649,12 +656,13 @@ class CachekitIOBackend:
649
656
  inside ``__aexit__`` cannot mask the user's exception. The server-side ``timeout``
650
657
  on the lock is the safety net if the DELETE never lands.
651
658
  """
652
- # URL-encode both segments: lock_key is caller-controlled, lock_id is server-issued
653
- # but the SaaS contract doesn't pin a charset.
659
+ # lock_key is caller-controlled → percent-encode it into the path. lock_id is a
660
+ # capability token and travels in the X-CacheKit-Lock-Id header, NOT the query
661
+ # string (CWE-532): a ?lock_id= query leaks it into access/proxy logs and OTel
662
+ # http.url spans. It is server-issued, so it needs no URL-encoding.
654
663
  encoded_key = quote(lock_key, safe="")
655
- encoded_id = quote(lock_id, safe="")
656
664
  try:
657
- await self._request_async("DELETE", f"{encoded_key}/lock?lock_id={encoded_id}")
665
+ await self._request_async("DELETE", f"{encoded_key}/lock", headers={LOCK_ID_HEADER: lock_id})
658
666
  return True
659
667
  except BackendError:
660
668
  return False
@@ -35,6 +35,7 @@ def classify_http_error(
35
35
  Classification rules:
36
36
  - HTTP 401/403: AUTHENTICATION (alert ops, don't retry)
37
37
  - HTTP 429: TRANSIENT (rate limit, exponential backoff)
38
+ - HTTP 413: PERMANENT (value too large — retrying never helps)
38
39
  - HTTP 5xx: TRANSIENT (server error, retry)
39
40
  - HTTP 4xx: PERMANENT (client error, don't retry)
40
41
  - TimeoutException: TIMEOUT (configurable retry)
@@ -75,6 +76,19 @@ def classify_http_error(
75
76
  key=key,
76
77
  )
77
78
 
79
+ # PERMANENT: value too large. A 413 would already classify PERMANENT via the generic
80
+ # 4xx branch below — this dedicated branch exists only to give an ACTIONABLE message
81
+ # ("value too large") instead of "Client error: HTTP 413". Retrying never helps (the
82
+ # value must shrink), so the decorator degrades: runs uncached, once.
83
+ if status == 413:
84
+ return BackendError(
85
+ "Value too large for cachekit.io backend (HTTP 413): value exceeds the server's maximum cache value size",
86
+ error_type=BackendErrorType.PERMANENT,
87
+ original_exception=exc,
88
+ operation=operation,
89
+ key=key,
90
+ )
91
+
78
92
  # PERMANENT: Client errors (don't retry)
79
93
  if 400 <= status < 500:
80
94
  return BackendError(