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_auto.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_9c6ed4a6 File: inspector cluster_1178cb9c Class: Inspector node_a36fd6f3 138: __init__() node_a36fd6f3->node_a36fd6f3 node_bf4fbcd8 190: _get_docstring() node_6e909936 212: _get_linenos() node_47cb6105 278: generic_inspect() node_47cb6105->node_a36fd6f3 node_31e62109 270: inspect() node_47cb6105->node_31e62109 node_4b037654 315: inspect_module() node_47cb6105->node_4b037654 node_f4a02c01 222: get_module() node_f4a02c01->node_31e62109 node_cc95c3a5 559: handle_attribute() node_cc95c3a5->node_bf4fbcd8 node_3fcbbd00 460: handle_function() node_3fcbbd00->node_bf4fbcd8 node_3fcbbd00->node_6e909936 node_8421feab 640: _convert_object_to_annotation() node_3fcbbd00->node_8421feab node_2bb91d22 617: _convert_parameter() node_3fcbbd00->node_2bb91d22 node_ab7e2388 676: _convert_type_parameters() node_3fcbbd00->node_ab7e2388 node_f154521f 551: inspect_attribute() node_f154521f->node_cc95c3a5 node_151ed4bb 420: inspect_builtin_function() node_151ed4bb->node_3fcbbd00 node_48e95882 396: inspect_builtin_method() node_48e95882->node_3fcbbd00 node_6faaf487 436: inspect_cached_property() node_6faaf487->node_3fcbbd00 node_468090df 338: inspect_class() node_468090df->node_bf4fbcd8 node_468090df->node_6e909936 node_468090df->node_47cb6105 node_468090df->node_ab7e2388 node_dd34394b 380: inspect_classmethod() node_dd34394b->node_3fcbbd00 node_a9e2917c 412: inspect_coroutine() node_a9e2917c->node_3fcbbd00 node_6ce93688 428: inspect_function() node_6ce93688->node_3fcbbd00 node_d8c7f38b 452: inspect_getset_descriptor() node_d8c7f38b->node_3fcbbd00 node_263f7dc1 404: inspect_method() node_263f7dc1->node_3fcbbd00 node_2fd83e6f 388: inspect_method_descriptor() node_2fd83e6f->node_3fcbbd00 node_4b037654->node_bf4fbcd8 node_b3d3d646 444: inspect_property() node_b3d3d646->node_3fcbbd00 node_d3d0c747 372: inspect_staticmethod() node_d3d0c747->node_3fcbbd00 node_e63c2f81 526: inspect_type_alias() node_e63c2f81->node_bf4fbcd8 node_e63c2f81->node_6e909936 node_e63c2f81->node_ab7e2388 node_36a828d1 719: _convert_type_to_annotation() node_e63c2f81->node_36a828d1 node_2bb91d22->node_8421feab node_ab7e2388->node_36a828d1 node_36a828d1->node_8421feab node_36a828d1->node_36a828d1 node_cc3d4d6a 70: inspect() node_cc3d4d6a->node_a36fd6f3 node_cc3d4d6a->node_f4a02c01
nodesΒ€

SPDX-License-Identifier: ISC

assignments.pyΒ€

SPDX-License-Identifier: ISC

G cluster_1949b16f File: assignments node_9c3b7be0 59: _get_annassign_names() node_c2f737d6 42: get_name() node_9c3b7be0->node_c2f737d6 node_1b168e0b 54: _get_assign_names() node_1b168e0b->node_c2f737d6 node_0352254c 28: _get_attribute_name() node_0352254c->node_c2f737d6 node_ab1741b3 82: get_instance_names() node_b02197ac 70: get_names() node_ab1741b3->node_b02197ac
ast.pyΒ€

SPDX-License-Identifier: ISC

G cluster_de57b739 File: ast node_440e3849 48: ast_children() node_46f12c58 165: ast_first_child() node_46f12c58->node_440e3849 node_ebfa501d 183: ast_last_child() node_ebfa501d->node_440e3849 node_d579b3f6 147: ast_next() node_20aa2083 94: ast_next_siblings() node_d579b3f6->node_20aa2083 node_20aa2083->node_440e3849 node_f3569ee2 128: ast_previous() node_d522a5b7 78: ast_previous_siblings() node_f3569ee2->node_d522a5b7 node_d522a5b7->node_440e3849 node_1e3ea415 110: ast_siblings() node_1e3ea415->node_440e3849
docstrings.pyΒ€

SPDX-License-Identifier: ISC

exports.pyΒ€

SPDX-License-Identifier: ISC

G cluster_ddad392f File: exports node_1a312e13 77: _extract() node_fe932a8e 36: _extract_attribute() node_fe932a8e->node_1a312e13 node_ae1aeba3 40: _extract_binop() node_ae1aeba3->node_1a312e13 node_b8a0a535 54: _extract_sequence() node_b8a0a535->node_1a312e13 node_95b07e0b 61: _extract_starred() node_95b07e0b->node_1a312e13 node_b772009d 81: get__all__() node_b772009d->node_1a312e13 node_229438a0 96: safe_get__all__() node_229438a0->node_b772009d
imports.pyΒ€

SPDX-License-Identifier: ISC

parameters.pyΒ€

SPDX-License-Identifier: ISC

runtime.pyΒ€

SPDX-License-Identifier: ISC

G cluster_aa7daa8d File: runtime cluster_66b0937b Class: ObjectNode node_80dc988d 68: __init__() node_be79515e 301: _pick_member() node_7ec94081 311: alias_target_path() node_10ca2130 52: _same_components() node_7ec94081->node_10ca2130 node_3483a9e1 191: children() node_3483a9e1->node_80dc988d node_3483a9e1->node_be79515e
values.pyΒ€

