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
AI_POLICY.md
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
Makefile # (14)!
README.md
duties.py # (15)!
logo.svg
pyproject.toml # (16)!
uv.lock
zensical.toml
  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
      security.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)!
    zed/ # (2)!
    coverage.ini
    git-changelog.toml
    pytest.ini
    ruff.toml
    ty.toml
    
    1. launch.json
      settings.json
      tasks.json
      
    2. debug.json
      settings.json
      tasks.json
      
  7. Documentation sources (Markdown pages). See make docs task.

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

      partials/ # (1)!
      main.html
      
      1. comments.html
        
    2. index.md
      
    3. ansi.css
      apidocs.css
      custom.css
      pyodide.css
      
    4. built-in/ # (1)!
      official/ # (2)!
      third-party/ # (3)!
      index.md
      
      1. dataclasses.md
        index.md
        unpack-typeddict.md
        
      2. autodocstringstyle.md
        index.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
        index.md
        inherited-method-crossrefs.md
        modernized-annotations.md
        
    5. index.md
      
    6. contributors/ # (1)!
      users/ # (2)!
      index.md
      
      1. architecture.md
        commands.md
        index.md
        setup.md
        workflow.md
        
      2. how-to/ # (1)!
        recommendations/ # (2)!
        checking.md
        extending.md
        index.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
          
    7. favicon.ico
      gha_annotations_1.png
      gha_annotations_2.png
      
    8. feedback.js
      pyodide.js
      
    9. api/ # (1)!
      cli.md
      docstrings.md
      index.md
      
      1. Python API reference, injected with mkdocstrings.

        docstrings/ # (1)!
        models/ # (2)!
        agents.md
        checks.md
        cli.md
        exceptions.md
        expressions.md
        extensions.md
        finder.md
        helpers.md
        index.md
        loaders.md
        loggers.md
        serializers.md
        
        1. index.md
          models.md
          parsers.md
          
        2. alias.md
          attribute.md
          class.md
          function.md
          index.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 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_0e5f0af4 File: inspector cluster_ca90df4e Class: Inspector node_fb2f3f88 138: __init__() node_fb2f3f88->node_fb2f3f88 node_137cf1a5 190: _get_docstring() node_40f367d7 212: _get_linenos() node_ca625a8c 278: generic_inspect() node_ca625a8c->node_fb2f3f88 node_d33e12a7 270: inspect() node_ca625a8c->node_d33e12a7 node_9e6889f1 315: inspect_module() node_ca625a8c->node_9e6889f1 node_59ed66b9 222: get_module() node_59ed66b9->node_d33e12a7 node_fa83793d 559: handle_attribute() node_fa83793d->node_137cf1a5 node_8dee365f 460: handle_function() node_8dee365f->node_137cf1a5 node_8dee365f->node_40f367d7 node_6c0b5738 640: _convert_object_to_annotation() node_8dee365f->node_6c0b5738 node_c17ee1e9 617: _convert_parameter() node_8dee365f->node_c17ee1e9 node_46520f0f 676: _convert_type_parameters() node_8dee365f->node_46520f0f node_cef6911e 551: inspect_attribute() node_cef6911e->node_fa83793d node_c20898e5 420: inspect_builtin_function() node_c20898e5->node_8dee365f node_cf2b7592 396: inspect_builtin_method() node_cf2b7592->node_8dee365f node_c0b17e4d 436: inspect_cached_property() node_c0b17e4d->node_8dee365f node_c89a7970 338: inspect_class() node_c89a7970->node_137cf1a5 node_c89a7970->node_40f367d7 node_c89a7970->node_ca625a8c node_c89a7970->node_46520f0f node_edf3e853 380: inspect_classmethod() node_edf3e853->node_8dee365f node_b89f8abb 412: inspect_coroutine() node_b89f8abb->node_8dee365f node_c1c0c840 428: inspect_function() node_c1c0c840->node_8dee365f node_6fb4dd14 452: inspect_getset_descriptor() node_6fb4dd14->node_8dee365f node_0c36baec 404: inspect_method() node_0c36baec->node_8dee365f node_b7f89f9a 388: inspect_method_descriptor() node_b7f89f9a->node_8dee365f node_9e6889f1->node_137cf1a5 node_be1fa23c 444: inspect_property() node_be1fa23c->node_8dee365f node_2e1e0d61 372: inspect_staticmethod() node_2e1e0d61->node_8dee365f node_19e1724e 526: inspect_type_alias() node_19e1724e->node_137cf1a5 node_19e1724e->node_40f367d7 node_19e1724e->node_46520f0f node_0de2ba26 719: _convert_type_to_annotation() node_19e1724e->node_0de2ba26 node_c17ee1e9->node_6c0b5738 node_46520f0f->node_0de2ba26 node_0de2ba26->node_6c0b5738 node_0de2ba26->node_0de2ba26 node_ce1edc85 70: inspect() node_ce1edc85->node_fb2f3f88 node_ce1edc85->node_59ed66b9
nodes¤

SPDX-License-Identifier: ISC

assignments.py¤

SPDX-License-Identifier: ISC

G cluster_54fd8bbc File: assignments node_8591b1ba 59: _get_annassign_names() node_0d6a68ea 42: get_name() node_8591b1ba->node_0d6a68ea node_3a76734c 54: _get_assign_names() node_3a76734c->node_0d6a68ea node_3bca1877 28: _get_attribute_name() node_3bca1877->node_0d6a68ea node_d7062268 82: get_instance_names() node_8c94937e 70: get_names() node_d7062268->node_8c94937e
ast.py¤

SPDX-License-Identifier: ISC

