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

1"""Resource Limits and Quota Configuration for User DSL Execution""" 

2 

3from pydantic import Field 

4from pydantic_settings import BaseSettings, SettingsConfigDict 

5 

6 

7class ResourceLimits(BaseSettings): 

8 """ 

9 DSL 실행 리소스 제한 

10 

11 사용자별 안전한 실행 환경을 위한 제약 조건 

12 """ 

13 

14 # 실행 시간 제한 

15 MAX_EXECUTION_TIME_SECONDS: int = Field( 

16 default=30, description="최대 실행 시간 (초)" 

17 ) 

18 

19 # 메모리 제한 

20 MAX_MEMORY_MB: int = Field(default=512, description="최대 메모리 사용량 (MB)") 

21 

22 # 반복 제한 

23 MAX_ITERATIONS: int = Field(default=10_000, description="최대 루프 반복 횟수") 

24 

25 # 출력 크기 제한 

26 MAX_OUTPUT_SIZE_MB: int = Field(default=10, description="최대 출력 크기 (MB)") 

27 

28 # 재귀 깊이 제한 

29 MAX_RECURSION_DEPTH: int = Field(default=100, description="최대 재귀 깊이") 

30 

31 model_config = SettingsConfigDict(env_prefix="DSL_") 

32 

33 

34class UserQuota(BaseSettings): 

35 """ 

36 사용자별 할당량 설정 

37 

38 무료/프리미엄 티어별 차등 적용 

39 """ 

40 

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 ) 

51 

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 ) 

63 

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 ) 

71 

72 # 캐시 TTL 

73 QUOTA_CACHE_TTL_SECONDS: int = Field( 

74 default=300, description="할당량 캐시 TTL (초)" 

75 ) 

76 

77 model_config = SettingsConfigDict(env_prefix="USER_QUOTA_") 

78 

79 

80# 싱글톤 인스턴스 

81resource_limits = ResourceLimits() 

82user_quota = UserQuota() 

83 

84 

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 

90 

91 

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 

97 

98 

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