annoworkapi.annofab のソースコード
"""
外部連携システム"Annofab"に依存した関数やクラスを定義しています。
"""
from collections import defaultdict
from collections.abc import Collection
from typing import Any, Optional
from annoworkapi import AnnoworkApi
ANNOFAB_PROJECT_URL_PREFIX = "https://annofab.com/projects/"
"""Annofabのプロジェクトを表すURLのプレフィックス"""
[ドキュメント]
def get_annofab_project_id_from_url(url: str) -> Optional[str]:
"""ジョブの外部連携情報に設定されたURLからAnnofabプロジェクトのproject_idを取得します。
Args:
url: ジョブの外部連携情報であるURL
Returns:
Annofabプロジェクトのproject_id。URLからproject_idを取得できない場合は、Noneを返します。
"""
url = url.strip()
if not url.startswith(ANNOFAB_PROJECT_URL_PREFIX):
return None
tmp = url[len(ANNOFAB_PROJECT_URL_PREFIX) :]
tmp_array = tmp.split("/")
if len(tmp_array) == 0:
# https://annofab.com/projects/foo のケース(末尾にスラッシュなし)
return tmp
# https://annofab.com/projects/foo/ のケース(末尾にスラッシュあり)
return tmp_array[0]
[ドキュメント]
class AnnofabWrapper:
"""
Annofabに依存したAPIのwrapperです。
Args:
api: AnnoworkApi Instance
"""
def __init__(self, api: AnnoworkApi) -> None:
self.api = api
[ドキュメント]
def get_jobs_by_annofab_project_id(self, workspace_id: str, annofab_project_ids: Collection[str]) -> dict[str, list[dict[str, Any]]]:
"""
Annofabのproject_idに紐づくジョブを取得します。
Args:
workspace_id: ワークスペースID
annofab_project_ids: Annofabのproject_idsのcollection
Returns:
keyがannofabのproject_id, valueがジョブのlistであるdict
"""
annofab_project_id_set = set(annofab_project_ids)
all_jobs = self.api.get_jobs(workspace_id)
result = defaultdict(list)
def get_annofab_project_id_from_job(job: dict[str, Any]) -> Optional[str]:
url = job["external_linkage_info"].get("url")
if url is not None:
return get_annofab_project_id_from_url(url)
return None
for job in all_jobs:
annofab_project_id = get_annofab_project_id_from_job(job)
if annofab_project_id is not None and annofab_project_id in annofab_project_id_set:
result[annofab_project_id].append(job)
return result