coding-client 1.21.2__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.
Files changed (109) hide show
  1. coding_client/__init__.py +1 -0
  2. coding_client/api/__init__.py +19 -0
  3. coding_client/api/exception_handlers.py +158 -0
  4. coding_client/api/logging_setup.py +44 -0
  5. coding_client/api/metrics.py +40 -0
  6. coding_client/api/openapi_config.py +124 -0
  7. coding_client/api/request_logging.py +60 -0
  8. coding_client/api/validation.py +150 -0
  9. coding_client/auth/__init__.py +78 -0
  10. coding_client/auth/_default_tenant.py +132 -0
  11. coding_client/auth/_header_trust.py +98 -0
  12. coding_client/auth/_onbehalf.py +315 -0
  13. coding_client/auth/_trusted_networks.py +94 -0
  14. coding_client/auth/dependencies.py +61 -0
  15. coding_client/auth/middleware.py +445 -0
  16. coding_client/auth/models.py +83 -0
  17. coding_client/auth/outbound.py +137 -0
  18. coding_client/auth/rbac.py +21 -0
  19. coding_client/auth/rbac_coding.py +5 -0
  20. coding_client/auth/tenant.py +650 -0
  21. coding_client/auth/websocket.py +148 -0
  22. coding_client/clients/__init__.py +24 -0
  23. coding_client/clients/base.py +131 -0
  24. coding_client/clients/coding_ai.py +33 -0
  25. coding_client/clients/coding_analysis.py +36 -0
  26. coding_client/clients/coding_containers.py +45 -0
  27. coding_client/clients/coding_github.py +127 -0
  28. coding_client/clients/coding_realtime.py +127 -0
  29. coding_client/clients/coding_security.py +51 -0
  30. coding_client/clients/coding_testing.py +31 -0
  31. coding_client/clients/coding_workspaces.py +265 -0
  32. coding_client/config/__init__.py +12 -0
  33. coding_client/config/base_settings.py +61 -0
  34. coding_client/config/yaml_config_loader.py +172 -0
  35. coding_client/db/__init__.py +42 -0
  36. coding_client/db/db_types.py +122 -0
  37. coding_client/db/exceptions.py +59 -0
  38. coding_client/db/postgres_connection.py +572 -0
  39. coding_client/db/tenant_query_helper.py +417 -0
  40. coding_client/db_init.py +49 -0
  41. coding_client/exceptions/__init__.py +67 -0
  42. coding_client/exceptions/api_exceptions.py +395 -0
  43. coding_client/exceptions/pydantic_ai_exceptions.py +533 -0
  44. coding_client/interfaces/__init__.py +22 -0
  45. coding_client/interfaces/cache_interface.py +179 -0
  46. coding_client/interfaces/container_interface.py +49 -0
  47. coding_client/interfaces/docker_interface.py +283 -0
  48. coding_client/interfaces/graph_interface.py +28 -0
  49. coding_client/interfaces/security_interface.py +72 -0
  50. coding_client/interfaces/webhook_interface.py +67 -0
  51. coding_client/llm/__init__.py +54 -0
  52. coding_client/llm/base_agent.py +195 -0
  53. coding_client/llm/context.py +121 -0
  54. coding_client/llm/responses.py +102 -0
  55. coding_client/llm/routing.py +82 -0
  56. coding_client/llm/settings.py +102 -0
  57. coding_client/models/__init__.py +62 -0
  58. coding_client/models/agent.py +38 -0
  59. coding_client/models/ai_test_failure.py +745 -0
  60. coding_client/models/analysis.py +330 -0
  61. coding_client/models/architecture.py +685 -0
  62. coding_client/models/bug.py +128 -0
  63. coding_client/models/code_graph.py +317 -0
  64. coding_client/models/container.py +241 -0
  65. coding_client/models/core.py +878 -0
  66. coding_client/models/docker_container.py +104 -0
  67. coding_client/models/github.py +293 -0
  68. coding_client/models/logging.py +29 -0
  69. coding_client/models/package_manager.py +257 -0
  70. coding_client/models/pr_validation.py +440 -0
  71. coding_client/models/pydantic_ai.py +395 -0
  72. coding_client/models/repo_scanner.py +249 -0
  73. coding_client/models/responses.py +431 -0
  74. coding_client/models/security.py +185 -0
  75. coding_client/models/static_analysis.py +508 -0
  76. coding_client/models/system.py +48 -0
  77. coding_client/models/test_executor.py +204 -0
  78. coding_client/models/testing.py +673 -0
  79. coding_client/models/testing_config.py +200 -0
  80. coding_client/models/validation.py +127 -0
  81. coding_client/models_init.py +272 -0
  82. coding_client/telemetry.py +195 -0
  83. coding_client/testing.py +180 -0
  84. coding_client/types/__init__.py +130 -0
  85. coding_client/types/constraint_types.py +276 -0
  86. coding_client/types/core_types.py +112 -0
  87. coding_client/types/state_machine.py +443 -0
  88. coding_client/utils/__init__.py +86 -0
  89. coding_client/utils/archive_utils.py +387 -0
  90. coding_client/utils/ast_debug.py +45 -0
  91. coding_client/utils/async_timeout.py +364 -0
  92. coding_client/utils/constants.py +518 -0
  93. coding_client/utils/content_processing.py +326 -0
  94. coding_client/utils/database.py +916 -0
  95. coding_client/utils/encoding_helper.py +222 -0
  96. coding_client/utils/enum_helpers.py +166 -0
  97. coding_client/utils/file_operations.py +177 -0
  98. coding_client/utils/filesystem_ops.py +528 -0
  99. coding_client/utils/http_client.py +562 -0
  100. coding_client/utils/path_utils.py +471 -0
  101. coding_client/utils/profiling.py +421 -0
  102. coding_client/utils/response_builder.py +240 -0
  103. coding_client/utils/retry_helper.py +712 -0
  104. coding_client/utils/security_validation.py +423 -0
  105. coding_client-1.21.2.dist-info/METADATA +234 -0
  106. coding_client-1.21.2.dist-info/RECORD +109 -0
  107. coding_client-1.21.2.dist-info/WHEEL +5 -0
  108. coding_client-1.21.2.dist-info/licenses/LICENSE +201 -0
  109. coding_client-1.21.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,518 @@
