Skip to content

Project architectureΒ€

This document describes how the project is architectured, both regarding boilerplate and actual code. We start by giving an overview of the project's contents:

πŸ“ .git/
πŸ“ .github/ # (1)!
πŸ“ .venv/ # (2)!
πŸ“ .venvs/ # (3)!
πŸ“ .vscode/ # (4)!
πŸ“ .zed/ # (5)!
πŸ“ config/ # (6)!
πŸ“ docs/ # (7)!
πŸ“ htmlcov/ # (8)!
πŸ“ packages/ # (9)!
πŸ“ scripts/ # (10)!
πŸ“ site/ # (11)!
 .copier-answers.yml # (12)!
 .envrc # (13)!
 .gitignore
 CHANGELOG.md
 CODE_OF_CONDUCT.md
 CONTRIBUTING.md
 LICENSE
 Makefile # (14)!
 README.md
 duties.py # (15)!
 logo.svg
 mkdocs.yml # (16)!
 pyproject.toml # (17)!
 uv.lock
  1. GitHub workflows, issue templates and other configuration.

    πŸ“ ISSUE_TEMPLATE/ # (1)!
    πŸ“ workflows/ # (2)!
     FUNDING.yml
     pull_request_template.md
    
    1.  1-bug.md
       2-feature.md
       3-docs.md
       4-change.md
       config.yml
      
    2.  ci.yml
       release.yml
       sponsors.yml
      
  2. The default virtual environment (git-ignored). See make setup command.

  3. The virtual environments for all supported Python versions (git-ignored). See make setup command.

  4. The configuration for VSCode (git-ignored). See make vscode command.

     configurationCache.log
     dryrun.log
     launch.json
     settings.json
     targets.log
     tasks.json
    
  5.  debug.json
     settings.json
     tasks.json
    
  6. Contains our tooling configuration. See Scripts, configuration.

    πŸ“ vscode/ # (1)!
     coverage.ini
     git-changelog.toml
     pytest.ini
     ruff.toml
     ty.toml
    
    1.  launch.json
       settings.json
       tasks.json
      
  7. Documentation sources (Markdown pages). See make docs task.

    πŸ“ .overrides/ # (1)!
    πŸ“ css/ # (2)!
    πŸ“ extensions/ # (3)!
    πŸ“ guide/ # (4)!
    πŸ“ img/ # (5)!
    πŸ“ js/ # (6)!
    πŸ“ reference/ # (7)!
     alternatives.md
     changelog.md
     code-of-conduct.md
     community.md
     contributing.md
     credits.md
     downstream-projects.md
     extensions.md
     getting-help.md
     getting-started.md
     guide.md
     index.md
     installation.md
     introduction.md
     license.md
     logo.svg
     playground.md
     reference.md
     schema-docstrings-options.json
     schema.json
    
    1. Customization of Material for MkDocs' templates.

      πŸ“ partials/ # (1)!
       main.html
      
      1.  comments.html
         path-item.html
        
    2.  custom.css
       material.css
       mkdocstrings.css
      
    3. πŸ“ built-in/ # (1)!
      πŸ“ official/ # (2)!
      πŸ“ third-party/ # (3)!
       built-in.md
       official.md
       third-party.md
      
      1.  dataclasses.md
         unpack-typeddict.md
        
      2.  autodocstringstyle.md
         inherited-docstrings.md
         public-redundant-aliases.md
         public-wildcard-imports.md
         pydantic.md
         runtime-objects.md
         sphinx.md
         typingdoc.md
         warnings-deprecated.md
        
      3.  docstring-inheritance.md
         fastapi.md
         fieldz.md
         generics.md
         inherited-method-crossrefs.md
         modernized-annotations.md
        
    4. πŸ“ contributors/ # (1)!
      πŸ“ users/ # (2)!
       contributors.md
       users.md
      
      1.  architecture.md
         commands.md
         setup.md
         workflow.md
        
      2. πŸ“ how-to/ # (1)!
        πŸ“ recommendations/ # (2)!
         checking.md
         extending.md
         loading.md
         navigating.md
         serializing.md
        
        1.  parse-docstrings.md
           selectively-inspect.md
           set-docstring-styles.md
           set-git-info.md
           support-decorators.md
          
        2.  docstrings.md
           public-apis.md
           python-code.md
          
    5.  favicon.ico
       gha_annotations_1.png
       gha_annotations_2.png
      
    6.  feedback.js
      
    7. πŸ“ api/ # (1)!
       api.md
       cli.md
       docstrings.md
      
      1. Python API reference, injected with mkdocstrings.

        πŸ“ docstrings/ # (1)!
        πŸ“ models/ # (2)!
         agents.md
         checks.md
         cli.md
         docstrings.md
         exceptions.md
         expressions.md
         extensions.md
         finder.md
         helpers.md
         loaders.md
         loggers.md
         models.md
         serializers.md
        
        1.  models.md
           parsers.md
          
        2.  alias.md
           attribute.md
           class.md
           function.md
           module.md
           type_alias.md
          
  8. HTML report for Python code coverage (git-ignored), integrated in the Coverage report page. See make coverage task.

  9. πŸ“ griffecli/ # (1)!
    πŸ“ griffelib/ # (2)!
    
    1. πŸ“ src/ # (1)!
      πŸ“ tests/ # (2)!
       pyproject.toml
      
      1. πŸ“ griffecli/ # (1)!
        
        1. πŸ“ _internal/ # (1)!
           __init__.py
           __main__.py
           py.typed
          
          1.  __init__.py
             cli.py
            
      2. Our test suite. See Tests.

         __init__.py
         test_cli.py
        
    2. πŸ“ src/ # (1)!
      πŸ“ tests/ # (2)!
       pyproject.toml
      
      1. πŸ“ griffe/ # (1)!
        
        1. πŸ“ _internal/ # (1)!
           __init__.py
           __main__.py
           py.typed
          
          1. Our internal API, hidden from users. See Program structure.

            πŸ“ agents/ # (1)!
            πŸ“ docstrings/ # (2)!
            πŸ“ extensions/ # (3)!
             __init__.py
             c3linear.py
             collections.py
             debug.py
             diff.py
             encoders.py
             enumerations.py
             exceptions.py
             expressions.py
             finder.py
             git.py
             helpers.py
             importer.py
             loader.py
             logger.py
             merger.py
             mixins.py
             models.py
             stats.py
            
            1. πŸ“ nodes/ # (1)!
               __init__.py
               inspector.py
               visitor.py
              
              1.  __init__.py
                 assignments.py
                 ast.py
                 docstrings.py
                 exports.py
                 imports.py
                 parameters.py
                 runtime.py
                 values.py
                
            2.  __init__.py
               auto.py
               google.py
               models.py
               numpy.py
               parsers.py
               sphinx.py
               utils.py
              
            3.  __init__.py
               base.py
               dataclasses.py
               unpack_typeddict.py
              
      2. Our test suite. See Tests.

        πŸ“ fixtures/
        πŸ“ test_docstrings/ # (1)!
        πŸ“ test_extensions/ # (2)!
         __init__.py
         conftest.py
         helpers.py
         test_api.py
         test_diff.py
         test_encoders.py
         test_expressions.py
         test_finder.py
         test_functions.py
         test_git.py
         test_inheritance.py
         test_inspector.py
         test_loader.py
         test_merger.py
         test_mixins.py
         test_models.py
         test_nodes.py
         test_public_api.py
         test_stdlib.py
         test_visitor.py
        
        1.  __init__.py
           conftest.py
           helpers.py
           test_google.py
           test_numpy.py
           test_sphinx.py
           test_warnings.py
          
        2.  __init__.py
           test_base.py
           test_dataclasses.py
           test_unpack_typeddict.py
          
  10. Our different scripts. See Scripts, configuration.

     gen_credits.py
     gen_griffe_json.py
     gen_structure_docs.py
     get_version.py
     make
     make.py
    
  11. Documentation site, built with make run mkdocs build (git-ignored).

  12. The answers file generated by Copier. See Boilerplate.

  13. The environment configuration, automatically sourced by direnv. See commands.

  14. A dummy makefile, only there for auto-completion. See commands.

  15. Our project tasks, written with duty. See Tasks.

  16. The build configuration for our docs. See make docs task.

  17. The project metadata and production dependencies.

BoilerplateΒ€

This project's skeleton (the file-tree shown above) is actually generated from a Copier template called copier-uv. When generating the project, Copier asks a series of questions (configured by the template itself), and the answers are used to render the file and directory names, as well as the file contents. Copier also records answers in the .copier-answers.yml file, allowing to update the project with latest changes from the template while reusing previous answers.

To update the project (in order to apply latest changes from the template), we use the following command:

copier update --trust --skip-answered

Scripts, configurationΒ€

