frostming/fix-future-annotations

[0.5.0 misuse] Only exclude 'class .+\(BaseModel\):' is not enough for pydantic proj.

Closed this issue · 3 comments

The "bug" reproducting branch:
https://github.com/boholder/puntgun/commits/test-fix-tool

Env( boholder/puntgun@7ba9738 ):

pyproject.toml:

[tool.fix_future_annotations]
exclude_lines = [
    'class .+\(BaseModel\):'
]

Run the tool (with pre-commit) with the configuration above, then revert the data.py file, unit tests can pass as usual.
Ok, I then tried one by one against the changes (made to the data.py file by this tool) and found that only the insert of from __future__ import annotations statement will actually triggered the error.

Without this line (tests pass):
boholder/puntgun@1e85bb9

With this line (tests fail):
boholder/puntgun@005e180

(puntgun-3.10) \code\python\puntgun>pdm test
ImportError while loading conftest 'E:\code\python\puntgun\tests\conftest.py'.
tests\conftest.py:9: in <module>
    from puntgun.rules.config_parser import ConfigParser
puntgun\rules\config_parser.py:93: in <module>
    import_rule_classes()
puntgun\rules\config_parser.py:32: in import_rule_classes
    importlib.import_module(f"{base_module_name}.{module_name}")
puntgun\rules\user\action_rules.py:3: in <module>
    from puntgun.client import NeedClientMixin
puntgun\client.py:15: in <module>
    from puntgun.rules.data import Media, Place, Poll, Tweet, User
puntgun\rules\data.py:217: in <module>
    class Tweet(BaseModel):
puntgun\rules\data.py:228: in Tweet
    author: User | None = User()
pydantic\main.py:342: in pydantic.main.BaseModel.__init__
    ???
E   pydantic.error_wrappers.ValidationError: 1 validation error for User
E   pinned_tweet
E     field required (type=value_error.missing)

I think it would be better to change the logic of exclude class configuration to "exclude the file where the class is located"? Although there is already a configuration to exclude files, but the configuration to exclude special classes is more flexible than to exclude files?

It up to you, dear maintainer, thank you very much for your work and quick response to the needs. ♥

Since we have exclude_files config, you can add the file pattern(s) to the list.

FYI, the pydantic doc says postponed annotation evaluation is supported: https://docs.pydantic.dev/usage/postponed_annotations/

The error seems correct to me, since you didn't provide a default to pinned_tweet:
boholder/puntgun@005e180#diff-0a9b69acda9a48c2e7fcb336cb26214000a21b4fea91548cc4dac47de0418f6fR60