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
              parser.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_parser.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_parsergriffe._internal.agents.parsergriffe__internal_agents_parser->griffe__internal_extensionsgriffe__internal_agents_parser->griffe__internal_extensions_baseprune_sourceprune_sourcegriffe__internal_agents_parser->prune_sourcegriffe__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_agents_parsergriffe__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_5ded78e3 File: inspector cluster_21e4166d Class: Inspector node_3a758fc0 138: __init__() node_3a758fc0->node_3a758fc0 node_1c815f65 190: _get_docstring() node_f9591069 212: _get_linenos() node_ab1a75e4 278: generic_inspect() node_ab1a75e4->node_3a758fc0 node_c2ea4e21 270: inspect() node_ab1a75e4->node_c2ea4e21 node_8781446b 315: inspect_module() node_ab1a75e4->node_8781446b node_38027061 222: get_module() node_38027061->node_c2ea4e21 node_3b55457f 559: handle_attribute() node_3b55457f->node_1c815f65 node_633049ae 460: handle_function() node_633049ae->node_1c815f65 node_633049ae->node_f9591069 node_0d22cf66 640: _convert_object_to_annotation() node_633049ae->node_0d22cf66 node_7c0ea4e6 617: _convert_parameter() node_633049ae->node_7c0ea4e6 node_afd6d58f 676: _convert_type_parameters() node_633049ae->node_afd6d58f node_a417adc6 551: inspect_attribute() node_a417adc6->node_3b55457f node_861da3e3 420: inspect_builtin_function() node_861da3e3->node_633049ae node_1a7ebc30 396: inspect_builtin_method() node_1a7ebc30->node_633049ae node_f790a68e 436: inspect_cached_property() node_f790a68e->node_633049ae node_93de47d0 338: inspect_class() node_93de47d0->node_1c815f65 node_93de47d0->node_f9591069 node_93de47d0->node_ab1a75e4 node_93de47d0->node_afd6d58f node_8eb41aca 380: inspect_classmethod() node_8eb41aca->node_633049ae node_9b7559d1 412: inspect_coroutine() node_9b7559d1->node_633049ae node_ae1389b9 428: inspect_function() node_ae1389b9->node_633049ae node_1f7b0450 452: inspect_getset_descriptor() node_1f7b0450->node_633049ae node_3dfb37dc 404: inspect_method() node_3dfb37dc->node_633049ae node_09d780f9 388: inspect_method_descriptor() node_09d780f9->node_633049ae node_8781446b->node_1c815f65 node_92153278 444: inspect_property() node_92153278->node_633049ae node_e267484f 372: inspect_staticmethod() node_e267484f->node_633049ae node_3cd85fa0 526: inspect_type_alias() node_3cd85fa0->node_1c815f65 node_3cd85fa0->node_f9591069 node_3cd85fa0->node_afd6d58f node_04f7f2a4 719: _convert_type_to_annotation() node_3cd85fa0->node_04f7f2a4 node_7c0ea4e6->node_0d22cf66 node_afd6d58f->node_04f7f2a4 node_04f7f2a4->node_0d22cf66 node_04f7f2a4->node_04f7f2a4 node_6ab5034e 70: inspect() node_6ab5034e->node_3a758fc0 node_6ab5034e->node_38027061
nodes¤

SPDX-License-Identifier: ISC

assignments.py¤

SPDX-License-Identifier: ISC

G cluster_8f4ca7b7 File: assignments node_aeafbf4f 59: _get_annassign_names() node_eed16508 42: get_name() node_aeafbf4f->node_eed16508 node_daa4486b 54: _get_assign_names() node_daa4486b->node_eed16508 node_03c6c715 28: _get_attribute_name() node_03c6c715->node_eed16508 node_c39ad674 82: get_instance_names() node_806a3a03 70: get_names() node_c39ad674->node_806a3a03
ast.py¤

SPDX-License-Identifier: ISC

G cluster_043c01b0 File: ast node_83e0b860 48: ast_children() node_4b53e0cd 165: ast_first_child() node_4b53e0cd->node_83e0b860 node_906cdac8 183: ast_last_child() node_906cdac8->node_83e0b860 node_122f0324 147: ast_next() node_8e722fbf 94: ast_next_siblings() node_122f0324->node_8e722fbf node_8e722fbf->node_83e0b860 node_432a70b6 128: ast_previous() node_df0a4bbd 78: ast_previous_siblings() node_432a70b6->node_df0a4bbd node_df0a4bbd->node_83e0b860 node_f2d52b19 110: ast_siblings() node_f2d52b19->node_83e0b860
docstrings.py¤

SPDX-License-Identifier: ISC

exports.py¤

SPDX-License-Identifier: ISC

G cluster_be54e32f File: exports node_2529403f 77: _extract() node_8de4e8bc 36: _extract_attribute() node_8de4e8bc->node_2529403f node_9ba4cd39 40: _extract_binop() node_9ba4cd39->node_2529403f node_6441b1c5 54: _extract_sequence() node_6441b1c5->node_2529403f node_bb20cc45 61: _extract_starred() node_bb20cc45->node_2529403f node_d67631e3 81: get__all__() node_d67631e3->node_2529403f node_d118f1cf 96: safe_get__all__() node_d118f1cf->node_d67631e3
imports.py¤

SPDX-License-Identifier: ISC

parameters.py¤

SPDX-License-Identifier: ISC

runtime.py¤

SPDX-License-Identifier: ISC

