Skip to content

Enhance project member management and update documentation#755

Merged
yuji38kwmt merged 9 commits into
mainfrom
20260510-1
May 9, 2026
Merged

Enhance project member management and update documentation#755
yuji38kwmt merged 9 commits into
mainfrom
20260510-1

Conversation

@yuji38kwmt
Copy link
Copy Markdown
Collaborator

@yuji38kwmt yuji38kwmt commented May 9, 2026

This pull request introduces a new ProjectMemberRepository utility for managing project member information and refactors the annotation specs utility functions to improve code clarity and reuse. Additionally, it updates the codebase and tests to leverage these new utilities, replacing ad-hoc implementations with standardized functions.

Key changes include:

New features:

  • Added ProjectMemberRepository class in annofabapi/project_member_repository.py to provide efficient access to project member information, including methods for retrieving members by account or user ID and converting between account and user IDs.
  • Added corresponding tests for ProjectMemberRepository in tests/test_project_member_repository.py.
  • Updated API documentation to include project_member_repository.

Refactoring and utility improvements:

  • Introduced reusable TypedDicts (LabelNameHolder, NameHolder) and utility functions (get_label_name_en, get_attribute_name_en, get_choice_name_en) in annofabapi/util/annotation_specs.py for extracting English names from annotation specs. Updated related functions to use these utilities for improved consistency and error handling. [1] [2] [3] [4] [5]
  • Refactored annofabapi/wrapper.py to use the new utility functions and TypedDicts for label, attribute, and choice name extraction, removing redundant internal methods and improving type safety with cast. [1] [2] [3] [4] [5] [6] [7] [8] [9]

Testing improvements:

  • Expanded tests in tests/util/test_annotation_specs.py to cover the new utility functions and updated existing tests to use them. [1] [2] [3]

These changes improve maintainability, consistency, and test coverage for project member and annotation spec handling.

@yuji38kwmt yuji38kwmt requested a review from Copilot May 9, 2026 16:02
@kci-pr-agent
Copy link
Copy Markdown

kci-pr-agent Bot commented May 9, 2026

Title

Enhance project member management and update documentation


Description

• プロジェクトメンバリポジトリを追加実装
• annotation_specsに英語名取得ヘルパー追加
• wrapperでヘルパー関数を統合リファクタリング
• 各ユーティリティ・リポジトリのテスト追加


Changes walkthrough 📝

Relevant files
Enhancement
project_member_repository.py
プロジェクトメンバリポジトリ実装                                                                                 

annofabapi/project_member_repository.py

• 新規クラス ProjectMemberRepositoryを追加
• キャッシュ付きでプロジェクトメンバ取得メソッド実装

account_id/user_id→対応ID取得処理と例外処理

+98/-0   
annotation_specs.py
注釈仕様の英語名ヘルパー実装                                                                                     

annofabapi/util/annotation_specs.py

LabelNameHolder/NameHolder TypedDictを追加

get_label_name_en/get_attribute_name_en/get_choice_name_en実装

get_choice/get_attribute/get_labelでヘルパーを利用

+64/-4   
wrapper.py
wrapperでannotation_specsヘルパーを統合                                                   

annofabapi/wrapper.py

• ヘルパー関数をインポートして統合
castを用いて型安全に呼び出し
• 不要なプライベートメソッドを除去

+13/-30 
Tests
test_project_member_repository.py
ProjectMemberRepositoryのテスト追加                                                       

tests/test_project_member_repository.py

ProjectMemberRepositoryの単体テストを追加
• 存在/未存在時の例外発生を検証

+89/-0   
test_annotation_specs.py
annotation_specsユーティリティのテスト更新                                                       

tests/util/test_annotation_specs.py

get_*_en関数のテストを追加
LabelNameHolder/NameHolderテストを追加

既存テストでヘルパーメソッドを活用

+71/-8   
Documentation
index.rst
ドキュメントにproject_member_repository追加                                             

docs/api_reference/index.rst

• APIドキュメント目次にproject_member_repositoryを追加

+2/-1     

