Files
mlflow--mlflow/.pre-commit-config.yaml
2026-07-13 13:22:34 +08:00

318 lines
9.4 KiB
YAML

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