synapse-sdk 2025.9.1__py3-none-any.whl → 2025.9.4__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/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +368 -1
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/plugins/developing-upload-template.md +1463 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +161 -34
- synapse_sdk/devtools/docs/docs/plugins/upload-plugins.md +1497 -213
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +378 -11
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/developing-upload-template.md +1463 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +161 -34
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/upload-plugins.md +1752 -572
- synapse_sdk/devtools/docs/sidebars.ts +7 -0
- synapse_sdk/plugins/README.md +1 -2
- synapse_sdk/plugins/categories/base.py +7 -0
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +160 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +1 -1
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +1 -2
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +154 -531
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +143 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +66 -29
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +182 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +106 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +80 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +66 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +101 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +89 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +96 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +61 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +86 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +34 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +233 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +253 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/async_upload.py +109 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +43 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +45 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +194 -83
- synapse_sdk/plugins/categories/upload/templates/config.yaml +4 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +269 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +71 -27
- synapse_sdk/plugins/models.py +7 -0
- synapse_sdk/shared/__init__.py +21 -0
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/METADATA +2 -1
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/RECORD +79 -28
- synapse_sdk/plugins/categories/export/actions/export.py +0 -385
- synapse_sdk/plugins/categories/export/enums.py +0 -7
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/WHEEL +0 -0
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/top_level.txt +0 -0
synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md
CHANGED
|
@@ -47,43 +47,43 @@ classDiagram
|
|
|
47
47
|
+export_items: Generator
|
|
48
48
|
+path_root: Path
|
|
49
49
|
+params: dict
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
%% Main workflow methods
|
|
52
52
|
+export(export_items, results, **kwargs) dict
|
|
53
53
|
+process_data_conversion(export_item) object
|
|
54
54
|
+process_file_saving(...) bool
|
|
55
55
|
+setup_output_directories(path, flag) dict
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
%% Abstract methods (to be implemented)
|
|
58
58
|
+convert_data(data)* object
|
|
59
|
-
+before_convert(data)* object
|
|
59
|
+
+before_convert(data)* object
|
|
60
60
|
+after_convert(data)* object
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
%% File operations
|
|
63
63
|
+save_original_file(result, path, errors) ExportStatus
|
|
64
64
|
+save_as_json(result, path, errors) ExportStatus
|
|
65
65
|
+get_original_file_name(files) str
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
%% Helper methods
|
|
68
68
|
-_create_unique_export_path(name) Path
|
|
69
69
|
-_save_error_list(path, json_errors, file_errors)
|
|
70
70
|
-_process_original_file_saving(...) bool
|
|
71
71
|
-_process_json_file_saving(...) bool
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
class Exporter {
|
|
75
75
|
%% Inherited from BaseExporter
|
|
76
76
|
+export(export_items, results, **kwargs) dict
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
%% Implemented abstract methods
|
|
79
79
|
+convert_data(data) object
|
|
80
80
|
+before_convert(data) object
|
|
81
81
|
+after_convert(data) object
|
|
82
82
|
}
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
%% Inheritance relationship
|
|
85
85
|
BaseExporter <|-- Exporter
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
%% Apply styles
|
|
88
88
|
class BaseExporter baseClass
|
|
89
89
|
class Exporter childClass
|
|
@@ -99,44 +99,44 @@ flowchart TD
|
|
|
99
99
|
A[export 메서드 호출] --> B[경로와 메트릭 초기화]
|
|
100
100
|
B --> C[출력 디렉토리 설정]
|
|
101
101
|
C --> D[export_items 순환]
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
%% Data processing pipeline
|
|
104
104
|
D --> E[process_data_conversion]
|
|
105
105
|
E --> F[before_convert]
|
|
106
106
|
F --> G[convert_data]
|
|
107
107
|
G --> H[after_convert]
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
%% File saving pipeline
|
|
110
110
|
H --> I[process_file_saving]
|
|
111
111
|
I --> J{원본 파일 저장?}
|
|
112
112
|
J -->|예| K[_process_original_file_saving]
|
|
113
113
|
J -->|아니오| L[_process_json_file_saving]
|
|
114
114
|
K --> L
|
|
115
|
-
|
|
115
|
+
|
|
116
116
|
%% Continue or finish
|
|
117
117
|
L --> M{더 많은 항목?}
|
|
118
118
|
M -->|예| D
|
|
119
119
|
M -->|아니오| N[오류 목록 저장]
|
|
120
120
|
N --> O[내보내기 경로 반환]
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
%% Error handling
|
|
123
123
|
K --> P{원본 파일 실패?}
|
|
124
124
|
P -->|예| Q[다음 항목으로 건너뛰기]
|
|
125
125
|
P -->|아니오| L
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
L --> R{JSON 파일 실패?}
|
|
128
128
|
R -->|예| Q
|
|
129
129
|
R -->|아니오| S[메트릭 업데이트]
|
|
130
130
|
S --> M
|
|
131
131
|
Q --> M
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
%% Styling for light/dark compatibility
|
|
134
134
|
classDef startEnd fill:#e1f5fe,stroke:#01579b,color:#000
|
|
135
135
|
classDef process fill:#f3e5f5,stroke:#4a148c,color:#000
|
|
136
136
|
classDef decision fill:#fff3e0,stroke:#e65100,color:#000
|
|
137
137
|
classDef data fill:#e8f5e8,stroke:#2e7d32,color:#000
|
|
138
138
|
classDef error fill:#ffebee,stroke:#c62828,color:#000
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
class A,O startEnd
|
|
141
141
|
class B,C,E,F,G,H,I,K,L,N,S process
|
|
142
142
|
class J,M,P,R decision
|
|
@@ -147,18 +147,21 @@ flowchart TD
|
|
|
147
147
|
### 주요 관계 및 책임
|
|
148
148
|
|
|
149
149
|
**BaseExporter (추상 기본 클래스)**
|
|
150
|
+
|
|
150
151
|
- **핵심 기능**: 완전한 내보내기 워크플로우 인프라 제공
|
|
151
152
|
- **템플릿 메서드**: `export()` 메서드가 전체 프로세스 조율
|
|
152
153
|
- **훅 메서드**: 커스터마이징을 위한 `convert_data()`, `before_convert()`, `after_convert()`
|
|
153
154
|
- **유틸리티**: 파일 작업, 디렉토리 설정, 오류 처리, 진행률 추적
|
|
154
155
|
|
|
155
|
-
**Exporter (구체적 구현)**
|
|
156
|
+
**Exporter (구체적 구현)**
|
|
157
|
+
|
|
156
158
|
- **상속**: `BaseExporter` 확장
|
|
157
159
|
- **최소 구현**: 추상 메서드들의 기본 구현 제공
|
|
158
160
|
- **위임 동작**: 대부분의 메서드가 부모 클래스에 위임
|
|
159
161
|
- **커스터마이징 지점**: 특정 로직을 위해 변환 메서드 오버라이드
|
|
160
162
|
|
|
161
163
|
### 메서드 카테고리
|
|
164
|
+
|
|
162
165
|
- **🔵 핵심 워크플로우**: 주요 내보내기 조율 메서드
|
|
163
166
|
- **🟢 템플릿/훅**: 서브클래스에서 오버라이드하도록 설계된 메서드
|
|
164
167
|
- **🟡 파일 작업**: 구체적인 파일 저장 및 처리 메서드
|
|
@@ -240,11 +243,11 @@ class Exporter(BaseExporter):
|
|
|
240
243
|
```python
|
|
241
244
|
def additional_file_saving(self, unique_export_path):
|
|
242
245
|
"""모든 export 항목 처리 후 추가 파일 저장.
|
|
243
|
-
|
|
246
|
+
|
|
244
247
|
이 메서드는 주 export 루프가 완료된 후 호출되며, 모든 처리된 export 항목의
|
|
245
|
-
집합적 데이터를 기반으로 생성되어야 하는 파일들(예: 메타데이터 파일,
|
|
248
|
+
집합적 데이터를 기반으로 생성되어야 하는 파일들(예: 메타데이터 파일,
|
|
246
249
|
설정 파일, 요약 파일 등)을 저장하기 위한 것입니다.
|
|
247
|
-
|
|
250
|
+
|
|
248
251
|
Args:
|
|
249
252
|
unique_export_path (str): 추가 파일이 저장될 고유한 export 디렉토리 경로.
|
|
250
253
|
"""
|
|
@@ -263,7 +266,7 @@ class YOLOExporter(BaseExporter):
|
|
|
263
266
|
'total_annotations': 0,
|
|
264
267
|
'class_distribution': {}
|
|
265
268
|
}
|
|
266
|
-
|
|
269
|
+
|
|
267
270
|
def convert_data(self, data):
|
|
268
271
|
# 변환 중 클래스와 통계 추적
|
|
269
272
|
for annotation in data.get('annotations', []):
|
|
@@ -271,24 +274,24 @@ class YOLOExporter(BaseExporter):
|
|
|
271
274
|
self.class_names.add(class_name)
|
|
272
275
|
self.dataset_stats['class_distribution'][class_name] = \
|
|
273
276
|
self.dataset_stats['class_distribution'].get(class_name, 0) + 1
|
|
274
|
-
|
|
277
|
+
|
|
275
278
|
self.dataset_stats['total_images'] += 1
|
|
276
279
|
self.dataset_stats['total_annotations'] += len(data.get('annotations', []))
|
|
277
|
-
|
|
280
|
+
|
|
278
281
|
return data # ... 나머지 변환 로직
|
|
279
|
-
|
|
282
|
+
|
|
280
283
|
def additional_file_saving(self, unique_export_path):
|
|
281
284
|
"""YOLO 설정 및 메타데이터 파일 저장."""
|
|
282
285
|
data_dir = Path(unique_export_path) / 'data'
|
|
283
286
|
data_dir.mkdir(exist_ok=True)
|
|
284
|
-
|
|
287
|
+
|
|
285
288
|
# 1. classes.txt 파일 저장
|
|
286
289
|
classes_file = data_dir / 'classes.txt'
|
|
287
290
|
with classes_file.open('w') as f:
|
|
288
291
|
for class_name in sorted(self.class_names):
|
|
289
292
|
f.write(f"{class_name}\n")
|
|
290
293
|
self.run.log_message(f"클래스 파일 저장: {classes_file}")
|
|
291
|
-
|
|
294
|
+
|
|
292
295
|
# 2. dataset.yaml 파일 저장
|
|
293
296
|
dataset_config = {
|
|
294
297
|
'path': str(unique_export_path),
|
|
@@ -296,12 +299,12 @@ class YOLOExporter(BaseExporter):
|
|
|
296
299
|
'val': 'images',
|
|
297
300
|
'names': {i: name for i, name in enumerate(sorted(self.class_names))}
|
|
298
301
|
}
|
|
299
|
-
|
|
302
|
+
|
|
300
303
|
dataset_file = data_dir / 'dataset.yaml'
|
|
301
304
|
with dataset_file.open('w') as f:
|
|
302
305
|
yaml.dump(dataset_config, f, default_flow_style=False)
|
|
303
306
|
self.run.log_message(f"데이터셋 설정 저장: {dataset_file}")
|
|
304
|
-
|
|
307
|
+
|
|
305
308
|
# 3. export 통계 저장
|
|
306
309
|
stats_file = data_dir / 'export_stats.json'
|
|
307
310
|
with stats_file.open('w') as f:
|
|
@@ -312,6 +315,7 @@ class YOLOExporter(BaseExporter):
|
|
|
312
315
|
### 일반적인 사용 사례
|
|
313
316
|
|
|
314
317
|
#### 1. 데이터셋 설정 파일
|
|
318
|
+
|
|
315
319
|
```python
|
|
316
320
|
def additional_file_saving(self, unique_export_path):
|
|
317
321
|
# 훈련 프레임워크용 데이터셋 설정 생성
|
|
@@ -321,13 +325,14 @@ def additional_file_saving(self, unique_export_path):
|
|
|
321
325
|
'total_samples': len(self.processed_items),
|
|
322
326
|
'classes': list(self.class_mapping.keys())
|
|
323
327
|
}
|
|
324
|
-
|
|
328
|
+
|
|
325
329
|
config_file = Path(unique_export_path) / 'dataset_config.json'
|
|
326
330
|
with config_file.open('w') as f:
|
|
327
331
|
json.dump(config, f, indent=2)
|
|
328
332
|
```
|
|
329
333
|
|
|
330
334
|
#### 2. Export 요약 보고서
|
|
335
|
+
|
|
331
336
|
```python
|
|
332
337
|
def additional_file_saving(self, unique_export_path):
|
|
333
338
|
# export 요약 생성
|
|
@@ -340,13 +345,14 @@ def additional_file_saving(self, unique_export_path):
|
|
|
340
345
|
'statistics': self.get_export_statistics(),
|
|
341
346
|
'errors': self.get_error_summary()
|
|
342
347
|
}
|
|
343
|
-
|
|
348
|
+
|
|
344
349
|
summary_file = Path(unique_export_path) / 'export_summary.json'
|
|
345
350
|
with summary_file.open('w') as f:
|
|
346
351
|
json.dump(summary, f, indent=2)
|
|
347
352
|
```
|
|
348
353
|
|
|
349
354
|
#### 3. 인덱스 및 매니페스트 파일
|
|
355
|
+
|
|
350
356
|
```python
|
|
351
357
|
def additional_file_saving(self, unique_export_path):
|
|
352
358
|
# 처리된 항목들에 대한 파일 인덱스 생성
|
|
@@ -357,7 +363,7 @@ def additional_file_saving(self, unique_export_path):
|
|
|
357
363
|
'json_file': f"{item['stem']}.json",
|
|
358
364
|
'processed_at': item['timestamp']
|
|
359
365
|
})
|
|
360
|
-
|
|
366
|
+
|
|
361
367
|
index_file = Path(unique_export_path) / 'file_index.json'
|
|
362
368
|
with index_file.open('w') as f:
|
|
363
369
|
json.dump(file_index, f, indent=2)
|
|
@@ -540,6 +546,127 @@ my_plugin/
|
|
|
540
546
|
└── manifest.yaml # 플러그인 메타데이터
|
|
541
547
|
```
|
|
542
548
|
|
|
549
|
+
## Export 액션 아키텍처
|
|
550
|
+
|
|
551
|
+
데이터 내보내기 처리의 다양한 측면을 위한 특화된 구성 요소를 갖춘 모듈화된 아키텍처로 export 시스템이 리팩터링되었습니다:
|
|
552
|
+
|
|
553
|
+
```mermaid
|
|
554
|
+
classDiagram
|
|
555
|
+
%% Light/Dark mode compatible colors with semi-transparency
|
|
556
|
+
classDef baseClass fill:#e1f5fe80,stroke:#0288d1,stroke-width:2px
|
|
557
|
+
classDef childClass fill:#c8e6c980,stroke:#388e3c,stroke-width:2px
|
|
558
|
+
classDef modelClass fill:#fff9c480,stroke:#f57c00,stroke-width:2px
|
|
559
|
+
classDef utilClass fill:#f5f5f580,stroke:#616161,stroke-width:2px
|
|
560
|
+
classDef enumClass fill:#ffccbc80,stroke:#d32f2f,stroke-width:2px
|
|
561
|
+
|
|
562
|
+
class ExportAction {
|
|
563
|
+
+name: str = "export"
|
|
564
|
+
+category: PluginCategory.EXPORT
|
|
565
|
+
+method: RunMethod.JOB
|
|
566
|
+
+run_class: ExportRun
|
|
567
|
+
+params_model: ExportParams
|
|
568
|
+
+progress_categories: dict
|
|
569
|
+
+metrics_categories: dict
|
|
570
|
+
|
|
571
|
+
+start() dict
|
|
572
|
+
+get_exporter(...) object
|
|
573
|
+
+_get_export_items(target, filter) Generator
|
|
574
|
+
+_create_target_handler(target) object
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
class ExportRun {
|
|
578
|
+
+log_message_with_code(code, args, level) None
|
|
579
|
+
+log_export_event(code, args, level) None
|
|
580
|
+
+export_log_json_file(id, file_info, status) None
|
|
581
|
+
+export_log_original_file(id, file_info, status) None
|
|
582
|
+
+ExportEventLog: BaseModel
|
|
583
|
+
+DataFileLog: BaseModel
|
|
584
|
+
+MetricsRecord: BaseModel
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
class ExportParams {
|
|
588
|
+
+name: str
|
|
589
|
+
+storage: int
|
|
590
|
+
+target: Literal["assignment", "ground_truth", "task"]
|
|
591
|
+
+filter: dict
|
|
592
|
+
+path: str
|
|
593
|
+
+save_original_file: bool = True
|
|
594
|
+
+extra_params: dict = {}
|
|
595
|
+
|
|
596
|
+
+check_storage_exists(value) str
|
|
597
|
+
+validate_target_filter(cls, values) dict
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
class LogCode {
|
|
601
|
+
+EXPORT_STARTED: str
|
|
602
|
+
+ITEMS_DISCOVERED: str
|
|
603
|
+
+CONVERSION_STARTED: str
|
|
604
|
+
+CONVERSION_COMPLETED: str
|
|
605
|
+
+FILE_SAVED: str
|
|
606
|
+
+EXPORT_COMPLETED: str
|
|
607
|
+
+EXPORT_FAILED: str
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
class ExportStatus {
|
|
611
|
+
+SUCCESS: str = "success"
|
|
612
|
+
+FAILED: str = "failed"
|
|
613
|
+
+SKIPPED: str = "skipped"
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
class ExportError {
|
|
617
|
+
+message: str
|
|
618
|
+
+code: str
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
class ExportValidationError {
|
|
622
|
+
+message: str
|
|
623
|
+
+field: str
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
class ExportTargetError {
|
|
627
|
+
+message: str
|
|
628
|
+
+target: str
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
%% Relationships
|
|
632
|
+
ExportAction --> ExportRun : uses
|
|
633
|
+
ExportAction --> ExportParams : validates with
|
|
634
|
+
ExportRun --> LogCode : logs with
|
|
635
|
+
ExportRun --> ExportStatus : tracks status
|
|
636
|
+
ExportAction --> ExportError : may raise
|
|
637
|
+
ExportAction --> ExportValidationError : may raise
|
|
638
|
+
ExportAction --> ExportTargetError : may raise
|
|
639
|
+
|
|
640
|
+
%% Apply styles
|
|
641
|
+
class ExportAction baseClass
|
|
642
|
+
class ExportRun childClass
|
|
643
|
+
class ExportParams modelClass
|
|
644
|
+
class LogCode,ExportStatus enumClass
|
|
645
|
+
class ExportError,ExportValidationError,ExportTargetError utilClass
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
### 모듈화된 구조
|
|
649
|
+
|
|
650
|
+
Export 액션은 깔끔한 모듈화된 구성을 따릅니다:
|
|
651
|
+
|
|
652
|
+
```
|
|
653
|
+
synapse_sdk/plugins/categories/export/actions/export/
|
|
654
|
+
├── __init__.py # 깔끔한 모듈 인터페이스
|
|
655
|
+
├── action.py # ExportAction 클래스
|
|
656
|
+
├── enums.py # ExportStatus, LogCode + LOG_MESSAGES
|
|
657
|
+
├── exceptions.py # Export 특화 예외
|
|
658
|
+
├── models.py # ExportParams 모델
|
|
659
|
+
├── run.py # ExportRun 클래스
|
|
660
|
+
└── utils.py # 대상 핸들러 및 유틸리티
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
**주요 장점:**
|
|
664
|
+
|
|
665
|
+
- **향상된 유지보수성**: 작고 집중된 파일로 이해하고 수정하기 쉬움
|
|
666
|
+
- **코드 일관성**: Export 액션이 이제 upload 액션과 동일한 패턴을 따름
|
|
667
|
+
- **더 나은 구성**: 관련 기능이 논리적으로 그룹화됨
|
|
668
|
+
- **향상된 가독성**: 모듈 전반에 걸친 명확한 관심사 분리
|
|
669
|
+
|
|
543
670
|
## Export 플러그인 생성
|
|
544
671
|
|
|
545
672
|
Export 플러그인은 더 나은 구성과 재사용성을 위해 BaseExporter 클래스 기반 접근 방식을 사용합니다. 커스텀 export 플러그인을 생성하는 방법은 다음과 같습니다:
|
|
@@ -557,7 +684,7 @@ synapse plugin create
|
|
|
557
684
|
`ExportParams` 모델이 필요한 매개변수를 정의합니다:
|
|
558
685
|
|
|
559
686
|
```python
|
|
560
|
-
from synapse_sdk.plugins.categories.export.actions.export import ExportParams
|
|
687
|
+
from synapse_sdk.plugins.categories.export.actions.export.models import ExportParams
|
|
561
688
|
from pydantic import BaseModel
|
|
562
689
|
from typing import Literal
|
|
563
690
|
|
|
@@ -664,7 +791,7 @@ BaseExporter 메서드를 오버라이드하여 파일 저장 및 구성을 커
|
|
|
664
791
|
```python
|
|
665
792
|
import json
|
|
666
793
|
from pathlib import Path
|
|
667
|
-
from synapse_sdk.plugins.categories.export.enums import ExportStatus
|
|
794
|
+
from synapse_sdk.plugins.categories.export.actions.export.enums import ExportStatus
|
|
668
795
|
|
|
669
796
|
class Exporter(BaseExporter):
|
|
670
797
|
"""다중 형식 지원을 포함한 커스텀 export 플러그인."""
|
|
@@ -923,4 +1050,4 @@ A: `process_file_saving()` 메서드를 오버라이드하여 여러 형식으
|
|
|
923
1050
|
A: `convert_data()`에서 한 번에 모든 데이터를 로드하지 말고, 스트리밍 방식으로 처리하는 것을 고려해보세요.
|
|
924
1051
|
|
|
925
1052
|
**Q: 진행률이 올바르게 표시되지 않는다면?**
|
|
926
|
-
A: `self.run.set_progress()`를 적절한 간격으로 호출하고 있는지 확인하세요. 0-100 사이의 정수 값을 사용해야 합니다.
|
|
1053
|
+
A: `self.run.set_progress()`를 적절한 간격으로 호출하고 있는지 확인하세요. 0-100 사이의 정수 값을 사용해야 합니다.
|