Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The set-default command implemented. #190

Merged
merged 1 commit into from
Apr 29, 2024
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
2 changes: 0 additions & 2 deletions dem/cli/command/assign_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ def execute(platform: Platform, dev_env_name: str, project_path: str) -> None:
dev_env_name -- the name of the Development Environment to assign
project_path -- the path to the project to assign the Development Environment to
"""


if not os.path.isdir(project_path):
stderr.print(f"[red]Error: The {project_path} path does not exist.[/]")
return
Expand Down
4 changes: 1 addition & 3 deletions dem/cli/command/clone_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ def execute(platform: Platform, dev_env_name: str) -> None:
platform -- the platform
dev_env_name -- name of the Dev Env to clone
"""


catalog_dev_env: DevEnv | None = None

if not platform.dev_env_catalogs.catalogs:
Expand All @@ -59,6 +57,6 @@ def execute(platform: Platform, dev_env_name: str) -> None:
handle_existing_local_dev_env(platform, local_dev_env)

platform.local_dev_envs.append(catalog_dev_env)
platform.flush_descriptors()
platform.flush_dev_env_properties()

stdout.print("[green]The Dev Env successfully cloned.[/]")
2 changes: 1 addition & 1 deletion dem/cli/command/cp_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def cp_given_dev_env(platform: Platform, dev_env_to_cp: DevEnv,
new_dev_env.name = new_dev_env_name
new_dev_env.is_installed = False
platform.local_dev_envs.append(new_dev_env)
platform.flush_descriptors()
platform.flush_dev_env_properties()

def execute(platform: Platform, dev_env_to_cp_name: str, new_dev_env_name: str) -> None:

Expand Down
2 changes: 1 addition & 1 deletion dem/cli/command/create_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,6 @@ def execute(platform: Platform, dev_env_name: str) -> None:
platform.assign_tool_image_instances_to_all_dev_envs()

create_dev_env(platform, dev_env_name)
platform.flush_descriptors()
platform.flush_dev_env_properties()
stdout.print(f"The [green]{dev_env_name}[/] Development Environment has been created!")
stdout.print("Run [italic]dem install[/] to install it.")
2 changes: 1 addition & 1 deletion dem/cli/command/delete_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@ def execute(platform: Platform, dev_env_name: str) -> None:

stdout.print("Deleting the Development Environment...")
platform.local_dev_envs.remove(dev_env_to_delete)
platform.flush_descriptors()
platform.flush_dev_env_properties()
stdout.print(f"[green]Successfully deleted the {dev_env_name}![/]")
2 changes: 1 addition & 1 deletion dem/cli/command/import_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ def execute(platform: Platform, path_to_dev_env: str) -> None:
"""
if os.path.exists(path_to_dev_env):
import_dev_env_from_json(platform,path_to_dev_env)
platform.flush_descriptors()
platform.flush_dev_env_properties()
else:
stderr.print("[red]Error: The input file does not exist.[/]")
12 changes: 7 additions & 5 deletions dem/cli/command/info_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
ToolImage.LOCAL_AND_REGISTRY: "Local and Registry",
}

def print_local_dev_env_info(dev_env: DevEnv) -> None:
def print_local_dev_env_info(platform: Platform, dev_env: DevEnv) -> None:
""" Print information about the given local Development Environment.

Args:
Expand All @@ -29,11 +29,13 @@ def print_local_dev_env_info(dev_env: DevEnv) -> None:
tool_info_table.add_row(tool_image.name,
image_status_messages[tool_image.availability])
if dev_env.is_installed:
installation_status = "[green]Installed[/]"
status = "[green]Installed[/]"
if dev_env.name == platform.default_dev_env_name:
status = status.replace("[/]", " | Default[/]")
else:
installation_status = "Not installed"
status = "Not installed"
stdout.print(f"\n[bold]Development Environment: {dev_env.name}[/]\n")
stdout.print(f"Installation state: {installation_status}\n")
stdout.print(f"Status: {status}\n")
stdout.print(tool_info_table)

if dev_env.is_installed and dev_env.get_tool_image_status() == DevEnv.Status.REINSTALL_NEEDED:
Expand All @@ -60,7 +62,7 @@ def local_info(platform: Platform, dev_env_name: str) -> None:
stderr.print(f"[red]Error: Unknown Development Environment: {dev_env_name}[/]\n")
raise typer.Abort()

print_local_dev_env_info(dev_env)
print_local_dev_env_info(platform, dev_env)

def print_cat_dev_env_info(dev_env: DevEnv, cat_name: str) -> None:
""" Print information about the given catalog Development Environment.
Expand Down
4 changes: 1 addition & 3 deletions dem/cli/command/init_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ def execute(platform: Platform, project_path: str) -> None:
platform -- the platform
project_path -- the path to the project to initialize
"""


if not os.path.isdir(project_path):
stderr.print(f"[red]Error: The {project_path} path does not exist.[/]")
return
Expand Down Expand Up @@ -45,6 +43,6 @@ def execute(platform: Platform, project_path: str) -> None:
break

platform.local_dev_envs.append(dev_env)
platform.flush_descriptors()
platform.flush_dev_env_properties()
stdout.print(f"[green]Successfully initialized the {dev_env.name} Dev Env for the project at {project_path}![/]")
stdout.print(f"\nNow you can install the Dev Env with the `dem install {dev_env.name}` command.")
20 changes: 14 additions & 6 deletions dem/cli/command/list_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,24 @@ def add_dev_env_info_to_table(platform: Platform, table: Table, dev_env: DevEnv)
table -- the Table
dev_env -- the Development Environment
"""
installed_column = ""
default_column = ""
if dev_env.is_installed:
dev_env.assign_tool_image_instances(platform.tool_images)
installed_column = "[green]Yes[/]"
installed_column = "[green][/]"
tool_image_status = dev_env.get_tool_image_status()
if tool_image_status == DevEnv.Status.UNAVAILABLE_IMAGE:
status_column = "[red]Error: Required image is not available![/]"
elif tool_image_status == DevEnv.Status.REINSTALL_NEEDED:
status_column = "[red]Error: Incomplete local install![/]"
else:
status_column = "Ok"
status_column = "[green]Ok[/]"

if dev_env.name == platform.default_dev_env_name:
default_column = "[green]✓[/]"
else:
installed_column = "No"
status_column = "Ok"
table.add_row(dev_env.name, installed_column, status_column)
status_column = "[green]Ok[/]"
table.add_row(dev_env.name, installed_column, default_column, status_column)

def list_local_dev_envs(platform: Platform) -> None:
""" List the local Development Environments.
Expand All @@ -44,6 +48,7 @@ def list_local_dev_envs(platform: Platform) -> None:
table = Table()
table.add_column("Name")
table.add_column("Installed")
table.add_column("Default")
table.add_column("Status")

for dev_env in sorted(platform.local_dev_envs, key=lambda dev_env: dev_env.name.lower()):
Expand Down Expand Up @@ -109,4 +114,7 @@ def execute(platform: Platform, cat: bool, selected_cats: list[str]) -> None:
elif selected_cats:
list_selected_cat_dev_envs(platform, selected_cats)
else:
list_local_dev_envs(platform)
list_local_dev_envs(platform)

if platform.default_dev_env_name:
stdout.print(f"\n[bold]The default Development Environment: {platform.default_dev_env_name}[/]")
2 changes: 1 addition & 1 deletion dem/cli/command/modify_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def handle_user_confirm(confirmation: str, dev_env_local: DevEnv, platform: Plat
stderr.print("[red]The Development Environment already exist.")
raise typer.Abort()

platform.flush_descriptors()
platform.flush_dev_env_properties()

def get_already_selected_tool_images(dev_env: DevEnv) -> set[str]:
""" Get the already selected Tool Images.
Expand Down
2 changes: 1 addition & 1 deletion dem/cli/command/rename_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ def execute(platform: Platform, dev_env_name_to_rename: str, new_dev_env_name: s

if dev_env_to_rename is not None:
dev_env_to_rename.name = new_dev_env_name
platform.flush_descriptors()
platform.flush_dev_env_properties()
else:
stderr.print("[red]Error: The input Development Environment does not exist.[/]")
24 changes: 24 additions & 0 deletions dem/cli/command/set_default_cmd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""Implementation of the set-default command."""
# dem/cli/command/set_default_cmd.py

from dem.core.platform import Platform
from dem.cli.console import stderr, stdout

def execute(platform: Platform, dev_env_name: str) -> None:
"""Execute the set-default command.

Args:
platform (Platform): The platform instance.
dev_env_name (str): The name of the Development Environment to set as default.
"""
dev_env = platform.get_dev_env_by_name(dev_env_name)
if dev_env is None:
stderr.print(f"[red]Error: The {dev_env_name} Development Environment does not exist.[/]")
return
if not dev_env.is_installed:
stderr.print(f"[red]Error: The {dev_env_name} Development Environment is not installed.[/]")
stdout.print("Only installed Development Environments can be set as default.")
return
platform.default_dev_env_name = dev_env_name
platform.flush_dev_env_properties()
stdout.print(f"[green]The default Development Environment is now set to {dev_env_name}![/]")
34 changes: 31 additions & 3 deletions dem/cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
import os
from dem import __command__, __app_name__
from dem.cli.command import cp_cmd, import_cmd, info_cmd, list_cmd, create_cmd, modify_cmd, delete_cmd, \
rename_cmd, run_cmd, export_cmd, clone_cmd, add_reg_cmd, \
list_reg_cmd, del_reg_cmd, add_cat_cmd, list_cat_cmd, del_cat_cmd, \
add_host_cmd, uninstall_cmd, install_cmd, assign_cmd, init_cmd, \
rename_cmd, run_cmd, export_cmd, clone_cmd, add_reg_cmd, list_reg_cmd, del_reg_cmd, add_cat_cmd, list_cat_cmd, del_cat_cmd, \
add_host_cmd, set_default_cmd, uninstall_cmd, install_cmd, assign_cmd, init_cmd, \
list_host_cmd, del_host_cmd, list_tools_cmd
from dem.cli.console import stdout
from dem.core.platform import Platform
Expand All @@ -33,6 +32,20 @@ def autocomplete_dev_env_name(incomplete: str) -> Generator:
if dev_env.name.startswith(incomplete) or (incomplete == ""):
yield dev_env.name

def autocomplete_installed_dev_env_name(incomplete: str) -> Generator:
"""
Autocomplete the input Dev Env name with the available matching installed Dev Envs.

Return with the matching Dev Env names by a Generator.

Args:
incomplete -- the parameter the user supplied so far when the tab was pressed
"""
if platform is not None:
for dev_env in platform.local_dev_envs:
if dev_env.is_installed and (dev_env.name.startswith(incomplete) or (incomplete == "")):
yield dev_env.name

def autocomplete_cat_name(incomplete: str) -> Generator:
"""
Autocomplete the input Catalog name with the available matching catalogs.
Expand Down Expand Up @@ -76,6 +89,21 @@ def autocomplete_host_name(incomplete: str) -> Generator:
yield host_config["name"]

# DEM commands
@typer_cli.command()
def set_default(dev_env_name: Annotated[str,
typer.Argument(help="The name of the Development Environment to set as default.",
autocompletion=autocomplete_installed_dev_env_name)]) -> None:
"""
Set the Development Environment as the default one.

The default Development Environment will be used by the run command when no Development
Environment is specified.
"""
if platform:
set_default_cmd.execute(platform, dev_env_name)
else:
raise InternalError("Error: The platform hasn't been initialized properly!")

@typer_cli.command("list", context_settings={"allow_extra_args": True}) # "list" is a Python keyword
def list_(cat: Annotated[bool, typer.Option(help="List the Dev Envs available from the catalogs.",
show_default=False)] = False,
Expand Down
11 changes: 7 additions & 4 deletions dem/core/platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ def __init__(self) -> None:
self._container_engine = None
self._registries = None
self._hosts = None
self.default_dev_env_name: str = ""
self.local_dev_envs: list[DevEnv] = []

# Set this to true in the platform instance to work with the local tool images only
self.local_only = False
Expand All @@ -54,7 +56,7 @@ def load_dev_envs(self) -> None:
self.dev_env_json.update()
self.version = self.dev_env_json.deserialized["version"]
self._dev_env_json_version_check(int(self.version.split('.', 1)[0]))
self.local_dev_envs: list[DevEnv] = []
self.default_dev_env_name = self.dev_env_json.deserialized.get("default_dev_env", "")
for dev_env_descriptor in self.dev_env_json.deserialized["development_environments"]:
self.local_dev_envs.append(DevEnv(descriptor=dev_env_descriptor))

Expand Down Expand Up @@ -126,6 +128,7 @@ def get_deserialized(self) -> dict:
"""
dev_env_json_deserialized: dict[str, Any] = {
"version": self.version,
"default_dev_env": self.default_dev_env_name,
"development_environments": [
dev_env.get_deserialized()
for dev_env in self.local_dev_envs
Expand Down Expand Up @@ -167,7 +170,7 @@ def install_dev_env(self, dev_env_to_install: DevEnv) -> None:
raise PlatformError(f"Dev Env install failed. --> {str(e)}")

dev_env_to_install.is_installed = True
self.flush_descriptors()
self.flush_dev_env_properties()

def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
""" Uninstall the Dev Env by removing the images not required anymore.
Expand Down Expand Up @@ -197,9 +200,9 @@ def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
raise PlatformError(f"Dev Env uninstall failed. --> {str(e)}")

dev_env_to_uninstall.is_installed = False
self.flush_descriptors()
self.flush_dev_env_properties()

def flush_descriptors(self) -> None:
def flush_dev_env_properties(self) -> None:
""" Writes the deserialized json to the dev_env.json file."""
# Get the up-to-date deserialized data.
self.dev_env_json.deserialized = self.get_deserialized()
Expand Down
17 changes: 17 additions & 0 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,23 @@ info.

---

## **`dem set-default DEV_ENV_NAME`**

**Description:**

Set the selected Development Environment as the default one.

The default Development Environment is used when the `dem run` command is run without specifying a
Development Environment.

**Arguments:**

| Argument | Description | Required |
|------------------|---------------------------------------------------------|----------------:|
| `DEV_ENV_NAME` | Name of the Development Environment to set as default. | :material-check:|

---

## **`dem uninstall DEV_ENV_NAME`**

**Description:**
Expand Down
2 changes: 1 addition & 1 deletion tests/cli/test_clone_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,4 @@ def test_execute_success(mock_handle_existing_local_dev_env: MagicMock) -> None:
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
mock_handle_existing_local_dev_env.assert_called_once_with(mock_platform, mock_local_dev_env)
mock_platform.local_dev_envs.append.assert_called_once_with(mock_catalog_dev_env)
mock_platform.flush_descriptors.assert_called_once_with()
mock_platform.flush_dev_env_properties.assert_called_once_with()
2 changes: 1 addition & 1 deletion tests/cli/test_cp.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def test_cp_given_dev_env():
assert mock_platform.local_dev_envs[0].name is test_new_name
assert mock_platform.local_dev_envs[0].is_installed is False

mock_platform.flush_descriptors.assert_called_once()
mock_platform.flush_dev_env_properties.assert_called_once()

@patch("dem.cli.command.cp_cmd.get_dev_env_to_cp")
@patch("dem.cli.command.cp_cmd.check_new_dev_env_name_taken")
Expand Down
2 changes: 1 addition & 1 deletion tests/cli/test_create_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ def test_execute(mock_create_dev_env: MagicMock, mock_stdout_print: MagicMock) -
assert 0 == runner_result.exit_code

mock_create_dev_env.assert_called_once_with(mock_platform, expected_dev_env_name)
mock_platform.flush_descriptors.assert_called_once()
mock_platform.flush_dev_env_properties.assert_called_once()
mock_stdout_print.assert_has_calls([
call(f"The [green]{expected_dev_env_name}[/] Development Environment has been created!"),
call("Run [italic]dem install[/] to install it.")
Expand Down
2 changes: 1 addition & 1 deletion tests/cli/test_delete_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def test_delete(mock_stdout_print: MagicMock, mock_config: MagicMock) -> None:
call("Deleting the Development Environment..."),
call(f"[green]Successfully deleted the {test_dev_env_name}![/]")
])
mock_platform.flush_descriptors.assert_called_once()
mock_platform.flush_dev_env_properties.assert_called_once()

@patch("dem.cli.command.delete_cmd.typer.confirm")
@patch("dem.cli.command.delete_cmd.stderr.print")
Expand Down
2 changes: 1 addition & 1 deletion tests/cli/test_import_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,4 @@ def test_execution(mock_os_path_exists: MagicMock, mock_import_dev_env_from_json

mock_os_path_exists.assert_called_with("asd")
mock_import_dev_env_from_json.assert_called_once_with(mock_platform, "asd")
mock_platform.flush_descriptors.assert_called_once()
mock_platform.flush_dev_env_properties.assert_called_once()
Loading
Loading