SPDX-License-Identifier: ISC

G cluster_dfb01847 File: values node_66db4a93 31: get_value() node_70e9254d 45: safe_get_value() node_70e9254d->node_66db4a93
visitor.pyΒ€

SPDX-License-Identifier: ISC

G cluster_01d1f0be File: visitor cluster_e4cfa2a5 Class: Visitor node_98698e29 150: __init__() node_98698e29->node_98698e29 node_30da5fb8 212: _get_docstring() node_9ec00d71 232: _get_type_parameters() node_42383e09 378: decorators_to_labels() node_8e867733 292: generic_visit() node_51df8028 283: visit() node_8e867733->node_51df8028 node_c2891a72 396: get_base_property() node_4a2a460a 261: get_module() node_4a2a460a->node_51df8028 node_adc1d1db 641: handle_attribute() node_adc1d1db->node_30da5fb8 node_fd0a7277 420: handle_function() node_fd0a7277->node_30da5fb8 node_fd0a7277->node_9ec00d71 node_fd0a7277->node_42383e09 node_fd0a7277->node_8e867733 node_fd0a7277->node_c2891a72 node_7350d8fa 756: visit_annassign() node_7350d8fa->node_adc1d1db node_5caee519 748: visit_assign() node_5caee519->node_adc1d1db node_2b864a03 537: visit_asyncfunctiondef() node_2b864a03->node_fd0a7277 node_1d18078d 324: visit_classdef() node_1d18078d->node_30da5fb8 node_1d18078d->node_9ec00d71 node_1d18078d->node_42383e09 node_1d18078d->node_8e867733 node_fca2534e 529: visit_functiondef() node_fca2534e->node_fd0a7277 node_7d414a70 785: visit_if() node_7d414a70->node_8e867733 node_27b51342 301: visit_module() node_27b51342->node_30da5fb8 node_27b51342->node_8e867733 node_7cb27612 548: visit_typealias() node_7cb27612->node_30da5fb8 node_7cb27612->node_9ec00d71 node_bf7d5c1c 93: visit() node_bf7d5c1c->node_98698e29 node_bf7d5c1c->node_4a2a460a

c3linear.pyΒ€

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

G cluster_ece828d5 File: c3linear cluster_89636938 Class: _Dependency cluster_846953c7 Class: _DependencyList node_1248597b 29: tail() node_395ef658 60: __len__() node_1248597b->node_395ef658 node_dbed84d0 48: __init__() node_4f6badca 64: __repr__() node_4f6badca->node_4f6badca node_4a962137 82: remove() node_aef2a1e1 93: c3linear_merge() node_aef2a1e1->node_dbed84d0 node_aef2a1e1->node_4a962137

collections.pyΒ€

SPDX-License-Identifier: ISC

G cluster_64c898b3 File: collections cluster_3fd74625 Class: LinesCollection node_cbe31036 72: items() node_cbe31036->node_cbe31036 node_f302cac4 56: keys() node_f302cac4->node_f302cac4 node_6afa6b06 64: values() node_6afa6b06->node_6afa6b06

debug.pyΒ€

SPDX-License-Identifier: ISC

G cluster_e5de42a3 File: debug node_6bc21a45 96: _get_debug_info() node_307bda4a 81: _get_version() node_6bc21a45->node_307bda4a node_139509b6 70: _interpreter_name_version() node_6bc21a45->node_139509b6 node_be7f1c98 115: _print_debug_info() node_be7f1c98->node_6bc21a45

diff.pyΒ€

SPDX-License-Identifier: ISC

G cluster_f04b913c File: diff cluster_5f3a9568 Class: Breakage node_bd424bc0 300: _explain_azdo() node_fb04cf24 221: _format_new_value() node_bd424bc0->node_fb04cf24 node_36169fdc 218: _format_old_value() node_bd424bc0->node_36169fdc node_946dbee7 210: _format_title() node_bd424bc0->node_946dbee7 node_0c431926 278: _explain_github() node_0c431926->node_fb04cf24 node_0c431926->node_36169fdc node_0c431926->node_946dbee7 node_6c4acbf9 258: _explain_markdown() node_6c4acbf9->node_fb04cf24 node_6c4acbf9->node_36169fdc node_6dc8ce95 224: _explain_oneline() node_94fc1357 213: _format_kind() node_6dc8ce95->node_94fc1357 node_1950f2c4 205: _format_location() node_6dc8ce95->node_1950f2c4 node_6dc8ce95->node_fb04cf24 node_6dc8ce95->node_36169fdc node_6dc8ce95->node_946dbee7 node_6439db2e 240: _explain_verbose() node_6439db2e->node_94fc1357 node_6439db2e->node_1950f2c4 node_6439db2e->node_fb04cf24 node_6439db2e->node_36169fdc node_6439db2e->node_946dbee7 node_0fcb0c9c 604: _alias_incompatibilities() node_e37f21b6 645: _type_based_yield() node_0fcb0c9c->node_e37f21b6 node_30316ac4 595: _attribute_incompatibilities() node_85b2f7d4 504: _class_incompatibilities() node_774cc6ea 620: _member_incompatibilities() node_85b2f7d4->node_774cc6ea node_18855a76 517: _function_incompatibilities() node_92258c71 682: _returns_are_compatible() node_18855a76->node_92258c71 node_774cc6ea->node_e37f21b6 node_e37f21b6->node_30316ac4 node_e37f21b6->node_85b2f7d4 node_e37f21b6->node_18855a76 node_069f8e8d 706: find_breaking_changes() node_069f8e8d->node_774cc6ea