G cluster_3c050d30 File: runtime cluster_2c969a8f Class: ObjectNode node_b4c26327 68: __init__() node_ae385a74 301: _pick_member() node_f0202f01 311: alias_target_path() node_63e59e81 52: _same_components() node_f0202f01->node_63e59e81 node_b15077d8 191: children() node_b15077d8->node_b4c26327 node_b15077d8->node_ae385a74
values.py¤

SPDX-License-Identifier: ISC

G cluster_7a8e6a76 File: values node_70168a91 31: get_value() node_671304a7 45: safe_get_value() node_671304a7->node_70168a91
parser.py¤

SPDX-License-Identifier: ISC

Copyright (c) 2021, Timothée Mazzucotelli and contributors

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

visitor.py¤

SPDX-License-Identifier: ISC

G cluster_5d96cf5d File: visitor cluster_d36d8d3b Class: Visitor node_3f35ec3e 151: __init__() node_3f35ec3e->node_3f35ec3e node_4ea04416 213: _get_docstring() node_7a79a369 233: _get_type_parameters() node_21792dd9 383: decorators_to_labels() node_ca1c17f3 297: generic_visit() node_84de8bab 288: visit() node_ca1c17f3->node_84de8bab node_d63d0b3a 401: get_base_property() node_6f67e2ca 262: get_module() node_6f67e2ca->node_84de8bab node_1d12aa1e 646: handle_attribute() node_1d12aa1e->node_4ea04416 node_7eb90026 425: handle_function() node_7eb90026->node_4ea04416 node_7eb90026->node_7a79a369 node_7eb90026->node_21792dd9 node_7eb90026->node_ca1c17f3 node_7eb90026->node_d63d0b3a node_5bf6a284 761: visit_annassign() node_5bf6a284->node_1d12aa1e node_fad6e0a4 753: visit_assign() node_fad6e0a4->node_1d12aa1e node_2d0552ff 542: visit_asyncfunctiondef() node_2d0552ff->node_7eb90026 node_db161e7a 329: visit_classdef() node_db161e7a->node_4ea04416 node_db161e7a->node_7a79a369 node_db161e7a->node_21792dd9 node_db161e7a->node_ca1c17f3 node_37f45cc0 534: visit_functiondef() node_37f45cc0->node_7eb90026 node_4b05beb3 790: visit_if() node_4b05beb3->node_ca1c17f3 node_5b9b6412 306: visit_module() node_5b9b6412->node_4ea04416 node_5b9b6412->node_ca1c17f3 node_76060c19 553: visit_typealias() node_76060c19->node_4ea04416 node_76060c19->node_7a79a369 node_23b55725 94: visit() node_23b55725->node_3f35ec3e node_23b55725->node_6f67e2ca

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_5c875712 File: c3linear cluster_61f0a614 Class: _Dependency cluster_34181ef0 Class: _DependencyList node_73696db7 29: tail() node_88865513 60: __len__() node_73696db7->node_88865513 node_1034b2ed 48: __init__() node_80e15795 64: __repr__() node_80e15795->node_80e15795 node_4c939bc0 82: remove() node_b886b18f 93: c3linear_merge() node_b886b18f->node_1034b2ed node_b886b18f->node_4c939bc0

collections.py¤

SPDX-License-Identifier: ISC

G cluster_4460bb74 File: collections cluster_a0d5a471 Class: LinesCollection node_7621d169 72: items() node_7621d169->node_7621d169 node_a6b3188b 56: keys() node_a6b3188b->node_a6b3188b node_4dda70b4 64: values() node_4dda70b4->node_4dda70b4

debug.py¤

SPDX-License-Identifier: ISC

G cluster_09f72e44 File: debug node_4499992b 96: _get_debug_info() node_14ee37fc 81: _get_version() node_4499992b->node_14ee37fc node_f0256b3a 70: _interpreter_name_version() node_4499992b->node_f0256b3a node_ac07c3ad 115: _print_debug_info() node_ac07c3ad->node_4499992b

diff.py¤

SPDX-License-Identifier: ISC

G cluster_f694f772 File: diff cluster_bc1d4a1c Class: Breakage node_b25d072b 300: _explain_azdo() node_3f1c4b04 221: _format_new_value() node_b25d072b->node_3f1c4b04 node_b21e0f7a 218: _format_old_value() node_b25d072b->node_b21e0f7a node_f13202dd 210: _format_title() node_b25d072b->node_f13202dd node_e5cbd6d8 278: _explain_github() node_e5cbd6d8->node_3f1c4b04 node_e5cbd6d8->node_b21e0f7a node_e5cbd6d8->node_f13202dd node_b1105a5b 258: _explain_markdown() node_b1105a5b->node_3f1c4b04 node_b1105a5b->node_b21e0f7a node_655c0279 224: _explain_oneline() node_fdbf68bd 213: _format_kind() node_655c0279->node_fdbf68bd node_f1f3e511 205: _format_location() node_655c0279->node_f1f3e511 node_655c0279->node_3f1c4b04 node_655c0279->node_b21e0f7a node_655c0279->node_f13202dd node_209847b1 240: _explain_verbose() node_209847b1->node_fdbf68bd node_209847b1->node_f1f3e511 node_209847b1->node_3f1c4b04 node_209847b1->node_b21e0f7a node_209847b1->node_f13202dd node_41178bdf 604: _alias_incompatibilities() node_c07fbf7e 645: _type_based_yield() node_41178bdf->node_c07fbf7e node_30ce30ba 595: _attribute_incompatibilities() node_4705b8d7 504: _class_incompatibilities() node_740a3542 620: _member_incompatibilities() node_4705b8d7->node_740a3542 node_dce12e39 517: _function_incompatibilities() node_b18af290 682: _returns_are_compatible() node_dce12e39->node_b18af290 node_740a3542->node_c07fbf7e node_c07fbf7e->node_30ce30ba node_c07fbf7e->node_4705b8d7 node_c07fbf7e->node_dce12e39 node_905e8e9f 706: find_breaking_changes() node_905e8e9f->node_740a3542

