ua-parser / uap-python

Python implementation of ua-parser
Apache License 2.0
561 stars 152 forks source link

Avoid eviction on entry replacement #204

Closed masklinn closed 6 months ago

masklinn commented 6 months ago

*Result objects are immutable, thus if a PartialResult gets filled further it has to be re-set into the cache.

This does not change the cache size, but because the current S3 and SIEVE implementations unconditionally check the cache size on __setitem__ they may evict an entry unnecessarily.

Fix that: if there is already a valid cache entry for the key, just update it in place instead of trying to evict then creating a brand new entry.

Also update the LRU to pre-check for size (and presence as well), this may make setting a bit more expensive than post-check but it avoids "wronging" the user by bypassing the limit they set.

Fixes #201