Compare commits

...

11 commits

Author SHA1 Message Date
51b4f0f5f2
mypy/squashfs 2024-09-13 23:57:35 +02:00
378a212786
mypy/deb,fs,grub 2024-09-13 23:55:02 +02:00
cd4e7403ae
ps/str,... 2024-09-13 23:54:32 +02:00
521884102e
os 2024-09-13 23:41:19 +02:00
4fac21da08
rwx/squashfs 2024-09-13 23:40:53 +02:00
56404078f7
rwx/deb,grub 2024-09-13 23:38:08 +02:00
114ee61102
mypy/fs,main 2024-09-13 23:22:12 +02:00
e213285987
mypy/fs,sphinx 2024-09-13 23:17:09 +02:00
3a8b239b9f
mypy/cmd 2024-09-13 23:07:39 +02:00
17b16ec9d0
mypy/prj 2024-09-13 23:02:29 +02:00
b1970c1f78
main/rwx 2024-09-13 22:55:45 +02:00
10 changed files with 53 additions and 45 deletions

View file

@ -4,12 +4,12 @@
from pathlib import Path from pathlib import Path
import fs from rwx import fs
if __name__ == "__main__": if __name__ == "__main__":
file_path = Path(__file__).resolve() file_path: Path = Path(__file__).resolve()
root_path = file_path.parent root_path: Path = file_path.parent
directory_path = root_path / "tmp" directory_path: Path = root_path / "tmp"
file_path = directory_path / "file" file_path = directory_path / "file"
fs.wipe(directory_path) fs.wipe(directory_path)

View file

@ -6,6 +6,7 @@ packages: list[str] = []
def need(command: str) -> None: def need(command: str) -> None:
"""Assert package dependency for a command.""" """Assert package dependency for a command."""
package: str | None
match command: match command:
case "debootstrap": case "debootstrap":
package = "debootstrap" package = "debootstrap"

View file

@ -1,22 +1,18 @@
"""Wrap SquashFS commands.""" """Wrap SquashFS commands."""
import ps from rwx import cmd, ps
import rwx.cmd cmd.need("mksquashfs")
rwx.cmd.need("mksquashfs")
def mksquashfs(input_root: str, output_file: str) -> None: def mksquashfs(input_root: str, output_file: str) -> None:
"""Make a SquashFS bootable image file.""" """Make a SquashFS bootable image file."""
ps.run( ps.run(
[ "mksquashfs",
"mksquashfs", input_root,
input_root, output_file,
output_file, "-comp",
"-comp", "zstd",
"zstd", "-Xcompression-level",
"-Xcompression-level", str(18),
str(18),
]
) )

View file

@ -1,8 +1,6 @@
"""Wrap Debian commands.""" """Wrap Debian commands."""
import cmd from rwx import cmd, ps
import ps
cmd.need("debootstrap") cmd.need("debootstrap")
@ -20,4 +18,4 @@ def bootstrap(root_path: str, suite: str, mirror_location: str) -> None:
(root_path,), (root_path,),
(mirror_location,), (mirror_location,),
] ]
return ps.run(command) ps.run(*command)

View file

@ -14,11 +14,11 @@ def create_image(file_path: str, size_bytes: int) -> None:
ps.run( ps.run(
("qemu-img", "create"), ("qemu-img", "create"),
("-f", "qcow2"), ("-f", "qcow2"),
(file_path, size_bytes), (file_path, str(size_bytes)),
) )
def empty_file(path: str) -> None: def empty_file(path: Path) -> None:
"""Empty the file at provided path.""" """Empty the file at provided path."""
write(path, "") write(path, "")
@ -36,9 +36,9 @@ def get_mount_uuid(path: str) -> str:
def get_path_mount(path: str) -> str: def get_path_mount(path: str) -> str:
"""Return the mountpoint path of an arbitrary path.""" """Return the mountpoint path of an arbitrary path."""
return ps.run_line( return ps.run_line(
("stat",), "stat",
("--format", "%m"), ("--format", "%m"),
(path,), path,
) )
@ -47,9 +47,9 @@ def get_path_uuid(path: str) -> str:
return get_mount_uuid(get_path_mount(path)) return get_mount_uuid(get_path_mount(path))
def make_directory(path: str) -> None: def make_directory(path: Path) -> None:
"""Make a directory (and its parents) from a path.""" """Make a directory (and its parents) from a path."""
Path(path).mkdir(exist_ok=True, parents=True) path.mkdir(exist_ok=True, parents=True)
def read_file_bytes(file_path: str) -> bytes: def read_file_bytes(file_path: str) -> bytes:
@ -68,17 +68,17 @@ def read_file_text(file_path: str, charset: str = CHARSET) -> str:
return read_file_bytes(file_path).decode(charset) return read_file_bytes(file_path).decode(charset)
def wipe(path: str) -> None: def wipe(path: Path) -> None:
"""Wipe provided path, whether directory or file.""" """Wipe provided path, whether directory or file."""
try: try:
shutil.rmtree(path) shutil.rmtree(path)
except NotADirectoryError: except NotADirectoryError:
Path(path).unlink(missing_ok=True) path.unlink(missing_ok=True)
except FileNotFoundError: except FileNotFoundError:
pass pass
def write(file_path: str, text: str, charset: str = CHARSET) -> None: def write(file_path: Path, text: str, charset: str = CHARSET) -> None:
"""Write text into a file.""" """Write text into a file."""
with Path(file_path).open(encoding=charset, mode="w") as file_object: with file_path.open(encoding=charset, mode="w") as file_object:
file_object.write(text) file_object.write(text)