G cluster_4253baf2 File: ast node_51b4aef5 48: ast_children() node_e0d2d9a9 165: ast_first_child() node_e0d2d9a9->node_51b4aef5 node_47d25c67 183: ast_last_child() node_47d25c67->node_51b4aef5 node_48c775aa 147: ast_next() node_5582d32a 94: ast_next_siblings() node_48c775aa->node_5582d32a node_5582d32a->node_51b4aef5 node_fc479664 128: ast_previous() node_c10a43a6 78: ast_previous_siblings() node_fc479664->node_c10a43a6 node_c10a43a6->node_51b4aef5 node_4ca80bae 110: ast_siblings() node_4ca80bae->node_51b4aef5
docstrings.py¤

SPDX-License-Identifier: ISC

exports.py¤

SPDX-License-Identifier: ISC

G cluster_2821aa73 File: exports node_fc216973 77: _extract() node_f7ca959b 36: _extract_attribute() node_f7ca959b->node_fc216973 node_78e18b58 40: _extract_binop() node_78e18b58->node_fc216973 node_e609f496 54: _extract_sequence() node_e609f496->node_fc216973 node_0eeb49b1 61: _extract_starred() node_0eeb49b1->node_fc216973 node_2c015ff8 81: get__all__() node_2c015ff8->node_fc216973 node_79327fa9 96: safe_get__all__() node_79327fa9->node_2c015ff8
imports.py¤

SPDX-License-Identifier: ISC

parameters.py¤

SPDX-License-Identifier: ISC

runtime.py¤

SPDX-License-Identifier: ISC

G cluster_5dd62c84 File: runtime cluster_c6660229 Class: ObjectNode node_9f7c9733 68: __init__() node_fee9b615 301: _pick_member() node_ba29a941 311: alias_target_path() node_16c76d81 52: _same_components() node_ba29a941->node_16c76d81 node_03479b26 191: children() node_03479b26->node_9f7c9733 node_03479b26->node_fee9b615
values.py¤

SPDX-License-Identifier: ISC

G cluster_44855090 File: values node_0d6af068 31: get_value() node_d1dedcd8 45: safe_get_value() node_d1dedcd8->node_0d6af068
visitor.py¤

SPDX-License-Identifier: ISC

G cluster_aac237ff File: visitor cluster_6f9c893a Class: Visitor node_c3bfe7f0 150: __init__() node_c3bfe7f0->node_c3bfe7f0 node_6cc3b004 212: _get_docstring() node_8c829947 232: _get_type_parameters() node_ee0f3fa5 378: decorators_to_labels() node_24074062 292: generic_visit() node_2d0ee8e5 283: visit() node_24074062->node_2d0ee8e5 node_3ccab0ff 396: get_base_property() node_3b6be009 261: get_module() node_3b6be009->node_2d0ee8e5 node_1b5ce9cb 641: handle_attribute() node_1b5ce9cb->node_6cc3b004 node_d10dffbe 420: handle_function() node_d10dffbe->node_6cc3b004 node_d10dffbe->node_8c829947 node_d10dffbe->node_ee0f3fa5 node_d10dffbe->node_24074062 node_d10dffbe->node_3ccab0ff node_cee2b18c 756: visit_annassign() node_cee2b18c->node_1b5ce9cb node_e6bef698 748: visit_assign() node_e6bef698->node_1b5ce9cb node_a54b8376 537: visit_asyncfunctiondef() node_a54b8376->node_d10dffbe node_2f2369e5 324: visit_classdef() node_2f2369e5->node_6cc3b004 node_2f2369e5->node_8c829947 node_2f2369e5->node_ee0f3fa5 node_2f2369e5->node_24074062 node_4f7dbbe3 529: visit_functiondef() node_4f7dbbe3->node_d10dffbe node_ad7d4d2f 785: visit_if() node_ad7d4d2f->node_24074062 node_9fa420aa 301: visit_module() node_9fa420aa->node_6cc3b004 node_9fa420aa->node_24074062 node_450d45a9 548: visit_typealias() node_450d45a9->node_6cc3b004 node_450d45a9->node_8c829947 node_ab83483f 93: visit() node_ab83483f->node_c3bfe7f0 node_ab83483f->node_3b6be009

c3linear.py¤

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

  • Copyright (c) 2019 Vitaly R. Samigullin
  • Adapted from https://github.com/pilosus/c3linear
  • Adapted from https://github.com/tristanlatr/pydocspec
G cluster_afd1c171 File: c3linear cluster_d1866c5d Class: _Dependency cluster_a082ffa3 Class: _DependencyList node_5b4e3300 29: tail() node_d6979fd3 60: __len__() node_5b4e3300->node_d6979fd3 node_34712f91 48: __init__() node_9f7e54e3 64: __repr__() node_9f7e54e3->node_9f7e54e3 node_ba491f0c 82: remove() node_7d4d41f6 93: c3linear_merge() node_7d4d41f6->node_34712f91 node_7d4d41f6->node_ba491f0c

collections.py¤

SPDX-License-Identifier: ISC

G cluster_4389b42d File: collections cluster_37d2c093 Class: LinesCollection node_dad2b5b8 72: items() node_dad2b5b8->node_dad2b5b8 node_30d65eb1 56: keys() node_30d65eb1->node_30d65eb1 node_54ffcf92 64: values() node_54ffcf92->node_54ffcf92

debug.py¤

SPDX-License-Identifier: ISC

G cluster_719f4fbf File: debug node_887ddc69 96: _get_debug_info() node_bbac617b 81: _get_version() node_887ddc69->node_bbac617b node_0505a767 70: _interpreter_name_version() node_887ddc69->node_0505a767 node_53e7c487 115: _print_debug_info() node_53e7c487->node_887ddc69

diff.py¤

SPDX-License-Identifier: ISC