docstringsΒ€

SPDX-License-Identifier: ISC

auto.pyΒ€

SPDX-License-Identifier: ISC

G cluster_6474b9ba File: auto node_2cd850ac 145: infer_docstring_style() node_bf2304dd 216: parse_auto() node_bf2304dd->node_2cd850ac
google.pyΒ€

SPDX-License-Identifier: ISC

G cluster_f4cf1812 File: google node_d27cc36e 661: _annotation_from_parent() node_94c16599 630: _get_name_annotation_description() node_2fa5c0dd 890: _is_empty_line() node_d2c6d2a7 378: _read_attributes_section() node_888588e6 108: _read_block_items() node_d2c6d2a7->node_888588e6 node_7d94c1e4 178: _read_block() node_7d94c1e4->node_2fa5c0dd node_888588e6->node_2fa5c0dd node_0bcf6049 615: _read_block_items_maybe() node_0bcf6049->node_7d94c1e4 node_0bcf6049->node_888588e6 node_a6dbfe9b 459: _read_classes_section() node_a6dbfe9b->node_888588e6 node_e54f8b67 830: _read_examples_section() node_e54f8b67->node_2fa5c0dd node_e54f8b67->node_7d94c1e4 node_1f6f348e 421: _read_functions_section() node_1f6f348e->node_888588e6 node_50b5e934 525: _read_modules_section() node_50b5e934->node_888588e6 node_3d37ac7a 294: _read_other_parameters_section() node_1447cf98 213: _read_parameters() node_3d37ac7a->node_1447cf98 node_1447cf98->node_888588e6 node_efad2855 283: _read_parameters_section() node_efad2855->node_1447cf98 node_9ae25db9 554: _read_raises_section() node_9ae25db9->node_888588e6 node_b5a5c436 780: _read_receives_section() node_b5a5c436->node_d27cc36e node_b5a5c436->node_94c16599 node_b5a5c436->node_0bcf6049 node_f672b045 680: _read_returns_section() node_f672b045->node_d27cc36e node_f672b045->node_94c16599 node_f672b045->node_0bcf6049 node_a7c6b533 497: _read_type_aliases_section() node_a7c6b533->node_888588e6 node_fbbad910 306: _read_type_parameters_section() node_fbbad910->node_888588e6 node_a2f280e1 586: _read_warns_section() node_a2f280e1->node_888588e6 node_a302b691 730: _read_yields_section() node_a302b691->node_d27cc36e node_a302b691->node_94c16599 node_a302b691->node_0bcf6049 node_e9e59344 937: parse_google() node_e9e59344->node_2fa5c0dd node_e9e59344->node_7d94c1e4
models.pyΒ€

SPDX-License-Identifier: ISC

G cluster_30ff7093 File: models cluster_267bdb76 Class: DocstringSection node_c364fb21 262: as_dict() node_c364fb21->node_c364fb21
numpy.pyΒ€

SPDX-License-Identifier: ISC

G cluster_fb2ea1b7 File: numpy node_56ee6922 899: _append_section() node_29115e84 111: _is_dash_line() node_a1799f06 107: _is_empty_line() node_29115e84->node_a1799f06 node_95e92215 671: _read_attributes_section() node_20655f83 115: _read_block_items() node_95e92215->node_20655f83 node_e2b150a7 177: _read_block() node_e2b150a7->node_29115e84 node_e2b150a7->node_a1799f06 node_20655f83->node_29115e84 node_20655f83->node_a1799f06 node_0cef86bb 744: _read_classes_section() node_0cef86bb->node_20655f83 node_ea52a477 432: _read_deprecated_section() node_ea52a477->node_20655f83 node_f441c259 833: _read_examples_section() node_f441c259->node_a1799f06 node_f441c259->node_e2b150a7 node_796f1c50 711: _read_functions_section() node_796f1c50->node_20655f83 node_5a052a31 800: _read_modules_section() node_5a052a31->node_20655f83 node_6d13e3a3 334: _read_other_parameters_section() node_9f1c1160 243: _read_parameters() node_6d13e3a3->node_9f1c1160 node_9f1c1160->node_20655f83 node_43771616 318: _read_parameters_section() node_43771616->node_9f1c1160 node_5b303ff2 619: _read_raises_section() node_5b303ff2->node_20655f83 node_b10a587d 571: _read_receives_section() node_b10a587d->node_20655f83 node_bc7a9526 459: _read_returns_section() node_bc7a9526->node_20655f83 node_679e8ca3 777: _read_type_aliases_section() node_679e8ca3->node_20655f83 node_7b7194a6 358: _read_type_parameters_section() node_7b7194a6->node_20655f83 node_e5ab6799 645: _read_warns_section() node_e5ab6799->node_20655f83 node_67edf8b2 519: _read_yields_section() node_67edf8b2->node_20655f83 node_7665e62e 952: parse_numpy() node_7665e62e->node_56ee6922 node_7665e62e->node_29115e84 node_7665e62e->node_a1799f06
parsers.pyΒ€

SPDX-License-Identifier: ISC

sphinx.pyΒ€

SPDX-License-Identifier: ISC

