| # SPDX-License-Identifier: Apache-2.0 | |
| # Copyright 2021 The Meson development team | |
| from __future__ import annotations | |
| import importlib.resources | |
| from pathlib import PurePosixPath, Path | |
| import typing as T | |
| if T.TYPE_CHECKING: | |
| from .environment import Environment | |
| class DataFile: | |
| def __init__(self, path: str) -> None: | |
| self.path = PurePosixPath(path) | |
| def write_once(self, path: Path) -> None: | |
| if not path.exists(): | |
| data = importlib.resources.read_text( # [ignore encoding] it's on the next lines, Mr. Lint | |
| ('mesonbuild' / self.path.parent).as_posix().replace('/', '.'), | |
| self.path.name, | |
| encoding='utf-8') | |
| path.write_text(data, encoding='utf-8') | |
| def write_to_private(self, env: 'Environment') -> Path: | |
| try: | |
| # The issue that mypy/pyright see here is caused by a bug in typeshed: | |
| # https://github.com/python/typeshed/pull/15108 | |
| resource = importlib.resources.files('mesonbuild') / self.path # type: ignore[operator] | |
| if isinstance(resource, Path): | |
| return resource | |
| except AttributeError: | |
| # fall through to zipapp compatible code | |
| pass | |
| out_file = Path(env.scratch_dir) / 'data' / self.path.name | |
| out_file.parent.mkdir(exist_ok=True) | |
| self.write_once(out_file) | |
| return out_file |