1
+ """Shared constants and configuration values used across the application.
2
+
3
+ This module centralizes commonly used constants, configuration values, and
4
+ magic numbers to avoid duplication and improve maintainability.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import re
10
+ from datetime import timedelta
11
+
12
+ # HTTP Related Constants
13
+ HTTP_TIMEOUT_DEFAULT = 30.0 # seconds
14
+ HTTP_TIMEOUT_LONG = 300.0 # 5 minutes for long operations
15
+ HTTP_TIMEOUT_SHORT = 10.0 # Quick operations
16
+ HTTP_RETRY_COUNT = 3
17
+ HTTP_RETRY_BACKOFF = 0.3
18
+ HTTP_RETRY_STATUS_CODES = [429, 500, 502, 503, 504]
19
+
20
+ # API Response Headers
21
+ HEADERS_JSON = {"Content-Type": "application/json"}
22
+ HEADERS_ACCEPT_JSON = {"Accept": "application/json"}
23
+ HEADERS_GITHUB = {"Accept": "application/vnd.github.v3+json"}
24
+
25
+ # Pagination Constants
26
+ DEFAULT_PAGE_SIZE = 20
27
+ MAX_PAGE_SIZE = 100
28
+ MIN_PAGE_SIZE = 1
29
+ DEFAULT_PAGE_NUMBER = 1
30
+
31
+ # Cache Configuration
32
+ CACHE_TTL_SHORT = timedelta(minutes=5)
33
+ CACHE_TTL_MEDIUM = timedelta(minutes=30)
34
+ CACHE_TTL_LONG = timedelta(hours=1)
35
+ CACHE_TTL_VERY_LONG = timedelta(hours=24)
36
+ CACHE_KEY_PREFIX = "cgh:" # code_graph_helper
37
+
38
+ # File Operation Constants
39
+ MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB
40
+ CHUNK_SIZE = 8192 # 8KB chunks for file reading
41
+ TEMP_DIR_PREFIX = "cgh_temp_"
42
+ LOG_FILE_EXTENSION = ".log"
43
+ JSON_FILE_EXTENSION = ".json"
44
+
45
+ # Path Patterns
46
+ IGNORE_PATTERNS = {
47
+ "__pycache__",
48
+ ".git",
49
+ ".idea",
50
+ ".vscode",
51
+ "node_modules",
52
+ ".pytest_cache",
53
+ ".mypy_cache",
54
+ "*.pyc",
55
+ "*.pyo",
56
+ ".DS_Store",
57
+ "Thumbs.db",
58
+ ".env",
59
+ ".env.*",
60
+ "venv",
61
+ "env",
62
+ ".venv",
63
+ }
64
+
65
+ # File Extensions by Language
66
+ PYTHON_EXTENSIONS = {".py", ".pyw", ".pyi"}
67
+ JAVASCRIPT_EXTENSIONS = {".js", ".jsx", ".mjs"}
68
+ TYPESCRIPT_EXTENSIONS = {".ts", ".tsx", ".d.ts"}
69
+ JAVA_EXTENSIONS = {".java"}
70
+ GO_EXTENSIONS = {".go"}
71
+ RUST_EXTENSIONS = {".rs"}
72
+ C_EXTENSIONS = {".c", ".h"}
73
+ CPP_EXTENSIONS = {".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx"}
74
+ CSHARP_EXTENSIONS = {".cs"}
75
+ RUBY_EXTENSIONS = {".rb"}
76
+ PHP_EXTENSIONS = {".php"}
77
+ SWIFT_EXTENSIONS = {".swift"}
78
+ KOTLIN_EXTENSIONS = {".kt", ".kts"}
79
+
80
+ # Language Mapping
81
+ LANGUAGE_EXTENSIONS: dict[str, set[str]] = {
82
+ "python": PYTHON_EXTENSIONS,
83
+ "javascript": JAVASCRIPT_EXTENSIONS,
84
+ "typescript": TYPESCRIPT_EXTENSIONS,
85
+ "java": JAVA_EXTENSIONS,
86
+ "go": GO_EXTENSIONS,
87
+ "rust": RUST_EXTENSIONS,
88
+ "c": C_EXTENSIONS,
89
+ "cpp": CPP_EXTENSIONS,
90
+ "csharp": CSHARP_EXTENSIONS,
91
+ "ruby": RUBY_EXTENSIONS,
92
+ "php": PHP_EXTENSIONS,
93
+ "swift": SWIFT_EXTENSIONS,
94
+ "kotlin": KOTLIN_EXTENSIONS,
95
+ }
96
+
97
+ # Supported Languages
98
+ SUPPORTED_LANGUAGES = set(LANGUAGE_EXTENSIONS.keys())
99
+
100
+ # Database Constants
101
+ DB_POOL_SIZE = 20
102
+ DB_MAX_OVERFLOW = 10
103
+ DB_POOL_TIMEOUT = 30
104
+ DB_ECHO = False
105
+ DB_TRANSACTION_TIMEOUT = 60 # seconds
106
+
107
+ # Container Configuration
108
+ CONTAINER_BASE_PORT = 8700
109
+ CONTAINER_PORT_RANGE = 100 # Ports 8700-8799
110
+ CONTAINER_HEALTH_CHECK_INTERVAL = 5 # seconds
111
+ CONTAINER_HEALTH_CHECK_TIMEOUT = 30 # seconds
112
+ CONTAINER_HEALTH_CHECK_RETRIES = 6
113
+ CONTAINER_STOP_TIMEOUT = 10 # seconds
114
+ CONTAINER_NAME_PREFIX = "cgh_"
115
+ CONTAINER_LABEL_PREFIX = "com.codegraphhelper"
116
+
117
+ # Docker Constants
118
+ DOCKER_IMAGE_NAME = "code_graph_helper-api:latest"
119
+ DOCKER_NETWORK_NAME = "code_graph_network"
120
+ DOCKER_VOLUME_PREFIX = "cgh_volume_"
121
+ DOCKER_BUILD_TIMEOUT = 600 # 10 minutes
122
+ DOCKER_PULL_TIMEOUT = 300 # 5 minutes
123
+
124
+ # Quality Analysis Constants
125
+ MAX_FUNCTION_LENGTH = 50 # lines
126
+ MAX_FILE_LENGTH = 500 # lines
127
+ MAX_CYCLOMATIC_COMPLEXITY = 10
128
+ MAX_COGNITIVE_COMPLEXITY = 15
129
+ MAX_PARAMETERS = 5
130
+ MAX_NESTING_DEPTH = 4
131
+ MIN_FUNCTION_NAME_LENGTH = 3
132
+ MAX_LINE_LENGTH = 120
133
+
134
+ # Security Constants
135
+ MAX_REQUEST_SIZE = 10 * 1024 * 1024 # 10MB
136
+ ALLOWED_UPLOAD_EXTENSIONS = {
137
+ *PYTHON_EXTENSIONS,
138
+ *JAVASCRIPT_EXTENSIONS,
139
+ *TYPESCRIPT_EXTENSIONS,
140
+ *JAVA_EXTENSIONS,
141
+ *GO_EXTENSIONS,
142
+ *RUST_EXTENSIONS,
143
+ *C_EXTENSIONS,
144
+ *CPP_EXTENSIONS,
145
+ ".txt",
146
+ ".md",
147
+ ".json",
148
+ ".yaml",
149
+ ".yml",
150
+ ".xml",
151
+ ".toml",
152
+ ".ini",
153
+ ".cfg",
154
+ ".conf",
155
+ }
156
+
157
+ # API Rate Limiting
158
+ RATE_LIMIT_REQUESTS = 100
159
+ RATE_LIMIT_WINDOW = 60 # seconds
160
+ RATE_LIMIT_BURST = 20
161
+
162
+ # Webhook Configuration
163
+ WEBHOOK_TIMEOUT = 30 # seconds
164
+ WEBHOOK_MAX_RETRIES = 3
165
+ WEBHOOK_RETRY_DELAY = 5 # seconds
166
+ WEBHOOK_SIGNATURE_HEADER = "X-Hub-Signature-256"
167
+ WEBHOOK_EVENT_HEADER = "X-GitHub-Event"
168
+
169
+ # GitHub Integration
170
+ GITHUB_API_BASE_URL = "https://api.github.com"
171
+ GITHUB_API_VERSION = "2022-11-28"
172
+ GITHUB_MAX_FILE_SIZE = 1024 * 1024 # 1MB for API
173
+ GITHUB_PER_PAGE = 100 # Max items per page
174
+ GITHUB_MAX_SEARCH_RESULTS = 1000
175
+
176
+ # Testing Constants
177
+ TEST_TIMEOUT_DEFAULT = 300 # 5 minutes
178
+ TEST_TIMEOUT_LONG = 600 # 10 minutes
179
+ TEST_RETRY_COUNT = 2
180
+ TEST_PARALLEL_WORKERS = 4
181
+ TEST_COVERAGE_THRESHOLD = 80.0 # percent
182
+
183
+ # Logging Configuration
184
+ LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
185
+ LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
186
+ LOG_MAX_BYTES = 10 * 1024 * 1024 # 10MB
187
+ LOG_BACKUP_COUNT = 5
188
+ LOG_ENCODING = "utf-8"
189
+
190
+ # Analysis Constants
191
+ ANALYSIS_BATCH_SIZE = 100
192
+ ANALYSIS_WORKER_COUNT = 4
193
+ ANALYSIS_QUEUE_SIZE = 1000
194
+ ANALYSIS_TIMEOUT = 300 # 5 minutes per file
195
+
196
+ # Graph Database Constants
197
+ NEO4J_BATCH_SIZE = 1000
198
+ NEO4J_CONNECTION_TIMEOUT = 30
199
+ NEO4J_MAX_CONNECTION_LIFETIME = 3600 # 1 hour
200
+ NEO4J_MAX_CONNECTION_POOL_SIZE = 50
201
+
202
+ # Redis Configuration
203
+ REDIS_KEY_SEPARATOR = ":"
204
+ REDIS_LOCK_TIMEOUT = 60 # seconds
205
+ REDIS_LOCK_RETRY_DELAY = 0.1 # seconds
206
+ REDIS_PIPELINE_SIZE = 100
207
+
208
+ # Error Messages
209
+ ERROR_INVALID_PARAMETER = "Invalid parameter: {parameter}"
210
+ ERROR_NOT_FOUND = "{resource} not found"
211
+ ERROR_ALREADY_EXISTS = "{resource} already exists"
212
+ ERROR_PERMISSION_DENIED = "Permission denied for {resource}"
213
+ ERROR_OPERATION_FAILED = "{operation} failed: {reason}"
214
+ ERROR_VALIDATION_FAILED = "Validation failed: {details}"
215
+ ERROR_TIMEOUT = "Operation timed out after {timeout} seconds"
216
+ ERROR_RATE_LIMITED = "Rate limit exceeded. Try again in {retry_after} seconds"
217
+
218
+ # Success Messages
219
+ SUCCESS_CREATED = "{resource} created successfully"
220
+ SUCCESS_UPDATED = "{resource} updated successfully"
221
+ SUCCESS_DELETED = "{resource} deleted successfully"
222
+ SUCCESS_OPERATION_COMPLETED = "{operation} completed successfully"
223
+
224
+ # Regular Expression Patterns
225
+ REGEX_EMAIL = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
226
+ REGEX_URL = r"^https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&/=]*)$"
227
+ REGEX_GITHUB_REPO = r"^[\w.-]+/[\w.-]+$"
228
+ REGEX_SEMVER = r"^v?\d+\.\d+\.\d+(?:-[\w.]+)?(?:\+[\w.]+)?$"
229
+ REGEX_UUID = r"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
230
+ REGEX_CONTAINER_NAME = r"^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
231
+
232
+ # MIME Types
233
+ MIME_TYPE_JSON = "application/json"
234
+ MIME_TYPE_TEXT = "text/plain"
235
+ MIME_TYPE_HTML = "text/html"
236
+ MIME_TYPE_XML = "application/xml"
237
+ MIME_TYPE_YAML = "application/yaml"
238
+ MIME_TYPE_OCTET_STREAM = "application/octet-stream"
239
+
240
+ # Status Codes (custom ones, standard HTTP codes should be imported from http.HTTPStatus)
241
+ STATUS_PROCESSING = 102
242
+ STATUS_MULTI_STATUS = 207
243
+ STATUS_ALREADY_REPORTED = 208
244
+ STATUS_IM_USED = 226
245
+
246
+ # Time Formats
247
+ TIME_FORMAT_ISO = "%Y-%m-%dT%H:%M:%SZ"
248
+ TIME_FORMAT_HUMAN = "%Y-%m-%d %H:%M:%S"
249
+ TIME_FORMAT_DATE = "%Y-%m-%d"
250
+ TIME_FORMAT_LOG = "%Y%m%d_%H%M%S"
251
+
252
+ # Environment Variables
253
+ ENV_PREFIX = "CGH_"
254
+ ENV_DEBUG = f"{ENV_PREFIX}DEBUG"
255
+ ENV_DATABASE_URL = f"{ENV_PREFIX}DATABASE_URL"
256
+ ENV_REDIS_URL = f"{ENV_PREFIX}REDIS_URL"
257
+ ENV_SECRET_KEY = f"{ENV_PREFIX}SECRET_KEY"
258
+ ENV_GITHUB_TOKEN = f"{ENV_PREFIX}GITHUB_TOKEN"
259
+ ENV_LOG_LEVEL = f"{ENV_PREFIX}LOG_LEVEL"
260
+
261
+ # Feature Flags
262
+ FEATURE_AI_ANALYSIS = "ai_analysis"
263
+ FEATURE_GITHUB_INTEGRATION = "github_integration"
264
+ FEATURE_CONTAINER_SUPPORT = "container_support"
265
+ FEATURE_REAL_TIME_UPDATES = "real_time_updates"
266
+ FEATURE_ADVANCED_METRICS = "advanced_metrics"
267
+
268
+ # Metric Names
269
+ METRIC_API_REQUEST_COUNT = "api_request_count"
270
+ METRIC_API_REQUEST_DURATION = "api_request_duration"
271
+ METRIC_API_ERROR_COUNT = "api_error_count"
272
+ METRIC_CONTAINER_COUNT = "container_count"
273
+ METRIC_ANALYSIS_DURATION = "analysis_duration"
274
+ METRIC_CACHE_HIT_RATE = "cache_hit_rate"
275
+
276
+ # Queue Names
277
+ QUEUE_ANALYSIS = "analysis"
278
+ QUEUE_GITHUB_WEBHOOK = "github_webhook"
279
+ QUEUE_TEST_EXECUTION = "test_execution"
280
+ QUEUE_NOTIFICATION = "notification"
281
+ QUEUE_CLEANUP = "cleanup"
282
+
283
+ # Default Values
284
+ DEFAULT_BRANCH = "main"
285
+ DEFAULT_LANGUAGE = "python"
286
+ DEFAULT_ENCODING = "utf-8"
287
+ DEFAULT_TIMEOUT = 30
288
+ DEFAULT_RETRIES = 3
289
+
290
+ # Validation Limits
291
+ MAX_NAME_LENGTH = 255
292
+ MAX_DESCRIPTION_LENGTH = 1000
293
+ MAX_URL_LENGTH = 2000
294
+ MAX_PATH_LENGTH = 4096
295
+ MAX_QUERY_LENGTH = 10000
296
+ MAX_ARRAY_LENGTH = 1000
297
+
298
+ # Color Codes (for terminal output)
299
+ COLOR_RESET = "\033[0m"
300
+ COLOR_RED = "\033[91m"
301
+ COLOR_GREEN = "\033[92m"
302
+ COLOR_YELLOW = "\033[93m"
303
+ COLOR_BLUE = "\033[94m"
304
+ COLOR_MAGENTA = "\033[95m"
305
+ COLOR_CYAN = "\033[96m"
306
+ COLOR_WHITE = "\033[97m"
307
+
308
+ # ASCII Art (for fun terminal output)
309
+ ASCII_LOGO = r"""
310
+ ____ _ ____ _
311
+ / ___|___ __| | ___ / ___|_ __ __ _ _ __ | |__
312
+ | | / _ \ / _` |/ _ \| | _| '__/ _` | '_ \| '_ \
313
+ | |__| (_) | (_| | __/| |_| | | | (_| | |_) | | | |
314
+ \____\___/ \__,_|\___| \____|_| \__,_| .__/|_| |_|
315
+ |_|
316
+ """
317
+
318
+ # System Thresholds
319
+ CPU_WARNING_THRESHOLD = 80.0 # percent
320
+ MEMORY_WARNING_THRESHOLD = 80.0 # percent
321
+ DISK_WARNING_THRESHOLD = 90.0 # percent
322
+ RESPONSE_TIME_WARNING = 1.0 # seconds
323
+
324
+ # Batch Processing
325
+ BATCH_INSERT_SIZE = 1000
326
+ BATCH_UPDATE_SIZE = 500
327
+ BATCH_DELETE_SIZE = 100
328
+ BATCH_PROCESSING_DELAY = 0.1 # seconds between batches
329
+
330
+ # Complexity Thresholds
331
+ COMPLEXITY_LOW = 5
332
+ COMPLEXITY_MEDIUM = 10
333
+ COMPLEXITY_HIGH = 20
334
+ COMPLEXITY_VERY_HIGH = 30
335
+
336
+ # Code Quality Grades
337
+ GRADE_A = "A" # Excellent
338
+ GRADE_B = "B" # Good
339
+ GRADE_C = "C" # Satisfactory
340
+ GRADE_D = "D" # Needs Improvement
341
+ GRADE_F = "F" # Poor
342
+
343
+ GRADE_THRESHOLDS = {
344
+ GRADE_A: 90,
345
+ GRADE_B: 80,
346
+ GRADE_C: 70,
347
+ GRADE_D: 60,
348
+ GRADE_F: 0,
349
+ }
350
+
351
+ # Common Null/Empty Values to Check
352
+ NULL_VALUES = {"null", "none", "nil", "undefined", "na", "n/a", ""}
353
+ EMPTY_VALUES = {"", " ", "\t", "\n", "\r", "\r\n"}
354
+
355
+ # API Versioning
356
+ API_VERSION_V1 = "v1"
357
+ API_VERSION_V2 = "v2"
358
+ CURRENT_API_VERSION = API_VERSION_V2
359
+ SUPPORTED_API_VERSIONS = {API_VERSION_V1, API_VERSION_V2}
360
+
361
+ # Content Types
362
+ CONTENT_TYPE_JSON = "application/json"
363
+ CONTENT_TYPE_FORM = "application/x-www-form-urlencoded"
364
+ CONTENT_TYPE_MULTIPART = "multipart/form-data"
365
+ CONTENT_TYPE_TEXT = "text/plain"
366
+
367
+ # Date/Time Constants
368
+ SECONDS_PER_MINUTE = 60
369
+ SECONDS_PER_HOUR = 3600
370
+ SECONDS_PER_DAY = 86400
371
+ SECONDS_PER_WEEK = 604800
372
+
373
+ # Magic Numbers (document why these values)
374
+ MAX_RECURSION_DEPTH = 100 # Prevent infinite recursion in graph traversal
375
+ MAX_RETRY_EXPONENTIAL_BACKOFF = 64 # 2^6, about 1 minute max wait
376
+ MIN_PASSWORD_LENGTH = 8 # Security requirement
377
+ MAX_LOGIN_ATTEMPTS = 5 # Before lockout
378
+ LOCKOUT_DURATION = 900 # 15 minutes in seconds
379
+
380
+ # Graph Relationship Types
381
+ REL_IMPORTS = "IMPORTS"
382
+ REL_CALLS = "CALLS"
383
+ REL_INHERITS = "INHERITS"
384
+ REL_IMPLEMENTS = "IMPLEMENTS"
385
+ REL_USES = "USES"
386
+ REL_DEPENDS_ON = "DEPENDS_ON"
387
+ REL_CONTAINS = "CONTAINS"
388
+ REL_REFERENCES = "REFERENCES"
389
+
390
+ # Node Types
391
+ NODE_FILE = "File"
392
+ NODE_CLASS = "Class"
393
+ NODE_FUNCTION = "Function"
394
+ NODE_METHOD = "Method"
395
+ NODE_MODULE = "Module"
396
+ NODE_PACKAGE = "Package"
397
+ NODE_VARIABLE = "Variable"
398
+ NODE_IMPORT = "Import"
399
+
400
+ # Analysis Status
401
+ STATUS_PENDING = "pending"
402
+ STATUS_IN_PROGRESS = "in_progress"
403
+ STATUS_COMPLETED = "completed"
404
+ STATUS_FAILED = "failed"
405
+ STATUS_CANCELLED = "cancelled"
406
+ STATUS_TIMEOUT = "timeout"
407
+
408
+ # Priority Levels
409
+ PRIORITY_LOW = 1
410
+ PRIORITY_MEDIUM = 2
411
+ PRIORITY_HIGH = 3
412
+ PRIORITY_CRITICAL = 4
413
+
414
+ PRIORITY_NAMES = {
415
+ PRIORITY_LOW: "low",
416
+ PRIORITY_MEDIUM: "medium",
417
+ PRIORITY_HIGH: "high",
418
+ PRIORITY_CRITICAL: "critical",
419
+ }
420
+
421
+ # Severity Levels
422
+ SEVERITY_INFO = "info"
423
+ SEVERITY_WARNING = "warning"
424
+ SEVERITY_ERROR = "error"
425
+ SEVERITY_CRITICAL = "critical"
426
+
427
+ # Common Regex Validators as compiled patterns (for performance)
428
+
429
+ COMPILED_EMAIL = re.compile(REGEX_EMAIL)
430
+ COMPILED_URL = re.compile(REGEX_URL)
431
+ COMPILED_GITHUB_REPO = re.compile(REGEX_GITHUB_REPO)
432
+ COMPILED_SEMVER = re.compile(REGEX_SEMVER)
433
+ COMPILED_UUID = re.compile(REGEX_UUID, re.IGNORECASE)
434
+ COMPILED_CONTAINER_NAME = re.compile(REGEX_CONTAINER_NAME)
435
+
436
+ # Frozen sets for performance (immutable and faster lookup)
437
+ FROZEN_NULL_VALUES = frozenset(NULL_VALUES)
438
+ FROZEN_EMPTY_VALUES = frozenset(EMPTY_VALUES)
439
+ FROZEN_IGNORE_PATTERNS = frozenset(IGNORE_PATTERNS)
440
+ FROZEN_SUPPORTED_LANGUAGES = frozenset(SUPPORTED_LANGUAGES)
441
+
442
+ # Type Aliases for clarity
443
+ FileExtensions = set[str]
444
+ LanguageMap = dict[str, FileExtensions]
445
+ Headers = dict[str, str]
446
+ Seconds = float
447
+ Bytes = int
448
+ Percent = float
449
+
450
+ # Export groups for easier imports
451
+ __all__ = [
452
+ # HTTP
453
+ "HTTP_TIMEOUT_DEFAULT",
454
+ "HTTP_TIMEOUT_LONG",
455
+ "HTTP_TIMEOUT_SHORT",
456
+ "HTTP_RETRY_COUNT",
457
+ "HTTP_RETRY_BACKOFF",
458
+ "HTTP_RETRY_STATUS_CODES",
459
+ "HEADERS_JSON",
460
+ "HEADERS_ACCEPT_JSON",
461
+ "HEADERS_GITHUB",
462
+ # Pagination
463
+ "DEFAULT_PAGE_SIZE",
464
+ "MAX_PAGE_SIZE",
465
+ "MIN_PAGE_SIZE",
466
+ "DEFAULT_PAGE_NUMBER",
467
+ # Cache
468
+ "CACHE_TTL_SHORT",
469
+ "CACHE_TTL_MEDIUM",
470
+ "CACHE_TTL_LONG",
471
+ "CACHE_TTL_VERY_LONG",
472
+ "CACHE_KEY_PREFIX",
473
+ # File Operations
474
+ "MAX_FILE_SIZE",
475
+ "CHUNK_SIZE",
476
+ "IGNORE_PATTERNS",
477
+ "LANGUAGE_EXTENSIONS",
478
+ "SUPPORTED_LANGUAGES",
479
+ # Database
480
+ "DB_POOL_SIZE",
481
+ "DB_MAX_OVERFLOW",
482
+ "DB_POOL_TIMEOUT",
483
+ "DB_TRANSACTION_TIMEOUT",
484
+ # Container
485
+ "CONTAINER_BASE_PORT",
486
+ "CONTAINER_HEALTH_CHECK_INTERVAL",
487
+ "CONTAINER_HEALTH_CHECK_TIMEOUT",
488
+ "CONTAINER_NAME_PREFIX",
489
+ # Quality
490
+ "MAX_FUNCTION_LENGTH",
491
+ "MAX_FILE_LENGTH",
492
+ "MAX_CYCLOMATIC_COMPLEXITY",
493
+ "MAX_LINE_LENGTH",
494
+ # Security
495
+ "MAX_REQUEST_SIZE",
496
+ "ALLOWED_UPLOAD_EXTENSIONS",
497
+ # Common Values
498
+ "NULL_VALUES",
499
+ "FROZEN_NULL_VALUES",
500
+ "DEFAULT_BRANCH",
501
+ "DEFAULT_LANGUAGE",
502
+ "DEFAULT_ENCODING",
503
+ # Status and Priority
504
+ "STATUS_PENDING",
505
+ "STATUS_IN_PROGRESS",
506
+ "STATUS_COMPLETED",
507
+ "STATUS_FAILED",
508
+ "PRIORITY_NAMES",
509
+ "SEVERITY_INFO",
510
+ "SEVERITY_WARNING",
511
+ "SEVERITY_ERROR",
512
+ "SEVERITY_CRITICAL",
513
+ # Compiled Regex
514
+ "COMPILED_EMAIL",
515
+ "COMPILED_URL",
516
+ "COMPILED_GITHUB_REPO",
517
+ "COMPILED_UUID",
518
+ ]