Skip to content

Commit 8cc3d92

Browse files
author
mathbou
committed
✨ query objects.inv from homepage url
1 parent a966413 commit 8cc3d92

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

seed_intersphinx_mapping/__init__.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@
3333
# stdlib
3434
import functools
3535
import json
36+
import os.path
3637
import re
38+
from urllib.parse import urlparse
3739
from typing import Dict, Optional, Tuple, Union
3840

3941
# 3rd party
42+
4043
import dist_meta
4144
import requests
42-
from apeye.requests_url import RequestsURL
43-
from dist_meta.metadata_mapping import MetadataMapping
4445
from domdf_python_tools.compat import importlib_resources
4546
from domdf_python_tools.utils import stderr_writer
4647
from packaging.requirements import Requirement
@@ -61,7 +62,7 @@
6162
_DOCUMENTATION_RE = re.compile(r"^[dD]oc(s|umentation)")
6263

6364

64-
def _get_project_links(project_name: str) -> MetadataMapping:
65+
def _get_project_links(project_name: str) -> list:
6566
"""
6667
Returns the web links for the given project.
6768
@@ -70,17 +71,19 @@ def _get_project_links(project_name: str) -> MetadataMapping:
7071
:param project_name:
7172
"""
7273

73-
urls = MetadataMapping()
74+
urls = []
7475

7576
# Try a local package first
7677
try:
7778
dist = dist_meta.distributions.get_distribution(project_name)
7879
raw_urls = dist.get_metadata().get_all("Project-URL", default=())
7980

8081
for url in raw_urls:
81-
label, url, *_ = map(str.strip, url.split(','))
82+
label, url = url.split(",", 1)
8283
if _DOCUMENTATION_RE.match(label):
83-
urls[label] = url
84+
urls.append(url)
85+
86+
urls.append(dist.get_metadata().get("Home-Page"))
8487

8588
except dist_meta.distributions.DistributionNotFoundError:
8689
# Fall back to PyPI
@@ -91,8 +94,11 @@ def _get_project_links(project_name: str) -> MetadataMapping:
9194
if "project_urls" in metadata and metadata["project_urls"]:
9295
for label, url in metadata["project_urls"].items():
9396
if _DOCUMENTATION_RE.match(label):
94-
urls[label] = url
97+
urls.append(url)
9598

99+
urls.append(metadata["home_page"])
100+
101+
urls = [url.strip() for url in filter(None, urls)]
96102
return urls
97103

98104

@@ -127,26 +133,24 @@ def get_sphinx_doc_url(pypi_name: str) -> str:
127133
Now raises :exc:`~packaging.requirements.InvalidRequirement` rather than
128134
:exc:`apeye.slumber_url.exceptions.HttpNotFoundError` if the project could not be found on PyPI.
129135
"""
130-
131-
for key, value in _get_project_links(pypi_name).items():
132-
136+
docs_urls = []
137+
for value in _get_project_links(pypi_name):
133138
# Follow redirects to get actual URL
134-
r = RequestsURL(value).head(allow_redirects=True, timeout=10)
135-
if r.status_code != 200: # pragma: no cover
136-
raise ValueError(f"Documentation URL not found: HTTP Status {r.status_code}.")
139+
r = requests.head(value, allow_redirects=True, timeout=10)
137140

138-
docs_url = r.url
141+
if r.status_code == 200:
142+
has_extension = os.path.splitext(urlparse(r.url).path)[-1]
143+
url = os.path.dirname(r.url) if has_extension else r.url
144+
docs_urls.append(url)
139145

140-
if docs_url.endswith('/'):
141-
objects_inv_url = f"{docs_url}objects.inv"
142-
else: # pragma: no cover
143-
objects_inv_url = f"{docs_url}/objects.inv"
146+
for docs_url in docs_urls:
147+
objects_inv_url = f"{docs_url.rstrip('/')}/objects.inv"
144148

145149
r = requests.head(objects_inv_url)
146150
if r.status_code != 200:
147-
raise ValueError(f"objects.inv not found at url {objects_inv_url}: HTTP Status {r.status_code}.")
148-
149-
return docs_url
151+
stderr_writer(f"WARNING: objects.inv not found at url {objects_inv_url}: HTTP Status {r.status_code}.")
152+
else:
153+
return docs_url
150154

151155
raise ValueError("Documentation URL not found in data from PyPI.")
152156

0 commit comments

Comments
 (0)