From fab7d61580f50e4b07ad6b4d81cba97c67aea808 Mon Sep 17 00:00:00 2001 From: Joseph Hale Date: Mon, 1 Nov 2021 21:31:40 -0700 Subject: [PATCH] Add optional `chart_end_date` setting This new setting allows you to change the end date of the chart without affecting the slope of the ideal burndown line. This is useful for showing tasks that were completed after the official end of a sprint. --- README.md | 1 + src/github_projects_burndown_chart/chart/burndown.py | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 877e286..3ebc65d 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ This allows the `.gitignore` to exclude your `config.json` from being accidental |----------|---------| | `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` | +| `chart_end_date` | (OPTIONAL) The last day to show on the burndown chart formatted as `YYYY-MM-DD`.

Used to change the end date of the chart without affecting the slope of the ideal burndown line (e.g. to show tasks that were completed after the official end of a sprint).

Example: `2021-10-24` | | `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 diff --git a/src/github_projects_burndown_chart/chart/burndown.py b/src/github_projects_burndown_chart/chart/burndown.py index e1e6101..414c193 100644 --- a/src/github_projects_burndown_chart/chart/burndown.py +++ b/src/github_projects_burndown_chart/chart/burndown.py @@ -13,21 +13,26 @@ class BurndownChart: config['settings']['sprint_start_date']) self.end_date_utc: datetime = parse_to_utc( config['settings']['sprint_end_date']) + self.chart_end_date_utc: datetime = parse_to_utc( + config['settings']['chart_end_date']) \ + if config['settings'].get('chart_end_date') else None self.project: Project = project def render(self): + end_date = self.chart_end_date_utc if self.chart_end_date_utc else self.end_date_utc outstanding_points_by_day = self.project.outstanding_points_by_date( self.start_date_utc, - self.end_date_utc) + end_date) # Load date dict for priority values with x being range of how many days are in sprint x = list(range(len(outstanding_points_by_day.keys()))) y = list(outstanding_points_by_day.values()) + sprint_days = (self.end_date_utc - self.start_date_utc).days # Plot point values for sprint along xaxis=range yaxis=points over time plt.plot(x, y) plt.axline((x[0], self.project.total_points), - slope=-(self.project.total_points/(len(y)-1)), + slope=-(self.project.total_points/(sprint_days)), color="green", linestyle=(0, (5, 5))) -- 2.51.2