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.
- {cachekit-0.9.0 → cachekit-0.10.0}/Cargo.lock +16 -234
- {cachekit-0.9.0 → cachekit-0.10.0}/Cargo.toml +1 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/PKG-INFO +1 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/pyproject.toml +4 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/Cargo.toml +1 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/src/python_bindings.rs +2 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/__init__.py +1 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/base.py +37 -2
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/backend.py +12 -4
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/error_handler.py +14 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/backend.py +114 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/cache_handler.py +66 -2
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/settings.py +3 -2
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/l1_cache.py +16 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/metrics_collection.py +0 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/arrow_serializer.py +7 -4
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/auto_serializer.py +3 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/base.py +1 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/encryption_wrapper.py +5 -2
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/orjson_serializer.py +2 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/standard_serializer.py +2 -1
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/serializers/wrapper.py +11 -4
- {cachekit-0.9.0 → cachekit-0.10.0}/LICENSE +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/README.md +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/Makefile +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/README.md +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/TEST_EXPANSION_SUMMARY.md +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/src/lib.rs +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/audits.toml +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/config.toml +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/supply-chain/imports.lock +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/rust/tsan_suppressions.txt +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/base_config.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/client.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/config.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/cachekitio/session.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/errors.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/file/config.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/backend.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/config.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/memcached/error_handler.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/provider.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/backend.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/client.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/config.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/error_handler.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/backends/redis/provider.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/decorator.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/nested.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/singleton.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/config/validation.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/intent.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/local_wrapper.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/main.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/orchestrator.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/session.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/stats_context.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/tenant_context.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/utils/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/decorators/wrapper.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/di.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/hash_utils.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/health.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/hiredis_compat.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/imports.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/channel.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/event.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/invalidation/redis_channel.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/key_generator.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/logging.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/correlation_tracking.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/pool_monitor.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/monitoring/protocols.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/object_cache.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/py.typed +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/__init__.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/adaptive_timeout.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/async_metrics.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/circuit_breaker.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/error_classification.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/load_control.py +0 -0
- {cachekit-0.9.0 → cachekit-0.10.0}/src/cachekit/reliability/profiles.py +0 -0
- {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.
|
|
248
|
+
version = "0.2.1"
|
|
249
249
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
250
|
-
checksum = "
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
1219
|
+
version = "0.29.0"
|
|
1290
1220
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1291
|
-
checksum = "
|
|
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.
|
|
1233
|
+
version = "0.29.0"
|
|
1307
1234
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1308
|
-
checksum = "
|
|
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.
|
|
1242
|
+
version = "0.29.0"
|
|
1317
1243
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1318
|
-
checksum = "
|
|
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.
|
|
1252
|
+
version = "0.29.0"
|
|
1327
1253
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1328
|
-
checksum = "
|
|
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.
|
|
1264
|
+
version = "0.29.0"
|
|
1339
1265
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1340
|
-
checksum = "
|
|
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
|
|
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.
|
|
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"
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cachekit"
|
|
7
|
-
version = "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",
|
|
@@ -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
|
|
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
|
|
|
@@ -32,9 +32,9 @@ class BaseBackend(Protocol):
|
|
|
32
32
|
|
|
33
33
|
Example:
|
|
34
34
|
>>> from cachekit.backends import BaseBackend, RedisBackend
|
|
35
|
-
>>>
|
|
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
|
-
#
|
|
653
|
-
#
|
|
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
|
|
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(
|