|
| 1 | +import json |
| 2 | +from typing import Dict, List |
| 3 | +from urllib3.poolmanager import PoolManager |
| 4 | +from urllib3.response import HTTPResponse |
| 5 | + |
| 6 | +from github.GitRelease import GitRelease |
| 7 | + |
| 8 | +from mkdocs_markmap.__meta__ import PROJECT_NAME |
| 9 | +from .common import GithubHandler |
| 10 | + |
| 11 | + |
| 12 | +PYPI_URL = f'https://pypi.org/pypi/{PROJECT_NAME}/json' |
| 13 | + |
| 14 | + |
| 15 | +class ReleaseInfo(GithubHandler): |
| 16 | + def print(self, github: bool = True, pypi: bool = False) -> None: |
| 17 | + if github: |
| 18 | + self._print_github() |
| 19 | + if pypi: |
| 20 | + self._print_pypi() |
| 21 | + |
| 22 | + def _print_github(self) -> None: |
| 23 | + release: GitRelease |
| 24 | + if self.tag is None: |
| 25 | + release = self.repository.get_latest_release() |
| 26 | + |
| 27 | + else: |
| 28 | + try: |
| 29 | + release = next(r for r in self.repository.get_releases() if r.tag_name == self.tag) |
| 30 | + except StopIteration: |
| 31 | + print(f'release not found on github: {self.tag}') |
| 32 | + return |
| 33 | + |
| 34 | + print(f""" |
| 35 | + Release: {release.title} |
| 36 | + Url: {release.url} |
| 37 | + Created: {release.created_at} |
| 38 | + Published: {release.published_at} |
| 39 | + Draft: {release.draft} |
| 40 | + Prerelease: {release.prerelease} |
| 41 | + Assets: {', '.join(a.name for a in release.get_assets())} |
| 42 | + """) |
| 43 | + |
| 44 | + def _print_pypi(self) -> None: |
| 45 | + http: PoolManager = PoolManager() |
| 46 | + response: HTTPResponse = http.request('GET', PYPI_URL) |
| 47 | + if response.status != 200: |
| 48 | + print(f'error on pypi request: {response._request_url} ({response.status})') |
| 49 | + return |
| 50 | + |
| 51 | + project_data = json.loads(response.data) |
| 52 | + release_url: str = project_data['info']['release_url'] |
| 53 | + downloads: Dict[str, int] = project_data['info']['downloads'] |
| 54 | + |
| 55 | + version: str |
| 56 | + if self.tag is None: |
| 57 | + version = project_data['info']['version'] |
| 58 | + else: |
| 59 | + version = self.tag[1:] |
| 60 | + release_url = release_url.replace(project_data['info']['version'], version) |
| 61 | + |
| 62 | + try: |
| 63 | + assets: List[Dict[str, str]] = project_data['releases'][version] |
| 64 | + except KeyError: |
| 65 | + print(f'release not found on pypi: {self.tag}') |
| 66 | + return |
| 67 | + |
| 68 | + uploaded: str |
| 69 | + if not any(assets): |
| 70 | + uploaded = 'no assets!' |
| 71 | + else: |
| 72 | + uploaded = assets[0]['upload_time'].replace('T', ' ') |
| 73 | + |
| 74 | + print(f""" |
| 75 | + Release: {version} |
| 76 | + Url: {release_url} |
| 77 | + Assets: {', '.join(a['filename'] for a in assets)} |
| 78 | + Uploaded: {uploaded} |
| 79 | + Downloads: |
| 80 | + Last Month: {downloads['last_month']} |
| 81 | + Last Week: {downloads['last_week']} |
| 82 | + Last Day: {downloads['last_day']} |
| 83 | + """) |
0 commit comments