[+] update cli module;
This commit is contained in:
parent
34c65f7ba5
commit
ea63c67280
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,3 +12,4 @@ d2/book1/books
|
||||
*.tar.gz
|
||||
.vscode/*
|
||||
!.vscode/launch.json
|
||||
python/build
|
||||
|
2
deps/com.github.aiortc.aiortc
vendored
2
deps/com.github.aiortc.aiortc
vendored
@ -1 +1 @@
|
||||
Subproject commit 1c158ef28435e2e0345a5d2682db8a2057d71522
|
||||
Subproject commit 64d8fecc5740fb77dcd40ef45a8b3c74c2187ba0
|
@ -12,6 +12,7 @@ from .os import shutil_which
|
||||
|
||||
from typing import (
|
||||
Optional,
|
||||
Literal,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -22,12 +23,107 @@ class Project:
|
||||
build_dir : pathlib.Path
|
||||
dest_dir : pathlib.Path
|
||||
|
||||
@dataclasses.dataclass
|
||||
class Dependency:
|
||||
name: str
|
||||
mode : Literal['pyproject', 'meson', 'meson-python', 'm']
|
||||
source_path : pathlib.Path
|
||||
args: Optional[list[str]] = None
|
||||
|
||||
@dataclasses.dataclass
|
||||
class DistSettings:
|
||||
wheel_dir : pathlib.Path
|
||||
python_path: pathlib.Path
|
||||
env_path: pathlib.Path
|
||||
|
||||
class CLI(abc.ABC):
|
||||
@property
|
||||
@abc.abstractmethod
|
||||
def dist_settings(self) -> DistSettings:
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
@abc.abstractmethod
|
||||
def projects(self) -> dict[str, Project]:
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
@abc.abstractmethod
|
||||
def dependencies(self) -> dict[str, Dependency]:
|
||||
raise NotImplementedError
|
||||
|
||||
def deploy_fetch_dist(
|
||||
self,
|
||||
force: bool,
|
||||
) -> None:
|
||||
for k, o in self.dependencies.items():
|
||||
whl_glob = self.dist_settings.wheel_dir / ('*%s*.whl' % o.name.replace('.', '_'))
|
||||
if len(glob.glob(
|
||||
str(whl_glob)
|
||||
)) == 0 or force:
|
||||
if o.source_path.exists():
|
||||
def whl_files_get() -> list[dict[str, Any]]:
|
||||
return [
|
||||
dict(
|
||||
path=o,
|
||||
stat=os.stat(o).st_mtime,
|
||||
)
|
||||
for o in glob.glob(
|
||||
str(whl_glob)
|
||||
)
|
||||
]
|
||||
|
||||
present_files = whl_files_get()
|
||||
|
||||
if o.mode == 'm':
|
||||
if (o.source_path / 'm.py').exists():
|
||||
cmd = [
|
||||
sys.executable,
|
||||
o.source_path / 'm.py',
|
||||
'deploy:wheel',
|
||||
'-o', self.settings.wheel_dir,
|
||||
]
|
||||
|
||||
if not o.args is None:
|
||||
cmd.extend(o.args)
|
||||
|
||||
subprocess.check_call(cmd)
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
updated_files = whl_files_get()
|
||||
|
||||
def index_get(o: dict[str, Any]) -> tuple[Any, ...]:
|
||||
return (o['path'], o['stat'])
|
||||
|
||||
present_files_index = {
|
||||
index_get(o) : o
|
||||
for o in present_files
|
||||
}
|
||||
|
||||
new_files : list[dict[str, Any]] = []
|
||||
|
||||
for o in updated_files:
|
||||
entry_index = index_get(o)
|
||||
|
||||
if not entry_index in present_files_index:
|
||||
new_files.append(o)
|
||||
|
||||
if len(new_files) == 0:
|
||||
raise NotImplementedError
|
||||
|
||||
latest_file = sorted(
|
||||
new_files,
|
||||
key=lambda x: x['stat']
|
||||
)[-1]
|
||||
|
||||
subprocess.check_call([
|
||||
self.dist_settings.python_path,
|
||||
'-m', 'pip',
|
||||
'install',
|
||||
latest_file['path'],
|
||||
])
|
||||
|
||||
def deploy_wheel(
|
||||
self,
|
||||
project_name: str,
|
||||
|
67
python/online/fxreader/pr34/commands_typed/cli_bootstrap.py
Normal file
67
python/online/fxreader/pr34/commands_typed/cli_bootstrap.py
Normal file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env python3
|
||||
import glob
|
||||
import pathlib
|
||||
import sys
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
env_path = pathlib.Path(__file__).parent / '.venv'
|
||||
python_path = env_path / 'bin' / 'python3'
|
||||
|
||||
if not env_path.exists():
|
||||
subprocess.check_call([
|
||||
'uv', 'venv', '--seed', '--offline',
|
||||
str(env_path)
|
||||
])
|
||||
|
||||
subprocess.check_call([
|
||||
'uv',
|
||||
'pip',
|
||||
'install',
|
||||
'-p',
|
||||
python_path,
|
||||
'--offline',
|
||||
'uv',
|
||||
])
|
||||
|
||||
subprocess.check_call([
|
||||
python_path,
|
||||
'-m',
|
||||
'uv', 'pip', 'install',
|
||||
'--offline',
|
||||
'build', 'setuptools', 'meson-python', 'pybind11',
|
||||
])
|
||||
|
||||
early_wheels = glob.glob(
|
||||
str(
|
||||
pathlib.Path(__file__).parent / 'deps' / 'dist' / 'early' / '*.whl'
|
||||
)
|
||||
)
|
||||
if len(early_wheels) > 0:
|
||||
subprocess.check_call([
|
||||
python_path,
|
||||
'-m',
|
||||
'uv', 'pip', 'install',
|
||||
'--offline',
|
||||
*early_wheels,
|
||||
])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if pathlib.Path(sys.executable).absolute() != python_path.absolute():
|
||||
os.execv(
|
||||
str(python_path),
|
||||
[
|
||||
str(python_path),
|
||||
*sys.argv,
|
||||
]
|
||||
)
|
||||
|
||||
os.execv(
|
||||
str(python_path),
|
||||
[
|
||||
str(python_path),
|
||||
pathlib.Path(__file__).parent / 'cli.py',
|
||||
*sys.argv[1:],
|
||||
]
|
||||
)
|
Loading…
Reference in New Issue
Block a user