We have a few scripts that let us manage the various maintenance aspects for this project. The entry-point is the make script located in the scripts folder. It doesn't need any dependency to be installed to run. See Management commands for more information.

The make script can also invoke what we call "tasks". Tasks need our development dependencies to be installed to run. These tasks are written in the duties.py file, and the development dependencies are listed in devdeps.txt.

The tools used in tasks have their configuration files stored in the config folder, to unclutter the root of the repository. The tasks take care of calling the tools with the right options to locate their respective configuration files.

SourcesΒ€

Sources are located in the packages/ subfolders, following the src-layout. We use Hatch to build source and wheel distributions, and configure it in pyproject.toml.

TestsΒ€

Our test suite is located in the tests folder. It is located outside of the sources as to not pollute distributions (it would be very wrong to publish a tests package as part of our distributions, since this name is extremely common), or worse, the public API. The tests folder is however included in our source distributions (.tar.gz), alongside most of our metadata and configuration files. Check out our pyproject.toml files to get the full list of files included in our source distributions for every individual package within the packages/ folder.

The test suite is based on pytest. Test modules reflect our internal API structure, and except for a few test modules that test specific aspects of our API, each test module tests the logic from the corresponding module in the internal API. For example, test_finder.py tests code of the griffe._internal.finder internal module, while test_functions tests our ability to extract correct information from function signatures, statically. The general rule of thumb when writing new tests is to mirror the internal API. If a test touches to many aspects of the loading process, it can be added to the test_loader test module.

Program structureΒ€

Griffe is split into two pieces: the library and the CLI.

Each of them has an internal API contained within an _internal folder:

  • packages/griffelib/src/griffe/_internal for the library,
  • packages/griffecli/src/griffecli/_internal for the CLI.

Griffe can be installed in library-only mode, which means that the CLI package from packages/griffecli is not present. Library-only mode can be preferred if the user does not utilize the CLI functionality of Griffe and does not want to incorporate its dependencies.

The top-level packages/griffelib/src/griffe/__init__.py module exposes all the public API available: it always re-exports internal objects from various submodules of griffe._internal and, if the CLI is installed, it re-exports the public API of griffecli as well.

Users then import griffe directly, or import objects from it. If they don't have griffecli installed, they cannot import the CLI-related functionality, such as griffecli.check.

We'll be honest: our code organization is not the most elegant, but it works 🀷 Have a look at the following module dependency graph, which will basically tell you nothing except that we have a lot of inter-module dependencies. Arrows read as "imports from". The code base is generally pleasant to work with though.

