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.
- label_studio_sdk/__init__.py +232 -9
- label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
- label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
- label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +163 -0
- label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
- label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +2 -0
- label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +228 -0
- label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +45 -0
- label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +1 -0
- label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +34 -0
- label_studio_sdk/_extensions/label_studio_tools/etl/example.py +17 -0
- label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +67 -0
- label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
- label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +97 -0
- label_studio_sdk/_extensions/pager_ext.py +49 -0
- label_studio_sdk/_legacy/__init__.py +11 -0
- label_studio_sdk/_legacy/client.py +471 -0
- label_studio_sdk/_legacy/objects.py +74 -0
- label_studio_sdk/{project.py → _legacy/project.py} +2 -2
- label_studio_sdk/{schema → _legacy/schema}/label_config_schema.json +14 -14
- label_studio_sdk/actions/__init__.py +27 -0
- label_studio_sdk/actions/client.py +223 -0
- label_studio_sdk/actions/types/__init__.py +25 -0
- label_studio_sdk/actions/types/actions_create_request_filters.py +43 -0
- label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +5 -0
- label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +49 -0
- label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +31 -0
- label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +23 -0
- label_studio_sdk/actions/types/actions_create_request_id.py +19 -0
- label_studio_sdk/actions/types/actions_create_request_ordering_item.py +31 -0
- label_studio_sdk/actions/types/actions_create_request_selected_items.py +10 -0
- label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +39 -0
- label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +39 -0
- label_studio_sdk/annotations/__init__.py +2 -0
- label_studio_sdk/annotations/client.py +750 -0
- label_studio_sdk/base_client.py +183 -0
- label_studio_sdk/client.py +17 -463
- label_studio_sdk/converter/__init__.py +7 -0
- label_studio_sdk/converter/audio.py +56 -0
- label_studio_sdk/converter/brush.py +452 -0
- label_studio_sdk/converter/converter.py +1175 -0
- label_studio_sdk/converter/exports/__init__.py +0 -0
- label_studio_sdk/converter/exports/csv.py +82 -0
- label_studio_sdk/converter/exports/csv2.py +103 -0
- label_studio_sdk/converter/funsd.py +85 -0
- label_studio_sdk/converter/imports/__init__.py +0 -0
- label_studio_sdk/converter/imports/coco.py +314 -0
- label_studio_sdk/converter/imports/colors.py +198 -0
- label_studio_sdk/converter/imports/label_config.py +45 -0
- label_studio_sdk/converter/imports/pathtrack.py +269 -0
- label_studio_sdk/converter/imports/yolo.py +236 -0
- label_studio_sdk/converter/main.py +202 -0
- label_studio_sdk/converter/utils.py +473 -0
- label_studio_sdk/core/__init__.py +33 -0
- label_studio_sdk/core/api_error.py +15 -0
- label_studio_sdk/core/client_wrapper.py +55 -0
- label_studio_sdk/core/datetime_utils.py +28 -0
- label_studio_sdk/core/file.py +38 -0
- label_studio_sdk/core/http_client.py +447 -0
- label_studio_sdk/core/jsonable_encoder.py +99 -0
- label_studio_sdk/core/pagination.py +87 -0
- label_studio_sdk/core/pydantic_utilities.py +28 -0
- label_studio_sdk/core/query_encoder.py +33 -0
- label_studio_sdk/core/remove_none_from_dict.py +11 -0
- label_studio_sdk/core/request_options.py +32 -0
- label_studio_sdk/environment.py +7 -0
- label_studio_sdk/errors/__init__.py +6 -0
- label_studio_sdk/errors/bad_request_error.py +8 -0
- label_studio_sdk/errors/internal_server_error.py +8 -0
- label_studio_sdk/export_storage/__init__.py +28 -0
- label_studio_sdk/export_storage/azure/__init__.py +5 -0
- label_studio_sdk/export_storage/azure/client.py +888 -0
- label_studio_sdk/export_storage/azure/types/__init__.py +6 -0
- label_studio_sdk/export_storage/azure/types/azure_create_response.py +67 -0
- label_studio_sdk/export_storage/azure/types/azure_update_response.py +67 -0
- label_studio_sdk/export_storage/client.py +107 -0
- label_studio_sdk/export_storage/gcs/__init__.py +5 -0
- label_studio_sdk/export_storage/gcs/client.py +888 -0
- label_studio_sdk/export_storage/gcs/types/__init__.py +6 -0
- label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +67 -0
- label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +67 -0
- label_studio_sdk/export_storage/local/__init__.py +5 -0
- label_studio_sdk/export_storage/local/client.py +834 -0
- label_studio_sdk/export_storage/local/types/__init__.py +6 -0
- label_studio_sdk/export_storage/local/types/local_create_response.py +57 -0
- label_studio_sdk/export_storage/local/types/local_update_response.py +57 -0
- label_studio_sdk/export_storage/redis/__init__.py +5 -0
- label_studio_sdk/export_storage/redis/client.py +918 -0
- label_studio_sdk/export_storage/redis/types/__init__.py +6 -0
- label_studio_sdk/export_storage/redis/types/redis_create_response.py +72 -0
- label_studio_sdk/export_storage/redis/types/redis_update_response.py +72 -0
- label_studio_sdk/export_storage/s3/__init__.py +5 -0
- label_studio_sdk/export_storage/s3/client.py +1008 -0
- label_studio_sdk/export_storage/s3/types/__init__.py +6 -0
- label_studio_sdk/export_storage/s3/types/s3create_response.py +89 -0
- label_studio_sdk/export_storage/s3/types/s3update_response.py +89 -0
- label_studio_sdk/export_storage/types/__init__.py +5 -0
- label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +30 -0
- label_studio_sdk/files/__init__.py +2 -0
- label_studio_sdk/files/client.py +556 -0
- label_studio_sdk/import_storage/__init__.py +28 -0
- label_studio_sdk/import_storage/azure/__init__.py +5 -0
- label_studio_sdk/import_storage/azure/client.py +988 -0
- label_studio_sdk/import_storage/azure/types/__init__.py +6 -0
- label_studio_sdk/import_storage/azure/types/azure_create_response.py +82 -0
- label_studio_sdk/import_storage/azure/types/azure_update_response.py +82 -0
- label_studio_sdk/import_storage/client.py +107 -0
- label_studio_sdk/import_storage/gcs/__init__.py +5 -0
- label_studio_sdk/import_storage/gcs/client.py +988 -0
- label_studio_sdk/import_storage/gcs/types/__init__.py +6 -0
- label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +82 -0
- label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +82 -0
- label_studio_sdk/import_storage/local/__init__.py +5 -0
- label_studio_sdk/import_storage/local/client.py +836 -0
- label_studio_sdk/import_storage/local/types/__init__.py +6 -0
- label_studio_sdk/import_storage/local/types/local_create_response.py +57 -0
- label_studio_sdk/import_storage/local/types/local_update_response.py +57 -0
- label_studio_sdk/import_storage/redis/__init__.py +5 -0
- label_studio_sdk/import_storage/redis/client.py +924 -0
- label_studio_sdk/import_storage/redis/types/__init__.py +6 -0
- label_studio_sdk/import_storage/redis/types/redis_create_response.py +72 -0
- label_studio_sdk/import_storage/redis/types/redis_update_response.py +72 -0
- label_studio_sdk/import_storage/s3/__init__.py +5 -0
- label_studio_sdk/import_storage/s3/client.py +1138 -0
- label_studio_sdk/import_storage/s3/types/__init__.py +6 -0
- label_studio_sdk/import_storage/s3/types/s3create_response.py +109 -0
- label_studio_sdk/import_storage/s3/types/s3update_response.py +109 -0
- label_studio_sdk/import_storage/types/__init__.py +5 -0
- label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +30 -0
- label_studio_sdk/label_interface/base.py +10 -0
- label_studio_sdk/label_interface/control_tags.py +109 -71
- label_studio_sdk/label_interface/data_examples.json +96 -0
- label_studio_sdk/label_interface/interface.py +102 -53
- label_studio_sdk/label_interface/object_tags.py +8 -13
- label_studio_sdk/label_interface/region.py +33 -1
- label_studio_sdk/ml/__init__.py +19 -0
- label_studio_sdk/ml/client.py +981 -0
- label_studio_sdk/ml/types/__init__.py +17 -0
- label_studio_sdk/ml/types/ml_create_request_auth_method.py +5 -0
- label_studio_sdk/ml/types/ml_create_response.py +78 -0
- label_studio_sdk/ml/types/ml_create_response_auth_method.py +5 -0
- label_studio_sdk/ml/types/ml_update_request_auth_method.py +5 -0
- label_studio_sdk/ml/types/ml_update_response.py +78 -0
- label_studio_sdk/ml/types/ml_update_response_auth_method.py +5 -0
- label_studio_sdk/predictions/__init__.py +2 -0
- label_studio_sdk/predictions/client.py +638 -0
- label_studio_sdk/projects/__init__.py +6 -0
- label_studio_sdk/projects/client.py +1055 -0
- label_studio_sdk/projects/client_ext.py +19 -0
- label_studio_sdk/projects/exports/__init__.py +2 -0
- label_studio_sdk/projects/exports/client.py +930 -0
- label_studio_sdk/projects/types/__init__.py +7 -0
- label_studio_sdk/projects/types/projects_create_response.py +96 -0
- label_studio_sdk/projects/types/projects_import_tasks_response.py +71 -0
- label_studio_sdk/projects/types/projects_list_response.py +33 -0
- label_studio_sdk/py.typed +0 -0
- label_studio_sdk/tasks/__init__.py +5 -0
- label_studio_sdk/tasks/client.py +835 -0
- label_studio_sdk/tasks/client_ext.py +18 -0
- label_studio_sdk/tasks/types/__init__.py +6 -0
- label_studio_sdk/tasks/types/tasks_list_request_fields.py +5 -0
- label_studio_sdk/tasks/types/tasks_list_response.py +48 -0
- label_studio_sdk/types/__init__.py +115 -0
- label_studio_sdk/types/annotation.py +116 -0
- label_studio_sdk/types/annotation_filter_options.py +42 -0
- label_studio_sdk/types/annotation_last_action.py +19 -0
- label_studio_sdk/types/azure_blob_export_storage.py +112 -0
- label_studio_sdk/types/azure_blob_export_storage_status.py +7 -0
- label_studio_sdk/types/azure_blob_import_storage.py +113 -0
- label_studio_sdk/types/azure_blob_import_storage_status.py +7 -0
- label_studio_sdk/types/base_task.py +113 -0
- label_studio_sdk/types/base_user.py +42 -0
- label_studio_sdk/types/converted_format.py +36 -0
- label_studio_sdk/types/converted_format_status.py +5 -0
- label_studio_sdk/types/export.py +48 -0
- label_studio_sdk/types/export_convert.py +32 -0
- label_studio_sdk/types/export_create.py +54 -0
- label_studio_sdk/types/export_create_status.py +5 -0
- label_studio_sdk/types/export_status.py +5 -0
- label_studio_sdk/types/file_upload.py +30 -0
- label_studio_sdk/types/filter.py +53 -0
- label_studio_sdk/types/filter_group.py +35 -0
- label_studio_sdk/types/gcs_export_storage.py +112 -0
- label_studio_sdk/types/gcs_export_storage_status.py +7 -0
- label_studio_sdk/types/gcs_import_storage.py +113 -0
- label_studio_sdk/types/gcs_import_storage_status.py +7 -0
- label_studio_sdk/types/local_files_export_storage.py +97 -0
- label_studio_sdk/types/local_files_export_storage_status.py +7 -0
- label_studio_sdk/types/local_files_import_storage.py +92 -0
- label_studio_sdk/types/local_files_import_storage_status.py +7 -0
- label_studio_sdk/types/ml_backend.py +89 -0
- label_studio_sdk/types/ml_backend_auth_method.py +5 -0
- label_studio_sdk/types/ml_backend_state.py +5 -0
- label_studio_sdk/types/prediction.py +78 -0
- label_studio_sdk/types/project.py +198 -0
- label_studio_sdk/types/project_import.py +63 -0
- label_studio_sdk/types/project_import_status.py +5 -0
- label_studio_sdk/types/project_label_config.py +32 -0
- label_studio_sdk/types/project_sampling.py +7 -0
- label_studio_sdk/types/project_skip_queue.py +5 -0
- label_studio_sdk/types/redis_export_storage.py +117 -0
- label_studio_sdk/types/redis_export_storage_status.py +7 -0
- label_studio_sdk/types/redis_import_storage.py +112 -0
- label_studio_sdk/types/redis_import_storage_status.py +7 -0
- label_studio_sdk/types/s3export_storage.py +134 -0
- label_studio_sdk/types/s3export_storage_status.py +7 -0
- label_studio_sdk/types/s3import_storage.py +140 -0
- label_studio_sdk/types/s3import_storage_status.py +7 -0
- label_studio_sdk/types/serialization_option.py +36 -0
- label_studio_sdk/types/serialization_options.py +45 -0
- label_studio_sdk/types/task.py +157 -0
- label_studio_sdk/types/task_filter_options.py +49 -0
- label_studio_sdk/types/user_simple.py +37 -0
- label_studio_sdk/types/view.py +55 -0
- label_studio_sdk/types/webhook.py +67 -0
- label_studio_sdk/types/webhook_actions_item.py +21 -0
- label_studio_sdk/types/webhook_serializer_for_update.py +67 -0
- label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +21 -0
- label_studio_sdk/users/__init__.py +5 -0
- label_studio_sdk/users/client.py +830 -0
- label_studio_sdk/users/types/__init__.py +6 -0
- label_studio_sdk/users/types/users_get_token_response.py +36 -0
- label_studio_sdk/users/types/users_reset_token_response.py +36 -0
- label_studio_sdk/version.py +4 -0
- label_studio_sdk/views/__init__.py +35 -0
- label_studio_sdk/views/client.py +564 -0
- label_studio_sdk/views/types/__init__.py +33 -0
- label_studio_sdk/views/types/views_create_request_data.py +43 -0
- label_studio_sdk/views/types/views_create_request_data_filters.py +43 -0
- label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +5 -0
- label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +49 -0
- label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +31 -0
- label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +23 -0
- label_studio_sdk/views/types/views_create_request_data_ordering_item.py +31 -0
- label_studio_sdk/views/types/views_update_request_data.py +43 -0
- label_studio_sdk/views/types/views_update_request_data_filters.py +43 -0
- label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +5 -0
- label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +49 -0
- label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +31 -0
- label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +23 -0
- label_studio_sdk/views/types/views_update_request_data_ordering_item.py +31 -0
- label_studio_sdk/webhooks/__init__.py +5 -0
- label_studio_sdk/webhooks/client.py +636 -0
- label_studio_sdk/webhooks/types/__init__.py +5 -0
- label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +21 -0
- label_studio_sdk-1.0.1.dist-info/METADATA +163 -0
- label_studio_sdk-1.0.1.dist-info/RECORD +256 -0
- {label_studio_sdk-0.0.34.dist-info → label_studio_sdk-1.0.1.dist-info}/WHEEL +1 -2
- label_studio_sdk/objects.py +0 -35
- label_studio_sdk-0.0.34.dist-info/LICENSE +0 -201
- label_studio_sdk-0.0.34.dist-info/METADATA +0 -24
- label_studio_sdk-0.0.34.dist-info/RECORD +0 -37
- label_studio_sdk-0.0.34.dist-info/top_level.txt +0 -2
- tests/test_client.py +0 -37
- tests/test_export.py +0 -105
- tests/test_interface/__init__.py +0 -1
- tests/test_interface/configs.py +0 -137
- tests/test_interface/mockups.py +0 -22
- tests/test_interface/test_compat.py +0 -64
- tests/test_interface/test_control_tags.py +0 -55
- tests/test_interface/test_data_generation.py +0 -45
- tests/test_interface/test_lpi.py +0 -15
- tests/test_interface/test_main.py +0 -196
- tests/test_interface/test_object_tags.py +0 -36
- tests/test_interface/test_region.py +0 -36
- tests/test_interface/test_validate_summary.py +0 -35
- tests/test_interface/test_validation.py +0 -59
- {tests → label_studio_sdk/_extensions}/__init__.py +0 -0
- /label_studio_sdk/{exceptions.py → _legacy/exceptions.py} +0 -0
- /label_studio_sdk/{users.py → _legacy/users.py} +0 -0
- /label_studio_sdk/{utils.py → _legacy/utils.py} +0 -0
- /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)
|
tests/test_interface/test_lpi.py
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|