#!/usr/bin/env python3 import argparse import io import json import os.path import re import urllib.request import zipfile DEFINITION_RE = re.compile( r'https://dev.azure.com/(?P[^/]+)/(?P[^/]+)' r'/_build/latest\?definitionId=(?P\d+)', ) BUILDS = 'https://dev.azure.com/{org}/{project}/_apis/build/builds?api-version=5.0&definitions={definition}&$top=5' # noqa: E501 ARTIFACTS = 'https://dev.azure.com/{org}/{project}/_apis/build/builds/{build}/artifacts?api-version=5.0' # noqa: E501 def main() -> int: parser = argparse.ArgumentParser() parser.add_argument('tag') parser.add_argument('--dest', default='dist') args = parser.parse_args() with open('README.rst') as f: match = DEFINITION_RE.search(f.read()) assert match builds_resp = urllib.request.urlopen(BUILDS.format(**match.groupdict())) builds_json = json.load(builds_resp) build_id = next( iter([ build['id'] for build in builds_json['value'] if build['status'] == 'completed' if build['result'] == 'succeeded' if build['sourceBranch'] == f'refs/tags/{args.tag}' ]), ) artifacts_url = ARTIFACTS.format(build=build_id, **match.groupdict()) artifacts_resp = urllib.request.urlopen(artifacts_url) artifacts_json = json.load(artifacts_resp) os.makedirs(args.dest, exist_ok=True) for artifact in artifacts_json['value']: if artifact['name'].startswith('wheel_'): print(f'artifact: {artifact["name"]}') resp = urllib.request.urlopen(artifact['resource']['downloadUrl']) bio = io.BytesIO(resp.read()) with zipfile.ZipFile(bio) as zipf: for info in zipf.infolist(): if info.filename.endswith('.whl'): info.filename = os.path.basename(info.filename) zipf.extract(info, path=args.dest) return 0 if __name__ == '__main__': raise SystemExit(main())