def generate_control_chart(tickets: List[Issue], chart_class: Type[IChart] = Chart) -> None: if not tickets: print('No data. Check that the JSON file was correctly populated ' + 'when you ran the `fetch` command.') return completed_cycle_times: List[CycleTime] = list( sorted( (get_cycle_time(ticket) for ticket in tickets if ticket.completed is not None and ticket.started is not None), key=attrgetter("completed"), )) if not completed_cycle_times: print('Could not process cycle time, check that the statuses ' + 'in config.yaml are correct.') return cycle_time_plot = CycleTimeScatterPlot(cycle_times=completed_cycle_times, data_source=ColumnDataSource) average_cycle_time_plot = AverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) rolling_cycle_time_plot = RollingAverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) cycle_time_deviation_plot = CycleTimeDeviationPlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) start_date, end_date = ( completed_cycle_times[0].completed, completed_cycle_times[-1].completed, ) chart = chart_class( x=Axis( label="Closed (date)", values=[ d[0].date().isoformat() for d in Arrow.span_range( "day", Arrow(start_date.year, start_date.month, start_date.day), Arrow(end_date.year, end_date.month, end_date.day), ) ], size=1800, ), y=Axis(label="Cycle time (days)", values=None, size=900), label="Ticket", tooltips=[ ("Ticket", "@label"), ("Closed (date)", "@x"), ("Cycle time (days)", "@y"), ], ) cycle_time_plot.draw(chart) average_cycle_time_plot.draw(chart) rolling_cycle_time_plot.draw(chart) cycle_time_deviation_plot.draw(chart) chart.render()
def generate_control_chart(tickets: List[Issue], chart_class: Type[IChart] = Chart) -> None: if not tickets: return completed_cycle_times: List[CycleTime] = list( sorted( (get_cycle_time(ticket) for ticket in tickets if ticket.completed is not None and ticket.started is not None), key=attrgetter("completed"), )) cycle_time_plot = CycleTimeScatterPlot(cycle_times=completed_cycle_times, data_source=ColumnDataSource) average_cycle_time_plot = AverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) rolling_cycle_time_plot = RollingAverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) cycle_time_deviation_plot = CycleTimeDeviationPlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource) start_date, end_date = ( completed_cycle_times[0].completed, completed_cycle_times[-1].completed, ) chart = chart_class( x=Axis( label="Closed (date)", values=[ d[0].date().isoformat() for d in Arrow.span_range( "day", Arrow(start_date.year, start_date.month, start_date.day), Arrow(end_date.year, end_date.month, end_date.day), ) ], size=1800, ), y=Axis(label="Cycle time (days)", values=None, size=900), label="Ticket", tooltips=[ ("Ticket", "@label"), ("Closed (date)", "@x"), ("Cycle time (days)", "@y"), ], ) cycle_time_plot.draw(chart) average_cycle_time_plot.draw(chart) rolling_cycle_time_plot.draw(chart) cycle_time_deviation_plot.draw(chart) chart.render()
def chart_constructor(): create_chart = mock.Mock() render = mock.Mock() return ( Chart( x=Axis(label="X", values=[1, 2, 3], size=1000), y=Axis(label="Y", values=[1, 2, 6], size=800), label="Test", create_chart=create_chart, render=render, tooltips="Tooltip", ), create_chart, render, )
def generate_defect_chart(issues: List[Issue], chart_class: Type[IChart] = Chart) -> None: chart = chart_class( label=None, x=Axis(label="", values=None, size=600), y=Axis(label="", values=None, size=300), tooltips="@value: @defect_rate{0.1f}%", ) DefectRateDonut( issues=issues, data_source=ColumnDataSource, no_defects_transform=partial(cumsum, include_zero=True), defects_transform=cumsum, ).draw(chart) chart.render()
def generate_throughput_chart(issues: List[Issue], chart_class: Type[IChart] = Chart) -> None: """Generate a throughput bar chart for the given list of issues. :param issues: The list of issues to calculate the weekly throughput for. :param chart: The chart_class to draw on, defaults to Chart :raises NoTicketsProvided: If the list of issues is empty. """ if not issues: raise NoTicketsProvided grouped_issues = group_issues_by_week_commence(issues) throughputs: OrderedDict[date, int] = OrderedDict( ((wc, len(completed)) for (wc, completed) in grouped_issues.items())) throughput_plot = ThroughputPlot(weeks=list(throughputs.keys()), throughputs=list(throughputs.values())) chart = chart_class( x=Axis( label="Week Start", values=[d.strftime("%d/%m/%Y") for d in throughput_plot.weeks], size=1500, ), y=Axis( label="Issues Completed", values=None, size=800, ), label="Throughput by week", tooltips=[ ("Week", "@x"), ("Issues Completed", "@y"), ], ) throughput_plot.draw(chart) chart.render()
def generate_control_chart( tickets: List[Issue], chart_class: Type[IChart] = Chart ) -> None: """Generate the ticket control chart with the provided list of tickets. :param tickets: The list of tickets to generate your control chart from. :param chart_class: The chart class to output into, defaults to Chart. :raises NoTicketsProvided: If len(tickets) == 0. :raises ChartError: On any error attempting to generate a chart. """ if not tickets: raise NoTicketsProvided completed_cycle_times: List[CycleTime] = list( sorted( ( get_cycle_time(ticket) for ticket in tickets if ticket.completed is not None and ticket.started is not None ), key=attrgetter("completed"), ) ) if not completed_cycle_times: raise ChartError( "Could not process cycle time. Check your config.yaml statuses." ) cycle_time_plot = CycleTimeScatterPlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource ) average_cycle_time_plot = AverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource ) rolling_cycle_time_plot = RollingAverageCycleTimePlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource ) cycle_time_deviation_plot = CycleTimeDeviationPlot( cycle_times=completed_cycle_times, data_source=ColumnDataSource ) start_date, end_date = ( completed_cycle_times[0].completed, completed_cycle_times[-1].completed, ) chart = chart_class( x=Axis( label="Closed (date)", values=[ d[0].date().isoformat() for d in Arrow.span_range( "day", Arrow(start_date.year, start_date.month, start_date.day), Arrow(end_date.year, end_date.month, end_date.day), ) ], size=1800, ), y=Axis(label="Cycle time (days)", values=None, size=900), label="Ticket", tooltips=[ ("Ticket", "@label"), ("Closed (date)", "@x"), ("Cycle time (days)", "@y"), ], ) cycle_time_plot.draw(chart) average_cycle_time_plot.draw(chart) rolling_cycle_time_plot.draw(chart) cycle_time_deviation_plot.draw(chart) chart.render()