Files
orisys-sdk/build/wheel_layout.py
T

92 lines
3.2 KiB
Python

"""Copy bundled non-code files into the Nuitka wheel tree."""
from __future__ import annotations
import shutil
from pathlib import Path
def resolve_bundle_source_files(repo_root: Path, item: dict) -> list[Path]:
"""Resolve explicit files and/or glob patterns for one bundle item."""
src_dir = repo_root / item["source"]
patterns = item.get("patterns", [])
files = item.get("files", [])
if not patterns and not files:
raise ValueError(f"Bundle item {item['name']!r} requires patterns and/or files")
seen: set[Path] = set()
resolved: list[Path] = []
def add(path: Path) -> None:
key = path.resolve()
if key not in seen:
seen.add(key)
resolved.append(path)
for pattern in patterns:
for path in sorted(src_dir.glob(pattern)):
if path.is_file():
add(path)
for name in files:
path = src_dir / name
if not path.is_file():
raise FileNotFoundError(f"Bundle file not found for {item['name']}: {path}")
add(path)
return resolved
def package_data_paths_for_item(item: dict) -> list[str]:
"""Return setuptools package_data paths relative to the orisys package."""
target = str(item["target"]).replace("\\", "/")
entries = [f"{target}/{pattern}" for pattern in item.get("patterns", [])]
entries.extend(f"{target}/{name}" for name in item.get("files", []))
return entries
def data_file_entries_for_item(item: dict) -> list[str]:
"""Return setuptools data_files paths relative to the repo root."""
source = str(item["source"]).replace("\\", "/")
entries = [f"{source}/{pattern}" for pattern in item.get("patterns", [])]
entries.extend(f"{source}/{name}" for name in item.get("files", []))
return entries
def copy_bundle_items(repo_root: Path, pkg_dir: Path, items: list[dict]) -> dict[str, int]:
copied_counts: dict[str, int] = {}
for item in items:
name = item["name"]
src_dir = repo_root / item["source"]
dst_dir = pkg_dir / item["target"]
dst_dir.mkdir(parents=True, exist_ok=True)
copied = 0
for src_file in resolve_bundle_source_files(repo_root, item):
if item.get("preserve_tree", False):
dst_file = dst_dir / src_file.relative_to(src_dir)
dst_file.parent.mkdir(parents=True, exist_ok=True)
else:
dst_file = dst_dir / src_file.name
shutil.copy(src_file, dst_file)
copied += 1
print(f"Copied {name}: {src_file}")
if name == "examples":
(dst_dir / "__init__.py").write_text("# Examples for orisys package\n", encoding="utf-8")
copied_counts[name] = copied
return copied_counts
def package_data_from_bundle(ext_suffix: str, items: list[dict]) -> dict[str, list[str]]:
package_data: dict[str, list[str]] = {
"orisys": [f"*{ext_suffix}"],
"orisys.examples": ["*.py", "README.md", "app_paths.py", "viz/**/*.py", "pipeline/**/*.py", "gui/**/*.py"],
}
for item in items:
if item["name"] == "examples":
continue
package_data["orisys"].extend(package_data_paths_for_item(item))
return package_data