Pivotal Tracker API でラベルの一覧とラベルが紐づくストーリーの数を取得する

Pivotal Tracker API でラベルの一覧を取得します。 ついでに、ラベルに紐づくストーリーの数も取得します。
2024.03.19

Pivotal Tracker API でラベルの一覧を取得してみました。 ついでに、ラベルに紐づくストーリーの数も取得しています。

おすすめの方

  • Pivotal Tracker APIを利用したい方
  • Pivotal Tracker APIでラベルの一覧を取得したい方
  • Pivotal Tracker APIでラベルに紐づくストーリーの数を取得したい方

適当なプロジェクトを用意する

適当なプロジェクトです。ラベルやエピックが設定されています。

01_pivotal_tracker_stories

ラベルとエピックは、次のようになっています。

02_pivotal_tracker_labels

ラベルの一覧と紐付いているストーリーの数を取得するスクリプト

最初にラベルの一覧を取得し、次にストーリーをラベルで検索します。 検索した結果には次の情報があるので、全件取得していません。

  • total_hits
    • 検索条件に一致したストーリーの数(未完了のみ)
  • total_hits_with_done
    • 検索条件に一致したストーリーの数(完了済みを含む)

app.py

import requests
import json
import urllib.parse

API_ENDPOINT = "https://www.pivotaltracker.com/services/v5"
TOKEN = "xxx"

PROJECT_ID = "yyy"


def main():
    # ラベルの一覧を取得する
    labels = get_labels()

    for label in labels:
        # ラベルごとにストーリーを検索する
        stories = search_stories_with_labes(label["name"])

        dump_labels(label, stories)


def dump_labels(label, stories):
    print(
        f"{label['name']}, {stories['stories']['total_hits']}, {stories['stories']['total_hits_with_done']}"
    )


def get_headers():
    return {
        "X-TrackerToken": TOKEN,
        "Content-Type": "application/json",
    }


def get_labels():
    resp = requests.get(
        f"{API_ENDPOINT}/projects/{PROJECT_ID}/labels", headers=get_headers()
    )
    return resp.json()


def search_stories_with_labes(label):
    query = [
        # "type:feature,bug,chore",
        # "state:unscheduled,unstarted,started",
        f'label:"{label}"',
    ]
    url_query = {
        # キーワードの区切りは半角空白
        "query": " ".join(query),
    }

    # 数が知りたいだけなので、loopして全件取得しない
    # (Response Bodyに数がある)
    parameter = urllib.parse.urlencode(url_query)
    resp = requests.get(
        f"{API_ENDPOINT}/projects/{PROJECT_ID}/search?{parameter}",
        headers=get_headers(),
    )
    return resp.json()


if __name__ == "__main__":
    main()

スクリプトを実行する

スクリプトを実行すると、ラベルの一覧とストーリーの数を取得できました。

$ python app.py

開発, 0, 0
保守, 2, 3
デザイ, 0, 0
デザイン, 0, 0
これはエピックです, 2, 3
機能a, 2, 2
ready, 4, 5
spike, 0, 0

CSVファイルとして保存し、フィルタとか編集とかできるようにしています。

$ python app.py > labels.csv

参考