"""インストール済みの雛形をカレントディレクトリに配置する。"""
from __future__ import annotations
import argparse
import shutil
import sysconfig
from importlib import metadata
from pathlib import Path
DISTRIBUTION_NAME: str = "aenet-env"
SCRIPTS_RELATIVE_DIRECTORY: Path = Path("share/aenet_env/scripts")
[ドキュメント]
def find_installed_scripts() -> list[Path]:
"""インストール先と配布記録を調べ、同名の雛形を一度だけ取得する。"""
sources_by_name: dict[str, Path] = {}
data_directory = Path(sysconfig.get_path("data"))
installed_directory = data_directory / SCRIPTS_RELATIVE_DIRECTORY
if installed_directory.is_dir():
for source in sorted(installed_directory.iterdir()):
if source.is_file():
sources_by_name[source.name] = source
distribution = metadata.distribution(DISTRIBUTION_NAME)
installed_files = distribution.files
if installed_files is not None:
for file in installed_files:
relative_path = Path(str(file))
if relative_path.parent.parts[-len(SCRIPTS_RELATIVE_DIRECTORY.parts):] != SCRIPTS_RELATIVE_DIRECTORY.parts:
continue
source = Path(distribution.locate_file(file))
if source.is_file() and source.name not in sources_by_name:
sources_by_name[source.name] = source
return [sources_by_name[name] for name in sorted(sources_by_name)]
[ドキュメント]
def install_scripts(
destination: Path,
*,
force: bool = False,
) -> tuple[int, int]:
"""雛形を配置する。forceが真のときだけ既存ファイルを上書きする。"""
sources = find_installed_scripts()
if not sources:
raise RuntimeError(
"インストール済みの雛形が見つかりません。"
"pipでインストールした環境のshare/aenet_env/scriptsを確認してください。"
)
destination.mkdir(parents=True, exist_ok=True)
copied = 0
skipped = 0
for source in sources:
target = destination / source.name
if target.exists() and not force:
print(f"既存のためスキップ: {target.name}")
skipped += 1
continue
if target.is_dir():
raise IsADirectoryError(f"コピー先がディレクトリです: {target}")
existed = target.exists()
shutil.copy2(source, target)
if existed:
print(f"上書き: {target.name}")
else:
print(f"コピー: {target.name}")
copied += 1
return copied, skipped
[ドキュメント]
def main() -> None:
"""aenet_env install で雛形をカレントディレクトリに配置する。"""
parser = argparse.ArgumentParser(prog="aenet_env")
subparsers = parser.add_subparsers(dest="command", required=True)
install_parser = subparsers.add_parser("install", help="編集用スクリプトを配置する")
install_parser.add_argument("--force", action="store_true", help="既存ファイルを上書きする")
args = parser.parse_args()
if args.command == "install":
copied, skipped = install_scripts(Path.cwd(), force=args.force)
print(f"完了: コピー {copied} 件、スキップ {skipped} 件")
if __name__ == "__main__":
main()