intersphinx: Handle a negative `intersphinx_cache_limit` (#12514)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
This commit is contained in:
Shengyu Zhang 2024-07-31 15:16:10 +08:00 committed by GitHub
parent 4a95555eae
commit 03d684fe9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 46 additions and 2 deletions

View File

@ -16,5 +16,9 @@ Features added
Bugs fixed
----------
* #12514: intersphinx: fix the meaning of a negative value for
:confval:`intersphinx_cache_limit`.
Patch by Shengyu Zhang.
Testing
-------

View File

@ -201,7 +201,10 @@ def _fetch_inventory_group(
config: Config,
srcdir: Path,
) -> bool:
cache_time = now - config.intersphinx_cache_limit * 86400
if config.intersphinx_cache_limit < 0:
cache_time = now - config.intersphinx_cache_limit * 86400
else:
cache_time = 0
updated = False
failures = []

View File

@ -3,6 +3,7 @@
from __future__ import annotations
import http.server
import time
from typing import TYPE_CHECKING
from unittest import mock
@ -19,7 +20,13 @@ from sphinx.ext.intersphinx import (
validate_intersphinx_mapping,
)
from sphinx.ext.intersphinx import setup as intersphinx_setup
from sphinx.ext.intersphinx._load import _fetch_inventory, _get_safe_url, _strip_basic_auth
from sphinx.ext.intersphinx._load import (
_fetch_inventory,
_fetch_inventory_group,
_get_safe_url,
_strip_basic_auth,
)
from sphinx.ext.intersphinx._shared import _IntersphinxProject
from sphinx.util.console import strip_colors
from tests.test_util.intersphinx_data import (
@ -665,3 +672,33 @@ def test_intersphinx_role(app):
# explicit title
assert html.format('index.html#foons') in content
if TYPE_CHECKING:
from sphinx.ext.intersphinx._shared import InventoryCacheEntry
def test_intersphinx_cache_limit(app):
url = 'https://example.org/'
app.config.intersphinx_cache_limit = -1
app.config.intersphinx_mapping = {
'inv': (url, None),
}
# load the inventory and check if it's done correctly
intersphinx_cache: dict[str, InventoryCacheEntry] = {
url: ('', 0, {}), # 0 is a timestamp, make sure the entry is expired
}
validate_intersphinx_mapping(app, app.config)
load_mappings(app)
now = int(time.time())
for name, (uri, locations) in app.config.intersphinx_mapping.values():
project = _IntersphinxProject(name=name, target_uri=uri, locations=locations)
# no need to read from remote
assert not _fetch_inventory_group(
project=project,
cache=intersphinx_cache,
now=now,
config=app.config,
srcdir=app.srcdir,
)