docstrings¤

SPDX-License-Identifier: ISC

auto.py¤

SPDX-License-Identifier: ISC

G cluster_5ce70b9d File: auto node_739f2f56 145: infer_docstring_style() node_9ac4972c 216: parse_auto() node_9ac4972c->node_739f2f56
google.py¤

SPDX-License-Identifier: ISC

G cluster_9aca48fa File: google node_b974a8d3 660: _annotation_from_parent() node_c2264b2e 629: _get_name_annotation_description() node_f9774758 889: _is_empty_line() node_6c3c5a49 377: _read_attributes_section() node_7b8389bd 108: _read_block_items() node_6c3c5a49->node_7b8389bd node_9b00bac7 177: _read_block() node_9b00bac7->node_f9774758 node_7b8389bd->node_f9774758 node_3ae42767 614: _read_block_items_maybe() node_3ae42767->node_9b00bac7 node_3ae42767->node_7b8389bd node_cf72149b 458: _read_classes_section() node_cf72149b->node_7b8389bd node_280956ec 829: _read_examples_section() node_280956ec->node_f9774758 node_280956ec->node_9b00bac7 node_848a13ee 420: _read_functions_section() node_848a13ee->node_7b8389bd node_16157b79 524: _read_modules_section() node_16157b79->node_7b8389bd node_37793219 293: _read_other_parameters_section() node_87097574 212: _read_parameters() node_37793219->node_87097574 node_87097574->node_7b8389bd node_e99d76ce 282: _read_parameters_section() node_e99d76ce->node_87097574 node_613473e8 553: _read_raises_section() node_613473e8->node_7b8389bd node_fea62051 779: _read_receives_section() node_fea62051->node_b974a8d3 node_fea62051->node_c2264b2e node_fea62051->node_3ae42767 node_c98137df 679: _read_returns_section() node_c98137df->node_b974a8d3 node_c98137df->node_c2264b2e node_c98137df->node_3ae42767 node_8b74badf 496: _read_type_aliases_section() node_8b74badf->node_7b8389bd node_eeb1dbf6 305: _read_type_parameters_section() node_eeb1dbf6->node_7b8389bd node_6cfd986a 585: _read_warns_section() node_6cfd986a->node_7b8389bd node_e902c6da 729: _read_yields_section() node_e902c6da->node_b974a8d3 node_e902c6da->node_c2264b2e node_e902c6da->node_3ae42767 node_22c53185 936: parse_google() node_22c53185->node_f9774758 node_22c53185->node_9b00bac7
models.py¤

SPDX-License-Identifier: ISC

G cluster_c23e1b20 File: models cluster_a6a28dc1 Class: DocstringSection node_207dc18a 262: as_dict() node_207dc18a->node_207dc18a
numpy.py¤

SPDX-License-Identifier: ISC

G cluster_5c5108ec File: numpy node_91698af6 899: _append_section() node_9bab2bc9 111: _is_dash_line() node_380c8020 107: _is_empty_line() node_9bab2bc9->node_380c8020 node_7ad52bae 671: _read_attributes_section() node_841aabf9 115: _read_block_items() node_7ad52bae->node_841aabf9 node_a8ac0db5 177: _read_block() node_a8ac0db5->node_9bab2bc9 node_a8ac0db5->node_380c8020 node_841aabf9->node_9bab2bc9 node_841aabf9->node_380c8020 node_f9cd5c20 744: _read_classes_section() node_f9cd5c20->node_841aabf9 node_c4a70061 432: _read_deprecated_section() node_c4a70061->node_841aabf9 node_b3e9380b 833: _read_examples_section() node_b3e9380b->node_380c8020 node_b3e9380b->node_a8ac0db5 node_7d0378e1 711: _read_functions_section() node_7d0378e1->node_841aabf9 node_94eebb94 800: _read_modules_section() node_94eebb94->node_841aabf9 node_133f1f22 334: _read_other_parameters_section() node_0e478b55 243: _read_parameters() node_133f1f22->node_0e478b55 node_0e478b55->node_841aabf9 node_d553d77d 318: _read_parameters_section() node_d553d77d->node_0e478b55 node_aa4213c4 619: _read_raises_section() node_aa4213c4->node_841aabf9 node_f45dcdc4 571: _read_receives_section() node_f45dcdc4->node_841aabf9 node_b9811689 459: _read_returns_section() node_b9811689->node_841aabf9 node_da3c56f2 777: _read_type_aliases_section() node_da3c56f2->node_841aabf9 node_0caac7db 358: _read_type_parameters_section() node_0caac7db->node_841aabf9 node_63c3793e 645: _read_warns_section() node_63c3793e->node_841aabf9 node_8f0417b9 519: _read_yields_section() node_8f0417b9->node_841aabf9 node_f4f91c67 952: parse_numpy() node_f4f91c67->node_91698af6 node_f4f91c67->node_9bab2bc9 node_f4f91c67->node_380c8020
parsers.py¤

SPDX-License-Identifier: ISC

sphinx.py¤

SPDX-License-Identifier: ISC

