superb-ai-onprem 0.4.4__tar.gz → 0.5.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.

Potentially problematic release.


This version of superb-ai-onprem might be problematic. Click here for more details.

Files changed (136) hide show
  1. {superb_ai_onprem-0.4.4/superb_ai_onprem.egg-info → superb_ai_onprem-0.5.0}/PKG-INFO +1 -1
  2. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/__init__.py +30 -0
  3. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/_version.py +16 -3
  4. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/__init__.py +2 -0
  5. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/annotation.py +1 -1
  6. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/data.py +2 -0
  7. superb_ai_onprem-0.5.0/spb_onprem/data/entities/frame.py +19 -0
  8. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/__init__.py +4 -0
  9. superb_ai_onprem-0.5.0/spb_onprem/data/params/data_list.py +226 -0
  10. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/insert_annotation_version.py +3 -3
  11. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/insert_slice_annotation_version.py +4 -4
  12. superb_ai_onprem-0.5.0/spb_onprem/data/params/update_frames.py +40 -0
  13. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_slice_annotation_version.py +4 -4
  14. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/queries.py +34 -14
  15. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/service.py +34 -3
  16. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/entities.py +2 -0
  17. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/searches.py +28 -0
  18. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0/superb_ai_onprem.egg-info}/PKG-INFO +1 -1
  19. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/superb_ai_onprem.egg-info/SOURCES.txt +2 -0
  20. superb_ai_onprem-0.4.4/spb_onprem/data/params/data_list.py +0 -107
  21. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/.github/workflows/publish.yml +0 -0
  22. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/.gitignore +0 -0
  23. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/LICENSE +0 -0
  24. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/Pipfile +0 -0
  25. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/Pipfile.lock +0 -0
  26. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/README.md +0 -0
  27. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/pyproject.toml +0 -0
  28. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/setup.cfg +0 -0
  29. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/setup.py +0 -0
  30. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/__init__.py +0 -0
  31. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/entities/__init__.py +0 -0
  32. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/entities/activity.py +0 -0
  33. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/entities/activity_history.py +0 -0
  34. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/__init__.py +0 -0
  35. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/activities.py +0 -0
  36. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/activity.py +0 -0
  37. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/create_activity.py +0 -0
  38. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/delete_activity.py +0 -0
  39. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/get_activity_history.py +0 -0
  40. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/start_activity.py +0 -0
  41. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/update_activity.py +0 -0
  42. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/params/update_activity_history.py +0 -0
  43. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/queries.py +0 -0
  44. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/activities/service.py +0 -0
  45. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/base_model.py +0 -0
  46. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/base_service.py +0 -0
  47. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/base_types.py +0 -0
  48. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/__init__.py +0 -0
  49. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/entities/__init__.py +0 -0
  50. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/entities/base_content.py +0 -0
  51. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/entities/content.py +0 -0
  52. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/queries.py +0 -0
  53. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/contents/service.py +0 -0
  54. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/__init__.py +0 -0
  55. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/data_meta.py +0 -0
  56. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/data_slice.py +0 -0
  57. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/prediction.py +0 -0
  58. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/entities/scene.py +0 -0
  59. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/enums/__init__.py +0 -0
  60. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/enums/data_meta_type.py +0 -0
  61. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/enums/data_status.py +0 -0
  62. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/enums/data_type.py +0 -0
  63. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/enums/scene_type.py +0 -0
  64. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/change_data_labeler.py +0 -0
  65. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/change_data_reviewer.py +0 -0
  66. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/change_data_status.py +0 -0
  67. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/create_data.py +0 -0
  68. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/data.py +0 -0
  69. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/delete_annotation_version.py +0 -0
  70. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/delete_data.py +0 -0
  71. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/delete_prediction.py +0 -0
  72. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/delete_scene.py +0 -0
  73. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/delete_slice_annotation_version.py +0 -0
  74. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/insert_data_to_slice.py +0 -0
  75. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/insert_prediction.py +0 -0
  76. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/insert_scene.py +0 -0
  77. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/remove_data_from_slice.py +0 -0
  78. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/remove_data_meta.py +0 -0
  79. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_annotation.py +0 -0
  80. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_data.py +0 -0
  81. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_data_slice.py +0 -0
  82. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_scene.py +0 -0
  83. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/update_slice_annotation.py +0 -0
  84. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/data/params/upsert_data_meta.py +0 -0
  85. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/__init__.py +0 -0
  86. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/entities/__init__.py +0 -0
  87. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/entities/dataset.py +0 -0
  88. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/params/__init__.py +0 -0
  89. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/params/create_dataset.py +0 -0
  90. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/params/dataset.py +0 -0
  91. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/params/datasets.py +0 -0
  92. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/params/update_dataset.py +0 -0
  93. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/queries.py +0 -0
  94. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/datasets/service.py +0 -0
  95. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exceptions.py +0 -0
  96. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/__init__.py +0 -0
  97. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/entities/__init__.py +0 -0
  98. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/entities/export.py +0 -0
  99. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/__init__.py +0 -0
  100. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/create_export.py +0 -0
  101. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/delete_export.py +0 -0
  102. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/export.py +0 -0
  103. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/exports.py +0 -0
  104. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/params/update_export.py +0 -0
  105. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/queries/get_exports.py +0 -0
  106. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/queries.py +0 -0
  107. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/exports/service.py +0 -0
  108. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/__init__.py +0 -0
  109. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/entities/__init__.py +0 -0
  110. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/entities/slice.py +0 -0
  111. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/__init__.py +0 -0
  112. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/create_slice.py +0 -0
  113. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/delete_slice.py +0 -0
  114. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/slice.py +0 -0
  115. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/slices.py +0 -0
  116. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/params/update_slice.py +0 -0
  117. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/queries.py +0 -0
  118. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/slices/service.py +0 -0
  119. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/users/__init__.py +0 -0
  120. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/users/entities/__init__.py +0 -0
  121. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/spb_onprem/users/entities/auth.py +0 -0
  122. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/superb_ai_onprem.egg-info/dependency_links.txt +0 -0
  123. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/superb_ai_onprem.egg-info/requires.txt +0 -0
  124. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/superb_ai_onprem.egg-info/top_level.txt +0 -0
  125. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/__init__.py +0 -0
  126. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/activities/__init__.py +0 -0
  127. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/activities/real_test.py +0 -0
  128. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/activities/test_get_activity_history.py +0 -0
  129. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/activities/test_params.py +0 -0
  130. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/activities/test_service.py +0 -0
  131. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/__init__.py +0 -0
  132. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/real_test.py +0 -0
  133. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/test_entities.py +0 -0
  134. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/test_integration.py +0 -0
  135. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/test_params.py +0 -0
  136. {superb_ai_onprem-0.4.4 → superb_ai_onprem-0.5.0}/tests/exports/test_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superb-ai-onprem
