Skip to content

Commit

Permalink
Merge pull request #462 from zapta/develop
Browse files Browse the repository at this point in the history
Platforms, package installation, and more.
  • Loading branch information
Obijuan authored Nov 17, 2024
2 parents d2c5bb3 + ae58623 commit a9cc221
Show file tree
Hide file tree
Showing 25 changed files with 1,312 additions and 883 deletions.
10 changes: 4 additions & 6 deletions apio/cmd_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def fatal_usage_error(ctx: click.Context, msg: str) -> None:
f"Try '{ctx.command_path} {ctx.help_option_names[0]}' for help."
)
click.secho()
click.secho(f"Error: {msg}")
click.secho(f"Error: {msg}", fg="red")
ctx.exit(1)


Expand Down Expand Up @@ -132,7 +132,7 @@ def check_at_most_one_param(ctx: click.Context, param_ids: List[str]) -> None:
if len(specified_param_ids) >= 2:
canonical_aliases = _params_ids_to_aliases(ctx, specified_param_ids)
aliases_str = ", ".join(canonical_aliases)
fatal_usage_error(ctx, f"{aliases_str} are mutually exclusive.")
fatal_usage_error(ctx, f"[{aliases_str}] are mutually exclusive.")


def check_exactly_one_param(ctx: click.Context, param_ids: List[str]) -> None:
Expand All @@ -151,9 +151,7 @@ def check_exactly_one_param(ctx: click.Context, param_ids: List[str]) -> None:
if len(specified_param_ids) != 1:
canonical_aliases = _params_ids_to_aliases(ctx, param_ids)
aliases_str = ", ".join(canonical_aliases)
fatal_usage_error(
ctx, f"Exactly one of of {aliases_str} must be specified."
)
fatal_usage_error(ctx, f"One of [{aliases_str}] must be specified.")


def check_at_least_one_param(ctx: click.Context, param_ids: List[str]) -> None:
Expand All @@ -173,7 +171,7 @@ def check_at_least_one_param(ctx: click.Context, param_ids: List[str]) -> None:
canonical_aliases = _params_ids_to_aliases(ctx, param_ids)
aliases_str = ", ".join(canonical_aliases)
fatal_usage_error(
ctx, f"At list one of {aliases_str} must be specified."
ctx, f"At list one of [{aliases_str}] must be specified."
)