G cluster_0ca0e3bc File: sphinx cluster_6ceabe39 Class: _FieldType node_7803daa2 72: matches() node_88b36f86 500: _consolidate_continuation_lines() node_04e7c670 513: _consolidate_descriptive_type() node_00ca764b 240: _determine_param_annotation() node_c6194440 233: _determine_param_default() node_a20647a8 481: _parse_directive() node_a20647a8->node_88b36f86 node_8c778d05 465: _parsed_values_to_sections() node_dd2f5673 517: _strip_blank_lines() node_8c778d05->node_dd2f5673 node_73788e90 307: _read_attribute() node_73788e90->node_a20647a8 node_0fe70d48 355: _read_attribute_type() node_0fe70d48->node_04e7c670 node_0fe70d48->node_a20647a8 node_90bd9f7b 386: _read_exception() node_90bd9f7b->node_a20647a8 node_33215dcb 169: _read_parameter() node_33215dcb->node_00ca764b node_33215dcb->node_c6194440 node_33215dcb->node_a20647a8 node_4156ffb5 275: _read_parameter_type() node_4156ffb5->node_04e7c670 node_4156ffb5->node_a20647a8 node_b659080e 408: _read_return() node_b659080e->node_a20647a8 node_3c4ccba4 443: _read_return_type() node_3c4ccba4->node_04e7c670 node_3c4ccba4->node_a20647a8 node_70aa10a4 120: parse_sphinx() node_70aa10a4->node_7803daa2 node_70aa10a4->node_8c778d05
utils.py¤

SPDX-License-Identifier: ISC

G cluster_618290ef File: utils node_61ab3e9a 69: _compile_docstring_annotation() node_1cac4c7f 76: parse_docstring_annotation() node_1cac4c7f->node_61ab3e9a

encoders.py¤

SPDX-License-Identifier: ISC

G cluster_19ea53f6 File: encoders cluster_54aa7c43 Class: JSONEncoder node_a7084cd8 79: __init__() node_a7084cd8->node_a7084cd8 node_bcef6987 174: _attach_parent_to_expr() node_713ae7bd 184: _attach_parent_to_exprs() node_713ae7bd->node_bcef6987 node_e488cae2 303: _load_attribute() node_b89b58a6 116: _load_docstring() node_e488cae2->node_b89b58a6 node_cd007280 165: _load_git_info() node_e488cae2->node_cd007280 node_5ad64fe1 250: _load_class() node_5ad64fe1->node_713ae7bd node_180fffae 122: _load_decorators() node_5ad64fe1->node_180fffae node_5ad64fe1->node_b89b58a6 node_5ad64fe1->node_cd007280 node_f1a3b75b 126: _load_expression() node_2e394bb0 280: _load_function() node_2e394bb0->node_180fffae node_2e394bb0->node_b89b58a6 node_2e394bb0->node_cd007280 node_5a68d6c0 221: _load_module() node_5a68d6c0->node_713ae7bd node_5a68d6c0->node_b89b58a6 node_5a68d6c0->node_cd007280 node_0cee9dc5 146: _load_parameter() node_0cee9dc5->node_b89b58a6 node_c53cc59e 339: _load_type_alias() node_c53cc59e->node_b89b58a6 node_c53cc59e->node_cd007280 node_d11fce04 156: _load_type_parameter() node_8cb0a5cf 370: json_decoder() node_8cb0a5cf->node_f1a3b75b node_8cb0a5cf->node_0cee9dc5 node_8cb0a5cf->node_d11fce04

enumerations.py¤

SPDX-License-Identifier: ISC

exceptions.py¤

SPDX-License-Identifier: ISC

G cluster_8d8a1f74 File: exceptions cluster_9407ad62 Class: AliasResolutionError node_eba3ae96 70: __str__() node_91ac6bd2 62: _format_message() node_eba3ae96->node_91ac6bd2

expressions.py¤

SPDX-License-Identifier: ISC