3
- Version: 0.4.4
3
+ Version: 0.5.0
4
4
  Summary: Python SDK for Superb AI On-premise
5
5
  Home-page: https://github.com/Superb-AI-Suite/superb-ai-onprem-python
6
6
  Author: Superb AI
@@ -27,6 +27,7 @@ from .entities import (
27
27
  ActivityHistory,
28
28
  Export,
29
29
  Content,
30
+ Frame,
30
31
 
31
32
  # Enums
32
33
  DataType,
@@ -44,6 +45,20 @@ from .searches import (
44
45
  AnnotationFilter,
45
46
  DataListFilter,
46
47
  DataFilterOptions,
48
+ AnnotationRangeFilter,
49
+ DateTimeRangeFilter,
50
+ UserFilter,
51
+ StringMetaFilter,
52
+ NumberMetaFilter,
53
+ DateTimeMetaFilter,
54
+ MetaFilterOptions,
55
+ DataSliceStatusFilter,
56
+ DataSliceUserFilter,
57
+ DataSliceTagsFilter,
58
+ DataSliceCommentFilter,
59
+ DataSlicePropertiesFilter,
60
+ DataSliceFilter,
61
+ CommentStatus,
47
62
  DatasetsFilter,
48
63
  DatasetsFilterOptions,
49
64
  SlicesFilter,
@@ -77,6 +92,7 @@ __all__ = (
77
92
  "ActivityHistory",
78
93
  "Export",
79
94
  "Content",
95
+ "Frame",
80
96
 
81
97
  # Enums
82
98
  "DataType",
@@ -87,11 +103,25 @@ __all__ = (
87
103
  "ActivityStatus",
88
104
  "ActivitySchema",
89
105
  "SchemaType",
106
+ "CommentStatus",
90
107
 
91
108
  # Filters
92
109
  "AnnotationFilter",
93
110
  "DataListFilter",
94
111
  "DataFilterOptions",
112
+ "AnnotationRangeFilter",
113
+ "DateTimeRangeFilter",
114
+ "UserFilter",
115
+ "StringMetaFilter",
116
+ "NumberMetaFilter",
117
+ "DateTimeMetaFilter",
118
+ "MetaFilterOptions",
119
+ "DataSliceStatusFilter",
120
+ "DataSliceUserFilter",
121
+ "DataSliceTagsFilter",
122
+ "DataSliceCommentFilter",
123
+ "DataSlicePropertiesFilter",
124
+ "DataSliceFilter",
95
125
  "DatasetsFilter",
96
126
  "DatasetsFilterOptions",
97
127
  "SlicesFilter",
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '0.4.4'
21
- __version_tuple__ = version_tuple = (0, 4, 4)
31
+ __version__ = version = '0.5.0'
32
+ __version_tuple__ = version_tuple = (0, 5, 0)
33
+
34
+ __commit_id__ = commit_id = 'gba065a190'
@@ -4,9 +4,11 @@ from .data import Data
4
4
  from .prediction import Prediction
5
5
  from .scene import Scene
6
6
  from .data_slice import DataSlice
7
+ from .frame import Frame
7
8
 
8
9
 
9
10
  __all__ = (
11
+ "Frame",
10
12
  "Data",
11
13
  "Scene",
12
14
  "Annotation",
@@ -11,7 +11,7 @@ class AnnotationVersion(CustomBaseModel):
11
11
  This has the content of the data annotation.
12
12
  """
13
13
  id: Optional[str] = None
14
- channel: Optional[str] = None
14
+ channels: Optional[List[str]] = None
15
15
  version: Optional[str] = None
16
16
  content: Optional[BaseContent] = None
17
17
  meta: Optional[dict] = None
@@ -6,6 +6,7 @@ from .annotation import Annotation
6
6
  from .prediction import Prediction
7
7
  from .data_meta import DataMeta
8
8
  from .data_slice import DataSlice
9
+ from .frame import Frame
9
10
  from spb_onprem.contents.entities import BaseContent
10
11
 
11
12
  class Data(CustomBaseModel):
@@ -18,6 +19,7 @@ class Data(CustomBaseModel):
18
19
  key: Optional[str] = None
19
20
  type: Optional[DataType] = None
20
21
  scene: Optional[List[Scene]] = None
22
+ frames: Optional[List[Frame]] = None
21
23
  thumbnail: Optional[BaseContent] = None
22
24
  annotation: Optional[Annotation] = None
23
25
  predictions: Optional[List[Prediction]] = None
@@ -0,0 +1,19 @@
1
+ from typing import Optional
2
+ from spb_onprem.base_model import CustomBaseModel, Field
3
+
4
+
5
+ class GeoLocation(CustomBaseModel):
6
+ lat: float
7
+ lon: float
8
+
9
+
10
+ class Frame(CustomBaseModel):
11
+ """
12
+ The frame of the data.
13
+ Frame is the representation of a single frame in a sequence of data, such as a video or time series.
14
+ """
15
+ id: str
16
+ index: Optional[int] = None
17
+ captured_at: Optional[str] = Field(None, alias="capturedAt")
18
+ geo_location: Optional[GeoLocation] = Field(None, alias="geoLocation")
19
+ meta: Optional[dict] = None
@@ -63,6 +63,9 @@ from .change_data_reviewer import (
63
63
  from .update_data_slice import (
64
64
  update_data_slice_params,
65
65
  )
66
+ from .update_frames import (
67
+ update_frames_params,
68
+ )
66
69
 
67
70
  __all__ = [
68
71
  "create_params",
@@ -90,4 +93,5 @@ __all__ = [
90
93
  "change_data_labeler_params",
91
94
  "change_data_reviewer_params",
92
95
  "update_data_slice_params",
96
+ "update_frames_params",
93
97
  ]
@@ -0,0 +1,226 @@
1
+ from typing import (
2
+ Optional,
3
+ List,
4
+ Union,
5
+ Any
6
+ )
7
+ from enum import Enum
8
+ from spb_onprem.base_model import CustomBaseModel, Field
9
+ from spb_onprem.data.enums import DataType, DataStatus
10
+ from spb_onprem.exceptions import BadParameterError
11
+
12
+
13
+ class CommentStatus(str, Enum):
14
+ """댓글 상태를 나타내는 열거형"""
15
+ RESOLVED = "RESOLVED"
16
+ UNRESOLVED = "UNRESOLVED"
17
+
18
+
19
+ class AnnotationFilter(CustomBaseModel):
20
+ type: Optional[str] = None
21
+ name: Optional[str] = None
22
+
23
+
24
+ class AnnotationRangeFilter(CustomBaseModel):
25
+ annotation_type: Optional[str] = Field(None, alias="annotationType")
26
+ class_name: Optional[str] = Field(None, alias="className")
27
+ class_count_equals: Optional[int] = Field(None, alias="classCountEquals")
28
+ class_count_in: Optional[List[int]] = Field(None, alias="classCountIn")
29
+ class_count_max: Optional[int] = Field(None, alias="classCountMax")
30
+ class_count_min: Optional[int] = Field(None, alias="classCountMin")
31
+
32
+
33
+ class DateTimeRangeFilter(CustomBaseModel):
34
+ """날짜/시간 범위 필터"""
35
+ from_date: Optional[str] = Field(None, alias="from")
36
+ to_date: Optional[str] = Field(None, alias="to")
37
+ equals: Optional[str] = None
38
+
39
+
40
+ class UserFilter(CustomBaseModel):
41
+ """사용자 필터 옵션"""
42
+ equals: Optional[str] = None
43
+ contains: Optional[str] = None
44
+ in_list: Optional[List[str]] = Field(None, alias="in")
45
+ exists: Optional[bool] = None
46
+
47
+
48
+ class StringMetaFilter(CustomBaseModel):
49
+ """문자열 메타 데이터 필터"""
50
+ key: str
51
+ contains: Optional[str] = None
52
+ equals: Optional[str] = None
53
+ in_list: Optional[List[str]] = Field(None, alias="in")
54
+
55
+
56
+ class NumberMetaFilter(CustomBaseModel):
57
+ """숫자 메타 데이터 필터"""
58
+ key: str
59
+ min_value: Optional[float] = Field(None, alias="min")
60
+ max_value: Optional[float] = Field(None, alias="max")
61
+ equals: Optional[float] = None
62
+ in_list: Optional[List[float]] = Field(None, alias="in")
63
+
64
+
65
+ class DateTimeMetaFilter(CustomBaseModel):
66
+ """날짜/시간 메타 데이터 필터"""
67
+ key: str
68
+ from_date: Optional[str] = Field(None, alias="from")
69
+ to_date: Optional[str] = Field(None, alias="to")
70
+ equals: Optional[str] = None
71
+
72
+
73
+ class MetaFilterOptions(CustomBaseModel):
74
+ """메타 데이터 필터 옵션들"""
75
+ string_meta: Optional[List[StringMetaFilter]] = Field(None, alias="stringMeta")
76
+ number_meta: Optional[List[NumberMetaFilter]] = Field(None, alias="numberMeta")
77
+ date_time_meta: Optional[List[DateTimeMetaFilter]] = Field(None, alias="dateTimeMeta")
78
+
79
+
80
+ class DataSliceStatusFilter(CustomBaseModel):
81
+ """데이터 슬라이스 상태 필터"""
82
+ in_list: Optional[List[DataStatus]] = Field(None, alias="in")
83
+ equals: Optional[DataStatus] = None
84
+ not_in: Optional[List[DataStatus]] = Field(None, alias="notIn")
85
+
86
+
87
+ class DataSliceUserFilter(CustomBaseModel):
88
+ """데이터 슬라이스 사용자 필터 (labeler, reviewer용)"""
89
+ equals: Optional[str] = None
90
+ in_list: Optional[List[str]] = Field(None, alias="in")
91
+ exists: Optional[bool] = None
92
+
93
+
94
+ class DataSliceTagsFilter(CustomBaseModel):
95
+ """데이터 슬라이스 태그 필터"""
96
+ contains: Optional[str] = None
97
+ has_any: Optional[List[str]] = Field(None, alias="hasAny")
98
+ has_all: Optional[List[str]] = Field(None, alias="hasAll")
99
+ exists: Optional[bool] = None
100
+
101
+
102
+ class DataSliceCommentFilter(CustomBaseModel):
103
+ """데이터 슬라이스 댓글 필터"""
104
+ comment_contains: Optional[str] = Field(None, alias="commentContains")
105
+ category: Optional[str] = None
106
+ status: Optional[CommentStatus] = None
107
+ created_by: Optional[UserFilter] = Field(None, alias="createdBy")
108
+ created_at: Optional[DateTimeRangeFilter] = Field(None, alias="createdAt")
109
+ exists: Optional[bool] = None
110
+
111
+
112
+ class DataSlicePropertiesFilter(CustomBaseModel):
113
+ """슬라이스 속성 필터 (ID 제외)"""
114
+ status: Optional[DataSliceStatusFilter] = None
115
+ labeler: Optional[DataSliceUserFilter] = None
116
+ reviewer: Optional[DataSliceUserFilter] = None
117
+ tags: Optional[DataSliceTagsFilter] = None
118
+ status_changed_at: Optional[DateTimeRangeFilter] = Field(None, alias="statusChangedAt")
119
+ comments: Optional[DataSliceCommentFilter] = None
120
+ meta: Optional[MetaFilterOptions] = None
121
+
122
+
123
+ class DataSliceFilter(CustomBaseModel):
124
+ """슬라이스 필터 (ID + must/not 구조)"""
125
+ id: str # 검색할 슬라이스 ID (필수)
126
+ must: Optional[DataSlicePropertiesFilter] = None # 만족해야 하는 조건
127
+ not_filter: Optional[DataSlicePropertiesFilter] = Field(None, alias="not") # 만족하지 않아야 하는 조건
128
+
129
+
130
+ class DataFilterOptions(CustomBaseModel):
131
+ id_in: Optional[List[str]] = Field(None, alias="idIn")
132
+ slice_id: Optional[str] = Field(None, alias="sliceId")
133
+ slice_id_in: Optional[List[str]] = Field(None, alias="sliceIdIn")
134
+ slice_id_any: Optional[List[str]] = Field(None, alias="sliceIdAny") # 추가된 필드
135
+ slice_id_exists: Optional[bool] = Field(None, alias="sliceIdExists") # 추가된 필드
136
+ key_contains: Optional[str] = Field(None, alias="keyContains")
137
+ key_matches: Optional[str] = Field(None, alias="keyMatches")
138
+ sub_type_contains: Optional[str] = Field(None, alias="subTypeContains") # 추가된 필드
139
+ sub_type_matches: Optional[str] = Field(None, alias="subTypeMatches") # 추가된 필드
140
+ type_in: Optional[List[DataType]] = Field(None, alias="typeIn")
141
+ annotation_any: Optional[List[AnnotationFilter]] = Field(None, alias="annotationAny")
142
+ annotation_in: Optional[List[AnnotationFilter]] = Field(None, alias="annotationIn")
143
+ annotation_exists: Optional[bool] = Field(None, alias="annotationExists")
144
+ annotation_range: Optional[List[AnnotationRangeFilter]] = Field(None, alias="annotationRange")
145
+ prediction_set_id_in: Optional[List[str]] = Field(None, alias="predictionSetIdIn")
146
+ prediction_set_id_exists: Optional[bool] = Field(None, alias="predictionSetIdExists")
147
+
148
+ # 추가된 필드들 (GraphQL과 매칭)
149
+ created_at: Optional[DateTimeRangeFilter] = Field(None, alias="createdAt")
150
+ updated_at: Optional[DateTimeRangeFilter] = Field(None, alias="updatedAt")
151
+ created_by: Optional[UserFilter] = Field(None, alias="createdBy")
152
+ updated_by: Optional[UserFilter] = Field(None, alias="updatedBy")
153
+ meta: Optional[MetaFilterOptions] = None
154
+
155
+
156
+ class DataListFilter(CustomBaseModel):
157
+ must_filter: Optional[DataFilterOptions] = Field(None, alias="must")
158
+ not_filter: Optional[DataFilterOptions] = Field(None, alias="not")
159
+ slice: Optional[DataSliceFilter] = Field(None, alias="slice")
160
+
161
+
162
+ def get_data_id_list_params(
163
+ dataset_id: str,
164
+ data_filter: Optional[DataListFilter] = None,
165
+ cursor: Optional[str] = None,
166
+ length: Optional[int] = 50,
167
+ ):
168
+ """Make the variables for the dataIdList query.
169
+
170
+ Args:
171
+ dataset_id (str): The dataset id.
172
+ data_filter (Optional[DataListFilter], optional): The filter for the data list. Defaults to None.
173
+ cursor (Optional[str], optional): The cursor for the data list. Defaults to None.
174
+ length (Optional[int], optional): The length of the data list. Defaults to 50.
175
+
176
+ Raises:
177
+ BadParameterError: The maximum length is 200.
178
+
179
+ Returns:
180
+ dict: The variables for the dataIdList query.
181
+ """
182
+ if length > 200:
183
+ raise BadParameterError("The maximum length is 200.")
184
+
185
+ return {
186
+ "dataset_id": dataset_id,
187
+ "filter": data_filter.model_dump(
188
+ by_alias=True, exclude_unset=True
189
+ ) if data_filter else None,
190
+ "cursor": cursor,
191
+ "length": length
192
+ }
193
+
194
+
195
+ def get_data_list_params(
196
+ dataset_id: str,
197
+ data_filter: Optional[DataListFilter] = None,
198
+ cursor: Optional[str] = None,
199
+ length: Optional[int] = 10,
200
+ ):
201
+ """Make the variables for the dataList query.
202
+
203
+ Args:
204
+ dataset_id (str): The dataset id.
205
+ data_filter (Optional[DataListFilter], optional): The filter for the data list. Defaults to None.
206
+ cursor (Optional[str], optional): The cursor for the data list. Defaults to None.
207
+ length (Optional[int], optional): The length of the data list. Defaults to 10.
208
+
209
+ Raises:
210
+ BadParameterError: The maximum length is 50.
211
+
212
+ Returns:
213
+ dict: The variables for the dataList query.
214
+ """
215
+
216
+ if length > 50:
217
+ raise BadParameterError("The maximum length is 50.")
218
+
219
+ return {
220
+ "dataset_id": dataset_id,
221
+ "filter": data_filter.model_dump(
222
+ by_alias=True, exclude_unset=True
223
+ ) if data_filter else None,
224
+ "cursor": cursor,
225
+ "length": length
226
+ }
@@ -23,9 +23,9 @@ def insert_annotation_version_params(
23
23
  "meta": version.meta
24
24
  }
25
25
 
26
- # channel과 version 필드가 있으면 추가
27
- if version.channel is not None:
28
- version_data["channel"] = version.channel
26
+ # channels과 version 필드가 있으면 추가
27
+ if version.channels is not None:
28
+ version_data["channels"] = version.channels
29
29
  if version.version is not None:
30
30
  version_data["version"] = version.version
31
31
 
@@ -24,10 +24,10 @@ def insert_slice_annotation_version_params(
24
24
  ),
25
25
  "meta": version.meta
26
26
  }
27
-
28
- # channel과 version 필드가 있으면 추가
29
- if version.channel is not None:
30
- version_data["channel"] = version.channel
27
+
28
+ # channels과 version 필드가 있으면 추가
29
+ if version.channels is not None:
30
+ version_data["channels"] = version.channels
31
31
  if version.version is not None:
32
32
  version_data["version"] = version.version
33
33
 
@@ -0,0 +1,40 @@
1
+ import json
2
+ from typing import Union, List
3
+ from spb_onprem.data.entities import Frame
4
+ from spb_onprem.base_types import UndefinedType, Undefined
5
+
6
+
7
+ def update_frames_params(
8
+ dataset_id: str,
9
+ data_id: str,
10
+ frames: Union[List[Frame], UndefinedType] = Undefined,
11
+ ):
12
+ """Update frames of selected data.
13
+ Args:
14
+ dataset_id (str): dataset id which the data belongs to
15
+ data_id (str): data id to be updated
16
+ frames (list[Frame]): list of frames to be updated
17
+
18
+ Returns:
19
+ dict: the params for graphql query
20
+ """
21
+ result = {
22
+ "dataset_id": dataset_id,
23
+ "data_id": data_id,
24
+ }
25
+ if frames is not Undefined:
26
+ result["frames"] = []
27
+ for frame in frames:
28
+ frame_data = {
29
+ "index": frame.index,
30
+ "capturedAt": frame.captured_at,
31
+ "meta": json.dumps(frame.meta) if frame.meta else None,
32
+ }
33
+ if frame.geo_location is not None:
34
+ frame_data["geoLocation"] = {
35
+ "lat": frame.geo_location.lat,
36
+ "lon": frame.geo_location.lon
37
+ }
38
+ result["frames"].append(frame_data)
39
+
40
+ return result
@@ -8,7 +8,7 @@ def update_slice_annotation_version_params(
8
8
  data_id: str,
9
9
  slice_id: str,
10
10
  id: str,
11
- channel: Union[str, UndefinedType, None] = Undefined,
11
+ channels: Union[List[str], UndefinedType, None] = Undefined,
12
12
  version: Union[str, UndefinedType, None] = Undefined,
13
13
  meta: Union[dict, UndefinedType, None] = Undefined,
14
14
  ):
@@ -19,7 +19,7 @@ def update_slice_annotation_version_params(
19
19
  data_id (str): The ID of the data.
20
20
  slice_id (str): The slice ID.
21
21
  id (str): The annotation version ID.
22
- channel (str, optional): The channel of the annotation version.
22
+ channels (list[str], optional): The channels of the annotation version.
23
23
  version (str, optional): The version string of the annotation version.
24
24
  meta (dict, optional): The meta of the annotation version.
25
25
  """
@@ -30,8 +30,8 @@ def update_slice_annotation_version_params(
30
30
  "id": id,
31
31
  }
32
32
 
33
- if channel is not Undefined:
34
- variables["channel"] = channel
33
+ if channels is not Undefined:
34
+ variables["channels"] = channels
35
35
  if version is not Undefined:
36
36
  variables["version"] = version
37
37
  if meta is not Undefined:
@@ -20,6 +20,7 @@ from .params import (
20
20
  change_data_labeler_params,
21
21
  change_data_reviewer_params,
22
22
  update_data_slice_params,
23
+ update_frames_params,
23
24
  )
24
25
 
25
26
 
@@ -46,10 +47,21 @@ class Schemas:
46
47
  }
47
48
  meta
48
49
  }
50
+ frames {
51
+ id
52
+ index
53
+ capturedAt
54
+ geoLocation {
55
+ lat
56
+ lon
57
+ }
58
+ meta
59
+ }
49
60
  annotation {
61
+ meta
50
62
  versions {
51
63
  id
52
- channel
64
+ channels
53
65
  version
54
66
  content {
55
67
  id
@@ -57,23 +69,11 @@ class Schemas:
57
69
  meta
58
70
  }
59
71
  }
60
- predictions {
61
- setId
62
- content {
63
- id
64
- }
65
- meta
66
- }
67
72
  meta {
68
73
  key
69
74
  type
70
75
  value
71
76
  }
72
- systemMeta {
73
- key
74
- type
75
- value
76
- }
77
77
  slices {
78
78
  id
79
79
  status
@@ -84,7 +84,7 @@ class Schemas:
84
84
  annotation {
85
85
  versions {
86
86
  id
87
- channel
87
+ channels
88
88
  version
89
89
  content {
90
90
  id
@@ -574,3 +574,23 @@ class Queries():
574
574
  ''',
575
575
  "variables": update_data_slice_params,
576
576
  }
577
+
578
+ UPDATE_FRAMES = {
579
+ "name": "updateFrames",
580
+ "query": f'''
581
+ mutation (
582
+ $dataset_id: ID!,
583
+ $data_id: ID!,
584
+ $frames: [DataFrameInput!],
585
+ ) {{
586
+ updateFrames(
587
+ datasetId: $dataset_id,
588
+ dataId: $data_id,
589
+ frames: $frames,
590
+ ) {{
591
+ {Schemas.DATA}
592
+ }}
593
+ }}
594
+ ''',
595
+ "variables": update_frames_params,
596
+ }
@@ -572,7 +572,7 @@ class DataService(BaseService):
572
572
  data_id: str,
573
573
  slice_id: str,
574
574
  id: str,
575
- channel: Union[str, UndefinedType, None] = Undefined,
575
+ channels: Union[List[str], UndefinedType, None] = Undefined,
576
576
  version: Union[str, UndefinedType, None] = Undefined,
577
577
  meta: Union[dict, UndefinedType, None] = Undefined,
578
578
  ):
@@ -583,7 +583,7 @@ class DataService(BaseService):
583
583
  data_id (str): The data id.
584
584
  slice_id (str): The slice id.
585
585
  id (str): The annotation version id.
586
- channel (Union[str, UndefinedType, None], optional): The channel. Defaults to Undefined.
586
+ channels (Union[List[str], UndefinedType, None], optional): The channels. Defaults to Undefined.
587
587
  version (Union[str, UndefinedType, None], optional): The version. Defaults to Undefined.
588
588
  meta (Union[dict, UndefinedType, None], optional): The meta. Defaults to Undefined.
589
589
 
@@ -606,7 +606,7 @@ class DataService(BaseService):
606
606
  data_id=data_id,
607
607
  slice_id=slice_id,
608
608
  id=id,
609
- channel=channel,
609
+ channels=channels,
610
610
  version=version,
611
611
  meta=meta,
612
612
  )
@@ -804,3 +804,34 @@ class DataService(BaseService):
804
804
  )
805
805
  data = Data.model_validate(response)
806
806
  return data
807
+
808
+ def update_frames(
809
+ self,
810
+ dataset_id: str,
811
+ data_id: str,
812
+ frames: Union[List[Frame], UndefinedType] = Undefined,
813
+ ):
814
+ """Update frames of selected data.
815
+ Args:
816
+ dataset_id (str): dataset id which the data belongs to
817
+ data_id (str): data id to be updated
818
+ frames (list[Frame]): list of frames to be updated
819
+
820
+ Returns:
821
+ Data: The updated data.
822
+ """
823
+ if dataset_id is None:
824
+ raise BadParameterError("dataset_id is required.")
825
+ if data_id is None:
826
+ raise BadParameterError("data_id is required.")
827
+
828
+ response = self.request_gql(
829
+ Queries.UPDATE_FRAMES,
830
+ Queries.UPDATE_FRAMES["variables"](
831
+ dataset_id=dataset_id,
832
+ data_id=data_id,
833
+ frames=frames,
834
+ )
835
+ )
836
+ data = Data.model_validate(response)
837
+ return data
@@ -6,6 +6,7 @@ from .data.entities import (
6
6
  Prediction,
7
7
  DataMeta,
8
8
  DataSlice,
9
+ Frame,
9
10
  )
10
11
  from .datasets.entities import Dataset
11
12
  from .slices.entities import Slice
@@ -41,6 +42,7 @@ __all__ = [
41
42
  "ActivityHistory",
42
43
  "Export",
43
44
  "Content",
45
+ "Frame",
44
46
 
45
47
  # Enums
46
48
  "DataType",