diff --git a/github_to_sqlite/cli.py b/github_to_sqlite/cli.py index fbd3321..debcfd2 100644 --- a/github_to_sqlite/cli.py +++ b/github_to_sqlite/cli.py @@ -601,6 +601,32 @@ def workflows(db_path, repos, auth): utils.save_workflow(db, repo_id, filename, content) utils.ensure_db_shape(db) +@cli.command() +@click.argument( + "db_path", + type=click.Path(file_okay=True, dir_okay=False, allow_dash=False), + required=True, +) +@click.argument("org", type=str, nargs=1) +@click.option( + "-a", + "--auth", + type=click.Path(file_okay=True, dir_okay=False, allow_dash=True), + default="auth.json", + help="Path to auth.json token file", +) +def teams(db_path, org, auth): + "Fetch details of GitHub teams for the given org" + db = sqlite_utils.Database(db_path) + token = load_token(auth) + teams = utils.fetch_teams(org, token=token) + + for team in teams: + utils.save_team(db, team) + members_url = team["members_url"].replace("{/member}", "") + members = utils.fetch_team_members(members_url, token=token) + utils.save_team_members(db, team, members) + def load_token(auth): try: diff --git a/github_to_sqlite/utils.py b/github_to_sqlite/utils.py index bae4ac6..5a2c946 100644 --- a/github_to_sqlite/utils.py +++ b/github_to_sqlite/utils.py @@ -461,6 +461,17 @@ def fetch_user(username=None, token=None): url = "https://api.github.com/user" return requests.get(url, headers=headers).json() +def fetch_teams(org, token=None): + headers = make_headers(token) + url = "https://api.github.com/orgs/{}/teams".format(org) + for teams in paginate(url, headers=headers): + yield from teams + +def fetch_team_members(url, token=None): + headers = make_headers(token) + for members in paginate(url, headers=headers): + yield from members + def paginate(url, headers=None): while url: @@ -878,3 +889,24 @@ def save_workflow(db, repo_id, filename, content): pk="id", foreign_keys=["job", "repo"], ) + +def save_team(db, team): + team_to_insert = { + key: value for key, value in team.items() if not key.endswith("url") + } + db["teams"].upsert(team, pk="id") + +def save_team_members(db, team, members): + members_to_insert=[] + for member in members: + save_user(db, member); + members_to_insert.append({ + "team": team["id"], + "member": member["id"], + }) + + db["team_members"].upsert_all( + members_to_insert, + pk=["team", "member"], + foreign_keys=(("team", "teams", "id"), ("member", "users", "id")), + ) \ No newline at end of file