G cluster_a58f71e4 File: sphinx cluster_81b86916 Class: _FieldType node_90cad961 72: matches() node_56b35ef0 500: _consolidate_continuation_lines() node_4ad7c345 513: _consolidate_descriptive_type() node_36e83b64 240: _determine_param_annotation() node_be1637e4 233: _determine_param_default() node_4dbc30ca 481: _parse_directive() node_4dbc30ca->node_56b35ef0 node_961c926f 465: _parsed_values_to_sections() node_dff00a46 517: _strip_blank_lines() node_961c926f->node_dff00a46 node_c3a0242d 307: _read_attribute() node_c3a0242d->node_4dbc30ca node_1f48bc82 355: _read_attribute_type() node_1f48bc82->node_4ad7c345 node_1f48bc82->node_4dbc30ca node_e517f480 386: _read_exception() node_e517f480->node_4dbc30ca node_be3633e4 169: _read_parameter() node_be3633e4->node_36e83b64 node_be3633e4->node_be1637e4 node_be3633e4->node_4dbc30ca node_2deeeab7 275: _read_parameter_type() node_2deeeab7->node_4ad7c345 node_2deeeab7->node_4dbc30ca node_713a7cf3 408: _read_return() node_713a7cf3->node_4dbc30ca node_6f7686b3 443: _read_return_type() node_6f7686b3->node_4ad7c345 node_6f7686b3->node_4dbc30ca node_bc416d56 120: parse_sphinx() node_bc416d56->node_90cad961 node_bc416d56->node_961c926f
utils.pyΒ€

SPDX-License-Identifier: ISC

G cluster_55e745ef File: utils node_c2dde872 69: _compile_docstring_annotation() node_4060d097 76: parse_docstring_annotation() node_4060d097->node_c2dde872

encoders.pyΒ€

SPDX-License-Identifier: ISC

G cluster_4c03d578 File: encoders cluster_db22bf72 Class: JSONEncoder node_694aea5f 79: __init__() node_694aea5f->node_694aea5f node_cea56744 174: _attach_parent_to_expr() node_0808ec40 184: _attach_parent_to_exprs() node_0808ec40->node_cea56744 node_56759036 303: _load_attribute() node_e08047b0 116: _load_docstring() node_56759036->node_e08047b0 node_8ff268ca 165: _load_git_info() node_56759036->node_8ff268ca node_4e6af3f8 250: _load_class() node_4e6af3f8->node_0808ec40 node_825f4d3c 122: _load_decorators() node_4e6af3f8->node_825f4d3c node_4e6af3f8->node_e08047b0 node_4e6af3f8->node_8ff268ca node_b0e27fb9 126: _load_expression() node_8d78b0c0 280: _load_function() node_8d78b0c0->node_825f4d3c node_8d78b0c0->node_e08047b0 node_8d78b0c0->node_8ff268ca node_e1c614b5 221: _load_module() node_e1c614b5->node_0808ec40 node_e1c614b5->node_e08047b0 node_e1c614b5->node_8ff268ca node_30628038 146: _load_parameter() node_30628038->node_e08047b0 node_ab3bf799 339: _load_type_alias() node_ab3bf799->node_e08047b0 node_ab3bf799->node_8ff268ca node_56c81d40 156: _load_type_parameter() node_eb7abc06 370: json_decoder() node_eb7abc06->node_b0e27fb9 node_eb7abc06->node_30628038 node_eb7abc06->node_56c81d40

enumerations.pyΒ€

SPDX-License-Identifier: ISC

exceptions.pyΒ€

SPDX-License-Identifier: ISC

G cluster_1ccd988b File: exceptions cluster_eef5534d Class: AliasResolutionError node_fda0894a 70: __str__() node_46adf779 62: _format_message() node_fda0894a->node_46adf779

expressions.pyΒ€

SPDX-License-Identifier: ISC

