Skip to content

Commit ff042bb

Browse files
committed
fix: Expand exhausted cross-reference keyspace
1 parent 0fa2d2e commit ff042bb

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

src/mkdocstrings_handlers/python/_internal/rendering.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
_logger = get_logger(__name__)
4747

48+
_STASH_KEY_ALPHABET = string.ascii_letters + string.digits
49+
4850

4951
def _sort_key_alphabetical(item: CollectorItem) -> str:
5052
# `chr(sys.maxunicode)` is a string that contains the final unicode character,
@@ -107,11 +109,15 @@ class _StashCrossRefFilter:
107109

108110
@staticmethod
109111
def _gen_key(length: int) -> str:
110-
return "_" + "".join(random.choice(string.ascii_letters + string.digits) for _ in range(max(1, length - 1))) # noqa: S311
112+
return "_" + "".join(random.choice(_STASH_KEY_ALPHABET) for _ in range(max(1, length - 1))) # noqa: S311
111113

112114
def _gen_stash_key(self, length: int) -> str:
113115
key = self._gen_key(length)
114116
while key in self.stash:
117+
key_length = len(key)
118+
keyspace_size = len(_STASH_KEY_ALPHABET) ** (key_length - 1)
119+
if sum(len(stash_key) == key_length for stash_key in self.stash) >= keyspace_size:
120+
length = key_length + 1
115121
key = self._gen_key(length)
116122
return key
117123

tests/test_rendering.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,19 @@ def test_format_signature(name: Markup, signature: str) -> None:
5454
assert rendering._format_signature(name, signature, length)
5555

5656

57+
def test_stash_crossref_filter_expands_exhausted_keyspace() -> None:
58+
"""Assert stashing more cross-references than fit at the requested length terminates."""
59+
stash_crossref = rendering._StashCrossRefFilter()
60+
stash_crossref.stash.clear()
61+
try:
62+
keys = [stash_crossref(str(index), length=1) for index in range(63)]
63+
finally:
64+
stash_crossref.stash.clear()
65+
66+
assert len(set(keys)) == 63
67+
assert len(keys[-1]) == 3
68+
69+
5770
@dataclass
5871
class _FakeObject:
5972
name: str

0 commit comments

Comments
 (0)