Ggriffegriffegriffe__internalgriffe._internalgriffe->griffe__internalgriffe__internal_agentsgriffe._internal.agentsgriffe->griffe__internal_agentsgriffe__internal_agents_inspectorgriffe._internal.agents.inspectorgriffe->griffe__internal_agents_inspectorgriffe__internal_agents_nodesgriffe._internal.agents.nodesgriffe->griffe__internal_agents_nodesgriffe__internal_agents_nodes_assignmentsgriffe._internal.agents.nodes.assignmentsgriffe->griffe__internal_agents_nodes_assignmentsgriffe__internal_agents_nodes_astgriffe._internal.agents.nodes.astgriffe->griffe__internal_agents_nodes_astgriffe__internal_agents_nodes_docstringsgriffe._internal.agents.nodes.docstringsgriffe->griffe__internal_agents_nodes_docstringsgriffe__internal_agents_nodes_exportsgriffe._internal.agents.nodes.exportsgriffe->griffe__internal_agents_nodes_exportsgriffe__internal_agents_nodes_importsgriffe._internal.agents.nodes.importsgriffe->griffe__internal_agents_nodes_importsgriffe__internal_agents_nodes_parametersgriffe._internal.agents.nodes.parametersgriffe->griffe__internal_agents_nodes_parametersgriffe__internal_agents_nodes_runtimegriffe._internal.agents.nodes.runtimegriffe->griffe__internal_agents_nodes_runtimegriffe__internal_agents_nodes_valuesgriffe._internal.agents.nodes.valuesgriffe->griffe__internal_agents_nodes_valuesgriffe__internal_agents_visitorgriffe._internal.agents.visitorgriffe->griffe__internal_agents_visitorgriffe__internal_c3lineargriffe._internal.c3lineargriffe->griffe__internal_c3lineargriffe__internal_collectionsgriffe._internal.collectionsgriffe->griffe__internal_collectionsgriffe__internal_diffgriffe._internal.diffgriffe->griffe__internal_diffgriffe__internal_docstringsgriffe._internal.docstringsgriffe->griffe__internal_docstringsgriffe__internal_docstrings_autogriffe._internal.docstrings.autogriffe->griffe__internal_docstrings_autogriffe__internal_docstrings_googlegriffe._internal.docstrings.googlegriffe->griffe__internal_docstrings_googlegriffe__internal_docstrings_modelsgriffe._internal.docstrings.modelsgriffe->griffe__internal_docstrings_modelsgriffe__internal_docstrings_numpygriffe._internal.docstrings.numpygriffe->griffe__internal_docstrings_numpygriffe__internal_docstrings_parsersgriffe._internal.docstrings.parsersgriffe->griffe__internal_docstrings_parsersgriffe__internal_docstrings_sphinxgriffe._internal.docstrings.sphinxgriffe->griffe__internal_docstrings_sphinxgriffe__internal_docstrings_utilsgriffe._internal.docstrings.utilsgriffe->griffe__internal_docstrings_utilsgriffe__internal_encodersgriffe._internal.encodersgriffe->griffe__internal_encodersgriffe__internal_enumerationsgriffe._internal.enumerationsgriffe->griffe__internal_enumerationsgriffe__internal_exceptionsgriffe._internal.exceptionsgriffe->griffe__internal_exceptionsgriffe__internal_expressionsgriffe._internal.expressionsgriffe->griffe__internal_expressionsgriffe__internal_extensionsgriffe._internal.extensionsgriffe->griffe__internal_extensionsgriffe__internal_extensions_basegriffe._internal.extensions.basegriffe->griffe__internal_extensions_basegriffe__internal_extensions_dataclassesgriffe._internal.extensions.dataclassesgriffe->griffe__internal_extensions_dataclassesgriffe__internal_extensions_unpack_typeddictgriffe._internal.extensions.unpack_typeddictgriffe->griffe__internal_extensions_unpack_typeddictgriffe__internal_findergriffe._internal.findergriffe->griffe__internal_findergriffe__internal_gitgriffe._internal.gitgriffe->griffe__internal_gitgriffe__internal_helpersgriffe._internal.helpersgriffe->griffe__internal_helpersgriffe__internal_importergriffe._internal.importergriffe->griffe__internal_importergriffe__internal_loadergriffe._internal.loadergriffe->griffe__internal_loadergriffe__internal_loggergriffe._internal.loggergriffe->griffe__internal_loggergriffe__internal_mergergriffe._internal.mergergriffe->griffe__internal_mergergriffe__internal_mixinsgriffe._internal.mixinsgriffe->griffe__internal_mixinsgriffe__internal_modelsgriffe._internal.modelsgriffe->griffe__internal_modelsgriffe__internal_statsgriffe._internal.statsgriffe->griffe__internal_statsgriffecligriffecligriffe->griffecligriffe___main__griffe.__main__griffe___main__->griffecligriffe__internal_agents_inspector->griffe__internal_agents_nodesgriffe__internal_agents_inspector->griffe__internal_agents_nodes_runtimegriffe__internal_agents_inspector->griffe__internal_collectionsgriffe__internal_agents_inspector->griffe__internal_docstringsgriffe__internal_agents_inspector->griffe__internal_docstrings_parsersgriffe__internal_agents_inspector->griffe__internal_enumerationsgriffe__internal_agents_inspector->griffe__internal_expressionsgriffe__internal_agents_inspector->griffe__internal_extensionsgriffe__internal_agents_inspector->griffe__internal_extensions_basegriffe__internal_agents_inspector->griffe__internal_importergriffe__internal_agents_inspector->griffe__internal_loggergriffe__internal_agents_inspector->griffe__internal_modelstyping_extensionstyping_extensionsgriffe__internal_agents_inspector->typing_extensionsgriffe__internal_agents_nodes_ast->griffe__internal_exceptionsgriffe__internal_agents_nodes_exports->griffe__internal_agents_nodes_valuesgriffe__internal_agents_nodes_exports->griffe__internal_enumerationsgriffe__internal_agents_nodes_exports->griffe__internal_expressionsgriffe__internal_agents_nodes_exports->griffe__internal_loggergriffe__internal_agents_nodes_exports->griffe__internal_modelsgriffe__internal_agents_nodes_imports->griffe__internal_modelsgriffe__internal_agents_nodes_parameters->griffe__internal_enumerationsgriffe__internal_agents_nodes_runtime->griffe__internal_enumerationsgriffe__internal_agents_nodes_runtime->griffe__internal_loggergriffe__internal_agents_nodes_runtime->typing_extensionsgriffe__internal_agents_nodes_values->griffe__internal_loggergriffe__internal_agents_visitor->griffe__internal_agents_nodesgriffe__internal_agents_visitor->griffe__internal_agents_nodes_assignmentsgriffe__internal_agents_visitor->griffe__internal_agents_nodes_astgriffe__internal_agents_visitor->griffe__internal_agents_nodes_docstringsgriffe__internal_agents_visitor->griffe__internal_agents_nodes_exportsgriffe__internal_agents_visitor->griffe__internal_agents_nodes_importsgriffe__internal_agents_visitor->griffe__internal_agents_nodes_parametersgriffe__internal_agents_visitor->griffe__internal_collectionsgriffe__internal_agents_visitor->griffe__internal_docstringsgriffe__internal_agents_visitor->griffe__internal_docstrings_parsersgriffe__internal_agents_visitor->griffe__internal_enumerationsgriffe__internal_agents_visitor->griffe__internal_exceptionsgriffe__internal_agents_visitor->griffe__internal_expressionsgriffe__internal_agents_visitor->griffe__internal_extensionsgriffe__internal_agents_visitor->griffe__internal_modelsgriffe__internal_collections->griffe__internal_mixinsgriffe__internal_collections->griffe__internal_modelsgriffe__internal_diff->griffe__internal_enumerationsgriffe__internal_diff->griffe__internal_exceptionsgriffe__internal_diff->griffe__internal_gitgriffe__internal_diff->griffe__internal_loggergriffe__internal_diff->griffe__internal_modelsgriffe__internal_docstrings_auto->griffe__internal_docstrings_googlegriffe__internal_docstrings_auto->griffe__internal_docstrings_modelsgriffe__internal_docstrings_auto->griffe__internal_docstrings_numpygriffe__internal_docstrings_auto->griffe__internal_docstrings_sphinxgriffe__internal_docstrings_auto->griffe__internal_enumerationsgriffe__internal_docstrings_auto->griffe__internal_modelsgriffe__internal_docstrings_google->griffe__internal_docstrings_modelsgriffe__internal_docstrings_google->griffe__internal_docstrings_utilsgriffe__internal_docstrings_google->griffe__internal_enumerationsgriffe__internal_docstrings_google->griffe__internal_expressionsgriffe__internal_docstrings_google->griffe__internal_modelsgriffe__internal_docstrings_models->griffe__internal_enumerationsgriffe__internal_docstrings_models->griffe__internal_expressionsgriffe__internal_docstrings_numpy->griffe__internal_docstrings_modelsgriffe__internal_docstrings_numpy->griffe__internal_docstrings_utilsgriffe__internal_docstrings_numpy->griffe__internal_enumerationsgriffe__internal_docstrings_numpy->griffe__internal_expressionsgriffe__internal_docstrings_numpy->griffe__internal_modelsgriffe__internal_docstrings_parsers->griffe__internal_docstrings_autogriffe__internal_docstrings_parsers->griffe__internal_docstrings_googlegriffe__internal_docstrings_parsers->griffe__internal_docstrings_modelsgriffe__internal_docstrings_parsers->griffe__internal_docstrings_numpygriffe__internal_docstrings_parsers->griffe__internal_docstrings_sphinxgriffe__internal_docstrings_parsers->griffe__internal_enumerationsgriffe__internal_docstrings_sphinx->griffe__internal_docstrings_modelsgriffe__internal_docstrings_sphinx->griffe__internal_docstrings_utilsgriffe__internal_docstrings_sphinx->griffe__internal_expressionsgriffe__internal_docstrings_sphinx->griffe__internal_modelsgriffe__internal_docstrings_utils->griffe__internal_enumerationsgriffe__internal_docstrings_utils->griffe__internal_exceptionsgriffe__internal_docstrings_utils->griffe__internal_expressionsgriffe__internal_docstrings_utils->griffe__internal_loggergriffe__internal_docstrings_utils->griffe__internal_modelsgriffe__internal_encoders->griffe__internal_enumerationsgriffe__internal_encoders->griffe__internal_expressionsgriffe__internal_encoders->griffe__internal_gitgriffe__internal_encoders->griffe__internal_modelsgriffe__internal_exceptions->griffe__internal_modelsgriffe__internal_expressions->griffe__internal_agentsgriffe__internal_expressions->griffe__internal_agents_nodesgriffe__internal_expressions->griffe__internal_agents_nodes_parametersgriffe__internal_expressions->griffe__internal_enumerationsgriffe__internal_expressions->griffe__internal_exceptionsgriffe__internal_expressions->griffe__internal_loggergriffe__internal_expressions->griffe__internal_modelsgriffe__internal_extensions_base->griffe__internal_agentsgriffe__internal_extensions_base->griffe__internal_agents_nodesgriffe__internal_extensions_base->griffe__internal_agents_nodes_astgriffe__internal_extensions_base->griffe__internal_agents_nodes_runtimegriffe__internal_extensions_base->griffe__internal_agents_visitorgriffe__internal_extensions_base->griffe__internal_exceptionsgriffe__internal_extensions_base->griffe__internal_extensions_dataclassesgriffe__internal_extensions_base->griffe__internal_importergriffe__internal_extensions_base->griffe__internal_loadergriffe__internal_extensions_base->griffe__internal_modelsgriffe__internal_extensions_dataclasses->griffe__internal_enumerationsgriffe__internal_extensions_dataclasses->griffe__internal_expressionsgriffe__internal_extensions_dataclasses->griffe__internal_loggergriffe__internal_extensions_dataclasses->griffe__internal_modelsgriffe__internal_extensions_unpack_typeddict->griffe__internal_docstringsgriffe__internal_extensions_unpack_typeddict->griffe__internal_docstrings_modelsgriffe__internal_extensions_unpack_typeddict->griffe__internal_enumerationsgriffe__internal_extensions_unpack_typeddict->griffe__internal_expressionsgriffe__internal_extensions_unpack_typeddict->griffe__internal_extensions_basegriffe__internal_extensions_unpack_typeddict->griffe__internal_modelsgriffe__internal_finder->griffe__internal_exceptionsgriffe__internal_finder->griffe__internal_loggergriffe__internal_finder->griffe__internal_modelsgriffe__internal_git->griffe__internal_exceptionsgriffe__internal_helpers->griffe__internal_agentsgriffe__internal_helpers->griffe__internal_agents_inspectorgriffe__internal_helpers->griffe__internal_agents_visitorgriffe__internal_helpers->griffe__internal_collectionsgriffe__internal_helpers->griffe__internal_docstringsgriffe__internal_helpers->griffe__internal_docstrings_parsersgriffe__internal_helpers->griffe__internal_enumerationsgriffe__internal_helpers->griffe__internal_extensionsgriffe__internal_helpers->griffe__internal_extensions_basegriffe__internal_helpers->griffe__internal_loadergriffe__internal_helpers->griffe__internal_modelsgriffe__internal_loader->griffe__internal_agentsgriffe__internal_loader->griffe__internal_agents_inspectorgriffe__internal_loader->griffe__internal_agents_visitorgriffe__internal_loader->griffe__internal_collectionsgriffe__internal_loader->griffe__internal_docstringsgriffe__internal_loader->griffe__internal_docstrings_parsersgriffe__internal_loader->griffe__internal_enumerationsgriffe__internal_loader->griffe__internal_exceptionsgriffe__internal_loader->griffe__internal_expressionsgriffe__internal_loader->griffe__internal_extensionsgriffe__internal_loader->griffe__internal_findergriffe__internal_loader->griffe__internal_gitgriffe__internal_loader->griffe__internal_importergriffe__internal_loader->griffe__internal_loggergriffe__internal_loader->griffe__internal_mergergriffe__internal_loader->griffe__internal_modelsgriffe__internal_loader->griffe__internal_statsplatformdirsplatformdirsgriffe__internal_loader->platformdirsgriffe__internal_merger->griffe__internal_exceptionsgriffe__internal_merger->griffe__internal_expressionsgriffe__internal_merger->griffe__internal_loggergriffe__internal_merger->griffe__internal_modelsgriffe__internal_mixins->griffe__internal_encodersgriffe__internal_mixins->griffe__internal_enumerationsgriffe__internal_mixins->griffe__internal_exceptionsgriffe__internal_mixins->griffe__internal_mergergriffe__internal_mixins->griffe__internal_modelsgriffe__internal_models->griffe__internal_c3lineargriffe__internal_models->griffe__internal_docstringsgriffe__internal_models->griffe__internal_docstrings_modelsgriffe__internal_models->griffe__internal_docstrings_parsersgriffe__internal_models->griffe__internal_enumerationsgriffe__internal_models->griffe__internal_gitgriffe__internal_models->griffe__internal_loggergriffe__internal_stats->griffe__internal_enumerationsgriffe__internal_stats->griffe__internal_models