G cluster_7a7f723d File: expressions cluster_3c5f73b1 Class: Expr cluster_92acc9d4 Class: ExprAttribute cluster_da99681b Class: ExprBinOp cluster_f4af5ec2 Class: ExprBoolOp cluster_9792247d Class: ExprCall cluster_5eacc7a5 Class: ExprCompare cluster_65c9a170 Class: ExprComprehension cluster_4833725e Class: ExprDict cluster_4f2e08b1 Class: ExprDictComp cluster_5e150c91 Class: ExprExtSlice cluster_589881dc Class: ExprFormatted cluster_863420a7 Class: ExprGeneratorExp cluster_94e58ade Class: ExprIfExp cluster_9adf1690 Class: ExprInterpolation cluster_166c32b7 Class: ExprJoinedStr cluster_68da29e4 Class: ExprKeyword cluster_d9bcb781 Class: ExprVarPositional cluster_a00ee381 Class: ExprVarKeyword cluster_3a57c5d6 Class: ExprLambda cluster_7eaa320a Class: ExprList cluster_e39b5e23 Class: ExprListComp cluster_ae4418c6 Class: ExprNamedExpr cluster_7b34680f Class: ExprSet cluster_3ecaf648 Class: ExprSetComp cluster_87e71b0c Class: ExprSlice cluster_80d60de1 Class: ExprSubscript cluster_a6f38df9 Class: ExprTemplateStr cluster_7ccf68f6 Class: ExprTuple cluster_9f395cef Class: ExprUnaryOp cluster_45f25574 Class: ExprAwait cluster_5d49c38a Class: ExprYield cluster_6757e743 Class: ExprYieldFrom node_716b90a1 356: __iter__() node_2958383c 360: iterate() node_716b90a1->node_2958383c node_9939ad58 353: __str__() node_9939ad58->node_2958383c node_9e77e63d 453: _to_binop() node_9e77e63d->node_9e77e63d node_3d04c83f 389: as_dict() node_0ef55b24 332: _expr_as_dict() node_3d04c83f->node_0ef55b24 node_1bc5711e 493: append() node_1bc5711e->node_1bc5711e node_75cf48c0 476: iterate() node_c179ad8a 1493: _get_precedence() node_75cf48c0->node_c179ad8a node_accfb88e 245: _yield() node_75cf48c0->node_accfb88e node_3dfd96a4 1363: iterate() node_3dfd96a4->node_accfb88e node_d8a2b6ee 542: iterate() node_d8a2b6ee->node_c179ad8a node_d8a2b6ee->node_accfb88e node_369aae7d 562: iterate() node_369aae7d->node_c179ad8a node_369aae7d->node_accfb88e node_bda236da 590: iterate() node_bda236da->node_c179ad8a node_f0b4be57 288: _join() node_bda236da->node_f0b4be57 node_bda236da->node_accfb88e node_d3497ab7 608: iterate() node_d3497ab7->node_c179ad8a node_d3497ab7->node_accfb88e node_f505846c 629: iterate() node_f505846c->node_accfb88e node_5b5e774b 667: iterate() node_5b5e774b->node_f0b4be57 node_aaeaf64e 694: iterate() node_aaeaf64e->node_f0b4be57 node_aaeaf64e->node_accfb88e node_51c50443 715: iterate() node_51c50443->node_f0b4be57 node_2fabad91 769: iterate() node_c8131f6b 719: _iterate_format_parts() node_2fabad91->node_c8131f6b node_d47b5878 784: iterate() node_d47b5878->node_f0b4be57 node_d47b5878->node_accfb88e node_71278cf2 807: iterate() node_71278cf2->node_71278cf2 node_71278cf2->node_c179ad8a node_71278cf2->node_accfb88e node_b6218faa 836: iterate() node_b6218faa->node_c8131f6b node_1843b835 884: iterate() node_0792c132 844: _fstring_choose_quote() node_1843b835->node_0792c132 node_1843b835->node_accfb88e node_e0e3a0c7 937: iterate() node_e0e3a0c7->node_accfb88e node_5603aac9 977: iterate() node_5603aac9->node_accfb88e node_95be31db 1020: iterate() node_95be31db->node_f0b4be57 node_f17aad62 1035: iterate() node_f17aad62->node_f0b4be57 node_f17aad62->node_accfb88e node_2ef9263e 1166: iterate() node_2ef9263e->node_accfb88e node_9ad2bd33 1196: iterate() node_9ad2bd33->node_f0b4be57 node_6959ba24 1211: iterate() node_6959ba24->node_f0b4be57 node_6959ba24->node_accfb88e node_a1073993 1230: iterate() node_a1073993->node_accfb88e node_64c4970d 1251: iterate() node_64c4970d->node_c179ad8a node_64c4970d->node_accfb88e node_a40d021e 1258: modernize() node_a40d021e->node_9e77e63d node_a40d021e->node_a40d021e node_46c6e041 1298: iterate() node_46c6e041->node_0792c132 node_46c6e041->node_accfb88e node_bf1d611d 1318: iterate() node_bf1d611d->node_f0b4be57 node_57838cba 1349: iterate() node_57838cba->node_c179ad8a node_57838cba->node_accfb88e node_007fd945 963: iterate() node_007fd945->node_accfb88e node_c5021f85 951: iterate() node_c5021f85->node_accfb88e node_687af5f9 1375: iterate() node_687af5f9->node_accfb88e node_3be05d8d 1389: iterate() node_3be05d8d->node_accfb88e node_cc65ec60 1845: _build() node_af60f388 1497: _build_attribute() node_af60f388->node_1bc5711e node_af60f388->node_cc65ec60 node_bc15653c 1509: _build_await() node_bc15653c->node_cc65ec60 node_7bcf922f 1513: _build_binop() node_7bcf922f->node_cc65ec60 node_0a8500fa 1521: _build_boolop() node_0a8500fa->node_cc65ec60 node_8f17e187 1528: _build_call() node_8f17e187->node_cc65ec60 node_22f9bef1 1539: _build_compare() node_22f9bef1->node_cc65ec60 node_598cce03 1555: _build_comprehension() node_598cce03->node_cc65ec60 node_b6a6c00e 1547: _build_implicit_tuple() node_598cce03->node_b6a6c00e node_de612f8e 1564: _build_constant() node_de612f8e->node_cc65ec60 node_42bbcef8 1603: _build_dict() node_42bbcef8->node_cc65ec60 node_887e4f59 1610: _build_dictcomp() node_887e4f59->node_cc65ec60 node_903c4fc1 1621: _build_format_spec() node_903c4fc1->node_cc65ec60 node_a8c8745b 1629: _build_formatted() node_a8c8745b->node_cc65ec60 node_a8c8745b->node_903c4fc1 node_662efbba 1644: _build_generatorexp() node_662efbba->node_cc65ec60 node_88e63212 1658: _build_ifexp() node_88e63212->node_cc65ec60 node_b6a6c00e->node_cc65ec60 node_9bd94533 1816: _build_interpolation() node_9bd94533->node_cc65ec60 node_9bd94533->node_903c4fc1 node_1d20bc23 1666: _build_joinedstr() node_1d20bc23->node_cc65ec60 node_92fe1c3b 1676: _build_keyword() node_92fe1c3b->node_cc65ec60 node_a7986201 1682: _build_lambda() node_a7986201->node_cc65ec60 node_72f4f245 1879: safe_get_expression() node_a7986201->node_72f4f245 node_2aba4724 1699: _build_list() node_2aba4724->node_cc65ec60 node_b993a97f 1703: _build_listcomp() node_b993a97f->node_cc65ec60 node_2e9d4e5f 1711: _build_named_expr() node_2e9d4e5f->node_cc65ec60 node_b50959ef 1715: _build_set() node_b50959ef->node_cc65ec60 node_16374aea 1719: _build_setcomp() node_16374aea->node_cc65ec60 node_282f908f 1723: _build_slice() node_282f908f->node_cc65ec60 node_3932d346 1731: _build_starred() node_3932d346->node_cc65ec60 node_f08bf740 1735: _build_subscript() node_f08bf740->node_cc65ec60 node_f08bf740->node_b6a6c00e node_0d85d217 1830: _build_templatestr() node_0d85d217->node_cc65ec60 node_24560fd1 1762: _build_tuple() node_24560fd1->node_cc65ec60 node_97a28dd2 1766: _build_unaryop() node_97a28dd2->node_cc65ec60 node_f87ae139 1770: _build_yield() node_f87ae139->node_cc65ec60 node_b4656620 1774: _build_yield_from() node_b4656620->node_cc65ec60 node_de2dee7b 312: _field_as_dict() node_0ef55b24->node_de2dee7b node_ed82d3a7 324: _serializable_expression_fields() node_0ef55b24->node_ed82d3a7 node_de2dee7b->node_de2dee7b node_0792c132->node_1bc5711e node_c8131f6b->node_c8131f6b node_c8131f6b->node_accfb88e node_f0b4be57->node_accfb88e node_accfb88e->node_c179ad8a node_accfb88e->node_accfb88e node_77d503ec 1849: get_expression() node_77d503ec->node_cc65ec60 node_72f4f245->node_77d503ec

