You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2021/02/02 16:52:46 UTC
[superset] branch 1.0 updated: feat(release): add github token to
changelog script (#12872)
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 1.0
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/1.0 by this push:
new 4b8f54d feat(release): add github token to changelog script (#12872)
4b8f54d is described below
commit 4b8f54dfa1eb276a72cd8f2d404a3f7c59af581f
Author: Daniel Vaz Gaspar <da...@gmail.com>
AuthorDate: Tue Feb 2 09:24:40 2021 +0000
feat(release): add github token to changelog script (#12872)
---
RELEASING/README.md | 2 ++
RELEASING/changelog.py | 77 +++++++++++++++++++++-----------------------
requirements/base.txt | 6 ++--
requirements/development.in | 1 +
requirements/development.txt | 7 ++--
requirements/testing.txt | 1 -
6 files changed, 47 insertions(+), 47 deletions(-)
diff --git a/RELEASING/README.md b/RELEASING/README.md
index 57fdaa5..94c5497 100644
--- a/RELEASING/README.md
+++ b/RELEASING/README.md
@@ -114,6 +114,8 @@ git push upstream $SUPERSET_GITHUB_BRANCH
Next, update the `CHANGELOG.md` with all the changes that are included in the release.
Make sure the branch has been pushed to `upstream` to ensure the changelog generator
can pick up changes since the previous release.
+Change log script requires a github token and will try to use your env var GITHUB_TOKEN.
+you can also pass the token using the parameter `--access_token`.
Example:
```bash
diff --git a/RELEASING/changelog.py b/RELEASING/changelog.py
index 07daacb..1d83aad 100644
--- a/RELEASING/changelog.py
+++ b/RELEASING/changelog.py
@@ -17,18 +17,22 @@
# pylint: disable=no-value-for-parameter
import csv as lib_csv
-import json
import os
import re
import sys
from dataclasses import dataclass
-from time import sleep
from typing import Any, Dict, Iterator, List, Optional, Union
-from urllib import request
-from urllib.error import HTTPError
import click
+try:
+ from github import BadCredentialsException, Github, PullRequest
+except ModuleNotFoundError:
+ print("PyGithub is a required package for this script")
+ exit(1)
+
+SUPERSET_REPO = "apache/superset"
+
@dataclass
class GitLog:
@@ -60,47 +64,31 @@ class GitChangeLog:
We want to map a git author to a github login, for that we call github's API
"""
- def __init__(self, version: str, logs: List[GitLog]) -> None:
+ def __init__(
+ self, version: str, logs: List[GitLog], access_token: Optional[str] = None
+ ) -> None:
self._version = version
self._logs = logs
self._github_login_cache: Dict[str, Optional[str]] = {}
self._wait = 10
+ github_token = access_token or os.environ.get("GITHUB_TOKEN")
+ self._github = Github(github_token)
+ self._superset_repo = ""
- def _wait_github_rate_limit(self) -> None:
- """
- Waits for available rate limit slots on the github API
- """
- while True:
- rate_limit_payload = self._fetch_github_rate_limit()
- if rate_limit_payload["rate"]["remaining"] > 1:
- break
- print(".", end="", flush=True)
- sleep(self._wait)
- print()
-
- @staticmethod
- def _fetch_github_rate_limit() -> Dict[str, Any]:
- """
- Fetches current github rate limit info
- """
- with request.urlopen("https://api.github.com/rate_limit") as response:
- payload = json.loads(response.read())
- return payload
-
- def _fetch_github_pr(self, pr_number: int) -> Dict[str, Any]:
+ def _fetch_github_pr(self, pr_number: int) -> PullRequest:
"""
Fetches a github PR info
"""
- payload = {}
try:
- self._wait_github_rate_limit()
- with request.urlopen(
- "https://api.github.com/repos/apache/superset/pulls/" f"{pr_number}"
- ) as response:
- payload = json.loads(response.read())
- except HTTPError as ex:
- print(f"{ex}", flush=True)
- return payload
+ github_repo = self._github.get_repo(SUPERSET_REPO)
+ except BadCredentialsException as ex:
+ print(
+ f"Bad credentials to github provided"
+ f" use access_token parameter or set GITHUB_TOKEN"
+ )
+ sys.exit(1)
+
+ return github_repo.get_pull(pr_number)
def _get_github_login(self, git_log: GitLog) -> Optional[str]:
"""
@@ -113,7 +101,7 @@ class GitChangeLog:
if git_log.pr_number:
pr_info = self._fetch_github_pr(git_log.pr_number)
if pr_info:
- github_login = pr_info["user"]["login"]
+ github_login = pr_info.user.login
else:
github_login = author_name
# set cache
@@ -131,7 +119,7 @@ class GitChangeLog:
github_login = log.author
result = result + (
f"- [#{log.pr_number}]"
- f"(https://github.com/apache/superset/pull/{log.pr_number}) "
+ f"(https://github.com/{SUPERSET_REPO}/pull/{log.pr_number}) "
f"{log.message} (@{github_login})\n"
)
print(f"\r {i}/{len(self._logs)}", end="", flush=True)
@@ -141,7 +129,7 @@ class GitChangeLog:
for log in self._logs:
yield {
"pr_number": log.pr_number,
- "pr_link": f"https://github.com/apache/superset/pull/"
+ "pr_link": f"https://github.com/{SUPERSET_REPO}/pull/"
f"{log.pr_number}",
"message": log.message,
"time": log.time,
@@ -276,13 +264,20 @@ def compare(base_parameters: BaseParameters) -> None:
@click.option(
"--csv", help="The csv filename to export the changelog to",
)
+@click.option(
+ "--access_token",
+ help="The github access token,"
+ " if not provided will try to fetch from GITHUB_TOKEN env var",
+)
@click.pass_obj
-def change_log(base_parameters: BaseParameters, csv: str) -> None:
+def change_log(base_parameters: BaseParameters, csv: str, access_token: str) -> None:
""" Outputs a changelog (by PR) """
previous_logs = base_parameters.previous_logs
current_logs = base_parameters.current_logs
previous_diff_logs = previous_logs.diff(current_logs)
- logs = GitChangeLog(current_logs.git_ref, previous_diff_logs[::-1])
+ logs = GitChangeLog(
+ current_logs.git_ref, previous_diff_logs[::-1], access_token=access_token
+ )
if csv:
with open(csv, "w") as csv_file:
log_items = list(logs)
diff --git a/requirements/base.txt b/requirements/base.txt
index 64ae5d1..8b41983 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -77,7 +77,7 @@ prison==0.1.3 # via flask-appbuilder
py==1.9.0 # via retry
pyarrow==1.0.1 # via apache-superset
pycparser==2.20 # via cffi
-pyjwt==1.7.1 # via flask-appbuilder, flask-jwt-extended
+pyjwt==1.7.1 # via apache-superset, flask-appbuilder, flask-jwt-extended
pymeeus==0.3.7 # via convertdate
pyparsing==2.4.7 # via apache-superset, packaging
pyrsistent==0.16.1 # via -r requirements/base.in, jsonschema
@@ -92,12 +92,12 @@ redis==3.5.3 # via apache-superset
retry==0.9.2 # via apache-superset
selenium==3.141.0 # via apache-superset
simplejson==3.17.2 # via apache-superset
-six==1.15.0 # via bleach, cryptography, flask-jwt-extended, flask-talisman, holidays, isodate, jsonschema, pathlib2, polyline, prison, pyrsistent, python-dateutil, sqlalchemy-utils, wtforms-json
+six==1.15.0 # via bleach, cryptography, flask-jwt-extended, flask-talisman, holidays, isodate, jsonschema, packaging, pathlib2, polyline, prison, pyrsistent, python-dateutil, sqlalchemy-utils, wtforms-json
slackclient==2.5.0 # via apache-superset
sqlalchemy-utils==0.36.8 # via apache-superset, flask-appbuilder
sqlalchemy==1.3.20 # via alembic, apache-superset, flask-sqlalchemy, marshmallow-sqlalchemy, sqlalchemy-utils
sqlparse==0.3.0 # via apache-superset
-typing-extensions==3.7.4.3 # via aiohttp, yarl
+typing-extensions==3.7.4.3 # via aiohttp, apache-superset, yarl
urllib3==1.25.11 # via selenium
vine==1.3.0 # via amqp, celery
webencodings==0.5.1 # via bleach
diff --git a/requirements/development.in b/requirements/development.in
index eae2866..5ac06dc 100644
--- a/requirements/development.in
+++ b/requirements/development.in
@@ -24,3 +24,4 @@ pyhive[hive]>=0.6.1
psycopg2-binary==2.8.5
tableschema
thrift>=0.11.0,<1.0.0
+pygithub>=1.54.1,<2.0.0
diff --git a/requirements/development.txt b/requirements/development.txt
index af94def..f0eb493 100644
--- a/requirements/development.txt
+++ b/requirements/development.txt
@@ -1,4 +1,4 @@
-# SHA1:ae0364cae066a5cb8fb543c4f568bfcdacb6c1b7
+# SHA1:b7181d683bed10ffe4892d2f07bc94a503f46b44
#
# This file is autogenerated by pip-compile-multi
# To update, run:
@@ -11,6 +11,7 @@ boto3==1.16.10 # via tabulator
botocore==1.19.10 # via boto3, s3transfer
cached-property==1.5.2 # via tableschema
certifi==2020.6.20 # via requests
+deprecated==1.2.11 # via pygithub
et-xmlfile==1.0.1 # via openpyxl
flask-cors==3.0.9 # via -r requirements/development.in
future==0.18.2 # via pyhive
@@ -24,8 +25,9 @@ openpyxl==3.0.5 # via tabulator
pillow==7.2.0 # via -r requirements/development.in
psycopg2-binary==2.8.5 # via -r requirements/development.in
pydruid==0.6.1 # via -r requirements/development.in
+pygithub==1.54.1 # via -r requirements/development.in
pyhive[hive]==0.6.3 # via -r requirements/development.in
-requests==2.24.0 # via pydruid, tableschema, tabulator
+requests==2.24.0 # via pydruid, pygithub, tableschema, tabulator
rfc3986==1.4.0 # via tableschema
s3transfer==0.3.3 # via boto3
sasl==0.2.1 # via pyhive, thrift-sasl
@@ -34,6 +36,7 @@ tabulator==1.52.5 # via tableschema
thrift-sasl==0.4.2 # via pyhive
thrift==0.13.0 # via -r requirements/development.in, pyhive, thrift-sasl
unicodecsv==0.14.1 # via tableschema, tabulator
+wrapt==1.12.1 # via deprecated
xlrd==1.2.0 # via tabulator
# The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/testing.txt b/requirements/testing.txt
index 2c97c83..8ea641b 100644
--- a/requirements/testing.txt
+++ b/requirements/testing.txt
@@ -40,7 +40,6 @@ traitlets==5.0.5 # via ipython
typed-ast==1.4.1 # via astroid
wcwidth==0.2.5 # via prompt-toolkit
websocket-client==0.57.0 # via docker
-wrapt==1.12.1 # via astroid
# The following packages are considered to be unsafe in a requirements file:
# pip