Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 31 additions & 3 deletions aboutcode/federatedcode/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
28 changes: 28 additions & 0 deletions aboutcode/federatedcode/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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