G cluster_9c90bd85 File: expressions cluster_eb12826a Class: Expr cluster_cfac9fdb Class: ExprAttribute cluster_28bda864 Class: ExprBinOp cluster_65445592 Class: ExprBoolOp cluster_b3304837 Class: ExprCall cluster_3d9131e1 Class: ExprCompare cluster_e3b30203 Class: ExprComprehension cluster_71801eba Class: ExprDict cluster_e5addf40 Class: ExprDictComp cluster_9660b718 Class: ExprExtSlice cluster_01ed3ab5 Class: ExprFormatted cluster_72839315 Class: ExprGeneratorExp cluster_343b070b Class: ExprIfExp cluster_48c9f054 Class: ExprInterpolation cluster_c14bc23d Class: ExprJoinedStr cluster_100653a8 Class: ExprKeyword cluster_0940b819 Class: ExprVarPositional cluster_467dd624 Class: ExprVarKeyword cluster_fce6fde5 Class: ExprLambda cluster_8592b00d Class: ExprList cluster_93639217 Class: ExprListComp cluster_35a43c91 Class: ExprNamedExpr cluster_39465876 Class: ExprSet cluster_361980a1 Class: ExprSetComp cluster_1c42da03 Class: ExprSlice cluster_a77af21b Class: ExprSubscript cluster_629c0b45 Class: ExprTemplateStr cluster_15d09096 Class: ExprTuple cluster_2d060740 Class: ExprUnaryOp cluster_8e173eee Class: ExprAwait cluster_080d190f Class: ExprYield cluster_2b4ef8bb Class: ExprYieldFrom node_e2c21efb 193: __iter__() node_bcf62798 197: iterate() node_e2c21efb->node_bcf62798 node_5763d25e 190: __str__() node_5763d25e->node_bcf62798 node_563cb932 280: _to_binop() node_563cb932->node_563cb932 node_daf5d87c 226: as_dict() node_eb8c359d 169: _expr_as_dict() node_daf5d87c->node_eb8c359d node_a8eea041 320: append() node_a8eea041->node_a8eea041 node_39892295 303: iterate() node_b4a4c38b 1272: _get_precedence() node_39892295->node_b4a4c38b node_05b3939f 82: _yield() node_39892295->node_05b3939f node_38eedc87 1143: iterate() node_38eedc87->node_05b3939f node_8282c9e0 364: iterate() node_8282c9e0->node_b4a4c38b node_8282c9e0->node_05b3939f node_c0cd13be 384: iterate() node_c0cd13be->node_b4a4c38b node_c0cd13be->node_05b3939f node_44e86dca 407: iterate() node_44e86dca->node_b4a4c38b node_14953c9c 125: _join() node_44e86dca->node_14953c9c node_44e86dca->node_05b3939f node_686afda4 425: iterate() node_686afda4->node_b4a4c38b node_686afda4->node_05b3939f node_7e3f85cf 446: iterate() node_7e3f85cf->node_05b3939f node_1bc56395 484: iterate() node_1bc56395->node_14953c9c node_d243ce38 511: iterate() node_d243ce38->node_14953c9c node_d243ce38->node_05b3939f node_fe4d6cb3 532: iterate() node_fe4d6cb3->node_14953c9c node_80e2d6cf 586: iterate() node_e4a5ccaf 536: _iterate_format_parts() node_80e2d6cf->node_e4a5ccaf node_3f2493f9 601: iterate() node_3f2493f9->node_14953c9c node_3f2493f9->node_05b3939f node_55b11027 624: iterate() node_55b11027->node_55b11027 node_55b11027->node_b4a4c38b node_55b11027->node_05b3939f node_320da35e 653: iterate() node_320da35e->node_e4a5ccaf node_92f9f046 701: iterate() node_8aff83bc 661: _fstring_choose_quote() node_92f9f046->node_8aff83bc node_92f9f046->node_05b3939f node_255fd695 746: iterate() node_255fd695->node_05b3939f node_a3faaf39 786: iterate() node_a3faaf39->node_05b3939f node_82c62851 829: iterate() node_82c62851->node_14953c9c node_236a112d 844: iterate() node_236a112d->node_14953c9c node_236a112d->node_05b3939f node_144ce427 955: iterate() node_144ce427->node_05b3939f node_87380010 983: iterate() node_87380010->node_14953c9c node_368d5cde 998: iterate() node_368d5cde->node_14953c9c node_368d5cde->node_05b3939f node_8f2547d9 1017: iterate() node_8f2547d9->node_05b3939f node_75542822 1038: iterate() node_75542822->node_b4a4c38b node_75542822->node_05b3939f node_157a3601 1045: modernize() node_157a3601->node_563cb932 node_157a3601->node_157a3601 node_5ddc55ff 1078: iterate() node_5ddc55ff->node_8aff83bc node_5ddc55ff->node_05b3939f node_e3e120d2 1098: iterate() node_e3e120d2->node_14953c9c node_14e69f54 1129: iterate() node_14e69f54->node_b4a4c38b node_14e69f54->node_05b3939f node_ec8402e2 772: iterate() node_ec8402e2->node_05b3939f node_6cf0ad57 760: iterate() node_6cf0ad57->node_05b3939f node_4eff4096 1155: iterate() node_4eff4096->node_05b3939f node_8bb81b00 1169: iterate() node_8bb81b00->node_05b3939f node_a68fa895 1624: _build() node_debea468 1276: _build_attribute() node_debea468->node_a8eea041 node_debea468->node_a68fa895 node_31f31a50 1288: _build_await() node_31f31a50->node_a68fa895 node_07ea6f49 1292: _build_binop() node_07ea6f49->node_a68fa895 node_b5f237d3 1300: _build_boolop() node_b5f237d3->node_a68fa895 node_85f02aef 1307: _build_call() node_85f02aef->node_a68fa895 node_45b34fd4 1318: _build_compare() node_45b34fd4->node_a68fa895 node_eb449cb6 1334: _build_comprehension() node_eb449cb6->node_a68fa895 node_d9b14035 1326: _build_implicit_tuple() node_eb449cb6->node_d9b14035 node_b15537a2 1343: _build_constant() node_b15537a2->node_a68fa895 node_3fc1fa2b 1382: _build_dict() node_3fc1fa2b->node_a68fa895 node_8f0a6857 1389: _build_dictcomp() node_8f0a6857->node_a68fa895 node_dc92845a 1400: _build_format_spec() node_dc92845a->node_a68fa895 node_3b130e96 1408: _build_formatted() node_3b130e96->node_a68fa895 node_3b130e96->node_dc92845a node_ff909329 1423: _build_generatorexp() node_ff909329->node_a68fa895 node_c27c437d 1437: _build_ifexp() node_c27c437d->node_a68fa895 node_d9b14035->node_a68fa895 node_771edf26 1595: _build_interpolation() node_771edf26->node_a68fa895 node_771edf26->node_dc92845a node_c90898f4 1445: _build_joinedstr() node_c90898f4->node_a68fa895 node_9d19afa2 1455: _build_keyword() node_9d19afa2->node_a68fa895 node_445e969e 1461: _build_lambda() node_445e969e->node_a68fa895 node_0bed0338 1658: safe_get_expression() node_445e969e->node_0bed0338 node_83c58f60 1478: _build_list() node_83c58f60->node_a68fa895 node_9fa9d711 1482: _build_listcomp() node_9fa9d711->node_a68fa895 node_76ba548b 1490: _build_named_expr() node_76ba548b->node_a68fa895 node_534e1f7d 1494: _build_set() node_534e1f7d->node_a68fa895 node_2464f667 1498: _build_setcomp() node_2464f667->node_a68fa895 node_6ba418a8 1502: _build_slice() node_6ba418a8->node_a68fa895 node_b5d60802 1510: _build_starred() node_b5d60802->node_a68fa895 node_5c2a262f 1514: _build_subscript() node_5c2a262f->node_a68fa895 node_5c2a262f->node_d9b14035 node_5043ea98 1609: _build_templatestr() node_5043ea98->node_a68fa895 node_c8678c23 1541: _build_tuple() node_c8678c23->node_a68fa895 node_8302bb9e 1545: _build_unaryop() node_8302bb9e->node_a68fa895 node_070946aa 1549: _build_yield() node_070946aa->node_a68fa895 node_42d026e1 1553: _build_yield_from() node_42d026e1->node_a68fa895 node_5874a502 149: _field_as_dict() node_eb8c359d->node_5874a502 node_89b6f5f8 161: _serializable_expression_fields() node_eb8c359d->node_89b6f5f8 node_5874a502->node_5874a502 node_8aff83bc->node_a8eea041 node_e4a5ccaf->node_e4a5ccaf node_e4a5ccaf->node_05b3939f node_14953c9c->node_05b3939f node_05b3939f->node_b4a4c38b node_05b3939f->node_05b3939f node_f1faf6de 1628: get_expression() node_f1faf6de->node_a68fa895 node_0bed0338->node_f1faf6de

