synapse-sdk 1.0.0a82__py3-none-any.whl → 1.0.0a84__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 synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +17 -8
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +9 -1
- synapse_sdk/utils/converters/coco/to_dm.py +3 -3
- synapse_sdk/utils/storage/providers/__init__.py +120 -9
- synapse_sdk/utils/storage/providers/file_system.py +126 -0
- synapse_sdk/utils/storage/registry.py +2 -0
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/METADATA +1 -1
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/RECORD +12 -11
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/WHEEL +0 -0
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a82.dist-info → synapse_sdk-1.0.0a84.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from datetime import datetime
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Annotated, Any, Dict, List, Optional
|
|
4
|
+
from typing import Annotated, Any, Dict, List, Optional, Tuple
|
|
5
5
|
|
|
6
6
|
import requests
|
|
7
7
|
from pydantic import AfterValidator, BaseModel, field_validator
|
|
@@ -382,7 +382,7 @@ class ToTaskAction(Action):
|
|
|
382
382
|
data_file = files.get(target_specification_name)
|
|
383
383
|
|
|
384
384
|
# Extract primary file URL from task data
|
|
385
|
-
primary_file_url = self._extract_primary_file_url(task)
|
|
385
|
+
primary_file_url, primary_file_original_name = self._extract_primary_file_url(task)
|
|
386
386
|
if not primary_file_url:
|
|
387
387
|
error_msg = 'Primary image URL not found in task data'
|
|
388
388
|
self.run.log_message(f'{error_msg} for task {task_id}')
|
|
@@ -396,6 +396,13 @@ class ToTaskAction(Action):
|
|
|
396
396
|
return {'success': False, 'error': error_msg}
|
|
397
397
|
|
|
398
398
|
data_file_url = data_file.get('url')
|
|
399
|
+
data_file_original_name = data_file.get('file_name_original')
|
|
400
|
+
if not data_file_original_name:
|
|
401
|
+
error_msg = 'File original name not found'
|
|
402
|
+
self.run.log_message(f'{error_msg} for task {task_id}')
|
|
403
|
+
self.run.log_annotate_task_data({'task_id': task_id, 'error': error_msg}, AnnotateTaskDataStatus.FAILED)
|
|
404
|
+
return {'success': False, 'error': error_msg}
|
|
405
|
+
|
|
399
406
|
if not data_file_url:
|
|
400
407
|
error_msg = 'URL not found'
|
|
401
408
|
self.run.log_message(f'{error_msg} for task {task_id}')
|
|
@@ -406,7 +413,9 @@ class ToTaskAction(Action):
|
|
|
406
413
|
try:
|
|
407
414
|
# Convert data to task object
|
|
408
415
|
annotation_to_task = self.entrypoint(self.run)
|
|
409
|
-
converted_data = annotation_to_task.convert_data_from_file(
|
|
416
|
+
converted_data = annotation_to_task.convert_data_from_file(
|
|
417
|
+
primary_file_url, primary_file_original_name, data_file_url, data_file_original_name
|
|
418
|
+
)
|
|
410
419
|
except requests.RequestException as e:
|
|
411
420
|
error_msg = f'Failed to fetch data from URL: {str(e)}'
|
|
412
421
|
self.run.log_message(f'{error_msg} for task {task_id}')
|
|
@@ -467,7 +476,7 @@ class ToTaskAction(Action):
|
|
|
467
476
|
return pre_processor_status
|
|
468
477
|
|
|
469
478
|
# Extract primary file URL from task data
|
|
470
|
-
primary_file_url = self._extract_primary_file_url(task)
|
|
479
|
+
primary_file_url, _ = self._extract_primary_file_url(task)
|
|
471
480
|
if not primary_file_url:
|
|
472
481
|
error_msg = 'Primary image URL not found in task data'
|
|
473
482
|
self.run.log_message(f'{error_msg} for task {task_id}')
|
|
@@ -609,23 +618,23 @@ class ToTaskAction(Action):
|
|
|
609
618
|
except Exception as e:
|
|
610
619
|
return {'success': False, 'error': f'Failed to restart pre-processor: {str(e)}'}
|
|
611
620
|
|
|
612
|
-
def _extract_primary_file_url(self, task: Dict[str, Any]) ->
|
|
621
|
+
def _extract_primary_file_url(self, task: Dict[str, Any]) -> Tuple[str, str]:
|
|
613
622
|
"""Extract the primary file URL from task data.
|
|
614
623
|
|
|
615
624
|
Args:
|
|
616
625
|
task (Dict[str, Any]): The task data.
|
|
617
626
|
|
|
618
627
|
Returns:
|
|
619
|
-
|
|
628
|
+
Tuple[str, str]: The primary file URL and original name.
|
|
620
629
|
"""
|
|
621
630
|
data_unit = task.get('data_unit', {})
|
|
622
631
|
files = data_unit.get('files', {})
|
|
623
632
|
|
|
624
633
|
for file_info in files.values():
|
|
625
634
|
if isinstance(file_info, dict) and file_info.get('is_primary') and file_info.get('url'):
|
|
626
|
-
return file_info['url']
|
|
635
|
+
return file_info['url'], file_info['file_name_original']
|
|
627
636
|
|
|
628
|
-
return None
|
|
637
|
+
return None, None
|
|
629
638
|
|
|
630
639
|
def _run_inference(
|
|
631
640
|
self, client: BackendClient, pre_processor_code: str, pre_processor_version: str, primary_file_url: str
|
|
@@ -7,12 +7,20 @@ class AnnotationToTask:
|
|
|
7
7
|
"""
|
|
8
8
|
self.run = run
|
|
9
9
|
|
|
10
|
-
def convert_data_from_file(
|
|
10
|
+
def convert_data_from_file(
|
|
11
|
+
self,
|
|
12
|
+
primary_file_url: str,
|
|
13
|
+
primary_file_original_name: str,
|
|
14
|
+
data_file_url: str,
|
|
15
|
+
data_file_original_name: str,
|
|
16
|
+
) -> dict:
|
|
11
17
|
"""Convert the data from a file to a task object.
|
|
12
18
|
|
|
13
19
|
Args:
|
|
14
20
|
primary_file_url (str): primary file url.
|
|
21
|
+
primary_file_original_name (str): primary file original name.
|
|
15
22
|
data_file_url (str): data file url.
|
|
23
|
+
data_file_original_name (str): data file original name.
|
|
16
24
|
|
|
17
25
|
Returns:
|
|
18
26
|
dict: The converted data.
|
|
@@ -116,12 +116,13 @@ class COCOToDMConverter(ToDMConverter):
|
|
|
116
116
|
result[img_filename] = (dm_json, img_path)
|
|
117
117
|
return result
|
|
118
118
|
|
|
119
|
-
def convert_single_file(self, data: Dict[str, Any], original_file: IO) -> Dict[str, Any]:
|
|
119
|
+
def convert_single_file(self, data: Dict[str, Any], original_file: IO, original_image_name: str) -> Dict[str, Any]:
|
|
120
120
|
"""Convert a single COCO annotation data and corresponding image to DM format.
|
|
121
121
|
|
|
122
122
|
Args:
|
|
123
123
|
data: COCO format data dictionary (JSON content)
|
|
124
124
|
original_file: File object for the corresponding original image
|
|
125
|
+
original_image_name: Original image name
|
|
125
126
|
|
|
126
127
|
Returns:
|
|
127
128
|
Dictionary containing DM format data for the single file
|
|
@@ -147,7 +148,7 @@ class COCOToDMConverter(ToDMConverter):
|
|
|
147
148
|
matched_img = None
|
|
148
149
|
for img in images:
|
|
149
150
|
for key in ['file_name', 'filename', 'name']:
|
|
150
|
-
if key in img and os.path.basename(img[key]) ==
|
|
151
|
+
if key in img and os.path.basename(img[key]) == original_image_name:
|
|
151
152
|
matched_img = img
|
|
152
153
|
break
|
|
153
154
|
if matched_img:
|
|
@@ -157,7 +158,6 @@ class COCOToDMConverter(ToDMConverter):
|
|
|
157
158
|
raise ValueError(f'No matching image found in COCO data for file: {img_basename}')
|
|
158
159
|
|
|
159
160
|
img_id = matched_img['id']
|
|
160
|
-
print('img_id : ', img_id)
|
|
161
161
|
cat_map = {cat['id']: cat for cat in categories}
|
|
162
162
|
anns = [ann for ann in annotations if ann['image_id'] == img_id]
|
|
163
163
|
|
|
@@ -2,11 +2,52 @@ from urllib.parse import parse_qs, urlparse
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class BaseStorage:
|
|
5
|
+
"""Base storage provider class for all storage implementations.
|
|
6
|
+
|
|
7
|
+
This is an abstract base class that defines the interface for storage providers.
|
|
8
|
+
All storage providers (S3, GCP, SFTP, HTTP, FileSystem) must inherit from this
|
|
9
|
+
class and implement all the abstract methods.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
connection_params (str | dict): The connection parameters. Can be either:
|
|
13
|
+
- A URL string (e.g., 's3://bucket/path?access_key=key&secret_key=secret')
|
|
14
|
+
- A dict with 'provider' and 'configuration' keys
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
url: Parsed URL object if connection_params was a string
|
|
18
|
+
base_path: Base path for storage operations (provider-specific)
|
|
19
|
+
options: Storage-specific options
|
|
20
|
+
query_params: Parsed query parameters from URL or configuration dict
|
|
21
|
+
OPTION_CASTS: Dictionary mapping option names to type casting functions
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
>>> # URL-based initialization
|
|
25
|
+
>>> storage = SomeStorage('s3://bucket/path?access_key=key&secret_key=secret')
|
|
26
|
+
>>>
|
|
27
|
+
>>> # Dict-based initialization
|
|
28
|
+
>>> config = {
|
|
29
|
+
... 'provider': 's3',
|
|
30
|
+
... 'configuration': {
|
|
31
|
+
... 'bucket_name': 'my-bucket',
|
|
32
|
+
... 'access_key': 'key',
|
|
33
|
+
... 'secret_key': 'secret'
|
|
34
|
+
... }
|
|
35
|
+
... }
|
|
36
|
+
>>> storage = SomeStorage(config)
|
|
37
|
+
"""
|
|
38
|
+
|
|
5
39
|
url = None
|
|
6
40
|
options = None
|
|
7
41
|
OPTION_CASTS = {}
|
|
8
42
|
|
|
9
43
|
def __init__(self, connection_params: str | dict):
|
|
44
|
+
"""Initialize the storage provider with connection parameters.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
connection_params (str | dict): Connection parameters for the storage provider.
|
|
48
|
+
If string, should be a valid URL with scheme and query parameters.
|
|
49
|
+
If dict, should contain 'provider' and 'configuration' keys.
|
|
50
|
+
"""
|
|
10
51
|
self.url = None
|
|
11
52
|
|
|
12
53
|
if isinstance(connection_params, dict):
|
|
@@ -16,6 +57,15 @@ class BaseStorage:
|
|
|
16
57
|
self.query_params = self.url_querystring_to_dict()
|
|
17
58
|
|
|
18
59
|
def url_querystring_to_dict(self):
|
|
60
|
+
"""Parse URL query string into a dictionary with proper type casting.
|
|
61
|
+
|
|
62
|
+
Converts query parameters from the URL into a dictionary, applying
|
|
63
|
+
type casting based on OPTION_CASTS mapping. Single-value lists are
|
|
64
|
+
flattened to scalar values.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
dict: Parsed and type-cast query parameters.
|
|
68
|
+
"""
|
|
19
69
|
query_string = self.url.query
|
|
20
70
|
|
|
21
71
|
query_dict = parse_qs(query_string)
|
|
@@ -30,43 +80,104 @@ class BaseStorage:
|
|
|
30
80
|
}
|
|
31
81
|
|
|
32
82
|
def upload(self, source, target):
|
|
83
|
+
"""Upload a file from source to target location.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
source (str): Path to the source file on local filesystem.
|
|
87
|
+
target (str): Target path in the storage provider.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
str: URL or identifier of the uploaded file.
|
|
91
|
+
|
|
92
|
+
Raises:
|
|
93
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
94
|
+
"""
|
|
33
95
|
raise NotImplementedError
|
|
34
96
|
|
|
35
97
|
def exists(self, target):
|
|
98
|
+
"""Check if a file exists at the target location.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
target (str): Target path in the storage provider.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
bool: True if the file exists, False otherwise.
|
|
105
|
+
|
|
106
|
+
Raises:
|
|
107
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
108
|
+
"""
|
|
36
109
|
raise NotImplementedError
|
|
37
110
|
|
|
38
111
|
def get_url(self, target):
|
|
112
|
+
"""Get the URL for accessing a file at the target location.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
target (str): Target path in the storage provider.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
str: URL that can be used to access the file.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
122
|
+
"""
|
|
39
123
|
raise NotImplementedError
|
|
40
124
|
|
|
41
125
|
def get_pathlib(self, path):
|
|
42
|
-
"""Get the path as a pathlib object.
|
|
126
|
+
"""Get the path as a pathlib-compatible object.
|
|
43
127
|
|
|
44
128
|
Args:
|
|
45
|
-
path (str): The path to convert.
|
|
129
|
+
path (str): The path to convert, relative to the storage root.
|
|
46
130
|
|
|
47
131
|
Returns:
|
|
48
|
-
pathlib.Path:
|
|
132
|
+
pathlib.Path or UPath: A pathlib-compatible object representing the path.
|
|
133
|
+
The exact type depends on the storage provider implementation.
|
|
134
|
+
|
|
135
|
+
Raises:
|
|
136
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
137
|
+
|
|
138
|
+
Note:
|
|
139
|
+
Different storage providers may return different path object types:
|
|
140
|
+
- FileSystemStorage returns pathlib.Path objects
|
|
141
|
+
- Cloud storage providers typically return UPath objects
|
|
49
142
|
"""
|
|
50
143
|
raise NotImplementedError
|
|
51
144
|
|
|
52
145
|
def get_path_file_count(self, pathlib_obj):
|
|
53
|
-
"""Get the
|
|
146
|
+
"""Get the total number of files in the given path.
|
|
54
147
|
|
|
55
148
|
Args:
|
|
56
|
-
pathlib_obj (UPath): The path to
|
|
149
|
+
pathlib_obj (Path | UPath): The path object to count files in.
|
|
150
|
+
Should be obtained from get_pathlib().
|
|
57
151
|
|
|
58
152
|
Returns:
|
|
59
|
-
int: The
|
|
153
|
+
int: The total number of files found recursively in the path.
|
|
154
|
+
Returns 1 for individual files, 0 for non-existent paths.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
158
|
+
|
|
159
|
+
Note:
|
|
160
|
+
This method counts files recursively, including files in subdirectories.
|
|
161
|
+
Directories themselves are not counted, only regular files.
|
|
60
162
|
"""
|
|
61
163
|
raise NotImplementedError
|
|
62
164
|
|
|
63
165
|
def get_path_total_size(self, pathlib_obj):
|
|
64
|
-
"""Get the total size of the path.
|
|
166
|
+
"""Get the total size of all files in the given path.
|
|
65
167
|
|
|
66
168
|
Args:
|
|
67
|
-
pathlib_obj (UPath): The path to
|
|
169
|
+
pathlib_obj (Path | UPath): The path object to calculate size for.
|
|
170
|
+
Should be obtained from get_pathlib().
|
|
68
171
|
|
|
69
172
|
Returns:
|
|
70
|
-
int: The total size of the path.
|
|
173
|
+
int: The total size in bytes of all files found recursively in the path.
|
|
174
|
+
Returns the file size for individual files, 0 for non-existent paths.
|
|
175
|
+
|
|
176
|
+
Raises:
|
|
177
|
+
NotImplementedError: This method must be implemented by subclasses.
|
|
178
|
+
|
|
179
|
+
Note:
|
|
180
|
+
This method calculates the total size recursively, including files
|
|
181
|
+
in subdirectories. Only regular files contribute to the total size.
|
|
71
182
|
"""
|
|
72
183
|
raise NotImplementedError
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from synapse_sdk.utils.storage.providers import BaseStorage
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class FileSystemStorage(BaseStorage):
|
|
8
|
+
"""Storage provider for file system.
|
|
9
|
+
|
|
10
|
+
* This storage do not support url based initialization.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
url (str): The URL of the storage provider.
|
|
14
|
+
|
|
15
|
+
Examples:
|
|
16
|
+
>>> # Dict-based initialization
|
|
17
|
+
>>> config = {
|
|
18
|
+
... 'provider': 'filesystem',
|
|
19
|
+
... 'configuration': {
|
|
20
|
+
... 'location': '/data'
|
|
21
|
+
... }
|
|
22
|
+
... }
|
|
23
|
+
>>> storage = FileSystemStorage(config)
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, url):
|
|
27
|
+
super().__init__(url)
|
|
28
|
+
self.base_path = Path(self.query_params['location'])
|
|
29
|
+
|
|
30
|
+
def upload(self, source, target):
|
|
31
|
+
"""Upload a file from source to target location.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
source (str): Path to source file
|
|
35
|
+
target (str): Target path relative to base path
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
str: URL of uploaded file
|
|
39
|
+
"""
|
|
40
|
+
source_path = Path(source)
|
|
41
|
+
target_path = self.base_path / target
|
|
42
|
+
|
|
43
|
+
# Create parent directories if they don't exist
|
|
44
|
+
target_path.parent.mkdir(parents=True, exist_ok=True)
|
|
45
|
+
|
|
46
|
+
# Copy the file
|
|
47
|
+
shutil.copy2(source_path, target_path)
|
|
48
|
+
|
|
49
|
+
return self.get_url(target)
|
|
50
|
+
|
|
51
|
+
def exists(self, target):
|
|
52
|
+
"""Check if target file exists.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
target (str): Target path relative to base path
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
bool: True if file exists, False otherwise
|
|
59
|
+
"""
|
|
60
|
+
target_path = self.base_path / target
|
|
61
|
+
return target_path.exists()
|
|
62
|
+
|
|
63
|
+
def get_url(self, target):
|
|
64
|
+
"""Get URL for target file.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
target (str): Target path relative to base path
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
str: File URL
|
|
71
|
+
"""
|
|
72
|
+
target_path = self.base_path / target
|
|
73
|
+
return f'file://{target_path.absolute()}'
|
|
74
|
+
|
|
75
|
+
def get_pathlib(self, path):
|
|
76
|
+
"""Get the path as a pathlib object.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
path (str): The path to convert.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
pathlib.Path: The converted path.
|
|
83
|
+
"""
|
|
84
|
+
return self.base_path / path
|
|
85
|
+
|
|
86
|
+
def get_path_file_count(self, pathlib_obj):
|
|
87
|
+
"""Get the file count in the path.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
pathlib_obj (Path): The path to get file count.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
int: The file count in the path.
|
|
94
|
+
"""
|
|
95
|
+
if not pathlib_obj.exists():
|
|
96
|
+
return 0
|
|
97
|
+
|
|
98
|
+
if pathlib_obj.is_file():
|
|
99
|
+
return 1
|
|
100
|
+
|
|
101
|
+
count = 0
|
|
102
|
+
for item in pathlib_obj.rglob('*'):
|
|
103
|
+
if item.is_file():
|
|
104
|
+
count += 1
|
|
105
|
+
return count
|
|
106
|
+
|
|
107
|
+
def get_path_total_size(self, pathlib_obj):
|
|
108
|
+
"""Get the total size of the path.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
pathlib_obj (Path): The path to get total size.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
int: The total size of the path.
|
|
115
|
+
"""
|
|
116
|
+
if not pathlib_obj.exists():
|
|
117
|
+
return 0
|
|
118
|
+
|
|
119
|
+
if pathlib_obj.is_file():
|
|
120
|
+
return pathlib_obj.stat().st_size
|
|
121
|
+
|
|
122
|
+
total_size = 0
|
|
123
|
+
for item in pathlib_obj.rglob('*'):
|
|
124
|
+
if item.is_file():
|
|
125
|
+
total_size += item.stat().st_size
|
|
126
|
+
return total_size
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from synapse_sdk.utils.storage.providers.file_system import FileSystemStorage
|
|
1
2
|
from synapse_sdk.utils.storage.providers.gcp import GCPStorage
|
|
2
3
|
from synapse_sdk.utils.storage.providers.http import HTTPStorage
|
|
3
4
|
from synapse_sdk.utils.storage.providers.s3 import S3Storage
|
|
@@ -12,4 +13,5 @@ STORAGE_PROVIDERS = {
|
|
|
12
13
|
'sftp': SFTPStorage,
|
|
13
14
|
'http': HTTPStorage,
|
|
14
15
|
'https': HTTPStorage,
|
|
16
|
+
'file_system': FileSystemStorage,
|
|
15
17
|
}
|
|
@@ -152,11 +152,11 @@ synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.
|
|
|
152
152
|
synapse_sdk/plugins/categories/pre_annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
153
153
|
synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
154
|
synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py,sha256=6ib3RmnGrjpsQ0e_G-mRH1lfFunQ3gh2M831vuDn7HU,344
|
|
155
|
-
synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py,sha256=
|
|
155
|
+
synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py,sha256=otUpG2TfDPMyigFFe0GuqPc2myh9hZC1iBzx-L7QMio,32138
|
|
156
156
|
synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml,sha256=VREoCp9wsvZ8T2E1d_MEKlR8TC_herDJGVQtu3ezAYU,589
|
|
157
157
|
synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
158
158
|
synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py,sha256=HBHxHuv2gMBzDB2alFfrzI_SZ1Ztk6mo7eFbR5GqHKw,106
|
|
159
|
-
synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py,sha256=
|
|
159
|
+
synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py,sha256=LfM3pWfBYZfTJjpCDq89eo--uAKi-sgs8PWkilj31tI,1135
|
|
160
160
|
synapse_sdk/plugins/categories/smart_tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
161
161
|
synapse_sdk/plugins/categories/smart_tool/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
162
162
|
synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py,sha256=fHiqA8ntmzjs2GMVMuByR7Clh2zhLie8OPF9B8OmwxM,1279
|
|
@@ -199,7 +199,7 @@ synapse_sdk/utils/string.py,sha256=rEwuZ9SAaZLcQ8TYiwNKr1h2u4CfnrQx7SUL8NWmChg,2
|
|
|
199
199
|
synapse_sdk/utils/converters/__init__.py,sha256=xQi_n7xS9BNyDiolsxH2jw1CtD6avxMPj2cHnwvidi8,11311
|
|
200
200
|
synapse_sdk/utils/converters/coco/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
201
201
|
synapse_sdk/utils/converters/coco/from_dm.py,sha256=B9zvb8Kph9haYLVIZhzneWiHCImFbuWqAaE7g6Nk0lI,11365
|
|
202
|
-
synapse_sdk/utils/converters/coco/to_dm.py,sha256=
|
|
202
|
+
synapse_sdk/utils/converters/coco/to_dm.py,sha256=SOzzACYlK0vJE6SIpmFwMUV1ZbdmsQ_t5mceG0SQahE,9105
|
|
203
203
|
synapse_sdk/utils/converters/dm/__init__.py,sha256=_B6w814bMPhisNCNlSPEiQOs9RH0EZHQqd89LnVhD1U,1983
|
|
204
204
|
synapse_sdk/utils/converters/dm/from_v1.py,sha256=4BG_NA_7YdW5rI1F8LCFg39M-IJZVfRgi2b9FBxTAmw,26059
|
|
205
205
|
synapse_sdk/utils/converters/dm/to_v1.py,sha256=A123zAR_dLqEW83BgAl5_J1ACstjZWTHivlW5qvOu_E,13432
|
|
@@ -214,15 +214,16 @@ synapse_sdk/utils/pydantic/config.py,sha256=1vYOcUI35GslfD1rrqhFkNXXJOXt4IDqOPSx
|
|
|
214
214
|
synapse_sdk/utils/pydantic/errors.py,sha256=0v0T12eQBr1KrFiEOBu6KMaPK4aPEGEC6etPJGoR5b4,1061
|
|
215
215
|
synapse_sdk/utils/pydantic/validators.py,sha256=G47P8ObPhsePmd_QZDK8EdPnik2CbaYzr_N4Z6En8dc,193
|
|
216
216
|
synapse_sdk/utils/storage/__init__.py,sha256=HmZHqvoV-EogV2bE-Sw5XQRlrNuf3gfNL9irAJeRYsA,2195
|
|
217
|
-
synapse_sdk/utils/storage/registry.py,sha256
|
|
218
|
-
synapse_sdk/utils/storage/providers/__init__.py,sha256=
|
|
217
|
+
synapse_sdk/utils/storage/registry.py,sha256=-VNIM7wERubomcyXMuAlPPRKyy87kVpkRAsdlBRp2ig,589
|
|
218
|
+
synapse_sdk/utils/storage/providers/__init__.py,sha256=crxrRzXXfBAmyR4nZS2RZvlLnr4IP1S-6eYeX_bSnLI,6412
|
|
219
|
+
synapse_sdk/utils/storage/providers/file_system.py,sha256=MBBXxWRgVSDtjP4T0L0sbaZkXEI4B8ANtLweaMWtaaQ,3217
|
|
219
220
|
synapse_sdk/utils/storage/providers/gcp.py,sha256=i2BQCu1Kej1If9SuNr2_lEyTcr5M_ncGITZrL0u5wEA,363
|
|
220
221
|
synapse_sdk/utils/storage/providers/http.py,sha256=2DhIulND47JOnS5ZY7MZUex7Su3peAPksGo1Wwg07L4,5828
|
|
221
222
|
synapse_sdk/utils/storage/providers/s3.py,sha256=ZmqekAvIgcQBdRU-QVJYv1Rlp6VHfXwtbtjTSphua94,2573
|
|
222
223
|
synapse_sdk/utils/storage/providers/sftp.py,sha256=_8s9hf0JXIO21gvm-JVS00FbLsbtvly4c-ETLRax68A,1426
|
|
223
|
-
synapse_sdk-1.0.
|
|
224
|
-
synapse_sdk-1.0.
|
|
225
|
-
synapse_sdk-1.0.
|
|
226
|
-
synapse_sdk-1.0.
|
|
227
|
-
synapse_sdk-1.0.
|
|
228
|
-
synapse_sdk-1.0.
|
|
224
|
+
synapse_sdk-1.0.0a84.dist-info/licenses/LICENSE,sha256=bKzmC5YAg4V1Fhl8OO_tqY8j62hgdncAkN7VrdjmrGk,1101
|
|
225
|
+
synapse_sdk-1.0.0a84.dist-info/METADATA,sha256=TQr3AWnKuEIisWrMC0URwIn64lxJgnYVYimuUtoIp7E,3805
|
|
226
|
+
synapse_sdk-1.0.0a84.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
227
|
+
synapse_sdk-1.0.0a84.dist-info/entry_points.txt,sha256=VNptJoGoNJI8yLXfBmhgUefMsmGI0m3-0YoMvrOgbxo,48
|
|
228
|
+
synapse_sdk-1.0.0a84.dist-info/top_level.txt,sha256=ytgJMRK1slVOKUpgcw3LEyHHP7S34J6n_gJzdkcSsw8,12
|
|
229
|
+
synapse_sdk-1.0.0a84.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|