You can zoom and pan all diagrams on this page with mouse inputs.

The following sections are generated automatically by iterating on the modules of our public and internal APIs respectively, and extracting the comment blocks at the top of each module. The comment blocks are addressed to readers of the code (maintainers, contributors), while module docstrings are addressed to users of the API. Module docstrings in our internal API are never written, because our module layout is hidden, and therefore modules aren't part of the public API, so it doesn't make much sense to write "user documentation" in them.

CLI entrypointΒ€

griffe.__main__Β€

SPDX-License-Identifier: ISC

Public APIΒ€

griffeΒ€

SPDX-License-Identifier: ISC

Internal APIΒ€

SPDX-License-Identifier: ISC

agentsΒ€

SPDX-License-Identifier: ISC

inspector.pyΒ€

SPDX-License-Identifier: ISC

G cluster_7a1faf1d File: inspector cluster_b55715c3 Class: Inspector node_e88d04cd 138: __init__() node_e88d04cd->node_e88d04cd node_5ef1cb25 190: _get_docstring() node_58be48fd 212: _get_linenos() node_6d4160e1 278: generic_inspect() node_6d4160e1->node_e88d04cd node_a17b39fa 270: inspect() node_6d4160e1->node_a17b39fa node_a4224cce 315: inspect_module() node_6d4160e1->node_a4224cce node_f8c23c3a 222: get_module() node_f8c23c3a->node_a17b39fa node_56f161c4 559: handle_attribute() node_56f161c4->node_5ef1cb25 node_2186d4cd 460: handle_function() node_2186d4cd->node_5ef1cb25 node_2186d4cd->node_58be48fd node_cea4d139 640: _convert_object_to_annotation() node_2186d4cd->node_cea4d139 node_c608a33e 617: _convert_parameter() node_2186d4cd->node_c608a33e node_5818315f 676: _convert_type_parameters() node_2186d4cd->node_5818315f node_f8c7f78a 551: inspect_attribute() node_f8c7f78a->node_56f161c4 node_e746355d 420: inspect_builtin_function() node_e746355d->node_2186d4cd node_5d387a95 396: inspect_builtin_method() node_5d387a95->node_2186d4cd node_7d995d07 436: inspect_cached_property() node_7d995d07->node_2186d4cd node_9828e53a 338: inspect_class() node_9828e53a->node_5ef1cb25 node_9828e53a->node_58be48fd node_9828e53a->node_6d4160e1 node_9828e53a->node_5818315f node_206321a4 380: inspect_classmethod() node_206321a4->node_2186d4cd node_03929612 412: inspect_coroutine() node_03929612->node_2186d4cd node_e88b39c3 428: inspect_function() node_e88b39c3->node_2186d4cd node_a49fcd56 452: inspect_getset_descriptor() node_a49fcd56->node_2186d4cd node_e24c0b21 404: inspect_method() node_e24c0b21->node_2186d4cd node_657fab62 388: inspect_method_descriptor() node_657fab62->node_2186d4cd node_a4224cce->node_5ef1cb25 node_1aed8cc3 444: inspect_property() node_1aed8cc3->node_2186d4cd node_c6b4d1ed 372: inspect_staticmethod() node_c6b4d1ed->node_2186d4cd node_f596a115 526: inspect_type_alias() node_f596a115->node_5ef1cb25 node_f596a115->node_58be48fd node_f596a115->node_5818315f node_ccb9ba11 719: _convert_type_to_annotation() node_f596a115->node_ccb9ba11 node_c608a33e->node_cea4d139 node_5818315f->node_ccb9ba11 node_ccb9ba11->node_cea4d139 node_ccb9ba11->node_ccb9ba11 node_8a194ae4 70: inspect() node_8a194ae4->node_e88d04cd node_8a194ae4->node_f8c23c3a
nodesΒ€

SPDX-License-Identifier: ISC

assignments.pyΒ€

SPDX-License-Identifier: ISC

G cluster_e5bf80d9 File: assignments node_09d926d4 59: _get_annassign_names() node_f5bc2d4e 42: get_name() node_09d926d4->node_f5bc2d4e node_d8495b80 54: _get_assign_names() node_d8495b80->node_f5bc2d4e node_5554b7ee 28: _get_attribute_name() node_5554b7ee->node_f5bc2d4e node_9fa9870c 82: get_instance_names() node_84abeb82 70: get_names() node_9fa9870c->node_84abeb82
ast.pyΒ€

SPDX-License-Identifier: ISC

G cluster_1b3d4801 File: ast node_f915127b 42: ast_children() node_685733f2 153: ast_first_child() node_685733f2->node_f915127b node_da31e72a 171: ast_last_child() node_da31e72a->node_f915127b node_b88ca2bb 135: ast_next() node_5112b993 82: ast_next_siblings() node_b88ca2bb->node_5112b993 node_5112b993->node_f915127b node_66e183c7 116: ast_previous() node_5f0de3df 66: ast_previous_siblings() node_66e183c7->node_5f0de3df node_5f0de3df->node_f915127b node_91264e9a 98: ast_siblings() node_91264e9a->node_f915127b
docstrings.pyΒ€

SPDX-License-Identifier: ISC

exports.pyΒ€

SPDX-License-Identifier: ISC

G cluster_8cd5dfdb File: exports node_623df08d 77: _extract() node_ce5b6fd9 36: _extract_attribute() node_ce5b6fd9->node_623df08d node_33b2ad35 40: _extract_binop() node_33b2ad35->node_623df08d node_72fa1460 54: _extract_sequence() node_72fa1460->node_623df08d node_2256015b 61: _extract_starred() node_2256015b->node_623df08d node_dacf4f3c 81: get__all__() node_dacf4f3c->node_623df08d node_dbfc8fdf 96: safe_get__all__() node_dbfc8fdf->node_dacf4f3c
imports.pyΒ€

SPDX-License-Identifier: ISC

parameters.pyΒ€

SPDX-License-Identifier: ISC

runtime.pyΒ€

SPDX-License-Identifier: ISC

G cluster_8eaafe3b File: runtime cluster_ff14081f Class: ObjectNode node_4e8b368e 68: __init__() node_80fc9411 301: _pick_member() node_798dedd2 311: alias_target_path() node_e91213f7 52: _same_components() node_798dedd2->node_e91213f7 node_7c820d10 191: children() node_7c820d10->node_4e8b368e node_7c820d10->node_80fc9411
values.pyΒ€

SPDX-License-Identifier: ISC

G cluster_d613dbd2 File: values node_d37dd63b 31: get_value() node_ce21b730 45: safe_get_value() node_ce21b730->node_d37dd63b
visitor.pyΒ€

SPDX-License-Identifier: ISC

G cluster_d8527c16 File: visitor cluster_c1e2ab41 Class: Visitor node_b53abed2 153: __init__() node_b53abed2->node_b53abed2 node_d9f57d90 213: _get_docstring() node_e5625e4c 233: _get_type_parameters() node_a078c8e7 369: decorators_to_labels() node_d5deced2 284: generic_visit() node_6757b947 276: visit() node_d5deced2->node_6757b947 node_381099c6 387: get_base_property() node_be24122a 262: get_module() node_be24122a->node_6757b947 node_978068b5 629: handle_attribute() node_978068b5->node_d9f57d90 node_ca04ddac 411: handle_function() node_ca04ddac->node_d9f57d90 node_ca04ddac->node_e5625e4c node_ca04ddac->node_a078c8e7 node_ca04ddac->node_d5deced2 node_ca04ddac->node_381099c6 node_a365e478 744: visit_annassign() node_a365e478->node_978068b5 node_d438a667 736: visit_assign() node_d438a667->node_978068b5 node_684ca4b8 525: visit_asyncfunctiondef() node_684ca4b8->node_ca04ddac node_9d6e3fa4 316: visit_classdef() node_9d6e3fa4->node_d9f57d90 node_9d6e3fa4->node_e5625e4c node_9d6e3fa4->node_a078c8e7 node_9d6e3fa4->node_d5deced2 node_2036ace1 517: visit_functiondef() node_2036ace1->node_ca04ddac node_fa3c1f7e 773: visit_if() node_fa3c1f7e->node_d5deced2 node_a0927cdf 293: visit_module() node_a0927cdf->node_d9f57d90 node_a0927cdf->node_d5deced2 node_8d2e5d49 536: visit_typealias() node_8d2e5d49->node_d9f57d90 node_8d2e5d49->node_e5625e4c node_5887da2e 96: visit() node_5887da2e->node_b53abed2 node_5887da2e->node_be24122a

