Various improvements to the SDK generation process (#5678)
parent
89f403b7e2
commit
87f07fd391
@ -1,40 +0,0 @@
|
|||||||
# OpenAPI Generator Ignore
|
|
||||||
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
|
|
||||||
|
|
||||||
# Use this file to prevent files from being overwritten by the generator.
|
|
||||||
# The patterns follow closely to .gitignore or .dockerignore.
|
|
||||||
|
|
||||||
# As an example, the C# client generator defines ApiClient.cs.
|
|
||||||
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
|
|
||||||
#ApiClient.cs
|
|
||||||
|
|
||||||
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
|
|
||||||
#foo/*/qux
|
|
||||||
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
|
|
||||||
|
|
||||||
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
|
|
||||||
#foo/**/qux
|
|
||||||
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
|
|
||||||
|
|
||||||
# You can also negate patterns with an exclamation (!).
|
|
||||||
# For example, you can ignore all files in a docs folder with the file extension .md:
|
|
||||||
#docs/*.md
|
|
||||||
# Then explicitly reverse the ignore rule for a single file:
|
|
||||||
#!docs/README.md
|
|
||||||
|
|
||||||
# For safety
|
|
||||||
/cvat_sdk/__init__.py
|
|
||||||
/config
|
|
||||||
/gen
|
|
||||||
/helpers.py
|
|
||||||
/utils.py
|
|
||||||
/types.py
|
|
||||||
|
|
||||||
# Don't generate these files
|
|
||||||
/git_push.sh
|
|
||||||
/setup.cfg
|
|
||||||
/test-requirements.txt
|
|
||||||
/tox.ini
|
|
||||||
/.gitlab-ci.yml
|
|
||||||
/.travis.yml
|
|
||||||
/.gitignore
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
# {{{projectName}}}
|
|
||||||
{{#appDescriptionWithNewLines}}
|
|
||||||
{{{.}}}
|
|
||||||
{{/appDescriptionWithNewLines}}
|
|
||||||
|
|
||||||
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
|
|
||||||
|
|
||||||
- API version: {{appVersion}}
|
|
||||||
- Package version: {{packageVersion}}
|
|
||||||
{{^hideGenerationTimestamp}}
|
|
||||||
- Build date: {{generatedDate}}
|
|
||||||
{{/hideGenerationTimestamp}}
|
|
||||||
- Build package: {{generatorClass}}
|
|
||||||
{{#infoUrl}}
|
|
||||||
For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
|
|
||||||
{{/infoUrl}}
|
|
||||||
|
|
||||||
## Installation & Usage
|
|
||||||
|
|
||||||
To install a prebuilt package, run the following command in the terminal:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
pip install cvat-sdk
|
|
||||||
```
|
|
||||||
|
|
||||||
To install from the local directory, follow [the developer guide](https://opencv.github.io/cvat/docs/api_sdk/sdk/developer_guide).
|
|
||||||
|
|
||||||
After installation you can import the package:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import cvat_sdk
|
|
||||||
```
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
{{> README_common }}
|
|
||||||
@ -1,176 +0,0 @@
|
|||||||
API includes 2 layers:
|
|
||||||
- REST API wrappers (`ApiClient`). Located in at `cvat_sdk.api_client`
|
|
||||||
- high-level tools (`core`). Located at `cvat_sdk.core`
|
|
||||||
|
|
||||||
### `ApiClient` (low level)
|
|
||||||
|
|
||||||
This layer 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.
|
|
||||||
|
|
||||||
#### 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="{{{basePath}}}",
|
|
||||||
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,
|
|
||||||
start_frame=2,
|
|
||||||
stop_frame=5,
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
### `Core` (high-level)
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
|
|
||||||
```python
|
|
||||||
from cvat_sdk import make_client, models
|
|
||||||
from cvat_sdk.core.proxies.tasks import ResourceType, Task
|
|
||||||
|
|
||||||
with make_client(host="{{{basePath}}}") 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()
|
|
||||||
```
|
|
||||||
|
|
||||||
## Available API Endpoints
|
|
||||||
|
|
||||||
All URIs are relative to _{{basePath}}_
|
|
||||||
|
|
||||||
Class | Method | HTTP request | Description
|
|
||||||
------------ | ------------- | ------------- | -------------
|
|
||||||
{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}_{{classname}}_ | [**{{>operation_name}}**](apis/{{classname}}#{{>operation_name}}) | **{{httpMethod}}** {{path}} | {{summary}}
|
|
||||||
{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
|
|
||||||
|
|
||||||
## Available Models
|
|
||||||
|
|
||||||
{{#models}}{{#model}} - {{{classname}}}
|
|
||||||
{{/model}}{{/models}}
|
|
||||||
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
{{#apiInfo}}{{#apis}}{{#-last}}{{infoEmail}}
|
|
||||||
{{/-last}}{{/apis}}{{/apiInfo}}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
VERSION = "{{packageVersion}}"
|
|
||||||
Loading…
Reference in New Issue