예제 #1
0
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()
예제 #2
0
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()
예제 #3
0
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,
    )
예제 #4
0
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()
예제 #5
0
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()
예제 #6
0
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()