Coverage for src / mysingle / dsl / limits.py: 0%
34 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1"""Resource Limits and Quota Configuration for User DSL Execution"""
3from pydantic import Field
4from pydantic_settings import BaseSettings, SettingsConfigDict
7class ResourceLimits(BaseSettings):
8 """
9 DSL 실행 리소스 제한
11 사용자별 안전한 실행 환경을 위한 제약 조건
12 """
14 # 실행 시간 제한
15 MAX_EXECUTION_TIME_SECONDS: int = Field(
16 default=30, description="최대 실행 시간 (초)"
17 )
19 # 메모리 제한
20 MAX_MEMORY_MB: int = Field(default=512, description="최대 메모리 사용량 (MB)")
22 # 반복 제한
23 MAX_ITERATIONS: int = Field(default=10_000, description="최대 루프 반복 횟수")
25 # 출력 크기 제한
26 MAX_OUTPUT_SIZE_MB: int = Field(default=10, description="최대 출력 크기 (MB)")
28 # 재귀 깊이 제한
29 MAX_RECURSION_DEPTH: int = Field(default=100, description="최대 재귀 깊이")
31 model_config = SettingsConfigDict(env_prefix="DSL_")
34class UserQuota(BaseSettings):
35 """
36 사용자별 할당량 설정
38 무료/프리미엄 티어별 차등 적용
39 """
41 # 무료 티어 (Free Tier)
42 FREE_DAILY_CALCULATIONS: int = Field(
43 default=10_000, description="무료 사용자 일일 계산 횟수"
44 )
45 FREE_MAX_INDICATORS: int = Field(
46 default=10, description="무료 사용자 최대 인디케이터 수"
47 )
48 FREE_MAX_PRIVATE_INDICATORS: int = Field(
49 default=10, description="무료 사용자 최대 프라이빗 인디케이터 수"
50 )
52 # 프리미엄 티어 (Premium Tier)
53 PREMIUM_DAILY_CALCULATIONS: int = Field(
54 default=100_000, description="프리미엄 사용자 일일 계산 횟수"
55 )
56 PREMIUM_MAX_INDICATORS: int = Field(
57 default=-1, description="프리미엄 사용자 최대 인디케이터 수 (-1: 무제한)"
58 )
59 PREMIUM_MAX_PRIVATE_INDICATORS: int = Field(
60 default=-1,
61 description="프리미엄 사용자 최대 프라이빗 인디케이터 수 (-1: 무제한)",
62 )
64 # Rate Limiting
65 RATE_LIMIT_PER_MINUTE: int = Field(
66 default=100, description="분당 API 호출 제한 (사용자별)"
67 )
68 RATE_LIMIT_PER_HOUR: int = Field(
69 default=1000, description="시간당 API 호출 제한 (사용자별)"
70 )
72 # 캐시 TTL
73 QUOTA_CACHE_TTL_SECONDS: int = Field(
74 default=300, description="할당량 캐시 TTL (초)"
75 )
77 model_config = SettingsConfigDict(env_prefix="USER_QUOTA_")
80# 싱글톤 인스턴스
81resource_limits = ResourceLimits()
82user_quota = UserQuota()
85def get_user_daily_limit(is_premium: bool = False) -> int:
86 """사용자 일일 계산 한도 조회"""
87 if is_premium:
88 return user_quota.PREMIUM_DAILY_CALCULATIONS
89 return user_quota.FREE_DAILY_CALCULATIONS
92def get_user_max_indicators(is_premium: bool = False) -> int:
93 """사용자 최대 인디케이터 수 조회"""
94 if is_premium:
95 return user_quota.PREMIUM_MAX_INDICATORS
96 return user_quota.FREE_MAX_INDICATORS
99def get_user_max_private_indicators(is_premium: bool = False) -> int:
100 """사용자 최대 프라이빗 인디케이터 수 조회"""
101 if is_premium:
102 return user_quota.PREMIUM_MAX_PRIVATE_INDICATORS
103 return user_quota.FREE_MAX_PRIVATE_INDICATORS