cachekit 0.20.0__tar.gz → 0.21.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 (86) hide show
  1. {cachekit-0.20.0 → cachekit-0.21.0}/Cargo.lock +106 -52
  2. {cachekit-0.20.0 → cachekit-0.21.0}/Cargo.toml +2 -21
  3. {cachekit-0.20.0 → cachekit-0.21.0}/PKG-INFO +19 -10
  4. {cachekit-0.20.0 → cachekit-0.21.0}/README.md +16 -7
  5. {cachekit-0.20.0 → cachekit-0.21.0}/pyproject.toml +16 -5
  6. {cachekit-0.20.0 → cachekit-0.21.0}/rust/Cargo.toml +4 -4
  7. {cachekit-0.20.0 → cachekit-0.21.0}/rust/Makefile +4 -7
  8. {cachekit-0.20.0 → cachekit-0.21.0}/rust/README.md +16 -7
  9. {cachekit-0.20.0 → cachekit-0.21.0}/rust/src/lib.rs +4 -5
  10. {cachekit-0.20.0 → cachekit-0.21.0}/rust/src/python_bindings.rs +0 -44
  11. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/__init__.py +5 -6
  12. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/base.py +3 -1
  13. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/base_config.py +2 -1
  14. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/backend.py +62 -84
  15. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/client.py +85 -27
  16. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/config.py +0 -5
  17. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/error_handler.py +11 -11
  18. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/errors.py +19 -18
  19. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/file/__init__.py +1 -1
  20. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/file/backend.py +35 -12
  21. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/file/config.py +2 -2
  22. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/memcached/__init__.py +2 -1
  23. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/memcached/backend.py +137 -27
  24. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/memcached/config.py +6 -3
  25. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/memcached/error_handler.py +26 -2
  26. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/provider.py +31 -22
  27. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/backend.py +25 -3
  28. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/client.py +43 -11
  29. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/config.py +10 -6
  30. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/error_handler.py +9 -9
  31. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/provider.py +13 -6
  32. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/cache_handler.py +196 -101
  33. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/decorator.py +122 -85
  34. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/nested.py +22 -13
  35. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/settings.py +0 -17
  36. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/singleton.py +8 -6
  37. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/validation.py +100 -32
  38. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/intent.py +11 -4
  39. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/wrapper.py +526 -334
  40. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/interop.py +51 -5
  41. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/key_generator.py +22 -1
  42. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/l1_cache.py +165 -89
  43. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/object_cache.py +46 -6
  44. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/__init__.py +1 -11
  45. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/async_metrics.py +282 -118
  46. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/circuit_breaker.py +113 -23
  47. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/__init__.py +2 -0
  48. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/arrow_serializer.py +32 -22
  49. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/auto_serializer.py +59 -12
  50. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/encryption_wrapper.py +82 -30
  51. cachekit-0.20.0/src/cachekit/reliability/profiles.py +0 -236
  52. {cachekit-0.20.0 → cachekit-0.21.0}/LICENSE +0 -0
  53. {cachekit-0.20.0 → cachekit-0.21.0}/rust/TEST_EXPANSION_SUMMARY.md +0 -0
  54. {cachekit-0.20.0 → cachekit-0.21.0}/rust/src/msgpack_bounds.rs +0 -0
  55. {cachekit-0.20.0 → cachekit-0.21.0}/rust/tsan_suppressions.txt +0 -0
  56. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/__init__.py +0 -0
  57. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/__init__.py +0 -0
  58. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/cachekitio/session.py +0 -0
  59. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/backends/redis/__init__.py +0 -0
  60. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/config/__init__.py +0 -0
  61. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/__init__.py +0 -0
  62. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/local_wrapper.py +0 -0
  63. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/main.py +0 -0
  64. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/orchestrator.py +0 -0
  65. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/session.py +0 -0
  66. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/stats_context.py +0 -0
  67. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/tenant_context.py +0 -0
  68. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/decorators/utils/__init__.py +0 -0
  69. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/di.py +0 -0
  70. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/hash_utils.py +0 -0
  71. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/health.py +0 -0
  72. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/hiredis_compat.py +0 -0
  73. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/imports.py +0 -0
  74. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/logging.py +0 -0
  75. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/monitoring/__init__.py +0 -0
  76. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/monitoring/pool_monitor.py +0 -0
  77. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/monitoring/protocols.py +0 -0
  78. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/py.typed +0 -0
  79. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/error_classification.py +0 -0
  80. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/load_control.py +0 -0
  81. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/reliability/metrics_collection.py +0 -0
  82. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/base.py +0 -0
  83. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/interop_serializer.py +0 -0
  84. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/orjson_serializer.py +0 -0
  85. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/standard_serializer.py +0 -0
  86. {cachekit-0.20.0 → cachekit-0.21.0}/src/cachekit/serializers/wrapper.py +0 -0
