def get_product_ttm(prid, **kwargs):
    try:
        context, passed = app.request_metric('sum-passed-product-executions', prid=prid, **kwargs)
        _, activity = app.request_metric('sum-product-activity', prid=prid, **kwargs)
        kwargs['max'] = context['size']
        kwargs['begin'] = context['begin']
        kwargs['end'] = context['end']
        _, total = app.request_metric('sum-passed-executions', **kwargs)
        res = [(a + (p / float(t))) / 2.0 if t else 0 for p, a, t in zip(passed, activity, total)]
        return context, res
    except (EnvironmentError, AttributeError) as e:
        raise APIError(e.message)
def get_product_cost(prid, **kwargs):
    try:
        kwargs['max'] = 0
        context, devs = app.request_metric('sum-product-developers', prid=prid, **kwargs)
        kwargs['max'] = context['size']
        kwargs['begin'] = context['begin']
        kwargs['end'] = context['end']
        context, commits = app.request_metric('sum-product-commits', prid=prid, **kwargs)
        pairs = list(dropwhile(lambda x: x[1] == 0, zip(devs, commits)))
        pairs = list(dropwhile(lambda x: x[1] == 0, reversed(pairs)))
        res = [cost(nd, nc) for nd, nc in pairs]
        return context, [sum(res)]
    except (EnvironmentError, AttributeError) as e:
        raise APIError(e.message)
def get_product_health(prid, **kwargs):
    try:
        context, buildtime = app.request_metric('sum-product-buildtime', prid=prid, **kwargs)
        _, brokentime = app.request_metric('sum-product-brokentime', prid=prid, **kwargs)
        _, timetofix = app.request_metric('avg-product-timetofix', prid=prid, **kwargs)

        health = 0
        if buildtime and brokentime and timetofix:
            base_health = (timetofix[0] + brokentime[0]) / buildtime[0] if buildtime[0] else 10000.0
            base_health = min(10000.0, base_health)
            base_health = max(0.0, base_health / 10000.0)
            health = 1.0 - base_health

        return context, [health]
    except (EnvironmentError, AttributeError) as e:
        raise APIError(e.message)
def calculate_member_quality(uid, **kwargs):
    def __process_row():
        return [__calc_quality(s, rm) for s, rm in zip(sr, rm_activity)]

    try:
        repo_ctx, repositories = app.request_view('member-repositories', uid=uid, **kwargs)
        repositories = map(lambda x: x['id'], repositories)
        repo_success_rate = map(lambda x: app.request_metric('sum-repository-success-rate', rid=x, **kwargs),
                                repositories)

        context = repo_success_rate[0][0]
        repo_success_rate = map(lambda x: x[1], repo_success_rate)
        repo_member_activity = map(
            lambda x: app.request_metric('sum-member-activity-in-repository', uid=uid, rid=x, **kwargs)[1],
            repositories)

        res = [__process_row() for sr, rm_activity in zip(repo_success_rate, repo_member_activity)]
        res = [sum(t) / len(t) for t in zip(*res)]
        return context, res
    except (EnvironmentError, AttributeError) as e:
        raise APIError(e.message)