import pandas as pd
|
import pytest
|
|
from label_studio.tests.sdk.common import LABEL_CONFIG_AND_TASKS
|
|
pytestmark = pytest.mark.django_db
|
from label_studio_sdk import AsyncLabelStudio
|
from label_studio_sdk.client import LabelStudio
|
|
|
@pytest.fixture
|
def test_project(django_live_url, business_client):
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
project = ls.projects.create(title='Export Test Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
ls.projects.import_tasks(id=project.id, request=LABEL_CONFIG_AND_TASKS['tasks_for_import'])
|
return ls, project
|
|
|
async def test_project_async(django_live_url, business_client):
|
ls = AsyncLabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
project = await ls.projects.create(
|
title='Export Test Project', label_config=LABEL_CONFIG_AND_TASKS['label_config']
|
)
|
await ls.projects.import_tasks(id=project.id, request=LABEL_CONFIG_AND_TASKS['tasks_for_import'])
|
return ls, project
|
|
|
def test_export_formats(test_project):
|
ls, project = test_project
|
|
# Get available export formats
|
formats = ls.projects.exports.list_formats(project.id)
|
assert len(formats) > 0
|
|
|
def test_direct_export(test_project):
|
ls, project = test_project
|
|
# Test JSON export
|
json_data = ls.projects.exports.as_json(project.id)
|
assert isinstance(json_data, list)
|
assert len(json_data) == 1
|
|
# Test pandas export
|
df = ls.projects.exports.as_pandas(project.id)
|
assert isinstance(df, pd.DataFrame)
|
assert len(df) == 1
|
|
# Test low level export - import new task without annotations
|
ls.projects.import_tasks(
|
id=project.id,
|
request={
|
'data': {
|
'my_text': 'Opossums are great',
|
'ref_id': 456,
|
'meta_info': {'timestamp': '2020-03-09 18:15:28.212882', 'location': 'North Pole'},
|
}
|
},
|
)
|
data = ls.projects.exports.download_sync(project.id, download_all_tasks=False)
|
|
def _bytestream_to_json(data):
|
import json
|
from io import BytesIO
|
|
buffer = BytesIO()
|
for chunk in data:
|
buffer.write(chunk)
|
buffer.seek(0)
|
return json.load(buffer)
|
|
assert len(_bytestream_to_json(data)) == 1
|
|
data = ls.projects.exports.download_sync(project.id, download_all_tasks=True)
|
|
assert len(_bytestream_to_json(data)) == 2
|
|
|
# TODO: support pytest-asyncio, otherwise this test will be skipped
|
@pytest.mark.skip(reason='pytest-asyncio is not supported in this version of Label Studio')
|
async def test_async_export(test_project_async):
|
ls, project = test_project_async
|
|
# Test JSON export
|
json_data = await ls.projects.exports.as_json(project.id)
|
assert isinstance(json_data, list)
|
assert len(json_data) == 1
|
|
# Test pandas export
|
df = await ls.projects.exports.as_pandas(project.id, create_kwargs={'task_filter_options': {'finished': 'only'}})
|
assert isinstance(df, pd.DataFrame)
|
assert len(df) == 1
|