You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.6 KiB
153 lines
4.6 KiB
""" |
|
This builder functions as a pseudo builder that instead downloads and installs a binary file using |
|
release-gitter based on a pyproject.toml file. It's a total hack... |
|
""" |
|
from __future__ import annotations |
|
|
|
from pathlib import Path |
|
from shutil import copytree |
|
from shutil import move |
|
|
|
import toml |
|
from wheel.wheelfile import WheelFile |
|
|
|
import release_gitter as rg |
|
from release_gitter import removeprefix |
|
|
|
|
|
PACKAGE_NAME = "pseudo" |
|
|
|
|
|
def download(config) -> list[Path]: |
|
release = rg.fetch_release( |
|
rg.GitRemoteInfo(config.hostname, config.owner, config.repo), config.version |
|
) |
|
asset = rg.match_asset( |
|
release, |
|
config.format, |
|
version=config.version, |
|
system_mapping=config.map_system, |
|
arch_mapping=config.map_arch, |
|
) |
|
|
|
files = rg.download_asset(asset, extract_files=config.extract_files) |
|
|
|
# Optionally execute post command |
|
if config.exec: |
|
rg.check_call(config.exec, shell=True) |
|
|
|
return files |
|
|
|
|
|
def read_metadata(): |
|
config = toml.load("pyproject.toml").get("tool", {}).get("release-gitter") |
|
if not config: |
|
raise ValueError("Must have configuration in [tool.release-gitter]") |
|
|
|
args = [] |
|
for key, value in config.items(): |
|
key = "--" + key |
|
if key == "--format": |
|
args += [value] |
|
elif isinstance(value, dict): |
|
for sub_key, sub_value in value.items(): |
|
args = [key, f"{sub_key}={sub_value}"] + args |
|
elif isinstance(value, list): |
|
for sub_value in value: |
|
args = [key, sub_value] + args |
|
else: |
|
args = [key, value] + args |
|
|
|
return rg._parse_args(args) |
|
|
|
|
|
class _PseudoBuildBackend: |
|
# Should allow passing args as `--build-option` |
|
_gitter_args = None |
|
|
|
def prepare_metadata_for_build_wheel( |
|
self, metadata_directory, config_settings=None |
|
): |
|
# Createa .dist-info directory containing wheel metadata inside metadata_directory. Eg {metadata_directory}/{package}-{version}.dist-info/ |
|
print("Prepare meta", metadata_directory, config_settings) |
|
|
|
metadata = read_metadata() |
|
version = removeprefix(metadata.version, "v") |
|
|
|
# Returns distinfo dir? |
|
dist_info = Path(metadata_directory) / f"{PACKAGE_NAME}-{version}.dist-info" |
|
dist_info.mkdir() |
|
|
|
# Write metadata |
|
pkg_info = dist_info / "METADATA" |
|
pkg_info.write_text( |
|
"\n".join( |
|
[ |
|
"Metadata-Version: 2.1", |
|
f"Name: {PACKAGE_NAME}", |
|
f"Version: {version}", |
|
] |
|
) |
|
) |
|
|
|
# Write wheel info |
|
wheel_info = dist_info / "WHEEL" |
|
wheel_info.write_text( |
|
"\n".join( |
|
[ |
|
"Wheel-Version: 1.0", |
|
"Root-Is-Purelib: true", |
|
"Tag: py2-none-any", |
|
"Tag: py3-none-any", |
|
] |
|
) |
|
) |
|
|
|
return str(dist_info) |
|
|
|
def build_sdist(self, sdist_directory, config_settings=None): |
|
# Builds a .tar.gz and places it in specified sdist_directory |
|
# That should contain a toplevel drectory of `name-version` containing source files and the pyproject.toml |
|
|
|
# HACK: This isn't needed or used |
|
p = Path(sdist_directory + ".dist-info") |
|
return p |
|
|
|
def build_wheel( |
|
self, wheel_directory, config_settings=None, metadata_directory=None |
|
): |
|
metadata_directory = Path(metadata_directory) |
|
|
|
metadata = read_metadata() |
|
version = removeprefix(metadata.version, "v") |
|
|
|
wheel_directory = Path(wheel_directory) |
|
wheel_directory.mkdir(exist_ok=True) |
|
|
|
wheel_scripts = wheel_directory / f"{PACKAGE_NAME}-{version}.data/scripts" |
|
wheel_scripts.mkdir(parents=True, exist_ok=True) |
|
|
|
copytree(metadata_directory, wheel_directory / metadata_directory.name) |
|
|
|
metadata = read_metadata() |
|
files = download(metadata) |
|
for file in files: |
|
move(file, wheel_scripts / file.name) |
|
|
|
print(f"ls {wheel_directory}: {list(wheel_directory.glob('*'))}") |
|
|
|
wheel_filename = f"{PACKAGE_NAME}-{version}-py2.py3-none-any.whl" |
|
with WheelFile(wheel_directory / wheel_filename, "w") as wf: |
|
print("Repacking wheel as {}...".format(wheel_filename), end="") |
|
# sys.stdout.flush() |
|
wf.write_files(wheel_directory) |
|
|
|
return wheel_filename |
|
|
|
|
|
_BACKEND = _PseudoBuildBackend() |
|
|
|
|
|
prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel |
|
build_sdist = _BACKEND.build_sdist |
|
build_wheel = _BACKEND.build_wheel
|
|
|