annofabcli 1.100.0__tar.gz → 100.3__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.100.0 → annofabcli-100.3}/PKG-INFO +3 -8
- {annofabcli-1.100.0 → annofabcli-100.3}/README.md +2 -6
- annofabcli-100.3/annofabcli/__version__.py +1 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/change_annotation_attributes.py +2 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_attribute.py +51 -33
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_choice.py +42 -17
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_history.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_label.py +26 -93
- annofabcli-100.3/annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +220 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/subcommand_annotation_specs.py +2 -0
- annofabcli-100.3/annofabcli/common/annofab/annotation_specs.py +25 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/cli.py +0 -29
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/download.py +1 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/exceptions.py +2 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/facade.py +2 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/image.py +2 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/delete_input_data.py +6 -7
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/list_input_data.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/list_instruction_history.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/delete_job.py +4 -4
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/list_job.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/list_last_job.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/list_organization_member.py +3 -5
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/list_project.py +0 -3
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/change_project_members.py +2 -3
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/drop_project_members.py +8 -8
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/invite_project_members.py +5 -6
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/list_users.py +5 -7
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/task.py +0 -3
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/complete_tasks.py +2 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/list_all_tasks.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/list_tasks.py +0 -2
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/reject_tasks.py +76 -100
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/update_metadata_of_task.py +1 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history/list_task_history.py +1 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/pyproject.toml +1 -2
- annofabcli-1.100.0/annofabcli/__version__.py +0 -1
- {annofabcli-1.100.0 → annofabcli-100.3}/LICENSE +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/__main__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/annotation_query.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/change_annotation_properties.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/copy_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/delete_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/download_annotation_zip.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/dump_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/import_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/list_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/list_annotation_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/merge_segmentation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/remove_segmentation_overlap.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/restore_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/subcommand_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/add_attribute_restriction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/attribute_restriction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/export_annotation_specs.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_attribute_restriction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_label_color.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/put_label_color.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/delete_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/download_comment_json.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/list_all_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/list_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_comment_simply.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_inspection_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_inspection_comment_simply.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_onhold_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/put_onhold_comment_simply.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/subcommand_comment.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/comment/utils.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/annofab/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/annofab/project.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/bokeh.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/dataclasses.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/enums.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/pandas.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/type_util.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/typing.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/utils.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/common/visualize.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/data/logging.yaml +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/experimental/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/experimental/list_out_of_range_annotation_for_movie.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/experimental/subcommand_experimental.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/draw_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/filter_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/mask_user_info.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/merge_annotation.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/filesystem/subcommand_filesystem.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/change_input_data_name.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/copy_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/delete_metadata_key_of_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/download_input_data_json.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/list_all_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/list_all_input_data_merged_task.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/put_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/put_input_data_with_zip.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/subcommand_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/update_metadata_of_input_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/input_data/utils.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/copy_instruction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/download_instruction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/subcommand_instruction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/instruction/upload_instruction.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/subcommand_job.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/job/wait_job.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/my_account/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/my_account/get_my_account.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/my_account/subcommand_my_account.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization/list_organization.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization/subcommand_organization.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/change_organization_member.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/delete_organization_member.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/invite_organization_member.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/organization_member/subcommand_organization_member.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/change_project_status.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/copy_project.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/diff_projects.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/put_project.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project/subcommand_project.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/copy_project_members.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/put_project_members.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/project_member/subcommand_project_member.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/py.typed +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/mask_visualization_dir.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/merge_visualization_dir.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/subcommand_stat_visualization.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/summarize_whole_performance_csv.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/write_graph.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/stat_visualization/write_performance_rating_csv.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/histogram.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/linegraph.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_annotation_attribute.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_annotation_attribute_filled_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_annotation_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_annotation_duration.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_video_duration.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/list_worktime.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/scatter.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/subcommand_statistics.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/summarize_task_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/summarize_task_count_by_task_id_group.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/summarize_task_count_by_user.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/actual_worktime.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/annotation_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/custom_production_volume.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/input_data_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/inspection_comment_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/productivity_per_date.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/project_performance.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/task_history.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/user.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/user_performance.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/whole_performance.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/dataframe/worktime_per_date.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/filtering_query.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/model.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/project_dir.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualization/visualization_source_files.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualize_annotation_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualize_annotation_duration.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualize_statistics.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/statistics/visualize_video_duration.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/supplementary/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/supplementary/delete_supplementary_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/supplementary/list_supplementary_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/supplementary/put_supplementary_data.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/supplementary/subcommand_supplementary.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/cancel_acceptance.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/change_operator.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/change_status_to_break.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/change_status_to_on_hold.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/copy_tasks.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/delete_metadata_key_of_task.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/delete_tasks.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/download_task_json.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/list_all_tasks_added_task_history.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/list_tasks_added_task_history.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/put_tasks.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/put_tasks_by_count.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task/subcommand_task.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history/download_task_history_json.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history/list_all_task_history.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history/subcommand_task_history.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history_event/__init__.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history_event/download_task_history_event_json.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history_event/list_all_task_history_event.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/task_history_event/list_worktime.py +0 -0
- {annofabcli-1.100.0 → annofabcli-100.3}/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:
|
|
3
|
+
Version: 100.3
|
|
4
4
|
Summary: Utility Command Line Interface for AnnoFab
|
|
5
5
|
Home-page: https://github.com/kurusugawa-computer/annofab-cli
|
|
6
6
|
License: MIT
|
|
@@ -23,7 +23,6 @@ Requires-Dist: annofabapi (>=1.4.1,<2.0.0)
|
|
|
23
23
|
Requires-Dist: bokeh (>=3.3,<3.7)
|
|
24
24
|
Requires-Dist: dictdiffer
|
|
25
25
|
Requires-Dist: isodate
|
|
26
|
-
Requires-Dist: jmespath
|
|
27
26
|
Requires-Dist: more-itertools
|
|
28
27
|
Requires-Dist: numpy
|
|
29
28
|
Requires-Dist: pandas (>=2,<3)
|
|
@@ -58,14 +57,10 @@ Description-Content-Type: text/markdown
|
|
|
58
57
|
|
|
59
58
|
|
|
60
59
|
## 廃止予定
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
### 2022-11-01 以降
|
|
64
|
-
* JMESPathを指定できる `--query`を削除します。使いどころがあまりないのと、`jq`コマンドでも対応できるためです。
|
|
65
|
-
|
|
60
|
+
* TODO
|
|
66
61
|
|
|
67
62
|
# Requirements
|
|
68
|
-
* Python 3.9
|
|
63
|
+
* Python 3.9+
|
|
69
64
|
|
|
70
65
|
# Install
|
|
71
66
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "100.3" # `poetry-dynamic-versioning`を使ってGitHubのバージョンタグを取得している。変更不要
|
{annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation/change_annotation_attributes.py
RENAMED
|
@@ -138,12 +138,12 @@ class ChangeAnnotationAttributesMain(CommandLineWithConfirm):
|
|
|
138
138
|
|
|
139
139
|
task: Task = Task.from_dict(dict_task)
|
|
140
140
|
if task.status == TaskStatus.WORKING:
|
|
141
|
-
logger.warning(f"task_id={task_id}: タスクが作業中状態のため、スキップします。")
|
|
141
|
+
logger.warning(f"task_id='{task_id}': タスクが作業中状態のため、スキップします。")
|
|
142
142
|
return False
|
|
143
143
|
|
|
144
144
|
if not self.is_force: # noqa: SIM102
|
|
145
145
|
if task.status == TaskStatus.COMPLETE:
|
|
146
|
-
logger.warning(f"task_id={task_id}: タスクが完了状態のため、スキップします。")
|
|
146
|
+
logger.warning(f"task_id='{task_id}': タスクが完了状態のため、スキップします。")
|
|
147
147
|
return False
|
|
148
148
|
|
|
149
149
|
annotation_list = self.get_annotation_list_for_task(task_id, annotation_query)
|
|
@@ -16,6 +16,7 @@ from dataclasses_json import DataClassJsonMixin
|
|
|
16
16
|
|
|
17
17
|
import annofabcli
|
|
18
18
|
import annofabcli.common.cli
|
|
19
|
+
from annofabcli.common.annofab.annotation_specs import keybind_to_text
|
|
19
20
|
from annofabcli.common.cli import (
|
|
20
21
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
21
22
|
ArgumentParser,
|
|
@@ -24,15 +25,16 @@ from annofabcli.common.cli import (
|
|
|
24
25
|
)
|
|
25
26
|
from annofabcli.common.enums import FormatArgument
|
|
26
27
|
from annofabcli.common.facade import AnnofabApiFacade
|
|
27
|
-
from annofabcli.common.utils import print_csv
|
|
28
|
+
from annofabcli.common.utils import print_according_to_format, print_csv
|
|
28
29
|
|
|
29
30
|
logger = logging.getLogger(__name__)
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
@dataclass
|
|
33
|
-
class
|
|
34
|
+
class FlattenAttribute(DataClassJsonMixin):
|
|
34
35
|
"""
|
|
35
|
-
|
|
36
|
+
ネストされていないフラットな属性情報を格納するクラスです。
|
|
37
|
+
選択肢の一覧などは格納できません。
|
|
36
38
|
"""
|
|
37
39
|
|
|
38
40
|
attribute_id: str
|
|
@@ -45,7 +47,7 @@ class AttributeForCsv(DataClassJsonMixin):
|
|
|
45
47
|
attribute_name_en: Optional[str]
|
|
46
48
|
attribute_name_ja: Optional[str]
|
|
47
49
|
attribute_name_vi: Optional[str]
|
|
48
|
-
|
|
50
|
+
attribute_type: str
|
|
49
51
|
"""属性の種類"""
|
|
50
52
|
default: Optional[Union[str, bool, int]]
|
|
51
53
|
"""デフォルト値"""
|
|
@@ -60,6 +62,7 @@ class AttributeForCsv(DataClassJsonMixin):
|
|
|
60
62
|
"""制約の個数"""
|
|
61
63
|
reference_label_count: int
|
|
62
64
|
"""参照されているラベルの個数"""
|
|
65
|
+
keybind: Optional[str]
|
|
63
66
|
|
|
64
67
|
|
|
65
68
|
def create_relationship_between_attribute_and_label(labels_v3: list[dict[str, Any]]) -> dict[str, set[str]]:
|
|
@@ -78,11 +81,11 @@ def create_relationship_between_attribute_and_label(labels_v3: list[dict[str, An
|
|
|
78
81
|
return result
|
|
79
82
|
|
|
80
83
|
|
|
81
|
-
def
|
|
84
|
+
def create_flatten_attribute_list_from_additionals(
|
|
82
85
|
additionals_v3: list[dict[str, Any]], labels_v3: list[dict[str, Any]], restrictions: list[dict[str, Any]]
|
|
83
|
-
) ->
|
|
86
|
+
) -> list[FlattenAttribute]:
|
|
84
87
|
"""
|
|
85
|
-
APIから取得した属性情報(v3
|
|
88
|
+
APIから取得した属性情報(v3版)から、属性情報の一覧を生成します。
|
|
86
89
|
|
|
87
90
|
Args:
|
|
88
91
|
additionals_v3: APIから取得した属性情報(v3版)
|
|
@@ -98,52 +101,60 @@ def create_df_from_additionals(
|
|
|
98
101
|
# keyが属性ID、valueが属性に紐づくラベルのIDのsetであるdict
|
|
99
102
|
dict_label_ids = create_relationship_between_attribute_and_label(labels_v3)
|
|
100
103
|
|
|
101
|
-
def dict_additional_to_dataclass(additional: dict[str, Any]) ->
|
|
104
|
+
def dict_additional_to_dataclass(additional: dict[str, Any]) -> FlattenAttribute:
|
|
102
105
|
"""
|
|
103
106
|
辞書の属性情報をDataClassのラベル情報に変換します。
|
|
104
107
|
"""
|
|
105
108
|
attribute_id = additional["additional_data_definition_id"]
|
|
106
109
|
additional_name = additional["name"]
|
|
107
|
-
return
|
|
110
|
+
return FlattenAttribute(
|
|
108
111
|
attribute_id=attribute_id,
|
|
109
112
|
attribute_name_en=get_message_with_lang(additional_name, lang=Lang.EN_US),
|
|
110
113
|
attribute_name_ja=get_message_with_lang(additional_name, lang=Lang.JA_JP),
|
|
111
114
|
attribute_name_vi=get_message_with_lang(additional_name, lang=Lang.VI_VN),
|
|
112
|
-
|
|
115
|
+
attribute_type=additional["type"],
|
|
113
116
|
default=additional["default"],
|
|
114
117
|
read_only=additional["read_only"],
|
|
115
118
|
choice_count=len(additional["choices"]),
|
|
116
119
|
restriction_count=dict_restriction_count[attribute_id],
|
|
117
120
|
reference_label_count=len(dict_label_ids[attribute_id]),
|
|
121
|
+
keybind=keybind_to_text(additional["keybind"]),
|
|
118
122
|
)
|
|
119
123
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
columns = [
|
|
123
|
-
"attribute_id",
|
|
124
|
-
"attribute_name_en",
|
|
125
|
-
"attribute_name_ja",
|
|
126
|
-
"attribute_name_vi",
|
|
127
|
-
"type",
|
|
128
|
-
"default",
|
|
129
|
-
"read_only",
|
|
130
|
-
"choice_count",
|
|
131
|
-
"restriction_count",
|
|
132
|
-
"reference_label_count",
|
|
133
|
-
]
|
|
134
|
-
|
|
135
|
-
df = pandas.DataFrame(new_labels, columns=columns)
|
|
136
|
-
return df
|
|
124
|
+
return [dict_additional_to_dataclass(e) for e in additionals_v3]
|
|
137
125
|
|
|
138
126
|
|
|
139
127
|
class PrintAnnotationSpecsAttribute(CommandLine):
|
|
140
128
|
COMMON_MESSAGE = "annofabcli annotation_specs list_attribute: error:"
|
|
141
129
|
|
|
142
|
-
def print_annotation_specs_attribute(
|
|
143
|
-
|
|
144
|
-
|
|
130
|
+
def print_annotation_specs_attribute(
|
|
131
|
+
self, annotation_specs_v3: dict[str, Any], output_format: FormatArgument, output: Optional[str] = None
|
|
132
|
+
) -> None:
|
|
133
|
+
attribute_list = create_flatten_attribute_list_from_additionals(
|
|
134
|
+
annotation_specs_v3["additionals"], annotation_specs_v3["labels"], annotation_specs_v3["restrictions"]
|
|
135
|
+
)
|
|
136
|
+
logger.info(f"{len(attribute_list)} 件の属性情報を出力します。")
|
|
137
|
+
if output_format == FormatArgument.CSV:
|
|
138
|
+
columns = [
|
|
139
|
+
"attribute_id",
|
|
140
|
+
"attribute_name_en",
|
|
141
|
+
"attribute_name_ja",
|
|
142
|
+
"attribute_name_vi",
|
|
143
|
+
"type",
|
|
144
|
+
"default",
|
|
145
|
+
"read_only",
|
|
146
|
+
"choice_count",
|
|
147
|
+
"restriction_count",
|
|
148
|
+
"reference_label_count",
|
|
149
|
+
"keybind",
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
df = pandas.DataFrame(attribute_list, columns=columns)
|
|
145
153
|
print_csv(df, output)
|
|
146
154
|
|
|
155
|
+
elif output_format in [FormatArgument.JSON, FormatArgument.PRETTY_JSON]:
|
|
156
|
+
print_according_to_format([e.to_dict() for e in attribute_list], format=output_format, output=output)
|
|
157
|
+
|
|
147
158
|
def get_history_id_from_before_index(self, project_id: str, before: int) -> Optional[str]:
|
|
148
159
|
histories, _ = self.service.api.get_annotation_specs_histories(project_id)
|
|
149
160
|
if before + 1 > len(histories):
|
|
@@ -177,7 +188,7 @@ class PrintAnnotationSpecsAttribute(CommandLine):
|
|
|
177
188
|
else:
|
|
178
189
|
raise RuntimeError("'--project_id'か'--annotation_specs_json'のどちらかを指定する必要があります。")
|
|
179
190
|
|
|
180
|
-
self.print_annotation_specs_attribute(annotation_specs,
|
|
191
|
+
self.print_annotation_specs_attribute(annotation_specs, output_format=FormatArgument(args.format), output=args.output)
|
|
181
192
|
|
|
182
193
|
|
|
183
194
|
def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
@@ -216,7 +227,14 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
216
227
|
),
|
|
217
228
|
)
|
|
218
229
|
|
|
219
|
-
parser.add_argument(
|
|
230
|
+
parser.add_argument(
|
|
231
|
+
"-f",
|
|
232
|
+
"--format",
|
|
233
|
+
type=str,
|
|
234
|
+
choices=[FormatArgument.CSV.value, FormatArgument.JSON.value, FormatArgument.PRETTY_JSON.value],
|
|
235
|
+
default=FormatArgument.CSV.value,
|
|
236
|
+
help="出力フォーマット ",
|
|
237
|
+
)
|
|
220
238
|
|
|
221
239
|
argument_parser.add_output()
|
|
222
240
|
|
|
@@ -232,7 +250,7 @@ def main(args: argparse.Namespace) -> None:
|
|
|
232
250
|
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
233
251
|
subcommand_name = "list_attribute"
|
|
234
252
|
|
|
235
|
-
subcommand_help = "
|
|
253
|
+
subcommand_help = "アノテーション仕様の属性情報を出力します。"
|
|
236
254
|
|
|
237
255
|
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
|
|
238
256
|
parse_args(parser)
|
{annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_choice.py
RENAMED
|
@@ -15,6 +15,7 @@ from dataclasses_json import DataClassJsonMixin
|
|
|
15
15
|
|
|
16
16
|
import annofabcli
|
|
17
17
|
import annofabcli.common.cli
|
|
18
|
+
from annofabcli.common.annofab.annotation_specs import keybind_to_text
|
|
18
19
|
from annofabcli.common.cli import (
|
|
19
20
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
20
21
|
ArgumentParser,
|
|
@@ -23,13 +24,13 @@ from annofabcli.common.cli import (
|
|
|
23
24
|
)
|
|
24
25
|
from annofabcli.common.enums import FormatArgument
|
|
25
26
|
from annofabcli.common.facade import AnnofabApiFacade
|
|
26
|
-
from annofabcli.common.utils import print_csv
|
|
27
|
+
from annofabcli.common.utils import print_according_to_format, print_csv
|
|
27
28
|
|
|
28
29
|
logger = logging.getLogger(__name__)
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@dataclass
|
|
32
|
-
class
|
|
33
|
+
class FlattenChoice(DataClassJsonMixin):
|
|
33
34
|
"""
|
|
34
35
|
CSV用の選択肢情報を格納するクラスです。
|
|
35
36
|
"""
|
|
@@ -54,11 +55,13 @@ class ChoiceForCsv(DataClassJsonMixin):
|
|
|
54
55
|
choice_name_vi: Optional[str]
|
|
55
56
|
is_default: bool
|
|
56
57
|
"""初期値として設定されているかどうか"""
|
|
58
|
+
keybind: Optional[str]
|
|
59
|
+
"""キーバインド"""
|
|
57
60
|
|
|
58
61
|
|
|
59
|
-
def
|
|
62
|
+
def create_flatten_choice_list_from_additionals(additionals_v3: list[dict[str, Any]]) -> list[FlattenChoice]:
|
|
60
63
|
"""
|
|
61
|
-
APIから取得した属性情報(v3
|
|
64
|
+
APIから取得した属性情報(v3版)から、選択肢情報の一覧を生成します。
|
|
62
65
|
|
|
63
66
|
Args:
|
|
64
67
|
additionals_v3: APIから取得した属性情報(v3版)
|
|
@@ -67,7 +70,7 @@ def create_df_from_additionals(additionals_v3: list[dict[str, Any]]) -> pandas.D
|
|
|
67
70
|
def dict_choice_to_dataclass(
|
|
68
71
|
choice: dict[str, Any],
|
|
69
72
|
additional: dict[str, Any],
|
|
70
|
-
) ->
|
|
73
|
+
) -> FlattenChoice:
|
|
71
74
|
"""
|
|
72
75
|
辞書の選択肢情報をDataClassの選択肢情報に変換します。
|
|
73
76
|
"""
|
|
@@ -77,7 +80,7 @@ def create_df_from_additionals(additionals_v3: list[dict[str, Any]]) -> pandas.D
|
|
|
77
80
|
choice_id = choice["choice_id"]
|
|
78
81
|
choice_name = choice["name"]
|
|
79
82
|
is_default = additional["default"] == choice_id
|
|
80
|
-
return
|
|
83
|
+
return FlattenChoice(
|
|
81
84
|
attribute_id=attribute_id,
|
|
82
85
|
attribute_name_en=get_english_message(additional_name),
|
|
83
86
|
attribute_type=additional["type"],
|
|
@@ -86,6 +89,7 @@ def create_df_from_additionals(additionals_v3: list[dict[str, Any]]) -> pandas.D
|
|
|
86
89
|
choice_name_ja=get_message_with_lang(choice_name, lang=Lang.JA_JP),
|
|
87
90
|
choice_name_vi=get_message_with_lang(choice_name, lang=Lang.VI_VN),
|
|
88
91
|
is_default=is_default,
|
|
92
|
+
keybind=keybind_to_text(choice["keybind"]),
|
|
89
93
|
)
|
|
90
94
|
|
|
91
95
|
tmp_list = []
|
|
@@ -95,19 +99,33 @@ def create_df_from_additionals(additionals_v3: list[dict[str, Any]]) -> pandas.D
|
|
|
95
99
|
continue
|
|
96
100
|
for choice in choices:
|
|
97
101
|
tmp_list.append(dict_choice_to_dataclass(choice, additional)) # noqa: PERF401
|
|
98
|
-
|
|
99
|
-
columns = ["attribute_id", "attribute_name_en", "attribute_type", "choice_id", "choice_name_en", "choice_name_ja", "choice_name_vi", "is_default"]
|
|
100
|
-
df = pandas.DataFrame(tmp_list, columns=columns)
|
|
101
|
-
return df
|
|
102
|
+
return tmp_list
|
|
102
103
|
|
|
103
104
|
|
|
104
105
|
class PrintAnnotationSpecsAttribute(CommandLine):
|
|
105
106
|
COMMON_MESSAGE = "annofabcli annotation_specs list_choice: error:"
|
|
106
107
|
|
|
107
|
-
def print_annotation_specs_choice(self, annotation_specs_v3: dict[str, Any],
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
def print_annotation_specs_choice(self, annotation_specs_v3: dict[str, Any], output_format: FormatArgument, output: Optional[str] = None) -> None:
|
|
109
|
+
choice_list = create_flatten_choice_list_from_additionals(annotation_specs_v3["additionals"])
|
|
110
|
+
logger.info(f"{len(choice_list)} 件の選択肢情報を出力します。")
|
|
111
|
+
|
|
112
|
+
if output_format == FormatArgument.CSV:
|
|
113
|
+
df = pandas.DataFrame(choice_list)
|
|
114
|
+
columns = [
|
|
115
|
+
"attribute_id",
|
|
116
|
+
"attribute_name_en",
|
|
117
|
+
"attribute_type",
|
|
118
|
+
"choice_id",
|
|
119
|
+
"choice_name_en",
|
|
120
|
+
"choice_name_ja",
|
|
121
|
+
"choice_name_vi",
|
|
122
|
+
"is_default",
|
|
123
|
+
"keybind",
|
|
124
|
+
]
|
|
125
|
+
print_csv(df[columns], output)
|
|
126
|
+
|
|
127
|
+
elif output_format in [FormatArgument.JSON, FormatArgument.PRETTY_JSON]:
|
|
128
|
+
print_according_to_format([e.to_dict() for e in choice_list], format=output_format, output=output)
|
|
111
129
|
|
|
112
130
|
def get_history_id_from_before_index(self, project_id: str, before: int) -> Optional[str]:
|
|
113
131
|
histories, _ = self.service.api.get_annotation_specs_histories(project_id)
|
|
@@ -144,7 +162,7 @@ class PrintAnnotationSpecsAttribute(CommandLine):
|
|
|
144
162
|
else:
|
|
145
163
|
raise RuntimeError("'--project_id'か'--annotation_specs_json'のどちらかを指定する必要があります。")
|
|
146
164
|
|
|
147
|
-
self.print_annotation_specs_choice(annotation_specs,
|
|
165
|
+
self.print_annotation_specs_choice(annotation_specs, output_format=FormatArgument(args.format), output=args.output)
|
|
148
166
|
|
|
149
167
|
|
|
150
168
|
def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
@@ -183,7 +201,14 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
183
201
|
),
|
|
184
202
|
)
|
|
185
203
|
|
|
186
|
-
parser.add_argument(
|
|
204
|
+
parser.add_argument(
|
|
205
|
+
"-f",
|
|
206
|
+
"--format",
|
|
207
|
+
type=str,
|
|
208
|
+
choices=[FormatArgument.CSV.value, FormatArgument.JSON.value, FormatArgument.PRETTY_JSON.value],
|
|
209
|
+
default=FormatArgument.CSV.value,
|
|
210
|
+
help="出力フォーマット ",
|
|
211
|
+
)
|
|
187
212
|
|
|
188
213
|
argument_parser.add_output()
|
|
189
214
|
|
|
@@ -199,7 +224,7 @@ def main(args: argparse.Namespace) -> None:
|
|
|
199
224
|
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
200
225
|
subcommand_name = "list_choice"
|
|
201
226
|
|
|
202
|
-
subcommand_help = "
|
|
227
|
+
subcommand_help = "アノテーション仕様のドロップダウンまたはラジオボタン属性の選択肢情報を出力します。"
|
|
203
228
|
|
|
204
229
|
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
|
|
205
230
|
parse_args(parser)
|
{annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_history.py
RENAMED
|
@@ -51,7 +51,6 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
51
51
|
argument_parser.add_format(choices=[FormatArgument.CSV, FormatArgument.JSON, FormatArgument.PRETTY_JSON], default=FormatArgument.CSV)
|
|
52
52
|
argument_parser.add_output()
|
|
53
53
|
argument_parser.add_csv_format()
|
|
54
|
-
argument_parser.add_query()
|
|
55
54
|
|
|
56
55
|
parser.set_defaults(subcommand_func=main)
|
|
57
56
|
|
{annofabcli-1.100.0 → annofabcli-100.3}/annofabcli/annotation_specs/list_annotation_specs_label.py
RENAMED
|
@@ -15,6 +15,7 @@ from dataclasses_json import DataClassJsonMixin
|
|
|
15
15
|
|
|
16
16
|
import annofabcli
|
|
17
17
|
import annofabcli.common.cli
|
|
18
|
+
from annofabcli.common.annofab.annotation_specs import keybind_to_text
|
|
18
19
|
from annofabcli.common.cli import (
|
|
19
20
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
20
21
|
ArgumentParser,
|
|
@@ -22,16 +23,16 @@ from annofabcli.common.cli import (
|
|
|
22
23
|
build_annofabapi_resource_and_login,
|
|
23
24
|
)
|
|
24
25
|
from annofabcli.common.enums import FormatArgument
|
|
25
|
-
from annofabcli.common.facade import AnnofabApiFacade
|
|
26
|
+
from annofabcli.common.facade import AnnofabApiFacade
|
|
26
27
|
from annofabcli.common.utils import print_csv
|
|
27
28
|
|
|
28
29
|
logger = logging.getLogger(__name__)
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@dataclass
|
|
32
|
-
class
|
|
33
|
+
class FlattenLabel(DataClassJsonMixin):
|
|
33
34
|
"""
|
|
34
|
-
|
|
35
|
+
ラベル情報を格納するクラスです。
|
|
35
36
|
"""
|
|
36
37
|
|
|
37
38
|
label_id: str
|
|
@@ -50,6 +51,8 @@ class LabelForCsv(DataClassJsonMixin):
|
|
|
50
51
|
Notes:
|
|
51
52
|
APIでは`additional_data_definitions`のような名前だが、分かりにくかったので"attribute"という名前に変えた。
|
|
52
53
|
"""
|
|
54
|
+
keybind: Optional[str]
|
|
55
|
+
"""キーバインド"""
|
|
53
56
|
|
|
54
57
|
|
|
55
58
|
def decimal_to_hex_color(red: int, green: int, blue: int) -> str:
|
|
@@ -63,22 +66,22 @@ def decimal_to_hex_color(red: int, green: int, blue: int) -> str:
|
|
|
63
66
|
return f"#{red:02X}{green:02X}{blue:02X}"
|
|
64
67
|
|
|
65
68
|
|
|
66
|
-
def
|
|
69
|
+
def create_label_list(labels_v3: list[dict[str, Any]]) -> list[FlattenLabel]:
|
|
67
70
|
"""
|
|
68
|
-
APIから取得したラベル情報(v3
|
|
71
|
+
APIから取得したラベル情報(v3版)から、`FlattenLabel`のlistを生成します。
|
|
69
72
|
|
|
70
73
|
Args:
|
|
71
74
|
labels_v3: APIから取得したラベル情報(v3版)
|
|
72
75
|
"""
|
|
73
76
|
|
|
74
|
-
def dict_label_to_dataclass(label: dict[str, Any]) ->
|
|
77
|
+
def dict_label_to_dataclass(label: dict[str, Any]) -> FlattenLabel:
|
|
75
78
|
"""
|
|
76
79
|
辞書のラベル情報をDataClassのラベル情報に変換します。
|
|
77
80
|
"""
|
|
78
81
|
label_color = label["color"]
|
|
79
82
|
hex_color_code = decimal_to_hex_color(label_color["red"], label_color["green"], label_color["blue"])
|
|
80
83
|
additional_data_definitions = label["additional_data_definitions"]
|
|
81
|
-
return
|
|
84
|
+
return FlattenLabel(
|
|
82
85
|
label_id=label["label_id"],
|
|
83
86
|
label_name_en=get_message_with_lang(label["label_name"], lang=Lang.EN_US),
|
|
84
87
|
label_name_ja=get_message_with_lang(label["label_name"], lang=Lang.JA_JP),
|
|
@@ -86,21 +89,10 @@ def create_df_from_labels(labels_v3: list[dict[str, Any]]) -> pandas.DataFrame:
|
|
|
86
89
|
annotation_type=label["annotation_type"],
|
|
87
90
|
color=hex_color_code,
|
|
88
91
|
attribute_count=len(additional_data_definitions),
|
|
92
|
+
keybind=keybind_to_text(label["keybind"]),
|
|
89
93
|
)
|
|
90
94
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
columns = [
|
|
94
|
-
"label_id",
|
|
95
|
-
"label_name_en",
|
|
96
|
-
"label_name_ja",
|
|
97
|
-
"label_name_vi",
|
|
98
|
-
"annotation_type",
|
|
99
|
-
"color",
|
|
100
|
-
"attribute_count",
|
|
101
|
-
]
|
|
102
|
-
df = pandas.DataFrame(new_labels, columns=columns)
|
|
103
|
-
return df
|
|
95
|
+
return [dict_label_to_dataclass(e) for e in labels_v3]
|
|
104
96
|
|
|
105
97
|
|
|
106
98
|
class PrintAnnotationSpecsLabel(CommandLine):
|
|
@@ -110,69 +102,16 @@ class PrintAnnotationSpecsLabel(CommandLine):
|
|
|
110
102
|
|
|
111
103
|
COMMON_MESSAGE = "annofabcli annotation_specs list_label: error:"
|
|
112
104
|
|
|
113
|
-
def print_annotation_specs_label(self, annotation_specs_v3: dict[str, Any],
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
)
|
|
118
|
-
if arg_format == "text":
|
|
119
|
-
self._print_text_format_labels(labels_v1, output=output)
|
|
105
|
+
def print_annotation_specs_label(self, annotation_specs_v3: dict[str, Any], output_format: FormatArgument, output: Optional[str] = None) -> None:
|
|
106
|
+
label_list = create_label_list(annotation_specs_v3["labels"])
|
|
107
|
+
if output_format == FormatArgument.CSV:
|
|
108
|
+
df = pandas.DataFrame(label_list)
|
|
120
109
|
|
|
121
|
-
|
|
122
|
-
df
|
|
123
|
-
print_csv(df, output)
|
|
110
|
+
columns = ["label_id", "label_name_en", "label_name_ja", "label_name_vi", "annotation_type", "color", "attribute_count", "keybind"]
|
|
111
|
+
print_csv(df[columns], output)
|
|
124
112
|
|
|
125
|
-
elif
|
|
126
|
-
annofabcli.common.utils.print_according_to_format(
|
|
127
|
-
|
|
128
|
-
@staticmethod
|
|
129
|
-
def _get_name_tuple(messages: list[dict[str, Any]]) -> tuple[str, str]:
|
|
130
|
-
"""
|
|
131
|
-
日本語名、英語名のタプルを取得する。
|
|
132
|
-
"""
|
|
133
|
-
ja_name = [e["message"] for e in messages if e["lang"] == "ja-JP"][0] # noqa: RUF015
|
|
134
|
-
en_name = [e["message"] for e in messages if e["lang"] == "en-US"][0] # noqa: RUF015
|
|
135
|
-
return (ja_name, en_name)
|
|
136
|
-
|
|
137
|
-
@staticmethod
|
|
138
|
-
def _print_text_format_labels(labels: list[dict[str, Any]], output: Optional[str] = None) -> None:
|
|
139
|
-
output_lines = []
|
|
140
|
-
for label in labels:
|
|
141
|
-
output_lines.append(
|
|
142
|
-
"\t".join(
|
|
143
|
-
[
|
|
144
|
-
label["label_id"],
|
|
145
|
-
label["annotation_type"],
|
|
146
|
-
*PrintAnnotationSpecsLabel._get_name_tuple(label["label_name"]["messages"]),
|
|
147
|
-
]
|
|
148
|
-
)
|
|
149
|
-
)
|
|
150
|
-
for additional_data_definition in label["additional_data_definitions"]:
|
|
151
|
-
output_lines.append(
|
|
152
|
-
"\t".join(
|
|
153
|
-
[
|
|
154
|
-
"",
|
|
155
|
-
additional_data_definition["additional_data_definition_id"],
|
|
156
|
-
additional_data_definition["type"],
|
|
157
|
-
*PrintAnnotationSpecsLabel._get_name_tuple(additional_data_definition["name"]["messages"]),
|
|
158
|
-
]
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
|
-
if additional_data_definition["type"] in ["choice", "select"]:
|
|
162
|
-
for choice in additional_data_definition["choices"]:
|
|
163
|
-
output_lines.append( # noqa: PERF401
|
|
164
|
-
"\t".join(
|
|
165
|
-
[
|
|
166
|
-
"",
|
|
167
|
-
"",
|
|
168
|
-
choice["choice_id"],
|
|
169
|
-
"",
|
|
170
|
-
*PrintAnnotationSpecsLabel._get_name_tuple(choice["name"]["messages"]),
|
|
171
|
-
]
|
|
172
|
-
)
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
annofabcli.common.utils.output_string("\n".join(output_lines), output)
|
|
113
|
+
elif output_format in [FormatArgument.JSON, FormatArgument.PRETTY_JSON]:
|
|
114
|
+
annofabcli.common.utils.print_according_to_format([e.to_dict() for e in label_list], format=FormatArgument(output_format), output=output)
|
|
176
115
|
|
|
177
116
|
def get_history_id_from_before_index(self, project_id: str, before: int) -> Optional[str]:
|
|
178
117
|
histories, _ = self.service.api.get_annotation_specs_histories(project_id)
|
|
@@ -210,7 +149,7 @@ class PrintAnnotationSpecsLabel(CommandLine):
|
|
|
210
149
|
else:
|
|
211
150
|
raise RuntimeError("'--project_id'か'--annotation_specs_json'のどちらかを指定する必要があります。")
|
|
212
151
|
|
|
213
|
-
self.print_annotation_specs_label(annotation_specs,
|
|
152
|
+
self.print_annotation_specs_label(annotation_specs, output_format=FormatArgument(args.format), output=args.output)
|
|
214
153
|
|
|
215
154
|
|
|
216
155
|
def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
@@ -253,13 +192,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
253
192
|
"-f",
|
|
254
193
|
"--format",
|
|
255
194
|
type=str,
|
|
256
|
-
choices=[
|
|
257
|
-
default=
|
|
258
|
-
help=
|
|
259
|
-
"text: 人が見やすい形式, "
|
|
260
|
-
f"{FormatArgument.CSV.value}: ラベル情報の一覧が記載されたCSV, "
|
|
261
|
-
f"{FormatArgument.PRETTY_JSON.value}: インデントされたJSON, "
|
|
262
|
-
f"{FormatArgument.JSON.value}: フラットなJSON",
|
|
195
|
+
choices=[FormatArgument.CSV.value, FormatArgument.JSON.value, FormatArgument.PRETTY_JSON.value],
|
|
196
|
+
default=FormatArgument.CSV.value,
|
|
197
|
+
help="出力フォーマット ",
|
|
263
198
|
)
|
|
264
199
|
|
|
265
200
|
argument_parser.add_output()
|
|
@@ -276,10 +211,8 @@ def main(args: argparse.Namespace) -> None:
|
|
|
276
211
|
def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
|
|
277
212
|
subcommand_name = "list_label"
|
|
278
213
|
|
|
279
|
-
subcommand_help = "
|
|
280
|
-
|
|
281
|
-
description = "アノテーション仕様のラベル情報を出力する"
|
|
214
|
+
subcommand_help = "アノテーション仕様のラベル情報を出力します。"
|
|
282
215
|
|
|
283
|
-
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help
|
|
216
|
+
parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
|
|
284
217
|
parse_args(parser)
|
|
285
218
|
return parser
|