G cluster_5f1ca317 File: diff cluster_11575eda Class: Breakage node_8cbb28a2 300: _explain_azdo() node_330b394f 221: _format_new_value() node_8cbb28a2->node_330b394f node_7df7adfb 218: _format_old_value() node_8cbb28a2->node_7df7adfb node_0bba808e 210: _format_title() node_8cbb28a2->node_0bba808e node_66a37d33 278: _explain_github() node_66a37d33->node_330b394f node_66a37d33->node_7df7adfb node_66a37d33->node_0bba808e node_2d982116 258: _explain_markdown() node_2d982116->node_330b394f node_2d982116->node_7df7adfb node_f4da518b 224: _explain_oneline() node_ed80214a 213: _format_kind() node_f4da518b->node_ed80214a node_f814ab74 205: _format_location() node_f4da518b->node_f814ab74 node_f4da518b->node_330b394f node_f4da518b->node_7df7adfb node_f4da518b->node_0bba808e node_833ec960 240: _explain_verbose() node_833ec960->node_ed80214a node_833ec960->node_f814ab74 node_833ec960->node_330b394f node_833ec960->node_7df7adfb node_833ec960->node_0bba808e node_eb27bdbc 604: _alias_incompatibilities() node_a4be7276 645: _type_based_yield() node_eb27bdbc->node_a4be7276 node_4800fa4b 595: _attribute_incompatibilities() node_0f9bcf2b 504: _class_incompatibilities() node_e0d741ec 620: _member_incompatibilities() node_0f9bcf2b->node_e0d741ec node_374b37e4 517: _function_incompatibilities() node_cb7ebe1e 682: _returns_are_compatible() node_374b37e4->node_cb7ebe1e node_e0d741ec->node_a4be7276 node_a4be7276->node_4800fa4b node_a4be7276->node_0f9bcf2b node_a4be7276->node_374b37e4 node_99eda3fb 706: find_breaking_changes() node_99eda3fb->node_e0d741ec

docstrings¤

SPDX-License-Identifier: ISC

auto.py¤

SPDX-License-Identifier: ISC

G cluster_1094a65e File: auto node_855bc2b1 145: infer_docstring_style() node_3c767ad0 216: parse_auto() node_3c767ad0->node_855bc2b1
google.py¤

SPDX-License-Identifier: ISC

G cluster_628d84bf File: google node_c0e35d4d 660: _annotation_from_parent() node_2ea26f7b 629: _get_name_annotation_description() node_51d9b10f 889: _is_empty_line() node_4a8034e7 377: _read_attributes_section() node_3f9aab0e 108: _read_block_items() node_4a8034e7->node_3f9aab0e node_97013e71 177: _read_block() node_97013e71->node_51d9b10f node_3f9aab0e->node_51d9b10f node_7797d820 614: _read_block_items_maybe() node_7797d820->node_97013e71 node_7797d820->node_3f9aab0e node_ec64594e 458: _read_classes_section() node_ec64594e->node_3f9aab0e node_88f8af91 829: _read_examples_section() node_88f8af91->node_51d9b10f node_88f8af91->node_97013e71 node_c55f92f4 420: _read_functions_section() node_c55f92f4->node_3f9aab0e node_80751457 524: _read_modules_section() node_80751457->node_3f9aab0e node_c657573e 293: _read_other_parameters_section() node_7eb641b4 212: _read_parameters() node_c657573e->node_7eb641b4 node_7eb641b4->node_3f9aab0e node_26ed4964 282: _read_parameters_section() node_26ed4964->node_7eb641b4 node_00e0d3c1 553: _read_raises_section() node_00e0d3c1->node_3f9aab0e node_c620da11 779: _read_receives_section() node_c620da11->node_c0e35d4d node_c620da11->node_2ea26f7b node_c620da11->node_7797d820 node_7c633ea2 679: _read_returns_section() node_7c633ea2->node_c0e35d4d node_7c633ea2->node_2ea26f7b node_7c633ea2->node_7797d820 node_90a6dc89 496: _read_type_aliases_section() node_90a6dc89->node_3f9aab0e node_a00ce44e 305: _read_type_parameters_section() node_a00ce44e->node_3f9aab0e node_4ae4bc1f 585: _read_warns_section() node_4ae4bc1f->node_3f9aab0e node_c123daad 729: _read_yields_section() node_c123daad->node_c0e35d4d node_c123daad->node_2ea26f7b node_c123daad->node_7797d820 node_5ed27320 936: parse_google() node_5ed27320->node_51d9b10f node_5ed27320->node_97013e71
models.py¤

SPDX-License-Identifier: ISC

G cluster_9423c0c6 File: models cluster_4d4e62c4 Class: DocstringSection node_df887dce 262: as_dict() node_df887dce->node_df887dce
numpy.py¤

SPDX-License-Identifier: ISC

G cluster_b9dfa3fe File: numpy node_01f81671 899: _append_section() node_90eb76de 111: _is_dash_line() node_0c0c9541 107: _is_empty_line() node_90eb76de->node_0c0c9541 node_1e6083ad 671: _read_attributes_section() node_207855fb 115: _read_block_items() node_1e6083ad->node_207855fb node_17fe2aca 177: _read_block() node_17fe2aca->node_90eb76de node_17fe2aca->node_0c0c9541 node_207855fb->node_90eb76de node_207855fb->node_0c0c9541 node_4dfc5155 744: _read_classes_section() node_4dfc5155->node_207855fb node_93ee1b1e 432: _read_deprecated_section() node_93ee1b1e->node_207855fb node_6d8546e0 833: _read_examples_section() node_6d8546e0->node_0c0c9541 node_6d8546e0->node_17fe2aca node_c3fc1658 711: _read_functions_section() node_c3fc1658->node_207855fb node_a04af208 800: _read_modules_section() node_a04af208->node_207855fb node_9c69353c 334: _read_other_parameters_section() node_26d807eb 243: _read_parameters() node_9c69353c->node_26d807eb node_26d807eb->node_207855fb node_9a286662 318: _read_parameters_section() node_9a286662->node_26d807eb node_160e49fe 619: _read_raises_section() node_160e49fe->node_207855fb node_00196545 571: _read_receives_section() node_00196545->node_207855fb node_05c90a7c 459: _read_returns_section() node_05c90a7c->node_207855fb node_d172a545 777: _read_type_aliases_section() node_d172a545->node_207855fb node_953eb2de 358: _read_type_parameters_section() node_953eb2de->node_207855fb node_e83c7096 645: _read_warns_section() node_e83c7096->node_207855fb node_9e427225 519: _read_yields_section() node_9e427225->node_207855fb node_0ed2923d 952: parse_numpy() node_0ed2923d->node_01f81671 node_0ed2923d->node_90eb76de node_0ed2923d->node_0c0c9541
parsers.py¤

