fix(cache-manager): return the round-tripped value from get_or_set on a miss - #313
Merged
Merged
Conversation
… a miss On a miss get_or_set returned the factory's object as is, on a hit the JSON-decoded copy, so a tuple came back as a tuple then a list and int dict keys as ints then strings. Encode once, store those bytes and return them decoded. Document the JSON round-trip rules.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CacheManager.get_or_set()returned the factory's object on a miss and the JSON-decoded copy on a hit:A miss now encodes the value once with the same
_encode()thatset()uses, stores those bytes, and returnsjson.loadsof the same bytes. It does not serialise twice, and both paths give the same result.seterror still propagates, as it did throughself.set(). There is no fail-open path inCacheManager.datetime,Decimal,UUID, a pydantic model) still raisesTypeErrorafter the factory has run, and nothing is stored. This can't be avoided, so it is now documented.add()returns abool, not the value, so it doesn't have this inconsistency. No other method returns the stored value.docs/APP_CACHE.mdand its zh-TW mirror, with a table of how each type reads back.Tests
TypeError, the factory runs once, and the key stays free.Including the live Redis and Memcached tests: 1195 passed, 1 skipped, total coverage 99%,
manager.py100%.Changelog
changelog.d/235.fixed.mdCloses #235