Spaces:
Configuration error
Configuration error
import sys | |
import ast | |
import os | |
# Extremely restrictive set of allowed numbers | |
ALLOWED_NUMBERS = { | |
0, | |
1, | |
-1, | |
2, | |
10, | |
100, | |
1000, | |
4, | |
3, | |
500, | |
6, | |
60, | |
3600, | |
0.75, | |
7, | |
1024, | |
1011, | |
600, | |
12, | |
1000000000.0, | |
0.1, | |
50, | |
128, | |
6000, | |
30, | |
1000000, | |
5, | |
15, | |
25, | |
10000, | |
60000, | |
8, | |
2048, | |
16000000000, | |
16, | |
16383, | |
14, | |
24, | |
128000, | |
0.01, | |
20, | |
} | |
# Add all standard HTTP status codes | |
HTTP_STATUS_CODES = { | |
200, # OK | |
201, # Created | |
202, # Accepted | |
204, # No Content | |
300, # Multiple Choices | |
301, # Moved Permanently | |
302, # Found | |
303, # See Other | |
304, # Not Modified | |
307, # Temporary Redirect | |
308, # Permanent Redirect | |
400, # Bad Request | |
401, # Unauthorized | |
402, # Payment Required | |
403, # Forbidden | |
404, # Not Found | |
406, # Not Acceptable | |
408, # Request Timeout | |
409, # Conflict | |
413, # Payload Too Large | |
422, # Unprocessable Entity | |
424, # Failed Dependency | |
429, # Too Many Requests | |
498, # Invalid Token | |
499, # Client Closed Request | |
500, # Internal Server Error | |
501, # Not Implemented | |
502, # Bad Gateway | |
503, # Service Unavailable | |
504, # Gateway Timeout | |
520, # Web server is returning an unknown error | |
522, # Connection timed out | |
524, # A timeout occurred | |
529, # Site is overloaded | |
} | |
# Combine the sets | |
ALLOWED_NUMBERS = ALLOWED_NUMBERS.union(HTTP_STATUS_CODES) | |
class HardcodedNumberFinder(ast.NodeVisitor): | |
def __init__(self): | |
self.hardcoded_numbers = [] | |
def visit_Constant(self, node): | |
# For Python 3.8+ | |
if isinstance(node.value, (int, float)) and node.value not in ALLOWED_NUMBERS: | |
self.hardcoded_numbers.append((node.lineno, node.value)) | |
self.generic_visit(node) | |
def visit_Num(self, node): | |
# For older Python versions | |
if node.n not in ALLOWED_NUMBERS: | |
self.hardcoded_numbers.append((node.lineno, node.n)) | |
self.generic_visit(node) | |
def check_file(filename): | |
try: | |
with open(filename, "r") as f: | |
content = f.read() | |
tree = ast.parse(content) | |
finder = HardcodedNumberFinder() | |
finder.visit(tree) | |
if finder.hardcoded_numbers: | |
print(f"ERROR in {filename}: Hardcoded numbers detected:") | |
for line, value in finder.hardcoded_numbers: | |
print(f" Line {line}: {value}") | |
return 1 | |
return 0 | |
except SyntaxError: | |
print(f"Syntax error in {filename}") | |
return 0 | |
def main(): | |
exit_code = 0 | |
folder = "../../litellm" | |
ignore_files = [ | |
"constants.py", | |
"proxy_cli.py", | |
"token_counter.py", | |
"mock_functions.py", | |
"duration_parser.py", | |
"utils.py", | |
] | |
ignore_folder = "types" | |
for root, dirs, files in os.walk(folder): | |
for filename in files: | |
if filename.endswith(".py") and filename not in ignore_files: | |
full_path = os.path.join(root, filename) | |
if ignore_folder in full_path: | |
continue | |
exit_code |= check_file(full_path) | |
sys.exit(exit_code) | |
if __name__ == "__main__": | |
main() | |