SPDX-License-Identifier: ISC

sphinx.py¤

SPDX-License-Identifier: ISC

G cluster_277ae28c File: sphinx cluster_431cea8b Class: _FieldType node_677c9df2 72: matches() node_6482134f 500: _consolidate_continuation_lines() node_b0ced188 513: _consolidate_descriptive_type() node_476180c3 240: _determine_param_annotation() node_7bf0baec 233: _determine_param_default() node_aa28c178 481: _parse_directive() node_aa28c178->node_6482134f node_8f982704 465: _parsed_values_to_sections() node_d0ef3b19 517: _strip_blank_lines() node_8f982704->node_d0ef3b19 node_f93565f4 307: _read_attribute() node_f93565f4->node_aa28c178 node_efcd2fde 355: _read_attribute_type() node_efcd2fde->node_b0ced188 node_efcd2fde->node_aa28c178 node_dc08ef05 386: _read_exception() node_dc08ef05->node_aa28c178 node_e40668fc 169: _read_parameter() node_e40668fc->node_476180c3 node_e40668fc->node_7bf0baec node_e40668fc->node_aa28c178 node_4f92f3f3 275: _read_parameter_type() node_4f92f3f3->node_b0ced188 node_4f92f3f3->node_aa28c178 node_afa95718 408: _read_return() node_afa95718->node_aa28c178 node_482737b8 443: _read_return_type() node_482737b8->node_b0ced188 node_482737b8->node_aa28c178 node_7f81f02a 120: parse_sphinx() node_7f81f02a->node_677c9df2 node_7f81f02a->node_8f982704
utils.py¤

SPDX-License-Identifier: ISC

G cluster_7341461c File: utils node_b44f52f7 69: _compile_docstring_annotation() node_6c497a05 76: parse_docstring_annotation() node_6c497a05->node_b44f52f7

encoders.py¤

SPDX-License-Identifier: ISC

G cluster_3e27f55d File: encoders cluster_1760a19c Class: JSONEncoder node_d216157a 79: __init__() node_d216157a->node_d216157a node_2b69c88a 174: _attach_parent_to_expr() node_192a845c 184: _attach_parent_to_exprs() node_192a845c->node_2b69c88a node_aacc1fd2 303: _load_attribute() node_f79fb6c2 116: _load_docstring() node_aacc1fd2->node_f79fb6c2 node_586d8ef7 165: _load_git_info() node_aacc1fd2->node_586d8ef7 node_0bb9e250 250: _load_class() node_0bb9e250->node_192a845c node_31997e0d 122: _load_decorators() node_0bb9e250->node_31997e0d node_0bb9e250->node_f79fb6c2 node_0bb9e250->node_586d8ef7 node_d82f1be7 126: _load_expression() node_53c4160b 280: _load_function() node_53c4160b->node_31997e0d node_53c4160b->node_f79fb6c2 node_53c4160b->node_586d8ef7 node_2f4a5ce4 221: _load_module() node_2f4a5ce4->node_192a845c node_2f4a5ce4->node_f79fb6c2 node_2f4a5ce4->node_586d8ef7 node_5affabb8 146: _load_parameter() node_5affabb8->node_f79fb6c2 node_0fe498c9 339: _load_type_alias() node_0fe498c9->node_f79fb6c2 node_0fe498c9->node_586d8ef7 node_56b62ba3 156: _load_type_parameter() node_9bf8ef5f 370: json_decoder() node_9bf8ef5f->node_d82f1be7 node_9bf8ef5f->node_5affabb8 node_9bf8ef5f->node_56b62ba3

enumerations.py¤

SPDX-License-Identifier: ISC

exceptions.py¤

SPDX-License-Identifier: ISC

G cluster_a5296fc8 File: exceptions cluster_972f6a9c Class: AliasResolutionError node_76a12d2e 70: __str__() node_493c4550 62: _format_message() node_76a12d2e->node_493c4550

expressions.py¤

SPDX-License-Identifier: ISC

G cluster_0c929568 File: expressions cluster_d64e6e4d Class: Expr cluster_ff5ae992 Class: ExprAttribute cluster_57b62940 Class: ExprBinOp cluster_f24fd1ab Class: ExprBoolOp cluster_1d752741 Class: ExprCall cluster_18d27783 Class: ExprCompare cluster_fa54ab67 Class: ExprComprehension cluster_f406dc9d Class: ExprDict cluster_ec459fc3 Class: ExprDictComp cluster_be8c9e9f Class: ExprExtSlice cluster_4413e61b Class: ExprFormatted cluster_bda71153 Class: ExprGeneratorExp cluster_9b1ae85e Class: ExprIfExp cluster_251fe771 Class: ExprInterpolation cluster_5847356b Class: ExprJoinedStr cluster_38621ffd Class: ExprKeyword cluster_62558f3d Class: ExprVarPositional cluster_afd153d6 Class: ExprVarKeyword cluster_55540130 Class: ExprLambda cluster_be5ccda4 Class: ExprList cluster_1759c756 Class: ExprListComp cluster_2eeb0a25 Class: ExprNamedExpr cluster_b63516af Class: ExprSet cluster_9fc081ac Class: ExprSetComp cluster_e266836b Class: ExprSlice cluster_9836af2a Class: ExprSubscript cluster_6aa535c5 Class: ExprTemplateStr cluster_2c157e51 Class: ExprTuple cluster_8d7c0b70 Class: ExprUnaryOp cluster_b036868e Class: ExprAwait cluster_52897498 Class: ExprYield cluster_a6d68cb4 Class: ExprYieldFrom node_8379f40f 193: __iter__() node_57ef68cb 197: iterate() node_8379f40f->node_57ef68cb node_1b021978 190: __str__() node_1b021978->node_57ef68cb node_8802aa3b 280: _to_binop() node_8802aa3b->node_8802aa3b node_17b2755b 226: as_dict() node_d5535bab 169: _expr_as_dict() node_17b2755b->node_d5535bab node_1f7f3ce1 320: append() node_1f7f3ce1->node_1f7f3ce1 node_47e09c7c 303: iterate() node_2518a85d 1272: _get_precedence() node_47e09c7c->node_2518a85d node_1d3eb009 82: _yield() node_47e09c7c->node_1d3eb009 node_a0ba11b8 1143: iterate() node_a0ba11b8->node_1d3eb009 node_150e53c4 364: iterate() node_150e53c4->node_2518a85d node_150e53c4->node_1d3eb009 node_71e2f466 384: iterate() node_71e2f466->node_2518a85d node_71e2f466->node_1d3eb009 node_805c1f98 407: iterate() node_805c1f98->node_2518a85d node_be5702d4 125: _join() node_805c1f98->node_be5702d4 node_805c1f98->node_1d3eb009 node_a0514a2b 425: iterate() node_a0514a2b->node_2518a85d node_a0514a2b->node_1d3eb009 node_39971452 446: iterate() node_39971452->node_1d3eb009 node_433ee501 484: iterate() node_433ee501->node_be5702d4 node_bc9516fb 511: iterate() node_bc9516fb->node_be5702d4 node_bc9516fb->node_1d3eb009 node_ff21d217 532: iterate() node_ff21d217->node_be5702d4 node_8cbc1de5 586: iterate() node_8210a50e 536: _iterate_format_parts() node_8cbc1de5->node_8210a50e node_b560c9a6 601: iterate() node_b560c9a6->node_be5702d4 node_b560c9a6->node_1d3eb009 node_1257d410 624: iterate() node_1257d410->node_1257d410 node_1257d410->node_2518a85d node_1257d410->node_1d3eb009 node_b305a9b2 653: iterate() node_b305a9b2->node_8210a50e node_c897df24 701: iterate() node_6ab13438 661: _fstring_choose_quote() node_c897df24->node_6ab13438 node_c897df24->node_1d3eb009 node_49403056 746: iterate() node_49403056->node_1d3eb009 node_ef3c607b 786: iterate() node_ef3c607b->node_1d3eb009 node_d05b3d67 829: iterate() node_d05b3d67->node_be5702d4 node_4578a289 844: iterate() node_4578a289->node_be5702d4 node_4578a289->node_1d3eb009 node_8481fe9d 955: iterate() node_8481fe9d->node_1d3eb009 node_2b677775 983: iterate() node_2b677775->node_be5702d4 node_bec91c59 998: iterate() node_bec91c59->node_be5702d4 node_bec91c59->node_1d3eb009 node_712ec50e 1017: iterate() node_712ec50e->node_1d3eb009 node_d856ad11 1038: iterate() node_d856ad11->node_2518a85d node_d856ad11->node_1d3eb009 node_ddc9a65f 1045: modernize() node_ddc9a65f->node_8802aa3b node_ddc9a65f->node_ddc9a65f node_53f01183 1078: iterate() node_53f01183->node_6ab13438 node_53f01183->node_1d3eb009 node_413ff95d 1098: iterate() node_413ff95d->node_be5702d4 node_c8aebb99 1129: iterate() node_c8aebb99->node_2518a85d node_c8aebb99->node_1d3eb009 node_069af8ce 772: iterate() node_069af8ce->node_1d3eb009 node_d58c9e55 760: iterate() node_d58c9e55->node_1d3eb009 node_b42c3014 1155: iterate() node_b42c3014->node_1d3eb009 node_c0722030 1169: iterate() node_c0722030->node_1d3eb009 node_604dad4b 1624: _build() node_f31e3efa 1276: _build_attribute() node_f31e3efa->node_1f7f3ce1 node_f31e3efa->node_604dad4b node_57f227e7 1288: _build_await() node_57f227e7->node_604dad4b node_080b46b9 1292: _build_binop() node_080b46b9->node_604dad4b node_c3804f6c 1300: _build_boolop() node_c3804f6c->node_604dad4b node_e816ed6e 1307: _build_call() node_e816ed6e->node_604dad4b node_a02e929d 1318: _build_compare() node_a02e929d->node_604dad4b node_d7f2e9c5 1334: _build_comprehension() node_d7f2e9c5->node_604dad4b node_e7d9ee69 1326: _build_implicit_tuple() node_d7f2e9c5->node_e7d9ee69 node_0a419c92 1343: _build_constant() node_0a419c92->node_604dad4b node_71254277 1382: _build_dict() node_71254277->node_604dad4b node_d8e42fd5 1389: _build_dictcomp() node_d8e42fd5->node_604dad4b node_e672ada8 1400: _build_format_spec() node_e672ada8->node_604dad4b node_bdda2212 1408: _build_formatted() node_bdda2212->node_604dad4b node_bdda2212->node_e672ada8 node_a27a477f 1423: _build_generatorexp() node_a27a477f->node_604dad4b node_f149ae7b 1437: _build_ifexp() node_f149ae7b->node_604dad4b node_e7d9ee69->node_604dad4b node_1a9f9bc0 1595: _build_interpolation() node_1a9f9bc0->node_604dad4b node_1a9f9bc0->node_e672ada8 node_240d13ba 1445: _build_joinedstr() node_240d13ba->node_604dad4b node_35a4fbdf 1455: _build_keyword() node_35a4fbdf->node_604dad4b node_8e2d867a 1461: _build_lambda() node_8e2d867a->node_604dad4b node_e8a58683 1658: safe_get_expression() node_8e2d867a->node_e8a58683 node_4a989780 1478: _build_list() node_4a989780->node_604dad4b node_7c17ddb7 1482: _build_listcomp() node_7c17ddb7->node_604dad4b node_9a5d3ef1 1490: _build_named_expr() node_9a5d3ef1->node_604dad4b node_05f46c2d 1494: _build_set() node_05f46c2d->node_604dad4b node_6ec335da 1498: _build_setcomp() node_6ec335da->node_604dad4b node_212265b1 1502: _build_slice() node_212265b1->node_604dad4b node_0aede786 1510: _build_starred() node_0aede786->node_604dad4b node_f67dc42d 1514: _build_subscript() node_f67dc42d->node_604dad4b node_f67dc42d->node_e7d9ee69 node_205dca1a 1609: _build_templatestr() node_205dca1a->node_604dad4b node_9d60c4aa 1541: _build_tuple() node_9d60c4aa->node_604dad4b node_96d15031 1545: _build_unaryop() node_96d15031->node_604dad4b node_38824c18 1549: _build_yield() node_38824c18->node_604dad4b node_c10a67d7 1553: _build_yield_from() node_c10a67d7->node_604dad4b node_e5aa227b 149: _field_as_dict() node_d5535bab->node_e5aa227b node_4146499c 161: _serializable_expression_fields() node_d5535bab->node_4146499c node_e5aa227b->node_e5aa227b node_6ab13438->node_1f7f3ce1 node_8210a50e->node_8210a50e node_8210a50e->node_1d3eb009 node_be5702d4->node_1d3eb009 node_1d3eb009->node_2518a85d node_1d3eb009->node_1d3eb009 node_fdce3c2f 1628: get_expression() node_fdce3c2f->node_604dad4b node_e8a58683->node_fdce3c2f

extensions¤

SPDX-License-Identifier: ISC

base.py¤

SPDX-License-Identifier: ISC

G cluster_513390a2 File: base cluster_e47cd606 Class: Extension cluster_caec00a9 Class: Extensions node_d3cfbcab 74: generic_inspect() node_ccd97f54 66: inspect() node_d3cfbcab->node_ccd97f54 node_bd07e28a 57: generic_visit() node_077dd50d 49: visit() node_bd07e28a->node_077dd50d node_178111b8 429: on_alias() node_17236b0a 405: on_alias_instance() node_17236b0a->node_178111b8 node_cb494312 463: __init__() node_bba8c8d6 472: add() node_cb494312->node_bba8c8d6 node_a442589a 530: _load_extension() node_f9bf6beb 519: _load_extension_path() node_a442589a->node_f9bf6beb node_af41094f 621: load_extensions() node_af41094f->node_cb494312 node_af41094f->node_bba8c8d6 node_af41094f->node_a442589a
dataclasses.py¤

SPDX-License-Identifier: ISC

G cluster_f4eab233 File: dataclasses cluster_3cf65e8a Class: DataclassesExtension node_ae399740 243: on_package() node_2a1a1070 219: _apply_recursively() node_ae399740->node_2a1a1070 node_2a1a1070->node_2a1a1070 node_df5b87af 211: _del_members_annotated_as_initvar() node_2a1a1070->node_df5b87af node_3b0f20c5 173: _set_dataclass_init() node_2a1a1070->node_3b0f20c5 node_b2aebe42 65: _dataclass_arguments() node_690c4d7a 41: _dataclass_decorator() node_b2aebe42->node_690c4d7a node_ec7ceb2c 48: _expr_args() node_b2aebe42->node_ec7ceb2c node_5afb4bef 82: _dataclass_parameters() node_5afb4bef->node_b2aebe42 node_c2f15e8d 71: _field_arguments() node_5afb4bef->node_c2f15e8d node_ec7ceb2c->node_ec7ceb2c node_c2f15e8d->node_ec7ceb2c node_fd9742ba 155: _reorder_parameters() node_3b0f20c5->node_690c4d7a node_3b0f20c5->node_5afb4bef node_3b0f20c5->node_fd9742ba
unpack_typeddict.py¤

SPDX-License-Identifier: ISC

G cluster_699858f4 File: unpack_typeddict cluster_47075add Class: UnpackTypedDictExtension node_b5fc9cd1 207: on_class() node_de203d64 81: _get_or_set_attrs() node_b5fc9cd1->node_de203d64 node_c50e6786 186: _params_from_attrs() node_b5fc9cd1->node_c50e6786 node_4ff7215f 125: _update_docstring() node_b5fc9cd1->node_4ff7215f node_9d08b0d8 234: on_function() node_9d08b0d8->node_de203d64 node_9d08b0d8->node_c50e6786 node_9d08b0d8->node_4ff7215f node_f5f5fec3 45: _unwrap_annotation() node_de203d64->node_f5f5fec3

finder.py¤

SPDX-License-Identifier: ISC

G cluster_74d03a8e File: finder cluster_2ff216d8 Class: ModuleFinder node_1a4c30e7 118: __init__() node_ddb6d2ec 400: _extend_from_pth_files() node_1a4c30e7->node_ddb6d2ec node_7cec6692 135: append_search_path() node_1a4c30e7->node_7cec6692 node_f1955d69 146: _append_search_path() node_ce462c0c 392: _contents() node_ddb6d2ec->node_ce462c0c node_ddb6d2ec->node_7cec6692 node_49ee54e2 456: _handle_pth_file() node_ddb6d2ec->node_49ee54e2 node_84a842bc 409: _filter_py_modules() node_29d0246d 377: _module_name_path() node_5045043a 417: _top_module_name() node_23d4d064 150: insert_search_path() node_5045043a->node_23d4d064 node_7cec6692->node_f1955d69 node_e8d69a62 247: find_package() node_e8d69a62->node_ce462c0c node_b5f512f5 441: _is_pkg_style_namespace() node_e8d69a62->node_b5f512f5 node_c5bcadb5 164: find_spec() node_c5bcadb5->node_29d0246d node_c5bcadb5->node_5045043a node_c5bcadb5->node_e8d69a62 node_c847d21a 294: iter_submodules() node_c847d21a->node_84a842bc node_c847d21a->node_c847d21a node_d42856bf 360: submodules() node_d42856bf->node_c847d21a node_29a60fba 486: _handle_editable_module() node_b462f2ee 67: _match_pattern() node_29a60fba->node_b462f2ee node_49ee54e2->node_29a60fba

git.py¤

SPDX-License-Identifier: ISC

G cluster_4e5b2cbe File: git cluster_13c053a5 Class: GitInfo node_ce54b11f 258: from_package() node_793e6669 234: _get_git_commit_hash() node_ce54b11f->node_793e6669 node_ee479ee1 179: _get_git_known_service() node_ce54b11f->node_ee479ee1 node_40f1dd87 153: _get_git_remote_url() node_ce54b11f->node_40f1dd87 node_6b310eb0 103: _get_repo_root() node_ce54b11f->node_6b310eb0 node_61b32131 240: _is_tracked() node_ce54b11f->node_61b32131 node_166176e9 285: get_source_link() node_53f08cf3 220: _get_source_link() node_166176e9->node_53f08cf3 node_e9c3764b 66: _assert_git_repo() node_4cb2f1c5 52: _git() node_e9c3764b->node_4cb2f1c5 node_793e6669->node_4cb2f1c5 node_40f1dd87->node_4cb2f1c5 node_b08be0ce 83: _get_latest_tag() node_b08be0ce->node_4cb2f1c5 node_6b310eb0->node_4cb2f1c5 node_61b32131->node_4cb2f1c5 node_0371ffca 46: _normalize() node_2ab9a06b 120: _tmp_worktree() node_2ab9a06b->node_e9c3764b node_2ab9a06b->node_4cb2f1c5 node_2ab9a06b->node_0371ffca

helpers.py¤

SPDX-License-Identifier: ISC

G cluster_9a3ac836 File: helpers node_6982a003 429: module_vtree() node_5661b1de 386: vtree() node_6982a003->node_5661b1de node_7fdf7982 335: temporary_inspected_module() node_2ac43fb2 70: temporary_pyfile() node_7fdf7982->node_2ac43fb2 node_f6b1802c 210: temporary_inspected_package() node_c19fbed0 88: temporary_pypackage() node_f6b1802c->node_c19fbed0 node_4a7e36f9 289: temporary_visited_module() node_4a7e36f9->node_2ac43fb2 node_0c27d36f 137: temporary_visited_package() node_0c27d36f->node_c19fbed0

importer.py¤

SPDX-License-Identifier: ISC

G cluster_99c37523 File: importer node_ff68c039 33: _error_details() node_e904693f 59: dynamic_import() node_e904693f->node_ff68c039 node_e64f0f66 38: sys_path() node_e904693f->node_e64f0f66

loader.py¤

SPDX-License-Identifier: ISC

G cluster_2354c0be File: loader cluster_12fe6949 Class: GriffeLoader node_36606cb1 79: __init__() node_a1b87883 685: _create_module() node_eee821ed 770: _expand_wildcard() node_d80a9fad 228: _fire_load_events() node_d80a9fad->node_d80a9fad node_b5425168 740: _get_or_create_parent_module() node_b5425168->node_a1b87883 node_17eed3ea 713: _inspect_module() node_fe618100 586: _load_module() node_1a54ca29 605: _load_module_path() node_fe618100->node_1a54ca29 node_1a54ca29->node_a1b87883 node_1a54ca29->node_17eed3ea node_9a2def10 630: _load_submodules() node_1a54ca29->node_9a2def10 node_4ebf7195 693: _visit_module() node_1a54ca29->node_4ebf7195 node_b788bc95 571: _load_package() node_b788bc95->node_fe618100 node_57c959bf 366: expand_wildcards() node_b788bc95->node_57c959bf node_61a82229 634: _load_submodule() node_61a82229->node_b5425168 node_61a82229->node_fe618100 node_9a2def10->node_61a82229 node_f11be20c 247: _post_load() node_f11be20c->node_d80a9fad node_f7d9697b 325: expand_exports() node_f11be20c->node_f7d9697b node_f11be20c->node_57c959bf node_f7d9697b->node_f7d9697b node_57c959bf->node_eee821ed node_57c959bf->node_57c959bf node_368aad94 138: load() node_57c959bf->node_368aad94 node_368aad94->node_17eed3ea node_368aad94->node_b788bc95 node_368aad94->node_f11be20c node_2d5fab5d 269: resolve_aliases() node_2d5fab5d->node_57c959bf node_ca200f32 482: resolve_module_aliases() node_2d5fab5d->node_ca200f32 node_ca200f32->node_368aad94 node_ca200f32->node_ca200f32 node_c41cdaab 779: load() node_c41cdaab->node_36606cb1 node_c41cdaab->node_368aad94 node_c41cdaab->node_2d5fab5d node_34741de2 889: load_git() node_34741de2->node_c41cdaab node_e065f2a2 979: load_pypi() node_e065f2a2->node_c41cdaab

