refactor: refactor toolset (not finished)

This commit is contained in:
2025-07-23 22:35:47 +08:00
parent 685a0b8066
commit 9f591113f8
10 changed files with 658 additions and 54 deletions

View File

@ -1,14 +1,15 @@
import os, typing, fnmatch, shutil
import os, typing, logging
from pathlib import Path
def get_plugin_folder() -> str:
def get_plugin_folder() -> Path:
"""
Get the absolute path to plugin root folder.
@return The absolute path to plugin root folder.
:return: The absolute path to plugin root folder.
"""
return os.path.dirname(os.path.dirname(__file__))
return Path(__file__).resolve().parent.parent
def relative_to_folder(abs_path: str, src_parent: str, dst_parent: str) -> str:
def relative_to_folder(abs_path: Path, src_parent: Path, dst_parent: Path) -> Path:
"""
Rebase one path to another path.
@ -19,16 +20,16 @@ def relative_to_folder(abs_path: str, src_parent: str, dst_parent: str) -> str:
For example, given `/path/to/file` and `/path`, it will compute relative path `to/file`.
Then it was applied to another folder path `/new` and got `/new/to/file`.
@param abs_path[in] The absolute path to a folder or file.
@param src_parent[in] The absolute path to folder which the `abs_path` will have relative path to.
@param dst_parent[in] The absolute path to folder which the relative path will be applied to.
:param abs_path: The absolute path to a folder or file.
:param src_parent: The absolute path to folder which the `abs_path` will have relative path to.
:param dst_parent: The absolute path to folder which the relative path will be applied to.
"""
return os.path.join(dst_parent, os.path.relpath(abs_path, src_parent))
return dst_parent / (abs_path.relative_to(src_parent))
def common_file_migrator(
from_folder: str, to_folder: str,
fct_proc_folder: typing.Callable[[str, str, str], None],
fct_proc_file: typing.Callable[[str, str, str], None]) -> None:
from_folder: Path, to_folder: Path,
fct_proc_folder: typing.Callable[[str, Path, Path], None],
fct_proc_file: typing.Callable[[str, Path, Path], None]) -> None:
"""
Common file migrator used by some build script.
@ -37,31 +38,42 @@ def common_file_migrator(
`fct_proc_folder` is a function pointer from caller which handle folder migration in detail.
`fct_proc_file` is same but handle file migration.
`fct_proc_folder` will receive 2 args.
First is a relative path presenting the folder we are processing which is usually used for printing to user.
Second is the source folder. Third is expected dest folder.
`fct_proc_folder` will receive 3 args.
First is the name of this folder which can be shown for end user.
Second is the source folder and third is expected dest folder.
`fct_proc_file` is same, but receive the file path instead.
Both of these function pointer should do the migration in detail. This function will only just iterate
folder and give essential args and will not do any migration operations such as copying or moving.
@param from_folder[in] The folder need to be migrated.
@param to_folder[in] The folder will be migrated to.
@param fct_proc_folder[in] Folder migration detail handler.
@param fct_proc_file[in] File migration detail handler.
:param from_folder: The folder need to be migrated.
:param to_folder: The folder will be migrated to.
:param fct_proc_folder: Folder migration detail handler.
:param fct_proc_file: File migration detail handler.
"""
# TODO: If we have Python 3.12, use Path.walk instead of current polyfill.
# iterate from_folder folder
for root, dirs, files in os.walk(from_folder, topdown = True):
for root, dirs, files in os.walk(from_folder, topdown=True):
root = Path(root)
# iterate folders
for name in dirs:
# prepare handler args
src_folder: str = os.path.join(root, name)
dst_folder: str = relative_to_folder(src_folder, from_folder, to_folder)
src_folder = root / name
dst_folder = relative_to_folder(src_folder, from_folder, to_folder)
# call handler
fct_proc_folder(name, src_folder, dst_folder)
# iterate files
for name in files:
# prepare handler args
src_file: str = os.path.join(root, name)
dst_file: str = relative_to_folder(src_file, from_folder, to_folder)
src_file = root / name
dst_file = relative_to_folder(src_file, from_folder, to_folder)
# call handler
fct_proc_file(name, src_file, dst_file)
def setup_logging() -> None:
"""
Setup uniform style for logging module.
"""
logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO)