[+] 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
|
*.tar.gz
|
||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/launch.json
|
!.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 (
|
from typing import (
|
||||||
Optional,
|
Optional,
|
||||||
|
Literal,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -22,12 +23,107 @@ class Project:
|
|||||||
build_dir : pathlib.Path
|
build_dir : pathlib.Path
|
||||||
dest_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):
|
class CLI(abc.ABC):
|
||||||
|
@property
|
||||||
|
@abc.abstractmethod
|
||||||
|
def dist_settings(self) -> DistSettings:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def projects(self) -> dict[str, Project]:
|
def projects(self) -> dict[str, Project]:
|
||||||
raise NotImplementedError
|
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(
|
def deploy_wheel(
|
||||||
self,
|
self,
|
||||||
project_name: str,
|
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