From 7d4ef8938917fcbf293bfe88c62418d196edb013 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Thu, 12 Dec 2024 18:30:46 +0530 Subject: [PATCH] Add utility and cli to discover PURL on AP server Signed-off-by: Keshav Priyadarshi --- aboutcode/federatedcode/cli.py | 34 ++++++++++++++++++++-- aboutcode/federatedcode/client/__init__.py | 28 ++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/aboutcode/federatedcode/cli.py b/aboutcode/federatedcode/cli.py index b472b87..3830226 100644 --- a/aboutcode/federatedcode/cli.py +++ b/aboutcode/federatedcode/cli.py @@ -10,19 +10,47 @@ import click -from aboutcode.federatedcode.client import get_package_scan +from aboutcode.federatedcode import client + + +@click.group() +def handler(): + pass @click.command() @click.argument("purl") -def handler(purl): +def scan(purl): """ Get package scan for PURL from FederatedCode git repository. PURL: PURL to fetch scan result """ - click.echo(get_package_scan(purl=purl)) + click.echo(client.get_package_scan(purl=purl)) + + +@click.command() +@click.argument("purl") +def discover(purl): + """ + Discover existing Packages in the FederatedCode AP server. + + PURL: PURL to find in AP server + """ + if response := client.discover_package_in_ap_server(purl=purl): + click.echo(click.style(response, fg="green", bold=True)) + else: + click.echo( + click.style( + f"Error: {purl} not available on {client.FEDERATEDCODE_AP_HOST} AP server.", + fg="red", + bold=True, + ) + ) + +handler.add_command(scan) +handler.add_command(discover) if __name__ == "__main__": handler() diff --git a/aboutcode/federatedcode/client/__init__.py b/aboutcode/federatedcode/client/__init__.py index 8ba1405..1549312 100644 --- a/aboutcode/federatedcode/client/__init__.py +++ b/aboutcode/federatedcode/client/__init__.py @@ -24,6 +24,11 @@ "https://raw.githubusercontent.com/aboutcode-org/", ) +FEDERATEDCODE_AP_HOST = os.getenv( + "FEDERATEDCODE_AP_HOST", + "http://localhost:8000/", +) + class ScanNotAvailableError(Exception): pass @@ -68,3 +73,26 @@ def subscribe_package(federatedcode_host, remote_username, purl): url_path = f"api/v0/users/@{remote_username}/subscribe/?purl={quote(purl)}" return requests.get(urljoin(federatedcode_host, url_path)) + + +def discover_package_in_ap_server(purl: Union[str, PackageURL]): + """Return package profile if PURL exists in AP server.""" + + if not FEDERATEDCODE_AP_HOST: + raise ValueError("Provide ``FEDERATEDCODE_AP_HOST`` in .env file.") + + if isinstance(purl, str): + purl = PackageURL.from_string(purl) + + if purl.version or purl.subpath or purl.qualifiers: + purl = PackageURL( + type=purl.type, + namespace=purl.name, + name=purl.name, + ) + + package = quote(str(purl), safe=":/") + url = urljoin(FEDERATEDCODE_AP_HOST, f"/purls/@{package}") + response = requests.head(url, allow_redirects=True) + if response.status_code == 200: + return url