Need help?
  • Type /help how to ... in the comments thread for any questions about PR-Agent usage.
  • Check out the documentation for more information.
  • @kci-pr-agent
    Copy link
    Copy Markdown

    kci-pr-agent Bot commented May 9, 2026

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    キャッシュ無効化

    キャッシュされたプロジェクトメンバ情報を更新する仕組みがなく、メンバ変更後に古いデータが返される可能性があります。キャッシュのクリアやTTLの導入など検討してください。

    project_member_list = self._members_by_project_id.get(project_id)
    if project_member_list is None:
        project_member_list = self.resource.wrapper.get_all_project_members(project_id, query_params={"include_inactive_member": True})
        self._members_by_project_id[project_id] = project_member_list
    スレッド安全性

    マルチスレッド環境で _members_by_project_id に同時アクセスすると競合が起こる恐れがあります。ロック機構の導入などを検討してください。

        self._members_by_project_id: dict[str, list[ProjectMember]] = {}
    
    def _get_project_member_with_predicate(self, project_id: str, predicate: Callable[[ProjectMember], bool]) -> ProjectMember | None:
        """条件に一致するプロジェクトメンバを取得する。
    
        プロジェクトメンバの一覧をプロジェクトIDごとにキャッシュする。
    
        Args:
            project_id: プロジェクトID
            predicate: プロジェクトメンバの検索条件
    
        Returns:
            条件に一致するプロジェクトメンバ。見つからない場合はNone。
        """
        project_member_list = self._members_by_project_id.get(project_id)
        if project_member_list is None:
            project_member_list = self.resource.wrapper.get_all_project_members(project_id, query_params={"include_inactive_member": True})
            self._members_by_project_id[project_id] = project_member_list
        return more_itertools.first_true(project_member_list, pred=predicate)
    テスト不足

    wrapper 内で新たに利用する annotation_specs ユーティリティ関数の動作を検証するテストがありません。主要なパスをカバーする追加テストを検討してください。

            annotation_specs_relation=annotation_specs_relation,
        )
        request_body["updated_datetime"] = updated_datetime
        self.api.put_annotation(dest.project_id, dest.task_id, dest.input_data_id, request_body=request_body)
        return True
    
    def __get_label_info_from_label_name(self, label_name: str, annotation_specs_labels: list[LabelV1]) -> LabelV1 | None:
        for label in annotation_specs_labels:
            if get_label_name_en(cast(LabelNameHolder, label)) == label_name:
                return label
        return None
    
    def __get_additional_data_from_attribute_name(self, attribute_name: str, label_info: LabelV1) -> AdditionalDataDefinitionV1 | None:
        for additional_data in label_info["additional_data_definitions"]:
            if get_attribute_name_en(additional_data) == attribute_name:
                return additional_data
    
        return None
    
    def _get_choice_id_from_name(self, name: str, choices: list[dict[str, Any]]) -> str | None:
        choice_info = more_itertools.first_true(choices, pred=lambda e: get_choice_name_en(cast(NameHolder, e)) == name)
        if choice_info is not None:

    @kci-pr-agent
    Copy link
    Copy Markdown

    kci-pr-agent Bot commented May 9, 2026

    PR Code Suggestions ✨

    No code suggestions found for the PR.

    Copy link
    Copy Markdown

    Copilot AI left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Pull request overview

    This PR centralizes “English name” extraction for annotation specs into shared utility helpers, introduces a cached repository for project member lookup, and updates the Sphinx API reference to document the new module.

    Changes:

    • Added get_label_name_en / get_attribute_name_en / get_choice_name_en helpers (and corresponding TypedDict holders) and updated related lookup logic/tests to use them.
    • Added ProjectMemberRepository with per-project member caching plus unit tests for account_id/user_id lookups.
    • Updated docs/api_reference/index.rst to include project_member_repository in the API reference toctree.

    Reviewed changes

    Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

    Show a summary per file
    File Description
    tests/util/test_annotation_specs.py Adds tests for the new *_name_en helpers and updates existing tests to use them.
    tests/test_project_member_repository.py New unit tests covering ProjectMemberRepository lookup behavior and error cases.
    docs/api_reference/index.rst Adds project_member_repository to the Sphinx toctree (currently missing the referenced .rst).
    annofabapi/wrapper.py Replaces local “English name” extraction helpers with shared util functions.
    annofabapi/util/annotation_specs.py Introduces LabelNameHolder / NameHolder and the new *_name_en helper functions; updates existing lookup functions to use them.
    annofabapi/project_member_repository.py New repository providing cached project member retrieval and ID mapping helpers.

    Comment thread annofabapi/wrapper.py
    Comment on lines 13 to +16
    exceptions
    segmentation
    plugin
    project_member_repository
    @yuji38kwmt yuji38kwmt enabled auto-merge (squash) May 9, 2026 16:30
    @yuji38kwmt yuji38kwmt merged commit 4ecdbc3 into main May 9, 2026
    8 checks passed
    @yuji38kwmt yuji38kwmt deleted the 20260510-1 branch May 9, 2026 16:30
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    None yet

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    2 participants