annofabcli 1.111.0__py3-none-any.whl → 1.111.1__py3-none-any.whl

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.
@@ -254,8 +254,8 @@ class AnnotationConverter:
254
254
  for attribute_name, attribute_value in attributes.items():
255
255
  try:
256
256
  specs_additional_data = self.annotation_specs_accessor.get_attribute(attribute_name=attribute_name, label=label)
257
- except ValueError:
258
- logger.warning(f"アノテーション仕様に属性名(英語)が'{attribute_name}'である属性情報が存在しないか、複数存在します。 :: {log_message_suffix}")
257
+ except ValueError as e:
258
+ logger.warning(f"アノテーション仕様に属性名(英語)が'{attribute_name}'である属性情報が存在しないか、複数存在します。 :: {log_message_suffix} :: error={e}")
259
259
  if self.is_strict:
260
260
  raise
261
261
  continue
@@ -298,12 +298,11 @@ class AnnotationConverter:
298
298
  ValueError: 存在しないラベル名が指定された場合(`self.is_strict`がFalseでもraiseされる9
299
299
 
300
300
  """
301
- log_message_suffix = f"task_id='{parser.task_id}', input_data_id='{parser.input_data_id}', label_name='{detail.label}', annotation_id='{detail.annotation_id}'"
302
301
 
303
302
  try:
304
303
  label_info = self.annotation_specs_accessor.get_label(label_name=detail.label)
305
- except ValueError:
306
- logger.warning(f"アノテーション仕様にラベル名(英語)が'{detail.label}'であるラベル情報が存在しないか、または複数存在します。 :: {log_message_suffix}")
304
+ except ValueError as e:
305
+ logger.warning(f"アノテーション仕様にラベル名(英語)が'{detail.label}'であるラベル情報が存在しないか、または複数存在します。 :: {log_message_suffix} :: error={e}")
307
306
  raise
308
307
 
309
308
  if detail.attributes is not None:
@@ -361,9 +360,12 @@ class AnnotationConverter:
361
360
  old_dict_detail[old_detail["annotation_id"]] = old_detail
362
361
 
363
362
  new_request_details: list[dict[str, Any]] = []
364
- for detail in details:
363
+ for detail_index, detail in enumerate(details):
365
364
  try:
366
- log_message_suffix = f"task_id='{parser.task_id}', input_data_id='{parser.input_data_id}', label_name='{detail.label}', annotation_id='{detail.annotation_id}'"
365
+ # detail_indexを出力する理由: annotation_idはNoneだとどれが問題なのか分からないため
366
+ log_message_suffix = (
367
+ f"task_id='{parser.task_id}', input_data_id='{parser.input_data_id}', label_name='{detail.label}', annotation_id='{detail.annotation_id}', detail_index={detail_index}"
368
+ )
367
369
 
368
370
  request_detail = self.convert_annotation_detail(parser, detail, log_message_suffix=log_message_suffix)
369
371
  except Exception as e:
@@ -141,7 +141,7 @@ class WholeProductivityPerCompletedDate:
141
141
  return pandas.DataFrame(index=[e.strftime("%Y-%m-%d") for e in pandas.date_range(start_date, end_date)])
142
142
 
143
143
  @classmethod
144
- def from_df_wrapper(cls, task: Task, worktime_per_date: WorktimePerDate, task_completion_criteria: TaskCompletionCriteria) -> WholeProductivityPerCompletedDate:
144
+ def from_df_wrapper(cls, task: Task, worktime_per_date: WorktimePerDate, task_completion_criteria: TaskCompletionCriteria) -> WholeProductivityPerCompletedDate: # noqa: PLR0912
145
145
  """
146
146
  完了日毎の全体の生産量、生産性を算出する。
147
147
 
@@ -172,6 +172,8 @@ class WholeProductivityPerCompletedDate:
172
172
  datetime_column = "first_acceptance_reached_datetime"
173
173
  elif task_completion_criteria == TaskCompletionCriteria.INSPECTION_REACHED:
174
174
  datetime_column = "first_inspection_reached_datetime"
175
+ elif task_completion_criteria == TaskCompletionCriteria.ANNOTATION_STARTED:
176
+ datetime_column = "first_annotation_started_datetime"
175
177
  else:
176
178
  assert_noreturn(task_completion_criteria)
177
179
 
@@ -280,6 +282,8 @@ class WholeProductivityPerCompletedDate:
280
282
  str_task = "受入フェーズに到達した"
281
283
  elif self.task_completion_criteria == TaskCompletionCriteria.INSPECTION_REACHED:
282
284
  str_task = "検査フェーズに到達した"
285
+ elif self.task_completion_criteria == TaskCompletionCriteria.ANNOTATION_STARTED:
286
+ str_task = "教師付フェーズが着手された"
283
287
  else:
284
288
  assert_noreturn(self.task_completion_criteria)
285
289
 
@@ -884,6 +888,9 @@ class WholeProductivityPerFirstAnnotationStartedDate:
884
888
  df_sub_task = df_task[df_task["phase"] == TaskPhase.ACCEPTANCE.value]
885
889
  elif task_completion_criteria == TaskCompletionCriteria.INSPECTION_REACHED:
886
890
  df_sub_task = df_task[df_task["phase"].isin([TaskPhase.INSPECTION.value, TaskPhase.ACCEPTANCE.value])]
891
+ elif task_completion_criteria == TaskCompletionCriteria.ANNOTATION_STARTED:
892
+ # 教師付フェーズが着手されたタスク(first_annotation_started_datetimeがNoneでない)を抽出する
893
+ df_sub_task = df_task[df_task["first_annotation_started_datetime"].notna()]
887
894
  else:
888
895
  assert_noreturn(task_completion_criteria)
889
896
 
@@ -1013,6 +1020,8 @@ class WholeProductivityPerFirstAnnotationStartedDate:
1013
1020
  str_task = "受入フェーズ"
1014
1021
  elif self.task_completion_criteria == TaskCompletionCriteria.INSPECTION_REACHED:
1015
1022
  str_task = "検査フェーズまたは受入フェーズ"
1023
+ elif self.task_completion_criteria == TaskCompletionCriteria.ANNOTATION_STARTED:
1024
+ str_task = "教師付フェーズが着手されたタスク"
1016
1025
  else:
1017
1026
  assert_noreturn(self.task_completion_criteria)
1018
1027
 
@@ -40,6 +40,8 @@ class TaskCompletionCriteria(Enum):
40
40
  """タスクが受入フェーズに到達したら「タスクの完了」とみなす"""
41
41
  INSPECTION_REACHED = "inspection_reached"
42
42
  """タスクが検査フェーズに到達したら「タスクの完了」とみなす"""
43
+ ANNOTATION_STARTED = "annotation_started"
44
+ """教師付フェーズが着手されたら「タスクの完了」とみなす"""
43
45
 
44
46
  def is_task_completed(self, task: dict[str, Any]) -> bool:
45
47
  """指定したタスクが、タスクの完了条件に合致するかどうかを判定します。
@@ -48,6 +50,7 @@ class TaskCompletionCriteria(Enum):
48
50
  task: タスク情報。以下のキーを参照します。
49
51
  * phase
50
52
  * status
53
+ * work_time_span (ANNOTATION_STARTEDの場合のみ)
51
54
 
52
55
  Returns:
53
56
  タスクの完了条件に合致する場合はTrue、そうでない場合はFalse
@@ -62,5 +65,10 @@ class TaskCompletionCriteria(Enum):
62
65
  # 受入フェーズも含む理由:検査フェーズに到達したタスクを「完了」とみなすならば、検査フェーズより後段フェーズである受入フェーズも「完了」とみなせるため
63
66
  return task["phase"] in {TaskPhase.INSPECTION.value, TaskPhase.ACCEPTANCE.value}
64
67
 
68
+ elif self == TaskCompletionCriteria.ANNOTATION_STARTED:
69
+ # 教師付フェーズが着手されたタスクを「完了」とみなす
70
+ # work_time_span > 0 であれば教師付フェーズが着手されたとみなす
71
+ return task["work_time_span"] > 0
72
+
65
73
  else:
66
74
  assert_noreturn(self)
@@ -42,7 +42,7 @@ class ProjectDir(DataClassJsonMixin):
42
42
  - acceptance_completed: 受入フェーズの完了状態
43
43
  - acceptance_reached: 受入フェーズに到達
44
44
  - inspection_reached: 検査フェーズまたは受入フェーズに到達
45
- - annotation_started: 教師付フェーズを着手
45
+ - annotation_started: 教師付フェーズが着手された
46
46
  """
47
47
 
48
48
  FILENAME_WHOLE_PERFORMANCE = "全体の生産性と品質.csv"
@@ -710,7 +710,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
710
710
  default=TaskCompletionCriteria.ACCEPTANCE_COMPLETED.value,
711
711
  help="タスクの完了条件を指定します。\n"
712
712
  "* ``acceptance_completed``: タスクが受入フェーズの完了状態であれば「タスクの完了」とみなす\n"
713
- "* ``acceptance_reached``: タスクが受入フェーズに到達したら「タスクの完了」とみなす\n",
713
+ "* ``acceptance_reached``: タスクが受入フェーズに到達したら「タスクの完了」とみなす\n"
714
+ "* ``inspection_reached``: タスクが検査フェーズに到達したら「タスクの完了」とみなす\n"
715
+ "* ``annotation_started``: 教師付フェーズが着手されたら「タスクの完了」とみなす\n",
714
716
  )