extensions¤

SPDX-License-Identifier: ISC

base.py¤

SPDX-License-Identifier: ISC

G cluster_b586a621 File: base cluster_8f5197ea Class: Extension cluster_83dc045e Class: Extensions node_e0b9d89b 74: generic_inspect() node_b3862cd8 66: inspect() node_e0b9d89b->node_b3862cd8 node_96821072 57: generic_visit() node_8500812c 49: visit() node_96821072->node_8500812c node_7f44a83f 429: on_alias() node_0e7399d4 405: on_alias_instance() node_0e7399d4->node_7f44a83f node_a612a049 463: __init__() node_baaa6d55 472: add() node_a612a049->node_baaa6d55 node_a0c0e92e 530: _load_extension() node_2f2bb55f 519: _load_extension_path() node_a0c0e92e->node_2f2bb55f node_69667afe 621: load_extensions() node_69667afe->node_a612a049 node_69667afe->node_baaa6d55 node_69667afe->node_a0c0e92e
dataclasses.py¤

SPDX-License-Identifier: ISC

G cluster_dda9e62e File: dataclasses cluster_5c423373 Class: DataclassesExtension node_9265750b 243: on_package() node_bf16519b 219: _apply_recursively() node_9265750b->node_bf16519b node_bf16519b->node_bf16519b node_af7f9acb 211: _del_members_annotated_as_initvar() node_bf16519b->node_af7f9acb node_e7109fe7 173: _set_dataclass_init() node_bf16519b->node_e7109fe7 node_14ede38c 65: _dataclass_arguments() node_98a0f9ef 41: _dataclass_decorator() node_14ede38c->node_98a0f9ef node_9468a5f6 48: _expr_args() node_14ede38c->node_9468a5f6 node_54cccbf5 82: _dataclass_parameters() node_54cccbf5->node_14ede38c node_6c2a82b2 71: _field_arguments() node_54cccbf5->node_6c2a82b2 node_9468a5f6->node_9468a5f6 node_6c2a82b2->node_9468a5f6 node_ca5dd4e5 155: _reorder_parameters() node_e7109fe7->node_98a0f9ef node_e7109fe7->node_54cccbf5 node_e7109fe7->node_ca5dd4e5
unpack_typeddict.py¤

SPDX-License-Identifier: ISC

G cluster_b727bd87 File: unpack_typeddict cluster_d9b1f3c4 Class: UnpackTypedDictExtension node_23b60e79 207: on_class() node_0aae2804 81: _get_or_set_attrs() node_23b60e79->node_0aae2804 node_107173cd 186: _params_from_attrs() node_23b60e79->node_107173cd node_7fb67863 125: _update_docstring() node_23b60e79->node_7fb67863 node_606e4ea4 234: on_function() node_606e4ea4->node_0aae2804 node_606e4ea4->node_107173cd node_606e4ea4->node_7fb67863 node_817f67d8 45: _unwrap_annotation() node_0aae2804->node_817f67d8

finder.py¤

SPDX-License-Identifier: ISC

G cluster_54e3b079 File: finder cluster_0d6ba722 Class: ModuleFinder node_06902f44 118: __init__() node_d0dc4016 400: _extend_from_pth_files() node_06902f44->node_d0dc4016 node_a4c63f94 135: append_search_path() node_06902f44->node_a4c63f94 node_f532170c 146: _append_search_path() node_f7c8c445 392: _contents() node_d0dc4016->node_f7c8c445 node_d0dc4016->node_a4c63f94 node_6cbf2c50 456: _handle_pth_file() node_d0dc4016->node_6cbf2c50 node_c7ac8862 409: _filter_py_modules() node_0d632542 377: _module_name_path() node_e897f0e1 417: _top_module_name() node_4394a86d 150: insert_search_path() node_e897f0e1->node_4394a86d node_a4c63f94->node_f532170c node_26a9344e 247: find_package() node_26a9344e->node_f7c8c445 node_3de53752 441: _is_pkg_style_namespace() node_26a9344e->node_3de53752 node_f5058e8f 164: find_spec() node_f5058e8f->node_0d632542 node_f5058e8f->node_e897f0e1 node_f5058e8f->node_26a9344e node_46b9f5fa 294: iter_submodules() node_46b9f5fa->node_c7ac8862 node_46b9f5fa->node_46b9f5fa node_34bc4bb8 360: submodules() node_34bc4bb8->node_46b9f5fa node_d4313643 486: _handle_editable_module() node_31ee9397 67: _match_pattern() node_d4313643->node_31ee9397 node_6cbf2c50->node_d4313643

