Created
June 8, 2021 01:29
-
-
Save zstix/61ea7858a1f6febf997814c25215ca0f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/python | |
import requests | |
import json | |
import itertools | |
API_URL = "https://api.github.com" | |
HEADERS = {"Accept":"application/vnd.github.inertia-preview+json"} | |
ORG = "newrelic" | |
PROJECT = "Developer Enablement Team" | |
# helper functions | |
def find(arr, k, v, default = False): | |
return reduce(lambda acc, x: x if x[k] == v else acc, arr, default) | |
def flatten(arr): | |
return list(itertools.chain.from_iterable(arr)) | |
def filter_by_milestone(name): | |
return lambda x: x["milestone"] and x["milestone"]["title"] == name | |
def filter_by_label(name): | |
return lambda x: x["labels"] and find(x["labels"], "name", name) | |
# file functions | |
def save_to_json_file(filename, data): | |
with open(filename, 'w') as file: | |
json.dump(data, file) | |
print("[*] Wrote JSON to %s" % filename) | |
def load_from_json_file(filename): | |
with open(filename) as file: | |
print("[*] Reading JSON from %s" % filename) | |
return json.load(file) | |
# API functions | |
def call_api(endpoint, params = {}): | |
resp = requests.get(API_URL + endpoint, headers=HEADERS, params=params) | |
if resp.status_code == 200: | |
return resp.json() | |
else: | |
print("[!] %s" % resp.text) | |
raise Exception("[!] Unable to call API %s" % endpoint) | |
def get_projects(org): | |
return call_api("/orgs/%s/projects" % org) | |
def get_project(org, name): | |
projects = get_projects(org) | |
return find(projects, "name", name) | |
def get_repo_issues(org, repo): | |
params = {"per_page": 100, "state": "all"} | |
return call_api("/repos/%s/%s/issues" % (org, repo), params) | |
def get_repo_milestones(org, repo): | |
params = {"per_page": 100, "state": "all"} | |
return call_api("/repos/%s/%s/milestones" % (org, repo), params) | |
# TODO: get this working with the query param | |
def get_repo_milestone_issues(org, repo, name): | |
milestones = get_repo_milestones(org, repo) | |
milestone = find(milestones, "title", name) | |
params = {"per_page": 100, "state": "all", "milestone": milestone["id"]} | |
return call_api("/repos/%s/%s/issues" % (org, repo), params) | |
# issues = get_repo_issues(org, repo) | |
# return filter(filter_by_milestone(name), issues) | |
def get_issues_by_milestone_label(org, repo, milestone, label): | |
issues = get_repo_milestone_issues(org, repo, milestone) | |
return filter(filter_by_label(label), issues) | |
def get_issue_points(issue): | |
labels = map(lambda x: x['name'], issue['labels']) | |
print("\t%s" % labels) | |
label = reduce(lambda acc, x: x if x[:3] == "sp:" else acc, labels, "sp:0") | |
return label[3:] | |
def get_issues_points(issues): | |
return reduce(lambda acc, x: acc + get_issue_points(x), issues, 0) | |
# entrypoint | |
if __name__ == "__main__": | |
# How many points with "bug" label in a sprint | |
repos = ["docs-website", "developer-website", "opensource-website", | |
"newrelic-observability-packs"] | |
milestone = "[DevEn] Sprint 5" | |
bugs = [] | |
for repo in repos: | |
issues = get_issues_by_milestone_label(ORG, repo, milestone, "bug") | |
bugs.append(issues) | |
save_to_json_file("bugs.json", flatten(bugs)) | |
# data = load_from_json_file("bugs.json") | |
# for issue in data: | |
# print("[%s] %s" % (get_issue_points(issue), issue["title"])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment