diff --git a/Makefile b/Makefile index 74d2b51..c024074 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ build: instructions run: instructions cd ./src/github_projects_burndown_chart \ - && PYTHONPATH=. python main.py $(project_type) + && PYTHONPATH=. python main.py $(project_type) $(project_name) test: instructions coverage run \ diff --git a/README.md b/README.md index ffcbe08..db209d2 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,20 @@ # Burndown Chart for GitHub Projects An easy to use [burndown chart](https://www.scrum.org/resources/scrum-glossary#:~:text=B-,burn-down%20chart,-%3A%C2%A0a%20chart%20which) generator for [GitHub Project Boards](https://docs.github.com/en/issues/organizing-your-work-with-project-boards/managing-project-boards/about-project-boards). +![Example Burndown Chart](./docs/images/example_burndown_chart.png) + ## Table of Contents * [Features](#features) * [Installation](#installation) * [Assumptions](#assumptions) +* [Configuration](#configuration) * [Usage](#usage) * [Contributing](#contributing) * [About](#about) ## Features * Create a **burndown chart for a GitHub Project Board**. -* Works for projects in **private repositories** and **organizations**. +* Works for projects in **public/private repositories** and **organizations**. * Includes a **trend line** for the current sprint. * Supports custom labels for **tracking points for issues** @@ -20,9 +23,9 @@ This tool, while flexible, makes the following assumptions about your project ma * You use one and only one [GitHub Project Board](https://docs.github.com/en/issues/organizing-your-work-with-project-boards/managing-project-boards/about-project-boards) for each of your [Sprints](https://scrumguides.org/scrum-guide.html#the-sprint) * You use one and only one [GitHub Milestone](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/about-milestones) for each of your [User Stories](https://www.scrum.org/resources/blog/user-story-or-stakeholder-story) * You use one and only one [GitHub Issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues) for each of your [Sprint Backlog Items/Tasks](https://scrumguides.org/scrum-guide.html#sprint-backlog) -* Each of your GitHub Issues has a [label](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels) indicating how many [points](https://www.scrum.org/resources/scrum-glossary#:~:text=several%20ways%20such%20as-,user%20story%20points,-or%20task%20hours.%20Work) its corresponding task is worth. +* If you want to track points, each of your GitHub Issues has a [label](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels) indicating how many [points](https://www.scrum.org/resources/scrum-glossary#:~:text=several%20ways%20such%20as-,user%20story%20points,-or%20task%20hours.%20Work) its corresponding task is worth. - Furthermore, all labels that indicate point values have the format ``. - - However, multiple labels indicating points on the same Issue are supported. + - Multiple labels indicating points on the same Issue are supported. * A Sprint Backlog Task is considered [Done](https://www.scrum.org/resources/professional-scrum-developer-glossary#:~:text=D-,definition%20of%20done%3A,-a%20shared%20understanding) if its corresponding GitHub Issue is Closed. ## Installation @@ -38,7 +41,7 @@ python -m venv ./venv ### 2. Activate the virtual environment -*Linux/Mac OS* +*Linux/macOS* ``` source venv/bin/activate ``` @@ -56,34 +59,64 @@ source venv/bin/activate pip install -r requirements.txt ``` +## Configuration +### 1. Create a [Personal Access Token](https://github.com/settings/tokens) with the `repo` scope. +Do not share this token with anyone! It gives the bearer full control over all private repositories you have access to! + +This is required to pull the Project Board data from GitHub's GraphQL API. +### 2. Make a copy of `src/github_projects_burndown_chart/config/secrets.json.dist` without the `.dist` ending. +This allows the `.gitignore` to exclude your `secrets.json` from being accidentally committed. +### 3. Fill out the `github_token` with your newly created Personal Access Token. +### 4. Make a copy of `src/github_projects_burndown_chart/config/config.json.dist` without the `.dist` ending. +This allows the `.gitignore` to exclude your `config.json` from being accidentally committed. +### 5. Fill out all the configuration settings +#### Repository Projects +`project_name`: A memorable name for your project for use with this tool. + +`project_name.query_variables` +| Variable | Meaning | +|----------|---------| +| `repo_owner` | The username of the owner of the repo.

Example: `jhale1805` | +| `repo_name` | The name of the repo.

Example: `github-projects-burndown-chart`| +| `project_number` | The ID of the project for which you want to generate a burndown chart. This is found in the URL when looking at the project board on GitHub.

