cachekit 0.8.0__tar.gz → 0.9.1__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 (94) hide show
  1. {cachekit-0.8.0 → cachekit-0.9.1}/Cargo.lock +16 -234
  2. {cachekit-0.8.0 → cachekit-0.9.1}/Cargo.toml +1 -1
  3. {cachekit-0.8.0 → cachekit-0.9.1}/PKG-INFO +69 -23
  4. {cachekit-0.8.0 → cachekit-0.9.1}/README.md +67 -20
  5. {cachekit-0.8.0 → cachekit-0.9.1}/pyproject.toml +11 -5
  6. {cachekit-0.8.0 → cachekit-0.9.1}/rust/Cargo.toml +1 -1
  7. {cachekit-0.8.0 → cachekit-0.9.1}/rust/README.md +67 -20
  8. {cachekit-0.8.0 → cachekit-0.9.1}/rust/src/python_bindings.rs +2 -1
  9. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/__init__.py +3 -2
  10. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/base.py +2 -2
  11. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/backend.py +12 -4
  12. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/error_handler.py +14 -0
  13. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/memcached/backend.py +22 -1
  14. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/memcached/config.py +10 -0
  15. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/backend.py +5 -9
  16. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/client.py +2 -2
  17. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/cache_handler.py +85 -35
  18. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/decorator.py +8 -3
  19. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/nested.py +46 -9
  20. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/settings.py +10 -1
  21. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/validation.py +3 -2
  22. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/intent.py +24 -1
  23. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/local_wrapper.py +2 -1
  24. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/tenant_context.py +2 -1
  25. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/wrapper.py +10 -4
  26. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/invalidation/channel.py +2 -1
  27. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/key_generator.py +2 -1
  28. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/l1_cache.py +22 -3
  29. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/object_cache.py +3 -2
  30. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/circuit_breaker.py +2 -1
  31. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/metrics_collection.py +0 -1
  32. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/__init__.py +2 -0
  33. cachekit-0.9.1/src/cachekit/serializers/arrow_serializer.py +319 -0
  34. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/auto_serializer.py +37 -9
  35. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/base.py +39 -1
  36. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/orjson_serializer.py +4 -1
  37. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/standard_serializer.py +4 -1
  38. cachekit-0.9.1/src/cachekit/serializers/wrapper.py +139 -0
  39. cachekit-0.8.0/src/cachekit/serializers/arrow_serializer.py +0 -247
  40. cachekit-0.8.0/src/cachekit/serializers/wrapper.py +0 -89
  41. {cachekit-0.8.0 → cachekit-0.9.1}/LICENSE +0 -0
  42. {cachekit-0.8.0 → cachekit-0.9.1}/rust/Makefile +0 -0
  43. {cachekit-0.8.0 → cachekit-0.9.1}/rust/TEST_EXPANSION_SUMMARY.md +0 -0
  44. {cachekit-0.8.0 → cachekit-0.9.1}/rust/src/lib.rs +0 -0
  45. {cachekit-0.8.0 → cachekit-0.9.1}/rust/supply-chain/audits.toml +0 -0
  46. {cachekit-0.8.0 → cachekit-0.9.1}/rust/supply-chain/config.toml +0 -0
  47. {cachekit-0.8.0 → cachekit-0.9.1}/rust/supply-chain/imports.lock +0 -0
  48. {cachekit-0.8.0 → cachekit-0.9.1}/rust/tsan_suppressions.txt +0 -0
  49. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/__init__.py +0 -0
  50. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/base_config.py +0 -0
  51. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/__init__.py +0 -0
  52. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/client.py +0 -0
  53. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/config.py +0 -0
  54. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/cachekitio/session.py +0 -0
  55. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/errors.py +0 -0
  56. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/file/__init__.py +0 -0
  57. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/file/backend.py +0 -0
  58. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/file/config.py +0 -0
  59. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/memcached/__init__.py +0 -0
  60. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/memcached/error_handler.py +0 -0
  61. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/provider.py +0 -0
  62. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/__init__.py +0 -0
  63. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/config.py +0 -0
  64. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/error_handler.py +0 -0
  65. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/backends/redis/provider.py +0 -0
  66. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/__init__.py +0 -0
  67. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/config/singleton.py +0 -0
  68. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/__init__.py +0 -0
  69. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/main.py +0 -0
  70. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/orchestrator.py +0 -0
  71. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/session.py +0 -0
  72. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/stats_context.py +0 -0
  73. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/decorators/utils/__init__.py +0 -0
  74. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/di.py +0 -0
  75. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/hash_utils.py +0 -0
  76. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/health.py +0 -0
  77. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/hiredis_compat.py +0 -0
  78. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/imports.py +0 -0
  79. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/invalidation/__init__.py +0 -0
  80. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/invalidation/event.py +0 -0
  81. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/invalidation/redis_channel.py +0 -0
  82. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/logging.py +0 -0
  83. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/monitoring/__init__.py +0 -0
  84. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/monitoring/correlation_tracking.py +0 -0
  85. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/monitoring/pool_monitor.py +0 -0
  86. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/monitoring/protocols.py +0 -0
  87. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/py.typed +0 -0
  88. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/__init__.py +0 -0
  89. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/adaptive_timeout.py +0 -0
  90. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/async_metrics.py +0 -0
  91. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/error_classification.py +0 -0
  92. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/load_control.py +0 -0
  93. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/reliability/profiles.py +0 -0
  94. {cachekit-0.8.0 → cachekit-0.9.1}/src/cachekit/serializers/encryption_wrapper.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.8.0"
