label-studio-sdk 0.0.34__py3-none-any.whl → 1.0.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.

Potentially problematic release.


This version of label-studio-sdk might be problematic. Click here for more details.

Files changed (272) hide show
  1. label_studio_sdk/__init__.py +232 -9
  2. label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
  3. label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
  4. label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +163 -0
  5. label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
  6. label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +2 -0
  7. label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +228 -0
  8. label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +45 -0
  9. label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +1 -0
  10. label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +34 -0
  11. label_studio_sdk/_extensions/label_studio_tools/etl/example.py +17 -0
  12. label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +67 -0
  13. label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
  14. label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +97 -0
  15. label_studio_sdk/_extensions/pager_ext.py +49 -0
  16. label_studio_sdk/_legacy/__init__.py +11 -0
  17. label_studio_sdk/_legacy/client.py +471 -0
  18. label_studio_sdk/_legacy/objects.py +74 -0
  19. label_studio_sdk/{project.py → _legacy/project.py} +2 -2
  20. label_studio_sdk/{schema → _legacy/schema}/label_config_schema.json +14 -14
  21. label_studio_sdk/actions/__init__.py +27 -0
  22. label_studio_sdk/actions/client.py +223 -0
  23. label_studio_sdk/actions/types/__init__.py +25 -0
  24. label_studio_sdk/actions/types/actions_create_request_filters.py +43 -0
  25. label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +5 -0
  26. label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +49 -0
  27. label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +31 -0
  28. label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +23 -0
  29. label_studio_sdk/actions/types/actions_create_request_id.py +19 -0
  30. label_studio_sdk/actions/types/actions_create_request_ordering_item.py +31 -0
  31. label_studio_sdk/actions/types/actions_create_request_selected_items.py +10 -0
  32. label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +39 -0
  33. label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +39 -0
  34. label_studio_sdk/annotations/__init__.py +2 -0
  35. label_studio_sdk/annotations/client.py +750 -0
  36. label_studio_sdk/base_client.py +183 -0
  37. label_studio_sdk/client.py +17 -463
  38. label_studio_sdk/converter/__init__.py +7 -0
  39. label_studio_sdk/converter/audio.py +56 -0
  40. label_studio_sdk/converter/brush.py +452 -0
  41. label_studio_sdk/converter/converter.py +1175 -0
  42. label_studio_sdk/converter/exports/__init__.py +0 -0
  43. label_studio_sdk/converter/exports/csv.py +82 -0
  44. label_studio_sdk/converter/exports/csv2.py +103 -0
  45. label_studio_sdk/converter/funsd.py +85 -0
  46. label_studio_sdk/converter/imports/__init__.py +0 -0
  47. label_studio_sdk/converter/imports/coco.py +314 -0
  48. label_studio_sdk/converter/imports/colors.py +198 -0
  49. label_studio_sdk/converter/imports/label_config.py +45 -0
  50. label_studio_sdk/converter/imports/pathtrack.py +269 -0
  51. label_studio_sdk/converter/imports/yolo.py +236 -0
  52. label_studio_sdk/converter/main.py +202 -0
  53. label_studio_sdk/converter/utils.py +473 -0
  54. label_studio_sdk/core/__init__.py +33 -0
  55. label_studio_sdk/core/api_error.py +15 -0
  56. label_studio_sdk/core/client_wrapper.py +55 -0
  57. label_studio_sdk/core/datetime_utils.py +28 -0
  58. label_studio_sdk/core/file.py +38 -0
  59. label_studio_sdk/core/http_client.py +447 -0
  60. label_studio_sdk/core/jsonable_encoder.py +99 -0
  61. label_studio_sdk/core/pagination.py +87 -0
  62. label_studio_sdk/core/pydantic_utilities.py +28 -0
  63. label_studio_sdk/core/query_encoder.py +33 -0
  64. label_studio_sdk/core/remove_none_from_dict.py +11 -0
  65. label_studio_sdk/core/request_options.py +32 -0
  66. label_studio_sdk/environment.py +7 -0
  67. label_studio_sdk/errors/__init__.py +6 -0
  68. label_studio_sdk/errors/bad_request_error.py +8 -0
  69. label_studio_sdk/errors/internal_server_error.py +8 -0
  70. label_studio_sdk/export_storage/__init__.py +28 -0
  71. label_studio_sdk/export_storage/azure/__init__.py +5 -0
  72. label_studio_sdk/export_storage/azure/client.py +888 -0
  73. label_studio_sdk/export_storage/azure/types/__init__.py +6 -0
  74. label_studio_sdk/export_storage/azure/types/azure_create_response.py +67 -0
  75. label_studio_sdk/export_storage/azure/types/azure_update_response.py +67 -0
  76. label_studio_sdk/export_storage/client.py +107 -0
  77. label_studio_sdk/export_storage/gcs/__init__.py +5 -0
  78. label_studio_sdk/export_storage/gcs/client.py +888 -0
  79. label_studio_sdk/export_storage/gcs/types/__init__.py +6 -0
  80. label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +67 -0
  81. label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +67 -0
  82. label_studio_sdk/export_storage/local/__init__.py +5 -0
  83. label_studio_sdk/export_storage/local/client.py +834 -0
  84. label_studio_sdk/export_storage/local/types/__init__.py +6 -0
  85. label_studio_sdk/export_storage/local/types/local_create_response.py +57 -0
  86. label_studio_sdk/export_storage/local/types/local_update_response.py +57 -0
  87. label_studio_sdk/export_storage/redis/__init__.py +5 -0
  88. label_studio_sdk/export_storage/redis/client.py +918 -0
  89. label_studio_sdk/export_storage/redis/types/__init__.py +6 -0
  90. label_studio_sdk/export_storage/redis/types/redis_create_response.py +72 -0
  91. label_studio_sdk/export_storage/redis/types/redis_update_response.py +72 -0
  92. label_studio_sdk/export_storage/s3/__init__.py +5 -0
  93. label_studio_sdk/export_storage/s3/client.py +1008 -0
  94. label_studio_sdk/export_storage/s3/types/__init__.py +6 -0
  95. label_studio_sdk/export_storage/s3/types/s3create_response.py +89 -0
  96. label_studio_sdk/export_storage/s3/types/s3update_response.py +89 -0
  97. label_studio_sdk/export_storage/types/__init__.py +5 -0
  98. label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +30 -0
  99. label_studio_sdk/files/__init__.py +2 -0
  100. label_studio_sdk/files/client.py +556 -0
  101. label_studio_sdk/import_storage/__init__.py +28 -0
  102. label_studio_sdk/import_storage/azure/__init__.py +5 -0
  103. label_studio_sdk/import_storage/azure/client.py +988 -0
  104. label_studio_sdk/import_storage/azure/types/__init__.py +6 -0
  105. label_studio_sdk/import_storage/azure/types/azure_create_response.py +82 -0
  106. label_studio_sdk/import_storage/azure/types/azure_update_response.py +82 -0
  107. label_studio_sdk/import_storage/client.py +107 -0
  108. label_studio_sdk/import_storage/gcs/__init__.py +5 -0
  109. label_studio_sdk/import_storage/gcs/client.py +988 -0
  110. label_studio_sdk/import_storage/gcs/types/__init__.py +6 -0
  111. label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +82 -0
  112. label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +82 -0
  113. label_studio_sdk/import_storage/local/__init__.py +5 -0
  114. label_studio_sdk/import_storage/local/client.py +836 -0
  115. label_studio_sdk/import_storage/local/types/__init__.py +6 -0
  116. label_studio_sdk/import_storage/local/types/local_create_response.py +57 -0
  117. label_studio_sdk/import_storage/local/types/local_update_response.py +57 -0
  118. label_studio_sdk/import_storage/redis/__init__.py +5 -0
  119. label_studio_sdk/import_storage/redis/client.py +924 -0
  120. label_studio_sdk/import_storage/redis/types/__init__.py +6 -0
  121. label_studio_sdk/import_storage/redis/types/redis_create_response.py +72 -0
  122. label_studio_sdk/import_storage/redis/types/redis_update_response.py +72 -0
  123. label_studio_sdk/import_storage/s3/__init__.py +5 -0
  124. label_studio_sdk/import_storage/s3/client.py +1138 -0
  125. label_studio_sdk/import_storage/s3/types/__init__.py +6 -0
  126. label_studio_sdk/import_storage/s3/types/s3create_response.py +109 -0
  127. label_studio_sdk/import_storage/s3/types/s3update_response.py +109 -0
  128. label_studio_sdk/import_storage/types/__init__.py +5 -0
  129. label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +30 -0
  130. label_studio_sdk/label_interface/base.py +10 -0
  131. label_studio_sdk/label_interface/control_tags.py +109 -71
  132. label_studio_sdk/label_interface/data_examples.json +96 -0
  133. label_studio_sdk/label_interface/interface.py +102 -53
  134. label_studio_sdk/label_interface/object_tags.py +8 -13
  135. label_studio_sdk/label_interface/region.py +33 -1
  136. label_studio_sdk/ml/__init__.py +19 -0
  137. label_studio_sdk/ml/client.py +981 -0
  138. label_studio_sdk/ml/types/__init__.py +17 -0
  139. label_studio_sdk/ml/types/ml_create_request_auth_method.py +5 -0
  140. label_studio_sdk/ml/types/ml_create_response.py +78 -0
  141. label_studio_sdk/ml/types/ml_create_response_auth_method.py +5 -0
  142. label_studio_sdk/ml/types/ml_update_request_auth_method.py +5 -0
  143. label_studio_sdk/ml/types/ml_update_response.py +78 -0
  144. label_studio_sdk/ml/types/ml_update_response_auth_method.py +5 -0
  145. label_studio_sdk/predictions/__init__.py +2 -0
  146. label_studio_sdk/predictions/client.py +638 -0
  147. label_studio_sdk/projects/__init__.py +6 -0
  148. label_studio_sdk/projects/client.py +1055 -0
  149. label_studio_sdk/projects/client_ext.py +19 -0
  150. label_studio_sdk/projects/exports/__init__.py +2 -0
  151. label_studio_sdk/projects/exports/client.py +930 -0
  152. label_studio_sdk/projects/types/__init__.py +7 -0
  153. label_studio_sdk/projects/types/projects_create_response.py +96 -0
  154. label_studio_sdk/projects/types/projects_import_tasks_response.py +71 -0
  155. label_studio_sdk/projects/types/projects_list_response.py +33 -0
  156. label_studio_sdk/py.typed +0 -0
  157. label_studio_sdk/tasks/__init__.py +5 -0
  158. label_studio_sdk/tasks/client.py +835 -0
  159. label_studio_sdk/tasks/client_ext.py +18 -0
  160. label_studio_sdk/tasks/types/__init__.py +6 -0
  161. label_studio_sdk/tasks/types/tasks_list_request_fields.py +5 -0
  162. label_studio_sdk/tasks/types/tasks_list_response.py +48 -0
  163. label_studio_sdk/types/__init__.py +115 -0
  164. label_studio_sdk/types/annotation.py +116 -0
  165. label_studio_sdk/types/annotation_filter_options.py +42 -0
  166. label_studio_sdk/types/annotation_last_action.py +19 -0
  167. label_studio_sdk/types/azure_blob_export_storage.py +112 -0
  168. label_studio_sdk/types/azure_blob_export_storage_status.py +7 -0
  169. label_studio_sdk/types/azure_blob_import_storage.py +113 -0
  170. label_studio_sdk/types/azure_blob_import_storage_status.py +7 -0
  171. label_studio_sdk/types/base_task.py +113 -0
  172. label_studio_sdk/types/base_user.py +42 -0
  173. label_studio_sdk/types/converted_format.py +36 -0
  174. label_studio_sdk/types/converted_format_status.py +5 -0
  175. label_studio_sdk/types/export.py +48 -0
  176. label_studio_sdk/types/export_convert.py +32 -0
  177. label_studio_sdk/types/export_create.py +54 -0
  178. label_studio_sdk/types/export_create_status.py +5 -0
  179. label_studio_sdk/types/export_status.py +5 -0
  180. label_studio_sdk/types/file_upload.py +30 -0
  181. label_studio_sdk/types/filter.py +53 -0
  182. label_studio_sdk/types/filter_group.py +35 -0
  183. label_studio_sdk/types/gcs_export_storage.py +112 -0
  184. label_studio_sdk/types/gcs_export_storage_status.py +7 -0
  185. label_studio_sdk/types/gcs_import_storage.py +113 -0
  186. label_studio_sdk/types/gcs_import_storage_status.py +7 -0
  187. label_studio_sdk/types/local_files_export_storage.py +97 -0
  188. label_studio_sdk/types/local_files_export_storage_status.py +7 -0
  189. label_studio_sdk/types/local_files_import_storage.py +92 -0
  190. label_studio_sdk/types/local_files_import_storage_status.py +7 -0
  191. label_studio_sdk/types/ml_backend.py +89 -0
  192. label_studio_sdk/types/ml_backend_auth_method.py +5 -0
  193. label_studio_sdk/types/ml_backend_state.py +5 -0
  194. label_studio_sdk/types/prediction.py +78 -0
  195. label_studio_sdk/types/project.py +198 -0
  196. label_studio_sdk/types/project_import.py +63 -0
  197. label_studio_sdk/types/project_import_status.py +5 -0
  198. label_studio_sdk/types/project_label_config.py +32 -0
  199. label_studio_sdk/types/project_sampling.py +7 -0
  200. label_studio_sdk/types/project_skip_queue.py +5 -0
  201. label_studio_sdk/types/redis_export_storage.py +117 -0
  202. label_studio_sdk/types/redis_export_storage_status.py +7 -0
  203. label_studio_sdk/types/redis_import_storage.py +112 -0
  204. label_studio_sdk/types/redis_import_storage_status.py +7 -0
  205. label_studio_sdk/types/s3export_storage.py +134 -0
  206. label_studio_sdk/types/s3export_storage_status.py +7 -0
  207. label_studio_sdk/types/s3import_storage.py +140 -0
  208. label_studio_sdk/types/s3import_storage_status.py +7 -0
  209. label_studio_sdk/types/serialization_option.py +36 -0
  210. label_studio_sdk/types/serialization_options.py +45 -0
  211. label_studio_sdk/types/task.py +157 -0
  212. label_studio_sdk/types/task_filter_options.py +49 -0
  213. label_studio_sdk/types/user_simple.py +37 -0
  214. label_studio_sdk/types/view.py +55 -0
  215. label_studio_sdk/types/webhook.py +67 -0
  216. label_studio_sdk/types/webhook_actions_item.py +21 -0
  217. label_studio_sdk/types/webhook_serializer_for_update.py +67 -0
  218. label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +21 -0
  219. label_studio_sdk/users/__init__.py +5 -0
  220. label_studio_sdk/users/client.py +830 -0
  221. label_studio_sdk/users/types/__init__.py +6 -0
  222. label_studio_sdk/users/types/users_get_token_response.py +36 -0
  223. label_studio_sdk/users/types/users_reset_token_response.py +36 -0
  224. label_studio_sdk/version.py +4 -0
  225. label_studio_sdk/views/__init__.py +35 -0
  226. label_studio_sdk/views/client.py +564 -0
  227. label_studio_sdk/views/types/__init__.py +33 -0
  228. label_studio_sdk/views/types/views_create_request_data.py +43 -0
  229. label_studio_sdk/views/types/views_create_request_data_filters.py +43 -0
  230. label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +5 -0
  231. label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +49 -0
  232. label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +31 -0
  233. label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +23 -0
  234. label_studio_sdk/views/types/views_create_request_data_ordering_item.py +31 -0
  235. label_studio_sdk/views/types/views_update_request_data.py +43 -0
  236. label_studio_sdk/views/types/views_update_request_data_filters.py +43 -0
  237. label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +5 -0
  238. label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +49 -0
  239. label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +31 -0
  240. label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +23 -0
  241. label_studio_sdk/views/types/views_update_request_data_ordering_item.py +31 -0
  242. label_studio_sdk/webhooks/__init__.py +5 -0
  243. label_studio_sdk/webhooks/client.py +636 -0
  244. label_studio_sdk/webhooks/types/__init__.py +5 -0
  245. label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +21 -0
  246. label_studio_sdk-1.0.1.dist-info/METADATA +163 -0
  247. label_studio_sdk-1.0.1.dist-info/RECORD +256 -0
  248. {label_studio_sdk-0.0.34.dist-info → label_studio_sdk-1.0.1.dist-info}/WHEEL +1 -2
  249. label_studio_sdk/objects.py +0 -35
  250. label_studio_sdk-0.0.34.dist-info/LICENSE +0 -201
  251. label_studio_sdk-0.0.34.dist-info/METADATA +0 -24
  252. label_studio_sdk-0.0.34.dist-info/RECORD +0 -37
  253. label_studio_sdk-0.0.34.dist-info/top_level.txt +0 -2
  254. tests/test_client.py +0 -37
  255. tests/test_export.py +0 -105
  256. tests/test_interface/__init__.py +0 -1
  257. tests/test_interface/configs.py +0 -137
  258. tests/test_interface/mockups.py +0 -22
  259. tests/test_interface/test_compat.py +0 -64
  260. tests/test_interface/test_control_tags.py +0 -55
  261. tests/test_interface/test_data_generation.py +0 -45
  262. tests/test_interface/test_lpi.py +0 -15
  263. tests/test_interface/test_main.py +0 -196
  264. tests/test_interface/test_object_tags.py +0 -36
  265. tests/test_interface/test_region.py +0 -36
  266. tests/test_interface/test_validate_summary.py +0 -35
  267. tests/test_interface/test_validation.py +0 -59
  268. {tests → label_studio_sdk/_extensions}/__init__.py +0 -0
  269. /label_studio_sdk/{exceptions.py → _legacy/exceptions.py} +0 -0
  270. /label_studio_sdk/{users.py → _legacy/users.py} +0 -0
  271. /label_studio_sdk/{utils.py → _legacy/utils.py} +0 -0
  272. /label_studio_sdk/{workspaces.py → _legacy/workspaces.py} +0 -0
