diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7e824369..9aa53dc5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -45,6 +45,9 @@ jobs: - python_version: "3.12" pydantic_version: "25" sphinx_version: "72" + - python_version: "3.12" + pydantic_version: "26" + sphinx_version: "72" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 diff --git a/sphinxcontrib/autodoc_pydantic/directives/autodocumenters.py b/sphinxcontrib/autodoc_pydantic/directives/autodocumenters.py index 88bbd48b..0945ee39 100644 --- a/sphinxcontrib/autodoc_pydantic/directives/autodocumenters.py +++ b/sphinxcontrib/autodoc_pydantic/directives/autodocumenters.py @@ -212,6 +212,7 @@ def __init__(self, *args: Any) -> None: exclude_members = self.options.setdefault("exclude-members", set()) exclude_members.add("model_fields") exclude_members.add("model_config") + exclude_members.add("model_computed_fields") self.pydantic = PydanticAutoDoc(self, is_child=False) def document_members(self, *args, **kwargs): @@ -571,6 +572,10 @@ class PydanticSettingsDocumenter(PydanticModelDocumenter): pyautodoc_prefix = "settings" + def __init__(self, *args: Any) -> None: + super().__init__(*args) + self.options["exclude-members"].add("settings_customise_sources") + @classmethod def can_document_member(cls, member: Any, diff --git a/tests/compatibility.py b/tests/compatibility.py index 71f26912..29f25a4d 100644 --- a/tests/compatibility.py +++ b/tests/compatibility.py @@ -6,7 +6,6 @@ from typing import Tuple, List import re -import pydantic import sphinx from sphinx.addnodes import desc_sig_punctuation, desc_annotation, pending_xref diff --git a/tests/roots/test-base/target/configuration.py b/tests/roots/test-base/target/configuration.py index c4741038..a1cae9c9 100644 --- a/tests/roots/test-base/target/configuration.py +++ b/tests/roots/test-base/target/configuration.py @@ -273,6 +273,21 @@ class SettingsSignaturePrefix(BaseSettings): """SettingsSignaturePrefix.""" +class SettingsHideCustomiseSources(BaseSettings): + """SettingsHideCustomiseSources""" + + @classmethod + def settings_customise_sources( + cls, + settings_cls, + init_settings, + env_settings, + dotenv_settings, + file_secret_settings, + ): + return env_settings, init_settings, file_secret_settings + + class ConfigMembers(BaseModel): """ConfigUndocMembers.""" diff --git a/tests/test_configuration_settings.py b/tests/test_configuration_settings.py index cf270f52..4be9f7fa 100644 --- a/tests/test_configuration_settings.py +++ b/tests/test_configuration_settings.py @@ -1146,3 +1146,32 @@ def test_autodoc_pydantic_settings_hide_reused_validator_false(autodocument): "undoc-members": None}, **kwargs) assert result == actual + + +def test_autodoc_pydantic_settings_hide_settings_customise_sources(autodocument): + """Ensure that `settings_customise_sources` is hidden if provided. + + This relates to #201. + + """ + + kwargs = dict( + object_path='target.configuration.SettingsHideCustomiseSources', + **KWARGS) + + result = [ + '', + '.. py:pydantic_settings:: SettingsHideCustomiseSources', + ' :module: target.configuration', + '', + ' SettingsHideCustomiseSources', + '' + ] + + # explict global + actual = autodocument( + options_app={"autodoc_pydantic_settings_show_validator_members": True}, + options_doc={"members": None, + "undoc-members": None}, + **kwargs) + assert result == actual diff --git a/tests/test_edgecases.py b/tests/test_edgecases.py index 00cc3226..023eceb7 100644 --- a/tests/test_edgecases.py +++ b/tests/test_edgecases.py @@ -9,7 +9,7 @@ from sphinxcontrib.autodoc_pydantic import PydanticModelDocumenter from tests.compatibility import rst_alias_class_directive, \ - TYPEHINTS_PREFIX, TYPING_MODULE_PREFIX_V1, module_doc_string_tab + TYPEHINTS_PREFIX, TYPING_MODULE_PREFIX_V2, module_doc_string_tab def test_not_json_compliant(autodocument): @@ -589,7 +589,7 @@ def test_non_field_attributes(autodocument): '', ' .. py:attribute:: ClassAttribute.class_attribute', ' :module: target.edgecase_non_field_attribute', - f' :type: {TYPING_MODULE_PREFIX_V1}ClassVar[str]', + f' :type: {TYPING_MODULE_PREFIX_V2}ClassVar[str]', ' :value: None', '', ' Dummy', @@ -604,7 +604,7 @@ def test_non_field_attributes(autodocument): assert result == actual -def test_non_field_attributes(autodocument): +def test_nested_pydantic_model_as_class_attribute(autodocument): """Ensure that pydantic models can be documented as class attributes. This relates to #129. diff --git a/tox.ini b/tox.ini index 5380bf58..ea0522c7 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{37,38,39,310,311,312}-pydantic{20,21,22,23,24,25,latest}-sphinx{40,45,53,62,70,71,72,latest}, latest, development, no_erdantic, linter +envlist = py{37,38,39,310,311,312}-pydantic{20,21,22,23,24,25,26,latest}-sphinx{40,45,53,62,70,71,72,latest}, latest, development, no_erdantic, linter isolated_build = True [testenv] @@ -21,6 +21,7 @@ deps = pydantic23: pydantic~=2.3.0 pydantic24: pydantic~=2.4.0 pydantic25: pydantic~=2.5.0 + pydantic26: pydantic~=2.6.0 pydanticlatest: pydantic sphinx40: sphinx~=4.0.0 sphinx45: sphinx~=4.5.0