Example: `1` (from [`https://github.com/jhale1805/github-projects-burndown-chart/projects/1`](https://github.com/jhale1805/github-projects-burndown-chart/projects/1)) | +| `column_count` | A number >= the number of columns on the project board. (DEFAULT: 5)

A closer fit improves performance and reduces the chance of rate limiting from GitHub's GraphQL API. | +| `max_cards_per_column_count` | A number >= the maximum number of cards in any column on the project board. (DEFAULT: 50)

A closer fit improves performance and reduces the chance of rate limiting from GitHub's GraphQL API. | +| `labels_per_issue_count` | A number >= the number of labels on any issue on project board. (DEFAULT: 5)

A closer fit improves performance and reduces the chance of rate limiting from GitHub's GraphQL API. | + +`project_name.settings` +| Variable | Meaning | +|----------|---------| +| `sprint_start_date` | The first day of the sprint formatted as `YYYY-MM-DD`.

Must be entered here since GitHub Project Boards don't have an assigned start/end date.

Example: `2021-10-08` | +| `sprint_end_date` | The last day of the sprint formatted as `YYYY-MM-DD`.

Must be entered here since GitHub Project Boards don't have an assigned start/end date.

Example: `2021-10-21` | +| `points_label` | (OPTIONAL) The prefix for issue labels containing the point value of the issue. Removing this prefix must leave just an integer. If set to `null`, the burndown chart will count open issues instead of points.

Example: `Points: ` (with the space) | + +#### Organization Projects +All settings are the same as for the [Repository Projects](#repository-projects), except `repo_owner` and `repo_name` are replaced with `organization_name` as shown below. + +`project_name.query_variables` +| Variable | Meaning | +|----------|---------| +| `organization_name` | The name of the organization on GitHub as it appears in the URL of their organization page.

Example: `golang` (from https://github.com/golang) | ## Usage -### Configuration -1. Create a [Personal Access Token](https://github.com/settings/tokens) with the `repo` scope. - - Do not share this token with anyone! It gives the bearer full control over all private repositories you have access to! - - This is required to pull the Project Board data from GitHub's GraphQL API. -2. Make a copy of `src/github_projects_burndown_chart/config/secrets.json.dist` without the `.dist` ending. - - This allows the `.gitignore` to exclude your `secrets.json` from being accidentally committed. -3. Fill out the `github_token` with your newly created Personal Access Token. -4. Make a copy of `src/github_projects_burndown_chart/config/config.json.dist` without the `.dist` ending. - - This allows the `.gitignore` to exclude your `config.json` from being accidentally committed. -5. Fill out all the configuration settings - - `repository_project_query.repo_owner`: The username of the owner of the repo. - - For example, `jhale1805` - - `repository_project_query.repo_name`: The name of the repo. - - For example, `github-projects-burndown-chart` - - `repository_project_query.project_number`: The id of the project for which you want to generate a burndown chart. This is found in the URL when looking at the project board on GitHub. - - For example, `1` from [`https://github.com/jhale1805/github-projects-burndown-chart/projects/1`](https://github.com/jhale1805/github-projects-burndown-chart/projects/1) - - `settings.sprint_start_date`: The first day of the sprint. Formatted as `YYYY-MM-DD`. - - Must be entered here since GitHub Project Boards don't have an assigned start/end date. - - For example, `2021-10-08` - - `settings.sprint_end_date`: The last day of the sprint. Formatted as `YYYY-MM-DD`. - - Must be entered here since GitHub Project Boards don't have an assigned start/end date. - - For example, `2021-10-22` - - `settings.points_label`: The prefix for issue labels containing the point value of the issue. Removing this prefix must leave just an integer. - - For example: `Points: ` (with the space) -### Generating the Chart -1. Run `make run` to generate the burndown chart. - - This will pop up an interactive window containing the burndown chart, including a button for saving it as a picture. +Given that `PROJECT_TYPE` is one of `[repository, organization]` and `PROJECT_NAME` matches a key in the `config.json` under the chosen `PROJECT_TYPE`, run the following command: +``` +make run project_type=PROJECT_TYPE project_name=PROJECT_NAME +``` + +This will pop up an interactive window containing the burndown chart, including a button for saving it as a picture. + +### Example +Make a copy of `example.config.json` without the leading `example.` + +To see this repository's example project board: +``` +make run project_type=repository project_name=burndown_chart_kickoff +``` + +To see Golang's progress on their current roadmap: +``` +make run project_type=organization project_name=golang_on_deck +``` ## Contributing Contributions are welcome via a [Pull Request](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request). diff --git a/docs/images/example_burndown_chart.png b/docs/images/example_burndown_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d15764811c3daf2865cceba59f0ca872336726 GIT binary patch literal 57088 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�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ð|o`c5m88W`qZA@EUGk+>ysP5yr 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 dict: - query_response = gh_api_query( - RepositoryProject, config.get('repository_project_query')) + query_variables = config['query_variables'] + query_response = gh_api_query(RepositoryProject, query_variables) project_data = query_response['data']['repository']['project'] return Project(project_data) def get_organization_project() -> dict: - query_response = gh_api_query( - OrganizationProject, config.get('organization_project_query')) + query_variables = config['query_variables'] + query_response = gh_api_query(OrganizationProject, query_variables) project_data = query_response['data']['organization']['project'] return Project(project_data) diff --git a/src/github_projects_burndown_chart/main.py b/src/github_projects_burndown_chart/main.py index 9ded739..d8be4b7 100644 --- a/src/github_projects_burndown_chart/main.py +++ b/src/github_projects_burndown_chart/main.py @@ -1,6 +1,7 @@ import argparse from chart.burndown import BurndownChart +from config import config from gh.api_wrapper import get_organization_project, get_repository_project from gh.project import Project @@ -11,8 +12,12 @@ if __name__ == '__main__': parser.add_argument("project_type", choices=['repository', 'organization'], help="The type of project to generate a burndown chart for. Can be either 'organization' or 'repository'.") + parser.add_argument("project_name", help="The name of the project as it appears in the config.json") args = parser.parse_args() + # Point the config to the correct project + config.set_project(args.project_type, args.project_name) + # Pull the corresponding project from GitHub if args.project_type == 'repository': project: Project = get_repository_project()