annofabcli 1.96.1__tar.gz → 1.97.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {annofabcli-1.96.1 → annofabcli-1.97.0}/PKG-INFO +2 -2
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/__version__.py +1 -1
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/change_input_data_name.py +5 -7
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/update_metadata_of_input_data.py +2 -1
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/put_project_members.py +32 -44
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/list_annotation_count.py +2 -2
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/list_annotation_duration.py +2 -2
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/productivity_per_date.py +5 -5
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/user_performance.py +3 -3
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/whole_performance.py +2 -2
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +2 -2
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/worktime_per_date.py +1 -1
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/delete_supplementary_data.py +11 -18
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/put_supplementary_data.py +58 -81
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/update_metadata_of_task.py +2 -1
- {annofabcli-1.96.1 → annofabcli-1.97.0}/pyproject.toml +4 -3
- {annofabcli-1.96.1 → annofabcli-1.97.0}/LICENSE +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/README.md +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/__main__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/annotation_query.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/change_annotation_attributes.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/change_annotation_properties.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/copy_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/delete_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/download_annotation_zip.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/dump_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/import_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/list_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/list_annotation_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/restore_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation/subcommand_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/export_annotation_specs.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_annotation_specs_attribute.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_annotation_specs_choice.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_annotation_specs_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_annotation_specs_label.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_attribute_restriction.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/list_label_color.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/put_label_color.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/annotation_specs/subcommand_annotation_specs.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/delete_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/download_comment_json.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/list_all_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/list_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_comment_simply.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_inspection_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_inspection_comment_simply.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_onhold_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/put_onhold_comment_simply.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/subcommand_comment.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/comment/utils.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/annofab/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/annofab/project.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/bokeh.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/cli.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/dataclasses.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/download.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/enums.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/exceptions.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/facade.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/image.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/pandas.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/type_util.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/typing.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/utils.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/common/visualize.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/data/logging.yaml +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/experimental/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/experimental/list_out_of_range_annotation_for_movie.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/experimental/subcommand_experimental.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/draw_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/filter_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/mask_user_info.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/merge_annotation.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/filesystem/subcommand_filesystem.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/copy_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/delete_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/delete_metadata_key_of_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/download_input_data_json.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/list_all_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/list_all_input_data_merged_task.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/list_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/put_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/put_input_data_with_zip.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/subcommand_input_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/utils.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/copy_instruction.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/download_instruction.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/list_instruction_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/subcommand_instruction.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/instruction/upload_instruction.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/delete_job.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/list_job.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/list_last_job.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/subcommand_job.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/job/wait_job.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/my_account/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/my_account/get_my_account.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/my_account/subcommand_my_account.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization/list_organization.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization/subcommand_organization.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/change_organization_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/delete_organization_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/invite_organization_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/list_organization_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/organization_member/subcommand_organization_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/change_project_status.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/copy_project.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/diff_projects.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/list_project.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/put_project.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project/subcommand_project.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/change_project_members.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/copy_project_members.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/drop_project_members.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/invite_project_members.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/list_users.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/project_member/subcommand_project_member.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/py.typed +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/mask_visualization_dir.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/merge_visualization_dir.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/subcommand_stat_visualization.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/summarize_whole_performance_csv.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/write_graph.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/stat_visualization/write_performance_rating_csv.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/histogram.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/linegraph.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/list_annotation_attribute.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/list_video_duration.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/list_worktime.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/scatter.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/subcommand_statistics.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/summarize_task_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/summarize_task_count_by_task_id_group.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/summarize_task_count_by_user.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/actual_worktime.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/annotation_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/custom_production_volume.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/input_data_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/inspection_comment_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/project_performance.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/task.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/dataframe/user.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/filtering_query.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/model.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/project_dir.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualization/visualization_source_files.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualize_annotation_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualize_annotation_duration.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualize_statistics.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/statistics/visualize_video_duration.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/list_supplementary_data.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/subcommand_supplementary.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/cancel_acceptance.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/change_operator.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/change_status_to_break.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/change_status_to_on_hold.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/complete_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/copy_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/delete_metadata_key_of_task.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/delete_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/download_task_json.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/list_all_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/list_all_tasks_added_task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/list_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/list_tasks_added_task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/put_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/put_tasks_by_count.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/reject_tasks.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task/subcommand_task.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history/download_task_history_json.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history/list_all_task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history/list_task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history/subcommand_task_history.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history_event/__init__.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history_event/download_task_history_event_json.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history_event/list_all_task_history_event.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history_event/list_worktime.py +0 -0
- {annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/task_history_event/subcommand_task_history_event.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: annofabcli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.97.0
|
|
4
4
|
Summary: Utility Command Line Interface for AnnoFab
|
|
5
5
|
Home-page: https://github.com/kurusugawa-computer/annofab-cli
|
|
6
6
|
License: MIT
|
|
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
20
20
|
Classifier: Topic :: Utilities
|
|
21
21
|
Requires-Dist: Pillow
|
|
22
22
|
Requires-Dist: annofabapi (>=1.1,<2.0)
|
|
23
|
-
Requires-Dist: bokeh (>=3.3,<
|
|
23
|
+
Requires-Dist: bokeh (>=3.3,<3.7)
|
|
24
24
|
Requires-Dist: dictdiffer
|
|
25
25
|
Requires-Dist: isodate
|
|
26
26
|
Requires-Dist: jmespath
|
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.
|
|
1
|
+
__version__ = "1.97.0" # `poetry-dynamic-versioning`を使ってGitHubのバージョンタグを取得している。変更不要
|
|
@@ -143,11 +143,9 @@ def create_changed_input_data_list_from_csv(csv_file: Path) -> list[ChangedInput
|
|
|
143
143
|
変更対象の入力データのlist
|
|
144
144
|
"""
|
|
145
145
|
df_input_data = pandas.read_csv(
|
|
146
|
-
|
|
147
|
-
header=None,
|
|
148
|
-
names=("input_data_id", "input_data_name"),
|
|
146
|
+
csv_file,
|
|
149
147
|
# 文字列として読み込むようにする
|
|
150
|
-
dtype={"input_data_id":
|
|
148
|
+
dtype={"input_data_id": "string", "input_data_name": "string"},
|
|
151
149
|
)
|
|
152
150
|
|
|
153
151
|
input_data_dict_list = df_input_data.to_dict("records")
|
|
@@ -211,9 +209,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
211
209
|
"変更対象の入力データが記載されたCSVファイルのパスを指定してください。\n"
|
|
212
210
|
"CSVのフォーマットは以下の通りです。"
|
|
213
211
|
"\n"
|
|
214
|
-
" *
|
|
215
|
-
" *
|
|
216
|
-
" *
|
|
212
|
+
" * ヘッダ行あり, カンマ区切り\n"
|
|
213
|
+
" * input_data_id (required)\n"
|
|
214
|
+
" * input_data_name (required)\n"
|
|
217
215
|
),
|
|
218
216
|
)
|
|
219
217
|
|
{annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/input_data/update_metadata_of_input_data.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
|
+
import copy
|
|
4
5
|
import json
|
|
5
6
|
import logging
|
|
6
7
|
import multiprocessing
|
|
@@ -182,7 +183,7 @@ class UpdateMetadata(CommandLine):
|
|
|
182
183
|
sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
|
|
183
184
|
|
|
184
185
|
assert input_data_id_list is not None, "'--metadata'を指定したときは'--input_data_id'は必須です。"
|
|
185
|
-
metadata_by_input_data_id = {input_data_id: metadata for input_data_id in input_data_id_list}
|
|
186
|
+
metadata_by_input_data_id = {input_data_id: copy.deepcopy(metadata) for input_data_id in input_data_id_list}
|
|
186
187
|
|
|
187
188
|
elif args.metadata_by_input_data_id is not None:
|
|
188
189
|
metadata_by_input_data_id = annofabcli.common.cli.get_json_from_args(args.metadata_by_input_data_id)
|
|
@@ -5,7 +5,6 @@ from pathlib import Path
|
|
|
5
5
|
from typing import Any, Optional
|
|
6
6
|
|
|
7
7
|
import more_itertools
|
|
8
|
-
import numpy
|
|
9
8
|
import pandas
|
|
10
9
|
import requests
|
|
11
10
|
from annofabapi.models import ProjectMemberRole, ProjectMemberStatus
|
|
@@ -26,8 +25,8 @@ class Member(DataClassJsonMixin):
|
|
|
26
25
|
|
|
27
26
|
user_id: str
|
|
28
27
|
member_role: ProjectMemberRole
|
|
29
|
-
sampling_inspection_rate: Optional[int]
|
|
30
|
-
sampling_acceptance_rate: Optional[int]
|
|
28
|
+
sampling_inspection_rate: Optional[int] = None
|
|
29
|
+
sampling_acceptance_rate: Optional[int] = None
|
|
31
30
|
|
|
32
31
|
|
|
33
32
|
class PutProjectMembers(CommandLine):
|
|
@@ -44,7 +43,7 @@ class PutProjectMembers(CommandLine):
|
|
|
44
43
|
def member_exists(members: list[dict[str, Any]], user_id: str) -> bool:
|
|
45
44
|
return PutProjectMembers.find_member(members, user_id) is not None
|
|
46
45
|
|
|
47
|
-
def invite_project_member(self, project_id: str, member: Member, old_project_members: list[dict[str, Any]])
|
|
46
|
+
def invite_project_member(self, project_id: str, member: Member, old_project_members: list[dict[str, Any]]) -> dict[str, Any]:
|
|
48
47
|
old_member = self.find_member(old_project_members, member.user_id)
|
|
49
48
|
last_updated_datetime = old_member["updated_datetime"] if old_member is not None else None
|
|
50
49
|
|
|
@@ -58,7 +57,7 @@ class PutProjectMembers(CommandLine):
|
|
|
58
57
|
updated_project_member = self.service.api.put_project_member(project_id, member.user_id, request_body=request_body)[0]
|
|
59
58
|
return updated_project_member
|
|
60
59
|
|
|
61
|
-
def delete_project_member(self, project_id: str, deleted_member: dict[str, Any])
|
|
60
|
+
def delete_project_member(self, project_id: str, deleted_member: dict[str, Any]) -> dict[str, Any]:
|
|
62
61
|
request_body = {
|
|
63
62
|
"member_status": ProjectMemberStatus.INACTIVE.value,
|
|
64
63
|
"member_role": deleted_member["member_role"],
|
|
@@ -67,7 +66,7 @@ class PutProjectMembers(CommandLine):
|
|
|
67
66
|
updated_project_member = self.service.api.put_project_member(project_id, deleted_member["user_id"], request_body=request_body)[0]
|
|
68
67
|
return updated_project_member
|
|
69
68
|
|
|
70
|
-
def put_project_members(self, project_id: str, members: list[Member], delete: bool = False)
|
|
69
|
+
def put_project_members(self, project_id: str, members: list[Member], *, delete: bool = False) -> None:
|
|
71
70
|
"""
|
|
72
71
|
プロジェクトメンバを一括で登録する。
|
|
73
72
|
|
|
@@ -88,7 +87,7 @@ class PutProjectMembers(CommandLine):
|
|
|
88
87
|
|
|
89
88
|
count_invite_members = 0
|
|
90
89
|
# プロジェクトメンバを登録
|
|
91
|
-
logger.info(f"{project_title} に、{len(members)} 件のプロジェクトメンバを登録します。")
|
|
90
|
+
logger.info(f"プロジェクト '{project_title}' に、{len(members)} 件のプロジェクトメンバを登録します。")
|
|
92
91
|
for member in members:
|
|
93
92
|
if member.user_id == self.service.api.login_user_id:
|
|
94
93
|
logger.debug(f"ユーザ '{member.user_id}'は自分自身なので、登録しません。")
|
|
@@ -99,7 +98,7 @@ class PutProjectMembers(CommandLine):
|
|
|
99
98
|
continue
|
|
100
99
|
|
|
101
100
|
message_for_confirm = (
|
|
102
|
-
f"ユーザ '{member.user_id}'
|
|
101
|
+
f"ユーザ '{member.user_id}'を、プロジェクト'{project_title}'のメンバーに登録しますか? member_role='{member.member_role.value}'"
|
|
103
102
|
)
|
|
104
103
|
if not self.confirm_processing(message_for_confirm):
|
|
105
104
|
continue
|
|
@@ -107,14 +106,15 @@ class PutProjectMembers(CommandLine):
|
|
|
107
106
|
# メンバを登録
|
|
108
107
|
try:
|
|
109
108
|
self.invite_project_member(project_id, member, old_project_members)
|
|
110
|
-
logger.debug(f"user_id = {member.user_id}, member_role = {member.member_role.value} のユーザをプロジェクトメンバに登録しました。")
|
|
109
|
+
logger.debug(f"user_id = '{member.user_id}', member_role = '{member.member_role.value}' のユーザをプロジェクトメンバに登録しました。")
|
|
111
110
|
count_invite_members += 1
|
|
112
111
|
|
|
113
|
-
except requests.exceptions.HTTPError
|
|
114
|
-
logger.warning(
|
|
115
|
-
|
|
112
|
+
except requests.exceptions.HTTPError:
|
|
113
|
+
logger.warning(
|
|
114
|
+
f"プロジェクトメンバの登録に失敗しました。user_id = '{member.user_id}', member_role = '{member.member_role.value}'", exc_info=True
|
|
115
|
+
)
|
|
116
116
|
|
|
117
|
-
logger.info(f"{project_title} に、{count_invite_members} / {len(members)} 件のプロジェクトメンバを登録しました。")
|
|
117
|
+
logger.info(f"プロジェクト'{project_title}' に、{count_invite_members} / {len(members)} 件のプロジェクトメンバを登録しました。")
|
|
118
118
|
|
|
119
119
|
# プロジェクトメンバを削除
|
|
120
120
|
if delete:
|
|
@@ -125,7 +125,7 @@ class PutProjectMembers(CommandLine):
|
|
|
125
125
|
]
|
|
126
126
|
|
|
127
127
|
count_delete_members = 0
|
|
128
|
-
logger.info(f"{project_title} から、{len(deleted_members)} 件のプロジェクトメンバを削除します。")
|
|
128
|
+
logger.info(f"プロジェクト '{project_title}' から、{len(deleted_members)} 件のプロジェクトメンバを削除します。")
|
|
129
129
|
for deleted_member in deleted_members:
|
|
130
130
|
message_for_confirm = f"ユーザ '{deleted_member['user_id']}'を、{project_title} のプロジェクトメンバから削除しますか?"
|
|
131
131
|
if not self.confirm_processing(message_for_confirm):
|
|
@@ -135,31 +135,18 @@ class PutProjectMembers(CommandLine):
|
|
|
135
135
|
self.delete_project_member(project_id, deleted_member)
|
|
136
136
|
logger.debug(f"ユーザ '{deleted_member['user_id']}' をプロジェクトメンバから削除しました。")
|
|
137
137
|
count_delete_members += 1
|
|
138
|
-
except requests.exceptions.HTTPError
|
|
139
|
-
logger.warning(
|
|
140
|
-
logger.warning(f"プロジェクトメンバの削除に失敗しました。user_id = '{deleted_member['user_id']}' ")
|
|
138
|
+
except requests.exceptions.HTTPError:
|
|
139
|
+
logger.warning(f"プロジェクトメンバの削除に失敗しました。user_id = '{deleted_member['user_id']}' ", exc_info=True)
|
|
141
140
|
|
|
142
|
-
logger.info(f"{project_title} から {count_delete_members} / {len(deleted_members)} 件のプロジェクトメンバを削除しました。")
|
|
141
|
+
logger.info(f"プロジェクト '{project_title}' から {count_delete_members} / {len(deleted_members)} 件のプロジェクトメンバを削除しました。")
|
|
143
142
|
|
|
144
143
|
@staticmethod
|
|
145
144
|
def get_members_from_csv(csv_path: Path) -> list[Member]:
|
|
146
|
-
def create_member(e): # noqa: ANN001, ANN202
|
|
147
|
-
return Member(
|
|
148
|
-
user_id=e.user_id,
|
|
149
|
-
member_role=ProjectMemberRole(e.member_role),
|
|
150
|
-
sampling_inspection_rate=e.sampling_inspection_rate,
|
|
151
|
-
sampling_acceptance_rate=e.sampling_acceptance_rate,
|
|
152
|
-
)
|
|
153
|
-
|
|
154
145
|
df = pandas.read_csv(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
# IDは必ず文字列として読み込むようにする
|
|
160
|
-
dtype={"user_id": str},
|
|
161
|
-
).replace({numpy.nan: None})
|
|
162
|
-
members = [create_member(e) for e in df.itertuples()]
|
|
146
|
+
csv_path,
|
|
147
|
+
dtype={"user_id": "string", "member_role": "string", "sampling_inspection_rate": "Int64", "sampling_acceptance_rate": "Int64"},
|
|
148
|
+
)
|
|
149
|
+
members = [Member.from_dict(e) for e in df.to_dict("records")]
|
|
163
150
|
return members
|
|
164
151
|
|
|
165
152
|
def main(self) -> None:
|
|
@@ -184,12 +171,14 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
184
171
|
type=str,
|
|
185
172
|
required=True,
|
|
186
173
|
help=(
|
|
187
|
-
"プロジェクトメンバが記載された
|
|
188
|
-
"CSV
|
|
189
|
-
"
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
"
|
|
174
|
+
"プロジェクトメンバが記載されたCSVファイルのパスを指定してください。"
|
|
175
|
+
"CSVのフォーマットは、ヘッダあり、カンマ区切りです。\n"
|
|
176
|
+
" * user_id (required)\n"
|
|
177
|
+
" * member_role (required)\n"
|
|
178
|
+
" * sampling_inspection_rate\n"
|
|
179
|
+
" * sampling_acceptance_rate\n"
|
|
180
|
+
"member_roleには ``owner``, ``worker``, ``accepter``, ``training_data_user`` のいずれかを指定します。\n"
|
|
181
|
+
"自分自身は登録できません。"
|
|
193
182
|
),
|
|
194
183
|
)
|
|
195
184
|
|
|
@@ -202,10 +191,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
202
191
|
|
|
203
192
|
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
204
193
|
subcommand_name = "put"
|
|
205
|
-
subcommand_help = "
|
|
206
|
-
|
|
207
|
-
epilog = "オーナロールを持つユーザで実行してください。"
|
|
194
|
+
subcommand_help = "プロジェクトメンバを登録します。"
|
|
195
|
+
epilog = "オーナーロールを持つユーザで実行してください。"
|
|
208
196
|
|
|
209
|
-
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help,
|
|
197
|
+
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, epilog=epilog)
|
|
210
198
|
parse_args(parser)
|
|
211
199
|
return parser
|
|
@@ -552,7 +552,7 @@ class AttributeCountCsv:
|
|
|
552
552
|
|
|
553
553
|
# アノテーション数の列のNaNを0に変換する
|
|
554
554
|
value_columns = self._value_columns(counter_list, prior_attribute_columns)
|
|
555
|
-
df = df.fillna(
|
|
555
|
+
df = df.fillna(dict.fromkeys(value_columns, 0))
|
|
556
556
|
|
|
557
557
|
print_csv(df, output=str(output_file), to_csv_kwargs=self.csv_format)
|
|
558
558
|
|
|
@@ -655,7 +655,7 @@ class LabelCountCsv:
|
|
|
655
655
|
|
|
656
656
|
# アノテーション数列のNaNを0に変換する
|
|
657
657
|
value_columns = self._value_columns(counter_list, prior_label_columns)
|
|
658
|
-
df = df.fillna(
|
|
658
|
+
df = df.fillna(dict.fromkeys(value_columns, 0))
|
|
659
659
|
|
|
660
660
|
print_csv(df, output=str(output_file), to_csv_kwargs=self.csv_format)
|
|
661
661
|
|
|
@@ -411,7 +411,7 @@ class AnnotationDurationCsvByAttribute:
|
|
|
411
411
|
|
|
412
412
|
# アノテーション数の列のNaNを0に変換する
|
|
413
413
|
value_columns = self._value_columns(annotation_duration_list, prior_attribute_columns)
|
|
414
|
-
df = df.fillna(
|
|
414
|
+
df = df.fillna(dict.fromkeys(value_columns, 0))
|
|
415
415
|
return df
|
|
416
416
|
|
|
417
417
|
|
|
@@ -473,7 +473,7 @@ class AnnotationDurationCsvByLabel:
|
|
|
473
473
|
|
|
474
474
|
# アノテーション数列のNaNを0に変換する
|
|
475
475
|
value_columns = self._value_columns(annotation_duration_list, prior_label_columns)
|
|
476
|
-
df = df.fillna(
|
|
476
|
+
df = df.fillna(dict.fromkeys(value_columns, 0))
|
|
477
477
|
|
|
478
478
|
return df
|
|
479
479
|
|
|
@@ -181,17 +181,17 @@ class AbstractPhaseProductivityPerDate(abc.ABC):
|
|
|
181
181
|
|
|
182
182
|
# その他の欠損値(作業時間や生産量)を0で埋める
|
|
183
183
|
df2 = df2.fillna(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
for col in [
|
|
184
|
+
dict.fromkeys(
|
|
185
|
+
[
|
|
187
186
|
"annotation_worktime_hour",
|
|
188
187
|
"inspection_worktime_hour",
|
|
189
188
|
"acceptance_worktime_hour",
|
|
190
189
|
"task_count",
|
|
191
190
|
"inspection_comment_count",
|
|
192
191
|
*self.production_volume_columns,
|
|
193
|
-
]
|
|
194
|
-
|
|
192
|
+
],
|
|
193
|
+
0,
|
|
194
|
+
)
|
|
195
195
|
)
|
|
196
196
|
|
|
197
197
|
return df2
|
|
@@ -571,7 +571,7 @@ class UserPerformance:
|
|
|
571
571
|
level0_columns = ["monitored_worktime_hour", *task_worktime_by_phase_user.quantity_columns]
|
|
572
572
|
columns = [(c0, c1) for c0, c1 in df.columns if c0 in level0_columns]
|
|
573
573
|
|
|
574
|
-
return df.fillna(
|
|
574
|
+
return df.fillna(dict.fromkeys(columns, 0))
|
|
575
575
|
|
|
576
576
|
if task_completion_criteria == TaskCompletionCriteria.ACCEPTANCE_REACHED:
|
|
577
577
|
# 受入フェーズに到達したらタスクの作業が完了したとみなす場合、
|
|
@@ -634,8 +634,8 @@ class UserPerformance:
|
|
|
634
634
|
]
|
|
635
635
|
|
|
636
636
|
value_columns = columns - set(basic_columns)
|
|
637
|
-
dtypes =
|
|
638
|
-
dtypes.update(
|
|
637
|
+
dtypes = dict.fromkeys(basic_columns, "string")
|
|
638
|
+
dtypes.update(dict.fromkeys(value_columns, "float64"))
|
|
639
639
|
return df.astype(dtypes)
|
|
640
640
|
|
|
641
641
|
def _validate_df_for_output(self, output_file: Path) -> bool:
|
|
@@ -197,8 +197,8 @@ class WholePerformance:
|
|
|
197
197
|
("working_days", ""),
|
|
198
198
|
]
|
|
199
199
|
|
|
200
|
-
data: dict[tuple[str, str], float] =
|
|
201
|
-
data.update(
|
|
200
|
+
data: dict[tuple[str, str], float] = dict.fromkeys(worktime_columns + count_columns, 0)
|
|
201
|
+
data.update(dict.fromkeys(ratio_columns + stdev_columns + date_columns, numpy.nan))
|
|
202
202
|
|
|
203
203
|
return cls(pandas.Series(data), task_completion_criteria, custom_production_volume_list=custom_production_volume_list)
|
|
204
204
|
|
|
@@ -187,7 +187,7 @@ class WholeProductivityPerCompletedDate:
|
|
|
187
187
|
df_agg_sub_task["task_count"] = df_sub_task.pivot_table(values=["task_id"], index=date_column, aggfunc="count").fillna(0)
|
|
188
188
|
else:
|
|
189
189
|
# 列だけ作る
|
|
190
|
-
df_agg_sub_task = df_agg_sub_task.assign(**
|
|
190
|
+
df_agg_sub_task = df_agg_sub_task.assign(**dict.fromkeys(production_volume_columns, 0), task_count=0)
|
|
191
191
|
|
|
192
192
|
df_worktime = worktime_per_date.df
|
|
193
193
|
if len(df_worktime) > 0:
|
|
@@ -929,7 +929,7 @@ class WholeProductivityPerFirstAnnotationStartedDate:
|
|
|
929
929
|
).fillna(0)
|
|
930
930
|
else:
|
|
931
931
|
# 列だけ作る
|
|
932
|
-
df_agg_sub_task = df_agg_sub_task.assign(**
|
|
932
|
+
df_agg_sub_task = df_agg_sub_task.assign(**dict.fromkeys(value_columns, 0), task_count=0)
|
|
933
933
|
|
|
934
934
|
# 日付の一覧を生成
|
|
935
935
|
if len(df_agg_sub_task) > 0:
|
|
@@ -200,7 +200,7 @@ class WorktimePerDate:
|
|
|
200
200
|
"monitored_inspection_worktime_hour",
|
|
201
201
|
"monitored_acceptance_worktime_hour",
|
|
202
202
|
]
|
|
203
|
-
df.fillna(
|
|
203
|
+
df.fillna(dict.fromkeys(value_columns, 0), inplace=True)
|
|
204
204
|
|
|
205
205
|
df = df.merge(df_member, how="left", on="account_id")
|
|
206
206
|
return df[
|
{annofabcli-1.96.1 → annofabcli-1.97.0}/annofabcli/supplementary/delete_supplementary_data.py
RENAMED
|
@@ -31,18 +31,11 @@ key: input_data_id, value: supplementary_data_idのList
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def get_input_data_supplementary_data_dict_from_csv(csv_path: Path) -> InputDataSupplementaryDataDict:
|
|
34
|
-
df = pandas.read_csv(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
header=None,
|
|
38
|
-
names=[
|
|
39
|
-
"input_data_id",
|
|
40
|
-
"supplementary_data_id",
|
|
41
|
-
],
|
|
42
|
-
# IDは必ず文字列として読み込むようにする
|
|
43
|
-
dtype={"input_data_id": str, "supplementary_data_id": str},
|
|
34
|
+
df: pandas.DataFrame = pandas.read_csv(
|
|
35
|
+
csv_path,
|
|
36
|
+
dtype={"input_data_id": "string", "supplementary_data_id": "string"},
|
|
44
37
|
)
|
|
45
|
-
input_data_dict = defaultdict(list)
|
|
38
|
+
input_data_dict: InputDataSupplementaryDataDict = defaultdict(list)
|
|
46
39
|
for input_data_id, supplementary_data_id in zip(df["input_data_id"], df["supplementary_data_id"]):
|
|
47
40
|
input_data_dict[input_data_id].append(supplementary_data_id)
|
|
48
41
|
return input_data_dict
|
|
@@ -58,7 +51,7 @@ def get_input_data_supplementary_data_dict_from_list(supplementary_data_list: li
|
|
|
58
51
|
|
|
59
52
|
|
|
60
53
|
class DeleteSupplementaryDataMain(CommandLineWithConfirm):
|
|
61
|
-
def __init__(self, service: annofabapi.Resource, all_yes: bool = False) -> None:
|
|
54
|
+
def __init__(self, service: annofabapi.Resource, *, all_yes: bool = False) -> None:
|
|
62
55
|
self.service = service
|
|
63
56
|
self.facade = AnnofabApiFacade(service)
|
|
64
57
|
CommandLineWithConfirm.__init__(self, all_yes)
|
|
@@ -82,7 +75,7 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
|
|
|
82
75
|
|
|
83
76
|
input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data_id)
|
|
84
77
|
if input_data is None:
|
|
85
|
-
logger.warning(f"input_data_id={input_data_id} の入力データは存在しないのでスキップします。")
|
|
78
|
+
logger.warning(f"input_data_id='{input_data_id}' の入力データは存在しないのでスキップします。")
|
|
86
79
|
return 0
|
|
87
80
|
|
|
88
81
|
supplementary_data_list, _ = self.service.api.get_supplementary_data_list(project_id, input_data_id)
|
|
@@ -122,7 +115,7 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
|
|
|
122
115
|
continue
|
|
123
116
|
return deleted_count
|
|
124
117
|
|
|
125
|
-
def delete_supplementary_data_list(self, project_id: str, input_data_dict: InputDataSupplementaryDataDict)
|
|
118
|
+
def delete_supplementary_data_list(self, project_id: str, input_data_dict: InputDataSupplementaryDataDict) -> None:
|
|
126
119
|
deleted_count = 0
|
|
127
120
|
total_count = sum(len(e) for e in input_data_dict.values())
|
|
128
121
|
for input_data_id, supplementary_data_id_list in input_data_dict.items():
|
|
@@ -168,7 +161,7 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
|
|
|
168
161
|
|
|
169
162
|
return deleted_count
|
|
170
163
|
|
|
171
|
-
def delete_supplementary_data_list_by_input_data_id(self, project_id: str, input_data_id_list: list[str])
|
|
164
|
+
def delete_supplementary_data_list_by_input_data_id(self, project_id: str, input_data_id_list: list[str]) -> None:
|
|
172
165
|
dict_deleted_count: dict[str, int] = {}
|
|
173
166
|
for input_data_id in input_data_id_list:
|
|
174
167
|
input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data_id)
|
|
@@ -261,9 +254,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
261
254
|
"削除する補助情報が記載されたCSVファイルのパスを指定してください。\n"
|
|
262
255
|
"CSVのフォーマットは以下の通りです。"
|
|
263
256
|
"詳細は https://annofab-cli.readthedocs.io/ja/latest/command_reference/supplementary/delete.html を参照してください。\n"
|
|
264
|
-
" *
|
|
265
|
-
" *
|
|
266
|
-
" *
|
|
257
|
+
" * ヘッダ行あり, カンマ区切り\n"
|
|
258
|
+
" * input_data_id (required)\n"
|
|
259
|
+
" * supplementary_data_id (required)\n"
|
|
267
260
|
),
|
|
268
261
|
)
|
|
269
262
|
|