From e0a6ba98e192263eae39c4729e1568c9159b9e8f Mon Sep 17 00:00:00 2001 From: John Clow Date: Mon, 18 Sep 2023 06:19:52 -0700 Subject: [PATCH] Convert `example` parameter into `examples` on `Field` (#122) Co-authored-by: Marcelo Trylesinski --- bump_pydantic/codemods/field.py | 17 +++++++++++------ tests/unit/test_field.py | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/bump_pydantic/codemods/field.py b/bump_pydantic/codemods/field.py index 0a4692a..5ba7f47 100644 --- a/bump_pydantic/codemods/field.py +++ b/bump_pydantic/codemods/field.py @@ -9,6 +9,7 @@ "min_items": "min_length", "max_items": "max_length", "allow_mutation": "frozen", + "example": "examples", "regex": "pattern", # NOTE: This is only for BaseSettings. "env": "validation_alias", @@ -115,12 +116,16 @@ def leave_field_call(self, original_node: cst.Call, updated_node: cst.Call) -> c if m.matches(arg, m.Arg(keyword=m.Name())): keyword = RENAMED_KEYWORDS.get(arg.keyword.value, arg.keyword.value) # type: ignore value = arg.value - # The `allow_mutation` keyword argument is a special case. It's the negative of `frozen`. - if arg.keyword and arg.keyword.value == "allow_mutation": - if m.matches(arg.value, m.Name(value="False")): - value = cst.Name("True") - elif m.matches(arg.value, m.Name(value="True")): - value = cst.Name("False") + if arg.keyword: + if arg.keyword.value == "allow_mutation": + # The `allow_mutation` keyword is the negative of `frozen`. + if m.matches(arg.value, m.Name(value="False")): + value = cst.Name("True") + elif m.matches(arg.value, m.Name(value="True")): + value = cst.Name("False") + if arg.keyword.value == "example": + # The example keyword is now a list, `examples`. + value = cst.List([cst.Element(arg.value)]) new_arg = arg.with_changes(keyword=arg.keyword.with_changes(value=keyword), value=value) # type: ignore new_args.append(new_arg) # type: ignore else: diff --git a/tests/unit/test_field.py b/tests/unit/test_field.py index 33a34a1..448aa01 100644 --- a/tests/unit/test_field.py +++ b/tests/unit/test_field.py @@ -136,3 +136,18 @@ class Potato(BaseModel): potato: Annotated[List[int], Field(..., min_length=1, max_length=10)] """ self.assertCodemod(before, after) + + def test_example_list(self) -> None: + before = """ + from pydantic import BaseSettings, Field + + class Settings(BaseSettings): + potato: int = Field(..., example=1) + """ + after = """ + from pydantic import BaseSettings, Field + + class Settings(BaseSettings): + potato: int = Field(..., examples=[1]) + """ + self.assertCodemod(before, after)