Documentation
init
Generates the documentation via MkDocGenerator
with the links to the source.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
dest_dir | Union[str, pathlib.Path] | Destination of the generated documentation. | required |
documentation | Dict[str, Dict[str, List[str]]] | A nested dictionary with the page title, the page filename, and the functions /classes / methods names of the page. The dictionary should look like: | required |
project_url | Union[str, Dict[str, str]] | The URL, where the project is hosted and where it should be linked to (including branch and storage). | None |
template_dir | Union[str, pathlib.Path] | Directory of template files. If template has to be automatically filled out, then the keyword {{autogenerated}} has to be used. | None |
example_dir | Union[str, pathlib.Path] | Directory of example files, especially suitable for | None |
markdown_files | Dict[str, Dict[str, List[str]]] | A nested dictionary with the page title, the page filename, and the link to already existing markdown files like README.md or LICENSE. The dictionary should look like: | None |
titles_size | str | Defines the initial title size for the headings, which are scaled down by the factor of one "#". | '#' |
underline_title | bool | Underline titles of classes, functions, and methods. | False |
source | str | Name of the source link. | '**source code**' |
About documentation
In terms of linking to the project_url, it has to be separated between specific and general linking. If functions or method has to be separately linked, then each module of the class Documentation
has to be called individually like:
pages = {
"Documentation": {
"auto_generator.md": [
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.__init__",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.render_to_markdown",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.initialize_generate",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_docs",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_static",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate",
]
}
}
Documentation
is enough. It will be only generated one single link to the start of the class. pages = {
"Documentation": {
"auto_generator.md": [
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator",
}
}
About source
Instead of using a string for source = "**source code**"
, icons can be used instead or as combination of string + icon(s) like.
source = ":material-github::material-source-branch: source-code"
mdl
by material
. About project_url
Keep in mind, that the name of the branch like master, main, or dev, as well as, the name of the storage like blob for GitHub has to be included.
Source code in mkdocstrings_sourcelink/auto_generator.py
def __init__(
self,
dest_dir: Union[str, Path],
documentation: Dict[str, Dict[str, List[str]]],
project_url: Union[str, Dict[str, str]] = None,
template_dir: Union[str, Path] = None,
example_dir: Union[str, Path] = None,
markdown_files: Dict[str, Dict[str, List[str]]] = None,
titles_size: str = "#",
underline_title: bool = False,
source: str = "**source code**",
) -> None:
"""Generates the documentation via `MkDocGenerator` with the links to the source.
Args:
dest_dir (Union[str, Path]): Destination of the generated documentation.
documentation (Dict[str, Dict[str, List[str]]], optional): A nested dictionary with the
page title, the page filename, and the functions /classes / methods names of the
page. The dictionary should look like:
`pages = {'page_title':{'filename.md': ['package.module.function']}}`.
project_url (Union[str, Dict[str, str]], optional): The URL, where the project is
hosted and where it should be linked to (including branch and storage).
template_dir (Union[str, Path], optional): Directory of template files. If template has
to be automatically filled out, then the keyword **{{autogenerated}}** has to be
used.
example_dir (Union[str, Path], optional): Directory of example files, especially
suitable for `Jupyter-Notebooks`.
markdown_files (Dict[str, Dict[str, List[str]]], optional): A nested dictionary with
the page title, the page filename, and the link to already existing markdown files
like **README.md** or **LICENSE**. The dictionary should look like:
`pages = {'page_title':{'filename.md': ['existing_file.md']}}`.
titles_size (str, optional): Defines the initial title size for the headings, which are
scaled down by the factor of one "#".
underline_title (bool, optional): Underline titles of classes, functions, and methods.
source (str, optional): Name of the source link.
!!! info "About *documentation*"
In terms of linking to the project_url, it has to be separated between *specific* and
*general* linking. If functions or method has to be separately linked, then each
module of the class `Documentation` has to be called individually like:
```python
pages = {
"Documentation": {
"auto_generator.md": [
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.__init__",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.render_to_markdown",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.initialize_generate",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_docs",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_static",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate",
]
}
}
```
If functions or method has to be generally linked, then just call the class
`Documentation` is enough. It will be only generated one single link to the start of
the class.
```python
pages = {
"Documentation": {
"auto_generator.md": [
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator",
}
}
```
For more information, please check: **mkdocstrings**
https://github.com/pawamoy/mkdocstrings
!!! tip "About *source*"
Instead of using a string for `source = "**source code**"`, icons can be used instead
or as combination of string + icon(s) like.
```python
source = ":material-github::material-source-branch: source-code"
```
In case of using material-icons, please check https://pictogrammers.github.io/@mdi/font/5.4.55/
and replace `mdl` by `material`.
!!! warning "About *project_url*"
Keep in mind, that the name of the branch like *master*, *main*, or *dev*, as well as,
the name of the storage like *blob* for GitHub has to be included.
"""
self.dest_dir = Path(dest_dir)
self.documentation = documentation
self.project_url = project_url
self.template_dir = Utilities.return_as_Path(template_dir)
self.example_dir = Utilities.return_as_Path(example_dir)
self.markdown_files = markdown_files
self.titles_size = titles_size
self.underline_title = underline_title
self.source = source
render_to_markdown
Rendering the element path to mkdocstrings.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
element | str | String of they python class, function, or method, which has to be converted to a string in the mkdocstrings format. | required |
Returns:
Type | Description |
---|---|
str | str: Return of the initial string which looks like |
Source code in mkdocstrings_sourcelink/auto_generator.py
def render_to_markdown(self, element: str) -> str:
"""Rendering the element path to mkdocstrings.
Args:
element (str): String of they python class, function, or method, which has to be
converted to a string in the mkdocstrings format.
Returns:
str: Return of the initial string which looks like
`mkdocstrings_sourcelink.auto_generator.MkDocGenerator.__init__` into a markdown
conformed string.
"""
object_ = Utilities.import_object(element)
subblocks = []
if self.project_url:
subblocks.append(
Utilities.make_source_link(object_, self.project_url, self.source)
)
subblocks.append(
Utilities.make_title(object_, self.titles_size, self.underline_title)
)
subblocks.append(Utilities.element_to_mkdocstrings(element, self.titles_size))
return "\n\n".join(subblocks) + "\n\n"
initialize_generate
Initialization of the auto documentation generatorion.
- Firs removing a possible existing target directory (
dest_dir
). - Copy templates from the template directory the target directory(
dest_dir
). - Copy example from the example directory the target directory (
dest_dir
).
Source code in mkdocstrings_sourcelink/auto_generator.py
def initialize_generate(self) -> None:
"""Initialization of the auto documentation generatorion.
1. Firs removing a possible existing target directory (`dest_dir`).
2. Copy templates from the template directory the target directory(`dest_dir`).
3. Copy example from the example directory the target directory (`dest_dir`).
"""
if self.dest_dir.exists():
print(f"Cleaning up existing sources directory '{self.dest_dir}'.")
shutil.rmtree(self.dest_dir)
if self.template_dir:
print(
f"...copying existing sources directory '{self.template_dir}' to '{self.dest_dir}'."
)
shutil.copytree(self.template_dir, self.dest_dir)
if self.example_dir:
print(
f"...copying existing sources directory '{self.example_dir}' to '{self.dest_dir}'."
)
shutil.copytree(self.example_dir, self.dest_dir)
generate_docs
Generated dynamic documentation based on calling the elements via dictionary.
Source code in mkdocstrings_sourcelink/auto_generator.py
def generate_docs(self) -> None:
"""Generated *dynamic* documentation based on calling the elements via dictionary."""
for title, documentation in self.documentation.items():
markdown_text = f"{self.titles_size} {title}\n\n---\n\n"
for file_path, elements in documentation.items():
markdown_text += "".join(
self.render_to_markdown(element) for element in elements
)
Utilities.insert_in_file(markdown_text, self.dest_dir.joinpath(file_path))
generate_static
Generate static documentation based on existing markdown files.
Source code in mkdocstrings_sourcelink/auto_generator.py
def generate_static(self) -> None:
"""Generate *static* documentation based on existing markdown files."""
if self.markdown_files:
for _, markdown_files in self.markdown_files.items():
markdown_text = ""
for file_path, elements in markdown_files.items():
markdown_text += "".join(
Path(element).read_text() for element in elements
)
Utilities.insert_in_file(
markdown_text, self.dest_dir.joinpath(file_path)
)
generate
The property generate
of MkDocGenerator
creates the final markdown files.
Example: How to use
>>> from pathlib import Path
# Import mkdocstrings-sourcelink
>>> from mkdocstrings_sourcelink import MkDocGenerator
# Define the dictionary for the documentation
>>> pages = {
"Documentation": {
"auto_generator.md": [
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.__init__",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.render_to_markdown",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.initialize_generate",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_docs",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate_static",
"mkdocstrings_sourcelink.auto_generator.MkDocGenerator.generate",
]
},
"Tools": {
"toolbox.md": [
"mkdocstrings_sourcelink.toolbox.Utilities.insert_in_file",
"mkdocstrings_sourcelink.toolbox.Utilities.element_to_mkdocstrings",
"mkdocstrings_sourcelink.toolbox.Utilities.make_source_link",
"mkdocstrings_sourcelink.toolbox.Utilities.make_title",
"mkdocstrings_sourcelink.toolbox.Utilities.import_object",
"mkdocstrings_sourcelink.toolbox.Utilities.return_as_Path",
],
},
}
# Define the dictionary for the importing existing markdown files.
>>> markdown_files = {
"HOME": {"index.md": ["../README.md"]},
"CONTRIBUTING": {"contributing.md": ["../CONTRIBUTING.md"]},
"LICENSE": {"license.md": ["../LICENSE"]},
}
>>> root = Path(__file__).resolve().parents[1]
# Make use of the generate poperty of MkDocGenerator
>>> MkDocGenerator(
root / "docs" / "src",
pages,
"https://github.com/AI2Business/mkdocstrings-sourcelink/blob/main",
markdown_files=markdown_files,
underline_title=True,
source=":material-github::material-source-branch:",
).generate
>>> ...