""" Print information about how many free minutes of GitHub actions are left for this cycle. The API for this is documented [here](https://docs.github.com/en/rest/billing/billing?apiVersion=2022-11-28#get-github-actions-billing-for-an-organization). For this you need a [token](https://github.com/settings/personal-access-tokens) with the following permissions: - [plan](https://docs.github.com/en/rest/authentication/permissions-required-for-fine-grained-personal-access-tokens?apiVersion=2022-11-28#user-permissions-for-plan) """ import sys import click import requests API_URL = "https://api.github.com" @click.command() @click.option("-t", "--token", required=True, help="GitHub API token") @click.option("-u", "--user", default="fcuny", help="GitHub username") def cli(token, user): # https://docs.github.com/en/rest/billing/billing?apiVersion=2022-11-28#get-github-actions-billing-for-an-organization url = f"{API_URL}/users/{user}/settings/billing/actions" headers = {"Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json"} try: response = requests.get(url, headers=headers, timeout=30) response.raise_for_status() except requests.exceptions.RequestException as err: click.echo(f"Error making HTTP request: {err}", err=True) sys.exit(1) try: billing_info = response.json() except ValueError as err: click.echo(f"Error parsing the JSON response: {err}", err=True) sys.exit(1) time_remaining = billing_info["included_minutes"] - billing_info["total_minutes_used"] click.echo( f"This cycle, {int(billing_info['total_minutes_used'])} minutes have been used, and {int(time_remaining)} minutes are remaining" ) if __name__ == "__main__": cli()