Expand Down
11 changes: 5 additions & 6 deletions apio/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from varname import nameof
import click
from click.core import Context
from apio.managers.installer import Installer
from apio.managers.old_installer import Installer
from apio.resources import Resources
from apio import cmd_util
from apio.commands import options
Expand All @@ -22,7 +22,6 @@
# pylint: disable=R0801
def install_packages(
packages: list,
platform: str,
resources: Resources,
force: bool,
verbose: bool,
Expand All @@ -41,7 +40,7 @@ def install_packages(
modifiers = Installer.Modifiers(
force=force, checkversion=True, verbose=verbose
)
installer = Installer(package, platform, resources, modifiers)
installer = Installer(package, resources, modifiers)

# -- Install the package!
installer.install()
Expand Down Expand Up @@ -100,21 +99,21 @@ def cli(

# -- Load the resources. We don't care about project specific resources.
resources = Resources(
platform=platform,
platform_id_override=platform,
project_dir=project_dir,
project_scope=False,
)

# -- Install the given apio packages
if packages:
install_packages(packages, platform, resources, force, verbose)
install_packages(packages, resources, force, verbose)
ctx.exit(0)

# -- Install all the available packages (if any)
if all_:
# -- Install all the available packages for this platform!
install_packages(
resources.platform_packages, platform, resources, force, verbose
resources.platform_packages.keys(), resources, force, verbose
)
ctx.exit(0)

Expand Down
6 changes: 3 additions & 3 deletions apio/commands/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

from pathlib import Path
import click
from apio import util
from apio import cmd_util


Expand Down Expand Up @@ -201,8 +200,9 @@ def pack_option_gen(
platform_option = click.option(
"platform", # Var name.
"--platform",
type=click.Choice(util.PLATFORMS),
help=("(Advanced, for developers) Set the platform."),
type=str,
metavar="platform_id",
help=("(Advanced, for developers) Platform id override."),
cls=cmd_util.ApioOption,
)

Expand Down
101 changes: 34 additions & 67 deletions apio/commands/packages.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,71 +12,12 @@
from varname import nameof
import click
from click.core import Context
from apio.managers.installer import Installer
from apio.managers import installer
from apio.resources import Resources
from apio import cmd_util
from apio.commands import options


# R0801: Similar lines in 2 files
# pylint: disable=R0801
def _install(
packages: list,
platform: str,
resources: Resources,
force: bool,
verbose: bool,
):
"""Install the apio packages passed as a list
* INPUTS:
- packages: List of packages (Ex. ['examples', 'oss-cad-suite'])
- platform: Specific platform (Advanced, just for developers)
- force: Force package installation
- verbose: Show detailed output.
"""
# -- Install packages, one by one...
for package in packages:

# -- The instalation is performed by the Installer object
modifiers = Installer.Modifiers(
force=force, checkversion=True, verbose=verbose
)
installer = Installer(package, platform, resources, modifiers)

# -- Install the package!
installer.install()


# R0801: Similar lines in 2 files
# pylint: disable=R0801
def _uninstall(
packages: list, platform: str, resources: Resources, sayyes, verbose: bool
):
"""Uninstall the given list of packages"""

# -- Ask the user for confirmation
num_packages = (
"1 package" if len(packages) == 1 else f"{len(packages)} packages"
)
if sayyes or click.confirm(f"Do you want to uninstall {num_packages}?"):

# -- Uninstall packages, one by one
for package in packages:

# -- The uninstalation is performed by the Installer object
modifiers = Installer.Modifiers(
force=False, checkversion=False, verbose=verbose
)
installer = Installer(package, platform, resources, modifiers)

# -- Uninstall the package!
installer.uninstall()

# -- User quit!
else:
click.secho("Abort!", fg="red")


# ---------------------------
# -- COMMAND
# ---------------------------
Expand Down Expand Up @@ -166,31 +107,57 @@ def cli(
cmd_util.check_exactly_one_param(ctx, nameof(list_, install, uninstall))
cmd_util.check_at_most_one_param(ctx, nameof(list_, force))
cmd_util.check_at_most_one_param(ctx, nameof(uninstall, force))
cmd_util.check_at_most_one_param(ctx, nameof(list_, packages))

# -- Load the resources. We don't care about project specific resources.
resources = Resources(
platform=platform,
platform_id_override=platform,
project_dir=project_dir,
project_scope=False,
)

# -- List all the packages (installed or not)

if install:
click.secho(f"Platform id '{resources.platform_id}'")

# -- If packages not specified, use all.
if not packages:
packages = resources.platform_packages
packages = resources.platform_packages.keys()
# -- Install the packages.
_install(packages, platform, resources, force, verbose)
for package in packages:
installer.install_package(
resources, package_spec=package, force=force, verbose=verbose
)

ctx.exit(0)

if uninstall:
# -- If packages not specified, use all.
if not packages:
packages = resources.platform_packages
_uninstall(packages, platform, resources, sayyes, verbose)
packages = resources.platform_packages.keys()

# -- Ask the user for confirmation
num_packages = (
"1 package" if len(packages) == 1 else f"{len(packages)} packages"
)
if sayyes or click.confirm(
f"Do you want to uninstall {num_packages}?"
):

click.secho(f"Platform id '{resources.platform_id}'")

# -- Uninstall packages, one by one
for package in packages:
installer.uninstall_package(
resources, package_spec=package, verbose=verbose
)

# -- User quit!
else:
click.secho("User said no", fg="red")
ctx.exit(0)

# -- Here it must be --list.
if verbose:
click.secho(f"Platform id '{resources.platform_id}'")
resources.list_packages()
ctx.exit(0)
64 changes: 49 additions & 15 deletions apio/commands/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from click.core import Context
from apio import util
from apio import cmd_util
from apio.util import get_system_type
from apio.managers.system import System
from apio.resources import Resources
from apio.commands import options
Expand Down Expand Up @@ -54,6 +53,15 @@
cls=cmd_util.ApioOption,
)

platforms_option = click.option(
"platforms", # Var name.
"-p",
"--platforms",
is_flag=True,
help="Show supported platforms ids.",
cls=cmd_util.ApioOption,
)


# ---------------------------
# -- COMMAND
Expand All @@ -64,10 +72,11 @@
\b
Examples:
apio system --lsftdi # List FTDI devices
apio system --lsusb # List USB devices
apio system --lsserial # List serial devices
apio system --info # Show platform id
apio system --lsftdi # List FTDI devices
apio system --lsusb # List USB devices
apio system --lsserial # List serial devices
apio system --info # Show platform id and info.
apio system --platforms # Show supported platforms
The flags --lstdi, --lsusb, --lsserial, and --info are exclusive and
cannot be mixed in the same command.
Expand All @@ -76,6 +85,7 @@

# pylint: disable=too-many-arguments
# pylint: disable=too-many-positional-arguments
# pylint: disable=too-many-locals
@click.command(
"system",
short_help="Provides system info.",
Expand All @@ -88,6 +98,7 @@
@lsusb_option
@lsserial_option
@info_option
@platforms_option
def cli(
ctx: Context,
# Options
Expand All @@ -96,13 +107,14 @@ def cli(
lsusb: bool,
lsserial: bool,
info: bool,
platforms: bool,
):
"""Implements the system command. This command executes assorted
system tools"""

# Make sure these params are exclusive.
cmd_util.check_at_most_one_param(
ctx, nameof(lsftdi, lsusb, lsserial, info)
cmd_util.check_exactly_one_param(
ctx, nameof(lsftdi, lsusb, lsserial, info, platforms)
)

# Load the various resource files.
Expand All @@ -129,18 +141,40 @@ def cli(
# -- Show system information
if info:
# -- Print platform id.
click.secho("Platform: ", nl=False)
click.secho(get_system_type(), fg="yellow")
click.secho("Platform id ", nl=False)
click.secho(resources.platform_id, fg="cyan")

# -- Print apio package directory.
click.secho("Package: ", nl=False)
click.secho(util.get_path_in_apio_package(""), fg="yellow")
click.secho("Python package ", nl=False)
click.secho(util.get_path_in_apio_package(""), fg="cyan")

# -- Print apio home directory.
click.secho("Home: ", nl=False)
click.secho(util.get_home_dir(), fg="yellow")
click.secho("Apio home ", nl=False)
click.secho(util.get_home_dir(), fg="cyan")

# -- Print apio home directory.
click.secho("Apio packages ", nl=False)
click.secho(util.get_packages_dir(), fg="cyan")

ctx.exit(0)

if platforms:
click.secho(
f" {'[PLATFORM ID]':18} "
f"{'[PACKAGE SELECTOR]':20} "
f"{'[DESCRIPTION]'}",
fg="magenta",
)
for platform_id, platform_info in resources.platforms.items():
description = platform_info.get("description")
package_selector = platform_info.get("package_selector")
this_package = platform_id == resources.platform_id
fg = "green" if this_package else None
click.secho(
f" {platform_id:18} {package_selector:20} {description}",
fg=fg,
)
ctx.exit(0)

# -- Invalid option. Just show the help
click.secho(ctx.get_help())
# -- Error, no option selected.
assert 0, "Non reachable"
Loading

0 comments on commit a9cc221

Please sign in to comment.