Add SDK docs (#4928)
- Added auth docs in API schema and SDK ApiClient/Config (fixes #1517) - Added SDK docs with API, SDK and CLI docs - Added `develop` branch in the docs - Allowed unauthorized access to `api/docs`, `api/swagger`, `api/schema` endpoints - Added `--insecure` env var to control host checks in CLI - Refactored `build_docs.py` (backported https://github.com/openvinotoolkit/datumaro/pull/589) - Extracted requirements file for sitemain
parent
cf4e0712cc
commit
68375ec23e
@ -1,48 +0,0 @@
|
|||||||
# Developer guide
|
|
||||||
|
|
||||||
## General info
|
|
||||||
|
|
||||||
Most of the files in this package are generated. The `gen/` directory
|
|
||||||
contains generator config and templates.
|
|
||||||
|
|
||||||
## How to generate API
|
|
||||||
|
|
||||||
1. Obtain the REST API schema:
|
|
||||||
```bash
|
|
||||||
python manage.py spectacular --file schema.yml && mkdir -p cvat-sdk/schema/ && mv schema.yml cvat-sdk/schema/
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Generate package code (call from the package root directory):
|
|
||||||
```bash
|
|
||||||
# pip install -r gen/requirements.txt
|
|
||||||
|
|
||||||
./gen/generate.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to edit templates
|
|
||||||
|
|
||||||
If you want to edit templates, obtain them from the generator first:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -v $PWD:/local \
|
|
||||||
openapitools/openapi-generator-cli author template \
|
|
||||||
-o /local/generator_templates -g python
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, you can copy the modified version of the template you need into
|
|
||||||
the `gen/templates/openapi-generator/` directory.
|
|
||||||
|
|
||||||
Relevant links:
|
|
||||||
- [Generator implementation, available variables in templates](https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator/src/main/java/org/openapitools/codegen)
|
|
||||||
- [Mustache syntax in the generator](https://github.com/OpenAPITools/openapi-generator/wiki/Mustache-Template-Variables)
|
|
||||||
|
|
||||||
## How to test
|
|
||||||
|
|
||||||
API client tests are integrated into REST API tests (`/tests/python/rest_api`)
|
|
||||||
and SDK tests are placed next to them (`/tests/python/sdk`).
|
|
||||||
To execute, run:
|
|
||||||
```bash
|
|
||||||
pytest tests/python/rest_api tests/python/sdk
|
|
||||||
```
|
|
||||||
|
|
||||||
To allow editing of the package, install it with `pip install -e cvat-sdk/`.
|
|
||||||
@ -1,87 +1,111 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Copyright (C) 2021-2022 Intel Corporation
|
# Copyright (C) 2021-2022 Intel Corporation
|
||||||
|
# Copyright (C) 2022 CVAT.ai Corporation
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
import os
|
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import tarfile
|
||||||
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from packaging import version
|
|
||||||
import git
|
import git
|
||||||
import toml
|
import toml
|
||||||
|
from packaging import version
|
||||||
|
|
||||||
|
# the initial version for the documentation site
|
||||||
|
MINIMUM_VERSION = version.Version("1.5.0")
|
||||||
|
|
||||||
MINIMUM_VERSION='1.5.0'
|
|
||||||
|
|
||||||
def prepare_tags(repo):
|
def prepare_tags(repo):
|
||||||
tags = {}
|
tags = {}
|
||||||
for tag in repo.tags:
|
for tag in repo.tags:
|
||||||
tag_version = version.parse(tag.name)
|
tag_version = version.parse(tag.name)
|
||||||
if tag_version >= version.Version(MINIMUM_VERSION) and not tag_version.is_prerelease:
|
if tag_version >= MINIMUM_VERSION and not tag_version.is_prerelease:
|
||||||
release_version = (tag_version.major, tag_version.minor)
|
release_version = (tag_version.major, tag_version.minor)
|
||||||
if not release_version in tags or tag_version > version.parse(tags[release_version].name):
|
if release_version not in tags or tag_version > version.parse(
|
||||||
|
tags[release_version].name
|
||||||
|
):
|
||||||
tags[release_version] = tag
|
tags[release_version] = tag
|
||||||
|
|
||||||
return tags.values()
|
return tags.values()
|
||||||
|
|
||||||
def generate_versioning_config(filename, versions, url_prefix=''):
|
|
||||||
|
def generate_versioning_config(filename, versions, url_prefix=""):
|
||||||
def write_version_item(file_object, version, url):
|
def write_version_item(file_object, version, url):
|
||||||
file_object.write('[[params.versions]]\n')
|
file_object.write("[[params.versions]]\n")
|
||||||
file_object.write('version = "{}"\n'.format(version))
|
file_object.write('version = "{}"\n'.format(version))
|
||||||
file_object.write('url = "{}"\n\n'.format(url))
|
file_object.write('url = "{}"\n\n'.format(url))
|
||||||
|
|
||||||
with open(filename, 'w') as f:
|
with open(filename, "w") as f:
|
||||||
write_version_item(f, 'Latest version', '{}/'.format(url_prefix))
|
write_version_item(f, "Latest version", "{}/".format(url_prefix))
|
||||||
for v in versions:
|
for v in versions:
|
||||||
write_version_item(f, v, '{}/{}'.format(url_prefix, v))
|
write_version_item(f, v, "{}/{}".format(url_prefix, v))
|
||||||
|
|
||||||
|
|
||||||
|
def git_checkout(tagname, repo, temp_dir):
|
||||||
|
subdirs = ["site/content/en/docs", "site/content/en/images"]
|
||||||
|
|
||||||
|
for subdir in subdirs:
|
||||||
|
shutil.rmtree(temp_dir / subdir)
|
||||||
|
|
||||||
|
with tempfile.TemporaryFile() as archive:
|
||||||
|
# `git checkout` doesn't work for this, as it modifies the index.
|
||||||
|
# `git restore` would work, but it's only available since Git 2.23.
|
||||||
|
repo.git.archive(tagname, "--", subdir, output_stream=archive)
|
||||||
|
archive.seek(0)
|
||||||
|
with tarfile.open(fileobj=archive) as tar:
|
||||||
|
tar.extractall(temp_dir)
|
||||||
|
|
||||||
def git_checkout(tagname, cwd):
|
|
||||||
docs_dir = os.path.join(cwd, 'site', 'content', 'en', 'docs')
|
|
||||||
shutil.rmtree(docs_dir)
|
|
||||||
repo.git.checkout(tagname, '--', 'site/content/en/docs')
|
|
||||||
images_dir = os.path.join(cwd, 'site', 'content', 'en', 'images')
|
|
||||||
shutil.rmtree(images_dir)
|
|
||||||
repo.git.checkout(tagname, '--', 'site/content/en/images')
|
|
||||||
|
|
||||||
def change_version_menu_toml(filename, version):
|
def change_version_menu_toml(filename, version):
|
||||||
data = toml.load(filename)
|
data = toml.load(filename)
|
||||||
data['params']['version_menu'] = version
|
data["params"]["version_menu"] = version
|
||||||
|
|
||||||
with open(filename,'w') as f:
|
with open(filename, "w") as f:
|
||||||
toml.dump(data, f)
|
toml.dump(data, f)
|
||||||
|
|
||||||
|
|
||||||
def generate_docs(repo, output_dir, tags):
|
def generate_docs(repo, output_dir, tags):
|
||||||
def run_hugo(content_loc, destination_dir):
|
repo_root = Path(repo.working_tree_dir)
|
||||||
subprocess.run([ # nosec
|
|
||||||
'hugo',
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
'--destination',
|
content_loc = Path(temp_dir, "site")
|
||||||
destination_dir,
|
shutil.copytree(repo_root / "site", content_loc, symlinks=True)
|
||||||
'--config',
|
|
||||||
'config.toml,versioning.toml',
|
def run_hugo(destination_dir):
|
||||||
],
|
subprocess.run( # nosec
|
||||||
cwd=content_loc,
|
[
|
||||||
)
|
"hugo",
|
||||||
|
"--destination",
|
||||||
cwd = repo.working_tree_dir
|
str(destination_dir),
|
||||||
content_loc = os.path.join(cwd, 'site')
|
"--config",
|
||||||
if not os.path.exists(output_dir):
|
"config.toml,versioning.toml",
|
||||||
os.makedirs(output_dir)
|
],
|
||||||
|
cwd=content_loc,
|
||||||
generate_versioning_config(os.path.join(cwd, 'site', 'versioning.toml'), (t.name for t in tags))
|
check=True,
|
||||||
change_version_menu_toml(os.path.join(cwd, 'site', 'versioning.toml'), 'Latest version')
|
)
|
||||||
run_hugo(content_loc, output_dir)
|
|
||||||
|
versioning_toml_path = content_loc / "versioning.toml"
|
||||||
generate_versioning_config(os.path.join(cwd, 'site', 'versioning.toml'), (t.name for t in tags), '/..')
|
|
||||||
for tag in tags:
|
# Handle the develop version
|
||||||
git_checkout(tag.name, cwd)
|
generate_versioning_config(versioning_toml_path, (t.name for t in tags))
|
||||||
destination_dir = os.path.join(output_dir, tag.name)
|
change_version_menu_toml(versioning_toml_path, "develop")
|
||||||
change_version_menu_toml(os.path.join(cwd, 'site', 'versioning.toml'), tag.name)
|
run_hugo(output_dir)
|
||||||
os.makedirs(destination_dir)
|
|
||||||
run_hugo(content_loc, destination_dir)
|
generate_versioning_config(versioning_toml_path, (t.name for t in tags), "/..")
|
||||||
|
for tag in tags:
|
||||||
|
git_checkout(tag.name, repo, Path(temp_dir))
|
||||||
|
change_version_menu_toml(versioning_toml_path, tag.name)
|
||||||
|
run_hugo(output_dir / tag.name)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
repo_root = os.getcwd()
|
repo_root = Path(__file__).resolve().parents[1]
|
||||||
repo = git.Repo(repo_root)
|
output_dir = repo_root / "public"
|
||||||
output_dir = os.path.join(repo_root, 'public')
|
|
||||||
|
|
||||||
tags = prepare_tags(repo)
|
with git.Repo(repo_root) as repo:
|
||||||
generate_docs(repo, output_dir, tags)
|
tags = prepare_tags(repo)
|
||||||
|
generate_docs(repo, output_dir, tags)
|
||||||
|
|||||||
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
title: "API & SDK"
|
||||||
|
linkTitle: "API & SDK"
|
||||||
|
weight: 4
|
||||||
|
description: 'How to interact with CVAT'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
In the modern world, it is often necessary to integrate different tools to work together.
|
||||||
|
CVAT provides the following integration layers:
|
||||||
|
|
||||||
|
- Server REST API + Swagger schema
|
||||||
|
- Python client library (SDK)
|
||||||
|
- REST API client
|
||||||
|
- High-level wrappers
|
||||||
|
- Command-line tool (CLI)
|
||||||
|
|
||||||
|
In this section, you can find documentation about each separate layer.
|
||||||
|
|
||||||
|
## Component compatibility
|
||||||
|
|
||||||
|
Currently, the only supported configuration is when the server API major and minor versions
|
||||||
|
are the same as SDK and CLI major and minor versions, e.g. server v2.1.* is supported by
|
||||||
|
SDK and CLI v2.1.*. Different versions may have incompatibilities, which lead to some functions
|
||||||
|
in SDK or CLI may not work properly.
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: 'Frequently asked questions'
|
||||||
|
linkTitle: 'FAQ'
|
||||||
|
weight: 100
|
||||||
|
description: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
### My server uses a custom SSL certificate and I don't want to check it.
|
||||||
|
|
||||||
|
You can call control SSL certificate check with the `--insecure` CLI argument.
|
||||||
|
For SDK, you can specify `ssl_verify = True/False` in the `cvat_sdk.core.client.Config` object.
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
title: 'Python SDK'
|
||||||
|
linkTitle: 'SDK'
|
||||||
|
weight: 3
|
||||||
|
description: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
SDK is a Python library. It provides you access to Python function and objects, which
|
||||||
|
simplify server interaction and provide additional functionality like data validation.
|
||||||
|
|
||||||
|
SDK API includes 2 layers:
|
||||||
|
- Low-level API with REST API wrappers. Located in at `cvat_sdk.api_client`. [Read more](/api_sdk/sdk/lowlevel-api)
|
||||||
|
- High-level API. Located at `cvat_sdk.core`. [Read more](/api_sdk/sdk/highlevel-api)
|
||||||
|
|
||||||
|
Roughly, low-level API provides single-request operations, while the high-level one allows you
|
||||||
|
to use composite, multi-request operations and have local counterparts for server objects.
|
||||||
|
For most uses, the high-level API should be good enough and sufficient, and it should be
|
||||||
|
right point to start your integration with CVAT.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install an [official release of CVAT SDK](https://pypi.org/project/cvat-sdk/) use this command:
|
||||||
|
```bash
|
||||||
|
pip install cvat-sdk
|
||||||
|
```
|
||||||
|
|
||||||
|
We support Python versions 3.7 - 3.9.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To import the package components, use the following code:
|
||||||
|
|
||||||
|
For high-level API:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import cvat_sdk
|
||||||
|
# or
|
||||||
|
import cvat_sdk.core
|
||||||
|
```
|
||||||
|
|
||||||
|
For low-level API:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import cvat_sdk.api_client
|
||||||
|
```
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
title: 'Developer guide'
|
||||||
|
linkTitle: 'Developer guide'
|
||||||
|
weight: 10
|
||||||
|
description: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This package contains manually written and generated files. We store only sources in
|
||||||
|
the repository. To get the full package, one need to generate missing package files.
|
||||||
|
|
||||||
|
## Package file layout
|
||||||
|
|
||||||
|
- `gen/` - generator files
|
||||||
|
- `cvat_sdk/` - Python package root
|
||||||
|
- `cvat_sdk/api_client` - autogenerated low-level package code
|
||||||
|
- `cvat_sdk/core` - high-level package code
|
||||||
|
|
||||||
|
## How to generate package code
|
||||||
|
|
||||||
|
1. Obtain the server API schema
|
||||||
|
|
||||||
|
If you have a local custom version of the server, run the following command in the terminal.
|
||||||
|
You need to be able to execute django server. Server installation instructions are available
|
||||||
|
[here](/contributing/development-environment).
|
||||||
|
```bash
|
||||||
|
mkdir -p cvat-sdk/schema/ && python manage.py spectacular --file cvat-sdk/schema/schema.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to use docker instead:
|
||||||
|
```bash
|
||||||
|
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run \
|
||||||
|
--no-deps --entrypoint '/usr/bin/env python' --rm -u "$(id -u)":"$(id -g)" -v "$PWD":"/local" \
|
||||||
|
cvat_server \
|
||||||
|
manage.py spectacular --file /local/cvat-sdk/schema/schema.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you don't have access to the server sources, but have a working instance,
|
||||||
|
you can also get schema from `<yourserver>/api/docs`:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
2. Install generator dependencies:
|
||||||
|
```bash
|
||||||
|
pip install -r gen/requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Generate package code (call from the package root directory!):
|
||||||
|
```bash
|
||||||
|
./gen/generate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
4. To allow editing of the package, install it with `pip install -e cvat-sdk/`.
|
||||||
|
|
||||||
|
## How to edit templates
|
||||||
|
|
||||||
|
If you want to edit templates, obtain them from the generator first:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm -v $PWD:/local \
|
||||||
|
openapitools/openapi-generator-cli author template \
|
||||||
|
-o /local/generator_templates -g python
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, you can copy the modified version of the template you need into
|
||||||
|
the `gen/templates/openapi-generator/` directory.
|
||||||
|
|
||||||
|
Relevant links:
|
||||||
|
- [Generator implementation, available variables in templates](https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator/src/main/java/org/openapitools/codegen)
|
||||||
|
- [Mustache syntax in the generator](https://github.com/OpenAPITools/openapi-generator/wiki/Mustache-Template-Variables)
|
||||||
|
|
||||||
|
## How to test
|
||||||
|
|
||||||
|
API client tests are integrated into REST API tests in `/tests/python/rest_api`
|
||||||
|
and SDK tests are placed next to them in `/tests/python/sdk`.
|
||||||
|
To execute, run:
|
||||||
|
```bash
|
||||||
|
pytest tests/python/rest_api tests/python/sdk
|
||||||
|
```
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
title: 'High-level API'
|
||||||
|
linkTitle: 'High-level API'
|
||||||
|
weight: 4
|
||||||
|
description: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This layer provides high-level APIs, allowing easier access to server operations.
|
||||||
|
API includes _Repositories_ and _Entities_. Repositories provide management
|
||||||
|
operations for Entitites. Entitites represent separate objects on the server
|
||||||
|
(e.g. tasks, jobs etc).
|
||||||
|
|
||||||
|
Code of this component is located in `cvat_sdk.core`.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```python
|
||||||
|
from cvat_sdk import make_client, models
|
||||||
|
from cvat_sdk.core.proxies.tasks import ResourceType, Task
|
||||||
|
|
||||||
|
with make_client(host="http://localhost") as client:
|
||||||
|
# Authorize using the basic auth
|
||||||
|
client.login(('YOUR_USERNAME', 'YOUR_PASSWORD'))
|
||||||
|
|
||||||
|
# Models are used the same way as in the layer 1
|
||||||
|
task_spec = {
|
||||||
|
"name": "example task 2",
|
||||||
|
"labels": [
|
||||||
|
{
|
||||||
|
"name": "car",
|
||||||
|
"color": "#ff00ff",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"name": "a",
|
||||||
|
"mutable": True,
|
||||||
|
"input_type": "number",
|
||||||
|
"default_value": "5",
|
||||||
|
"values": ["4", "5", "6"],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
# Different repositories can be accessed as the Client class members.
|
||||||
|
# They may provide both simple and complex operations,
|
||||||
|
# such as entity creation, retrieval and removal.
|
||||||
|
task = client.tasks.create_from_data(
|
||||||
|
spec=task_spec,
|
||||||
|
resource_type=ResourceType.LOCAL,
|
||||||
|
resources=['image1.jpg', 'image2.png'],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Task object is already up-to-date with its server counterpart
|
||||||
|
assert task.size == 2
|
||||||
|
|
||||||
|
# An entity needs to be fetch()-ed to reflect the latest changes.
|
||||||
|
# It can be update()-d and remove()-d depending on the entity type.
|
||||||
|
task.update({'name': 'mytask'})
|
||||||
|
task.remove()
|
||||||
|
```
|
||||||
@ -0,0 +1,386 @@
|
|||||||
|
---
|
||||||
|
title: 'Low-level API'
|
||||||
|
linkTitle: 'Low-level API'
|
||||||
|
weight: 3
|
||||||
|
description: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Low-level API is useful if you need to work directly with REST API, but want
|
||||||
|
to have data validation and syntax assistance from your code editor. The code
|
||||||
|
on this layer is autogenerated.
|
||||||
|
|
||||||
|
Code of this component is located in `cvat_sdk.api_client`.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Let's see how a task with local files can be created. We will use the basic auth
|
||||||
|
to make things simpler.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from time import sleep
|
||||||
|
from cvat_sdk.api_client import Configuration, ApiClient, models, apis, exceptions
|
||||||
|
|
||||||
|
configuration = Configuration(
|
||||||
|
host="http://localhost",
|
||||||
|
username='YOUR_USERNAME',
|
||||||
|
password='YOUR_PASSWORD',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Enter a context with an instance of the API client
|
||||||
|
with ApiClient(configuration) as api_client:
|
||||||
|
# Parameters can be passed as a plain dict with JSON-serialized data
|
||||||
|
# or as model objects (from cvat_sdk.api_client.models), including
|
||||||
|
# mixed variants.
|
||||||
|
#
|
||||||
|
# In case of dicts, keys must be the same as members of models.I<ModelName>
|
||||||
|
# interfaces and values must be convertible to the corresponding member
|
||||||
|
# value types (e.g. a date or string enum value can be parsed from a string).
|
||||||
|
#
|
||||||
|
# In case of model objects, data must be of the corresponding
|
||||||
|
# models.<ModelName> types.
|
||||||
|
#
|
||||||
|
# Let's use a dict here. It should look like models.ITaskWriteRequest
|
||||||
|
task_spec = {
|
||||||
|
'name': 'example task',
|
||||||
|
"labels": [{
|
||||||
|
"name": "car",
|
||||||
|
"color": "#ff00ff",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"name": "a",
|
||||||
|
"mutable": True,
|
||||||
|
"input_type": "number",
|
||||||
|
"default_value": "5",
|
||||||
|
"values": ["4", "5", "6"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Apis can be accessed as ApiClient class members
|
||||||
|
# We use different models for input and output data. For input data,
|
||||||
|
# models are typically called like "*Request". Output data models have
|
||||||
|
# no suffix.
|
||||||
|
(task, response) = api_client.tasks_api.create(task_spec)
|
||||||
|
except exceptions.ApiException as e:
|
||||||
|
# We can catch the basic exception type, or a derived type
|
||||||
|
print("Exception when trying to create a task: %s\n" % e)
|
||||||
|
|
||||||
|
# Here we will use models instead of a dict
|
||||||
|
task_data = models.DataRequest(
|
||||||
|
image_quality=75,
|
||||||
|
client_files=[
|
||||||
|
open('image1.jpg', 'rb'),
|
||||||
|
open('image2.jpg', 'rb'),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
# If we pass binary file objects, we need to specify content type.
|
||||||
|
# For this endpoint, we don't have response data
|
||||||
|
(_, response) = api_client.tasks_api.create_data(task.id,
|
||||||
|
data_request=task_data,
|
||||||
|
_content_type="multipart/form-data",
|
||||||
|
|
||||||
|
# we can choose to check the response status manually
|
||||||
|
# and disable the response data parsing
|
||||||
|
_check_status=False, _parse_response=False
|
||||||
|
)
|
||||||
|
assert response.status == 202, response.msg
|
||||||
|
|
||||||
|
# Wait till task data is processed
|
||||||
|
for _ in range(100):
|
||||||
|
(status, _) = api_client.tasks_api.retrieve_status(task.id)
|
||||||
|
if status.state.value in ['Finished', 'Failed']:
|
||||||
|
break
|
||||||
|
sleep(0.1)
|
||||||
|
assert status.state.value == 'Finished', status.message
|
||||||
|
|
||||||
|
# Update the task object and check the task size
|
||||||
|
(task, _) = api_client.tasks_api.retrieve(task.id)
|
||||||
|
assert task.size == 4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available API Endpoints
|
||||||
|
|
||||||
|
All URIs are relative to _`http://localhost`_
|
||||||
|
|
||||||
|
APIs can be instanted directly like this:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from cvat_sdk.api_client import ApiClient, apis
|
||||||
|
|
||||||
|
api_client = ApiClient(...)
|
||||||
|
auth_api = apis.AuthApi(api_client)
|
||||||
|
auth_api.<operation>(...)
|
||||||
|
```
|
||||||
|
|
||||||
|
Or they can be accessed as `ApiClient` object members:
|
||||||
|
```
|
||||||
|
from cvat_sdk.api_client import ApiClient
|
||||||
|
|
||||||
|
api_client = ApiClient(...)
|
||||||
|
api_client.auth_api.<operation>(...)
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--lint disable table-cell-padding-->
|
||||||
|
|
||||||
|
Class | Method | HTTP request | Description
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
_AuthApi_ | **auth_create_login** | **POST** /api/auth/login |
|
||||||
|
_AuthApi_ | **auth_create_logout** | **POST** /api/auth/logout |
|
||||||
|
_AuthApi_ | **auth_create_password_change** | **POST** /api/auth/password/change |
|
||||||
|
_AuthApi_ | **auth_create_password_reset** | **POST** /api/auth/password/reset |
|
||||||
|
_AuthApi_ | **auth_create_password_reset_confirm** | **POST** /api/auth/password/reset/confirm |
|
||||||
|
_AuthApi_ | **auth_create_register** | **POST** /api/auth/register |
|
||||||
|
_AuthApi_ | **auth_create_signing** | **POST** /api/auth/signing | This method signs URL for access to the server
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_create** | **POST** /api/cloudstorages | Method creates a cloud storage with a specified characteristics
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_destroy** | **DELETE** /api/cloudstorages/{id} | Method deletes a specific cloud storage
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_list** | **GET** /api/cloudstorages | Returns a paginated list of storages according to query parameters
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_partial_update** | **PATCH** /api/cloudstorages/{id} | Methods does a partial update of chosen fields in a cloud storage instance
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_retrieve** | **GET** /api/cloudstorages/{id} | Method returns details of a specific cloud storage
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_retrieve_actions** | **GET** /api/cloudstorages/{id}/actions | Method returns allowed actions for the cloud storage
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_retrieve_content** | **GET** /api/cloudstorages/{id}/content | Method returns a manifest content
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_retrieve_preview** | **GET** /api/cloudstorages/{id}/preview | Method returns a preview image from a cloud storage
|
||||||
|
_CloudstoragesApi_ | **cloudstorages_retrieve_status** | **GET** /api/cloudstorages/{id}/status | Method returns a cloud storage status
|
||||||
|
_CommentsApi_ | **comments_create** | **POST** /api/comments | Method creates a comment
|
||||||
|
_CommentsApi_ | **comments_destroy** | **DELETE** /api/comments/{id} | Method deletes a comment
|
||||||
|
_CommentsApi_ | **comments_list** | **GET** /api/comments | Method returns a paginated list of comments according to query parameters
|
||||||
|
_CommentsApi_ | **comments_partial_update** | **PATCH** /api/comments/{id} | Methods does a partial update of chosen fields in a comment
|
||||||
|
_CommentsApi_ | **comments_retrieve** | **GET** /api/comments/{id} | Method returns details of a comment
|
||||||
|
_InvitationsApi_ | **invitations_create** | **POST** /api/invitations | Method creates an invitation
|
||||||
|
_InvitationsApi_ | **invitations_destroy** | **DELETE** /api/invitations/{key} | Method deletes an invitation
|
||||||
|
_InvitationsApi_ | **invitations_list** | **GET** /api/invitations | Method returns a paginated list of invitations according to query parameters
|
||||||
|
_InvitationsApi_ | **invitations_partial_update** | **PATCH** /api/invitations/{key} | Methods does a partial update of chosen fields in an invitation
|
||||||
|
_InvitationsApi_ | **invitations_retrieve** | **GET** /api/invitations/{key} | Method returns details of an invitation
|
||||||
|
_IssuesApi_ | **issues_create** | **POST** /api/issues | Method creates an issue
|
||||||
|
_IssuesApi_ | **issues_destroy** | **DELETE** /api/issues/{id} | Method deletes an issue
|
||||||
|
_IssuesApi_ | **issues_list** | **GET** /api/issues | Method returns a paginated list of issues according to query parameters
|
||||||
|
_IssuesApi_ | **issues_list_comments** | **GET** /api/issues/{id}/comments | The action returns all comments of a specific issue
|
||||||
|
_IssuesApi_ | **issues_partial_update** | **PATCH** /api/issues/{id} | Methods does a partial update of chosen fields in an issue
|
||||||
|
_IssuesApi_ | **issues_retrieve** | **GET** /api/issues/{id} | Method returns details of an issue
|
||||||
|
_JobsApi_ | **jobs_create_annotations** | **POST** /api/jobs/{id}/annotations/ | Method allows to upload job annotations
|
||||||
|
_JobsApi_ | **jobs_destroy_annotations** | **DELETE** /api/jobs/{id}/annotations/ | Method deletes all annotations for a specific job
|
||||||
|
_JobsApi_ | **jobs_list** | **GET** /api/jobs | Method returns a paginated list of jobs according to query parameters
|
||||||
|
_JobsApi_ | **jobs_list_commits** | **GET** /api/jobs/{id}/commits | The action returns the list of tracked changes for the job
|
||||||
|
_JobsApi_ | **jobs_list_issues** | **GET** /api/jobs/{id}/issues | Method returns list of issues for the job
|
||||||
|
_JobsApi_ | **jobs_partial_update** | **PATCH** /api/jobs/{id} | Methods does a partial update of chosen fields in a job
|
||||||
|
_JobsApi_ | **jobs_partial_update_annotations** | **PATCH** /api/jobs/{id}/annotations/ | Method performs a partial update of annotations in a specific job
|
||||||
|
_JobsApi_ | **jobs_partial_update_annotations_file** | **PATCH** /api/jobs/{id}/annotations/{file_id} | Allows to upload an annotation file chunk. Implements TUS file uploading protocol.
|
||||||
|
_JobsApi_ | **jobs_retrieve** | **GET** /api/jobs/{id} | Method returns details of a job
|
||||||
|
_JobsApi_ | **jobs_retrieve_annotations** | **GET** /api/jobs/{id}/annotations/ | Method returns annotations for a specific job as a JSON document. If format is specified a zip archive is returned.
|
||||||
|
_JobsApi_ | **jobs_retrieve_data** | **GET** /api/jobs/{id}/data | Method returns data for a specific job
|
||||||
|
_JobsApi_ | **jobs_retrieve_data_meta** | **GET** /api/jobs/{id}/data/meta | Method provides a meta information about media files which are related with the job
|
||||||
|
_JobsApi_ | **jobs_retrieve_dataset** | **GET** /api/jobs/{id}/dataset | Export job as a dataset in a specific format
|
||||||
|
_JobsApi_ | **jobs_update_annotations** | **PUT** /api/jobs/{id}/annotations/ | Method performs an update of all annotations in a specific job
|
||||||
|
_LambdaApi_ | **lambda_create_functions** | **POST** /api/lambda/functions/{func_id} |
|
||||||
|
_LambdaApi_ | **lambda_create_requests** | **POST** /api/lambda/requests | Method calls the function
|
||||||
|
_LambdaApi_ | **lambda_list_functions** | **GET** /api/lambda/functions | Method returns a list of functions
|
||||||
|
_LambdaApi_ | **lambda_list_requests** | **GET** /api/lambda/requests | Method returns a list of requests
|
||||||
|
_LambdaApi_ | **lambda_retrieve_functions** | **GET** /api/lambda/functions/{func_id} | Method returns the information about the function
|
||||||
|
_LambdaApi_ | **lambda_retrieve_requests** | **GET** /api/lambda/requests/{id} | Method returns the status of the request
|
||||||
|
_MembershipsApi_ | **memberships_destroy** | **DELETE** /api/memberships/{id} | Method deletes a membership
|
||||||
|
_MembershipsApi_ | **memberships_list** | **GET** /api/memberships | Method returns a paginated list of memberships according to query parameters
|
||||||
|
_MembershipsApi_ | **memberships_partial_update** | **PATCH** /api/memberships/{id} | Methods does a partial update of chosen fields in a membership
|
||||||
|
_MembershipsApi_ | **memberships_retrieve** | **GET** /api/memberships/{id} | Method returns details of a membership
|
||||||
|
_OrganizationsApi_ | **organizations_create** | **POST** /api/organizations | Method creates an organization
|
||||||
|
_OrganizationsApi_ | **organizations_destroy** | **DELETE** /api/organizations/{id} | Method deletes an organization
|
||||||
|
_OrganizationsApi_ | **organizations_list** | **GET** /api/organizations | Method returns a paginated list of organizatins according to query parameters
|
||||||
|
_OrganizationsApi_ | **organizations_partial_update** | **PATCH** /api/organizations/{id} | Methods does a partial update of chosen fields in an organization
|
||||||
|
_OrganizationsApi_ | **organizations_retrieve** | **GET** /api/organizations/{id} | Method returns details of an organization
|
||||||
|
_ProjectsApi_ | **projects_create** | **POST** /api/projects | Method creates a new project
|
||||||
|
_ProjectsApi_ | **projects_create_backup** | **POST** /api/projects/backup/ | Methods create a project from a backup
|
||||||
|
_ProjectsApi_ | **projects_create_dataset** | **POST** /api/projects/{id}/dataset/ | Import dataset in specific format as a project
|
||||||
|
_ProjectsApi_ | **projects_destroy** | **DELETE** /api/projects/{id} | Method deletes a specific project
|
||||||
|
_ProjectsApi_ | **projects_list** | **GET** /api/projects | Returns a paginated list of projects according to query parameters (12 projects per page)
|
||||||
|
_ProjectsApi_ | **projects_list_tasks** | **GET** /api/projects/{id}/tasks | Method returns information of the tasks of the project with the selected id
|
||||||
|
_ProjectsApi_ | **projects_partial_update** | **PATCH** /api/projects/{id} | Methods does a partial update of chosen fields in a project
|
||||||
|
_ProjectsApi_ | **projects_partial_update_backup_file** | **PATCH** /api/projects/backup/{file_id} | Allows to upload a file chunk. Implements TUS file uploading protocol
|
||||||
|
_ProjectsApi_ | **projects_partial_update_dataset_file** | **PATCH** /api/projects/{id}/dataset/{file_id} | Allows to upload a file chunk. Implements TUS file uploading protocol.
|
||||||
|
_ProjectsApi_ | **projects_retrieve** | **GET** /api/projects/{id} | Method returns details of a specific project
|
||||||
|
_ProjectsApi_ | **projects_retrieve_annotations** | **GET** /api/projects/{id}/annotations | Method allows to download project annotations
|
||||||
|
_ProjectsApi_ | **projects_retrieve_backup** | **GET** /api/projects/{id}/backup | Methods creates a backup copy of a project
|
||||||
|
_ProjectsApi_ | **projects_retrieve_dataset** | **GET** /api/projects/{id}/dataset/ | Export project as a dataset in a specific format
|
||||||
|
_RestrictionsApi_ | **restrictions_retrieve_terms_of_use** | **GET** /api/restrictions/terms-of-use | Method provides CVAT terms of use
|
||||||
|
_RestrictionsApi_ | **restrictions_retrieve_user_agreements** | **GET** /api/restrictions/user-agreements | Method provides user agreements that the user must accept to register
|
||||||
|
_SchemaApi_ | **schema_retrieve** | **GET** /api/schema/ |
|
||||||
|
_ServerApi_ | **server_create_exception** | **POST** /api/server/exception | Method saves an exception from a client on the server
|
||||||
|
_ServerApi_ | **server_create_logs** | **POST** /api/server/logs | Method saves logs from a client on the server
|
||||||
|
_ServerApi_ | **server_list_share** | **GET** /api/server/share | Returns all files and folders that are on the server along specified path
|
||||||
|
_ServerApi_ | **server_retrieve_about** | **GET** /api/server/about | Method provides basic CVAT information
|
||||||
|
_ServerApi_ | **server_retrieve_annotation_formats** | **GET** /api/server/annotation/formats | Method provides the list of supported annotations formats
|
||||||
|
_ServerApi_ | **server_retrieve_plugins** | **GET** /api/server/plugins | Method provides allowed plugins
|
||||||
|
_TasksApi_ | **jobs_partial_update_data_meta** | **PATCH** /api/jobs/{id}/data/meta | Method provides a meta information about media files which are related with the job
|
||||||
|
_TasksApi_ | **tasks_create** | **POST** /api/tasks | Method creates a new task in a database without any attached images and videos
|
||||||
|
_TasksApi_ | **tasks_create_annotations** | **POST** /api/tasks/{id}/annotations/ | Method allows to upload task annotations from a local file or a cloud storage
|
||||||
|
_TasksApi_ | **tasks_create_backup** | **POST** /api/tasks/backup/ | Method recreates a task from an attached task backup file
|
||||||
|
_TasksApi_ | **tasks_create_data** | **POST** /api/tasks/{id}/data/ | Method permanently attaches images or video to a task. Supports tus uploads, see more <https://tus.io/>
|
||||||
|
_TasksApi_ | **tasks_destroy** | **DELETE** /api/tasks/{id} | Method deletes a specific task, all attached jobs, annotations, and data
|
||||||
|
_TasksApi_ | **tasks_destroy_annotations** | **DELETE** /api/tasks/{id}/annotations/ | Method deletes all annotations for a specific task
|
||||||
|
_TasksApi_ | **tasks_list** | **GET** /api/tasks | Returns a paginated list of tasks according to query parameters (10 tasks per page)
|
||||||
|
_TasksApi_ | **tasks_list_jobs** | **GET** /api/tasks/{id}/jobs | Method returns a list of jobs for a specific task
|
||||||
|
_TasksApi_ | **tasks_partial_update** | **PATCH** /api/tasks/{id} | Methods does a partial update of chosen fields in a task
|
||||||
|
_TasksApi_ | **tasks_partial_update_annotations** | **PATCH** /api/tasks/{id}/annotations/ | Method performs a partial update of annotations in a specific task
|
||||||
|
_TasksApi_ | **tasks_partial_update_annotations_file** | **PATCH** /api/tasks/{id}/annotations/{file_id} | Allows to upload an annotation file chunk. Implements TUS file uploading protocol.
|
||||||
|
_TasksApi_ | **tasks_partial_update_backup_file** | **PATCH** /api/tasks/backup/{file_id} | Allows to upload a file chunk. Implements TUS file uploading protocol.
|
||||||
|
_TasksApi_ | **tasks_partial_update_data_file** | **PATCH** /api/tasks/{id}/data/{file_id} | Allows to upload a file chunk. Implements TUS file uploading protocol.
|
||||||
|
_TasksApi_ | **tasks_partial_update_data_meta** | **PATCH** /api/tasks/{id}/data/meta | Method provides a meta information about media files which are related with _he_task
|
||||||
|
_TasksApi_ | **tasks_retrieve** | **GET** /api/tasks/{id} | Method returns details of a specific task
|
||||||
|
_TasksApi_ | **tasks_retrieve_annotations** | **GET** /api/tasks/{id}/annotations/ | Method allows to download task annotations
|
||||||
|
_TasksApi_ | **tasks_retrieve_backup** | **GET** /api/tasks/{id}/backup | Method backup a specified task
|
||||||
|
_TasksApi_ | **tasks_retrieve_data** | **GET** /api/tasks/{id}/data/ | Method returns data for a specific task
|
||||||
|
_TasksApi_ | **tasks_retrieve_data_meta** | **GET** /api/tasks/{id}/data/meta | Method provides a meta information about media files which are related with the task
|
||||||
|
_TasksApi_ | **tasks_retrieve_dataset** | **GET** /api/tasks/{id}/dataset | Export task as a dataset in a specific format
|
||||||
|
_TasksApi_ | **tasks_retrieve_status** | **GET** /api/tasks/{id}/status | When task is being created the method returns information about a status of the creation process
|
||||||
|
_TasksApi_ | **tasks_update_annotations** | **PUT** /api/tasks/{id}/annotations/ | Method allows to upload task annotations
|
||||||
|
_UsersApi_ | **users_destroy** | **DELETE** /api/users/{id} | Method deletes a specific user from the server
|
||||||
|
_UsersApi_ | **users_list** | **GET** /api/users | Method provides a paginated list of users registered on the server
|
||||||
|
_UsersApi_ | **users_partial_update** | **PATCH** /api/users/{id} | Method updates chosen fields of a user
|
||||||
|
_UsersApi_ | **users_retrieve** | **GET** /api/users/{id} | Method provides information of a specific user
|
||||||
|
_UsersApi_ | **users_retrieve_self** | **GET** /api/users/self | Method returns an instance of a user who is currently authorized
|
||||||
|
|
||||||
|
|
||||||
|
## Available Models
|
||||||
|
|
||||||
|
Models can be instantiated like this:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from cvat_sdk.api_client import models
|
||||||
|
|
||||||
|
user_model = models.User(...)
|
||||||
|
```
|
||||||
|
|
||||||
|
- About
|
||||||
|
- AnnotationFileRequest
|
||||||
|
- AnnotationsRead
|
||||||
|
- Attribute
|
||||||
|
- AttributeRequest
|
||||||
|
- AttributeVal
|
||||||
|
- AttributeValRequest
|
||||||
|
- BackupWriteRequest
|
||||||
|
- BasicUser
|
||||||
|
- BasicUserRequest
|
||||||
|
- ChunkType
|
||||||
|
- CloudStorageRead
|
||||||
|
- CloudStorageWriteRequest
|
||||||
|
- CommentRead
|
||||||
|
- CommentReadOwner
|
||||||
|
- CommentWriteRequest
|
||||||
|
- CredentialsTypeEnum
|
||||||
|
- DataMetaRead
|
||||||
|
- DataRequest
|
||||||
|
- DatasetFileRequest
|
||||||
|
- DatasetFormat
|
||||||
|
- DatasetFormats
|
||||||
|
- DatasetWriteRequest
|
||||||
|
- Exception
|
||||||
|
- ExceptionRequest
|
||||||
|
- FileInfo
|
||||||
|
- FileInfoTypeEnum
|
||||||
|
- FrameMeta
|
||||||
|
- InputTypeEnum
|
||||||
|
- InvitationRead
|
||||||
|
- InvitationWrite
|
||||||
|
- InvitationWriteRequest
|
||||||
|
- IssueRead
|
||||||
|
- IssueWriteRequest
|
||||||
|
- JobAnnotationsUpdateRequest
|
||||||
|
- JobCommit
|
||||||
|
- JobRead
|
||||||
|
- JobStage
|
||||||
|
- JobStatus
|
||||||
|
- Label
|
||||||
|
- LabeledData
|
||||||
|
- LabeledDataRequest
|
||||||
|
- LabeledImage
|
||||||
|
- LabeledImageRequest
|
||||||
|
- LabeledShape
|
||||||
|
- LabeledShapeRequest
|
||||||
|
- LabeledTrack
|
||||||
|
- LabeledTrackRequest
|
||||||
|
- LocationEnum
|
||||||
|
- LogEvent
|
||||||
|
- LogEventRequest
|
||||||
|
- LoginRequest
|
||||||
|
- Manifest
|
||||||
|
- ManifestRequest
|
||||||
|
- MembershipRead
|
||||||
|
- MembershipWrite
|
||||||
|
- MetaUser
|
||||||
|
- OperationStatus
|
||||||
|
- OrganizationRead
|
||||||
|
- OrganizationWrite
|
||||||
|
- OrganizationWriteRequest
|
||||||
|
- PaginatedCloudStorageReadList
|
||||||
|
- PaginatedCommentReadList
|
||||||
|
- PaginatedInvitationReadList
|
||||||
|
- PaginatedIssueReadList
|
||||||
|
- PaginatedJobCommitList
|
||||||
|
- PaginatedJobReadList
|
||||||
|
- PaginatedMembershipReadList
|
||||||
|
- PaginatedMetaUserList
|
||||||
|
- PaginatedPolymorphicProjectList
|
||||||
|
- PaginatedTaskReadList
|
||||||
|
- PasswordChangeRequest
|
||||||
|
- PasswordResetConfirmRequest
|
||||||
|
- PasswordResetSerializerExRequest
|
||||||
|
- PatchedCloudStorageWriteRequest
|
||||||
|
- PatchedCommentWriteRequest
|
||||||
|
- PatchedDataMetaWriteRequest
|
||||||
|
- PatchedInvitationWriteRequest
|
||||||
|
- PatchedIssueWriteRequest
|
||||||
|
- PatchedJobWriteRequest
|
||||||
|
- PatchedLabelRequest
|
||||||
|
- PatchedLabeledDataRequest
|
||||||
|
- PatchedMembershipWriteRequest
|
||||||
|
- PatchedOrganizationWriteRequest
|
||||||
|
- PatchedProjectWriteRequest
|
||||||
|
- PatchedProjectWriteRequestTargetStorage
|
||||||
|
- PatchedTaskWriteRequest
|
||||||
|
- PatchedTaskWriteRequestTargetStorage
|
||||||
|
- PatchedUserRequest
|
||||||
|
- Plugins
|
||||||
|
- PolymorphicProject
|
||||||
|
- ProjectFileRequest
|
||||||
|
- ProjectRead
|
||||||
|
- ProjectReadAssignee
|
||||||
|
- ProjectReadOwner
|
||||||
|
- ProjectReadTargetStorage
|
||||||
|
- ProjectSearch
|
||||||
|
- ProjectWriteRequest
|
||||||
|
- ProviderTypeEnum
|
||||||
|
- RestAuthDetail
|
||||||
|
- RestrictedRegister
|
||||||
|
- RestrictedRegisterRequest
|
||||||
|
- RoleEnum
|
||||||
|
- RqStatus
|
||||||
|
- RqStatusStateEnum
|
||||||
|
- Segment
|
||||||
|
- ShapeType
|
||||||
|
- SigningRequest
|
||||||
|
- SimpleJob
|
||||||
|
- SortingMethod
|
||||||
|
- Storage
|
||||||
|
- StorageMethod
|
||||||
|
- StorageRequest
|
||||||
|
- StorageType
|
||||||
|
- SubLabeledShape
|
||||||
|
- SubLabeledShapeRequest
|
||||||
|
- SubLabeledTrack
|
||||||
|
- SubLabeledTrackRequest
|
||||||
|
- Sublabel
|
||||||
|
- SublabelRequest
|
||||||
|
- TaskAnnotationsUpdateRequest
|
||||||
|
- TaskAnnotationsWriteRequest
|
||||||
|
- TaskFileRequest
|
||||||
|
- TaskRead
|
||||||
|
- TaskReadTargetStorage
|
||||||
|
- TaskWriteRequest
|
||||||
|
- Token
|
||||||
|
- TrackedShape
|
||||||
|
- TrackedShapeRequest
|
||||||
|
- User
|
||||||
|
- UserAgreement
|
||||||
|
- UserAgreementRequest
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.1 MiB |
@ -0,0 +1,3 @@
|
|||||||
|
gitpython
|
||||||
|
packaging
|
||||||
|
toml
|
||||||
Loading…
Reference in New Issue