mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 02:34:29 +00:00
128 lines
2.8 KiB
Python
128 lines
2.8 KiB
Python
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,
|
|
}
|
|
|
|
# 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
|
|
408, # Request Timeout
|
|
409, # Conflict
|
|
422, # Unprocessable Entity
|
|
429, # Too Many Requests
|
|
499, # Client Closed Request
|
|
500, # Internal Server Error
|
|
501, # Not Implemented
|
|
502, # Bad Gateway
|
|
503, # Service Unavailable
|
|
504, # Gateway Timeout
|
|
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"]
|
|
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()
|