Source code for wow_wtf_manager.exp.e03_wotlk.sdm.enum_generator
# -*- coding: utf-8 -*-
"""
``sdm_macro.py`` 是用来枚举所有的 ``${SDMMacro}.yml`` 文件的模块. 人类通常是专注于编辑
YAML 文件. 我们希望免除人类编辑 ``sdm_macro.py`` 并保证它和 YAML 文件一一对应的麻烦, 所以
开发了这个工具, 能自动扫描指定文件夹, 定位到那些 YAML 文件, 并自动生成 ``sdm_macro.py`` 的
内容.
"""
import attr
from pathlib_mate import Path
[docs]@attr.define
class SDMMacroYamlFile:
"""
代表一个 SDMMacro Yaml 文件, 每一个文件都会变成 enum 里面的一行代码.
"""
dir_root_var_name: str
dir_root: Path
path: Path
def render(self) -> str:
relpath = self.path.relative_to(self.dir_root)
key = "sdm_" + (
str(relpath)[:-4] # remove ".yml"
.replace("-", "_") # replace "-" with "_"
.replace("/", "____") # replace "/" with "____" for MacOS / Linux
.replace("\\", "____") # replace "\\" with "____" for windows
)
join_args = ", ".join([f'"{part}"' for part in relpath.parts])
sdm_file_path = f"{self.dir_root_var_name}.joinpath({join_args})"
value = f"SDMMacroFile(path={sdm_file_path})"
return f"{key} = {value}"
[docs]@attr.define
class SDMMacroModuleGenerator:
"""
:param import_line: something like ``from wow_wtf_manager.paths import dir_wotlk_example_sdm``
:param dir_root_var_name: the imported path variable name form the ``import_line``
:param dir_root: the root directory of all SDMMacro Yaml files.
:param path_sdm_macro_py: the path of ``sdm_macro.py`` file.
"""
import_line: str
dir_root_var_name: str
dir_root: Path
path_sdm_macro_py: Path
def render(self):
lines = [
"# -*- coding: utf-8 -*-",
"",
self.import_line,
"from wow_wtf_manager.exp.e03_wotlk.sdm.api import SDMMacroFile",
"",
"class Macros:",
]
for path in Path.sort_by_abspath(
self.dir_root.select_by_ext(".yml")
):
line = SDMMacroYamlFile(
dir_root_var_name=self.dir_root_var_name,
dir_root=self.dir_root,
path=path,
).render()
lines.append(" " * 4 + line)
return "\n".join(lines)
def generate(self):
self.path_sdm_macro_py.write_text(self.render())