274
+ version = "0.9.1"
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,12 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cachekit
3
- Version: 0.8.0
3
+ Version: 0.9.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
7
7
  Classifier: Operating System :: OS Independent
8
8
  Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
9
  Classifier: Programming Language :: Python :: 3.10
11
10
  Classifier: Programming Language :: Python :: 3.11
12
11
  Classifier: Programming Language :: Python :: 3.12
@@ -44,7 +43,7 @@ Home-Page: https://github.com/cachekit-io/cachekit-py
44
43
  Author-email: cachekit Contributors <noreply@cachekit.io>
45
44
  Maintainer-email: cachekit Contributors <noreply@cachekit.io>
46
45
  License: MIT
47
- Requires-Python: >=3.9
46
+ Requires-Python: >=3.10
48
47
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
49
48
  Project-URL: Changelog, https://github.com/cachekit-io/cachekit-py/blob/main/CHANGELOG.md
50
49
  Project-URL: Documentation, https://github.com/cachekit-io/cachekit-py#readme
@@ -119,7 +118,17 @@ Or with [uv][uv-url] (recommended):
119
118
  uv add cachekit
120
119
  ```
121
120
 
122
- ### Setup (Redis recommended default)
121
+ ### Setup (choose a backend)
122
+
123
+ cachekit exposes one decorator API over a pluggable backend abstraction. Pick the
124
+ backend that fits your infrastructure — they're peers behind the same `@cache` API:
125
+
126
+ | Backend | Best for | Select with |
127
+ |---------|----------|-------------|
128
+ | Redis | Self-hosted, full control | `REDIS_URL` / `CACHEKIT_REDIS_URL` |
129
+ | CachekitIO | Managed, zero-ops (alpha) | `CACHEKIT_API_KEY` |
130
+ | Memcached | High-throughput, existing infra | `CACHEKIT_MEMCACHED_SERVERS` |
131
+ | File / L1-only | Local dev, tests, no external deps | `CACHEKIT_FILE_CACHE_DIR` / `backend=None` |
123
132
 
124
133
  ```bash
125
134
  # Run Redis locally or use your existing infrastructure
@@ -129,7 +138,7 @@ export REDIS_URL="redis://localhost:6379"
129
138
  ```python
130
139
  from cachekit import cache
131
140
 
132
- @cache # Uses Redis backend by default
141
+ @cache # Auto-detects backend (defaults to Redis at localhost)
133
142
  def expensive_api_call(user_id: int):
134
143
  return fetch_user_data(user_id)
135
144
  ```
@@ -207,26 +216,37 @@ def get_user_profile(user_id: int):
207
216
  return db.fetch_user(user_id)