extensionsΒ€

SPDX-License-Identifier: ISC

base.pyΒ€

SPDX-License-Identifier: ISC

G cluster_0e818321 File: base cluster_944c8032 Class: Extension cluster_6fcd8c6c Class: Extensions node_81f0681c 74: generic_inspect() node_5795f7f3 66: inspect() node_81f0681c->node_5795f7f3 node_ea97a47c 57: generic_visit() node_171fb0ef 49: visit() node_ea97a47c->node_171fb0ef node_185fd9a9 429: on_alias() node_4be1ba47 405: on_alias_instance() node_4be1ba47->node_185fd9a9 node_7dc208b5 463: __init__() node_36729a7c 472: add() node_7dc208b5->node_36729a7c node_d0131d85 530: _load_extension() node_6f4fa6d2 519: _load_extension_path() node_d0131d85->node_6f4fa6d2 node_7f60fb38 621: load_extensions() node_7f60fb38->node_7dc208b5 node_7f60fb38->node_36729a7c node_7f60fb38->node_d0131d85
dataclasses.pyΒ€

SPDX-License-Identifier: ISC

G cluster_c1cd97e6 File: dataclasses cluster_d376a101 Class: DataclassesExtension node_6a2c21b0 243: on_package() node_2baa9c0d 219: _apply_recursively() node_6a2c21b0->node_2baa9c0d node_2baa9c0d->node_2baa9c0d node_0ed63602 211: _del_members_annotated_as_initvar() node_2baa9c0d->node_0ed63602 node_4234cbe0 173: _set_dataclass_init() node_2baa9c0d->node_4234cbe0 node_070c9610 65: _dataclass_arguments() node_ba17bf9c 41: _dataclass_decorator() node_070c9610->node_ba17bf9c node_e1d72a3c 48: _expr_args() node_070c9610->node_e1d72a3c node_270fb851 82: _dataclass_parameters() node_270fb851->node_070c9610 node_1896bf20 71: _field_arguments() node_270fb851->node_1896bf20 node_e1d72a3c->node_e1d72a3c node_1896bf20->node_e1d72a3c node_9a241171 155: _reorder_parameters() node_4234cbe0->node_ba17bf9c node_4234cbe0->node_270fb851 node_4234cbe0->node_9a241171
unpack_typeddict.pyΒ€

SPDX-License-Identifier: ISC

G cluster_58a93035 File: unpack_typeddict cluster_1ce71ede Class: UnpackTypedDictExtension node_33e30817 207: on_class() node_86467f98 81: _get_or_set_attrs() node_33e30817->node_86467f98 node_26abdc29 186: _params_from_attrs() node_33e30817->node_26abdc29 node_3e49b2ce 125: _update_docstring() node_33e30817->node_3e49b2ce node_3ed1b8f9 234: on_function() node_3ed1b8f9->node_86467f98 node_3ed1b8f9->node_26abdc29 node_3ed1b8f9->node_3e49b2ce node_e2dc6055 45: _unwrap_annotation() node_86467f98->node_e2dc6055

finder.pyΒ€

SPDX-License-Identifier: ISC

G cluster_ef6fa1d9 File: finder cluster_68941429 Class: ModuleFinder node_52400a0a 118: __init__() node_62f5e2f9 400: _extend_from_pth_files() node_52400a0a->node_62f5e2f9 node_e6d4f8cb 135: append_search_path() node_52400a0a->node_e6d4f8cb node_d8084950 146: _append_search_path() node_a396b294 392: _contents() node_62f5e2f9->node_a396b294 node_62f5e2f9->node_e6d4f8cb node_81e9d938 456: _handle_pth_file() node_62f5e2f9->node_81e9d938 node_1d506d89 409: _filter_py_modules() node_d35c76fb 377: _module_name_path() node_76617ac5 417: _top_module_name() node_32540369 150: insert_search_path() node_76617ac5->node_32540369 node_e6d4f8cb->node_d8084950 node_5e440f50 247: find_package() node_5e440f50->node_a396b294 node_1302d121 441: _is_pkg_style_namespace() node_5e440f50->node_1302d121 node_feafa1c5 164: find_spec() node_feafa1c5->node_d35c76fb node_feafa1c5->node_76617ac5 node_feafa1c5->node_5e440f50 node_fe1af51f 294: iter_submodules() node_fe1af51f->node_1d506d89 node_fe1af51f->node_fe1af51f node_7753ef41 360: submodules() node_7753ef41->node_fe1af51f node_c9839a9b 486: _handle_editable_module() node_c64f521d 67: _match_pattern() node_c9839a9b->node_c64f521d node_81e9d938->node_c9839a9b

