diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 343a65f6..22bc3ae8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,8 +38,3 @@ jobs: run: | uv pip install pre-commit uv run pre-commit run --all-files --show-diff-on-failure - - - name: Run Bandit - run: | - uv pip install bandit - uv run bandit -r . -x "./.venv/*","./tests" --severity-level medium diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 50d61adc..a8901bef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,18 +1,24 @@ -repos: - - repo: https://github.com/psf/black - rev: 25.11.0 - hooks: - - id: black +default_language_version: + python: python3.12 +repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.5 + rev: v0.15.15 hooks: - - id: ruff + - id: ruff-check + args: ["--fix", "--exit-non-zero-on-fix"] + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: check-toml - id: check-yaml + - id: debug-statements + - id: detect-private-key - id: end-of-file-fixer - id: trailing-whitespace @@ -21,6 +27,16 @@ repos: hooks: - id: pyproject-fmt + - repo: https://github.com/PyCQA/bandit + rev: 1.9.4 + hooks: + - id: bandit + additional_dependencies: + - "bandit[toml]" + args: + - "--configfile=pyproject.toml" + - "--severity-level=medium" + - repo: local hooks: - id: Test Coverage diff --git a/pyproject.toml b/pyproject.toml index ff7579db..c92384d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ optional-dependencies.dev = [ "metis[test]", ] optional-dependencies.lint = [ - "black>=26.5.1", + "bandit>=1.9.4", "mypy>=2.1.0", "pre-commit>=4.6.0", "ruff>=0.15.15", @@ -73,5 +73,8 @@ package-data."metis.plugins" = [ "plugins.yaml" ] package-data."metis.schemas" = [ "*.json" ] package-data.metis = [ "metis.yaml" ] +[tool.ruff] +lint.isort.force-single-line = true + [tool.pyproject-fmt] keep_full_version = true diff --git a/src/metis/cli/utils.py b/src/metis/cli/utils.py index a88a2f61..e1a4e626 100644 --- a/src/metis/cli/utils.py +++ b/src/metis/cli/utils.py @@ -563,7 +563,7 @@ def pretty_print_reviews(results, quiet=False): print_console(f"\n[bold blue]File: {escape(file)}[/bold blue]", quiet) for idx, r in enumerate(reviews, 1): print_console( - f" [yellow]Identified issue {idx}:[/yellow] [bold]{escape(r.get('issue','-'))}[/bold]", + f" [yellow]Identified issue {idx}:[/yellow] [bold]{escape(r.get('issue', '-'))}[/bold]", quiet, ) if r.get("code_snippet"): diff --git a/src/metis/providers/azure_openai.py b/src/metis/providers/azure_openai.py index f32ae810..0c402760 100644 --- a/src/metis/providers/azure_openai.py +++ b/src/metis/providers/azure_openai.py @@ -60,7 +60,6 @@ async def _aget_text_embeddings(self, texts: list[str]) -> list[Embedding]: class AzureOpenAIProvider(LLMProvider): - def __init__(self, config: AzureOpenAIProviderConfig) -> None: self.api_key = config["llm_api_key"] self.azure_endpoint = config["azure_endpoint"] diff --git a/src/metis/providers/base.py b/src/metis/providers/base.py index e0358052..64299007 100644 --- a/src/metis/providers/base.py +++ b/src/metis/providers/base.py @@ -83,7 +83,6 @@ class QueryEngineKwargs(ProviderChatModelKwargs, total=False): class LLMProvider(ABC): - def __init__(self, config: ProviderRuntimeConfig) -> None: pass diff --git a/src/metis/providers/ollama.py b/src/metis/providers/ollama.py index eaaf96c1..bbdcf787 100644 --- a/src/metis/providers/ollama.py +++ b/src/metis/providers/ollama.py @@ -11,7 +11,6 @@ class OllamaProvider(OpenAICompatibleProvider): - def __init__(self, config): super().__init__(config) if not self.base_url: diff --git a/src/metis/providers/openai_compatible.py b/src/metis/providers/openai_compatible.py index eb8bb9bd..881a422c 100644 --- a/src/metis/providers/openai_compatible.py +++ b/src/metis/providers/openai_compatible.py @@ -25,7 +25,6 @@ class OpenAICompatibleProvider(LLMProvider): - def __init__(self, config: OpenAICompatibleProviderConfig) -> None: self.config = config self.api_key = config.get("llm_api_key") diff --git a/src/metis/providers/vllm.py b/src/metis/providers/vllm.py index 48d6beca..9245ac4e 100644 --- a/src/metis/providers/vllm.py +++ b/src/metis/providers/vllm.py @@ -11,7 +11,6 @@ class VLLMProvider(OpenAICompatibleProvider): - def __init__(self, config): super().__init__(config) if not self.base_url: diff --git a/src/metis/utils.py b/src/metis/utils.py index 278da6c4..cd546710 100644 --- a/src/metis/utils.py +++ b/src/metis/utils.py @@ -150,7 +150,6 @@ def find_snippet_line(snippet, file_lines, threshold=0.80): norm_snippet = normalize_lines(snippet_lines) for i in range(len(file_lines) - snippet_len + 1): - window = file_lines[i : i + snippet_len] norm_window = normalize_lines(window)