c3linear.pyΒ€

This module contains a single function, c3linear_merge. The function is generic enough to be in its own module.

G cluster_86621c52 File: c3linear cluster_93b7187f Class: _Dependency cluster_cd44340b Class: _DependencyList node_9f5e8723 29: tail() node_a7651e00 60: __len__() node_9f5e8723->node_a7651e00 node_c18ee4a9 48: __init__() node_0234377f 64: __repr__() node_0234377f->node_0234377f node_00a0b6da 82: remove() node_56994b11 93: c3linear_merge() node_56994b11->node_c18ee4a9 node_56994b11->node_00a0b6da

collections.pyΒ€

SPDX-License-Identifier: ISC

G cluster_7b4bf17b File: collections cluster_5948288d Class: LinesCollection node_d0ac72b7 72: items() node_d0ac72b7->node_d0ac72b7 node_1c419dd4 56: keys() node_1c419dd4->node_1c419dd4 node_34e3ad76 64: values() node_34e3ad76->node_34e3ad76

debug.pyΒ€

SPDX-License-Identifier: ISC

G cluster_69c1b09f File: debug node_7cc370de 96: _get_debug_info() node_3e17bd40 81: _get_version() node_7cc370de->node_3e17bd40 node_162bd2f2 70: _interpreter_name_version() node_7cc370de->node_162bd2f2 node_68c9c676 115: _print_debug_info() node_68c9c676->node_7cc370de

diff.pyΒ€

SPDX-License-Identifier: ISC

G cluster_3304af8a File: diff cluster_3e166b66 Class: Breakage node_9ab33b00 299: _explain_azdo() node_c38eddbe 220: _format_new_value() node_9ab33b00->node_c38eddbe node_34fb21ab 217: _format_old_value() node_9ab33b00->node_34fb21ab node_208c23b4 209: _format_title() node_9ab33b00->node_208c23b4 node_4518c1b3 277: _explain_github() node_4518c1b3->node_c38eddbe node_4518c1b3->node_34fb21ab node_4518c1b3->node_208c23b4 node_833274e8 257: _explain_markdown() node_833274e8->node_c38eddbe node_833274e8->node_34fb21ab node_3ba78fc4 223: _explain_oneline() node_31091f1c 212: _format_kind() node_3ba78fc4->node_31091f1c node_3c378ceb 204: _format_location() node_3ba78fc4->node_3c378ceb node_3ba78fc4->node_c38eddbe node_3ba78fc4->node_34fb21ab node_3ba78fc4->node_208c23b4 node_03039147 239: _explain_verbose() node_03039147->node_31091f1c node_03039147->node_3c378ceb node_03039147->node_c38eddbe node_03039147->node_34fb21ab node_03039147->node_208c23b4 node_99b7f863 600: _alias_incompatibilities() node_c10164ba 637: _type_based_yield() node_99b7f863->node_c10164ba node_86f4eab4 591: _attribute_incompatibilities() node_beb4174d 503: _class_incompatibilities() node_28c75fb2 616: _member_incompatibilities() node_beb4174d->node_28c75fb2 node_5da81d48 516: _function_incompatibilities() node_68150b77 674: _returns_are_compatible() node_5da81d48->node_68150b77 node_28c75fb2->node_c10164ba node_c10164ba->node_86f4eab4 node_c10164ba->node_beb4174d node_c10164ba->node_5da81d48 node_2e918fe6 698: find_breaking_changes() node_2e918fe6->node_28c75fb2

docstringsΒ€

SPDX-License-Identifier: ISC

auto.pyΒ€

SPDX-License-Identifier: ISC

G cluster_0aecc3d8 File: auto node_44493967 137: infer_docstring_style() node_11ff9fbf 209: parse_auto() node_11ff9fbf->node_44493967
google.pyΒ€

SPDX-License-Identifier: ISC

G cluster_6116be91 File: google node_e53fb599 634: _annotation_from_parent() node_e32a1506 603: _get_name_annotation_description() node_80712f06 850: _is_empty_line() node_5457fab2 362: _read_attributes_section() node_d38730a6 108: _read_block_items() node_5457fab2->node_d38730a6 node_43bdbf64 172: _read_block() node_43bdbf64->node_80712f06 node_d38730a6->node_80712f06 node_b525b128 590: _read_block_items_maybe() node_b525b128->node_43bdbf64 node_b525b128->node_d38730a6 node_688ac664 441: _read_classes_section() node_688ac664->node_d38730a6 node_add491d1 791: _read_examples_section() node_add491d1->node_80712f06 node_add491d1->node_43bdbf64 node_eacd23b4 404: _read_functions_section() node_eacd23b4->node_d38730a6 node_12fae235 503: _read_modules_section() node_12fae235->node_d38730a6 node_1c2a7da7 282: _read_other_parameters_section() node_be5d074b 203: _read_parameters() node_1c2a7da7->node_be5d074b node_be5d074b->node_d38730a6 node_3b6e0962 272: _read_parameters_section() node_3b6e0962->node_be5d074b node_fd4fb490 531: _read_raises_section() node_fd4fb490->node_d38730a6 node_d9c6cdcb 745: _read_receives_section() node_d9c6cdcb->node_e53fb599 node_d9c6cdcb->node_e32a1506 node_d9c6cdcb->node_b525b128 node_436d3a2d 653: _read_returns_section() node_436d3a2d->node_e53fb599 node_436d3a2d->node_e32a1506 node_436d3a2d->node_b525b128 node_0bb978c4 478: _read_type_aliases_section() node_0bb978c4->node_d38730a6 node_ceb45695 293: _read_type_parameters_section() node_ceb45695->node_d38730a6 node_7023b36c 562: _read_warns_section() node_7023b36c->node_d38730a6 node_3c805a24 699: _read_yields_section() node_3c805a24->node_e53fb599 node_3c805a24->node_e32a1506 node_3c805a24->node_b525b128 node_89d29975 897: parse_google() node_89d29975->node_80712f06 node_89d29975->node_43bdbf64
models.pyΒ€

SPDX-License-Identifier: ISC

G cluster_509c39ec File: models cluster_8da409ed Class: DocstringSection node_4c951587 262: as_dict() node_4c951587->node_4c951587
numpy.pyΒ€

SPDX-License-Identifier: ISC

G cluster_f0a7ac6d File: numpy node_ec47fa80 873: _append_section() node_d6e3aca0 111: _is_dash_line() node_9a2a519e 107: _is_empty_line() node_d6e3aca0->node_9a2a519e node_edcc79c7 653: _read_attributes_section() node_e459d274 115: _read_block_items() node_edcc79c7->node_e459d274 node_f09b78ea 177: _read_block() node_f09b78ea->node_d6e3aca0 node_f09b78ea->node_9a2a519e node_e459d274->node_d6e3aca0 node_e459d274->node_9a2a519e node_cd916069 724: _read_classes_section() node_cd916069->node_e459d274 node_75efc537 420: _read_deprecated_section() node_75efc537->node_e459d274 node_4b578fe8 808: _read_examples_section() node_4b578fe8->node_9a2a519e node_4b578fe8->node_f09b78ea node_bf51c08e 692: _read_functions_section() node_bf51c08e->node_e459d274 node_665f098f 776: _read_modules_section() node_665f098f->node_e459d274 node_2dd9940a 328: _read_other_parameters_section() node_a9499582 239: _read_parameters() node_2dd9940a->node_a9499582 node_a9499582->node_e459d274 node_a960fac7 313: _read_parameters_section() node_a960fac7->node_a9499582 node_695878d6 603: _read_raises_section() node_695878d6->node_e459d274 node_dcc23f7d 556: _read_receives_section() node_dcc23f7d->node_e459d274 node_e3886f08 446: _read_returns_section() node_e3886f08->node_e459d274 node_32de85ae 756: _read_type_aliases_section() node_32de85ae->node_e459d274 node_1be8ac5a 350: _read_type_parameters_section() node_1be8ac5a->node_e459d274 node_a06de42d 628: _read_warns_section() node_a06de42d->node_e459d274 node_ebc8bd78 505: _read_yields_section() node_ebc8bd78->node_e459d274 node_280db9cb 926: parse_numpy() node_280db9cb->node_ec47fa80 node_280db9cb->node_d6e3aca0 node_280db9cb->node_9a2a519e
parsers.pyΒ€

SPDX-License-Identifier: ISC

sphinx.pyΒ€

SPDX-License-Identifier: ISC

