refactor: refactor toolset (not finished)
This commit is contained in:
@ -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)
|
||||
|
Reference in New Issue
Block a user