Skip to content

bug: KeyError: '*' with @field_validator('*') #22

@mmzeynalli

Description

@mmzeynalli

Description of the bug

Cannot build docs if I have field_validator for all fields: '*'

To Reproduce

from pydantic import BaseModel, ValidationInfo
from pydantic_core import PydanticUndefined


class BaseRequestSchema(BaseModel):

    @field_validator('*', mode='before')
    @classmethod
    def set_if_none(cls, v: Any, info: ValidationInfo):
        """If `None` is set, return default value for that field"""
        if (
            info.field_name
            and not cls.model_fields[info.field_name].is_required()
            and cls.model_fields[info.field_name].get_default() is not PydanticUndefined
            and v is None
        ):
            return cls.model_fields[info.field_name].get_default()

Full traceback

Full traceback
poetry run mkdocs build -f docs/az/mkdocs.yml --strict
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /home/miradilz/Projects/integrify/docs/az/site
ERROR   -  Error reading page 'azericard/api-reference/callback.md': '*'
Traceback (most recent call last):
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/bin/mkdocs", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocs/__main__.py", line 288, in build_command
    build.build(cfg, dirty=not clean)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocs/commands/build.py", line 310, in build
    _populate_page(file.page, config, files, dirty)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocs/commands/build.py", line 167, in _populate_page
    page.render(config, files)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocs/structure/pages.py", line 285, in render
    self.content = md.convert(self.markdown)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/markdown/core.py", line 357, in convert
    root = self.parser.parseDocument(self.lines).getroot()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/markdown/blockparser.py", line 117, in parseDocument
    self.parseChunk(self.root, '\n'.join(lines))
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/markdown/blockparser.py", line 136, in parseChunk
    self.parseBlocks(parent, text.split('\n\n'))
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/markdown/blockparser.py", line 158, in parseBlocks
    if processor.run(parent, blocks) is not False:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocstrings/extension.py", line 128, in run
    html, handler, data = self._process_block(identifier, block, heading_level)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocstrings/extension.py", line 216, in _process_block
    data: CollectorItem = handler.collect(identifier, options)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/mkdocstrings_handlers/python/handler.py", line 322, in collect
    loader.load(
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/_griffe/loader.py", line 184, in load
    return self._post_load(top_module, obj_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/_griffe/loader.py", line 210, in _post_load
    self.extensions.call("on_package_loaded", pkg=module, loader=self)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/_griffe/extensions/base.py", line 313, in call
    getattr(extension, event)(**kwargs)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/extension.py", line 42, in on_package_loaded
    static.process_module(pkg, processed=self.processed, schema=self.schema)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 170, in process_module
    process_module(submodule, processed=processed, schema=schema)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 170, in process_module
    process_module(submodule, processed=processed, schema=schema)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 170, in process_module
    process_module(submodule, processed=processed, schema=schema)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 167, in process_module
    process_class(cls, processed=processed, schema=schema)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 148, in process_class
    process_function(member, cls, processed=processed)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/static.py", line 115, in process_function
    common.process_function(func, cls, fields)
  File "/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/lib/python3.12/site-packages/griffe_pydantic/common.py", line 72, in process_function
    targets = [cls.members[field] for field in fields]
               ~~~~~~~~~~~^^^^^^^
KeyError: '*'
make: *** [Makefile:52: docs] Error 1

Expected behavior

Environment information

python -m griffe_pydantic.debug  # | xclip -selection clipboard
- __System__: Linux-6.8.0-1019-oem-x86_64-with-glibc2.39
- __Python__: cpython 3.12.3 (/home/miradilz/.cache/pypoetry/virtualenvs/integrify-MG0a6qln-py3.12/bin/python)
- __Environment variables__:
- __Installed packages__:
  - `griffe-pydantic` v1.1.0

Additional context

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions