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)!
π config/ # (5)!
π docs/ # (6)!
π htmlcov/ # (7)!
π scripts/ # (8)!
π site/ # (9)!
π src/ # (10)!
π tests/ # (11)!
.copier-answers.yml # (12)!
.envrc # (13)!
.gitignore
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
Makefile # (14)!
README.md
duties.py # (15)!
logo.svg
mkdocs.yml # (16)!
pyproject.toml # (17)!
uv.lock
GitHub workflows, issue templates and other configuration.
π ISSUE_TEMPLATE/ # (1)!
π workflows/ # (2)!
FUNDING.yml
pull_request_template.md
1 -bug.md
2 -feature.md
3 -docs.md
4 -change.md
config.yml
ci.yml
release.yml
sponsors.yml
The default virtual environment (git-ignored). See make setup command.
The virtual environments for all supported Python versions (git-ignored). See make setup command.
The configuration for VSCode (git-ignored). See make vscode command.
configurationCache.log
dryrun.log
launch.json
settings.json
targets.log
tasks.json
Contains our tooling configuration. See Scripts, configuration .
π vscode/ # (1)!
coverage.ini
git-changelog.toml
mypy.ini
pytest.ini
ruff.toml
launch.json
settings.json
tasks.json
Documentation sources (Markdown pages). See make docs task.
π .overrides/ # (1)!
π css/ # (2)!
π extensions/ # (3)!
π guide/ # (4)!
π img/ # (5)!
π js/ # (6)!
π reference/ # (7)!
alternatives.md
changelog.md
code-of-conduct.md
community.md
contributing.md
credits.md
downstream-projects.md
extensions.md
getting-help.md
getting-started.md
guide.md
index.md
installation.md
introduction.md
license.md
logo.svg
playground.md
reference.md
schema-docstrings-options.json
schema.json
Customization of Material for MkDocs ' templates.
π partials/ # (1)!
main.html
comments.html
path-item.html
custom.css
material.css
mkdocstrings.css
π built-in/ # (1)!
π official/ # (2)!
π third-party/ # (3)!
built-in.md
official.md
third-party.md
dataclasses.md
unpack-typeddict.md
autodocstringstyle.md
inherited-docstrings.md
public-redundant-aliases.md
public-wildcard-imports.md
pydantic.md
runtime-objects.md
sphinx.md
typingdoc.md
warnings-deprecated.md
docstring-inheritance.md
fastapi.md
fieldz.md
generics.md
inherited-method-crossrefs.md
modernized-annotations.md
π contributors/ # (1)!
π users/ # (2)!
contributors.md
users.md
architecture.md
commands.md
setup.md
workflow.md
π how-to/ # (1)!
π recommendations/ # (2)!
checking.md
extending.md
loading.md
navigating.md
serializing.md
parse-docstrings.md
selectively-inspect.md
set-docstring-styles.md
set-git-info.md
support-decorators.md
docstrings.md
public-apis.md
python-code.md
favicon.ico
gha_annotations_1.png
gha_annotations_2.png
π api/ # (1)!
api.md
cli.md
docstrings.md
Python API reference, injected with mkdocstrings .
π docstrings/ # (1)!
π models/ # (2)!
agents.md
checks.md
cli.md
docstrings.md
exceptions.md
expressions.md
extensions.md
finder.md
git.md
helpers.md
loaders.md
loggers.md
models.md
serializers.md
alias.md
attribute.md
class.md
function .md
module.md
type_alias.md
HTML report for Python code coverage (git-ignored), integrated in the Coverage report page. See make coverage task.
Our different scripts. See Scripts, configuration .
gen_credits.py
gen_griffe_json.py
gen_structure_docs.py
get_version.py
griffe_exts.py
make
make.py
Documentation site, built with make run mkdocs build (git-ignored).
The source of our Python package(s). See Sources and Program structure .
Our public API, exposed to users. See Program structure .
π _internal/ # (1)!
__init__.py
__main__.py
py.typed
Our internal API, hidden from users. See Program structure .
π agents/ # (1)!
π docstrings/ # (2)!
π extensions/ # (3)!
__init__.py
c3linear.py
cli.py
collections.py
debug.py
diff.py
encoders.py
enumerations.py
exceptions.py
expressions.py
finder.py
git.py
importer.py
loader.py
logger.py
merger.py
mixins.py
models.py
py.typed
stats.py
tests.py
π nodes/ # (1)!
__init__.py
inspector.py
visitor.py
__init__.py
assignments.py
ast.py
docstrings.py
exports.py
imports.py
parameters.py
runtime.py
values.py
__init__.py
auto.py
google.py
models.py
numpy.py
parsers.py
sphinx.py
utils.py
__init__.py
base.py
dataclasses.py
unpack_typeddict.py
Our test suite. See Tests .
π fixtures/
π test_docstrings/ # (1)!
π test_extensions/ # (2)!
__init__.py
conftest.py
helpers.py
test_api.py
test_cli.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
__init__.py
conftest.py
helpers.py
test_google.py
test_numpy.py
test_sphinx.py
test_warnings.py
__init__.py
test_base.py
test_dataclasses.py
test_unpack_typeddict.py
The answers file generated by Copier . See Boilerplate .
The environment configuration, automatically sourced by direnv . See commands .
A dummy makefile, only there for auto-completion. See commands .
Our project tasks, written with duty . See Tasks .
The build configuration for our docs. See make docs task.
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 src folder, following the src-layout . We use PDM-Backend to build source and wheel distributions, and configure it in pyproject.toml to search for packages in the src folder.
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 pyproject.toml to get the full list of files included in our source distributions.
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 The internal API is contained within the src/griffe/_internal folder. The top-level griffe/__init__.py module exposes all the public API, by importing the internal objects from various submodules of griffe._internal.
Users then import griffe directly, or import objects from it.
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.
G colorama colorama griffe griffe griffe__internal griffe. _internal griffe->griffe__internal griffe__internal_agents griffe. _internal. agents griffe->griffe__internal_agents griffe__internal_agents_inspector griffe. _internal. agents. inspector griffe->griffe__internal_agents_inspector griffe__internal_agents_nodes griffe. _internal. agents. nodes griffe->griffe__internal_agents_nodes griffe__internal_agents_nodes_assignments griffe. _internal. agents. nodes. assignments griffe->griffe__internal_agents_nodes_assignments griffe__internal_agents_nodes_ast griffe. _internal. agents. nodes. ast griffe->griffe__internal_agents_nodes_ast griffe__internal_agents_nodes_docstrings griffe. _internal. agents. nodes. docstrings griffe->griffe__internal_agents_nodes_docstrings griffe__internal_agents_nodes_exports griffe. _internal. agents. nodes. exports griffe->griffe__internal_agents_nodes_exports griffe__internal_agents_nodes_imports griffe. _internal. agents. nodes. imports griffe->griffe__internal_agents_nodes_imports griffe__internal_agents_nodes_parameters griffe. _internal. agents. nodes. parameters griffe->griffe__internal_agents_nodes_parameters griffe__internal_agents_nodes_runtime griffe. _internal. agents. nodes. runtime griffe->griffe__internal_agents_nodes_runtime griffe__internal_agents_nodes_values griffe. _internal. agents. nodes. values griffe->griffe__internal_agents_nodes_values griffe__internal_agents_visitor griffe. _internal. agents. visitor griffe->griffe__internal_agents_visitor griffe__internal_c3linear griffe. _internal. c3linear griffe->griffe__internal_c3linear griffe__internal_cli griffe. _internal. cli griffe->griffe__internal_cli griffe__internal_collections griffe. _internal. collections griffe->griffe__internal_collections griffe__internal_diff griffe. _internal. diff griffe->griffe__internal_diff griffe__internal_docstrings griffe. _internal. docstrings griffe->griffe__internal_docstrings griffe__internal_docstrings_auto griffe. _internal. docstrings. auto griffe->griffe__internal_docstrings_auto griffe__internal_docstrings_google griffe. _internal. docstrings. google griffe->griffe__internal_docstrings_google griffe__internal_docstrings_models griffe. _internal. docstrings. models griffe->griffe__internal_docstrings_models griffe__internal_docstrings_numpy griffe. _internal. docstrings. numpy griffe->griffe__internal_docstrings_numpy griffe__internal_docstrings_parsers griffe. _internal. docstrings. parsers griffe->griffe__internal_docstrings_parsers griffe__internal_docstrings_sphinx griffe. _internal. docstrings. sphinx griffe->griffe__internal_docstrings_sphinx griffe__internal_docstrings_utils griffe. _internal. docstrings. utils griffe->griffe__internal_docstrings_utils griffe__internal_encoders griffe. _internal. encoders griffe->griffe__internal_encoders griffe__internal_enumerations griffe. _internal. enumerations griffe->griffe__internal_enumerations griffe__internal_exceptions griffe. _internal. exceptions griffe->griffe__internal_exceptions griffe__internal_expressions griffe. _internal. expressions griffe->griffe__internal_expressions griffe__internal_extensions griffe. _internal. extensions griffe->griffe__internal_extensions griffe__internal_extensions_base griffe. _internal. extensions. base griffe->griffe__internal_extensions_base griffe__internal_extensions_dataclasses griffe. _internal. extensions. dataclasses griffe->griffe__internal_extensions_dataclasses griffe__internal_extensions_unpack_typeddict griffe. _internal. extensions. unpack_typeddict griffe->griffe__internal_extensions_unpack_typeddict griffe__internal_finder griffe. _internal. finder griffe->griffe__internal_finder griffe__internal_git griffe. _internal. git griffe->griffe__internal_git griffe__internal_importer griffe. _internal. importer griffe->griffe__internal_importer griffe__internal_loader griffe. _internal. loader griffe->griffe__internal_loader griffe__internal_logger griffe. _internal. logger griffe->griffe__internal_logger griffe__internal_merger griffe. _internal. merger griffe->griffe__internal_merger griffe__internal_mixins griffe. _internal. mixins griffe->griffe__internal_mixins griffe__internal_models griffe. _internal. models griffe->griffe__internal_models griffe__internal_stats griffe. _internal. stats griffe->griffe__internal_stats griffe__internal_tests griffe. _internal. tests griffe->griffe__internal_tests griffe___main__ griffe. __main__ griffe___main__->griffe__internal griffe___main__->griffe__internal_cli griffe__internal_agents_inspector->griffe__internal_agents_nodes griffe__internal_agents_inspector->griffe__internal_agents_nodes_runtime griffe__internal_agents_inspector->griffe__internal_collections griffe__internal_agents_inspector->griffe__internal_docstrings griffe__internal_agents_inspector->griffe__internal_docstrings_parsers griffe__internal_agents_inspector->griffe__internal_enumerations griffe__internal_agents_inspector->griffe__internal_expressions griffe__internal_agents_inspector->griffe__internal_extensions griffe__internal_agents_inspector->griffe__internal_importer griffe__internal_agents_inspector->griffe__internal_logger griffe__internal_agents_inspector->griffe__internal_models typing_extensions typing_extensions griffe__internal_agents_inspector->typing_extensions griffe__internal_agents_nodes_ast->griffe__internal_exceptions griffe__internal_agents_nodes_exports->griffe__internal_agents_nodes_values griffe__internal_agents_nodes_exports->griffe__internal_enumerations griffe__internal_agents_nodes_exports->griffe__internal_expressions griffe__internal_agents_nodes_exports->griffe__internal_logger griffe__internal_agents_nodes_exports->griffe__internal_models griffe__internal_agents_nodes_imports->griffe__internal_models griffe__internal_agents_nodes_parameters->griffe__internal_enumerations griffe__internal_agents_nodes_runtime->griffe__internal_enumerations griffe__internal_agents_nodes_runtime->griffe__internal_logger griffe__internal_agents_nodes_runtime->typing_extensions griffe__internal_agents_nodes_values->griffe__internal_logger griffe__internal_agents_visitor->griffe__internal_agents_nodes griffe__internal_agents_visitor->griffe__internal_agents_nodes_assignments griffe__internal_agents_visitor->griffe__internal_agents_nodes_ast griffe__internal_agents_visitor->griffe__internal_agents_nodes_docstrings griffe__internal_agents_visitor->griffe__internal_agents_nodes_exports griffe__internal_agents_visitor->griffe__internal_agents_nodes_imports griffe__internal_agents_visitor->griffe__internal_agents_nodes_parameters griffe__internal_agents_visitor->griffe__internal_collections griffe__internal_agents_visitor->griffe__internal_docstrings griffe__internal_agents_visitor->griffe__internal_docstrings_parsers griffe__internal_agents_visitor->griffe__internal_enumerations griffe__internal_agents_visitor->griffe__internal_exceptions griffe__internal_agents_visitor->griffe__internal_expressions griffe__internal_agents_visitor->griffe__internal_extensions griffe__internal_agents_visitor->griffe__internal_models griffe__internal_cli->colorama griffe__internal_debug griffe. _internal. debug griffe__internal_cli->griffe__internal_debug griffe__internal_cli->griffe__internal_diff griffe__internal_cli->griffe__internal_docstrings griffe__internal_cli->griffe__internal_docstrings_parsers griffe__internal_cli->griffe__internal_encoders griffe__internal_cli->griffe__internal_enumerations griffe__internal_cli->griffe__internal_exceptions griffe__internal_cli->griffe__internal_extensions griffe__internal_cli->griffe__internal_extensions_base griffe__internal_cli->griffe__internal_git griffe__internal_cli->griffe__internal_loader griffe__internal_cli->griffe__internal_logger griffe__internal_collections->griffe__internal_mixins griffe__internal_diff->griffe__internal_enumerations griffe__internal_diff->griffe__internal_exceptions griffe__internal_diff->griffe__internal_git griffe__internal_diff->griffe__internal_logger griffe__internal_diff->griffe__internal_models griffe__internal_docstrings_auto->griffe__internal_docstrings_google griffe__internal_docstrings_auto->griffe__internal_docstrings_models griffe__internal_docstrings_auto->griffe__internal_docstrings_numpy griffe__internal_docstrings_auto->griffe__internal_docstrings_sphinx griffe__internal_docstrings_auto->griffe__internal_enumerations griffe__internal_docstrings_auto->griffe__internal_models griffe__internal_docstrings_google->griffe__internal_docstrings_models griffe__internal_docstrings_google->griffe__internal_docstrings_utils griffe__internal_docstrings_google->griffe__internal_enumerations griffe__internal_docstrings_google->griffe__internal_expressions griffe__internal_docstrings_google->griffe__internal_models griffe__internal_docstrings_models->griffe__internal_enumerations griffe__internal_docstrings_models->griffe__internal_expressions griffe__internal_docstrings_numpy->griffe__internal_docstrings_models griffe__internal_docstrings_numpy->griffe__internal_docstrings_utils griffe__internal_docstrings_numpy->griffe__internal_enumerations griffe__internal_docstrings_numpy->griffe__internal_expressions griffe__internal_docstrings_numpy->griffe__internal_models griffe__internal_docstrings_parsers->griffe__internal_docstrings_auto griffe__internal_docstrings_parsers->griffe__internal_docstrings_google griffe__internal_docstrings_parsers->griffe__internal_docstrings_models griffe__internal_docstrings_parsers->griffe__internal_docstrings_numpy griffe__internal_docstrings_parsers->griffe__internal_docstrings_sphinx griffe__internal_docstrings_parsers->griffe__internal_enumerations griffe__internal_docstrings_sphinx->griffe__internal_docstrings_models griffe__internal_docstrings_sphinx->griffe__internal_docstrings_utils griffe__internal_docstrings_sphinx->griffe__internal_expressions griffe__internal_docstrings_sphinx->griffe__internal_models griffe__internal_docstrings_utils->griffe__internal_enumerations griffe__internal_docstrings_utils->griffe__internal_exceptions griffe__internal_docstrings_utils->griffe__internal_expressions griffe__internal_docstrings_utils->griffe__internal_logger griffe__internal_docstrings_utils->griffe__internal_models griffe__internal_encoders->griffe__internal_enumerations griffe__internal_encoders->griffe__internal_expressions griffe__internal_encoders->griffe__internal_git griffe__internal_encoders->griffe__internal_models griffe__internal_exceptions->griffe__internal_models griffe__internal_expressions->griffe__internal_agents griffe__internal_expressions->griffe__internal_agents_nodes griffe__internal_expressions->griffe__internal_agents_nodes_parameters griffe__internal_expressions->griffe__internal_enumerations griffe__internal_expressions->griffe__internal_exceptions griffe__internal_expressions->griffe__internal_logger griffe__internal_extensions_base->griffe__internal_agents griffe__internal_extensions_base->griffe__internal_agents_inspector griffe__internal_extensions_base->griffe__internal_agents_nodes griffe__internal_extensions_base->griffe__internal_agents_nodes_ast griffe__internal_extensions_base->griffe__internal_agents_nodes_runtime griffe__internal_extensions_base->griffe__internal_agents_visitor griffe__internal_extensions_base->griffe__internal_exceptions griffe__internal_extensions_base->griffe__internal_extensions_dataclasses griffe__internal_extensions_base->griffe__internal_importer griffe__internal_extensions_base->griffe__internal_loader griffe__internal_extensions_base->griffe__internal_models griffe__internal_extensions_dataclasses->griffe__internal_enumerations griffe__internal_extensions_dataclasses->griffe__internal_expressions griffe__internal_extensions_dataclasses->griffe__internal_logger griffe__internal_extensions_dataclasses->griffe__internal_models griffe__internal_extensions_unpack_typeddict->griffe__internal_docstrings griffe__internal_extensions_unpack_typeddict->griffe__internal_docstrings_models griffe__internal_extensions_unpack_typeddict->griffe__internal_enumerations griffe__internal_extensions_unpack_typeddict->griffe__internal_expressions griffe__internal_extensions_unpack_typeddict->griffe__internal_extensions_base griffe__internal_extensions_unpack_typeddict->griffe__internal_models griffe__internal_finder->griffe__internal_exceptions griffe__internal_finder->griffe__internal_logger griffe__internal_finder->griffe__internal_models griffe__internal_git->griffe__internal_exceptions griffe__internal_loader->griffe__internal_agents griffe__internal_loader->griffe__internal_agents_inspector griffe__internal_loader->griffe__internal_agents_visitor griffe__internal_loader->griffe__internal_collections griffe__internal_loader->griffe__internal_docstrings griffe__internal_loader->griffe__internal_docstrings_parsers griffe__internal_loader->griffe__internal_enumerations griffe__internal_loader->griffe__internal_exceptions griffe__internal_loader->griffe__internal_expressions griffe__internal_loader->griffe__internal_extensions griffe__internal_loader->griffe__internal_finder griffe__internal_loader->griffe__internal_git griffe__internal_loader->griffe__internal_importer griffe__internal_loader->griffe__internal_logger griffe__internal_loader->griffe__internal_merger griffe__internal_loader->griffe__internal_models griffe__internal_loader->griffe__internal_stats platformdirs platformdirs griffe__internal_loader->platformdirs griffe__internal_merger->griffe__internal_exceptions griffe__internal_merger->griffe__internal_logger griffe__internal_merger->griffe__internal_models griffe__internal_mixins->griffe__internal_encoders griffe__internal_mixins->griffe__internal_enumerations griffe__internal_mixins->griffe__internal_exceptions griffe__internal_mixins->griffe__internal_merger griffe__internal_models->griffe__internal_c3linear griffe__internal_models->griffe__internal_collections griffe__internal_models->griffe__internal_docstrings griffe__internal_models->griffe__internal_docstrings_models griffe__internal_models->griffe__internal_docstrings_parsers griffe__internal_models->griffe__internal_enumerations griffe__internal_models->griffe__internal_expressions griffe__internal_models->griffe__internal_git griffe__internal_models->griffe__internal_logger griffe__internal_models->griffe__internal_mixins griffe__internal_stats->griffe__internal_enumerations griffe__internal_stats->griffe__internal_models griffe__internal_tests->griffe__internal_agents griffe__internal_tests->griffe__internal_agents_inspector griffe__internal_tests->griffe__internal_agents_visitor griffe__internal_tests->griffe__internal_collections griffe__internal_tests->griffe__internal_docstrings griffe__internal_tests->griffe__internal_docstrings_parsers griffe__internal_tests->griffe__internal_enumerations griffe__internal_tests->griffe__internal_extensions griffe__internal_tests->griffe__internal_extensions_base griffe__internal_tests->griffe__internal_loader griffe__internal_tests->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__ Entry-point module, in case you use python -m griffe.
Why does this file exist, and why __main__? For more info, read:
Public API
griffe This top-level module imports all public names from the package, and exposes them as public objects. We have tests to make sure no object is forgotten in this list.
Internal API
The internal API layout doesn't follow any particular paradigm: we simply organize code in different modules, depending on what the code is used for.
agents These modules contain the different agents that are able to extract data.
inspector.py This module contains our dynamic analysis agent, capable of inspecting modules and objects in memory, at runtime.
G cluster_83e76869 File: inspector cluster_251a0ff8 Class: Inspector node_eb904296 123: __init__() node_eb904296->node_eb904296 node_adcd7dcb 175: _get_docstring() node_2246febf 197: _get_linenos() node_45f90e01 263: generic_inspect() node_45f90e01->node_eb904296 node_f851f54f 255: inspect() node_45f90e01->node_f851f54f node_31c96a8b 300: inspect_module() node_45f90e01->node_31c96a8b node_64a885dc 207: get_module() node_64a885dc->node_f851f54f node_5fc3c574 544: handle_attribute() node_5fc3c574->node_adcd7dcb node_bba9df97 445: handle_function() node_bba9df97->node_adcd7dcb node_bba9df97->node_2246febf node_87309abb 625: _convert_object_to_annotation() node_bba9df97->node_87309abb node_bfccb12f 602: _convert_parameter() node_bba9df97->node_bfccb12f node_dc20368e 661: _convert_type_parameters() node_bba9df97->node_dc20368e node_b99c1922 536: inspect_attribute() node_b99c1922->node_5fc3c574 node_37aca3c3 405: inspect_builtin_function() node_37aca3c3->node_bba9df97 node_71bc987a 381: inspect_builtin_method() node_71bc987a->node_bba9df97 node_ad7b3d18 421: inspect_cached_property() node_ad7b3d18->node_bba9df97 node_18d78293 323: inspect_class() node_18d78293->node_adcd7dcb node_18d78293->node_2246febf node_18d78293->node_45f90e01 node_18d78293->node_dc20368e node_5e6d8bc2 365: inspect_classmethod() node_5e6d8bc2->node_bba9df97 node_2030aebf 397: inspect_coroutine() node_2030aebf->node_bba9df97 node_a3db5b32 413: inspect_function() node_a3db5b32->node_bba9df97 node_0c2c7b8d 437: inspect_getset_descriptor() node_0c2c7b8d->node_bba9df97 node_6ab8186e 389: inspect_method() node_6ab8186e->node_bba9df97 node_ee6f3adc 373: inspect_method_descriptor() node_ee6f3adc->node_bba9df97 node_31c96a8b->node_adcd7dcb node_a9936e91 429: inspect_property() node_a9936e91->node_bba9df97 node_bffb2551 357: inspect_staticmethod() node_bffb2551->node_bba9df97 node_9b2d7403 511: inspect_type_alias() node_9b2d7403->node_adcd7dcb node_9b2d7403->node_2246febf node_9b2d7403->node_dc20368e node_3e68990a 704: _convert_type_to_annotation() node_9b2d7403->node_3e68990a node_bfccb12f->node_87309abb node_dc20368e->node_3e68990a node_3e68990a->node_87309abb node_3e68990a->node_3e68990a node_79d57489 55: inspect() node_79d57489->node_eb904296 node_79d57489->node_64a885dc nodes These submodules contain utilities for working with AST and object nodes.
assignments.py This module contains utilities for extracting information from assignment nodes.
G cluster_3faacdb4 File: assignments node_3734668f 40: _get_annassign_names() node_2bd7907f 23: get_name() node_3734668f->node_2bd7907f node_1b7a30fc 35: _get_assign_names() node_1b7a30fc->node_2bd7907f node_1dce6ba6 9: _get_attribute_name() node_1dce6ba6->node_2bd7907f node_b085fd23 63: get_instance_names() node_94bd0f17 51: get_names() node_b085fd23->node_94bd0f17 ast.py This module contains utilities for navigating AST nodes.
G cluster_f7001c55 File: ast node_200a9f40 26: ast_children() node_bd1aeb12 137: ast_first_child() node_bd1aeb12->node_200a9f40 node_3c70c68b 155: ast_last_child() node_3c70c68b->node_200a9f40 node_6d7e124d 119: ast_next() node_900f7d48 66: ast_next_siblings() node_6d7e124d->node_900f7d48 node_900f7d48->node_200a9f40 node_aed6c478 100: ast_previous() node_d4efc23a 50: ast_previous_siblings() node_aed6c478->node_d4efc23a node_d4efc23a->node_200a9f40 node_78370954 82: ast_siblings() node_78370954->node_200a9f40 docstrings.py This module contains utilities for extracting docstrings from nodes.
exports.py This module contains utilities for extracting exports from __all__ assignments.
G cluster_29a6fe51 File: exports node_99d1f307 74: _extract() node_83960059 33: _extract_attribute() node_83960059->node_99d1f307 node_a48a09bb 37: _extract_binop() node_a48a09bb->node_99d1f307 node_58cbea2b 51: _extract_sequence() node_58cbea2b->node_99d1f307 node_bffe0669 58: _extract_starred() node_bffe0669->node_99d1f307 node_7cd566d4 78: get__all__() node_7cd566d4->node_99d1f307 node_b2dd169c 93: safe_get__all__() node_b2dd169c->node_7cd566d4 imports.py This module contains utilities for working with imports and relative imports.
parameters.py This module contains utilities for extracting information from parameter nodes.
runtime.py This module contains utilities for extracting information from runtime objects.
G cluster_85a9d34a File: runtime cluster_01286de6 Class: ObjectNode node_96f08b01 52: __init__() node_fdb529fa 285: _pick_member() node_efb894e6 295: alias_target_path() node_670a0522 36: _same_components() node_efb894e6->node_670a0522 node_c9aaf24b 175: children() node_c9aaf24b->node_96f08b01 node_c9aaf24b->node_fdb529fa values.py This module contains utilities for extracting attribute values.
G cluster_b80fc44a File: values node_23acca13 15: get_value() node_49c92828 29: safe_get_value() node_49c92828->node_23acca13 visitor.py This module contains our static analysis agent, capable of parsing and visiting sources, statically.
G cluster_54c38bd0 File: visitor cluster_7b8fd387 Class: Visitor node_f23eeab4 137: __init__() node_f23eeab4->node_f23eeab4 node_c985a8ff 197: _get_docstring() node_7e1ac9c9 217: _get_type_parameters() node_2c26d08e 353: decorators_to_labels() node_012fdb14 268: generic_visit() node_566d8e9b 260: visit() node_012fdb14->node_566d8e9b node_b1272a1d 371: get_base_property() node_aef28934 246: get_module() node_aef28934->node_566d8e9b node_4c48f895 613: handle_attribute() node_4c48f895->node_c985a8ff node_d841846f 395: handle_function() node_d841846f->node_c985a8ff node_d841846f->node_7e1ac9c9 node_d841846f->node_2c26d08e node_d841846f->node_012fdb14 node_d841846f->node_b1272a1d node_e2dbda09 728: visit_annassign() node_e2dbda09->node_4c48f895 node_9081e4eb 720: visit_assign() node_9081e4eb->node_4c48f895 node_32d7c2ae 509: visit_asyncfunctiondef() node_32d7c2ae->node_d841846f node_59d4a470 300: visit_classdef() node_59d4a470->node_c985a8ff node_59d4a470->node_7e1ac9c9 node_59d4a470->node_2c26d08e node_59d4a470->node_012fdb14 node_cd122c25 501: visit_functiondef() node_cd122c25->node_d841846f node_afb84fc0 757: visit_if() node_afb84fc0->node_012fdb14 node_ed389608 277: visit_module() node_ed389608->node_c985a8ff node_ed389608->node_012fdb14 node_54559da1 520: visit_typealias() node_54559da1->node_c985a8ff node_54559da1->node_7e1ac9c9 node_9a316941 80: visit() node_9a316941->node_f23eeab4 node_9a316941->node_aef28934 c3linear.py This module contains a single function, c3linear_merge. The function is generic enough to be in its own module.
G cluster_be8af50f File: c3linear cluster_c0a6ed1f Class: _Dependency cluster_fe37b6f7 Class: _DependencyList node_92108586 29: tail() node_e49395f6 60: __len__() node_92108586->node_e49395f6 node_04578722 48: __init__() node_de6f1ce1 64: __repr__() node_de6f1ce1->node_de6f1ce1 node_bb397916 82: remove() node_433ac0a1 93: c3linear_merge() node_433ac0a1->node_04578722 node_433ac0a1->node_bb397916 cli.py This module contains all CLI-related things. Why does this file exist, and why not put this in __main__?
We might be tempted to import things from __main__ later, but that will cause problems; the code will get executed twice:
When we run python -m griffe, Python will execute __main__.py as a script. That means there won't be any griffe.__main__ in sys.modules. When you import __main__ it will get executed again (as a module) because there's no griffe.__main__ in sys.modules. G cluster_6443d202 File: cli cluster_a218c17d Class: _DebugInfo node_091955bd 52: __init__() node_091955bd->node_091955bd node_b52b0606 70: _load_packages() node_3a33b6b0 60: _print_data() node_80a0274f 332: dump() node_80a0274f->node_b52b0606 node_80a0274f->node_3a33b6b0 node_c6b87727 131: get_parser() node_24557f47 577: main() node_24557f47->node_c6b87727 collections.py This module contains collection-related classes, which are used throughout the API.
G cluster_4204f5c7 File: collections cluster_c46cd1cc Class: LinesCollection node_bf06d21f 56: items() node_bf06d21f->node_bf06d21f node_f44660b2 40: keys() node_f44660b2->node_f44660b2 node_8827a586 48: values() node_8827a586->node_8827a586 debug.py This module is here to help users report bugs. It provides a function to print environment information, which is called from the public griffe.debug module (when called with python -m griffe.debug) or thanks to the --debug-info CLI flag.
G cluster_53f8b086 File: debug node_b2580302 80: _get_debug_info() node_636452d6 65: _get_version() node_b2580302->node_636452d6 node_96bcd380 54: _interpreter_name_version() node_b2580302->node_96bcd380 node_91643f00 99: _print_debug_info() node_91643f00->node_b2580302 diff.py This module exports "breaking changes" related utilities. The logic here is to iterate on objects and their members recursively, to yield found breaking changes.
The breakage class definitions might sound a bit verbose, but declaring them this way helps with (de)serialization, which we don't use yet, but could use in the future.
G cluster_2cd9ca0a File: diff cluster_14d0c94b Class: Breakage node_b2381795 261: _explain_github() node_cd85f795 204: _format_new_value() node_b2381795->node_cd85f795 node_7df31355 201: _format_old_value() node_b2381795->node_7df31355 node_d05273d3 193: _format_title() node_b2381795->node_d05273d3 node_e8f72f58 241: _explain_markdown() node_e8f72f58->node_cd85f795 node_e8f72f58->node_7df31355 node_ba7b6da0 207: _explain_oneline() node_a396d30b 196: _format_kind() node_ba7b6da0->node_a396d30b node_c3989677 188: _format_location() node_ba7b6da0->node_c3989677 node_ba7b6da0->node_cd85f795 node_ba7b6da0->node_7df31355 node_ba7b6da0->node_d05273d3 node_f9d5b4d9 223: _explain_verbose() node_f9d5b4d9->node_a396d30b node_f9d5b4d9->node_c3989677 node_f9d5b4d9->node_cd85f795 node_f9d5b4d9->node_7df31355 node_f9d5b4d9->node_d05273d3 node_8453578b 562: _alias_incompatibilities() node_4f9be674 599: _type_based_yield() node_8453578b->node_4f9be674 node_8dcd5256 553: _attribute_incompatibilities() node_59527a19 465: _class_incompatibilities() node_a060713f 578: _member_incompatibilities() node_59527a19->node_a060713f node_d3344318 478: _function_incompatibilities() node_b9dd0586 636: _returns_are_compatible() node_d3344318->node_b9dd0586 node_a060713f->node_4f9be674 node_4f9be674->node_8dcd5256 node_4f9be674->node_59527a19 node_4f9be674->node_d3344318 node_c305ee24 660: find_breaking_changes() node_c305ee24->node_a060713f docstrings These submodules define models and parsers for docstrings.
auto.py This module defines functions to parse docstrings by guessing their style.
G cluster_84a80fab File: auto node_8d891196 117: infer_docstring_style() node_e9254679 199: parse_auto() node_e9254679->node_8d891196 google.py This module defines functions to parse Google-style docstrings into structured data.
G cluster_ff621533 File: google node_3db5e7b7 619: _annotation_from_parent() node_d812b294 588: _get_name_annotation_description() node_752eb707 835: _is_empty_line() node_f2ac0220 347: _read_attributes_section() node_b6e794eb 93: _read_block_items() node_f2ac0220->node_b6e794eb node_13e6e908 157: _read_block() node_13e6e908->node_752eb707 node_b6e794eb->node_752eb707 node_4486e073 575: _read_block_items_maybe() node_4486e073->node_13e6e908 node_4486e073->node_b6e794eb node_680c637b 426: _read_classes_section() node_680c637b->node_b6e794eb node_d8a5bd3e 776: _read_examples_section() node_d8a5bd3e->node_752eb707 node_d8a5bd3e->node_13e6e908 node_a3626a5e 389: _read_functions_section() node_a3626a5e->node_b6e794eb node_1f34c96a 488: _read_modules_section() node_1f34c96a->node_b6e794eb node_6da9a6a4 267: _read_other_parameters_section() node_a0f93ec5 188: _read_parameters() node_6da9a6a4->node_a0f93ec5 node_a0f93ec5->node_b6e794eb node_7f4471ca 257: _read_parameters_section() node_7f4471ca->node_a0f93ec5 node_a5b52bc0 516: _read_raises_section() node_a5b52bc0->node_b6e794eb node_8bad68df 730: _read_receives_section() node_8bad68df->node_3db5e7b7 node_8bad68df->node_d812b294 node_8bad68df->node_4486e073 node_f274287f 638: _read_returns_section() node_f274287f->node_3db5e7b7 node_f274287f->node_d812b294 node_f274287f->node_4486e073 node_19549b95 463: _read_type_aliases_section() node_19549b95->node_b6e794eb node_df4a1662 278: _read_type_parameters_section() node_df4a1662->node_b6e794eb node_3165b11a 547: _read_warns_section() node_3165b11a->node_b6e794eb node_151352b2 684: _read_yields_section() node_151352b2->node_3db5e7b7 node_151352b2->node_d812b294 node_151352b2->node_4486e073 node_788e46c1 882: parse_google() node_788e46c1->node_752eb707 node_788e46c1->node_13e6e908 models.py This module contains the models for storing docstrings structured data.
G cluster_409bcd95 File: models cluster_656d73d4 Class: DocstringSection node_51dfdeef 246: as_dict() node_51dfdeef->node_51dfdeef numpy.py This module defines functions to parse Numpy-style docstrings into structured data.
Based on https://numpydoc.readthedocs.io/en/latest/format.html , it seems Numpydoc is a superset of RST. Since fully parsing RST is a non-goal of this project, some things are stripped from the Numpydoc specification.
Rejected as non particularly Pythonic or useful as sections:
See also: this section feels too subjective (specially crafted as a standard for Numpy itself), and there are may ways to reference related items in a docstring, depending on the chosen markup. Rejected as naturally handled by the user-chosen markup:
Warnings: this is just markup. Notes: again, just markup. References: again, just markup. G cluster_e11f91b8 File: numpy node_329a5be4 858: _append_section() node_686dccee 96: _is_dash_line() node_b358b590 92: _is_empty_line() node_686dccee->node_b358b590 node_cdfaf78f 638: _read_attributes_section() node_6aa62720 100: _read_block_items() node_cdfaf78f->node_6aa62720 node_291a37d6 162: _read_block() node_291a37d6->node_686dccee node_291a37d6->node_b358b590 node_6aa62720->node_686dccee node_6aa62720->node_b358b590 node_b1fd557e 709: _read_classes_section() node_b1fd557e->node_6aa62720 node_587c905f 405: _read_deprecated_section() node_587c905f->node_6aa62720 node_4387f1e8 793: _read_examples_section() node_4387f1e8->node_b358b590 node_4387f1e8->node_291a37d6 node_5ad79ad8 677: _read_functions_section() node_5ad79ad8->node_6aa62720 node_3073046f 761: _read_modules_section() node_3073046f->node_6aa62720 node_9cb64607 313: _read_other_parameters_section() node_26da57ef 224: _read_parameters() node_9cb64607->node_26da57ef node_26da57ef->node_6aa62720 node_9b2967fb 298: _read_parameters_section() node_9b2967fb->node_26da57ef node_2429a1a4 588: _read_raises_section() node_2429a1a4->node_6aa62720 node_0842ebce 541: _read_receives_section() node_0842ebce->node_6aa62720 node_6f4afe4e 431: _read_returns_section() node_6f4afe4e->node_6aa62720 node_2c8ffc02 741: _read_type_aliases_section() node_2c8ffc02->node_6aa62720 node_050c96f2 335: _read_type_parameters_section() node_050c96f2->node_6aa62720 node_de49e9c6 613: _read_warns_section() node_de49e9c6->node_6aa62720 node_77817eb1 490: _read_yields_section() node_77817eb1->node_6aa62720 node_a141c833 911: parse_numpy() node_a141c833->node_329a5be4 node_a141c833->node_686dccee node_a141c833->node_b358b590 parsers.py This module imports all the defined parsers and provides a generic function to parse docstrings.
sphinx.py This module defines functions to parse Sphinx docstrings into structured data.
G cluster_574b4b92 File: sphinx cluster_ae4fd771 Class: _FieldType node_68abb74c 50: matches() node_3479ba3c 462: _consolidate_continuation_lines() node_778395bf 475: _consolidate_descriptive_type() node_c3386a82 214: _determine_param_annotation() node_95d02e08 207: _determine_param_default() node_06428699 449: _parse_directive() node_06428699->node_3479ba3c node_60584566 433: _parsed_values_to_sections() node_d10cc1b3 479: _strip_blank_lines() node_60584566->node_d10cc1b3 node_80cd0e13 280: _read_attribute() node_80cd0e13->node_06428699 node_ffb76e37 327: _read_attribute_type() node_ffb76e37->node_778395bf node_ffb76e37->node_06428699 node_a6d1cce7 357: _read_exception() node_a6d1cce7->node_06428699 node_92db26c1 144: _read_parameter() node_92db26c1->node_c3386a82 node_92db26c1->node_95d02e08 node_92db26c1->node_06428699 node_7bc83138 249: _read_parameter_type() node_7bc83138->node_778395bf node_7bc83138->node_06428699 node_4f7857e2 378: _read_return() node_4f7857e2->node_06428699 node_fc90cf72 412: _read_return_type() node_fc90cf72->node_778395bf node_fc90cf72->node_06428699 node_91b5a549 96: parse_sphinx() node_91b5a549->node_68abb74c node_91b5a549->node_60584566 utils.py This module contains utilities for docstrings parsers.
encoders.py This module contains data encoders/serializers and decoders/deserializers. We only support JSON for now, but might want to add more formats in the future.
G cluster_2ae36b76 File: encoders cluster_91cb45d5 Class: JSONEncoder node_043050cd 52: __init__() node_043050cd->node_043050cd node_7d663358 147: _attach_parent_to_expr() node_0b4d7c7e 157: _attach_parent_to_exprs() node_0b4d7c7e->node_7d663358 node_50889f78 279: _load_attribute() node_e0c9f6d9 89: _load_docstring() node_50889f78->node_e0c9f6d9 node_13bf7157 138: _load_git_info() node_50889f78->node_13bf7157 node_6cc8dcfc 225: _load_class() node_6cc8dcfc->node_0b4d7c7e node_8c82f16b 95: _load_decorators() node_6cc8dcfc->node_8c82f16b node_6cc8dcfc->node_e0c9f6d9 node_6cc8dcfc->node_13bf7157 node_4b85ec71 99: _load_expression() node_e1c1a872 257: _load_function() node_e1c1a872->node_8c82f16b node_e1c1a872->node_e0c9f6d9 node_e1c1a872->node_13bf7157 node_7422d949 194: _load_module() node_7422d949->node_0b4d7c7e node_7422d949->node_e0c9f6d9 node_7422d949->node_13bf7157 node_057f0f6f 119: _load_parameter() node_057f0f6f->node_e0c9f6d9 node_6528e6de 314: _load_type_alias() node_6528e6de->node_e0c9f6d9 node_6528e6de->node_13bf7157 node_d603b41d 129: _load_type_parameter() node_2281cd90 344: json_decoder() node_2281cd90->node_4b85ec71 node_2281cd90->node_057f0f6f node_2281cd90->node_d603b41d enumerations.py This module contains all the enumerations of the package.
exceptions.py This module contains all the exceptions specific to Griffe.
expressions.py This module contains the data classes that represent resolvable names and expressions. First we declare data classes for each kind of expression, mostly corresponding to Python's AST nodes. Then we declare builder methods, that iterate AST nodes and build the corresponding data classes, and two utilities _yield and _join to help iterate on expressions. Finally we declare a few public helpers to safely get expressions from AST nodes in different scenarios.
G cluster_7653ee0e File: expressions cluster_f75602f9 Class: Expr cluster_7316e9ca Class: ExprAttribute cluster_b2f0ec95 Class: ExprBinOp cluster_5d7b5da4 Class: ExprBoolOp cluster_d0f8a3c7 Class: ExprCall cluster_e247cee9 Class: ExprCompare cluster_39459fe6 Class: ExprComprehension cluster_d21f19b3 Class: ExprDict cluster_0c72c897 Class: ExprDictComp cluster_b67d0329 Class: ExprExtSlice cluster_d5da4be3 Class: ExprFormatted cluster_6db60f25 Class: ExprGeneratorExp cluster_9fa46e3b Class: ExprIfExp cluster_cfdf6f19 Class: ExprJoinedStr cluster_aac46955 Class: ExprKeyword cluster_3ddbbe35 Class: ExprVarPositional cluster_7f4308f5 Class: ExprVarKeyword cluster_1f235513 Class: ExprLambda cluster_d10a6450 Class: ExprList cluster_2137eb19 Class: ExprListComp cluster_8dd70cfb Class: ExprNamedExpr cluster_b0071c54 Class: ExprSet cluster_788e3fe2 Class: ExprSetComp cluster_cb025d15 Class: ExprSlice cluster_cba5213c Class: ExprSubscript cluster_b19e3bae Class: ExprTuple cluster_fa68e966 Class: ExprUnaryOp cluster_74e54be4 Class: ExprYield cluster_42ad4f64 Class: ExprYieldFrom node_96ad1d98 169: __iter__() node_ba274cfd 173: iterate() node_96ad1d98->node_ba274cfd node_17040b20 166: __str__() node_17040b20->node_ba274cfd node_d3b0e4b3 202: as_dict() node_9392f435 143: _expr_as_dict() node_d3b0e4b3->node_9392f435 node_f299ec58 275: append() node_f299ec58->node_f299ec58 node_cc640590 263: iterate() node_52995cac 1084: _get_precedence() node_cc640590->node_52995cac node_10c4f7f8 66: _yield() node_cc640590->node_10c4f7f8 node_64b954d0 319: iterate() node_64b954d0->node_52995cac node_64b954d0->node_10c4f7f8 node_8830d4e3 339: iterate() node_8830d4e3->node_52995cac node_8830d4e3->node_10c4f7f8 node_601018b2 362: iterate() node_601018b2->node_52995cac node_992a5ab8 109: _join() node_601018b2->node_992a5ab8 node_601018b2->node_10c4f7f8 node_a97db904 380: iterate() node_a97db904->node_52995cac node_a97db904->node_10c4f7f8 node_7cffe6e9 401: iterate() node_7cffe6e9->node_992a5ab8 node_7cffe6e9->node_10c4f7f8 node_e6388e5f 437: iterate() node_e6388e5f->node_992a5ab8 node_4362ac7c 458: iterate() node_4362ac7c->node_992a5ab8 node_4362ac7c->node_10c4f7f8 node_c23d49a3 475: iterate() node_c23d49a3->node_992a5ab8 node_11a16e0d 486: iterate() node_11a16e0d->node_10c4f7f8 node_69205dc8 502: iterate() node_69205dc8->node_992a5ab8 node_69205dc8->node_10c4f7f8 node_53ab5859 519: iterate() node_53ab5859->node_53ab5859 node_53ab5859->node_52995cac node_53ab5859->node_10c4f7f8 node_c7912c7d 544: iterate() node_c7912c7d->node_992a5ab8 node_4d01683b 584: iterate() node_4d01683b->node_10c4f7f8 node_adfb1f66 623: iterate() node_adfb1f66->node_10c4f7f8 node_96409aeb 664: iterate() node_96409aeb->node_992a5ab8 node_8ab5e491 679: iterate() node_8ab5e491->node_992a5ab8 node_8ab5e491->node_10c4f7f8 node_c69591a2 790: iterate() node_c69591a2->node_10c4f7f8 node_f558dac0 817: iterate() node_f558dac0->node_992a5ab8 node_5d568437 832: iterate() node_5d568437->node_992a5ab8 node_5d568437->node_10c4f7f8 node_6e054167 851: iterate() node_6e054167->node_10c4f7f8 node_66f0d1af 879: _to_binop() node_66f0d1af->node_66f0d1af node_fcacc885 871: iterate() node_fcacc885->node_52995cac node_fcacc885->node_10c4f7f8 node_a102ba81 894: modernize() node_a102ba81->node_66f0d1af node_a102ba81->node_a102ba81 node_dd9f72f9 929: iterate() node_dd9f72f9->node_992a5ab8 node_471cb59b 954: iterate() node_471cb59b->node_52995cac node_471cb59b->node_10c4f7f8 node_1520be01 609: iterate() node_1520be01->node_10c4f7f8 node_4eecf187 597: iterate() node_4eecf187->node_10c4f7f8 node_d39daa66 968: iterate() node_d39daa66->node_10c4f7f8 node_178d2ec1 982: iterate() node_178d2ec1->node_10c4f7f8 node_ebea2ff5 1375: _build() node_f59bb0dd 1088: _build_attribute() node_f59bb0dd->node_f299ec58 node_f59bb0dd->node_ebea2ff5 node_c3d63cfb 1100: _build_binop() node_c3d63cfb->node_ebea2ff5 node_df328746 1108: _build_boolop() node_df328746->node_ebea2ff5 node_4df23665 1115: _build_call() node_4df23665->node_ebea2ff5 node_bbcbdde0 1122: _build_compare() node_bbcbdde0->node_ebea2ff5 node_842c487d 1130: _build_comprehension() node_842c487d->node_ebea2ff5 node_8d994774 1139: _build_constant() node_8d994774->node_ebea2ff5 node_ce6ecddf 1178: _build_dict() node_ce6ecddf->node_ebea2ff5 node_d90a3c2a 1185: _build_dictcomp() node_d90a3c2a->node_ebea2ff5 node_dff4e3c4 1193: _build_formatted() node_dff4e3c4->node_ebea2ff5 node_8a7f8e5f 1203: _build_generatorexp() node_8a7f8e5f->node_ebea2ff5 node_d6982718 1210: _build_ifexp() node_d6982718->node_ebea2ff5 node_f3d0a3fe 1218: _build_joinedstr() node_f3d0a3fe->node_ebea2ff5 node_d11326ee 1228: _build_keyword() node_d11326ee->node_ebea2ff5 node_b4c3adad 1234: _build_lambda() node_b4c3adad->node_ebea2ff5 node_04d238a5 1409: safe_get_expression() node_b4c3adad->node_04d238a5 node_f33a523b 1251: _build_list() node_f33a523b->node_ebea2ff5 node_101fa418 1255: _build_listcomp() node_101fa418->node_ebea2ff5 node_d6765a20 1263: _build_named_expr() node_d6765a20->node_ebea2ff5 node_0cf928d5 1267: _build_set() node_0cf928d5->node_ebea2ff5 node_4dece8d3 1271: _build_setcomp() node_4dece8d3->node_ebea2ff5 node_accb3285 1275: _build_slice() node_accb3285->node_ebea2ff5 node_f8779680 1283: _build_starred() node_f8779680->node_ebea2ff5 node_00754032 1287: _build_subscript() node_00754032->node_ebea2ff5 node_c0a2deb9 1316: _build_tuple() node_c0a2deb9->node_ebea2ff5 node_97fdff05 1327: _build_unaryop() node_97fdff05->node_ebea2ff5 node_64c69957 1331: _build_yield() node_64c69957->node_ebea2ff5 node_f5582cc9 1335: _build_yield_from() node_f5582cc9->node_ebea2ff5 node_b8cee39b 132: _field_as_dict() node_9392f435->node_b8cee39b node_b8cee39b->node_b8cee39b node_992a5ab8->node_10c4f7f8 node_10c4f7f8->node_52995cac node_10c4f7f8->node_10c4f7f8 node_0b1541bc 1379: get_expression() node_0b1541bc->node_ebea2ff5 node_04d238a5->node_0b1541bc extensions These submodules contain our extension system, as well as built-in extensions.
base.py This module contains the base class for extensions and the functions to load them.
G cluster_e59940e9 File: base cluster_506b5129 Class: _ExtensionMetaclass cluster_bb17a459 Class: Extension cluster_b95020d9 Class: Extensions node_482cefc7 92: generic_inspect() node_43445e2b 84: inspect() node_482cefc7->node_43445e2b node_84b18b5f 75: generic_visit() node_5075d488 67: visit() node_84b18b5f->node_5075d488 node_3c3c0abf 447: on_alias() node_e7cfc21f 423: on_alias_instance() node_e7cfc21f->node_3c3c0abf node_2327e07f 484: __init__() node_33c00e93 493: add() node_2327e07f->node_33c00e93 node_bdacb15f 35: __new__() node_bdacb15f->node_bdacb15f node_a75f8d2c 539: _load_extension() node_c6882b36 528: _load_extension_path() node_a75f8d2c->node_c6882b36 node_50c4ddd4 630: load_extensions() node_50c4ddd4->node_2327e07f node_50c4ddd4->node_33c00e93 node_50c4ddd4->node_a75f8d2c dataclasses.py Built-in extension adding support for dataclasses.
This extension re-creates __init__ methods of dataclasses during static analysis.
G cluster_41c631bc File: dataclasses cluster_28e32114 Class: DataclassesExtension node_b72a7487 227: on_package() node_7ceb56bc 203: _apply_recursively() node_b72a7487->node_7ceb56bc node_7ceb56bc->node_7ceb56bc node_0723b160 195: _del_members_annotated_as_initvar() node_7ceb56bc->node_0723b160 node_11361d1f 157: _set_dataclass_init() node_7ceb56bc->node_11361d1f node_cf2550e7 49: _dataclass_arguments() node_46e8d0c3 25: _dataclass_decorator() node_cf2550e7->node_46e8d0c3 node_b3d2ded2 32: _expr_args() node_cf2550e7->node_b3d2ded2 node_43b14821 66: _dataclass_parameters() node_43b14821->node_cf2550e7 node_47e7a48e 55: _field_arguments() node_43b14821->node_47e7a48e node_b3d2ded2->node_b3d2ded2 node_47e7a48e->node_b3d2ded2 node_9342b10a 139: _reorder_parameters() node_11361d1f->node_46e8d0c3 node_11361d1f->node_43b14821 node_11361d1f->node_9342b10a unpack_typeddict.py Todo
Support extra_items=type. TODO: Support closed=True/False.
G cluster_55d05620 File: unpack_typeddict cluster_213503fb Class: UnpackTypedDictExtension node_45e41a7d 191: on_class() node_4e6883cb 65: _get_or_set_attrs() node_45e41a7d->node_4e6883cb node_d7348130 170: _params_from_attrs() node_45e41a7d->node_d7348130 node_dad8bce6 109: _update_docstring() node_45e41a7d->node_dad8bce6 node_5e6e050c 218: on_function() node_5e6e050c->node_4e6883cb node_5e6e050c->node_d7348130 node_5e6e050c->node_dad8bce6 node_62ae47b9 29: _unwrap_annotation() node_4e6883cb->node_62ae47b9 finder.py This module contains the code allowing to find modules.
Note: It might be possible to replace a good part of this module's logic with utilities from importlib (however the util in question is private):
>>> from importlib.util import _find_spec
>>> _find_spec ( "griffe.agents" , _find_spec ( "griffe" , None ) . submodule_search_locations )
ModuleSpec(
name='griffe.agents',
loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa5f34e8110>,
origin='/media/data/dev/griffe/src/griffe/agents/__init__.py',
submodule_search_locations=['/media/data/dev/griffe/src/griffe/agents'],
)
G cluster_2cc12d82 File: finder cluster_d58eb6b6 Class: ModuleFinder node_cc3b4589 102: __init__() node_19072e0f 384: _extend_from_pth_files() node_cc3b4589->node_19072e0f node_31401fde 119: append_search_path() node_cc3b4589->node_31401fde node_cce1f1b3 130: _append_search_path() node_9468f244 376: _contents() node_19072e0f->node_9468f244 node_19072e0f->node_31401fde node_03ced0fc 440: _handle_pth_file() node_19072e0f->node_03ced0fc node_dda25b51 393: _filter_py_modules() node_0c69911d 361: _module_name_path() node_c1ad1332 401: _top_module_name() node_6a9c7238 134: insert_search_path() node_c1ad1332->node_6a9c7238 node_31401fde->node_cce1f1b3 node_7e596709 231: find_package() node_7e596709->node_9468f244 node_5927df39 425: _is_pkg_style_namespace() node_7e596709->node_5927df39 node_71e25db9 148: find_spec() node_71e25db9->node_0c69911d node_71e25db9->node_c1ad1332 node_71e25db9->node_7e596709 node_a761bdf9 278: iter_submodules() node_a761bdf9->node_dda25b51 node_a761bdf9->node_a761bdf9 node_9f1a42e4 344: submodules() node_9f1a42e4->node_a761bdf9 node_b8e4d845 470: _handle_editable_module() node_3b2785c8 51: _match_pattern() node_b8e4d845->node_3b2785c8 node_03ced0fc->node_b8e4d845 git.py This module contains Git utilities, used by our load_git function, which in turn is used to load the API for different snapshots of a Git repository and find breaking changes between them.
G cluster_6340c7ad File: git cluster_9c16c833 Class: GitInfo node_58b8b871 241: from_package() node_f8c9015e 217: _get_git_commit_hash() node_58b8b871->node_f8c9015e node_8b99c13f 163: _get_git_known_service() node_58b8b871->node_8b99c13f node_a9cd41f4 137: _get_git_remote_url() node_58b8b871->node_a9cd41f4 node_336d2a47 87: _get_repo_root() node_58b8b871->node_336d2a47 node_1a958c0b 223: _is_tracked() node_58b8b871->node_1a958c0b node_c839ed19 265: get_source_link() node_afdc5218 204: _get_source_link() node_c839ed19->node_afdc5218 node_61effa9d 50: _assert_git_repo() node_d967c0b7 36: _git() node_61effa9d->node_d967c0b7 node_f8c9015e->node_d967c0b7 node_a9cd41f4->node_d967c0b7 node_7b9b093d 67: _get_latest_tag() node_7b9b093d->node_d967c0b7 node_336d2a47->node_d967c0b7 node_1a958c0b->node_d967c0b7 node_e335a0d6 30: _normalize() node_116e21cc 104: _tmp_worktree() node_116e21cc->node_61effa9d node_116e21cc->node_d967c0b7 node_116e21cc->node_e335a0d6 importer.py This module contains utilities to dynamically import objects. These utilities are used by our Inspector to dynamically import objects specified as Python paths, like package.module.Class.method.
G cluster_8e252ef7 File: importer node_930ffd2d 17: _error_details() node_12392e28 43: dynamic_import() node_12392e28->node_930ffd2d node_c6337ec3 22: sys_path() node_12392e28->node_c6337ec3 loader.py This module contains all the logic for loading API data from sources or compiled modules.
G cluster_41d37cc4 File: loader cluster_7edec241 Class: GriffeLoader node_91e6c183 53: __init__() node_46956211 655: _create_module() node_0791b68d 740: _expand_wildcard() node_162990d7 197: _fire_load_events() node_162990d7->node_162990d7 node_0a89b8ad 710: _get_or_create_parent_module() node_0a89b8ad->node_46956211 node_116f4e4d 683: _inspect_module() node_9cccc8b9 556: _load_module() node_5f4bc4c3 575: _load_module_path() node_9cccc8b9->node_5f4bc4c3 node_5f4bc4c3->node_46956211 node_5f4bc4c3->node_116f4e4d node_3e7082fe 600: _load_submodules() node_5f4bc4c3->node_3e7082fe node_3f0d0fab 663: _visit_module() node_5f4bc4c3->node_3f0d0fab node_1c194b05 541: _load_package() node_1c194b05->node_9cccc8b9 node_a28e6397 334: expand_wildcards() node_1c194b05->node_a28e6397 node_4888433f 604: _load_submodule() node_4888433f->node_0a89b8ad node_4888433f->node_9cccc8b9 node_3e7082fe->node_4888433f node_af908ff6 216: _post_load() node_af908ff6->node_162990d7 node_7427c153 293: expand_exports() node_af908ff6->node_7427c153 node_af908ff6->node_a28e6397 node_7427c153->node_7427c153 node_a28e6397->node_0791b68d node_a28e6397->node_a28e6397 node_4f10753a 105: load() node_a28e6397->node_4f10753a node_4f10753a->node_116f4e4d node_4f10753a->node_1c194b05 node_4f10753a->node_af908ff6 node_538d100b 237: resolve_aliases() node_538d100b->node_a28e6397 node_a1b148ef 452: resolve_module_aliases() node_538d100b->node_a1b148ef node_a1b148ef->node_4f10753a node_a1b148ef->node_a1b148ef node_cd252a75 749: load() node_cd252a75->node_91e6c183 node_cd252a75->node_4f10753a node_cd252a75->node_538d100b node_db1b54ad 854: load_git() node_db1b54ad->node_cd252a75 node_8ce429e9 939: load_pypi() node_8ce429e9->node_cd252a75 logger.py This module contains the logger used throughout Griffe. The logger is actually a wrapper around the standard Python logger. We wrap it so that it is easier for other downstream libraries to patch it. For example, mkdocstrings-python patches the logger to relocate it as a child of mkdocs.plugins so that it fits in the MkDocs logging configuration.
We use a single, global logger because our public API is exposed in a single module, griffe. Extensions however should use their own logger, which is why we provide the get_logger function.
G cluster_c41f9e10 File: logger cluster_5e994cd4 Class: Logger node_98e08c39 0: (global)() node_1127fce0 43: _get() node_98e08c39->node_1127fce0 node_d271e543 49: _patch_loggers() node_dad86526 93: get_logger() node_dad86526->node_1127fce0 node_74ef0fc3 105: patch_loggers() node_74ef0fc3->node_d271e543 merger.py This module contains utilities to merge stubs data and concrete data.
G cluster_5aa2f389 File: merger node_b5cb2716 37: _merge_attribute_stubs() node_e5fd127d 49: _merge_stubs_docstring() node_b5cb2716->node_e5fd127d node_c2cad7b8 21: _merge_class_stubs() node_c2cad7b8->node_e5fd127d node_63ed89d0 67: _merge_stubs_members() node_c2cad7b8->node_63ed89d0 node_71695f47 59: _merge_stubs_overloads() node_c2cad7b8->node_71695f47 node_9b96e587 54: _merge_stubs_type_parameters() node_c2cad7b8->node_9b96e587 node_1aa72167 28: _merge_function_stubs() node_1aa72167->node_e5fd127d node_1aa72167->node_9b96e587 node_f20a4be4 15: _merge_module_stubs() node_f20a4be4->node_e5fd127d node_f20a4be4->node_63ed89d0 node_f20a4be4->node_71695f47 node_63ed89d0->node_b5cb2716 node_63ed89d0->node_1aa72167 node_fbbc79fa 44: _merge_type_alias_stubs() node_63ed89d0->node_fbbc79fa node_fbbc79fa->node_e5fd127d node_fbbc79fa->node_9b96e587 node_4cdf0c57 111: merge_stubs() node_4cdf0c57->node_f20a4be4 mixins.py This module contains some mixins classes that hold shared methods of the different kinds of objects, and aliases.
G cluster_34e34e2b File: mixins cluster_1a6f8577 Class: GetMembersMixin cluster_c0656512 Class: DelMembersMixin cluster_e37d9dee Class: SetMembersMixin node_b0a06169 87: __delitem__() node_4c05d91d 22: _get_parts() node_b0a06169->node_4c05d91d node_04465606 114: del_member() node_04465606->node_04465606 node_04465606->node_4c05d91d node_b45c75a8 37: __getitem__() node_b45c75a8->node_4c05d91d node_55664c3a 59: get_member() node_55664c3a->node_55664c3a node_55664c3a->node_4c05d91d node_ec44b08a 142: __setitem__() node_ec44b08a->node_4c05d91d node_79aef96d 168: set_member() node_79aef96d->node_79aef96d node_79aef96d->node_4c05d91d models.py This module contains our models definitions, to represent Python objects (and other aspects of Python APIs)... in Python.
G cluster_2c86758f File: models cluster_82eb8899 Class: Docstring cluster_90cb2cbc Class: Parameter cluster_98c3e84f Class: Parameters cluster_0e14a8ea Class: TypeParameters cluster_1bfd0f60 Class: Object cluster_eadef38d Class: Alias cluster_f63aa45e Class: Class cluster_de159d2c Class: Function node_23e9b0f8 1350: __init__() node_4ce914c6 2163: _update_target_aliases() node_23e9b0f8->node_4ce914c6 node_ef8b5577 2147: _resolve_target() node_8629b76c 2114: resolve_target() node_ef8b5577->node_8629b76c node_f2d2159d 1541: as_json() node_f2d2159d->node_f2d2159d node_fc476f58 1773: filter_members() node_fc476f58->node_fc476f58 node_fbbc86c0 1760: has_labels() node_fbbc86c0->node_fbbc86c0 node_3d6f16e0 1519: inherited_members() node_3d6f16e0->node_23e9b0f8 node_12723eab 1673: is_kind() node_12723eab->node_12723eab node_017f5d64 1499: members() node_017f5d64->node_23e9b0f8 node_c04af135 1480: parent() node_c04af135->node_4ce914c6 node_0334a068 1882: resolve() node_0334a068->node_0334a068 node_fb74cc08 2065: target() node_fb74cc08->node_8629b76c node_e98c2320 2447: _mro() node_e98c2320->node_e98c2320 node_702647f4 2458: mro() node_702647f4->node_e98c2320 node_6314330d 2395: parameters() node_841267ca 308: __init__() node_6314330d->node_841267ca node_476631e4 165: parse() node_31232d36 161: parsed() node_31232d36->node_476631e4 node_e255d358 2488: __init__() node_e255d358->node_841267ca node_8d70b74b 579: __init__() node_a1ca9c5d 488: __init__() node_8d70b74b->node_a1ca9c5d node_7c242026 821: inherited_members() node_7c242026->node_23e9b0f8 node_5ac69289 1197: resolve() node_5ac69289->node_5ac69289 node_47e9d9ef 274: as_dict() node_47e9d9ef->node_47e9d9ef stats.py This module contains utilities to compute loading statistics, like time spent visiting modules statically or dynamically.
G cluster_4a8ec2ea File: stats cluster_1ede3514 Class: Stats node_3a263ce5 20: __init__() node_72a7f1ec 74: _itercount() node_3a263ce5->node_72a7f1ec node_72a7f1ec->node_72a7f1ec tests.py This module contains helpers. They simplify programmatic use of Griffe, for example to load data from strings or to create temporary packages. They are particularly useful for our own tests suite.
G cluster_a9d36fb0 File: tests node_9a912b9a 403: module_vtree() node_fc79a26b 360: vtree() node_9a912b9a->node_fc79a26b node_207d92e8 309: temporary_inspected_module() node_82d05436 54: temporary_pyfile() node_207d92e8->node_82d05436 node_8388eb95 189: temporary_inspected_package() node_23d0295b 72: temporary_pypackage() node_8388eb95->node_23d0295b node_e846004e 263: temporary_visited_module() node_e846004e->node_82d05436 node_6cd76f9e 121: temporary_visited_package() node_6cd76f9e->node_23d0295b