@@ -85,6 +85,15 @@ dependencies = [
85
85
  "equator",
86
86
  ]
87
87
 
88
+ [[package]]
89
+ name = "alloca"
90
+ version = "0.4.0"
91
+ source = "registry+https://github.com/rust-lang/crates.io-index"
92
+ checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4"
93
+ dependencies = [
94
+ "cc",
95
+ ]
96
+
88
97
  [[package]]
89
98
  name = "anes"
90
99
  version = "0.1.6"
@@ -127,7 +136,7 @@ version = "1.1.5"
127
136
  source = "registry+https://github.com/rust-lang/crates.io-index"
128
137
  checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
129
138
  dependencies = [
130
- "windows-sys 0.61.2",
139
+ "windows-sys 0.60.2",
131
140
  ]
132
141
 
133
142
  [[package]]
@@ -138,7 +147,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
138
147
  dependencies = [
139
148
  "anstyle",
140
149
  "once_cell_polyfill",
141
- "windows-sys 0.61.2",
150
+ "windows-sys 0.60.2",
142
151
  ]
143
152
 
144
153
  [[package]]
@@ -271,10 +280,10 @@ dependencies = [
271
280
 
272
281
  [[package]]
273
282
  name = "cachekit-rs"
274
- version = "0.20.0"
283
+ version = "0.21.0"
275
284
  dependencies = [
276
285
  "cachekit-core",
277
- "criterion",
286
+ "criterion 0.8.2",
278
287
  "ctor",
279
288
  "divan",
280
289
  "fastrand",
@@ -431,9 +440,9 @@ dependencies = [
431
440
  "cast",
432
441
  "ciborium",
433
442
  "clap",
434
- "criterion-plot",
443
+ "criterion-plot 0.5.0",
435
444
  "is-terminal",
436
- "itertools",
445
+ "itertools 0.10.5",
437
446
  "num-traits",
438
447
  "once_cell",
439
448
  "oorandom",
@@ -447,6 +456,31 @@ dependencies = [
447
456
  "walkdir",
448
457
  ]
449
458
 
459
+ [[package]]
460
+ name = "criterion"
461
+ version = "0.8.2"
462
+ source = "registry+https://github.com/rust-lang/crates.io-index"
463
+ checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3"
464
+ dependencies = [
465
+ "alloca",
466
+ "anes",
467
+ "cast",
468
+ "ciborium",
469
+ "clap",
470
+ "criterion-plot 0.8.2",
471
+ "itertools 0.13.0",
472
+ "num-traits",
473
+ "oorandom",
474
+ "page_size",
475
+ "plotters",
476
+ "rayon",
477
+ "regex",
478
+ "serde",
479
+ "serde_json",
480
+ "tinytemplate",
481
+ "walkdir",
482
+ ]
483
+
450
484
  [[package]]
451
485
  name = "criterion-plot"
452
486
  version = "0.5.0"
@@ -454,7 +488,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
454
488
  checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
455
489
  dependencies = [
456
490
  "cast",
457
- "itertools",
491
+ "itertools 0.10.5",
492
+ ]
493
+
494
+ [[package]]
495
+ name = "criterion-plot"
496
+ version = "0.8.2"
497
+ source = "registry+https://github.com/rust-lang/crates.io-index"
498
+ checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea"
499
+ dependencies = [
500
+ "cast",
501
+ "itertools 0.13.0",
458
502
  ]
459
503
 
460
504
  [[package]]
@@ -501,20 +545,14 @@ dependencies = [
501
545
 
502
546
  [[package]]
503
547
  name = "ctor"
504
- version = "0.4.3"
548
+ version = "0.13.1"
505
549
  source = "registry+https://github.com/rust-lang/crates.io-index"
506
- checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6"
550
+ checksum = "3429e8f8e3ce0ffe475c411850f70468c70d7a87d2ac3d15dd44703fb885aede"
507
551
  dependencies = [
508
- "ctor-proc-macro",
509
- "dtor",
552
+ "link-section",
553
+ "linktime-proc-macro",
510
554
  ]
511
555
 
512
- [[package]]
513
- name = "ctor-proc-macro"
514
- version = "0.0.6"
515
- source = "registry+https://github.com/rust-lang/crates.io-index"
516
- checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2"
517
-
518
556
  [[package]]
519
557
  name = "ctr"
520
558
  version = "0.9.2"
@@ -590,21 +628,6 @@ dependencies = [
590
628
  "syn",
591
629
  ]
592
630
 
593
- [[package]]
594
- name = "dtor"
595
- version = "0.0.6"
596
- source = "registry+https://github.com/rust-lang/crates.io-index"
597
- checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8"
598
- dependencies = [
599
- "dtor-proc-macro",
600
- ]
601
-
602
- [[package]]
603
- name = "dtor-proc-macro"
604
- version = "0.0.5"
605
- source = "registry+https://github.com/rust-lang/crates.io-index"
606
- checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055"
607
-
608
631
  [[package]]
609
632
  name = "either"
610
633
  version = "1.15.0"
@@ -644,14 +667,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
644
667
  checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
645
668
  dependencies = [
646
669
  "libc",
647
- "windows-sys 0.61.2",
670
+ "windows-sys 0.52.0",
648
671
  ]
649
672
 
650
673
  [[package]]
651
674
  name = "fastrand"
652
- version = "2.3.0"
675
+ version = "2.5.0"
653
676
  source = "registry+https://github.com/rust-lang/crates.io-index"
654
- checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
677
+ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
655
678
 
656
679
  [[package]]
657
680
  name = "find-msvc-tools"
@@ -786,9 +809,9 @@ dependencies = [
786
809
 
787
810
  [[package]]
788
811
  name = "iai-callgrind"
789
- version = "0.14.2"
812
+ version = "0.16.1"
790
813
  source = "registry+https://github.com/rust-lang/crates.io-index"
791
- checksum = "1c9e864ad001cbbf35a64f7b574998823b8622bb483a25246fa1b0e2b3888686"
814
+ checksum = "0b1e4910d3a9137442723dfb772c32dc10674c4181ca078d2fd227cd5dce9db0"
792
815
  dependencies = [
793
816
  "bincode",
794
817
  "derive_more",
@@ -798,9 +821,9 @@ dependencies = [
798
821
 
799
822
  [[package]]
800
823
  name = "iai-callgrind-macros"
801
- version = "0.5.1"
824
+ version = "0.6.1"
802
825
  source = "registry+https://github.com/rust-lang/crates.io-index"
803
- checksum = "c9cee6c3bc32b63ff40e5e56190b1276d2bd0e0b319aa6f998864c27865d3b4e"
826
+ checksum = "4d03775318d3f9f01b39ac6612b01464006dc397a654a89dd57df2fd34fb68c3"
804
827
  dependencies = [
805
828
  "derive_more",
806
829
  "proc-macro-error2",
@@ -813,9 +836,9 @@ dependencies = [
813
836
 
814
837
  [[package]]
815
838
  name = "iai-callgrind-runner"
816
- version = "0.14.2"
839
+ version = "0.16.1"
817
840
  source = "registry+https://github.com/rust-lang/crates.io-index"
818
- checksum = "a82491521e6505b06a824274712a1307904e7cdfdf047735f7dfdb28b5f7a337"
841
+ checksum = "b74c9743c00c3bca4aaffc69c87cae56837796cd362438daf354a3f785788c68"
819
842
  dependencies = [
820
843
  "serde",
821
844
  ]
@@ -865,7 +888,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
865
888
  dependencies = [
866
889
  "hermit-abi",
867
890
  "libc",
868
- "windows-sys 0.61.2",
891
+ "windows-sys 0.52.0",
869
892
  ]
870
893
 
871
894
  [[package]]
@@ -883,6 +906,15 @@ dependencies = [
883
906
  "either",
884
907
  ]
885
908
 
909
+ [[package]]
910
+ name = "itertools"
911
+ version = "0.13.0"
912
+ source = "registry+https://github.com/rust-lang/crates.io-index"
913
+ checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
914
+ dependencies = [
915
+ "either",
916
+ ]
917
+
886
918
  [[package]]
887
919
  name = "itoa"
888
920
  version = "1.0.17"
@@ -911,6 +943,18 @@ version = "0.2.183"
911
943
  source = "registry+https://github.com/rust-lang/crates.io-index"
912
944
  checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
913
945
 
946
+ [[package]]
947
+ name = "link-section"
948
+ version = "0.13.1"
949
+ source = "registry+https://github.com/rust-lang/crates.io-index"
950
+ checksum = "ea2c24837c4fd5ab6a31d64133eae954f5199247523cf29586117e85245c0dd3"
951
+
952
+ [[package]]
953
+ name = "linktime-proc-macro"
954
+ version = "0.1.0"
955
+ source = "registry+https://github.com/rust-lang/crates.io-index"
956
+ checksum = "a44cd706ff0d503ee32b2071166510ca27e281228de10cd3aa8d35ff94560f81"
957
+
914
958
  [[package]]
915
959
  name = "linux-raw-sys"
916
960
  version = "0.4.15"
@@ -1034,6 +1078,16 @@ version = "0.3.1"
1034
1078
  source = "registry+https://github.com/rust-lang/crates.io-index"
1035
1079
  checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
1036
1080
 
1081
+ [[package]]
1082
+ name = "page_size"
1083
+ version = "0.6.0"
1084
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1085
+ checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da"
1086
+ dependencies = [
1087
+ "libc",
1088
+ "winapi",
1089
+ ]
1090
+
1037
1091
  [[package]]
1038
1092
  name = "plotters"
1039
1093
  version = "0.3.7"
@@ -1089,7 +1143,7 @@ dependencies = [
1089
1143
  "aligned-vec",
1090
1144
  "backtrace",
1091
1145
  "cfg-if",
1092
- "criterion",
1146
+ "criterion 0.5.1",
1093
1147
  "findshlibs",
1094
1148
  "inferno",
1095
1149
  "libc",
@@ -1147,9 +1201,9 @@ dependencies = [
1147
1201
 
1148
1202
  [[package]]
1149
1203
  name = "proptest"
1150
- version = "1.10.0"
1204
+ version = "1.11.0"
1151
1205
  source = "registry+https://github.com/rust-lang/crates.io-index"
1152
- checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532"
1206
+ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744"
1153
1207
  dependencies = [
1154
1208
  "bit-set",
1155
1209
  "bit-vec",
@@ -1484,7 +1538,7 @@ dependencies = [
1484
1538
  "errno",
1485
1539
  "libc",
1486
1540
  "linux-raw-sys 0.12.1",
1487
- "windows-sys 0.61.2",
1541
+ "windows-sys 0.52.0",
1488
1542
  ]
1489
1543
 
1490
1544
  [[package]]
@@ -1694,7 +1748,7 @@ dependencies = [
1694
1748
  "getrandom 0.3.4",
1695
1749
  "once_cell",
1696
1750
  "rustix 1.1.4",
1697
- "windows-sys 0.61.2",
1751
+ "windows-sys 0.52.0",
1698
1752
  ]
1699
1753
 
1700
1754
  [[package]]
@@ -1981,7 +2035,7 @@ version = "0.1.11"
1981
2035
  source = "registry+https://github.com/rust-lang/crates.io-index"
1982
2036
  checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
1983
2037
  dependencies = [
1984
- "windows-sys 0.61.2",
2038
+ "windows-sys 0.52.0",
1985
2039
  ]
1986
2040
 
1987
2041
  [[package]]
@@ -2201,18 +2255,18 @@ dependencies = [
2201
2255
 
2202
2256
  [[package]]
2203
2257
  name = "zeroize"
2204
- version = "1.8.2"
2258
+ version = "1.9.0"
2205
2259
  source = "registry+https://github.com/rust-lang/crates.io-index"
2206
- checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
2260
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
2207
2261
  dependencies = [
2208
2262
  "zeroize_derive",
2209
2263
  ]
2210
2264
 
2211
2265
  [[package]]
2212
2266
  name = "zeroize_derive"
2213
- version = "1.4.3"
2267
+ version = "1.5.0"
2214
2268
  source = "registry+https://github.com/rust-lang/crates.io-index"
2215
- checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
2269
+ checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328"
2216
2270
  dependencies = [
2217
2271
  "proc-macro2",
2218
2272
  "quote",
@@ -8,11 +8,11 @@ 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"
11
- numpy = "0.25"
11
+ numpy = "0.29"
12
12
 
13
13
  # Performance dependencies
14
14
  rayon = "1.8"
15
- simd-json = "0.13"
15
+ simd-json = "0.18"
16
16
  lz4 = "1.24"
17
17
  memmap2 = "0.9"
18
18
 
@@ -41,22 +41,3 @@ opt-level = 1
41
41
  opt-level = 3
42
42
  debug = true
43
43
  lto = "fat"
44
-
45
- # Profile-Guided Optimization - Generate profile data
46
- [profile.release-pgo-generate]
47
- inherits = "release"
48
- # PGO instrumentation adds overhead, disable some optimizations
49
- lto = false
50
- # Keep debug info for profiling
51
- debug = true
52
-
53
- # Profile-Guided Optimization - Use profile data
54
- [profile.release-pgo-use]
55
- inherits = "release"
56
- # Full LTO with profile data for maximum optimization
57
- lto = "fat"
58
- # Strip symbols for smaller binary
59
- strip = true
60
- # Maximum optimization with profile data
61
- opt-level = 3
62
- codegen-units = 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cachekit
3
- Version: 0.20.0
3
+ Version: 0.21.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -20,9 +20,9 @@ Classifier: Topic :: System :: Monitoring
20
20
  Classifier: Topic :: Security :: Cryptography
21
21
  Classifier: Framework :: AsyncIO
22
22
  Classifier: Typing :: Typed
23
- Requires-Dist: redis[hiredis]>=4.0.0
23
+ Requires-Dist: redis[hiredis]>=4.6.0
24
24
  Requires-Dist: pydantic>=2.0.0
25
- Requires-Dist: pydantic-settings>=2.7.0
25
+ Requires-Dist: pydantic-settings>=2.13.0
26
26
  Requires-Dist: prometheus-client>=0.22.1
27
27
  Requires-Dist: psutil>=7.0.0
28
28
  Requires-Dist: blake3>=1.0.5
@@ -214,6 +214,10 @@ def get_user_profile(user_id: int):
214
214
  return db.fetch_user(user_id)
215
215
  ```
216
216
 
217
+ Setting `CACHEKIT_MASTER_KEY` instead of passing `master_key=` means every preset except
218
+ `@cache.secure` and `@cache.local` must state its intent (`encryption=False` for plaintext), or it raises
219
+ `ConfigurationError` at decoration: the key is a key source, never an on switch.
220
+
217
221
  | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
218
222
  |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
219
223
  | Default TTL | 300 s | 300 s | 300 s | 600 s | 600 s |
@@ -223,11 +227,13 @@ def get_user_profile(user_id: int):
223
227
  | Encryption | - | - | - | - | ✅ Required |
224
228
  | L1 SWR (L1-only mode) | - | ✅ | - | ✅ | - |
225
229
  | L1 Invalidation | - | - | - | ✅ | ✅ |
226
- | Prometheus Metrics | - | - | - | ✅ | ✅ |
230
+ | Prometheus Metrics | - | -¹ | - | ✅ | ✅ |
227
231
  | Tracing | - | ✅ | - | ✅ | ✅ |
228
232
  | Structured Logging | - | ✅ | - | ✅ | ✅ |
229
233
  | **Use Case** | High throughput | Local debugging | Deterministic tests | Production reliability | Compliance/security |
230
234
 
235
+ > ¹ `@cache.dev` exports no Prometheus metrics except `circuit_breaker_state`, which is recorded for every function whose circuit breaker is enabled.
236
+ >
231
237
  > 🔒 `@cache.secure` forces `integrity_checking=True` — passing `integrity_checking=False` raises `ConfigurationError` at decoration, including as an override next to `config=DecoratorConfig.secure(...)`. `@cache.secure` also rejects `config=`; the RORO form is `@cache(config=DecoratorConfig.secure(...))`.
232
238
  >
233
239
  > **Default TTL** follows the cross-SDK [intent-preset spec](https://github.com/cachekit-io/protocol/blob/main/spec/intent-presets.md#default-ttl) (`@cache.io` 3600 s) — the same numbers as cachekit-rs and cachekit-ts. `ttl=` overrides it; `ttl=None` is the explicit never-expire opt-in ([details](docs/configuration.md#intent-presets)).
@@ -242,7 +248,7 @@ def get_user_profile(user_id: int):
242
248
  See the comparison table above for the exact feature set of each preset.
243
249
 
244
250
  ```python
245
- # Development: verbose logging, integrity checks on, Prometheus off
251
+ # Development: verbose logging, integrity checks on, Prometheus off except circuit_breaker_state
246
252
  @cache.dev
247
253
  def debug_expensive_call():
248
254
  return complex_computation()
@@ -508,16 +514,22 @@ info = expensive_func.cache_info()
508
514
  ### Environment Variables
509
515
 
510
516
  ```bash
517
+ # Backend selection: set exactly ONE of CACHEKIT_REDIS_URL, CACHEKIT_API_KEY,
518
+ # CACHEKIT_MEMCACHED_SERVERS, CACHEKIT_FILE_CACHE_DIR. Two or more is a ConfigurationError at
519
+ # first call, and decorators relying on env auto-detection run uncached (docs/backends/README.md).
520
+ # REDIS_URL is only a fallback and never conflicts.
521
+
511
522
  # Redis Connection (priority: CACHEKIT_REDIS_URL > REDIS_URL)
512
523
  CACHEKIT_REDIS_URL="redis://localhost:6379" # Primary (preferred)
513
524
  REDIS_URL="redis://localhost:6379" # Fallback
514
525
 
515
526
  # CachekitIO SaaS Backend (closed beta — request access at cachekit.io)
516
- CACHEKIT_API_KEY="your-api-key" # For @cache.io() — or pass api_key= directly # pragma: allowlist secret
527
+ # For @cache.io() next to Redis, pass api_key= from your secret store instead.
528
+ # CACHEKIT_API_KEY="your-api-key" # pragma: allowlist secret
517
529
  CACHEKIT_API_URL="https://api.cachekit.io" # Default SaaS endpoint
518
530
 
519
531
  # Memcached Backend (optional: pip install cachekit[memcached])
520
- CACHEKIT_MEMCACHED_SERVERS='["mc1:11211", "mc2:11211"]' # Default: 127.0.0.1:11211
532
+ # CACHEKIT_MEMCACHED_SERVERS='["mc1:11211", "mc2:11211"]' # Default: 127.0.0.1:11211
521
533
  CACHEKIT_MEMCACHED_CONNECT_TIMEOUT=2.0 # Default: 2.0 seconds
522
534
  CACHEKIT_MEMCACHED_TIMEOUT=1.0 # Default: 1.0 seconds
523
535
  CACHEKIT_MEMCACHED_KEY_PREFIX="myapp:" # Default: "" (none)
@@ -527,9 +539,6 @@ CACHEKIT_MAX_VALUE_SIZE=104857600
527
539
  CACHEKIT_ARROW_COMPRESSION=zstd
528
540
  ```
529
541
 
530
- > [!NOTE]
531
- > If both `CACHEKIT_REDIS_URL` and `REDIS_URL` are set, `CACHEKIT_REDIS_URL` takes precedence.
532
-
533
542
  ---
534
543
 
535
544
  ## Development
@@ -158,6 +158,10 @@ def get_user_profile(user_id: int):
158
158
  return db.fetch_user(user_id)
159
159
  ```
160
160
 
161
+ Setting `CACHEKIT_MASTER_KEY` instead of passing `master_key=` means every preset except
162
+ `@cache.secure` and `@cache.local` must state its intent (`encryption=False` for plaintext), or it raises
163
+ `ConfigurationError` at decoration: the key is a key source, never an on switch.
164
+
161
165
  | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
162
166
  |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
163
167
  | Default TTL | 300 s | 300 s | 300 s | 600 s | 600 s |
@@ -167,11 +171,13 @@ def get_user_profile(user_id: int):
167
171
  | Encryption | - | - | - | - | ✅ Required |
168
172
  | L1 SWR (L1-only mode) | - | ✅ | - | ✅ | - |
169
173
  | L1 Invalidation | - | - | - | ✅ | ✅ |
170
- | Prometheus Metrics | - | - | - | ✅ | ✅ |
174
+ | Prometheus Metrics | - | -¹ | - | ✅ | ✅ |
171
175
  | Tracing | - | ✅ | - | ✅ | ✅ |
172
176
  | Structured Logging | - | ✅ | - | ✅ | ✅ |
173
177
  | **Use Case** | High throughput | Local debugging | Deterministic tests | Production reliability | Compliance/security |
174
178
 
179
+ > ¹ `@cache.dev` exports no Prometheus metrics except `circuit_breaker_state`, which is recorded for every function whose circuit breaker is enabled.
180
+ >
175
181
  > 🔒 `@cache.secure` forces `integrity_checking=True` — passing `integrity_checking=False` raises `ConfigurationError` at decoration, including as an override next to `config=DecoratorConfig.secure(...)`. `@cache.secure` also rejects `config=`; the RORO form is `@cache(config=DecoratorConfig.secure(...))`.
176
182
  >
177
183
  > **Default TTL** follows the cross-SDK [intent-preset spec](https://github.com/cachekit-io/protocol/blob/main/spec/intent-presets.md#default-ttl) (`@cache.io` 3600 s) — the same numbers as cachekit-rs and cachekit-ts. `ttl=` overrides it; `ttl=None` is the explicit never-expire opt-in ([details](docs/configuration.md#intent-presets)).
@@ -186,7 +192,7 @@ def get_user_profile(user_id: int):
186
192
  See the comparison table above for the exact feature set of each preset.
187
193
 
188
194
  ```python
189
- # Development: verbose logging, integrity checks on, Prometheus off
195
+ # Development: verbose logging, integrity checks on, Prometheus off except circuit_breaker_state
190
196
  @cache.dev
191
197
  def debug_expensive_call():
192
198
  return complex_computation()
@@ -452,16 +458,22 @@ info = expensive_func.cache_info()
452
458
  ### Environment Variables
453
459
 
454
460
  ```bash
461
+ # Backend selection: set exactly ONE of CACHEKIT_REDIS_URL, CACHEKIT_API_KEY,
462
+ # CACHEKIT_MEMCACHED_SERVERS, CACHEKIT_FILE_CACHE_DIR. Two or more is a ConfigurationError at
463
+ # first call, and decorators relying on env auto-detection run uncached (docs/backends/README.md).
464
+ # REDIS_URL is only a fallback and never conflicts.
465
+
455
466
  # Redis Connection (priority: CACHEKIT_REDIS_URL > REDIS_URL)
456
467
  CACHEKIT_REDIS_URL="redis://localhost:6379" # Primary (preferred)
457
468
  REDIS_URL="redis://localhost:6379" # Fallback
458
469
 
459
470
  # CachekitIO SaaS Backend (closed beta — request access at cachekit.io)
460
- CACHEKIT_API_KEY="your-api-key" # For @cache.io() — or pass api_key= directly # pragma: allowlist secret
471
+ # For @cache.io() next to Redis, pass api_key= from your secret store instead.
472
+ # CACHEKIT_API_KEY="your-api-key" # pragma: allowlist secret
461
473
  CACHEKIT_API_URL="https://api.cachekit.io" # Default SaaS endpoint
462
474
 
463
475
  # Memcached Backend (optional: pip install cachekit[memcached])
464
- CACHEKIT_MEMCACHED_SERVERS='["mc1:11211", "mc2:11211"]' # Default: 127.0.0.1:11211
476
+ # CACHEKIT_MEMCACHED_SERVERS='["mc1:11211", "mc2:11211"]' # Default: 127.0.0.1:11211
465
477
  CACHEKIT_MEMCACHED_CONNECT_TIMEOUT=2.0 # Default: 2.0 seconds
466
478
  CACHEKIT_MEMCACHED_TIMEOUT=1.0 # Default: 1.0 seconds
467
479
  CACHEKIT_MEMCACHED_KEY_PREFIX="myapp:" # Default: "" (none)
@@ -471,9 +483,6 @@ CACHEKIT_MAX_VALUE_SIZE=104857600
471
483
  CACHEKIT_ARROW_COMPRESSION=zstd
472
484
  ```
473
485
 
474
- > [!NOTE]
475
- > If both `CACHEKIT_REDIS_URL` and `REDIS_URL` are set, `CACHEKIT_REDIS_URL` takes precedence.
476
-
477
486
  ---
478
487
 
479
488
  ## Development
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "cachekit"
7
- version = "0.20.0"
7
+ version = "0.21.0"
8
8
  description = "Backend-agnostic caching for Python — intent-based decorators with circuit breaker, distributed locking, Prometheus metrics, and optional zero-knowledge AES-256-GCM encryption, on a Rust-powered core. Zero-config L1 in-memory; scales to Redis, Memcached, File, or CachekitIO."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -53,11 +53,17 @@ classifiers = [
53
53
  ]
54
54
  requires-python = ">=3.10"
55
55
  dependencies = [
56
- # Core Redis functionality
57
- "redis[hiredis]>=4.0.0",
56
+ # Core Redis functionality. 4.6.0 is the oldest release on which every URL scheme creates a client:
57
+ # redis.asyncio arrived in 4.2.0, and before 4.6.0 a unix:// connection rejects socket_connect_timeout.
58
+ # Below the floor, client creation fails and every decorated call runs uncached. CI runs the unit suite
59
+ # on exactly this version (the redis-py floor job), so raise it here when the code needs a newer release.
60
+ "redis[hiredis]>=4.6.0",
58
61
  # Configuration and validation
59
62
  "pydantic>=2.0.0",
60
- "pydantic-settings>=2.7.0", # NoDecode (previous_master_keys env parsing) first shipped in 2.7.0
63
+ # 2.12.0 lets an explicit constructor kwarg beat an aliased env var: before it,
64
+ # RedisBackendConfig(redis_url=...) raised extra_forbidden whenever REDIS_URL was set (#225).
65
+ # 2.13.0 fixed a hash-order race in that change (pydantic/pydantic-settings#746), so it is the floor.
66
+ "pydantic-settings>=2.13.0",
61
67
  # Monitoring and observability
62
68
  "prometheus-client>=0.22.1",
63
69
  "psutil>=7.0.0",
@@ -272,7 +278,12 @@ fuzz = [
272
278
  # [project] dependencies instead — see the anyio/h2 entries above.
273
279
  [tool.uv]
274
280
  constraint-dependencies = [
275
- "urllib3>=2.7.0",
281
+ # urllib3 is a dev-only transitive dep (requests -> urllib3; requests is a
282
+ # dev dependency and also arrives via pip-audit).
283
+ # 2.8.0 fixes GHSA-8988-9cw3-xx77 (HTTPS proxy TLS config ignored),
284
+ # GHSA-gh4c-6fx4-qh6g (chunked deflate infinite loop) and
285
+ # GHSA-vxq7-64xx-v4gw (unbounded chunk-size line buffering).
286
+ "urllib3>=2.8.0",
276
287
  "fonttools>=4.60.2",
277
288
  "werkzeug>=3.1.4",
278
289
  # pip is a dev-only transitive dep (pip-audit -> pip-api -> pip). 26.1.2 fixes
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "cachekit-rs"
3
- version = "0.20.0"
3
+ version = "0.21.0"
4
4
  edition = "2021"
5
5
  authors = ["cachekit Contributors"]
6
6
  description = "High-performance storage engine for caching with compression and encryption"
@@ -43,10 +43,10 @@ messagepack = []
43
43
  encryption = ["dep:zeroize"]
44
44
 
45
45
  [dev-dependencies]
46
- criterion = { version = "0.5", features = ["html_reports"] }
47
- ctor = "0.4.2"
46
+ criterion = { version = "0.8", features = ["html_reports"] }
47
+ ctor = "0.13.0"
48
48
  pprof = { version = "0.15", features = ["criterion", "flamegraph", "protobuf-codec"] }
49
- iai-callgrind = "0.14"
49
+ iai-callgrind = "0.16"
50
50
  divan = "0.1"
51
51
  fastrand = "2.1"
52
52
  proptest = "1.4"
@@ -53,7 +53,7 @@ help: ## Show Rust-specific commands
53
53
  @echo " $(YELLOW)make test-property$(RESET) Property-based tests (proptest)"
54
54
  @echo ""
55
55
  @echo "$(GREEN)Benchmarks:$(RESET)"
56
- @echo " $(YELLOW)make bench$(RESET) Run Rust benchmarks"
56
+ @echo " $(YELLOW)make bench$(RESET) Point at the Rust benchmarks (cachekit-core)"
57
57
  @echo ""
58
58
  @echo "$(GREEN)Security:$(RESET)"
59
59
  @echo " $(YELLOW)make security-fast$(RESET) Fast security checks (< 3 min)"
@@ -163,12 +163,9 @@ test-property: ## Run property-based tests (in cachekit-core)
163
163
  # 📊 BENCHMARKS
164
164
  # ═══════════════════════════════════════════════════════════════════════════════
165
165
 
166
- bench: ## Run Rust benchmarks
167
- @echo "$(BLUE)Running Rust benchmarks...$(RESET)"
168
- @echo "$(YELLOW)Logging to $(LOG_DIR)/benchmark/rust-bench_$(TIMESTAMP).log$(RESET)"
169
- $(call require_binary,cargo,Install Rust: https://rustup.rs)
170
- @cargo bench --bench unified_benchmarks 2>&1 | tee $(LOG_DIR)/benchmark/rust-bench_$(TIMESTAMP).log
171
- @echo "$(GREEN)✓ Rust benchmarks completed$(RESET)"
166
+ bench: ## Run Rust benchmarks (in cachekit-core)
167
+ @echo "$(BLUE)Rust benchmarks are now in cachekit-core/$(RESET)"
168
+ @echo "$(YELLOW)Run: cd ../../cachekit-core && cargo bench --features encryption --bench hot_path$(RESET)"
172
169
 
173
170
  # ═══════════════════════════════════════════════════════════════════════════════
174
171
  # 🔒 SECURITY & VERIFICATION