git.pyΒ€

SPDX-License-Identifier: ISC

G cluster_017f02b5 File: git cluster_8a8dc059 Class: GitInfo node_3888378b 258: from_package() node_9908cdb5 234: _get_git_commit_hash() node_3888378b->node_9908cdb5 node_c9489292 179: _get_git_known_service() node_3888378b->node_c9489292 node_a7c17014 153: _get_git_remote_url() node_3888378b->node_a7c17014 node_bbac6566 103: _get_repo_root() node_3888378b->node_bbac6566 node_a34f6bbb 240: _is_tracked() node_3888378b->node_a34f6bbb node_6236b5d9 285: get_source_link() node_b17ed73c 220: _get_source_link() node_6236b5d9->node_b17ed73c node_41f244fc 66: _assert_git_repo() node_e4c55c39 52: _git() node_41f244fc->node_e4c55c39 node_9908cdb5->node_e4c55c39 node_a7c17014->node_e4c55c39 node_e6b57745 83: _get_latest_tag() node_e6b57745->node_e4c55c39 node_bbac6566->node_e4c55c39 node_a34f6bbb->node_e4c55c39 node_08a2cb4b 46: _normalize() node_0686bb32 120: _tmp_worktree() node_0686bb32->node_41f244fc node_0686bb32->node_e4c55c39 node_0686bb32->node_08a2cb4b

helpers.pyΒ€

SPDX-License-Identifier: ISC

G cluster_993105d3 File: helpers node_4abc1fa4 429: module_vtree() node_fc2af528 386: vtree() node_4abc1fa4->node_fc2af528 node_c49bfe9a 335: temporary_inspected_module() node_e5a98511 70: temporary_pyfile() node_c49bfe9a->node_e5a98511 node_843d761b 210: temporary_inspected_package() node_b5d2871e 88: temporary_pypackage() node_843d761b->node_b5d2871e node_5a871edf 289: temporary_visited_module() node_5a871edf->node_e5a98511 node_03737f63 137: temporary_visited_package() node_03737f63->node_b5d2871e

importer.pyΒ€

SPDX-License-Identifier: ISC

G cluster_883fd922 File: importer node_1805b4a4 33: _error_details() node_6d847282 59: dynamic_import() node_6d847282->node_1805b4a4 node_d959160b 38: sys_path() node_6d847282->node_d959160b

loader.pyΒ€

SPDX-License-Identifier: ISC

G cluster_a7a0cf2f File: loader cluster_0a326ca5 Class: GriffeLoader node_b98087ed 79: __init__() node_01239003 687: _create_module() node_7d1e9b1f 772: _expand_wildcard() node_55be1322 230: _fire_load_events() node_55be1322->node_55be1322 node_e9c131a5 742: _get_or_create_parent_module() node_e9c131a5->node_01239003 node_dc6b5320 715: _inspect_module() node_4ccef42b 588: _load_module() node_b8170f8a 607: _load_module_path() node_4ccef42b->node_b8170f8a node_b8170f8a->node_01239003 node_b8170f8a->node_dc6b5320 node_b3f13118 632: _load_submodules() node_b8170f8a->node_b3f13118 node_4e44c38b 695: _visit_module() node_b8170f8a->node_4e44c38b node_21f67b84 573: _load_package() node_21f67b84->node_4ccef42b node_af8f62ef 368: expand_wildcards() node_21f67b84->node_af8f62ef node_8c7bb296 636: _load_submodule() node_8c7bb296->node_e9c131a5 node_8c7bb296->node_4ccef42b node_b3f13118->node_8c7bb296 node_61200070 249: _post_load() node_61200070->node_55be1322 node_f378c5af 327: expand_exports() node_61200070->node_f378c5af node_61200070->node_af8f62ef node_f378c5af->node_f378c5af node_af8f62ef->node_7d1e9b1f node_af8f62ef->node_af8f62ef node_458aa7dd 138: load() node_af8f62ef->node_458aa7dd node_458aa7dd->node_dc6b5320 node_458aa7dd->node_21f67b84 node_458aa7dd->node_61200070 node_2a4c3a27 271: resolve_aliases() node_2a4c3a27->node_af8f62ef node_5d68dfa1 484: resolve_module_aliases() node_2a4c3a27->node_5d68dfa1 node_5d68dfa1->node_458aa7dd node_5d68dfa1->node_5d68dfa1 node_1492bfaa 781: load() node_1492bfaa->node_b98087ed node_1492bfaa->node_458aa7dd node_1492bfaa->node_2a4c3a27 node_6aeebe63 891: load_git() node_6aeebe63->node_1492bfaa node_82e19873 981: load_pypi() node_82e19873->node_1492bfaa

logger.pyΒ€

SPDX-License-Identifier: ISC

G cluster_b96934d6 File: logger cluster_a16b3c9c Class: Logger node_ccbe54c4 0: (global)() node_65fe3e3a 59: _get() node_ccbe54c4->node_65fe3e3a node_ae1ce72d 65: _patch_loggers() node_efc776b5 109: get_logger() node_efc776b5->node_65fe3e3a node_8446a40d 121: patch_loggers() node_8446a40d->node_ae1ce72d

