mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-11 22:51:28 +00:00
ruff.toml excludes tests/* from `ruff check`, so nothing has ever checked the test tree for names that do not exist. That matters more in tests than in product code: a NameError inside a test whose body is wrapped in `except Exception: pass` is swallowed, and the test reports green forever. Adds ruff-tests.toml selecting F821 alone, wired into the lint workflow and `make lint-ruff`, and clears every existing violation: - 4 tests interpolated an unbound `e` into a `pytest.fail` message reached only on the failure path, so the NameError, not the assertion, is what ran. test_llm_guard_error_raising is the worst: it passes today with content safety disabled entirely. It now asserts the 400 and its detail body. - 5 sites construct BaseExceptionGroup, a 3.11 builtin, in a tree that still supports 3.10. Guarded behind the exceptiongroup backport that anyio already pulls in below 3.11. - 9 missing imports (json, openai, Any, Final, HTTPException), including one in a helper that catches HTTPException by a name it never imported, so the challenge path it exists to detect raises NameError instead. - 5 annotations naming types imported inside the function body, hoisted to module scope or TYPE_CHECKING. - 2 blocks of dead code: everything after a pytest.fail in test_claude_agent_sdk, and an unused helper in test_end_users calling a function defined in a different module. - 1 error-path f-string in the router-settings doc test that masked the real FileNotFoundError behind a NameError. Only F821 for now. Widening the select list means ratcheting thousands of pre-existing findings, so rules go in one at a time with their violations already fixed.
85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
import os
|
|
import re
|
|
import inspect
|
|
from typing import Type
|
|
import sys
|
|
|
|
sys.path.insert(
|
|
0, os.path.abspath("../..")
|
|
) # Adds the parent directory to the system path
|
|
import litellm
|
|
|
|
|
|
def get_init_params(cls: Type) -> list[str]:
|
|
"""
|
|
Retrieve all parameters supported by the `__init__` method of a given class.
|
|
|
|
Args:
|
|
cls: The class to inspect.
|
|
|
|
Returns:
|
|
A list of parameter names.
|
|
"""
|
|
if not hasattr(cls, "__init__"):
|
|
raise ValueError(
|
|
f"The provided class {cls.__name__} does not have an __init__ method."
|
|
)
|
|
|
|
init_method = cls.__init__
|
|
argspec = inspect.getfullargspec(init_method)
|
|
|
|
# The first argument is usually 'self', so we exclude it
|
|
return argspec.args[1:] # Exclude 'self'
|
|
|
|
|
|
router_init_params = set(get_init_params(litellm.router.Router))
|
|
print(router_init_params)
|
|
router_init_params.remove("model_list")
|
|
|
|
# Parse the documentation to extract documented keys
|
|
_test_dir = os.path.dirname(os.path.abspath(__file__))
|
|
_repo_root = os.path.abspath(os.path.join(_test_dir, "..", ".."))
|
|
print(os.listdir(_repo_root))
|
|
docs_path = os.path.join(
|
|
_repo_root, "docs", "my-website", "docs", "proxy", "config_settings.md"
|
|
)
|
|
documented_keys = set()
|
|
try:
|
|
with open(docs_path, "r", encoding="utf-8") as docs_file:
|
|
content = docs_file.read()
|
|
|
|
# Find the section titled "general_settings - Reference"
|
|
general_settings_section = re.search(
|
|
r"### router_settings - Reference(.*?)###", content, re.DOTALL
|
|
)
|
|
if general_settings_section:
|
|
# Extract the table rows, which contain the documented keys
|
|
table_content = general_settings_section.group(1)
|
|
doc_key_pattern = re.compile(
|
|
r"\|\s*([^\|]+?)\s*\|"
|
|
) # Capture the key from each row of the table
|
|
documented_keys.update(doc_key_pattern.findall(table_content))
|
|
except Exception as e:
|
|
raise Exception(
|
|
f"Error reading documentation: {e}, \n repo base - {os.listdir(_repo_root)}"
|
|
)
|
|
|
|
|
|
# Compare and find undocumented keys
|
|
undocumented_keys = router_init_params - documented_keys
|
|
|
|
# Print results
|
|
print("Keys expected in 'router settings' (found in code):")
|
|
for key in sorted(router_init_params):
|
|
print(key)
|
|
|
|
if undocumented_keys:
|
|
raise Exception(
|
|
f"\nKeys not documented in 'router settings - Reference': {undocumented_keys}"
|
|
)
|
|
else:
|
|
print(
|
|
"\nAll keys are documented in 'router settings - Reference'. - {}".format(
|
|
router_init_params
|
|
)
|
|
)
|