Metadata-Version: 2.4
Name: robin-cloud-client
Version: 0.1.0
Summary: Python client for Robin-Cloud storage and logs (X-Api-Key auth)
Project-URL: Homepage, https://github.com/robintech-seoul/robin-cloud-client
Project-URL: Repository, https://github.com/robintech-seoul/robin-cloud-client
Author: RobinTech
License: MIT
Keywords: logs,robin-cloud,s3,sdk,storage
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.9
Requires-Dist: httpx>=0.27
Provides-Extra: dev
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Requires-Dist: ruff>=0.6; extra == 'dev'
Description-Content-Type: text/markdown

# robin-cloud-client (Python)

Robin-Cloud 스토리지·로그를 API 키로 이용하는 Python SDK.

```bash
pip install robin-cloud-client
```

## 사용

```python
from robincloud import RobinCloud

rc = RobinCloud(api_key="rbk_…", project="raxis")
# 또는 환경변수: ROBIN_CLOUD_API_KEY, ROBIN_CLOUD_BASE_URL

# 스토리지
rc.storage.create_bucket("assets")                       # storage:admin 스코프 필요
rc.storage.upload("assets", "img/logo.png", data)        # presign→PUT→complete 자동
raw = rc.storage.download("assets", "img/logo.png")      # -> bytes
listing = rc.storage.list_objects("assets", prefix="img/")
rc.storage.delete("assets", keys=["img/logo.png"])

# 로그
for src in rc.logs.sources():
    print(src.pod, src.containers)
print(rc.logs.tail(source="web-1", lines=200))

rc.close()   # 또는 with RobinCloud(...) as rc:
```

## 에러

상태코드가 타입 예외로 매핑된다: `AuthenticationError`(401), `PermissionDeniedError`(403),
`NotFoundError`(404), `ConflictError`(409), `PayloadTooLargeError`(413), `ValidationError`(422),
`ServiceUnavailableError`(503), 그 외 `ApiError`. 모두 `RobinCloudError` 하위.

```python
from robincloud import PermissionDeniedError
try:
    rc.storage.create_bucket("x")
except PermissionDeniedError as e:
    print(e.status_code, e.message)   # 403 "key is missing required scope 'storage:admin'"
```

## 범위

- 스토리지(버킷·오브젝트·업로드/다운로드·이동·삭제·public URL) + 로그(소스·tail).
- 키 발급/폐기는 세션 인증이라 SDK 범위 밖(콘솔 UI).
- 업로드는 단일 presigned PUT(~5GB 상한). 멀티파트는 백로그.

## 개발

```bash
cd python
uv venv && uv pip install -e ".[dev]"
uv run pytest          # respx 모킹, 실 네트워크 없음
uv run ruff check .
```
