Skip to content

Instantly share code, notes, and snippets.

@zstix
Created June 8, 2021 01:29
Show Gist options
  • Save zstix/61ea7858a1f6febf997814c25215ca0f to your computer and use it in GitHub Desktop.
Save zstix/61ea7858a1f6febf997814c25215ca0f to your computer and use it in GitHub Desktop.
#! /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