View file

@ -1,8 +1,6 @@
"""Wrap GRUB commands.""" """Wrap GRUB commands."""
import cmd from rwx import cmd, ps
import ps
cmd.need("grub-mkimage") cmd.need("grub-mkimage")

11
rwx/os/__init__.py Normal file
View file

@ -0,0 +1,11 @@
"""Control Operating Systems."""
from pathlib import Path
class OS:
"""Operating System."""
def __init__(self, path: str) -> None:
"""Set root."""
self.root = Path(path)

View file

@ -1,6 +1,5 @@
"""Handle projects.""" """Handle projects."""
from os.path import realpath
from pathlib import Path from pathlib import Path
@ -9,6 +8,6 @@ class Project:
def __init__(self, file_path: str) -> None: def __init__(self, file_path: str) -> None:
"""Set file, root & name.""" """Set file, root & name."""
self.file: str = realpath(file_path) self.file: Path = Path(file_path).resolve()
self.root: str = Path(self.file).parent self.root: Path = self.file.parent
self.name: str = self.root.name self.name: str = self.root.name

View file

@ -1,5 +1,10 @@
"""Project consisting only of a Sphinx documentation.""" """Project consisting only of a Sphinx documentation."""
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from pathlib import Path
from sphinx.cmd.build import build_main from sphinx.cmd.build import build_main
from rwx.fs import wipe from rwx.fs import wipe
@ -15,7 +20,7 @@ class SphinxProject(Project):
def build(self) -> None: def build(self) -> None:
"""Build the project.""" """Build the project."""
output_root: str = self.root / "out" output_root: Path = self.root / "out"
wipe(output_root) wipe(output_root)
arguments: list[str] = [ arguments: list[str] = [
"-E", "-E",
@ -30,9 +35,9 @@ class SphinxProject(Project):
"-D", "-D",
"html_theme={}".format("sphinx_rtd_theme"), "html_theme={}".format("sphinx_rtd_theme"),
"-c", "-c",
self.root, str(self.root),
# "-C", # "-C",
self.root / self.name, str(self.root / self.name),
output_root / "web", str(output_root / "web"),
] ]
build_main(arguments) build_main(arguments)

View file

@ -5,7 +5,7 @@ import subprocess
from rwx import txt from rwx import txt
def get_tuples_args(*items: str | tuple[str]) -> list[str]: def get_tuples_args(*items: str | tuple[str, ...]) -> list[str]:
"""Turn arguments tuples into an arguments list.""" """Turn arguments tuples into an arguments list."""
args: list[str] = [] args: list[str] = []
for item in items: for item in items:
@ -16,21 +16,21 @@ def get_tuples_args(*items: str | tuple[str]) -> list[str]:
return args return args
def run(*items: str | tuple[str]) -> subprocess.CompletedProcess: def run(*items: str | tuple[str, ...]) -> subprocess.CompletedProcess:
"""Run from a list of arguments tuples.""" """Run from a list of arguments tuples."""
return subprocess.run( return subprocess.run(
get_tuples_args(*items), capture_output=False, check=True get_tuples_args(*items), capture_output=False, check=True
) )
def run_line(*items: str | tuple[str], charset: str = txt.CHARSET) -> str: def run_line(*items: str | tuple[str, ...], charset: str = txt.CHARSET) -> str:
"""Run and return output line.""" """Run and return output line."""
line, *_ = run_lines(*items, charset=charset) line, *_ = run_lines(*items, charset=charset)
return line return line
def run_lines( def run_lines(
*items: str | tuple[str], charset: str = txt.CHARSET *items: str | tuple[str, ...], charset: str = txt.CHARSET
) -> list[str]: ) -> list[str]:
"""Run and return output lines.""" """Run and return output lines."""
process = subprocess.run( process = subprocess.run(