Source code for swh.docs.software_origins
# 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
[docs]
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 
[docs]
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