Python lint: Ruff rules for pylint and code complexity (#525)
This commit is contained in:
parent
47d35f0b3c
commit
c47c767ff4
5 changed files with 37 additions and 22 deletions
|
|
@ -102,18 +102,36 @@ executionEnvironments = [
|
||||||
{ root = "examples/servers", reportUnusedFunction = false },
|
{ root = "examples/servers", reportUnusedFunction = false },
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.ruff.lint]
|
|
||||||
select = ["C4", "E", "F", "I", "PERF", "UP"]
|
|
||||||
ignore = ["PERF203"]
|
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
line-length = 120
|
line-length = 120
|
||||||
target-version = "py310"
|
target-version = "py310"
|
||||||
extend-exclude = ["README.md"]
|
extend-exclude = ["README.md"]
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = [
|
||||||
|
"C4", # flake8-comprehensions
|
||||||
|
"C90", # mccabe
|
||||||
|
"E", # pycodestyle
|
||||||
|
"F", # pyflakes
|
||||||
|
"I", # isort
|
||||||
|
"PERF", # Perflint
|
||||||
|
"PL", # Pylint
|
||||||
|
"UP", # pyupgrade
|
||||||
|
]
|
||||||
|
ignore = ["PERF203", "PLC0415", "PLR0402"]
|
||||||
|
mccabe.max-complexity = 24 # Default is 10
|
||||||
|
|
||||||
[tool.ruff.lint.per-file-ignores]
|
[tool.ruff.lint.per-file-ignores]
|
||||||
"__init__.py" = ["F401"]
|
"__init__.py" = ["F401"]
|
||||||
"tests/server/fastmcp/test_func_metadata.py" = ["E501"]
|
"tests/server/fastmcp/test_func_metadata.py" = ["E501"]
|
||||||
|
"tests/shared/test_progress_notifications.py" = ["PLW0603"]
|
||||||
|
|
||||||
|
[tool.ruff.lint.pylint]
|
||||||
|
allow-magic-value-types = ["bytes", "float", "int", "str"]
|
||||||
|
max-args = 23 # Default is 5
|
||||||
|
max-branches = 23 # Default is 12
|
||||||
|
max-returns = 13 # Default is 6
|
||||||
|
max-statements = 102 # Default is 50
|
||||||
|
|
||||||
[tool.uv.workspace]
|
[tool.uv.workspace]
|
||||||
members = ["examples/servers/*", "examples/snippets"]
|
members = ["examples/servers/*", "examples/snippets"]
|
||||||
|
|
|
||||||
|
|
@ -182,8 +182,7 @@ class FastMCP(Generic[LifespanResultT]):
|
||||||
raise ValueError("Cannot specify both auth_server_provider and token_verifier")
|
raise ValueError("Cannot specify both auth_server_provider and token_verifier")
|
||||||
if not auth_server_provider and not token_verifier:
|
if not auth_server_provider and not token_verifier:
|
||||||
raise ValueError("Must specify either auth_server_provider or token_verifier when auth is enabled")
|
raise ValueError("Must specify either auth_server_provider or token_verifier when auth is enabled")
|
||||||
else:
|
elif auth_server_provider or token_verifier:
|
||||||
if auth_server_provider or token_verifier:
|
|
||||||
raise ValueError("Cannot specify auth_server_provider or token_verifier without auth settings")
|
raise ValueError("Cannot specify auth_server_provider or token_verifier without auth settings")
|
||||||
|
|
||||||
self._auth_server_provider = auth_server_provider
|
self._auth_server_provider = auth_server_provider
|
||||||
|
|
|
||||||
|
|
@ -139,14 +139,14 @@ class FuncMetadata(BaseModel):
|
||||||
if field_info.alias:
|
if field_info.alias:
|
||||||
key_to_field_info[field_info.alias] = field_info
|
key_to_field_info[field_info.alias] = field_info
|
||||||
|
|
||||||
for data_key in data.keys():
|
for data_key, data_value in data.items():
|
||||||
if data_key not in key_to_field_info:
|
if data_key not in key_to_field_info:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
field_info = key_to_field_info[data_key]
|
field_info = key_to_field_info[data_key]
|
||||||
if isinstance(data[data_key], str) and field_info.annotation is not str:
|
if isinstance(data_value, str) and field_info.annotation is not str:
|
||||||
try:
|
try:
|
||||||
pre_parsed = json.loads(data[data_key])
|
pre_parsed = json.loads(data_value)
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
continue # Not JSON - skip
|
continue # Not JSON - skip
|
||||||
if isinstance(pre_parsed, str | int | float):
|
if isinstance(pre_parsed, str | int | float):
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,6 @@ import mcp.types as types
|
||||||
from mcp.server.lowlevel.helper_types import ReadResourceContents
|
from mcp.server.lowlevel.helper_types import ReadResourceContents
|
||||||
from mcp.server.models import InitializationOptions
|
from mcp.server.models import InitializationOptions
|
||||||
from mcp.server.session import ServerSession
|
from mcp.server.session import ServerSession
|
||||||
from mcp.server.stdio import stdio_server as stdio_server
|
|
||||||
from mcp.shared.context import RequestContext
|
from mcp.shared.context import RequestContext
|
||||||
from mcp.shared.exceptions import McpError
|
from mcp.shared.exceptions import McpError
|
||||||
from mcp.shared.message import ServerMessageMetadata, SessionMessage
|
from mcp.shared.message import ServerMessageMetadata, SessionMessage
|
||||||
|
|
|
||||||
|
|
@ -838,9 +838,8 @@ class StreamableHTTPServerTransport:
|
||||||
# If this response is for an existing request stream,
|
# If this response is for an existing request stream,
|
||||||
# send it there
|
# send it there
|
||||||
target_request_id = response_id
|
target_request_id = response_id
|
||||||
else:
|
|
||||||
# Extract related_request_id from meta if it exists
|
# Extract related_request_id from meta if it exists
|
||||||
if (
|
elif (
|
||||||
session_message.metadata is not None
|
session_message.metadata is not None
|
||||||
and isinstance(
|
and isinstance(
|
||||||
session_message.metadata,
|
session_message.metadata,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue