synapse-sdk 1.0.0b12__py3-none-any.whl → 1.0.0b14__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.

Files changed (86) hide show
  1. locale/ko/LC_MESSAGES/messages.mo +0 -0
  2. synapse_sdk/clients/agent/ray.py +9 -11
  3. synapse_sdk/clients/backend/annotation.py +1 -1
  4. synapse_sdk/clients/backend/core.py +31 -4
  5. synapse_sdk/clients/backend/data_collection.py +78 -5
  6. synapse_sdk/clients/backend/hitl.py +1 -1
  7. synapse_sdk/clients/backend/ml.py +1 -1
  8. synapse_sdk/clients/base.py +23 -16
  9. synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
  10. synapse_sdk/devtools/docs/docs/api/clients/backend.md +53 -0
  11. synapse_sdk/devtools/docs/docs/api/clients/base.md +35 -0
  12. synapse_sdk/devtools/docs/docs/api/clients/ray.md +321 -0
  13. synapse_sdk/devtools/docs/docs/api/index.md +52 -0
  14. synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
  15. synapse_sdk/devtools/docs/docs/api/plugins/models.md +59 -0
  16. synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
  17. synapse_sdk/devtools/docs/docs/api/utils/file.md +195 -0
  18. synapse_sdk/devtools/docs/docs/api/utils/network.md +378 -0
  19. synapse_sdk/devtools/docs/docs/api/utils/storage.md +57 -0
  20. synapse_sdk/devtools/docs/docs/api/utils/types.md +51 -0
  21. synapse_sdk/devtools/docs/docs/categories.md +0 -0
  22. synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
  23. synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
  24. synapse_sdk/devtools/docs/docs/configuration.md +83 -0
  25. synapse_sdk/devtools/docs/docs/contributing.md +306 -0
  26. synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
  27. synapse_sdk/devtools/docs/docs/faq.md +179 -0
  28. synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
  29. synapse_sdk/devtools/docs/docs/features/index.md +24 -0
  30. synapse_sdk/devtools/docs/docs/features/plugins/index.md +509 -0
  31. synapse_sdk/devtools/docs/docs/installation.md +94 -0
  32. synapse_sdk/devtools/docs/docs/introduction.md +47 -0
  33. synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
  34. synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
  35. synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
  36. synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
  37. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
  38. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
  39. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
  40. synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
  41. synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
  42. synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
  43. synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
  44. synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
  45. synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
  46. synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
  47. synapse_sdk/devtools/docs/docusaurus.config.ts +5 -3
  48. synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
  49. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
  50. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +53 -0
  51. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +35 -0
  52. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +321 -0
  53. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
  54. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/file.md +195 -0
  55. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/network.md +378 -0
  56. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/storage.md +60 -0
  57. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/types.md +51 -0
  58. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
  59. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
  60. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
  61. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
  62. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
  63. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
  64. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
  65. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
  66. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
  67. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/plugins/index.md +30 -0
  68. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
  69. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
  70. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
  71. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
  72. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +22 -0
  73. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
  74. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
  75. synapse_sdk/devtools/docs/node_modules/shell-quote/print.py +3 -0
  76. synapse_sdk/devtools/docs/package.json +1 -1
  77. synapse_sdk/plugins/categories/export/actions/export.py +50 -2
  78. synapse_sdk/plugins/categories/export/templates/plugin/export.py +15 -2
  79. synapse_sdk/plugins/categories/upload/actions/upload.py +42 -27
  80. synapse_sdk/utils/file.py +77 -0
  81. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/METADATA +1 -1
  82. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/RECORD +86 -20
  83. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/WHEEL +0 -0
  84. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/entry_points.txt +0 -0
  85. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/licenses/LICENSE +0 -0
  86. {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,321 @@
1
+ ---
2
+ id: ray
3
+ title: RayClient
4
+ sidebar_position: 4
5
+ ---
6
+
7
+ # RayClient
8
+
9
+ Apache Ray 클러스터 관리 및 모니터링 기능을 위한 클라이언트입니다.
10
+
11
+ ## 개요
12
+
13
+ `RayClientMixin`은 작업 관리, 실시간 로그 스트리밍, 노드 모니터링, Ray Serve 애플리케이션 제어를 포함한 포괄적인 Ray 클러스터 작업을 제공합니다. Ray 전용 기능으로 `BaseClient`를 확장하는 mixin 클래스로 설계되었습니다.
14
+
15
+ ## 주요 기능
16
+
17
+ - **Job 라이프사이클 관리**: Ray 작업 생성, 모니터링 및 관리
18
+ - **실시간 로그 스트리밍**: WebSocket 및 HTTP 기반 로그 테일링
19
+ - **노드 및 태스크 모니터링**: 클러스터 리소스 및 태스크 실행 모니터링
20
+ - **Ray Serve 통합**: Ray Serve 애플리케이션 배포 및 관리
21
+ - **강력한 오류 처리**: 입력 유효성 검사 및 정제된 오류 메시지
22
+ - **리소스 관리**: 자동 정리 및 연결 추적
23
+
24
+ ## Constructor
25
+
26
+ ```python
27
+ # RayClientMixin은 일반적으로 mixin으로 사용됩니다
28
+ class RayClient(RayClientMixin):
29
+ def __init__(self, base_url: str, timeout: dict = None):
30
+ super().__init__(base_url, timeout)
31
+ ```
32
+
33
+ ### Parameters
34
+
35
+ - `base_url` (str): Ray 클러스터 대시보드 URL (예: "http://ray-head:8265")
36
+ - `timeout` (dict, 선택사항): 연결 및 읽기 timeout 설정
37
+
38
+ ## 사용법
39
+
40
+ ```python
41
+ from synapse_sdk.clients.agent.ray import RayClientMixin
42
+ from synapse_sdk.clients.base import BaseClient
43
+
44
+ class RayClient(RayClientMixin, BaseClient):
45
+ pass
46
+
47
+ client = RayClient(base_url="http://ray-head:8265")
48
+
49
+ # 모든 작업 나열
50
+ jobs = client.list_jobs()
51
+
52
+ # 특정 작업 세부정보 가져오기
53
+ job = client.get_job('job-12345')
54
+
55
+ # 실시간으로 로그 스트리밍
56
+ for log_line in client.tail_job_logs('job-12345'):
57
+ print(log_line.strip())
58
+ ```
59
+
60
+ ## Job 작업
61
+
62
+ ### `get_job(pk)`
63
+
64
+ 특정 작업에 대한 세부정보를 검색합니다.
65
+
66
+ ```python
67
+ job = client.get_job('job-12345')
68
+ print(f"Job 상태: {job['status']}")
69
+ ```
70
+
71
+ ### `list_jobs()`
72
+
73
+ Ray 클러스터의 모든 작업을 나열합니다.
74
+
75
+ ```python
76
+ jobs = client.list_jobs()
77
+ for job in jobs['results']:
78
+ print(f"Job {job['id']}: {job['status']}")
79
+ ```
80
+
81
+ ### `list_job_logs(pk)`
82
+
83
+ 작업에 대한 정적 로그 항목을 가져옵니다.
84
+
85
+ ```python
86
+ logs = client.list_job_logs('job-12345')
87
+ ```
88
+
89
+ ## 실시간 로그 스트리밍
90
+
91
+ ### `tail_job_logs(pk, stream_timeout=10, protocol='stream')`
92
+
93
+ WebSocket 또는 HTTP 프로토콜을 사용하여 작업 로그를 스트리밍합니다.
94
+
95
+ ```python
96
+ # HTTP 스트리밍 (기본값, 호환성 높음)
97
+ for log_line in client.tail_job_logs('job-12345', protocol='stream'):
98
+ print(log_line.strip())
99
+
100
+ # WebSocket 스트리밍 (낮은 지연시간)
101
+ for log_line in client.tail_job_logs('job-12345', protocol='websocket'):
102
+ print(log_line.strip())
103
+
104
+ # 사용자 정의 timeout으로
105
+ for log_line in client.tail_job_logs('job-12345', stream_timeout=30):
106
+ if 'ERROR' in log_line:
107
+ break
108
+ ```
109
+
110
+ ### `websocket_tail_job_logs(pk, stream_timeout=10)`
111
+
112
+ 가장 낮은 지연시간을 위해 WebSocket을 통해 로그를 스트리밍합니다.
113
+
114
+ ```python
115
+ try:
116
+ for log_line in client.websocket_tail_job_logs('job-12345'):
117
+ print(log_line.strip())
118
+ if 'COMPLETED' in log_line:
119
+ break
120
+ except ClientError as e:
121
+ print(f"WebSocket 스트리밍 실패: {e}")
122
+ ```
123
+
124
+ ### `stream_tail_job_logs(pk, stream_timeout=10)`
125
+
126
+ HTTP chunked transfer encoding을 통해 로그를 스트리밍합니다.
127
+
128
+ ```python
129
+ for log_line in client.stream_tail_job_logs('job-12345', stream_timeout=60):
130
+ if 'FAILED' in log_line:
131
+ print(f"Job 실패: {log_line}")
132
+ break
133
+ ```
134
+
135
+ ## 노드 작업
136
+
137
+ ### `get_node(pk)`
138
+
139
+ 특정 클러스터 노드에 대한 세부정보를 가져옵니다.
140
+
141
+ ```python
142
+ node = client.get_node('node-abc123')
143
+ print(f"노드 상태: {node['alive']}")
144
+ ```
145
+
146
+ ### `list_nodes()`
147
+
148
+ Ray 클러스터의 모든 노드를 나열합니다.
149
+
150
+ ```python
151
+ nodes = client.list_nodes()
152
+ for node in nodes['results']:
153
+ print(f"노드 {node['node_id']}: {node['state']}")
154
+ ```
155
+
156
+ ## 태스크 작업
157
+
158
+ ### `get_task(pk)`
159
+
160
+ 특정 태스크에 대한 세부정보를 검색합니다.
161
+
162
+ ```python
163
+ task = client.get_task('task-xyz789')
164
+ ```
165
+
166
+ ### `list_tasks()`
167
+
168
+ 클러스터의 모든 태스크를 나열합니다.
169
+
170
+ ```python
171
+ tasks = client.list_tasks()
172
+ ```
173
+
174
+ ## Ray Serve 작업
175
+
176
+ ### `get_serve_application(pk)`
177
+
178
+ Ray Serve 애플리케이션에 대한 세부정보를 가져옵니다.
179
+
180
+ ```python
181
+ app = client.get_serve_application('app-123')
182
+ print(f"애플리케이션 상태: {app['status']}")
183
+ ```
184
+
185
+ ### `list_serve_applications()`
186
+
187
+ 모든 Ray Serve 애플리케이션을 나열합니다.
188
+
189
+ ```python
190
+ apps = client.list_serve_applications()
191
+ ```
192
+
193
+ ### `delete_serve_application(pk)`
194
+
195
+ Ray Serve 애플리케이션을 삭제합니다.
196
+
197
+ ```python
198
+ client.delete_serve_application('app-123')
199
+ ```
200
+
201
+ ## 오류 처리
202
+
203
+ 모든 메서드에는 특정 `ClientError` 예외와 함께 강력한 오류 처리가 포함됩니다:
204
+
205
+ ```python
206
+ from synapse_sdk.clients.exceptions import ClientError
207
+
208
+ try:
209
+ for log_line in client.tail_job_logs('invalid-job'):
210
+ print(log_line)
211
+ except ClientError as e:
212
+ if e.status == 400:
213
+ print("잘못된 작업 ID 또는 매개변수")
214
+ elif e.status == 404:
215
+ print("작업을 찾을 수 없음")
216
+ elif e.status == 503:
217
+ print("Ray 클러스터 연결 실패")
218
+ else:
219
+ print(f"예상치 못한 오류: {e}")
220
+ ```
221
+
222
+ ### 일반적인 오류 코드
223
+
224
+ - **400**: 잘못된 매개변수 (job ID, timeout, protocol)
225
+ - **404**: 리소스를 찾을 수 없음 (job, node, task, application)
226
+ - **408**: 연결 또는 읽기 timeout
227
+ - **429**: 스트림 제한 초과
228
+ - **500**: WebSocket 라이브러리 사용 불가 또는 내부 오류
229
+ - **503**: Ray 클러스터 연결 실패
230
+
231
+ ## 리소스 관리
232
+
233
+ RayClient에는 자동 리소스 관리가 포함됩니다:
234
+
235
+ - **Thread Pool**: 동시 작업을 위한 5개 작업자 스레드
236
+ - **연결 추적**: 활성 연결을 위한 WeakSet
237
+ - **스트림 제한**: 메모리 고갈 방지
238
+ - **자동 정리**: 소멸 시 리소스 정리
239
+
240
+ ### 스트림 제한
241
+
242
+ 로그 스트리밍을 위한 기본 제한:
243
+
244
+ - 최대 메시지: 10,000
245
+ - 최대 라인: 50,000
246
+ - 최대 바이트: 50MB
247
+ - 최대 메시지 크기: 10KB
248
+ - Queue 크기: 1,000
249
+
250
+ ## 모범 사례
251
+
252
+ ### 1. 프로토콜 선택
253
+
254
+ ```python
255
+ # 사용 가능한 경우 가장 낮은 지연시간을 위해 WebSocket 사용
256
+ try:
257
+ logs = client.tail_job_logs(job_id, protocol='websocket')
258
+ except ClientError:
259
+ # HTTP 스트리밍으로 폴백
260
+ logs = client.tail_job_logs(job_id, protocol='stream')
261
+ ```
262
+
263
+ ### 2. Timeout 관리
264
+
265
+ ```python
266
+ # 장기 실행 작업에 적절한 timeout 사용
267
+ for log_line in client.tail_job_logs(job_id, stream_timeout=300):
268
+ process_log_line(log_line)
269
+ ```
270
+
271
+ ### 3. 오류 복구
272
+
273
+ ```python
274
+ import time
275
+
276
+ def robust_log_streaming(client, job_id, max_retries=3):
277
+ for attempt in range(max_retries):
278
+ try:
279
+ for log_line in client.tail_job_logs(job_id):
280
+ yield log_line
281
+ break
282
+ except ClientError as e:
283
+ if e.status == 503 and attempt < max_retries - 1:
284
+ time.sleep(2 ** attempt) # 지수 백오프
285
+ continue
286
+ raise
287
+ ```
288
+
289
+ ### 4. 리소스 정리
290
+
291
+ ```python
292
+ # 적절한 정리를 위한 컨텍스트 매니저
293
+ class RayClientContext:
294
+ def __init__(self, base_url):
295
+ self.client = RayClient(base_url)
296
+
297
+ def __enter__(self):
298
+ return self.client
299
+
300
+ def __exit__(self, exc_type, exc_val, exc_tb):
301
+ # RayClient.__del__()에 의해 자동으로 정리 처리
302
+ pass
303
+
304
+ with RayClientContext("http://ray-head:8265") as client:
305
+ for log_line in client.tail_job_logs('job-12345'):
306
+ print(log_line.strip())
307
+ ```
308
+
309
+ ## 스레드 안전성
310
+
311
+ RayClient는 적절한 스레드 안전 메커니즘을 통해 동시 사용을 위해 설계되었습니다:
312
+
313
+ - 백그라운드 작업을 위한 스레드 풀
314
+ - 연결 추적을 위한 WeakSet
315
+ - 적절한 리소스 정리 메커니즘
316
+
317
+ ## 참고
318
+
319
+ - [AgentClient](./agent.md) - Agent 전용 작업을 위한 클라이언트
320
+ - [BaseClient](./base.md) - 기본 클라이언트 구현
321
+ - [Network Utilities](../utils/network.md) - 스트리밍 및 유효성 검사 유틸리티
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: index
3
+ title: API 참조
4
+ sidebar_position: 1
5
+ ---
6
+
7
+ # API 참조
8
+
9
+ Synapse SDK 클래스 및 함수에 대한 완전한 참조 문서입니다.
10
+
11
+ ## 개요
12
+
13
+ Synapse SDK API는 다음 주요 모듈로 구성됩니다:
14
+
15
+ ### [클라이언트](./clients/backend.md)
16
+ 백엔드 서비스 및 에이전트와 상호작용하기 위한 클라이언트 클래스들.
17
+
18
+ - **[BackendClient](./clients/backend.md)** - 백엔드 작업을 위한 메인 클라이언트
19
+ - **[AgentClient](./clients/agent.md)** - 에이전트 특정 작업을 위한 클라이언트
20
+ - **[RayClient](./clients/ray.md)** - Ray 클러스터 관리 및 모니터링을 위한 클라이언트
21
+ - **[BaseClient](./clients/base.md)** - 모든 클라이언트의 기본 클래스
22
+
23
+ 핵심 플러그인 시스템 컴포넌트들.
24
+
25
+ ### [유틸리티](./utils/file.md)
26
+ 도우미 함수 및 유틸리티들.
27
+
28
+ - **[파일 유틸](./utils/file.md)** - 파일 작업 및 처리
29
+ - **[네트워크](./utils/network.md)** - 스트리밍, 검증 및 연결 관리
30
+ - **[스토리지](./utils/storage.md)** - 스토리지 제공자들 (S3, GCS, SFTP)
31
+ - **[타입](./utils/types.md)** - 커스텀 타입 및 필드
32
+
33
+ ## 빠른 참조
34
+
35
+ ### 클라이언트 생성
36
+
37
+ ```python
38
+ from synapse_sdk.clients.backend import BackendClient
39
+
40
+ client = BackendClient(
41
+ base_url="https://api.synapse.sh",
42
+ api_token="your-api-token"
43
+ )
44
+ ```
45
+
46
+ ### 플러그인 실행
47
+
48
+ ### 플러그인 액션 생성
49
+
50
+ ## 타입 어노테이션
51
+
52
+ ## 파일 처리
@@ -0,0 +1,195 @@
1
+ ---
2
+ id: file
3
+ title: 파일 유틸리티
4
+ sidebar_position: 1
5
+ ---
6
+
7
+ # 파일 유틸리티
8
+
9
+ 파일 작업 및 처리 유틸리티입니다.
10
+
11
+ ## 파일 작업
12
+
13
+ ### 아카이브 함수
14
+
15
+ 플러그인 아카이브를 생성하고 추출하는 함수입니다.
16
+
17
+ ### 다운로드 함수
18
+
19
+ URL에서 파일을 다운로드하는 유틸리티입니다.
20
+
21
+ ```python
22
+ from synapse_sdk.utils.file import download_file
23
+
24
+ local_path = download_file(url, destination)
25
+ ```
26
+
27
+ ### 업로드 함수
28
+
29
+ 청크 업로드 지원을 포함한 파일 업로드 유틸리티입니다.
30
+
31
+ ## 청크 파일 작업
32
+
33
+ ### read_file_in_chunks
34
+
35
+ 효율적인 메모리 사용을 위해 파일을 청크 단위로 읽습니다. 대용량 파일이나 업로드 또는 해싱을 위해 파일을 청크 단위로 처리할 때 특히 유용합니다.
36
+
37
+ ```python
38
+ from synapse_sdk.utils.file import read_file_in_chunks
39
+
40
+ # 기본 50MB 청크로 파일 읽기
41
+ for chunk in read_file_in_chunks('/path/to/large_file.bin'):
42
+ process_chunk(chunk)
43
+
44
+ # 사용자 정의 청크 크기로 읽기 (10MB)
45
+ for chunk in read_file_in_chunks('/path/to/file.bin', chunk_size=1024*1024*10):
46
+ upload_chunk(chunk)
47
+ ```
48
+
49
+ **매개변수:**
50
+
51
+ - `file_path` (str | Path): 읽을 파일의 경로
52
+ - `chunk_size` (int, 선택사항): 각 청크의 바이트 크기. 기본값은 50MB (52,428,800바이트)
53
+
54
+ **반환값:**
55
+
56
+ - 파일 내용 청크를 바이트로 생성하는 제너레이터
57
+
58
+ **예외:**
59
+
60
+ - `FileNotFoundError`: 파일이 존재하지 않는 경우
61
+ - `PermissionError`: 권한으로 인해 파일을 읽을 수 없는 경우
62
+ - `OSError`: 파일 읽기 시 OS 수준 오류가 발생한 경우
63
+
64
+ ### 사용 사례
65
+
66
+ **대용량 파일 처리**: 메모리에 맞지 않는 대용량 파일을 효율적으로 처리합니다:
67
+
68
+ ```python
69
+ import hashlib
70
+
71
+ def calculate_hash_for_large_file(file_path):
72
+ hash_md5 = hashlib.md5()
73
+ for chunk in read_file_in_chunks(file_path):
74
+ hash_md5.update(chunk)
75
+ return hash_md5.hexdigest()
76
+ ```
77
+
78
+ **청크 업로드 통합**: 이 함수는 `CoreClientMixin.create_chunked_upload` 메서드와 완벽하게 통합됩니다:
79
+
80
+ ```python
81
+ from synapse_sdk.clients.backend.core import CoreClientMixin
82
+
83
+ client = CoreClientMixin(base_url='https://api.example.com')
84
+ result = client.create_chunked_upload('/path/to/large_file.zip')
85
+ ```
86
+
87
+ **모범 사례:**
88
+
89
+ - 최적의 업로드 성능을 위해 기본 청크 크기(50MB) 사용
90
+ - 사용 가능한 메모리와 네트워크 조건에 따라 청크 크기 조정
91
+ - 매우 큰 파일(>1GB)의 경우, 더 나은 진행 상황 추적을 위해 작은 청크 사용 고려
92
+ - 파일 작업 시 항상 예외 처리
93
+
94
+ ## 체크섬 함수
95
+
96
+ ### get_checksum_from_file
97
+
98
+ Django 의존성 없이 파일 형태 객체의 체크섬을 계산합니다. 이 함수는 `read()` 메서드가 있는 모든 파일 형태 객체와 함께 작동하며, Django의 File 객체, BytesIO, StringIO, 일반 파일 객체와 호환됩니다.
99
+
100
+ ```python
101
+ import hashlib
102
+ from io import BytesIO
103
+ from synapse_sdk.utils.file import get_checksum_from_file
104
+
105
+ # BytesIO와 기본 사용법 (기본값은 SHA1)
106
+ data = BytesIO(b'Hello, world!')
107
+ checksum = get_checksum_from_file(data)
108
+ print(checksum) # 16진수 문자열로 된 SHA1 해시
109
+
110
+ # 다른 해시 알고리즘 사용
111
+ checksum_md5 = get_checksum_from_file(data, digest_mod=hashlib.md5)
112
+ checksum_sha256 = get_checksum_from_file(data, digest_mod=hashlib.sha256)
113
+
114
+ # 실제 파일 객체와 함께 사용
115
+ with open('/path/to/file.txt', 'rb') as f:
116
+ checksum = get_checksum_from_file(f)
117
+
118
+ # StringIO와 함께 사용 (텍스트 파일)
119
+ from io import StringIO
120
+ text_data = StringIO('Hello, world!')
121
+ checksum = get_checksum_from_file(text_data) # 자동으로 UTF-8로 인코딩
122
+ ```
123
+
124
+ **매개변수:**
125
+
126
+ - `file` (IO[Any]): 청크 단위로 읽기를 지원하는 read() 메서드가 있는 파일 형태 객체
127
+ - `digest_mod` (Callable[[], Any], 선택사항): hashlib의 해시 알고리즘. 기본값은 `hashlib.sha1`
128
+
129
+ **반환값:**
130
+
131
+ - `str`: 파일 내용의 16진수 다이제스트
132
+
133
+ **주요 기능:**
134
+
135
+ - **메모리 효율적**: 대용량 파일을 처리하기 위해 4KB 청크로 파일 읽기
136
+ - **자동 파일 포인터 리셋**: 파일 객체가 시킹을 지원하는 경우 시작 위치로 리셋
137
+ - **텍스트/바이너리 무관**: 텍스트(StringIO)와 바이너리(BytesIO) 파일 객체 모두 처리
138
+ - **Django 의존성 없음**: Django File 객체와 호환되면서도 Django 없이 작동
139
+ - **유연한 해시 알고리즘**: 모든 hashlib 알고리즘 지원 (SHA1, SHA256, MD5 등)
140
+
141
+ **사용 사례:**
142
+
143
+ **Django 파일 객체 호환성**: Django를 요구하지 않으면서도 Django의 File 객체와 함께 작동합니다:
144
+
145
+ ```python
146
+ # Django File 형태 동작 시뮬레이션
147
+ class FileWrapper:
148
+ def __init__(self, data):
149
+ self._data = data
150
+ self._pos = 0
151
+
152
+ def read(self, size=None):
153
+ if size is None:
154
+ result = self._data[self._pos:]
155
+ self._pos = len(self._data)
156
+ else:
157
+ result = self._data[self._pos:self._pos + size]
158
+ self._pos += len(result)
159
+ return result
160
+
161
+ file_obj = FileWrapper(b'File content')
162
+ checksum = get_checksum_from_file(file_obj)
163
+ ```
164
+
165
+ **대용량 파일 처리**: 대용량 파일의 체크섬을 효율적으로 계산합니다:
166
+
167
+ ```python
168
+ # 메모리 효율성을 갖춘 대용량 파일 처리
169
+ with open('/path/to/large_file.bin', 'rb') as large_file:
170
+ checksum = get_checksum_from_file(large_file, digest_mod=hashlib.sha256)
171
+ ```
172
+
173
+ **다중 해시 알고리즘**: 같은 파일에 대해 다른 체크섬을 계산합니다:
174
+
175
+ ```python
176
+ algorithms = [
177
+ ('MD5', hashlib.md5),
178
+ ('SHA1', hashlib.sha1),
179
+ ('SHA256', hashlib.sha256),
180
+ ]
181
+
182
+ with open('/path/to/file.bin', 'rb') as f:
183
+ checksums = {}
184
+ for name, algo in algorithms:
185
+ f.seek(0) # 파일 포인터 리셋
186
+ checksums[name] = get_checksum_from_file(f, digest_mod=algo)
187
+ ```
188
+
189
+ ## 경로 유틸리티
190
+
191
+ 경로 조작 및 검증을 위한 함수입니다.
192
+
193
+ ## 임시 파일
194
+
195
+ 임시 파일 관리 및 정리를 위한 유틸리티입니다.