diff --git a/libs/community/Makefile b/libs/community/Makefile index 2e3430ff236..55b63f009b5 100644 --- a/libs/community/Makefile +++ b/libs/community/Makefile @@ -45,6 +45,7 @@ lint_tests: PYTHON_FILES=tests lint_tests: MYPY_CACHE=.mypy_cache_test lint lint_diff lint_package lint_tests: + ./scripts/check_pydantic.sh . ./scripts/lint_imports.sh . ./scripts/check_pickle.sh . [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES) diff --git a/libs/community/scripts/check_pydantic.sh b/libs/community/scripts/check_pydantic.sh new file mode 100755 index 00000000000..e53b6325947 --- /dev/null +++ b/libs/community/scripts/check_pydantic.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# +# This script searches for lines starting with "import pydantic" or "from pydantic" +# in tracked files within a Git repository. +# +# Usage: ./scripts/check_pydantic.sh /path/to/repository + +# Check if a path argument is provided +if [ $# -ne 1 ]; then + echo "Usage: $0 /path/to/repository" + exit 1 +fi + +repository_path="$1" + +# Check that we are not using features that cannot be captured via init. +# pre-init is a custom decorator that we introduced to capture the same semantics +# as @root_validator(pre=False, skip_on_failure=False) available in pydantic 1. +count=$(git grep -E '(@root_validator)|(@validator)|(@field_validator)|(@pre_init)' -- "*.py" | wc -l) +# PRs that increase the current count will not be accepted. +# PRs that decrease update the code in the repository +# and allow decreasing the count of are welcome! +current_count=129 + +if [ "$count" -gt "$current_count" ]; then + echo "The PR seems to be introducing new usage of @root_validator and/or @field_validator." + echo "git grep -E '(@root_validator)|(@validator)|(@field_validator)|(@pre_init)' | wc -l returned $count" + echo "whereas the expected count should be equal or less than $current_count" + echo "Please update the code to instead use @model_validator or __init__" + exit 1 +elif [ "$count" -lt "$current_count" ]; then + echo "Please update the $current_count variable in ./scripts/check_pydantic.sh to $count" + exit 1 +fi + +# We do not want to be using pydantic-settings. There's already a pattern to look +# up env settings in the code base, and we want to be using the existing pattern +# rather than relying on an external dependency. +count=$(git grep -E '^import pydantic_settings|^from pydantic_settings' -- "*.py" | wc -l) + +# PRs that increase the current count will not be accepted. +# PRs that decrease update the code in the repository +# and allow decreasing the count of are welcome! +current_count=8 + +if [ "$count" -gt "$current_count" ]; then + echo "The PR seems to be introducing new usage pydantic_settings." + echo "git grep -E '^import pydantic_settings|^from pydantic_settings' | wc -l returned $count" + echo "whereas the expected count should be equal or less than $current_count" + echo "Please update the code to use Field(default_factory=from_env(..)) or Field(default_factory=secret_from_env(..))" + exit 1 +elif [ "$count" -lt "$current_count" ]; then + echo "Please update the $current_count variable in ./scripts/check_pydantic.sh to $count" + exit 1 +fi \ No newline at end of file