aiteamutils 0.2.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- aiteamutils-0.2.0/.gitignore +27 -0
- aiteamutils-0.2.0/PKG-INFO +72 -0
- aiteamutils-0.2.0/README.md +56 -0
- aiteamutils-0.2.0/aiteamutils/__init__.py +60 -0
- aiteamutils-0.2.0/aiteamutils/base_model.py +81 -0
- aiteamutils-0.2.0/aiteamutils/base_repository.py +503 -0
- aiteamutils-0.2.0/aiteamutils/base_service.py +668 -0
- aiteamutils-0.2.0/aiteamutils/cache.py +48 -0
- aiteamutils-0.2.0/aiteamutils/config.py +26 -0
- aiteamutils-0.2.0/aiteamutils/database.py +823 -0
- aiteamutils-0.2.0/aiteamutils/dependencies.py +158 -0
- aiteamutils-0.2.0/aiteamutils/enums.py +23 -0
- aiteamutils-0.2.0/aiteamutils/exceptions.py +333 -0
- aiteamutils-0.2.0/aiteamutils/security.py +396 -0
- aiteamutils-0.2.0/aiteamutils/validators.py +188 -0
- aiteamutils-0.2.0/pyproject.toml +31 -0
- aiteamutils-0.2.0/setup.py +15 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# Dependencies
|
2
|
+
node_modules/
|
3
|
+
__pycache__/
|
4
|
+
*.pyc
|
5
|
+
.env
|
6
|
+
|
7
|
+
# Build
|
8
|
+
dist/
|
9
|
+
build/
|
10
|
+
.svelte-kit/
|
11
|
+
|
12
|
+
# IDE
|
13
|
+
.vscode/
|
14
|
+
.idea/
|
15
|
+
|
16
|
+
# Client specific
|
17
|
+
clients/
|
18
|
+
!clients/.gitkeep
|
19
|
+
!frontend/src/clients
|
20
|
+
|
21
|
+
# Logs
|
22
|
+
*.log
|
23
|
+
npm-debug.log*
|
24
|
+
|
25
|
+
# System
|
26
|
+
.DS_Store
|
27
|
+
Thumbs.db
|
@@ -0,0 +1,72 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: aiteamutils
|
3
|
+
Version: 0.2.0
|
4
|
+
Summary: AI Team Utilities
|
5
|
+
Project-URL: Homepage, https://github.com/yourusername/aiteamutils
|
6
|
+
Project-URL: Issues, https://github.com/yourusername/aiteamutils/issues
|
7
|
+
Author: AI Team
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
9
|
+
Classifier: Operating System :: OS Independent
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
11
|
+
Requires-Python: >=3.8
|
12
|
+
Requires-Dist: fastapi
|
13
|
+
Requires-Dist: python-jose
|
14
|
+
Requires-Dist: sqlalchemy
|
15
|
+
Description-Content-Type: text/markdown
|
16
|
+
|
17
|
+
# AI Team Core Utils
|
18
|
+
|
19
|
+
AI Team Platform의 공통 유틸리티 패키지입니다.
|
20
|
+
|
21
|
+
## 설치 방법
|
22
|
+
|
23
|
+
```bash
|
24
|
+
pip install ai-team-core-utils
|
25
|
+
```
|
26
|
+
|
27
|
+
## 사용 예시
|
28
|
+
|
29
|
+
```python
|
30
|
+
from ai_team_core_utils.database import DatabaseManager
|
31
|
+
from ai_team_core_utils.base_model import Base
|
32
|
+
|
33
|
+
# DB 매니저 초기화
|
34
|
+
db = DatabaseManager("postgresql+asyncpg://user:pass@localhost/db")
|
35
|
+
|
36
|
+
# DB 세션 사용
|
37
|
+
async with db.get_session() as session:
|
38
|
+
# DB 작업 수행
|
39
|
+
pass
|
40
|
+
|
41
|
+
# 예외 처리
|
42
|
+
from ai_team_core_utils.exceptions import CustomException, ErrorCode
|
43
|
+
|
44
|
+
try:
|
45
|
+
# 작업 수행
|
46
|
+
pass
|
47
|
+
except CustomException as e:
|
48
|
+
# 에러 처리
|
49
|
+
print(e.to_dict())
|
50
|
+
```
|
51
|
+
|
52
|
+
## 주요 기능
|
53
|
+
|
54
|
+
- 데이터베이스 유틸리티
|
55
|
+
- 세션 관리
|
56
|
+
- 트랜잭션 관리
|
57
|
+
- 기본 CRUD 작업
|
58
|
+
|
59
|
+
- 인증/인가 유틸리티
|
60
|
+
- JWT 토큰 관리
|
61
|
+
- 비밀번호 해싱
|
62
|
+
- Rate Limiting
|
63
|
+
|
64
|
+
- 예외 처리
|
65
|
+
- 표준화된 에러 코드
|
66
|
+
- 에러 체인 추적
|
67
|
+
- 로깅 통합
|
68
|
+
|
69
|
+
- 공통 모델
|
70
|
+
- 기본 모델 클래스
|
71
|
+
- 타입 검증
|
72
|
+
- 유효성 검사
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# AI Team Core Utils
|
2
|
+
|
3
|
+
AI Team Platform의 공통 유틸리티 패키지입니다.
|
4
|
+
|
5
|
+
## 설치 방법
|
6
|
+
|
7
|
+
```bash
|
8
|
+
pip install ai-team-core-utils
|
9
|
+
```
|
10
|
+
|
11
|
+
## 사용 예시
|
12
|
+
|
13
|
+
```python
|
14
|
+
from ai_team_core_utils.database import DatabaseManager
|
15
|
+
from ai_team_core_utils.base_model import Base
|
16
|
+
|
17
|
+
# DB 매니저 초기화
|
18
|
+
db = DatabaseManager("postgresql+asyncpg://user:pass@localhost/db")
|
19
|
+
|
20
|
+
# DB 세션 사용
|
21
|
+
async with db.get_session() as session:
|
22
|
+
# DB 작업 수행
|
23
|
+
pass
|
24
|
+
|
25
|
+
# 예외 처리
|
26
|
+
from ai_team_core_utils.exceptions import CustomException, ErrorCode
|
27
|
+
|
28
|
+
try:
|
29
|
+
# 작업 수행
|
30
|
+
pass
|
31
|
+
except CustomException as e:
|
32
|
+
# 에러 처리
|
33
|
+
print(e.to_dict())
|
34
|
+
```
|
35
|
+
|
36
|
+
## 주요 기능
|
37
|
+
|
38
|
+
- 데이터베이스 유틸리티
|
39
|
+
- 세션 관리
|
40
|
+
- 트랜잭션 관리
|
41
|
+
- 기본 CRUD 작업
|
42
|
+
|
43
|
+
- 인증/인가 유틸리티
|
44
|
+
- JWT 토큰 관리
|
45
|
+
- 비밀번호 해싱
|
46
|
+
- Rate Limiting
|
47
|
+
|
48
|
+
- 예외 처리
|
49
|
+
- 표준화된 에러 코드
|
50
|
+
- 에러 체인 추적
|
51
|
+
- 로깅 통합
|
52
|
+
|
53
|
+
- 공통 모델
|
54
|
+
- 기본 모델 클래스
|
55
|
+
- 타입 검증
|
56
|
+
- 유효성 검사
|
@@ -0,0 +1,60 @@
|
|
1
|
+
from .base_model import Base
|
2
|
+
from .database import DatabaseManager
|
3
|
+
from .exceptions import (
|
4
|
+
CustomException,
|
5
|
+
ErrorCode,
|
6
|
+
custom_exception_handler,
|
7
|
+
request_validation_exception_handler,
|
8
|
+
sqlalchemy_exception_handler,
|
9
|
+
generic_exception_handler
|
10
|
+
)
|
11
|
+
from .security import (
|
12
|
+
verify_password,
|
13
|
+
hash_password,
|
14
|
+
create_jwt_token,
|
15
|
+
verify_jwt_token,
|
16
|
+
rate_limit,
|
17
|
+
RateLimitExceeded
|
18
|
+
)
|
19
|
+
from .base_service import BaseService
|
20
|
+
from .base_repository import BaseRepository
|
21
|
+
from .validators import validate_with
|
22
|
+
from .enums import ActivityType
|
23
|
+
from .cache import CacheManager
|
24
|
+
|
25
|
+
__version__ = "0.1.0"
|
26
|
+
|
27
|
+
__all__ = [
|
28
|
+
# Base Models
|
29
|
+
"Base",
|
30
|
+
"BaseService",
|
31
|
+
"BaseRepository",
|
32
|
+
|
33
|
+
# Database
|
34
|
+
"DatabaseManager",
|
35
|
+
|
36
|
+
# Exceptions
|
37
|
+
"CustomException",
|
38
|
+
"ErrorCode",
|
39
|
+
"custom_exception_handler",
|
40
|
+
"request_validation_exception_handler",
|
41
|
+
"sqlalchemy_exception_handler",
|
42
|
+
"generic_exception_handler",
|
43
|
+
|
44
|
+
# Security
|
45
|
+
"verify_password",
|
46
|
+
"hash_password",
|
47
|
+
"create_jwt_token",
|
48
|
+
"verify_jwt_token",
|
49
|
+
"rate_limit",
|
50
|
+
"RateLimitExceeded",
|
51
|
+
|
52
|
+
# Validators
|
53
|
+
"validate_with",
|
54
|
+
|
55
|
+
# Enums
|
56
|
+
"ActivityType",
|
57
|
+
|
58
|
+
# Cache
|
59
|
+
"CacheManager"
|
60
|
+
]
|
@@ -0,0 +1,81 @@
|
|
1
|
+
from datetime import datetime, timezone
|
2
|
+
from typing import Any, Dict, TypeVar, Generic, Optional
|
3
|
+
from ulid import ULID
|
4
|
+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
5
|
+
from sqlalchemy import Column, String, PrimaryKeyConstraint, UniqueConstraint
|
6
|
+
from sqlalchemy.dialects.postgresql import TIMESTAMP
|
7
|
+
from pydantic import BaseModel, ConfigDict
|
8
|
+
from pydantic import Field
|
9
|
+
|
10
|
+
class Base(DeclarativeBase):
|
11
|
+
"""SQLAlchemy 기본 모델"""
|
12
|
+
pass
|
13
|
+
|
14
|
+
class BaseColumn(Base):
|
15
|
+
"""공통 설정 및 메서드를 제공하는 BaseColumn"""
|
16
|
+
__abstract__ = True
|
17
|
+
|
18
|
+
ulid: Mapped[str] = mapped_column(
|
19
|
+
String,
|
20
|
+
primary_key=True,
|
21
|
+
unique=True,
|
22
|
+
default=lambda: str(ULID()),
|
23
|
+
doc="ULID",
|
24
|
+
nullable=False
|
25
|
+
)
|
26
|
+
created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)
|
27
|
+
updated_at: Mapped[datetime] = mapped_column(
|
28
|
+
default=datetime.utcnow,
|
29
|
+
onupdate=datetime.utcnow
|
30
|
+
)
|
31
|
+
is_deleted: Mapped[bool] = mapped_column(
|
32
|
+
default=False,
|
33
|
+
index=True
|
34
|
+
)
|
35
|
+
|
36
|
+
def to_dict(self) -> Dict[str, Any]:
|
37
|
+
"""모델을 딕셔너리로 변환합니다.
|
38
|
+
|
39
|
+
Returns:
|
40
|
+
Dict[str, Any]: 모델의 속성을 포함하는 딕셔너리
|
41
|
+
"""
|
42
|
+
result = {}
|
43
|
+
|
44
|
+
# 테이블 컬럼 처리
|
45
|
+
for column in self.__table__.columns:
|
46
|
+
value = getattr(self, column.name)
|
47
|
+
if isinstance(value, datetime):
|
48
|
+
value = value.isoformat()
|
49
|
+
result[column.name] = value
|
50
|
+
|
51
|
+
# Relationship 처리 (이미 로드된 관계만 처리)
|
52
|
+
for relationship in self.__mapper__.relationships:
|
53
|
+
if relationship.key == "organizations": # 순환 참조 방지
|
54
|
+
continue
|
55
|
+
try:
|
56
|
+
value = getattr(self, relationship.key)
|
57
|
+
if value is not None:
|
58
|
+
if isinstance(value, list):
|
59
|
+
result[relationship.key] = [item.to_dict() for item in value]
|
60
|
+
else:
|
61
|
+
result[relationship.key] = value.to_dict()
|
62
|
+
else:
|
63
|
+
result[relationship.key] = None
|
64
|
+
except Exception:
|
65
|
+
result[relationship.key] = None
|
66
|
+
|
67
|
+
return result
|
68
|
+
|
69
|
+
class BaseSchema(BaseModel):
|
70
|
+
"""공통 설정 및 메서드를 제공하는 BaseSchema"""
|
71
|
+
model_config = ConfigDict(
|
72
|
+
str_strip_whitespace=True,
|
73
|
+
extra="allow",
|
74
|
+
from_attributes=True,
|
75
|
+
populate_by_name=True,
|
76
|
+
use_enum_values=True
|
77
|
+
)
|
78
|
+
|
79
|
+
def to_dict(self) -> Dict[str, Any]:
|
80
|
+
"""모델을 딕셔너리로 변환"""
|
81
|
+
return self.model_dump()
|