@@ -1,55 +0,0 @@
1
- import json
2
- from lxml.etree import Element
3
-
4
- from label_studio_sdk.label_interface import LabelInterface
5
- from label_studio_sdk.label_interface.control_tags import ControlTag
6
-
7
- import tests.test_interface.configs as c
8
-
9
-
10
- def test_parse():
11
- tag = Element(
12
- "tag",
13
- {"name": "my_name", "toName": "name1,name2", "apiUrl": "http://myapi.com"},
14
- )
15
- control_tag = ControlTag.parse_node(tag)
16
-
17
- assert isinstance(control_tag, ControlTag)
18
- assert control_tag.tag == "tag"
19
- assert control_tag.name == "my_name"
20
- assert control_tag.to_name == ["name1", "name2"]
21
- assert control_tag.dynamic_value == True
22
-
23
-
24
- def test_validate():
25
- tag = Element("tag", {"name": "my_name", "toName": "name1,name2"})
26
- is_control_tag1 = ControlTag.validate_node(tag)
27
-
28
- assert is_control_tag1 == True
29
-
30
- tag2 = Element("not_control_tag", {"name": "my_name"})
31
- is_control_tag2 = ControlTag.validate_node(tag2)
32
-
33
- assert is_control_tag2 == False
34
-
35
-
36
- def test_textarea_label():
37
- conf = LabelInterface(c.TEXTAREA_CONF)
38
-
39
- region = conf.get_control(c.FROM_NAME).label(text=["Hello", "World"])
40
-
41
-
42
- def test_label_with_choices():
43
- conf = LabelInterface(c.SIMPLE_CONF)
44
- region = conf.get_control().label(label=c.LABEL1)
45
-
46
- rjs = region.to_json()
47
- assert isinstance(rjs, str)
48
-
49
- rpy = json.loads(rjs)
50
- assert rpy["from_name"] == c.FROM_NAME
51
- assert rpy["to_name"] == c.TO_NAME
52
- assert "value" in rpy
53
-
54
- assert "choices" in rpy.get("value")
55
- assert c.LABEL1 in rpy["value"]["choices"]
@@ -1,45 +0,0 @@
1
- from lxml.etree import Element
2
-
3
- from label_studio_sdk.label_interface import LabelInterface
4
- from label_studio_sdk.label_interface.object_tags import ObjectTag
5
- import tests.test_interface.configs as c
6
-
7
-
8
- def test_generate_sample_task():
9
- conf = LabelInterface(c.SIMPLE_CONF)
10
- task = conf.generate_sample_task()
11
- value = c.VALUE[1:]
12
-
13
- print(task)
14
-
15
- assert value in task
16
- assert len(task[value])
17
-
18
-
19
- def test_generate_url():
20
- """Quick check that each object tag generates the right data
21
- """
22
-
23
- def url_validator(url):
24
- assert url.startswith("https://") or url.startswith("http://")
25
-
26
- # TODO need to add other validators
27
- m = {
28
- "Audio": url_validator,
29
- "Image": url_validator,
30
- # "Table": None,
31
- "Text": url_validator,
32
- "Video": url_validator,
33
- # "HyperText": None,
34
- # "List": None,
35
- "Paragraphs": url_validator,
36
- # "TimeSeries": url_validator
37
- }
38
-
39
- for tag_name, validator in m.items():
40
-
41
- tag = Element(tag_name, {"name": "my_name", "value": "my_value"})
42
- inst = ObjectTag.parse_node(tag)
43
-
44
- res = inst.generate_example_value(mode="editor_preview", secure_mode=True)
45
- validator(res)
@@ -1,15 +0,0 @@
1
- from label_studio_sdk.label_interface.region import Region
2
- from label_studio_sdk.label_interface.object_tags import ImageTag
3
- from label_studio_sdk.label_interface.control_tags import RectangleTag
4
-
5
-
6
- def test_li():
7
- """Test using Label Interface to label things
8
- """
9
- img = ImageTag(
10
- name="img", tag="image", value="http://example.com/image.jpg", attr={}
11
- )
12
- rect = RectangleTag(name="rect", to_name=["img"], tag="rectangle", attr={})
13
- rect.set_object(img)
14
-
15
- region = rect.label(x=10, y=10, width=10, height=10, rotation=10)
@@ -1,196 +0,0 @@
1
- """
2
- """
3
- import json
4
- import pytest
5
- import xmljson
6
- import copy
7
-
8
- from label_studio_sdk.objects import PredictionValue
9
- from label_studio_sdk.label_interface import LabelInterface
10
- from label_studio_sdk.label_interface.control_tags import (
11
- ControlTag,
12
- ChoicesTag,
13
- LabelsTag,
14
- Region,
15
- )
16
- from label_studio_sdk.exceptions import LabelStudioValidationErrorSentryIgnored
17
-
18
- # from label_studio_sdk.label_config.regions import Region
19
- import tests.test_interface.configs as c
20
-
21
-
22
- ## testing basic functionality
23
-
24
-
25
- def test_parse_configs():
26
- conf1 = LabelInterface(c.SIMPLE_CONF)
27
- conf2 = LabelInterface(c.VIDEO_CONF)
28
- conf3 = LabelInterface(c.DYNAMIC_LABELS_CONF)
29
-
30
-
31
- def test_accessors():
32
- conf = LabelInterface(c.SIMPLE_CONF)
33
-
34
- c1 = conf.get_control()
35
- assert c1.name == c.FROM_NAME
36
-
37
- c2 = conf.get_control(c.FROM_NAME)
38
- assert c2.name == c.FROM_NAME
39
-
40
- o1 = conf.get_object(c.TO_NAME)
41
- assert o1.name == c.TO_NAME
42
-
43
- o2 = c2.get_object(c.TO_NAME)
44
- assert o2.name == c.TO_NAME
45
-
46
-
47
- def test_parse_two_to_names():
48
- conf = LabelInterface(c.TWO_TONAMES)
49
- ctrl = conf.get_control()
50
-
51
- assert isinstance(ctrl, ControlTag)
52
-
53
- with pytest.raises(Exception):
54
- obj = conf.get_object()
55
-
56
- obj1 = conf.get_object(c.TO_NAME)
57
- assert obj1.name == c.TO_NAME
58
-
59
- obj2 = conf.get_object(c.ANOTHER_TO_NAME)
60
- assert obj2.name == c.ANOTHER_TO_NAME
61
-
62
-
63
- def test_parse_textarea():
64
- conf = LabelInterface(c.TEXTAREA_CONF)
65
-
66
-
67
- # def test_parse_config_to_json():
68
- # json = LabelInterface.parse_config_to_json(c.SIMPLE_CONF)
69
-
70
-
71
- def test_to_name_validation():
72
- LabelInterface._to_name_validation(None, c.SIMPLE_CONF)
73
-
74
- with pytest.raises(LabelStudioValidationErrorSentryIgnored):
75
- LabelInterface._to_name_validation(None, c.SIMPLE_WRONG_CONF)
76
-
77
-
78
- def test_unique_names_validation():
79
- with pytest.raises(LabelStudioValidationErrorSentryIgnored):
80
- LabelInterface._unique_names_validation(None, c.SIMPLE_WRONG_CONF)
81
-
82
-
83
- def test_get_sample_task():
84
- conf = LabelInterface(c.SIMPLE_CONF)
85
- task, _, _ = conf._sample_task()
86
- value = c.VALUE[1:]
87
-
88
- assert value in task
89
- assert len(task[value])
90
-
91
-
92
- ## various edge cases
93
-
94
-
95
- def test_config_essential_data_has_changed():
96
- conf = LabelInterface(c.SIMPLE_CONF)
97
- assert conf.config_essential_data_has_changed(c.SIMPLE_CONF) is False
98
-
99
- new_conf = c.SIMPLE_CONF.replace(c.FROM_NAME, "wrong_name")
100
- assert conf.config_essential_data_has_changed(new_conf) is True
101
-
102
- new_conf_2 = c.SIMPLE_CONF.replace(c.LABEL1, "wrong_label")
103
- assert conf.config_essential_data_has_changed(new_conf_2) is True
104
-
105
-
106
- def test_get_task_from_labeling_config():
107
- task_data, annotations, predictions = LabelInterface.get_task_from_labeling_config(
108
- c.CONF_WITH_COMMENT
109
- )
110
-
111
- # assert task_data == "some_data"
112
- # assert annotations == "some_annotations"
113
- # assert predictions == "some_predictions"
114
-
115
-
116
- def test_find_tags():
117
- conf = LabelInterface(c.SIMPLE_CONF)
118
- tags = conf.find_tags(match_fn=lambda tag: tag.name == c.TO_NAME)
119
-
120
- assert len(tags) > 0
121
- assert tags[0].name == c.TO_NAME
122
-
123
-
124
- def test_find_tags_by_class():
125
- conf = LabelInterface(c.SIMPLE_CONF)
126
- tags = conf.find_tags_by_class(ChoicesTag)
127
-
128
- assert len(tags) > 0
129
- assert tags[0].name == c.FROM_NAME
130
-
131
- tags2 = conf.find_tags_by_class(LabelsTag)
132
- assert len(tags2) == 0
133
-
134
-
135
- ## testing generation
136
-
137
-
138
- def test_task_generation():
139
- val = c.VALUE[1:]
140
- conf = LabelInterface(c.SIMPLE_CONF)
141
- task = conf.generate_sample_task()
142
-
143
- assert val in task
144
- print(task)
145
- assert len(task.get(val))
146
-
147
-
148
- ## testing object tags
149
-
150
- ## testing control tags
151
-
152
-
153
- def test_label_with_choices():
154
- conf = LabelInterface(c.SIMPLE_CONF)
155
- region: Region = conf.get_control().label(label=c.LABEL1)
156
-
157
- rjs = region.to_json()
158
- assert isinstance(rjs, str)
159
-
160
- rpy = json.loads(rjs)
161
- assert rpy["from_name"] == c.FROM_NAME
162
- assert rpy["to_name"] == c.TO_NAME
163
- assert "value" in rpy
164
-
165
- print(rpy)
166
-
167
- assert "choices" in rpy.get("value")
168
- assert c.LABEL1 in rpy["value"]["choices"]
169
-
170
-
171
- ## testing all other tags
172
-
173
- ## test other method
174
-
175
-
176
- def test_load_task():
177
- conf = LabelInterface(c.SIMPLE_CONF)
178
- var_name = c.VALUE[1:]
179
- value = "test"
180
-
181
- tree = conf.load_task({var_name: value})
182
-
183
- assert isinstance(tree, LabelInterface)
184
- assert tree.get_object(c.TO_NAME).value == value
185
-
186
-
187
- def test_load_random_task():
188
- conf = LabelInterface(c.SIMPLE_CONF)
189
- task, _, _ = conf._sample_task()
190
-
191
- tree = conf.load_task(task)
192
- assert len(tree.get_object(c.TO_NAME).value)
193
-
194
-
195
- def test_empty_value_config():
196
- conf = LabelInterface(c.EMPTY_VALUE_CONF)
@@ -1,36 +0,0 @@
1
- from label_studio_sdk.label_interface.object_tags import ObjectTag
2
- from lxml.etree import Element
3
-
4
-
5
- def test_parse():
6
- tag = Element("tag", {"name": "my_name", "value": "my_value"})
7
- object_tag = ObjectTag.parse_node(tag)
8
-
9
- assert object_tag.name == "my_name"
10
- assert object_tag.value == "my_value"
11
- assert object_tag.value_type == None
12
-
13
-
14
- def test_validate():
15
- tag = Element("tag", {"name": "my_name", "value": "$my_value"})
16
- validation_result = ObjectTag.validate_node(tag)
17
-
18
- assert validation_result == True
19
-
20
-
21
- def test_value_type():
22
- tag = Element(
23
- "tag", {"name": "my_name", "value": "my_value", "valueType": "string"}
24
- )
25
- object_tag = ObjectTag.parse_node(tag)
26
- tag_value_type = object_tag.value_type
27
-
28
- assert tag_value_type == "string"
29
-
30
-
31
- def test_value_is_variable():
32
- tag = Element("tag", {"name": "my_name", "value": "$my_var"})
33
- object_tag = ObjectTag.parse_node(tag)
34
- is_variable = object_tag.value_is_variable
35
-
36
- assert is_variable == True
@@ -1,36 +0,0 @@
1
- from lxml.etree import Element
2
-
3
- from label_studio_sdk.label_interface import LabelInterface
4
- from . import configs as c
5
-
6
-
7
- def test_region():
8
- # h.get_rect_interface()
9
- XVAL = 10
10
- YVAL = 10
11
- WVAL = 20
12
- HVAL = 20
13
- RVAL = 0
14
-
15
- lpi = LabelInterface(c.RECT_CONFIG)
16
-
17
- rect = lpi.get_control(c.FROM_NAME)
18
- img = rect.get_object()
19
- r = rect.label(x=XVAL, y=YVAL, width=WVAL, height=HVAL, rotation=RVAL)
20
- d = r._dict()
21
-
22
- assert d["from_name"] == c.FROM_NAME
23
- assert d["to_name"] == c.TO_NAME
24
- assert d["type"] == "rectangle"
25
- assert isinstance(d["value"], dict)
26
-
27
- assert d["value"]["x"] == XVAL
28
- assert d["value"]["y"] == YVAL
29
- assert d["value"]["width"] == WVAL
30
- assert d["value"]["height"] == HVAL
31
- assert d["value"]["rotation"] == RVAL
32
-
33
- # out = r.dict()
34
-
35
-
36
- print(test_region())
@@ -1,35 +0,0 @@
1
- import pytest
2
-
3
- from label_studio_sdk.label_interface import LabelInterface
4
- from label_studio_sdk.exceptions import LabelStudioValidationErrorSentryIgnored
5
-
6
- from . import configs as c
7
- from .mockups import SummaryMockup
8
-
9
-
10
- def test_validate_summary():
11
- li = LabelInterface(c.CONF_COMPLEX)
12
- summary = SummaryMockup()
13
-
14
- li.validate_config_using_summary(summary)
15
-
16
- # lets replace a label
17
- c2 = c.CONF_COMPLEX.replace("PER", "DOESNOTEXIST")
18
- li = LabelInterface(c2)
19
-
20
- with pytest.raises(LabelStudioValidationErrorSentryIgnored):
21
- li.validate_config_using_summary(summary)
22
-
23
- # lets replace control name
24
- c3 = c.CONF_COMPLEX.replace("label", "DOESNOTEXIST")
25
- li = LabelInterface(c3)
26
-
27
- with pytest.raises(LabelStudioValidationErrorSentryIgnored):
28
- li.validate_config_using_summary(summary)
29
-
30
- # lets replace object name
31
- c4 = c.CONF_COMPLEX.replace("text", "DOESNOTEXIST")
32
- li = LabelInterface(c4)
33
-
34
- with pytest.raises(LabelStudioValidationErrorSentryIgnored):
35
- li.validate_config_using_summary(summary)
@@ -1,59 +0,0 @@
1
- import json
2
- import pytest
3
- import xmljson
4
- import copy
5
-
6
- from label_studio_sdk.objects import PredictionValue
7
- from label_studio_sdk.label_interface import LabelInterface
8
- from label_studio_sdk.label_interface.control_tags import (
9
- ControlTag,
10
- ChoicesTag,
11
- LabelsTag,
12
- )
13
- from label_studio_sdk.exceptions import LabelStudioValidationErrorSentryIgnored
14
-
15
- # from label_studio_sdk.label_config.regions import Region
16
- import tests.test_interface.configs as c
17
-
18
-
19
- def test_validate_region():
20
- r1 = c.CORRECT_REGION
21
- conf = LabelInterface(c.SIMPLE_CONF)
22
- assert conf.validate_region(r1) is True
23
-
24
- r2 = copy.deepcopy(r1)
25
- r2["from_name"] = "wrong_name"
26
- with pytest.raises(Exception):
27
- conf.validate_region(r2)
28
-
29
- r3 = copy.deepcopy(r1)
30
- r3["value"]["choices"] = "WRONG_CLASS"
31
- assert conf.validate_region(r3) is False
32
-
33
- r4 = copy.deepcopy(r1)
34
- del r4["value"]["choices"]
35
- assert conf.validate_region(r4) is False
36
-
37
-
38
- def test_validate_prediction():
39
- r1 = c.CORRECT_REGION
40
- conf = LabelInterface(c.SIMPLE_CONF)
41
-
42
- pred = {"model_version": "0.10", "score": "0.10", "result": [r1]}
43
-
44
- assert conf.validate_prediction(pred) is True
45
-
46
- r2 = copy.deepcopy(r1)
47
- r2["from_name"] = "wrong_name"
48
-
49
- pred["result"] = [r2]
50
-
51
- with pytest.raises(Exception):
52
- conf.validate_prediction(pred)
53
-
54
-
55
- def test_validate_task():
56
- conf = LabelInterface(c.SIMPLE_CONF)
57
-
58
- assert conf.validate_task({"data": c.CORRECT_TASK}) is True
59
- assert conf.validate_task({"data": {"wrong_var": "value"}}) is False
File without changes
File without changes
File without changes