From b36d91d664244189c7377d26f4522480dc6e1454 Mon Sep 17 00:00:00 2001 From: vlorentz <vlorentz@softwareheritage.org> Date: Fri, 12 May 2023 13:51:44 +0000 Subject: [PATCH] Populate every software origin's page with logo and basic links --- docs/.gitignore | 2 +- docs/user/Makefile | 11 +- docs/user/software-origins/arch.rst | 2 + docs/user/software-origins/archive.rst | 2 + docs/user/software-origins/aur.rst | 2 + docs/user/software-origins/bitbucket.rst | 2 + docs/user/software-origins/bower.rst | 2 + docs/user/software-origins/bzr.rst | 2 + docs/user/software-origins/cgit.rst | 2 + docs/user/software-origins/conda.rst | 2 + docs/user/software-origins/cpan.rst | 2 + docs/user/software-origins/cran.rst | 2 + docs/user/software-origins/crates.rst | 2 + docs/user/software-origins/cvs.rst | 2 + docs/user/software-origins/debian.rst | 2 + docs/user/software-origins/deposit.rst | 2 + docs/user/software-origins/dynamic/.gitkeep | 0 docs/user/software-origins/git.rst | 2 + docs/user/software-origins/gitea.rst | 2 + docs/user/software-origins/github.rst | 2 + docs/user/software-origins/gitlab.rst | 2 + docs/user/software-origins/gnu.rst | 2 + docs/user/software-origins/gogs.rst | 2 + docs/user/software-origins/golang.rst | 2 + docs/user/software-origins/hackage.rst | 2 + docs/user/software-origins/index.rst | 2 +- docs/user/software-origins/launchpad.rst | 2 + docs/user/software-origins/maven.rst | 2 + docs/user/software-origins/mercurial.rst | 2 + docs/user/software-origins/nixguix.rst | 2 + docs/user/software-origins/npm.rst | 2 + docs/user/software-origins/opam.rst | 2 + docs/user/software-origins/packagist.rst | 2 + docs/user/software-origins/phabricator.rst | 2 + docs/user/software-origins/pubdev.rst | 2 + docs/user/software-origins/puppet.rst | 2 + docs/user/software-origins/pypi.rst | 2 + docs/user/software-origins/rubygems.rst | 2 + docs/user/software-origins/sourceforge.rst | 2 + docs/user/software-origins/svn.rst | 2 + docs/user/software-origins/tuleap.rst | 2 + swh/docs/generate_software_origin_status.py | 143 ++++++++++++++++++++ swh/docs/generate_software_origins_list.py | 98 +++----------- swh/docs/software_origins.py | 89 ++++++++++++ 44 files changed, 331 insertions(+), 88 deletions(-) create mode 100644 docs/user/software-origins/dynamic/.gitkeep create mode 100644 swh/docs/generate_software_origin_status.py create mode 100644 swh/docs/software_origins.py diff --git a/docs/.gitignore b/docs/.gitignore index dc3d23da..e01a1f16 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -3,4 +3,4 @@ _build/ devel/swh-* !/swh-loader.rst sources/ -user/software-origins/table.inc +user/software-origins/dynamic/*.inc diff --git a/docs/user/Makefile b/docs/user/Makefile index 714e1221..b471bbd3 100644 --- a/docs/user/Makefile +++ b/docs/user/Makefile @@ -10,10 +10,13 @@ BUILDDIR = _build all: html -software-origins/table.inc: ../software-origins-support.yml ../../swh/docs/generate_software_origins_list.py - python3 ../../swh/docs/generate_software_origins_list.py ../software-origins-support.yml software-origins/table.inc +software-origins/dynamic/table.inc: ../software-origins-support.yml ../../swh/docs/generate_software_origins_list.py ../../swh/docs/generate_software_origin_status.py + python3 -m swh.docs.generate_software_origins_list ../software-origins-support.yml software-origins/dynamic/table.inc + # technically the following should be in its own target, but it would be + # overly complicated. + python3 -m swh.docs.generate_software_origin_status ../software-origins-support.yml software-origins/dynamic/ -dynamic-rst: software-origins/table.inc +dynamic-rst: software-origins/dynamic/table.inc # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). @@ -23,6 +26,6 @@ sphinx/%: Makefile dynamic-rst html: sphinx/html clean: sphinx/clean - rm -f software-origins/table.inc + rm -f software-origins/dynamic/*.inc .PHONY: html clean dynamic-rst diff --git a/docs/user/software-origins/arch.rst b/docs/user/software-origins/arch.rst index 5b1a25cf..07d9a223 100644 --- a/docs/user/software-origins/arch.rst +++ b/docs/user/software-origins/arch.rst @@ -5,3 +5,5 @@ Archlinux .. todo:: This page is a work in progress. + +.. include:: dynamic/arch_status.inc diff --git a/docs/user/software-origins/archive.rst b/docs/user/software-origins/archive.rst index 839f7866..1b75670c 100644 --- a/docs/user/software-origins/archive.rst +++ b/docs/user/software-origins/archive.rst @@ -5,3 +5,5 @@ Archive loader .. todo:: This page is a work in progress. + +.. include:: dynamic/archive_status.inc diff --git a/docs/user/software-origins/aur.rst b/docs/user/software-origins/aur.rst index 2bbcff2a..ecf226c6 100644 --- a/docs/user/software-origins/aur.rst +++ b/docs/user/software-origins/aur.rst @@ -5,3 +5,5 @@ AUR .. todo:: This page is a work in progress. + +.. include:: dynamic/aur_status.inc diff --git a/docs/user/software-origins/bitbucket.rst b/docs/user/software-origins/bitbucket.rst index ebfd2db1..fc6dbef3 100644 --- a/docs/user/software-origins/bitbucket.rst +++ b/docs/user/software-origins/bitbucket.rst @@ -5,3 +5,5 @@ Bitbucket .. todo:: This page is a work in progress. + +.. include:: dynamic/bitbucket_status.inc diff --git a/docs/user/software-origins/bower.rst b/docs/user/software-origins/bower.rst index da2c4aee..19bcd8ac 100644 --- a/docs/user/software-origins/bower.rst +++ b/docs/user/software-origins/bower.rst @@ -5,3 +5,5 @@ Bower .. todo:: This page is a work in progress. + +.. include:: dynamic/bower_status.inc diff --git a/docs/user/software-origins/bzr.rst b/docs/user/software-origins/bzr.rst index 63c5eccc..5a66361f 100644 --- a/docs/user/software-origins/bzr.rst +++ b/docs/user/software-origins/bzr.rst @@ -5,3 +5,5 @@ Bazaar .. todo:: This page is a work in progress. + +.. include:: dynamic/bzr_status.inc diff --git a/docs/user/software-origins/cgit.rst b/docs/user/software-origins/cgit.rst index 0fca5688..b243d8f9 100644 --- a/docs/user/software-origins/cgit.rst +++ b/docs/user/software-origins/cgit.rst @@ -5,3 +5,5 @@ Cgit .. todo:: This page is a work in progress. + +.. include:: dynamic/cgit_status.inc diff --git a/docs/user/software-origins/conda.rst b/docs/user/software-origins/conda.rst index 2036c2c3..5ac13ad6 100644 --- a/docs/user/software-origins/conda.rst +++ b/docs/user/software-origins/conda.rst @@ -5,3 +5,5 @@ Conda .. todo:: This page is a work in progress. + +.. include:: dynamic/conda_status.inc diff --git a/docs/user/software-origins/cpan.rst b/docs/user/software-origins/cpan.rst index 3b87d083..6b3a172c 100644 --- a/docs/user/software-origins/cpan.rst +++ b/docs/user/software-origins/cpan.rst @@ -5,3 +5,5 @@ CPAN .. todo:: This page is a work in progress. + +.. include:: dynamic/cpan_status.inc diff --git a/docs/user/software-origins/cran.rst b/docs/user/software-origins/cran.rst index 007c11b1..6bb728a7 100644 --- a/docs/user/software-origins/cran.rst +++ b/docs/user/software-origins/cran.rst @@ -5,3 +5,5 @@ CRAN .. todo:: This page is a work in progress. + +.. include:: dynamic/cran_status.inc diff --git a/docs/user/software-origins/crates.rst b/docs/user/software-origins/crates.rst index da208fbc..e8388e1f 100644 --- a/docs/user/software-origins/crates.rst +++ b/docs/user/software-origins/crates.rst @@ -5,3 +5,5 @@ Crates .. todo:: This page is a work in progress. + +.. include:: dynamic/crates_status.inc diff --git a/docs/user/software-origins/cvs.rst b/docs/user/software-origins/cvs.rst index f4b1ceda..16f72c99 100644 --- a/docs/user/software-origins/cvs.rst +++ b/docs/user/software-origins/cvs.rst @@ -5,3 +5,5 @@ CVS .. todo:: This page is a work in progress. + +.. include:: dynamic/cvs_status.inc diff --git a/docs/user/software-origins/debian.rst b/docs/user/software-origins/debian.rst index 5936a86f..014876d9 100644 --- a/docs/user/software-origins/debian.rst +++ b/docs/user/software-origins/debian.rst @@ -5,3 +5,5 @@ Debian .. todo:: This page is a work in progress. + +.. include:: dynamic/debian_status.inc diff --git a/docs/user/software-origins/deposit.rst b/docs/user/software-origins/deposit.rst index b108f66c..870595bc 100644 --- a/docs/user/software-origins/deposit.rst +++ b/docs/user/software-origins/deposit.rst @@ -5,3 +5,5 @@ Deposit .. todo:: This page is a work in progress. + +.. include:: dynamic/deposit_status.inc diff --git a/docs/user/software-origins/dynamic/.gitkeep b/docs/user/software-origins/dynamic/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/user/software-origins/git.rst b/docs/user/software-origins/git.rst index 8941b79e..815770f3 100644 --- a/docs/user/software-origins/git.rst +++ b/docs/user/software-origins/git.rst @@ -5,3 +5,5 @@ Git .. todo:: This page is a work in progress. + +.. include:: dynamic/git_status.inc diff --git a/docs/user/software-origins/gitea.rst b/docs/user/software-origins/gitea.rst index 9965cb89..8f28f579 100644 --- a/docs/user/software-origins/gitea.rst +++ b/docs/user/software-origins/gitea.rst @@ -5,3 +5,5 @@ Gitea .. todo:: This page is a work in progress. + +.. include:: dynamic/gitea_status.inc diff --git a/docs/user/software-origins/github.rst b/docs/user/software-origins/github.rst index 4a6212ef..e5b57f38 100644 --- a/docs/user/software-origins/github.rst +++ b/docs/user/software-origins/github.rst @@ -5,3 +5,5 @@ GitHub .. todo:: This page is a work in progress. + +.. include:: dynamic/github_status.inc diff --git a/docs/user/software-origins/gitlab.rst b/docs/user/software-origins/gitlab.rst index 1663eb74..98a988ed 100644 --- a/docs/user/software-origins/gitlab.rst +++ b/docs/user/software-origins/gitlab.rst @@ -5,3 +5,5 @@ GitLab .. todo:: This page is a work in progress. + +.. include:: dynamic/gitlab_status.inc diff --git a/docs/user/software-origins/gnu.rst b/docs/user/software-origins/gnu.rst index 2496e3b3..5aadba67 100644 --- a/docs/user/software-origins/gnu.rst +++ b/docs/user/software-origins/gnu.rst @@ -5,3 +5,5 @@ GNU projects .. todo:: This page is a work in progress. + +.. include:: dynamic/gnu_status.inc diff --git a/docs/user/software-origins/gogs.rst b/docs/user/software-origins/gogs.rst index fb67e30a..cadfb989 100644 --- a/docs/user/software-origins/gogs.rst +++ b/docs/user/software-origins/gogs.rst @@ -5,3 +5,5 @@ Gogs .. todo:: This page is a work in progress. + +.. include:: dynamic/gogs_status.inc diff --git a/docs/user/software-origins/golang.rst b/docs/user/software-origins/golang.rst index 93d927d7..65154b63 100644 --- a/docs/user/software-origins/golang.rst +++ b/docs/user/software-origins/golang.rst @@ -5,3 +5,5 @@ Golang .. todo:: This page is a work in progress. + +.. include:: dynamic/golang_status.inc diff --git a/docs/user/software-origins/hackage.rst b/docs/user/software-origins/hackage.rst index adc66fe2..c59f46e5 100644 --- a/docs/user/software-origins/hackage.rst +++ b/docs/user/software-origins/hackage.rst @@ -5,3 +5,5 @@ Hackage .. todo:: This page is a work in progress. + +.. include:: dynamic/hackage_status.inc diff --git a/docs/user/software-origins/index.rst b/docs/user/software-origins/index.rst index c71aa048..63cec163 100644 --- a/docs/user/software-origins/index.rst +++ b/docs/user/software-origins/index.rst @@ -15,4 +15,4 @@ or Version Control System (VCS). This page references all available forges/PMs/VCSs supported by |swh| loaders and/or listers, and links to their high-level documentation. -.. include:: table.inc +.. include:: dynamic/table.inc diff --git a/docs/user/software-origins/launchpad.rst b/docs/user/software-origins/launchpad.rst index 19c29b63..ee285506 100644 --- a/docs/user/software-origins/launchpad.rst +++ b/docs/user/software-origins/launchpad.rst @@ -5,3 +5,5 @@ Launchpad .. todo:: This page is a work in progress. + +.. include:: dynamic/launchpad_status.inc diff --git a/docs/user/software-origins/maven.rst b/docs/user/software-origins/maven.rst index 4afcefb6..bd163be4 100644 --- a/docs/user/software-origins/maven.rst +++ b/docs/user/software-origins/maven.rst @@ -5,3 +5,5 @@ Maven .. todo:: This page is a work in progress. + +.. include:: dynamic/maven_status.inc diff --git a/docs/user/software-origins/mercurial.rst b/docs/user/software-origins/mercurial.rst index 8bc4ff46..e7563c07 100644 --- a/docs/user/software-origins/mercurial.rst +++ b/docs/user/software-origins/mercurial.rst @@ -5,3 +5,5 @@ Mercurial .. todo:: This page is a work in progress. + +.. include:: dynamic/mercurial_status.inc diff --git a/docs/user/software-origins/nixguix.rst b/docs/user/software-origins/nixguix.rst index 2ede5de8..dd042fa6 100644 --- a/docs/user/software-origins/nixguix.rst +++ b/docs/user/software-origins/nixguix.rst @@ -5,3 +5,5 @@ Nix and Guix .. todo:: This page is a work in progress. + +.. include:: dynamic/nixguix_status.inc diff --git a/docs/user/software-origins/npm.rst b/docs/user/software-origins/npm.rst index 253269b8..49f4a8f1 100644 --- a/docs/user/software-origins/npm.rst +++ b/docs/user/software-origins/npm.rst @@ -5,3 +5,5 @@ NPM .. todo:: This page is a work in progress. + +.. include:: dynamic/npm_status.inc diff --git a/docs/user/software-origins/opam.rst b/docs/user/software-origins/opam.rst index 4c542e03..88a5834b 100644 --- a/docs/user/software-origins/opam.rst +++ b/docs/user/software-origins/opam.rst @@ -5,3 +5,5 @@ Opam .. todo:: This page is a work in progress. + +.. include:: dynamic/opam_status.inc diff --git a/docs/user/software-origins/packagist.rst b/docs/user/software-origins/packagist.rst index 43a218a6..f51ece25 100644 --- a/docs/user/software-origins/packagist.rst +++ b/docs/user/software-origins/packagist.rst @@ -5,3 +5,5 @@ Packagist .. todo:: This page is a work in progress. + +.. include:: dynamic/packagist_status.inc diff --git a/docs/user/software-origins/phabricator.rst b/docs/user/software-origins/phabricator.rst index b7a646a0..f86258a6 100644 --- a/docs/user/software-origins/phabricator.rst +++ b/docs/user/software-origins/phabricator.rst @@ -5,3 +5,5 @@ Phabricator .. todo:: This page is a work in progress. + +.. include:: dynamic/phabricator_status.inc diff --git a/docs/user/software-origins/pubdev.rst b/docs/user/software-origins/pubdev.rst index 9133b772..1fc7bf75 100644 --- a/docs/user/software-origins/pubdev.rst +++ b/docs/user/software-origins/pubdev.rst @@ -5,3 +5,5 @@ Pub.Dev .. todo:: This page is a work in progress. + +.. include:: dynamic/pubdev_status.inc diff --git a/docs/user/software-origins/puppet.rst b/docs/user/software-origins/puppet.rst index 5469cac0..e77efacf 100644 --- a/docs/user/software-origins/puppet.rst +++ b/docs/user/software-origins/puppet.rst @@ -5,3 +5,5 @@ Puppet .. todo:: This page is a work in progress. + +.. include:: dynamic/puppet_status.inc diff --git a/docs/user/software-origins/pypi.rst b/docs/user/software-origins/pypi.rst index 54b651a6..8fe948b0 100644 --- a/docs/user/software-origins/pypi.rst +++ b/docs/user/software-origins/pypi.rst @@ -5,3 +5,5 @@ PyPI .. todo:: This page is a work in progress. + +.. include:: dynamic/pypi_status.inc diff --git a/docs/user/software-origins/rubygems.rst b/docs/user/software-origins/rubygems.rst index 33dc484f..37ff1dda 100644 --- a/docs/user/software-origins/rubygems.rst +++ b/docs/user/software-origins/rubygems.rst @@ -5,3 +5,5 @@ RubyGems .. todo:: This page is a work in progress. + +.. include:: dynamic/rubygems_status.inc diff --git a/docs/user/software-origins/sourceforge.rst b/docs/user/software-origins/sourceforge.rst index dd1bc933..533e06f5 100644 --- a/docs/user/software-origins/sourceforge.rst +++ b/docs/user/software-origins/sourceforge.rst @@ -5,3 +5,5 @@ SourceForge .. todo:: This page is a work in progress. + +.. include:: dynamic/sourceforge_status.inc diff --git a/docs/user/software-origins/svn.rst b/docs/user/software-origins/svn.rst index d0208d72..c36ebeac 100644 --- a/docs/user/software-origins/svn.rst +++ b/docs/user/software-origins/svn.rst @@ -5,3 +5,5 @@ Subversion .. todo:: This page is a work in progress. + +.. include:: dynamic/svn_status.inc diff --git a/docs/user/software-origins/tuleap.rst b/docs/user/software-origins/tuleap.rst index 2dbf43dd..d718a5a9 100644 --- a/docs/user/software-origins/tuleap.rst +++ b/docs/user/software-origins/tuleap.rst @@ -5,3 +5,5 @@ Tuleap .. todo:: This page is a work in progress. + +.. include:: dynamic/tuleap_status.inc diff --git a/swh/docs/generate_software_origin_status.py b/swh/docs/generate_software_origin_status.py new file mode 100644 index 00000000..111b6cee --- /dev/null +++ b/swh/docs/generate_software_origin_status.py @@ -0,0 +1,143 @@ +# Copyright (C) 2023 The Software Heritage developers +# See the AUTHORS file at the top-level directory of this distribution +# License: GNU General Public License version 3, or any later version +# See top-level LICENSE file for more information + +"""Reads :file:`docs/software-origins-support.yml` and generates ReST documents +which are included each in a forge's page to summarize its status and link +to other documentation page""" + +from pathlib import Path +import sys + +from .software_origins import parse + + +def write_status(data, forge_id, file) -> None: + forge = data.forges[forge_id] + + has_loader = forge["loader"]["status"] != "N/A" + has_lister = forge["lister"]["status"] != "N/A" + + links_cell = "" + + if forge.status == "dev": + status_cell = f"Archival for {forge.name} is currently in development:\n\n" + elif forge.status in ("staging", "prod"): + if forge.status == "staging": + status_cell = ( + f"{forge.name} is currently archived only on " + f"the staging infrastructure:\n\n" + ) + else: + status_cell = ( + f"{forge.name} is currently archived by Software Heritage:\n\n" + ) + + if has_loader: + links_cell += f"* `Browse\N{NBSP}origins <{forge.origins}>`__\n" + if has_lister: + links_cell += f"* `See\N{NBSP}coverage <{forge.coverage}>`__\n" + else: + assert False, f"Unexpected status {forge.status!r} for {forge_id}" + + if has_loader: + links_cell += ( + f"* `Loader Source Code <{forge.loader.source}>`__\n" + f"* :mod:`Loader Developer documentation <{forge.loader.package_name}>`" + f"\n" + ) + if has_lister: + links_cell += ( + f"* `Lister Source Code <{forge.lister.source}>`__\n" + f"* :mod:`Lister Developer documentation <{forge.lister.package_name}>`" + f"\n" + ) + + loader_issue = forge["loader"].get("issue") + lister_issue = forge["lister"].get("issue") + if loader_issue and lister_issue: + if loader_issue == lister_issue: + links_cell += f"* `Tracking issue <{loader_issue}>`__\n\n" + else: + links_cell += ( + f"* `Tracking loader issue <{loader_issue}>`__\n\n" + f"* `Tracking lister issue <{lister_issue}>`__\n\n" + ) + elif not loader_issue and not lister_issue: + pass + elif lister_issue: + if has_loader: + status_cell += f"* `Lister Tracking issue <{lister_issue}>`__\n\n" + else: + status_cell += f"* `Tracking issue <{lister_issue}>`__\n\n" + elif loader_issue: + if has_loader: + status_cell += f"* `Loader Tracking issue <{loader_issue}>`__\n\n" + else: + status_cell += f"* `Tracking issue <{loader_issue}>`__\n\n" + else: + assert False, f"The impossible happened for {forge_id}" + + notes = forge.get("notes") + if notes: + status_cell = f"{status_cell}\n\n{notes}" + + grant_id = forge.get("grant") + grant = data["grants"][grant_id] if grant_id else None + developer_id = forge.get("developer") + if grant: + assert developer_id, f"{forge_id} has grant but no developer" + developer = data["developers"][developer_id] + + # TODO: grammar is hard; we may want to write 'grant from the XXX Foundation' + # but also 'grant from XXX' sometimes. + # For now, only foundations provide grants. + assert grant.funder.endswith(" Foundation") + + grant_cell = ( + f"Developed by `{developer['name']} <{developer['url']}>`__ " + f"thanks to a `grant from the {grant.funder} <{grant.announcement}>`__ " + ) + else: + assert not developer_id, f"{forge_id} has developer but no grant" + grant_cell = "" + + file.write(status_cell) + file.write(links_cell) + file.write("\n") + file.write(grant_cell) + + file.write("\n") + + +def write_logo(data, forge_id, file) -> None: + forge = data.forges[forge_id] + file.write( + f".. image:: ../logos/{forge_id}.png\n" + f" :alt: {forge['name']} logo\n" + f" :align: right" + f"\n\n" + ) + + +def main(input_path: Path, output_dir: Path) -> None: + data = parse(input_path) + + for forge_id in data.forges: + with (output_dir / f"{forge_id}_status.inc").open("wt") as output_file: + write_logo(data, forge_id, output_file) + write_status(data, forge_id, output_file) + + +if __name__ == "__main__": + try: + (_, input_path, output_path) = sys.argv + except ValueError: + print( + f"Syntax: {sys.argv[0]} docs/devel/forge-support.yml " + f"docs/user/software-origins/", + sys.stderr, + ) + exit(1) + main(Path(input_path), Path(output_path)) diff --git a/swh/docs/generate_software_origins_list.py b/swh/docs/generate_software_origins_list.py index fcfd1bc6..5c0737e0 100644 --- a/swh/docs/generate_software_origins_list.py +++ b/swh/docs/generate_software_origins_list.py @@ -11,7 +11,8 @@ import sys import textwrap import tabulate -import yaml + +from .software_origins import parse PRELUDE = """ .. This file was generated by swh/docs/generate_software_origins_list.py @@ -40,108 +41,41 @@ def write_table(data, file) -> None: f"<user-software-origins-{forge_id}>`" ) + links.append((f"{forge_id}-loader-source", forge.loader.source)) + links.append((f"{forge_id}-lister-source", forge.lister.source)) + has_loader = forge["loader"]["status"] != "N/A" has_lister = forge["lister"]["status"] != "N/A" - assert has_loader or has_lister, f"{forge_id} has neither loader nor lister" - - if has_loader and has_lister: - # We may want to do this eventually, but it never happened so far. - assert ( - forge["loader"]["status"] == forge["lister"]["status"] - ), f"Loader and lister statuses for {forge_id} are not the same." - - status = forge["loader"]["status"] if has_loader else forge["lister"]["status"] - - default_loader_source = ( - f"https://gitlab.softwareheritage.org/swh/devel/swh-loader-core/-/" - f"tree/master/swh/loader/package/{forge_id}" - ) - default_loader_package_name = f"swh.loader.package.{forge_id}" - default_lister_source = ( - f"https://gitlab.softwareheritage.org/swh/devel/swh-lister/-/" - f"tree/master/swh/lister/{forge_id}" - ) - default_lister_package_name = f"swh.lister.{forge_id}" - - loader_package_name = forge["loader"].get( - "package_name", default_loader_package_name - ) - lister_package_name = forge["lister"].get( - "package_name", default_lister_package_name - ) - links.append( - ( - f"{forge_id}-loader-source", - forge["loader"].get("source", default_loader_source), - ) - ) - links.append( - ( - f"{forge_id}-lister-source", - forge["lister"].get("source", default_lister_source), - ) - ) - - loader_id_in_swh_web = forge["loader"].get("id_in_swh_web", forge_id) - lister_id_in_swh_web = forge["lister"].get("id_in_swh_web", forge_id) - - if status == "dev": + if forge.status == "dev": status_cell = "In\N{NBSP}development\n\n" - elif status in ("staging", "prod"): - if status == "staging": + elif forge.status in ("staging", "prod"): + links.append((f"{forge_id}-origins", forge.origins)) + links.append((f"{forge_id}-coverage", forge.coverage)) + if forge.status == "staging": status_cell = "In\N{NBSP}staging\n\n" - links.append( - ( - f"{forge_id}-origins", - "https://webapp.staging.swh.network/browse/search/" - f"?with_visit=true&with_content=true" - f"&visit_type={loader_id_in_swh_web}", - ) - ) - links.append( - ( - f"{forge_id}-coverage", - "https://webapp.staging.swh.network/coverage/" - f"?focus={lister_id_in_swh_web}#{lister_id_in_swh_web}", - ) - ) else: - # status == "prod" status_cell = "In\N{NBSP}production\n\n" - links.append( - ( - f"{forge_id}-origins", - f"https://archive.softwareheritage.org/browse/search/" - f"?with_visit=true&with_content=true" - f"&visit_type={loader_id_in_swh_web}", - ) - ) - links.append( - ( - f"{forge_id}-coverage", - f"https://archive.softwareheritage.org/coverage/" - f"?focus={lister_id_in_swh_web}#{lister_id_in_swh_web}", - ) - ) if has_loader: status_cell += f"`Browse\N{NBSP}origins <{forge_id}-origins_>`__\n\n" if has_lister: status_cell += f"`See\N{NBSP}coverage <{forge_id}-coverage_>`__\n\n" else: - assert False, f"Unexpected status {status!r} for {forge_id}" + assert False, f"Unexpected status {forge.status!r} for {forge_id}" links_cell = "" if has_loader: links_cell += ( f"* `Loader Source Code <{forge_id}-loader-source_>`__\n" - f"* :mod:`Loader Developer documentation <{loader_package_name}>`\n" + f"* :mod:`Loader Developer documentation <{forge.loader.package_name}>`" + f"\n" ) if has_lister: links_cell += ( f"* `Lister Source Code <{forge_id}-lister-source_>`__\n" - f"* :mod:`Lister Developer documentation <{lister_package_name}>`\n" + f"* :mod:`Lister Developer documentation <{forge.lister.package_name}>`" + f"\n" ) loader_issue = forge["loader"].get("issue") @@ -231,7 +165,7 @@ def write_grants(data, file) -> None: def main(input_path: Path, output_path: Path) -> None: - data = yaml.safe_load(input_path.read_text()) + data = parse(input_path) with output_path.open("wt") as output_file: output_file.write(PRELUDE.format(source_yml=input_path)) diff --git a/swh/docs/software_origins.py b/swh/docs/software_origins.py new file mode 100644 index 00000000..baa5ed36 --- /dev/null +++ b/swh/docs/software_origins.py @@ -0,0 +1,89 @@ +# Copyright (C) 2023 The Software Heritage developers +# See the AUTHORS file at the top-level directory of this distribution +# License: GNU General Public License version 3, or any later version +# See top-level LICENSE file for more information + +"""Parser for :file:`docs/devel/software-origins-support.yml` +""" + +import collections +from pathlib import Path + +import yaml + + +class DotDict(collections.UserDict): + """Like a dictionary, but can be accessed with ``.key`` in addition to + ``[key]``, to simplify f-string.""" + + def __init__(self, d): + d = { + key: DotDict(value) if isinstance(value, dict) else value + for (key, value) in d.items() + } + super().__setattr__("data", d) + + def __getattr__(self, key): + try: + return self.data[key] + except KeyError as e: + raise AttributeError(*e.args) from None + + def __setattr__(self, key, value): + self.data[key] = value + + +def parse(input_path: Path): + data = DotDict(yaml.safe_load(input_path.read_text())) + + for (forge_id, forge) in sorted(data["forges"].items()): + forge.loader.setdefault( + "source", + f"https://gitlab.softwareheritage.org/swh/devel/swh-loader-core/-/" + f"tree/master/swh/loader/package/{forge_id}", + ) + forge.lister.setdefault( + "source", + f"https://gitlab.softwareheritage.org/swh/devel/swh-lister/-/" + f"tree/master/swh/lister/{forge_id}", + ) + + forge.loader.setdefault("package_name", f"swh.loader.package.{forge_id}") + forge.lister.setdefault("package_name", f"swh.lister.{forge_id}") + + forge.loader.setdefault("id_in_swh_web", forge_id) + forge.lister.setdefault("id_in_swh_web", forge_id) + + has_loader = forge["loader"]["status"] != "N/A" + has_lister = forge["lister"]["status"] != "N/A" + + assert has_loader or has_lister, f"{forge_id} has neither loader nor lister" + + if has_loader and has_lister: + # We may want to do this eventually, but it never happened so far. + assert ( + forge["loader"]["status"] == forge["lister"]["status"] + ), f"Loader and lister statuses for {forge_id} are not the same." + + forge.status = ( + forge["loader"]["status"] if has_loader else forge["lister"]["status"] + ) + + if forge.status == "dev": + forge.origins = None + forge.coverage = None + elif forge.status in ("staging", "prod"): + if forge.status == "staging": + archive_base_url = "https://webapp.staging.swh.network" + else: + archive_base_url = "https://archive.softwareheritage.org" + forge.origins = ( + f"{archive_base_url}/browse/search/?with_visit=true&with_content=true" + f"&visit_type={forge.loader.id_in_swh_web}" + ) + forge.coverage = ( + f"{archive_base_url}/coverage" + f"focus={forge.lister.id_in_swh_web}#{forge.lister.id_in_swh_web}" + ) + + return data -- GitLab