Metadata-Version: 2.4
Name: EXACT-Sync
Version: 0.0.41
Summary: A package to download images and annotations from the EXACT Server https://github.com/DeepMicroscopy/Exact
Home-page: https://github.com/DeepMicroscopy/EXACT-Sync
Author: Christian Marzahl, Marc Aubreville
Author-email: marc.aubreville@hs-flensburg.de
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: requests
Requires-Dist: tqdm
Requires-Dist: requests-toolbelt
Requires-Dist: pillow
Requires-Dist: locust==1.1.0
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# EXACT-Sync

[![PyPI version fury.io](https://badge.fury.io/py/EXACT-Sync.svg)](https://pypi.python.org/pypi/EXACT-Sync/)
[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://lbesson.mit-license.org/)



Rest API sync with the EXACT Server https://github.com/ChristianMarzahl/Exact

[Browsable-API](https://documenter.getpostman.com/view/11308910/TVYF6xZo)

## Example Notebooks

In the folder examples

## Pip

pip install EXACT-Sync

## Tests

with a lot of implementation examples
/exact_sync/v1/test


### Basic features:

#### Connect to server

```python
configuration = Configuration()
configuration.username = 'exact'
configuration.password = 'exact'
configuration.host = "http://127.0.0.1:8000"

client = ApiClient(configuration)

image_sets_api = ImageSetsApi(client)
annotations_api = AnnotationsApi(client)
annotation_types_api = AnnotationTypesApi(client)
images_api = ImagesApi(client)
product_api = ProductsApi(client)
team_api = TeamsApi(client)
```

Authentication by token:

```python
configuration = Configuration()
configuration.token = 'pat_....<your token here>'
configuration.host = "http://127.0.0.1:8000"

client = ApiClient(configuration)
image_sets_api = ImageSetsApi(client)
```


#### Get image set information
```python
image_sets = image_sets_api.list_image_sets(name="cluster_asthma_imageset")
image_sets
```

#### Upload image to image set

```python
image_type = int(Image.ImageSourceTypes.DEFAULT)
image = images_api.create_image(file_path=target_file, image_type=image_type, image_set=image_set.id).results[0]
```

##### Donwload image from image set

```python
images_api.download_image(id=image_id, target_path=image_path, original_image=True)
```

#### Download image annotations 

```python
annotations_api.list_annotations(pagination=False, async_req=True, image=image.id)
```

#### Get a snapshot centered on a coordinate

```python
snapshot = images_api.get_snapshot(image_source=image.id, x=1000, y=1000, size_x=512, size_y=512)
snapshot.save('snapshot.png')
```

#### Automatic retries on gateway errors

All API objects retry requests that fail with a transient gateway error (HTTP 502, 503 or 504)
using exponential backoff (0.5s, 1s, 2s, ... up to 5 attempts). Retrying is enabled by default
and works for synchronous and `async_req=True` calls.

```python
images_api = ImagesApi(client)                 # retries enabled (default)
images_api = ImagesApi(client, retry=False)    # retries disabled
images_api.retry = False                       # or toggle later

# optional tuning, per instance or per class
images_api.retry_max_attempts = 3
images_api.retry_backoff = 1.0
images_api.retry_statuses = (502,)
```

Note: non-idempotent requests (e.g. `create_*`) are retried as well, so in rare cases a
request that the server already processed could be executed twice.