208
217
  ```
209
218
 
210
- | Feature | `@cache.minimal` | `@cache.production` | `@cache.secure` | `@cache.io()` | `@cache.local()` |
211
- |:--------|:----------------:|:-------------------:|:---------------:|:-------------:|:----------------:|
212
- | Circuit Breaker | - | ✅ | | ✅ | - |
213
- | Adaptive Timeouts | - | ✅ | | ✅ | - |
214
- | Monitoring | - | ✅ Full | Full | ✅ Full | ✅ Basic |
215
- | Integrity Checking | - | ✅ Enabled | ✅ Enforced | ✅ Enabled | - |
216
- | Encryption | - | - | Required | - | - |
217
- | Backend | Redis | Redis | Redis | CachekitIO SaaS | In-process |
218
- | **Use Case** | High throughput | Production reliability | Compliance/security | Managed cloud | Opaque objects |
219
+ | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
220
+ |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
221
+ | Circuit Breaker | - | ✅ | - | ✅ | |
222
+ | Adaptive Timeouts | - | ✅ | - | ✅ | |
223
+ | Backpressure | | ✅ | - | ✅ | ✅ |
224
+ | Integrity Checking | - | ✅ | - | ✅ | ✅ 🔒 |
225
+ | Encryption | - | - | - | - | Required |
226
+ | L1 SWR | - | | - | | |
227
+ | L1 Invalidation | - | - | - | | |
228
+ | L1 Namespace Index | - | - | - | ✅ | ✅ |
229
+ | Prometheus Metrics | - | - | - | ✅ | ✅ |
230
+ | Tracing | - | ✅ | - | ✅ | ✅ |
231
+ | Structured Logging | - | ✅ | - | ✅ | ✅ |
232
+ | **Use Case** | High throughput | Local debugging | Deterministic tests | Production reliability | Compliance/security |
233
+
234
+ > 🔒 `@cache.secure` forces `integrity_checking=True` — it cannot be overridden.
235
+ >
236
+ > **`@cache.io()`** mirrors `@cache.production` (full reliability + observability) but routes to the managed CachekitIO SaaS backend instead of Redis. **`@cache.local()`** is a separate in-process path backed by `ObjectCache` (raw object references, entry-count LRU, no serialization) — the reliability and encryption features listed above do not apply to it.
219
237
 
220
238
  <details>
221
- <summary><strong>Additional Presets</strong></summary>
239
+ <summary><strong>Additional Presets: <code>@cache.dev</code> and <code>@cache.test</code></strong></summary>
240
+
241
+ See the comparison table above for the exact feature set of each preset.
222
242
 
223
243
  ```python
224
- # Development: debugging with verbose output
244
+ # Development: verbose logging, integrity checks on, Prometheus off
225
245
  @cache.dev
226
246
  def debug_expensive_call():
227
247
  return complex_computation()
228
248
 
229
- # Testing: deterministic, no randomness
249
+ # Testing: deterministic, all protections off (no circuit breaker, no backpressure)
230
250
  @cache.test
231
251
  def test_cached_function():
232
252
  return fixed_test_value()
@@ -356,12 +376,36 @@ See [SECURITY.md][security-url] for vulnerability reporting and detailed documen
356
376
 
357
377
  </details>
358
378
 
359
- ### Built-in Monitoring
379
+ ### Monitoring & Observability
360
380
 
361
- - **Prometheus metrics** - Production-ready observability
381
+ - **Per-function statistics** - `cache_info()` on every decorated function, modelled on `functools.lru_cache`
382
+ - **Prometheus metrics** - Recorded by default (your app owns exposition)
362
383
  - **Structured logging** - Context-aware with correlation IDs
363
384
  - **Health checks** - Comprehensive status endpoints
364
- - **Performance tracking** - Built-in latency monitoring
385
+
386
+ Every decorated function exposes `cache_info()`, returning a `CacheInfo` named tuple with
387
+ hit/miss counts, the L1/L2 split, and average backend latency:
388
+
389
+ ```python
390
+ @cache()
391
+ def get_score(x):
392
+ return x ** 2
393
+
394
+ get_score(2)
395
+ get_score(2) # served from cache
396
+
397
+ info = get_score.cache_info()
398
+ # CacheInfo has 9 fields: hits, misses, l1_hits, l2_hits, maxsize,
399
+ # currsize, l2_avg_latency_ms, last_operation_at, session_id
400
+ assert info.l1_hits + info.l2_hits == info.hits # every hit is L1 or L2
401
+ ```
402
+
403
+ `maxsize` and `currsize` are always `None` (the cache lives in an external store, not a
404
+ bounded in-process dict); they exist only for `lru_cache` API parity. See the
405
+ [API Reference](docs/api-reference.md#per-function-statistics-via-cache_info) for the full
406
+ field reference and a sample stats endpoint, and the
407
+ [Prometheus Metrics guide](docs/features/prometheus-metrics.md) for metric names and
408
+ exposition setup.
365
409
 
366
410
  <details>
367
411
  <summary><strong>Thread Safety Details</strong></summary>
@@ -381,8 +425,10 @@ def expensive_func(x):
381
425
  with ThreadPoolExecutor(max_workers=10) as executor:
382
426
  results = list(executor.map(expensive_func, range(100)))
383
427
 
384
- print(expensive_func.cache_info())
385
- # CacheInfo(hits=90, misses=10, maxsize=None, currsize=10)
428
+ info = expensive_func.cache_info()
429
+ # CacheInfo(hits=..., misses=..., l1_hits=..., l2_hits=...,
430
+ # maxsize=None, currsize=None, l2_avg_latency_ms=...,
431
+ # last_operation_at=..., session_id=...)
386
432
  ```
387
433
 
388
434
  </details>
@@ -459,7 +505,7 @@ See [CONTRIBUTING.md][contributing-url] for full development guidelines.
459
505
 
460
506
  | Component | Version |
461
507
  |:----------|:--------|
462
- | Python | 3.9+ |
508
+ | Python | 3.10+ |
463
509
 
464
510
  ---
465
511