merger.pyΒ€

SPDX-License-Identifier: ISC

G cluster_466ae007 File: merger node_6a34345c 96: _merge_annotations() node_1549101a 59: _merge_attribute_stubs() node_81f650e3 71: _merge_stubs_docstring() node_1549101a->node_81f650e3 node_d04ceaa8 40: _merge_class_stubs() node_d04ceaa8->node_81f650e3 node_a7699945 135: _merge_stubs_members() node_d04ceaa8->node_a7699945 node_c3512932 81: _merge_stubs_overloads() node_d04ceaa8->node_c3512932 node_4a1d83df 76: _merge_stubs_type_parameters() node_d04ceaa8->node_4a1d83df node_f9cdd65a 47: _merge_function_stubs() node_f9cdd65a->node_81f650e3 node_f9cdd65a->node_4a1d83df node_bb8b9709 34: _merge_module_stubs() node_bb8b9709->node_81f650e3 node_bb8b9709->node_a7699945 node_bb8b9709->node_c3512932 node_eaa1d4e5 104: _merge_overload_annotations() node_eaa1d4e5->node_6a34345c node_a7699945->node_1549101a node_a7699945->node_f9cdd65a node_6000ba4f 66: _merge_type_alias_stubs() node_a7699945->node_6000ba4f node_c3512932->node_eaa1d4e5 node_6000ba4f->node_81f650e3 node_6000ba4f->node_4a1d83df node_9473255e 179: merge_stubs() node_9473255e->node_bb8b9709

mixins.pyΒ€

SPDX-License-Identifier: ISC

G cluster_2649d3fd File: mixins cluster_6c395050 Class: GetMembersMixin cluster_268f2cea Class: DelMembersMixin cluster_2cabdef8 Class: SetMembersMixin node_d2f66b66 103: __delitem__() node_d5ace900 38: _get_parts() node_d2f66b66->node_d5ace900 node_7b70c2ab 130: del_member() node_7b70c2ab->node_7b70c2ab node_7b70c2ab->node_d5ace900 node_66c8f19c 53: __getitem__() node_66c8f19c->node_d5ace900 node_ce6a15c5 75: get_member() node_ce6a15c5->node_ce6a15c5 node_ce6a15c5->node_d5ace900 node_0050805c 158: __setitem__() node_0050805c->node_d5ace900 node_6b2d9aa0 184: set_member() node_6b2d9aa0->node_6b2d9aa0 node_6b2d9aa0->node_d5ace900

models.pyΒ€

SPDX-License-Identifier: ISC

G cluster_6daa0585 File: models cluster_11772cdd Class: _ModuleSerializationContext cluster_62e6cca2 Class: Docstring cluster_403f2675 Class: Parameter cluster_63d0a821 Class: Parameters cluster_b6b63864 Class: TypeParameters cluster_4204d8a5 Class: Object cluster_a7e4750d Class: Alias cluster_f22e9dfb Class: Class cluster_ffe6b3b8 Class: Function node_4be24ebe 1430: __init__() node_e52792a2 2247: _update_target_aliases() node_4be24ebe->node_e52792a2 node_8a8f288b 2231: _resolve_target() node_7a02b054 2198: resolve_target() node_8a8f288b->node_7a02b054 node_e47e433b 1621: as_json() node_e47e433b->node_e47e433b node_50764cc8 1857: filter_members() node_50764cc8->node_50764cc8 node_67caf7d9 1844: has_labels() node_67caf7d9->node_67caf7d9 node_ca371d17 1599: inherited_members() node_ca371d17->node_4be24ebe node_b582648f 1757: is_kind() node_b582648f->node_b582648f node_ddaa57e1 1579: members() node_ddaa57e1->node_4be24ebe node_c5adf498 1560: parent() node_c5adf498->node_e52792a2 node_b2f7dae3 1966: resolve() node_b2f7dae3->node_b2f7dae3 node_d9edadbf 2149: target() node_d9edadbf->node_7a02b054 node_6c3a0357 2531: _mro() node_6c3a0357->node_6c3a0357 node_d196c543 2542: mro() node_d196c543->node_6c3a0357 node_59876ab9 2479: parameters() node_cb130994 364: __init__() node_59876ab9->node_cb130994 node_10a09d7c 221: parse() node_e8b931a5 217: parsed() node_e8b931a5->node_10a09d7c node_b2d0eed6 2572: __init__() node_b2d0eed6->node_cb130994 node_08bceb9c 635: __init__() node_12edbf93 544: __init__() node_08bceb9c->node_12edbf93 node_d080cbbf 798: _get_source_link() node_da978f7f 74: relative_source_filepath() node_d080cbbf->node_da978f7f node_7f017727 1308: as_dict() node_7f017727->node_d080cbbf node_3ba18c5f 63: __init__() node_7f017727->node_3ba18c5f node_30d72b28 889: inherited_members() node_30d72b28->node_4be24ebe node_9b265490 1265: resolve() node_9b265490->node_9b265490 node_ff4838b5 794: source_link() node_ff4838b5->node_d080cbbf node_555e8456 330: as_dict() node_555e8456->node_555e8456

stats.pyΒ€

SPDX-License-Identifier: ISC

G cluster_b2a7ef0d File: stats cluster_efc28249 Class: Stats node_9a6563a2 36: __init__() node_e3e428c7 90: _itercount() node_9a6563a2->node_e3e428c7 node_e3e428c7->node_e3e428c7