G cluster_5c3f7f6f File: sphinx cluster_39e7a8c0 Class: _FieldType node_6fb234c4 68: matches() node_0b249b34 478: _consolidate_continuation_lines() node_52e00d43 491: _consolidate_descriptive_type() node_a5ec9df5 230: _determine_param_annotation() node_cc6df549 223: _determine_param_default() node_de38ee28 465: _parse_directive() node_de38ee28->node_0b249b34 node_4e95c3c1 449: _parsed_values_to_sections() node_33ef2674 495: _strip_blank_lines() node_4e95c3c1->node_33ef2674 node_c6a67ea4 296: _read_attribute() node_c6a67ea4->node_de38ee28 node_0f826b89 343: _read_attribute_type() node_0f826b89->node_52e00d43 node_0f826b89->node_de38ee28 node_90b38b95 373: _read_exception() node_90b38b95->node_de38ee28 node_e7c1524d 160: _read_parameter() node_e7c1524d->node_a5ec9df5 node_e7c1524d->node_cc6df549 node_e7c1524d->node_de38ee28 node_ad464b18 265: _read_parameter_type() node_ad464b18->node_52e00d43 node_ad464b18->node_de38ee28 node_b7426f60 394: _read_return() node_b7426f60->node_de38ee28 node_a9d8f594 428: _read_return_type() node_a9d8f594->node_52e00d43 node_a9d8f594->node_de38ee28 node_7d932e1c 116: parse_sphinx() node_7d932e1c->node_6fb234c4 node_7d932e1c->node_4e95c3c1
utils.pyΒ€

SPDX-License-Identifier: ISC

encoders.pyΒ€

SPDX-License-Identifier: ISC

G cluster_77e40fb1 File: encoders cluster_3b1a5bf8 Class: JSONEncoder node_a4b0d10f 71: __init__() node_a4b0d10f->node_a4b0d10f node_74e32f7b 166: _attach_parent_to_expr() node_b851d675 176: _attach_parent_to_exprs() node_b851d675->node_74e32f7b node_635982b1 290: _load_attribute() node_86303934 108: _load_docstring() node_635982b1->node_86303934 node_10a50dee 157: _load_git_info() node_635982b1->node_10a50dee node_4e003185 240: _load_class() node_4e003185->node_b851d675 node_14fb1a7b 114: _load_decorators() node_4e003185->node_14fb1a7b node_4e003185->node_86303934 node_4e003185->node_10a50dee node_454f13e9 118: _load_expression() node_38065585 268: _load_function() node_38065585->node_14fb1a7b node_38065585->node_86303934 node_38065585->node_10a50dee node_bf8166e6 213: _load_module() node_bf8166e6->node_b851d675 node_bf8166e6->node_86303934 node_bf8166e6->node_10a50dee node_d4de1ae6 138: _load_parameter() node_d4de1ae6->node_86303934 node_80c8b4ea 325: _load_type_alias() node_80c8b4ea->node_86303934 node_80c8b4ea->node_10a50dee node_930d8047 148: _load_type_parameter() node_b64097a4 355: json_decoder() node_b64097a4->node_454f13e9 node_b64097a4->node_d4de1ae6 node_b64097a4->node_930d8047

enumerations.pyΒ€

SPDX-License-Identifier: ISC

exceptions.pyΒ€

SPDX-License-Identifier: ISC

expressions.pyΒ€

SPDX-License-Identifier: ISC

G cluster_0d6a495d File: expressions cluster_9291ec24 Class: Expr cluster_8270e523 Class: ExprAttribute cluster_658d0d7f Class: ExprBinOp cluster_64020bfd Class: ExprBoolOp cluster_b2879bbf Class: ExprCall cluster_9f98400b Class: ExprCompare cluster_91d4f92e Class: ExprComprehension cluster_f50c771b Class: ExprDict cluster_46aedacc Class: ExprDictComp cluster_36832ae7 Class: ExprExtSlice cluster_fc7a2d5e Class: ExprFormatted cluster_544c3e44 Class: ExprGeneratorExp cluster_a9f31e71 Class: ExprIfExp cluster_cbc34b0c Class: ExprInterpolation cluster_4edbd9c6 Class: ExprJoinedStr cluster_47a88a1b Class: ExprKeyword cluster_88b0375e Class: ExprVarPositional cluster_9c93dafa Class: ExprVarKeyword cluster_490853fc Class: ExprLambda cluster_a399a6d9 Class: ExprList cluster_86d3a929 Class: ExprListComp cluster_6ff2ca0b Class: ExprNamedExpr cluster_06417845 Class: ExprSet cluster_9efe4159 Class: ExprSetComp cluster_93be07c2 Class: ExprSlice cluster_bb2fa8a8 Class: ExprSubscript cluster_e5ecaef4 Class: ExprTemplateStr cluster_45a3a9c0 Class: ExprTuple cluster_cbbdc491 Class: ExprUnaryOp cluster_4cbfd74b Class: ExprAwait cluster_3a686a56 Class: ExprYield cluster_521f2703 Class: ExprYieldFrom node_052f2611 185: __iter__() node_7f451a50 189: iterate() node_052f2611->node_7f451a50 node_3763b731 182: __str__() node_3763b731->node_7f451a50 node_cd07621b 272: _to_binop() node_cd07621b->node_cd07621b node_37348316 218: as_dict() node_3c34f319 160: _expr_as_dict() node_37348316->node_3c34f319 node_8fac5adf 312: append() node_8fac5adf->node_8fac5adf node_240582d9 295: iterate() node_64d2ef64 1253: _get_precedence() node_240582d9->node_64d2ef64 node_d77cde8a 82: _yield() node_240582d9->node_d77cde8a node_75cb1686 1124: iterate() node_75cb1686->node_d77cde8a node_dadf9149 356: iterate() node_dadf9149->node_64d2ef64 node_dadf9149->node_d77cde8a node_5a72fea1 376: iterate() node_5a72fea1->node_64d2ef64 node_5a72fea1->node_d77cde8a node_28ab6b50 399: iterate() node_28ab6b50->node_64d2ef64 node_ea7266d0 125: _join() node_28ab6b50->node_ea7266d0 node_28ab6b50->node_d77cde8a node_e6d7dda2 417: iterate() node_e6d7dda2->node_64d2ef64 node_e6d7dda2->node_d77cde8a node_339babd8 438: iterate() node_339babd8->node_d77cde8a node_eea4f78d 476: iterate() node_eea4f78d->node_ea7266d0 node_08dcb8c4 503: iterate() node_08dcb8c4->node_ea7266d0 node_08dcb8c4->node_d77cde8a node_b893c0bd 524: iterate() node_b893c0bd->node_ea7266d0 node_80f70c1b 567: iterate() node_2ec5a29e 528: _iterate_format_parts() node_80f70c1b->node_2ec5a29e node_46198554 582: iterate() node_46198554->node_ea7266d0 node_46198554->node_d77cde8a node_e2b3f8e3 605: iterate() node_e2b3f8e3->node_e2b3f8e3 node_e2b3f8e3->node_64d2ef64 node_e2b3f8e3->node_d77cde8a node_b48d5a0b 634: iterate() node_b48d5a0b->node_2ec5a29e node_0d2644f8 682: iterate() node_ba20601f 642: _fstring_choose_quote() node_0d2644f8->node_ba20601f node_0d2644f8->node_d77cde8a node_caeb658d 727: iterate() node_caeb658d->node_d77cde8a node_e6b92b96 767: iterate() node_e6b92b96->node_d77cde8a node_fa734df6 810: iterate() node_fa734df6->node_ea7266d0 node_3d07a543 825: iterate() node_3d07a543->node_ea7266d0 node_3d07a543->node_d77cde8a node_e0b91d42 936: iterate() node_e0b91d42->node_d77cde8a node_94bd69f8 964: iterate() node_94bd69f8->node_ea7266d0 node_4e5432b5 979: iterate() node_4e5432b5->node_ea7266d0 node_4e5432b5->node_d77cde8a node_361b937c 998: iterate() node_361b937c->node_d77cde8a node_6011a9e6 1019: iterate() node_6011a9e6->node_64d2ef64 node_6011a9e6->node_d77cde8a node_7bc4a1b9 1026: modernize() node_7bc4a1b9->node_cd07621b node_7bc4a1b9->node_7bc4a1b9 node_c7485967 1059: iterate() node_c7485967->node_ba20601f node_c7485967->node_d77cde8a node_bf006c84 1079: iterate() node_bf006c84->node_ea7266d0 node_2c181639 1110: iterate() node_2c181639->node_64d2ef64 node_2c181639->node_d77cde8a node_8c2cb8d0 753: iterate() node_8c2cb8d0->node_d77cde8a node_06ea4661 741: iterate() node_06ea4661->node_d77cde8a node_4b987ad2 1136: iterate() node_4b987ad2->node_d77cde8a node_0dcd5cb2 1150: iterate() node_0dcd5cb2->node_d77cde8a node_284edace 1619: _build() node_2f374f33 1257: _build_attribute() node_2f374f33->node_8fac5adf node_2f374f33->node_284edace node_ee1001fa 1269: _build_await() node_ee1001fa->node_284edace node_70151413 1273: _build_binop() node_70151413->node_284edace node_9b840648 1281: _build_boolop() node_9b840648->node_284edace node_5a8ce337 1288: _build_call() node_5a8ce337->node_284edace node_6c7bf33e 1299: _build_compare() node_6c7bf33e->node_284edace node_f548a518 1307: _build_comprehension() node_f548a518->node_284edace node_406468a8 1316: _build_constant() node_406468a8->node_284edace node_b6304d0c 1355: _build_dict() node_b6304d0c->node_284edace node_110595f7 1362: _build_dictcomp() node_110595f7->node_284edace node_b0390f06 1373: _build_format_spec() node_b0390f06->node_284edace node_765f546b 1381: _build_formatted() node_765f546b->node_284edace node_765f546b->node_b0390f06 node_291f1d4a 1396: _build_generatorexp() node_291f1d4a->node_284edace node_fc815bd9 1410: _build_ifexp() node_fc815bd9->node_284edace node_94edb7f2 1590: _build_interpolation() node_94edb7f2->node_284edace node_94edb7f2->node_b0390f06 node_c560bebe 1418: _build_joinedstr() node_c560bebe->node_284edace node_375f12b2 1428: _build_keyword() node_375f12b2->node_284edace node_7f40ce79 1434: _build_lambda() node_7f40ce79->node_284edace node_efc0be67 1653: safe_get_expression() node_7f40ce79->node_efc0be67 node_4fb90000 1451: _build_list() node_4fb90000->node_284edace node_d20053ee 1455: _build_listcomp() node_d20053ee->node_284edace node_47d4384e 1463: _build_named_expr() node_47d4384e->node_284edace node_53ff39d5 1467: _build_set() node_53ff39d5->node_284edace node_7fd50812 1471: _build_setcomp() node_7fd50812->node_284edace node_1f00ba90 1475: _build_slice() node_1f00ba90->node_284edace node_581883a3 1491: _build_starred() node_581883a3->node_284edace node_0ac989a0 1495: _build_subscript() node_0ac989a0->node_284edace node_03316402 1604: _build_templatestr() node_03316402->node_284edace node_20afffaa 1524: _build_tuple() node_20afffaa->node_284edace node_8ab852c0 1540: _build_unaryop() node_8ab852c0->node_284edace node_8ad5fe66 1544: _build_yield() node_8ad5fe66->node_284edace node_099ecd1f 1548: _build_yield_from() node_099ecd1f->node_284edace node_d88b65db 149: _field_as_dict() node_3c34f319->node_d88b65db node_d88b65db->node_d88b65db node_ba20601f->node_8fac5adf node_2ec5a29e->node_d77cde8a node_ea7266d0->node_d77cde8a node_d77cde8a->node_64d2ef64 node_d77cde8a->node_d77cde8a node_87030586 1623: get_expression() node_87030586->node_284edace node_efc0be67->node_87030586

