Fully working ui and cli #1

Merged
Luis merged 7 commits from Luis-main into main 2023-10-23 20:37:35 +00:00
9 changed files with 60 additions and 57 deletions
Showing only changes of commit f1b66d7996 - Show all commits

View File

@@ -1,23 +1,27 @@
from typing import Dict, Optional, Tuple, Callable, Any, Mapping, List import logging
from pathlib import Path import multiprocessing as mp
import ipdb
import os import os
import shlex
import stat import stat
import subprocess import subprocess
from .dirs import find_git_repo_root
import multiprocessing as mp
from .types import FlakeName
import logging
import sys import sys
import shlex from pathlib import Path
import time from typing import Any, Callable, Dict, List, Optional
import ipdb
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def command_exec(cmd: List[str], work_dir:Path, env: Dict[str, str]) -> None:
def command_exec(cmd: List[str], work_dir: Path, env: Dict[str, str]) -> None:
subprocess.run(cmd, check=True, env=env, cwd=work_dir.resolve()) subprocess.run(cmd, check=True, env=env, cwd=work_dir.resolve())
def repro_env_break(work_dir: Path, env: Optional[Dict[str, str]] = None, cmd: Optional[List[str]] = None) -> None:
def repro_env_break(
work_dir: Path,
env: Optional[Dict[str, str]] = None,
cmd: Optional[List[str]] = None,
) -> None:
if env is None: if env is None:
env = os.environ.copy() env = os.environ.copy()
else: else:
@@ -40,14 +44,16 @@ def repro_env_break(work_dir: Path, env: Optional[Dict[str, str]] = None, cmd: O
finally: finally:
proc.terminate() proc.terminate()
def write_command(command: str, loc:Path) -> None:
def write_command(command: str, loc: Path) -> None:
with open(loc, "w") as f: with open(loc, "w") as f:
f.write("#!/usr/bin/env bash\n") f.write("#!/usr/bin/env bash\n")
f.write(command) f.write(command)
st = os.stat(loc) st = os.stat(loc)
os.chmod(loc, st.st_mode | stat.S_IEXEC) os.chmod(loc, st.st_mode | stat.S_IEXEC)
def spawn_process(func: Callable, **kwargs:Any) -> mp.Process:
def spawn_process(func: Callable, **kwargs: Any) -> mp.Process:
mp.set_start_method(method="spawn") mp.set_start_method(method="spawn")
proc = mp.Process(target=func, kwargs=kwargs) proc = mp.Process(target=func, kwargs=kwargs)
proc.start() proc.start()
@@ -59,7 +65,7 @@ def dump_env(env: Dict[str, str], loc: Path) -> None:
with open(loc, "w") as f: with open(loc, "w") as f:
f.write("#!/usr/bin/env bash\n") f.write("#!/usr/bin/env bash\n")
for k, v in cenv.items(): for k, v in cenv.items():
if v.count('\n') > 0 or v.count("\"") > 0 or v.count("'") > 0: if v.count("\n") > 0 or v.count('"') > 0 or v.count("'") > 0:
continue continue
f.write(f"export {k}='{v}'\n") f.write(f"export {k}='{v}'\n")
st = os.stat(loc) st = os.stat(loc)

View File

@@ -3,11 +3,13 @@ from pathlib import Path
from typing import Any from typing import Any
from pydantic import AnyUrl, BaseModel, validator from pydantic import AnyUrl, BaseModel, validator
from pydantic.tools import parse_obj_as
from ..dirs import clan_data_dir, clan_flakes_dir from ..dirs import clan_data_dir, clan_flakes_dir
from ..flakes.create import DEFAULT_URL
from ..types import validate_path from ..types import validate_path
DEFAULT_URL = parse_obj_as(AnyUrl, "http://localhost:8000")
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@@ -1,10 +1,6 @@
from enum import Enum from enum import Enum
from typing import Dict, List
from pydantic import BaseModel, Field from pydantic import BaseModel
from ..async_cmd import CmdOut
from ..task_manager import TaskStatus
class Status(Enum): class Status(Enum):
@@ -16,6 +12,3 @@ class Status(Enum):
class Machine(BaseModel): class Machine(BaseModel):
name: str name: str
status: Status status: Status

View File

@@ -29,7 +29,6 @@ def setup_app() -> FastAPI:
app.include_router(health.router) app.include_router(health.router)
# Needs to be last in register. Because of wildcard route # Needs to be last in register. Because of wildcard route
app.include_router(root.router) app.include_router(root.router)
app.add_exception_handler(ClanError, clan_error_handler) app.add_exception_handler(ClanError, clan_error_handler)

View File

@@ -13,6 +13,7 @@ from typing import Iterator
import uvicorn import uvicorn
from pydantic import AnyUrl, IPvAnyAddress from pydantic import AnyUrl, IPvAnyAddress
from pydantic.tools import parse_obj_as from pydantic.tools import parse_obj_as
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@@ -25,9 +26,7 @@ def open_browser(base_url: AnyUrl, sub_url: str) -> None:
break break
except OSError: except OSError:
time.sleep(i) time.sleep(i)
url = parse_obj_as( url = parse_obj_as(AnyUrl, f"{base_url}/{sub_url.removeprefix('/')}")
AnyUrl, f"{base_url}/{sub_url.removeprefix('/')}"
)
_open_browser(url) _open_browser(url)

View File

@@ -37,6 +37,10 @@ exclude = "clan_cli.nixpkgs"
module = "argcomplete.*" module = "argcomplete.*"
ignore_missing_imports = true ignore_missing_imports = true
[[tool.mypy.overrides]]
module = "ipdb.*"
ignore_missing_imports = true
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = "jsonschema.*" module = "jsonschema.*"
ignore_missing_imports = true ignore_missing_imports = true
@@ -52,7 +56,7 @@ ignore_missing_imports = true
[tool.ruff] [tool.ruff]
line-length = 88 line-length = 88
select = [ "E", "F", "I", "U", "N"] select = [ "E", "F", "I", "N"]
ignore = [ "E501" ] ignore = [ "E501" ]
[tool.black] [tool.black]

View File

@@ -22,37 +22,37 @@ mkShell {
]; ];
shellHook = '' shellHook = ''
tmp_path=$(realpath ./.direnv) tmp_path=$(realpath ./.direnv)
repo_root=$(realpath .) repo_root=$(realpath .)
mkdir -p "$tmp_path/python/${pythonWithDeps.sitePackages}" mkdir -p "$tmp_path/python/${pythonWithDeps.sitePackages}"
# Install the package in editable mode # Install the package in editable mode
# This allows executing `clan` from within the dev-shell using the current # This allows executing `clan` from within the dev-shell using the current
# version of the code and its dependencies. # version of the code and its dependencies.
${pythonWithDeps.interpreter} -m pip install \ ${pythonWithDeps.interpreter} -m pip install \
--quiet \ --quiet \
--disable-pip-version-check \ --disable-pip-version-check \
--no-index \ --no-index \
--no-build-isolation \ --no-build-isolation \
--prefix "$tmp_path/python" \ --prefix "$tmp_path/python" \
--editable $repo_root --editable $repo_root
rm -f clan_cli/nixpkgs clan_cli/webui/assets rm -f clan_cli/nixpkgs clan_cli/webui/assets
ln -sf ${clan-cli.nixpkgs} clan_cli/nixpkgs ln -sf ${clan-cli.nixpkgs} clan_cli/nixpkgs
ln -sf ${ui-assets} clan_cli/webui/assets ln -sf ${ui-assets} clan_cli/webui/assets
export PATH="$tmp_path/python/bin:${checkScript}/bin:$PATH" export PATH="$tmp_path/python/bin:${checkScript}/bin:$PATH"
export PYTHONPATH="$repo_root:$tmp_path/python/${pythonWithDeps.sitePackages}:" export PYTHONPATH="$repo_root:$tmp_path/python/${pythonWithDeps.sitePackages}:"
export PYTHONBREAKPOINT=ipdb.set_trace export PYTHONBREAKPOINT=ipdb.set_trace
export XDG_DATA_DIRS="$tmp_path/share''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" export XDG_DATA_DIRS="$tmp_path/share''${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"
export fish_complete_path="$tmp_path/share/fish/vendor_completions.d''${fish_complete_path:+:$fish_complete_path}" export fish_complete_path="$tmp_path/share/fish/vendor_completions.d''${fish_complete_path:+:$fish_complete_path}"
mkdir -p \ mkdir -p \
$tmp_path/share/fish/vendor_completions.d \ $tmp_path/share/fish/vendor_completions.d \
$tmp_path/share/bash-completion/completions \ $tmp_path/share/bash-completion/completions \
$tmp_path/share/zsh/site-functions $tmp_path/share/zsh/site-functions
register-python-argcomplete --shell fish clan > $tmp_path/share/fish/vendor_completions.d/clan.fish register-python-argcomplete --shell fish clan > $tmp_path/share/fish/vendor_completions.d/clan.fish
register-python-argcomplete --shell bash clan > $tmp_path/share/bash-completion/completions/clan register-python-argcomplete --shell bash clan > $tmp_path/share/bash-completion/completions/clan
''; '';
} }

View File

@@ -18438,4 +18438,4 @@
}; };
}; };
}; };
} }

View File

@@ -6,7 +6,7 @@ import {
CssBaseline, CssBaseline,
IconButton, IconButton,
ThemeProvider, ThemeProvider,
useMediaQuery useMediaQuery,
} from "@mui/material"; } from "@mui/material";
import { StyledEngineProvider } from "@mui/material/styles"; import { StyledEngineProvider } from "@mui/material/styles";
import axios from "axios"; import axios from "axios";