Skip to content

Commit 2403e5d

Browse files
mgornymaresb
andauthored
Fix some URL bugs (rebased) (#641)
* fix some URL bugs [rebased by Michał Górny <mgorny@quansight.com>] * Split into functions and add unit tests Signed-off-by: Michał Górny <mgorny@quansight.com> --------- Signed-off-by: Michał Górny <mgorny@quansight.com> Co-authored-by: Ben Mares <services-git-throwaway1@tensorial.com>
1 parent 66bd573 commit 2403e5d

3 files changed

Lines changed: 200 additions & 11 deletions

File tree

‎grayskull/strategy/py_base.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ def discover_license(metadata: dict) -> list[ShortLicense]:
569569
the license.
570570
"""
571571
git_url = metadata.get("dev_url")
572-
project_url = metadata.get("project_urls", "") or metadata.get("project_url", "")
572+
project_url = metadata.get("project_url", "")
573573
if not git_url and urlparse(project_url).netloc == "github.com":
574574
git_url = project_url
575575
# "url" is always present but sometimes set to None
@@ -732,7 +732,7 @@ def merge_setup_toml_metadata(setup_metadata: dict, pyproject_metadata: dict) ->
732732
if pyproject_metadata["about"]["summary"]:
733733
setup_metadata["summary"] = pyproject_metadata["about"]["summary"]
734734
if pyproject_metadata["about"]["home"]:
735-
setup_metadata["projects_url"]["Homepage"] = pyproject_metadata["about"]["home"]
735+
setup_metadata["project_urls"]["Homepage"] = pyproject_metadata["about"]["home"]
736736
if pyproject_metadata["build"]["entry_points"]:
737737
setup_metadata["entry_points"]["console_scripts"] = pyproject_metadata["build"][
738738
"entry_points"

‎grayskull/strategy/pypi.py‎

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,13 @@ def get_val(key):
104104
pypi_metadata.get("requires_python")
105105
or sdist_metadata.get("python_requires")
106106
),
107-
"doc_url": get_val("doc_url"),
107+
"docs_url": get_val("docs_url"),
108108
"dev_url": get_val("dev_url"),
109109
"license": get_val("license"),
110110
"setup_requires": get_val("setup_requires"),
111111
"extra_requires": get_val("extra_requires"),
112112
"project_url": get_val("project_url"),
113+
"project_urls": get_val("project_urls"),
113114
"extras_require": get_val("extras_require"),
114115
"requires_dist": requires_dist,
115116
"sdist_path": get_val("sdist_path"),
@@ -272,8 +273,9 @@ class PypiMetadata(TypedDict):
272273
requires_dist: list[str]
273274
requires_python: str | None
274275
summary: str | None
276+
project_url: str | None
275277
project_urls: dict[str, str]
276-
doc_url: str | None
278+
docs_url: str | None
277279
dev_url: str | None
278280
url: str | None
279281
license: str | None
@@ -312,7 +314,6 @@ def get_pypi_metadata(config: Configuration) -> PypiMetadata:
312314
json.dump(metadata, f, indent=4)
313315
config.files_to_copy.append(download_file)
314316
info = metadata["info"]
315-
project_urls = info.get("project_urls") or {}
316317
log.info(f"Package: {config.name}=={info['version']}")
317318
log.debug(f"Full PyPI metadata:\n{metadata}")
318319
sdist_url = get_sdist_url_from_pypi(metadata)
@@ -324,9 +325,11 @@ def get_pypi_metadata(config: Configuration) -> PypiMetadata:
324325
requires_dist=info.get("requires_dist", []),
325326
requires_python=info.get("requires_python"),
326327
summary=info.get("summary"),
327-
project_urls=info.get("project_urls") or info.get("project_url", {}),
328-
doc_url=info.get("docs_url"),
329-
dev_url=project_urls.get("Source"),
328+
project_url=info.get("project_url"),
329+
project_urls=info.get("project_urls") or {},
330+
docs_url=info.get("docs_url"),
331+
home_page=info.get("home_page"),
332+
dev_url=info.get("dev_url"),
330333
url=info.get("home_page"),
331334
license=info.get("license"),
332335
source=SourceSection(
@@ -391,6 +394,29 @@ def get_all_selectors_pypi(list_extra: list, config: Configuration) -> list:
391394
return result_selector
392395

393396

397+
def compute_home(metadata: dict) -> str | None:
398+
if metadata.get("project_urls") and metadata["project_urls"].get("Homepage"):
399+
return metadata["project_urls"]["Homepage"]
400+
elif metadata.get("project_url"):
401+
return metadata["project_url"]
402+
elif metadata.get("url"):
403+
return metadata["url"]
404+
405+
406+
def compute_doc_url(metadata: dict) -> str | None:
407+
if metadata.get("project_urls") and metadata["project_urls"].get("Documentation"):
408+
return metadata["project_urls"]["Documentation"]
409+
elif metadata.get("docs_url"):
410+
return metadata["docs_url"]
411+
412+
413+
def compute_dev_url(metadata: str) -> str | None:
414+
if metadata.get("project_urls") and metadata["project_urls"].get("Source"):
415+
return metadata["project_urls"]["Source"]
416+
elif metadata.get("dev_url"):
417+
return metadata["dev_url"]
418+
419+
394420
def get_metadata(recipe, config) -> dict:
395421
"""Method responsible to get the whole metadata available. It will
396422
merge metadata from multiple sources (pypi, setup.py, setup.cfg)
@@ -455,10 +481,10 @@ def get_metadata(recipe, config) -> dict:
455481
test_section = compose_test_section(metadata, test_requirements)
456482

457483
about_section = {
458-
"home": metadata["url"] if metadata.get("url") else metadata.get("project_url"),
484+
"home": compute_home(metadata),
459485
"summary": metadata.get("summary"),
460-
"doc_url": metadata.get("doc_url"),
461-
"dev_url": metadata.get("dev_url"),
486+
"doc_url": compute_doc_url(metadata),
487+
"dev_url": compute_dev_url(metadata),
462488
"license": license_name,
463489
"license_file": license_file,
464490
}

‎tests/test_pypi.py‎

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
PypiStrategy,
3939
check_noarch_python_for_new_deps,
4040
compose_test_section,
41+
compute_dev_url,
42+
compute_doc_url,
43+
compute_home,
4144
extract_optional_requirements,
4245
extract_requirements,
4346
get_all_selectors_pypi,
@@ -1779,3 +1782,163 @@ def test_pypi_names_in_config_yaml_are_canonical():
17791782
)
17801783
+ "\n"
17811784
)
1785+
1786+
1787+
def test_compute_dev_url():
1788+
assert (
1789+
compute_dev_url({"dev_url": "https://example.com/git"})
1790+
== "https://example.com/git"
1791+
)
1792+
assert (
1793+
compute_dev_url(
1794+
{
1795+
"project_urls": {"Homepage": "https://example.com"},
1796+
"dev_url": "https://example.com/git",
1797+
}
1798+
)
1799+
== "https://example.com/git"
1800+
)
1801+
assert (
1802+
compute_dev_url(
1803+
{
1804+
"project_urls": {
1805+
"Homepage": "https://example.com",
1806+
"Source": "https://example.com/newgit",
1807+
},
1808+
"dev_url": "https://example.com/git",
1809+
}
1810+
)
1811+
== "https://example.com/newgit"
1812+
)
1813+
assert (
1814+
compute_dev_url(
1815+
{
1816+
"project_urls": {
1817+
"Homepage": "https://example.com",
1818+
"Source": "https://example.com/newgit",
1819+
},
1820+
}
1821+
)
1822+
== "https://example.com/newgit"
1823+
)
1824+
assert (
1825+
compute_dev_url(
1826+
{
1827+
"project_urls": {"Homepage": "https://example.com"},
1828+
}
1829+
)
1830+
is None
1831+
)
1832+
assert compute_dev_url({}) is None
1833+
1834+
1835+
def test_compute_doc_url():
1836+
assert (
1837+
compute_doc_url({"docs_url": "https://example.com/doc"})
1838+
== "https://example.com/doc"
1839+
)
1840+
assert (
1841+
compute_doc_url(
1842+
{
1843+
"project_urls": {"Homepage": "https://example.com"},
1844+
"docs_url": "https://example.com/doc",
1845+
}
1846+
)
1847+
== "https://example.com/doc"
1848+
)
1849+
assert (
1850+
compute_doc_url(
1851+
{
1852+
"project_urls": {
1853+
"Homepage": "https://example.com",
1854+
"Documentation": "https://example.com/newdoc",
1855+
},
1856+
"docs_url": "https://example.com/doc",
1857+
}
1858+
)
1859+
== "https://example.com/newdoc"
1860+
)
1861+
assert (
1862+
compute_doc_url(
1863+
{
1864+
"project_urls": {
1865+
"Homepage": "https://example.com",
1866+
"Documentation": "https://example.com/newdoc",
1867+
},
1868+
}
1869+
)
1870+
== "https://example.com/newdoc"
1871+
)
1872+
assert (
1873+
compute_doc_url(
1874+
{
1875+
"project_urls": {"Homepage": "https://example.com"},
1876+
}
1877+
)
1878+
is None
1879+
)
1880+
assert compute_doc_url({}) is None
1881+
1882+
1883+
def test_compute_home():
1884+
assert compute_home({"url": "https://example.com/old"}) == "https://example.com/old"
1885+
assert compute_home({"project_url": "https://example.com"}) == "https://example.com"
1886+
assert (
1887+
compute_home(
1888+
{
1889+
"project_urls": {"Homepage": "https://example.com/new"},
1890+
}
1891+
)
1892+
== "https://example.com/new"
1893+
)
1894+
assert (
1895+
compute_home(
1896+
{
1897+
"project_urls": {
1898+
"Source": "https://example.com/git",
1899+
},
1900+
"project_url": "https://example.com",
1901+
}
1902+
)
1903+
== "https://example.com"
1904+
)
1905+
assert (
1906+
compute_home(
1907+
{
1908+
"project_urls": {
1909+
"Source": "https://example.com/git",
1910+
},
1911+
"url": "https://example.com/old",
1912+
}
1913+
)
1914+
== "https://example.com/old"
1915+
)
1916+
assert (
1917+
compute_home(
1918+
{
1919+
"project_urls": {
1920+
"Homepage": "https://example.com/new",
1921+
},
1922+
"project_url": "https://example.com",
1923+
"url": "https://example.com/old",
1924+
}
1925+
)
1926+
== "https://example.com/new"
1927+
)
1928+
assert (
1929+
compute_home(
1930+
{"project_url": "https://example.com", "url": "https://example.com/old"}
1931+
)
1932+
== "https://example.com"
1933+
)
1934+
assert (
1935+
compute_home(
1936+
{
1937+
"project_urls": {
1938+
"Source": "https://example.com/git",
1939+
},
1940+
}
1941+
)
1942+
is None
1943+
)
1944+
assert compute_home({}) is None

0 commit comments

Comments
 (0)