extensionsΒ€

SPDX-License-Identifier: ISC

base.pyΒ€

SPDX-License-Identifier: ISC

G cluster_08cd60bc File: base cluster_8e192e43 Class: Extension cluster_de83b3cb Class: Extensions node_8809569d 72: generic_inspect() node_3daa33cc 64: inspect() node_8809569d->node_3daa33cc node_b145b354 55: generic_visit() node_8943e7cc 47: visit() node_b145b354->node_8943e7cc node_a35db123 427: on_alias() node_4a0f48a4 403: on_alias_instance() node_4a0f48a4->node_a35db123 node_8876169c 461: __init__() node_e07d0d89 470: add() node_8876169c->node_e07d0d89 node_4d7f03b4 511: _load_extension() node_f725e9e4 500: _load_extension_path() node_4d7f03b4->node_f725e9e4 node_8b0d92cd 602: load_extensions() node_8b0d92cd->node_8876169c node_8b0d92cd->node_e07d0d89 node_8b0d92cd->node_4d7f03b4
dataclasses.pyΒ€

SPDX-License-Identifier: ISC

G cluster_21552f04 File: dataclasses cluster_0d42d6f9 Class: DataclassesExtension node_2b0c17c1 243: on_package() node_8e50b053 219: _apply_recursively() node_2b0c17c1->node_8e50b053 node_8e50b053->node_8e50b053 node_f7aea547 211: _del_members_annotated_as_initvar() node_8e50b053->node_f7aea547 node_e19921a1 173: _set_dataclass_init() node_8e50b053->node_e19921a1 node_210db765 65: _dataclass_arguments() node_54d7c7c7 41: _dataclass_decorator() node_210db765->node_54d7c7c7 node_dc4eca48 48: _expr_args() node_210db765->node_dc4eca48 node_5c269b55 82: _dataclass_parameters() node_5c269b55->node_210db765 node_3ab38258 71: _field_arguments() node_5c269b55->node_3ab38258 node_dc4eca48->node_dc4eca48 node_3ab38258->node_dc4eca48 node_40ba1e3b 155: _reorder_parameters() node_e19921a1->node_54d7c7c7 node_e19921a1->node_5c269b55 node_e19921a1->node_40ba1e3b
unpack_typeddict.pyΒ€

SPDX-License-Identifier: ISC

G cluster_9f87b704 File: unpack_typeddict cluster_b7f76964 Class: UnpackTypedDictExtension node_56712f76 207: on_class() node_b3268334 81: _get_or_set_attrs() node_56712f76->node_b3268334 node_71828192 186: _params_from_attrs() node_56712f76->node_71828192 node_e5eb9ffe 125: _update_docstring() node_56712f76->node_e5eb9ffe node_559f8a68 234: on_function() node_559f8a68->node_b3268334 node_559f8a68->node_71828192 node_559f8a68->node_e5eb9ffe node_91af2e0b 45: _unwrap_annotation() node_b3268334->node_91af2e0b

finder.pyΒ€

SPDX-License-Identifier: ISC

G cluster_f4ed732a File: finder cluster_b879f0e5 Class: ModuleFinder node_1fe20aa7 118: __init__() node_06faa6bd 400: _extend_from_pth_files() node_1fe20aa7->node_06faa6bd node_c9d2e5b4 135: append_search_path() node_1fe20aa7->node_c9d2e5b4 node_64da1f74 146: _append_search_path() node_09dee2fe 392: _contents() node_06faa6bd->node_09dee2fe node_06faa6bd->node_c9d2e5b4 node_b265722c 456: _handle_pth_file() node_06faa6bd->node_b265722c node_f9dd9d2d 409: _filter_py_modules() node_c170effa 377: _module_name_path() node_119dc65c 417: _top_module_name() node_97da543f 150: insert_search_path() node_119dc65c->node_97da543f node_c9d2e5b4->node_64da1f74 node_f9faeff3 247: find_package() node_f9faeff3->node_09dee2fe node_4269a06a 441: _is_pkg_style_namespace() node_f9faeff3->node_4269a06a node_bc3a41e1 164: find_spec() node_bc3a41e1->node_c170effa node_bc3a41e1->node_119dc65c node_bc3a41e1->node_f9faeff3 node_0f71adcd 294: iter_submodules() node_0f71adcd->node_f9dd9d2d node_0f71adcd->node_0f71adcd node_81c61350 360: submodules() node_81c61350->node_0f71adcd node_570718d7 486: _handle_editable_module() node_837cd751 67: _match_pattern() node_570718d7->node_837cd751 node_b265722c->node_570718d7

git.pyΒ€

SPDX-License-Identifier: ISC

G cluster_c6cca034 File: git cluster_49e9ca18 Class: GitInfo node_63887a09 258: from_package() node_291cfaa6 234: _get_git_commit_hash() node_63887a09->node_291cfaa6 node_2e9aa4f9 179: _get_git_known_service() node_63887a09->node_2e9aa4f9 node_c8814d40 153: _get_git_remote_url() node_63887a09->node_c8814d40 node_1dca8299 103: _get_repo_root() node_63887a09->node_1dca8299 node_023e9cea 240: _is_tracked() node_63887a09->node_023e9cea node_f6f8a304 282: get_source_link() node_a3cb0c9b 220: _get_source_link() node_f6f8a304->node_a3cb0c9b node_ca0d96a3 66: _assert_git_repo() node_47e1469d 52: _git() node_ca0d96a3->node_47e1469d node_291cfaa6->node_47e1469d node_c8814d40->node_47e1469d node_06736b2a 83: _get_latest_tag() node_06736b2a->node_47e1469d node_1dca8299->node_47e1469d node_023e9cea->node_47e1469d node_dcc78a55 46: _normalize() node_df98c683 120: _tmp_worktree() node_df98c683->node_ca0d96a3 node_df98c683->node_47e1469d node_df98c683->node_dcc78a55