git.py¤

SPDX-License-Identifier: ISC

G cluster_b1874201 File: git cluster_a9ef6d3e Class: GitInfo node_9b945278 258: from_package() node_80436737 234: _get_git_commit_hash() node_9b945278->node_80436737 node_fedc4570 179: _get_git_known_service() node_9b945278->node_fedc4570 node_6e4b111d 153: _get_git_remote_url() node_9b945278->node_6e4b111d node_c0c189fe 103: _get_repo_root() node_9b945278->node_c0c189fe node_4b382513 240: _is_tracked() node_9b945278->node_4b382513 node_ac6732aa 285: get_source_link() node_4b13a86e 220: _get_source_link() node_ac6732aa->node_4b13a86e node_7c3dd002 66: _assert_git_repo() node_9a092053 52: _git() node_7c3dd002->node_9a092053 node_80436737->node_9a092053 node_6e4b111d->node_9a092053 node_d82afbe9 83: _get_latest_tag() node_d82afbe9->node_9a092053 node_c0c189fe->node_9a092053 node_4b382513->node_9a092053 node_b176933f 46: _normalize() node_0ee4a518 120: _tmp_worktree() node_0ee4a518->node_7c3dd002 node_0ee4a518->node_9a092053 node_0ee4a518->node_b176933f

helpers.py¤

SPDX-License-Identifier: ISC

G cluster_da01e3d3 File: helpers node_bf29af34 429: module_vtree() node_82fc302e 386: vtree() node_bf29af34->node_82fc302e node_ee1edb3a 335: temporary_inspected_module() node_d98098c4 70: temporary_pyfile() node_ee1edb3a->node_d98098c4 node_18755e7e 210: temporary_inspected_package() node_100eeada 88: temporary_pypackage() node_18755e7e->node_100eeada node_dd8b7ea1 289: temporary_visited_module() node_dd8b7ea1->node_d98098c4 node_9392beda 137: temporary_visited_package() node_9392beda->node_100eeada

importer.py¤

SPDX-License-Identifier: ISC

G cluster_f916cd70 File: importer node_e30f6568 33: _error_details() node_c4dcd94f 59: dynamic_import() node_c4dcd94f->node_e30f6568 node_bce669bf 38: sys_path() node_c4dcd94f->node_bce669bf

loader.py¤

SPDX-License-Identifier: ISC

G cluster_b5bd0500 File: loader cluster_163fe408 Class: GriffeLoader node_fbab1505 79: __init__() node_7390dddd 685: _create_module() node_c06fca70 770: _expand_wildcard() node_65178259 228: _fire_load_events() node_65178259->node_65178259 node_2ff657fb 740: _get_or_create_parent_module() node_2ff657fb->node_7390dddd node_74b7d18a 713: _inspect_module() node_7f4b4d6a 586: _load_module() node_c07ed4b6 605: _load_module_path() node_7f4b4d6a->node_c07ed4b6 node_c07ed4b6->node_7390dddd node_c07ed4b6->node_74b7d18a node_274c795e 630: _load_submodules() node_c07ed4b6->node_274c795e node_94e8a87e 693: _visit_module() node_c07ed4b6->node_94e8a87e node_cb7f9fb1 571: _load_package() node_cb7f9fb1->node_7f4b4d6a node_867cfc37 366: expand_wildcards() node_cb7f9fb1->node_867cfc37 node_af70830b 634: _load_submodule() node_af70830b->node_2ff657fb node_af70830b->node_7f4b4d6a node_274c795e->node_af70830b node_e133feac 247: _post_load() node_e133feac->node_65178259 node_766f1a10 325: expand_exports() node_e133feac->node_766f1a10 node_e133feac->node_867cfc37 node_766f1a10->node_766f1a10 node_867cfc37->node_c06fca70 node_867cfc37->node_867cfc37 node_af0912b3 138: load() node_867cfc37->node_af0912b3 node_af0912b3->node_74b7d18a node_af0912b3->node_cb7f9fb1 node_af0912b3->node_e133feac node_5b49be80 269: resolve_aliases() node_5b49be80->node_867cfc37 node_9cefd5dc 482: resolve_module_aliases() node_5b49be80->node_9cefd5dc node_9cefd5dc->node_af0912b3 node_9cefd5dc->node_9cefd5dc node_36ffb8e5 779: load() node_36ffb8e5->node_fbab1505 node_36ffb8e5->node_af0912b3 node_36ffb8e5->node_5b49be80 node_09efae3e 889: load_git() node_09efae3e->node_36ffb8e5 node_56817e09 979: load_pypi() node_56817e09->node_36ffb8e5

logger.py¤

SPDX-License-Identifier: ISC

