minimum_pre_commit_version: 4.0.1 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: c4a0b883114b00d8d76b479c820ce7950211c99b # v4.5.0 hooks: - id: trailing-whitespace files: \.(mdx|ya?ml|txt)$ - id: end-of-file-fixer files: \.(txt|sh|rst)$ exclude: ^examples/|^mlflow/protos/opentelemetry/ - id: check-vcs-permalinks files: \.py$ require_serial: true - repo: https://github.com/pre-commit/mirrors-prettier rev: "50c5478ed9e10bf360335449280cf2a67f4edb7a" # v2.7.1 hooks: - id: prettier files: '^(?!docs/|mlflow/server/js/|libs/typescript/).+\.(js|ts|md|json|ya?ml)$' require_serial: true - repo: local hooks: - id: uv-lock name: uv-lock entry: uv lock language: system files: '^pyproject\.toml$' stages: [pre-commit] require_serial: true pass_filenames: false - id: normalize-chars name: normalize-chars entry: uv run --frozen --only-group lint dev/normalize_chars.py language: system stages: [pre-commit] types: [text] exclude: '^mlflow/server/js/|^docs/api_reference/source/R-api\.rst$' require_serial: true - id: ruff name: ruff entry: uv run --frozen --only-group lint dev/ruff.py language: system files: '\.(py|ipynb)$' stages: [pre-commit] require_serial: true - id: format name: format entry: uv run --frozen --only-group lint dev/format.py language: system files: '\.(py|ipynb|md|mdx)$' stages: [pre-commit] require_serial: true - id: mypy name: mypy language: system files: | (?x)^( dev/.*\.py| \.claude/skills/.*\.py )$ exclude: | (?x)^( dev/gen_rest_api\.py| dev/proto_plugin\.py| dev/update_ml_package_versions\.py| dev/proto_to_graphql/.*\.py| dev/benchmarks/gateway/fake_server\.py| dev/benchmarks/gateway/benchmark\.py| dev/benchmarks/gateway/run\.py| dev/benchmarks/tracing/.*\.py )$ entry: uv run --frozen --only-group lint mypy require_serial: true - id: unresolved-import name: unresolved-import # Run `ty` to detect broken internal `mlflow.*` imports. Third-party # unresolved imports (optional deps) are filtered out via grep. entry: | bash -c ' out=$(uv run --frozen --only-group lint ty check \ --ignore all \ --error unresolved-import \ --output-format concise \ mlflow/ 2>&1) bad=$(echo "$out" | grep "Module \`mlflow" || true) if [ -n "$bad" ]; then echo "$bad" exit 1 fi ' language: system pass_filenames: false files: ^mlflow/.*\.py$ stages: [pre-commit] require_serial: true - id: clint name: clint entry: uv run --frozen --only-group lint clint language: system files: '\.(py|ipynb|rst|mdx?)$' stages: [pre-commit] require_serial: true - id: check-github-workflows name: check-github-workflows entry: uv run --frozen --only-group lint check-jsonschema --builtin-schema vendor.github-workflows language: system files: ^\.github/workflows/[^/]+\.ya?ml$ stages: [pre-commit] require_serial: true - id: check-github-actions name: check-github-actions entry: uv run --frozen --only-group lint check-jsonschema --builtin-schema vendor.github-actions language: system files: ^\.github/actions/[^/]+/action\.ya?ml$ stages: [pre-commit] require_serial: true - id: install-bin name: install-bin entry: uv run --frozen --only-group lint bin/install.py language: system stages: [pre-commit] require_serial: true pass_filenames: false - id: taplo name: taplo entry: bin/taplo format language: system files: '\.toml$' stages: [pre-commit] require_serial: true - id: must-have-signoff name: must-have-signoff entry: 'grep "Signed-off-by:"' language: system stages: [prepare-commit-msg] require_serial: true - id: mlflow-typo name: mlflow-typo entry: dev/mlflow-typo.sh language: system stages: [pre-commit] require_serial: true - id: check-mlflow-ui name: check-mlflow-ui entry: | bash -c ' if bin/rg "mlflow ui" --line-number --with-filename "$@"; then echo echo "Error - Use \"mlflow server\" instead of \"mlflow ui\"" exit 1 fi ' -- language: system stages: [pre-commit] require_serial: true types: [text] exclude: | (?x)^( \.pre-commit-config\.yaml| CHANGELOG\.md| changelogs/.*| docs/api_reference/source/R-api\.rst| examples/llms/RAG/.*\.(json|csv)| mlflow/cli/__init__\.py| mlflow/R/mlflow/.*| tests/test_cli\.py )$ - id: pyproject name: pyproject entry: uv run --frozen --only-group lint dev/pyproject.py language: system stages: [pre-commit] require_serial: true pass_filenames: false - id: mlver name: ml-package-versions-consistency entry: "uv run --frozen --only-group lint dev/update_ml_package_versions.py --skip-yml" files: '^(mlflow/ml-package-versions\.yml|mlflow/ml_package_versions\.py)$' language: system stages: [pre-commit] require_serial: true pass_filenames: false - id: lint-proto name: lint-proto entry: | bash -c ' if grep -n "com.databricks.mlflow.api.MlflowTrackingMessage" "$@"; then echo "Remove com.databricks.mlflow.api.MlflowTrackingMessage" exit 1 fi ' -- files: '\.proto$' language: system stages: [pre-commit] require_serial: true - id: buf name: buf entry: bin/buf format -d -w --exit-code --exclude-path mlflow/protos/opentelemetry mlflow/protos files: '\.proto$' language: system stages: [pre-commit] require_serial: true pass_filenames: false - id: typos name: typos entry: bin/typos --format brief --color never files: '\.(py$|mdx?$)' language: system stages: [pre-commit] require_serial: true pass_filenames: false - id: conftest name: conftest entry: bin/conftest test --namespace mlflow --policy .github/policy.rego files: '^\.github/(workflows|actions)/.*\.ya?ml$' language: system stages: [pre-commit] require_serial: true - id: check-actions name: check-actions entry: uv run --frozen --only-group lint dev/check_actions.py language: system files: '^\.github/(workflows|actions)/.*\.ya?ml$' pass_filenames: false stages: [pre-commit] require_serial: true - id: regal name: regal entry: bin/regal lint files: '\.rego$' language: system stages: [pre-commit] require_serial: true - id: check-init-py name: check-init-py entry: uv run --frozen --only-group lint dev/check_init_py.py language: system files: '^(mlflow|tests)/.*\.py$' stages: [pre-commit] require_serial: true pass_filenames: false - id: forbid-gif name: forbid-gif language: fail entry: "Please use MP4 instead of GIF for docs animations" files: ^docs/.*\.gif$ stages: [pre-commit] - id: no-yaml name: no-yaml language: fail entry: "Use .yml instead of .yaml" files: ^\.github/(workflows|actions)/.*\.yaml$ stages: [pre-commit] - id: check-component-ids name: check-component-ids entry: | bash -c ' if ! node .github/actions/check-component-ids/index.js; then echo echo "Auto-regenerating componentId registry..." node .github/actions/check-component-ids/regenerate.js git add .github/actions/check-component-ids/componentId-registry.js exit 1 fi ' language: system files: ^(mlflow/server/js/src/|\.github/actions/check-component-ids/) stages: [pre-commit] require_serial: true pass_filenames: false - id: js-fmt name: js-fmt entry: dev/js.sh fmt language: system files: ^mlflow/server/js/ stages: [pre-commit] require_serial: true - id: no-spaces name: no-spaces language: fail entry: "Filenames must not contain spaces" files: " " - id: skills name: skills entry: uv run --frozen --only-group lint dev/check_skills.py language: system files: '(^|/)SKILL\.md$' stages: [pre-commit] require_serial: true