helpers.pyΒ€

SPDX-License-Identifier: ISC

G cluster_ff8f19ed File: helpers node_44159b12 419: module_vtree() node_63407e5a 376: vtree() node_44159b12->node_63407e5a node_bcaa6841 325: temporary_inspected_module() node_245f4d21 70: temporary_pyfile() node_bcaa6841->node_245f4d21 node_5919cb9d 205: temporary_inspected_package() node_63aef7b4 88: temporary_pypackage() node_5919cb9d->node_63aef7b4 node_6c23f1db 279: temporary_visited_module() node_6c23f1db->node_245f4d21 node_8157e7ab 137: temporary_visited_package() node_8157e7ab->node_63aef7b4

importer.pyΒ€

SPDX-License-Identifier: ISC

G cluster_23918c1f File: importer node_0f195302 33: _error_details() node_fa1dd0df 59: dynamic_import() node_fa1dd0df->node_0f195302 node_3218710e 38: sys_path() node_fa1dd0df->node_3218710e

loader.pyΒ€

SPDX-License-Identifier: ISC

G cluster_dea1e337 File: loader cluster_5ddffd8e Class: GriffeLoader node_e3cc05fc 69: __init__() node_e902efa6 669: _create_module() node_4ba18cab 754: _expand_wildcard() node_b640ae8b 213: _fire_load_events() node_b640ae8b->node_b640ae8b node_3de73381 724: _get_or_create_parent_module() node_3de73381->node_e902efa6 node_a79ac0a5 697: _inspect_module() node_5b25060a 570: _load_module() node_c90b2d76 589: _load_module_path() node_5b25060a->node_c90b2d76 node_c90b2d76->node_e902efa6 node_c90b2d76->node_a79ac0a5 node_71100624 614: _load_submodules() node_c90b2d76->node_71100624 node_c163a962 677: _visit_module() node_c90b2d76->node_c163a962 node_4bde32ea 555: _load_package() node_4bde32ea->node_5b25060a node_ec23be0a 350: expand_wildcards() node_4bde32ea->node_ec23be0a node_e6ab4d15 618: _load_submodule() node_e6ab4d15->node_3de73381 node_e6ab4d15->node_5b25060a node_71100624->node_e6ab4d15 node_6d78568d 232: _post_load() node_6d78568d->node_b640ae8b node_1f142557 309: expand_exports() node_6d78568d->node_1f142557 node_6d78568d->node_ec23be0a node_1f142557->node_1f142557 node_ec23be0a->node_4ba18cab node_ec23be0a->node_ec23be0a node_5f41565b 121: load() node_ec23be0a->node_5f41565b node_5f41565b->node_a79ac0a5 node_5f41565b->node_4bde32ea node_5f41565b->node_6d78568d node_4bd1953c 253: resolve_aliases() node_4bd1953c->node_ec23be0a node_35df75d7 466: resolve_module_aliases() node_4bd1953c->node_35df75d7 node_35df75d7->node_5f41565b node_35df75d7->node_35df75d7 node_4cb966f2 763: load() node_4cb966f2->node_e3cc05fc node_4cb966f2->node_5f41565b node_4cb966f2->node_4bd1953c node_674e4f71 868: load_git() node_674e4f71->node_4cb966f2 node_934c3236 953: load_pypi() node_934c3236->node_4cb966f2

logger.pyΒ€

SPDX-License-Identifier: ISC

G cluster_70f9102c File: logger cluster_87d967f7 Class: Logger node_b4f2706e 0: (global)() node_baa6cd26 59: _get() node_b4f2706e->node_baa6cd26 node_0f5ed66a 65: _patch_loggers() node_781d4803 109: get_logger() node_781d4803->node_baa6cd26 node_516fff27 121: patch_loggers() node_516fff27->node_0f5ed66a

merger.pyΒ€

SPDX-License-Identifier: ISC

G cluster_08112eea File: merger node_3fb2b100 93: _merge_annotations() node_d1a347dc 56: _merge_attribute_stubs() node_a0ef7a22 68: _merge_stubs_docstring() node_d1a347dc->node_a0ef7a22 node_6c0958d1 40: _merge_class_stubs() node_6c0958d1->node_a0ef7a22 node_080a545e 126: _merge_stubs_members() node_6c0958d1->node_080a545e node_67338bdf 78: _merge_stubs_overloads() node_6c0958d1->node_67338bdf node_b501bc28 73: _merge_stubs_type_parameters() node_6c0958d1->node_b501bc28 node_b69646cb 47: _merge_function_stubs() node_b69646cb->node_a0ef7a22 node_b69646cb->node_b501bc28 node_bbe27233 34: _merge_module_stubs() node_bbe27233->node_a0ef7a22 node_bbe27233->node_080a545e node_bbe27233->node_67338bdf node_2f2c0163 101: _merge_overload_annotations() node_2f2c0163->node_3fb2b100 node_080a545e->node_d1a347dc node_080a545e->node_b69646cb node_e40d3dcb 63: _merge_type_alias_stubs() node_080a545e->node_e40d3dcb node_67338bdf->node_2f2c0163 node_e40d3dcb->node_a0ef7a22 node_e40d3dcb->node_b501bc28 node_2759f24e 170: merge_stubs() node_2759f24e->node_bbe27233

mixins.pyΒ€

SPDX-License-Identifier: ISC

G cluster_358e8a93 File: mixins cluster_8fd7df25 Class: GetMembersMixin cluster_d84e96bb Class: DelMembersMixin cluster_a706e550 Class: SetMembersMixin node_892a7bdc 103: __delitem__() node_34cabe5f 38: _get_parts() node_892a7bdc->node_34cabe5f node_4b12d4aa 130: del_member() node_4b12d4aa->node_4b12d4aa node_4b12d4aa->node_34cabe5f node_fc16f695 53: __getitem__() node_fc16f695->node_34cabe5f node_83730e11 75: get_member() node_83730e11->node_83730e11 node_83730e11->node_34cabe5f node_7a4b29fc 158: __setitem__() node_7a4b29fc->node_34cabe5f node_d4bd8036 184: set_member() node_d4bd8036->node_d4bd8036 node_d4bd8036->node_34cabe5f

models.pyΒ€

SPDX-License-Identifier: ISC

G cluster_62909eac File: models cluster_20ee8289 Class: Docstring cluster_31c5dbf8 Class: Parameter cluster_9d980827 Class: Parameters cluster_408146bc Class: TypeParameters cluster_78644959 Class: Object cluster_d79c053d Class: Alias cluster_2af0c751 Class: Class cluster_8ca36f02 Class: Function node_83a88fae 1366: __init__() node_28007c85 2183: _update_target_aliases() node_83a88fae->node_28007c85 node_5fc44ac1 2167: _resolve_target() node_9db7f252 2134: resolve_target() node_5fc44ac1->node_9db7f252 node_b4bdc075 1557: as_json() node_b4bdc075->node_b4bdc075 node_393c2442 1793: filter_members() node_393c2442->node_393c2442 node_81fb254c 1780: has_labels() node_81fb254c->node_81fb254c node_bf084a00 1535: inherited_members() node_bf084a00->node_83a88fae node_3fe9bfa4 1693: is_kind() node_3fe9bfa4->node_3fe9bfa4 node_d6df43d6 1515: members() node_d6df43d6->node_83a88fae node_7be0adc2 1496: parent() node_7be0adc2->node_28007c85 node_c217d3fd 1902: resolve() node_c217d3fd->node_c217d3fd node_eadd05fc 2085: target() node_eadd05fc->node_9db7f252 node_a0b7b8ad 2467: _mro() node_a0b7b8ad->node_a0b7b8ad node_76f0e499 2478: mro() node_76f0e499->node_a0b7b8ad node_38ea5967 2415: parameters() node_f617babe 324: __init__() node_38ea5967->node_f617babe node_a9e43997 181: parse() node_95da1226 177: parsed() node_95da1226->node_a9e43997 node_3796176b 2508: __init__() node_3796176b->node_f617babe node_4d605966 595: __init__() node_bb0c96ea 504: __init__() node_4d605966->node_bb0c96ea node_ef23a50b 837: inherited_members() node_ef23a50b->node_83a88fae node_5f1cab13 1213: resolve() node_5f1cab13->node_5f1cab13 node_d8a8499e 290: as_dict() node_d8a8499e->node_d8a8499e

stats.pyΒ€

SPDX-License-Identifier: ISC

G cluster_c00f02f7 File: stats cluster_0ec520ad Class: Stats node_0aae2def 36: __init__() node_2fbba97a 90: _itercount() node_0aae2def->node_2fbba97a node_2fbba97a->node_2fbba97a