G cluster_18a62592 File: logger cluster_51ad1726 Class: Logger node_f562ab92 0: (global)() node_01d5f87e 59: _get() node_f562ab92->node_01d5f87e node_4629aa0e 65: _patch_loggers() node_1b48f79f 109: get_logger() node_1b48f79f->node_01d5f87e node_19486a5e 121: patch_loggers() node_19486a5e->node_4629aa0e

merger.py¤

SPDX-License-Identifier: ISC

G cluster_532579a8 File: merger node_438a7315 96: _merge_annotations() node_341c6d59 59: _merge_attribute_stubs() node_85e81e1f 71: _merge_stubs_docstring() node_341c6d59->node_85e81e1f node_eb09f001 40: _merge_class_stubs() node_eb09f001->node_85e81e1f node_dd65696a 135: _merge_stubs_members() node_eb09f001->node_dd65696a node_9af01d2b 81: _merge_stubs_overloads() node_eb09f001->node_9af01d2b node_b3924039 76: _merge_stubs_type_parameters() node_eb09f001->node_b3924039 node_349ef488 47: _merge_function_stubs() node_349ef488->node_85e81e1f node_349ef488->node_b3924039 node_c10c6496 34: _merge_module_stubs() node_c10c6496->node_85e81e1f node_c10c6496->node_dd65696a node_c10c6496->node_9af01d2b node_9dab19b0 104: _merge_overload_annotations() node_9dab19b0->node_438a7315 node_dd65696a->node_341c6d59 node_dd65696a->node_349ef488 node_0e483439 66: _merge_type_alias_stubs() node_dd65696a->node_0e483439 node_9af01d2b->node_9dab19b0 node_0e483439->node_85e81e1f node_0e483439->node_b3924039 node_4fdec0f4 179: merge_stubs() node_4fdec0f4->node_c10c6496

mixins.py¤

SPDX-License-Identifier: ISC

G cluster_f83abac6 File: mixins cluster_9cda5b73 Class: GetMembersMixin cluster_554ff116 Class: DelMembersMixin cluster_5b7d7a38 Class: SetMembersMixin node_a3ef7ad0 103: __delitem__() node_99900c2b 38: _get_parts() node_a3ef7ad0->node_99900c2b node_6e3e7de3 130: del_member() node_6e3e7de3->node_6e3e7de3 node_6e3e7de3->node_99900c2b node_0a786d63 53: __getitem__() node_0a786d63->node_99900c2b node_6cbaa658 75: get_member() node_6cbaa658->node_6cbaa658 node_6cbaa658->node_99900c2b node_848de1dc 158: __setitem__() node_848de1dc->node_99900c2b node_a2e6aea3 184: set_member() node_a2e6aea3->node_a2e6aea3 node_a2e6aea3->node_99900c2b

models.py¤

SPDX-License-Identifier: ISC

G cluster_8b76e396 File: models cluster_84672dbd Class: _ModuleSerializationContext cluster_cb627ed1 Class: Docstring cluster_96fd3d7e Class: Parameter cluster_507f3cca Class: Parameters cluster_a18553f6 Class: TypeParameters cluster_0d6d283c Class: Object cluster_b3f4711f Class: Alias cluster_e0575bb7 Class: Class cluster_e56ac6da Class: Function node_edc32e84 1430: __init__() node_116ce02a 2265: _update_target_aliases() node_edc32e84->node_116ce02a node_c1fcf90e 2249: _resolve_target() node_a511cd72 2216: resolve_target() node_c1fcf90e->node_a511cd72 node_9e19defc 1639: as_json() node_9e19defc->node_9e19defc node_c912e41c 1875: filter_members() node_c912e41c->node_c912e41c node_237fcb9e 1862: has_labels() node_237fcb9e->node_237fcb9e node_8d228f6d 1617: inherited_members() node_8d228f6d->node_edc32e84 node_bde8cb8a 1775: is_kind() node_bde8cb8a->node_bde8cb8a node_77f70bd6 1597: members() node_77f70bd6->node_edc32e84 node_5d2d9fbc 1558: parent() node_5d2d9fbc->node_116ce02a node_b5b81ea6 1984: resolve() node_b5b81ea6->node_b5b81ea6 node_e196f950 2167: target() node_e196f950->node_a511cd72 node_3b046ca4 2549: _mro() node_3b046ca4->node_3b046ca4 node_c139055f 2560: mro() node_c139055f->node_3b046ca4 node_e1a3ad8f 2497: parameters() node_b0f639b3 364: __init__() node_e1a3ad8f->node_b0f639b3 node_b7a562a2 221: parse() node_241e063b 217: parsed() node_241e063b->node_b7a562a2 node_78536963 2590: __init__() node_78536963->node_b0f639b3 node_bf3cd78b 635: __init__() node_d331b5eb 544: __init__() node_bf3cd78b->node_d331b5eb node_e34b3bc4 798: _get_source_link() node_b2a3f7fb 74: relative_source_filepath() node_e34b3bc4->node_b2a3f7fb node_ec5df169 1308: as_dict() node_ec5df169->node_e34b3bc4 node_f5792f28 63: __init__() node_ec5df169->node_f5792f28 node_41888e19 889: inherited_members() node_41888e19->node_edc32e84 node_8e46316a 1265: resolve() node_8e46316a->node_8e46316a node_a9009291 794: source_link() node_a9009291->node_e34b3bc4 node_930cd1b9 330: as_dict() node_930cd1b9->node_930cd1b9

stats.py¤

SPDX-License-Identifier: ISC

G cluster_ecd5d114 File: stats cluster_28078132 Class: Stats node_ab9adc16 36: __init__() node_751f8a30 90: _itercount() node_ab9adc16->node_751f8a30 node_751f8a30->node_751f8a30