logger.py¤

SPDX-License-Identifier: ISC

G cluster_eca839db File: logger cluster_cbc32773 Class: Logger node_8e9f5205 0: (global)() node_62e02947 59: _get() node_8e9f5205->node_62e02947 node_e727dd39 65: _patch_loggers() node_a7a23239 109: get_logger() node_a7a23239->node_62e02947 node_d73a486b 121: patch_loggers() node_d73a486b->node_e727dd39

merger.py¤

SPDX-License-Identifier: ISC

G cluster_bccc2992 File: merger node_6bbaf7d4 96: _merge_annotations() node_448be480 59: _merge_attribute_stubs() node_1b840d71 71: _merge_stubs_docstring() node_448be480->node_1b840d71 node_44bbaa3a 40: _merge_class_stubs() node_44bbaa3a->node_1b840d71 node_e4521357 135: _merge_stubs_members() node_44bbaa3a->node_e4521357 node_8a319f1b 81: _merge_stubs_overloads() node_44bbaa3a->node_8a319f1b node_51554925 76: _merge_stubs_type_parameters() node_44bbaa3a->node_51554925 node_8b9169f5 47: _merge_function_stubs() node_8b9169f5->node_1b840d71 node_8b9169f5->node_51554925 node_ebdf2b6a 34: _merge_module_stubs() node_ebdf2b6a->node_1b840d71 node_ebdf2b6a->node_e4521357 node_ebdf2b6a->node_8a319f1b node_daeb2588 104: _merge_overload_annotations() node_daeb2588->node_6bbaf7d4 node_e4521357->node_448be480 node_e4521357->node_8b9169f5 node_84737468 66: _merge_type_alias_stubs() node_e4521357->node_84737468 node_8a319f1b->node_daeb2588 node_84737468->node_1b840d71 node_84737468->node_51554925 node_f7c6a53b 179: merge_stubs() node_f7c6a53b->node_ebdf2b6a

mixins.py¤

SPDX-License-Identifier: ISC

G cluster_1c6c19eb File: mixins cluster_90849392 Class: GetMembersMixin cluster_d3ca7d0f Class: DelMembersMixin cluster_697b31a5 Class: SetMembersMixin node_e95ca9fc 103: __delitem__() node_e38e8d63 38: _get_parts() node_e95ca9fc->node_e38e8d63 node_9529664a 130: del_member() node_9529664a->node_9529664a node_9529664a->node_e38e8d63 node_89ca8114 53: __getitem__() node_89ca8114->node_e38e8d63 node_94309865 75: get_member() node_94309865->node_94309865 node_94309865->node_e38e8d63 node_f0060ea1 158: __setitem__() node_f0060ea1->node_e38e8d63 node_f88b3066 184: set_member() node_f88b3066->node_f88b3066 node_f88b3066->node_e38e8d63

models.py¤

SPDX-License-Identifier: ISC

G cluster_b404896a File: models cluster_47e00aa8 Class: _ModuleSerializationContext cluster_517db8ad Class: Docstring cluster_427bf44c Class: Parameter cluster_20daf911 Class: Parameters cluster_b7883729 Class: TypeParameters cluster_db98d5e4 Class: Object cluster_f7118c9b Class: Alias cluster_e4f7277c Class: Class cluster_16505091 Class: Function node_df001ff2 1430: __init__() node_7dd05c9b 2247: _update_target_aliases() node_df001ff2->node_7dd05c9b node_1f07b3d7 2231: _resolve_target() node_109ae3f4 2198: resolve_target() node_1f07b3d7->node_109ae3f4 node_eda11614 1621: as_json() node_eda11614->node_eda11614 node_03c49e11 1857: filter_members() node_03c49e11->node_03c49e11 node_86a21803 1844: has_labels() node_86a21803->node_86a21803 node_0e10fb5f 1599: inherited_members() node_0e10fb5f->node_df001ff2 node_686a1f77 1757: is_kind() node_686a1f77->node_686a1f77 node_06ede631 1579: members() node_06ede631->node_df001ff2 node_a2cc598b 1560: parent() node_a2cc598b->node_7dd05c9b node_04d240c4 1966: resolve() node_04d240c4->node_04d240c4 node_2d8cffca 2149: target() node_2d8cffca->node_109ae3f4 node_60883367 2531: _mro() node_60883367->node_60883367 node_059932c1 2542: mro() node_059932c1->node_60883367 node_d93f917e 2479: parameters() node_3a6b5d9c 364: __init__() node_d93f917e->node_3a6b5d9c node_0cbd5994 221: parse() node_72a9553b 217: parsed() node_72a9553b->node_0cbd5994 node_96901470 2572: __init__() node_96901470->node_3a6b5d9c node_b722f829 635: __init__() node_616d4713 544: __init__() node_b722f829->node_616d4713 node_552d33af 798: _get_source_link() node_f5000453 74: relative_source_filepath() node_552d33af->node_f5000453 node_131705e0 1308: as_dict() node_131705e0->node_552d33af node_1fc2d900 63: __init__() node_131705e0->node_1fc2d900 node_c7a939bd 889: inherited_members() node_c7a939bd->node_df001ff2 node_a90fa4c7 1265: resolve() node_a90fa4c7->node_a90fa4c7 node_639e5279 794: source_link() node_639e5279->node_552d33af node_a03fd9a3 330: as_dict() node_a03fd9a3->node_a03fd9a3

stats.py¤

SPDX-License-Identifier: ISC

G cluster_166f76c9 File: stats cluster_7c960b29 Class: Stats node_e096fb3e 36: __init__() node_48fe48e3 90: _itercount() node_e096fb3e->node_48fe48e3 node_48fe48e3->node_48fe48e3