715
717
 
716
718
  parser.add_argument(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annofabcli
3
- Version: 1.111.0
3
+ Version: 1.111.1
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Author: Kurusugawa Computer Inc.
6
6
  License: MIT
@@ -11,7 +11,7 @@ annofabcli/annotation/create_classification_annotation.py,sha256=Ex9kSVNHZu71UbL
11
11
  annofabcli/annotation/delete_annotation.py,sha256=bU87ov7NhYFPe-Cldn3nBSK_CY9A9x3mSLN1Ame-cKk,25144
12
12
  annofabcli/annotation/download_annotation_zip.py,sha256=SMtfxt6NKkpHGRDoKRCjPqpQB5DBpQ-PD2_3ts51h0Q,3314
13
13
  annofabcli/annotation/dump_annotation.py,sha256=Q-p6f5XBs7khDgrfY5Q3CGLBMKEerJWO_CQ8_73UXVM,9972
14
- annofabcli/annotation/import_annotation.py,sha256=maaxlje3VZ7oN94gdtZFgfZnAQlBfYmljgGJzMcI9HE,35811
14
+ annofabcli/annotation/import_annotation.py,sha256=M0osVbY06Xs2DXkQLwCKx7WmK9cPc9EFuvHbAKMKv-0,35898
15
15
  annofabcli/annotation/list_annotation.py,sha256=uKcOuGC7lzd6vVbzizkiZtYdXJ7EzY0iifuiqKl2wQM,10707
16
16
  annofabcli/annotation/list_annotation_count.py,sha256=T9fbaoxWeDJIVgW_YgHRldbwrVZWiE-57lfJrDQrj80,6474
17
17
  annofabcli/annotation/merge_segmentation.py,sha256=kIsCeXtJxzd6nobQPpi0fscaRDlTx3tg1qpy5PDfSJI,18107
@@ -162,12 +162,12 @@ annofabcli/statistics/summarize_task_count_by_task_id_group.py,sha256=K4FFED1pza
162
162
  annofabcli/statistics/summarize_task_count_by_user.py,sha256=KUGVUwn_KO4RSA2twAz60nX1OQE1pd5TL5gBmL1bgMA,7421
163
163
  annofabcli/statistics/visualize_annotation_count.py,sha256=7OATuGa2okq80unuTe-X30CBVkrlMLDN5Y-Q_5mB6eI,22138
164
164
  annofabcli/statistics/visualize_annotation_duration.py,sha256=9JH9MirhOyCmjcChFJMtfnFIV2k4sucP9PAwNKMcbtE,21022
165
- annofabcli/statistics/visualize_statistics.py,sha256=iwGhrYylBTsK-DT_MU-eYkFgZI0ITt9r59BbiaSbfQE,44041
165
+ annofabcli/statistics/visualize_statistics.py,sha256=njhjbHBhhQ5ksJmOWrcLYh2pLHZdn0uAk8dCufjtfAI,44281
166
166
  annofabcli/statistics/visualize_video_duration.py,sha256=yY18H0-boNy4-MQWUM_xBTMzxDUQ51TrVtz8mbsB_dI,16623
167
167
  annofabcli/statistics/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
168
  annofabcli/statistics/visualization/filtering_query.py,sha256=kqGOa1YdQ62kTLlkiIHFiYNju4Pg9rXpsC4Cph-QjLo,4355
169
- annofabcli/statistics/visualization/model.py,sha256=sKk4gC7qkt6etCnbpCNZpJEhFJf5Vf7eVOG53gyfWvk,2426
170
- annofabcli/statistics/visualization/project_dir.py,sha256=-60n29ySvgsfRTbFgTOYr6E7LHJezVQm3FON88LQMKU,24291
169
+ annofabcli/statistics/visualization/model.py,sha256=LXFuelx9_6n1mU418Mw5FOCBQTlnNBlOijZ7oUIfQ_Q,2928
170
+ annofabcli/statistics/visualization/project_dir.py,sha256=g1Jb9-CW32BcuwS3Z2dTgJ9bo3_Edlc7wWtrKhLzFcc,24300
171
171
  annofabcli/statistics/visualization/visualization_source_files.py,sha256=SFY7WXUtjECB8l7zP-exawocrTiZ0UI7Z5sjgq4J_g4,8641
172
172
  annofabcli/statistics/visualization/dataframe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
173
  annofabcli/statistics/visualization/dataframe/actual_worktime.py,sha256=7nsHlvN5cDzXIw-u_MSAZf4nlSSY56IlunSmnODXTbY,1916
@@ -185,7 +185,7 @@ annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py,sha
185
185
  annofabcli/statistics/visualization/dataframe/user.py,sha256=EHn7nlf6D6UX-gsVXy8m_3QaCsHsUhr0iy2rbNozOgc,1707
186
186
  annofabcli/statistics/visualization/dataframe/user_performance.py,sha256=X0jXV0wY8AZC8hoV62sJd9GRThqTf5RsaVciLeCvGlk,56628
187
187
  annofabcli/statistics/visualization/dataframe/whole_performance.py,sha256=kw5Cww0fwDfwriTtxiT0l3wr7YAMA9eGjvp84G9MN9I,12449
188
- annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py,sha256=F6KhXvzrUx61E0jqOiU2IGb6ycLH82T80JyzYVpSaC8,53683
188
+ annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py,sha256=J-QW2Mvt-hGTpDUGGJKFvo0REzIWwrbDAzcMf9iqx_U,54480
189
189
  annofabcli/statistics/visualization/dataframe/worktime_per_date.py,sha256=wt0paPy2cVVzLUJhbV12-6bInikbQoxRFnOHY7BcI9o,21342
190
190
  annofabcli/supplementary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
191
  annofabcli/supplementary/delete_supplementary_data.py,sha256=dA4n61SSkTbDKDqjVldHIEAxbPQXyrQciwI4RDuC35U,13537
@@ -221,8 +221,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
221
221
  annofabcli/task_history_event/list_all_task_history_event.py,sha256=EeKMyPUxGwYCFtWQHHW954ZserGm8lUqrwNnV1iX9X4,6830
222
222
  annofabcli/task_history_event/list_worktime.py,sha256=Y7Pu5DP7scPf7HPt6CTiTvB1_5_Nfi1bStUIaCpkhII,15507
223
223
  annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
224
- annofabcli-1.111.0.dist-info/METADATA,sha256=8icfwwpFiUk3CLmu_RvCrllfkQnP93ITWhkKwEY_adg,5134
225
- annofabcli-1.111.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
226
- annofabcli-1.111.0.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
227
- annofabcli-1.111.0.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
228
- annofabcli-1.111.0.dist-info/RECORD,,
224
+ annofabcli-1.111.1.dist-info/METADATA,sha256=_p6y1IWSFtptJzWmxklxObVfFZSZEEYeai7Xrl5fC-A,5134
225
+ annofabcli-1.111.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
226
+ annofabcli-1.111.1.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
227
+ annofabcli-1.111.1.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
228
+ annofabcli-1.111.1.dist-info/RECORD,,