Skip to content

Commit 99c5975

Browse files
committed
docs: Update gallery
1 parent 0fd7b5f commit 99c5975

7 files changed

Lines changed: 232 additions & 196 deletions

File tree

docs/credits.md

Lines changed: 1 addition & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,3 @@
11
```python exec="yes"
2-
def get_credits():
3-
import re
4-
from importlib.metadata import metadata, PackageNotFoundError
5-
from itertools import chain
6-
from pathlib import Path
7-
from textwrap import dedent
8-
9-
import toml
10-
from jinja2 import StrictUndefined
11-
from jinja2.sandbox import SandboxedEnvironment
12-
13-
project_dir = Path(".")
14-
pyproject = toml.load(project_dir / "pyproject.toml")
15-
project = pyproject["project"]
16-
pdm = pyproject["tool"]["pdm"]
17-
lock_data = toml.load(project_dir / "pdm.lock")
18-
lock_pkgs = {pkg["name"].lower(): pkg for pkg in lock_data["package"]}
19-
project_name = project["name"]
20-
regex = re.compile(r"(?P<dist>[\w.-]+)(?P<spec>.*)$")
21-
22-
def get_license(pkg_name):
23-
try:
24-
data = metadata(pkg_name)
25-
except PackageNotFoundError:
26-
return "?"
27-
license = data.get("License", "").replace("UNKNOWN", "")
28-
if not license:
29-
for header, value in data.items():
30-
if header == "Classifier" and value.startswith("License ::"):
31-
license = value.rsplit("::", 1)[1]
32-
return license or "?"
33-
34-
def get_deps(base_deps):
35-
deps = {}
36-
for dep in base_deps:
37-
parsed = regex.match(dep).groupdict()
38-
dep_name = parsed["dist"].lower()
39-
deps[dep_name] = {"license": get_license(dep_name), **parsed, **lock_pkgs[dep_name]}
40-
41-
again = True
42-
while again:
43-
again = False
44-
for pkg_name in lock_pkgs:
45-
if pkg_name in deps:
46-
for pkg_dependency in lock_pkgs[pkg_name].get("dependencies", []):
47-
parsed = regex.match(pkg_dependency).groupdict()
48-
dep_name = parsed["dist"].lower()
49-
if dep_name not in deps:
50-
deps[dep_name] = {"license": get_license(dep_name), **parsed, **lock_pkgs[dep_name]}
51-
again = True
52-
53-
return deps
54-
55-
dev_dependencies = get_deps(chain(*pdm.get("dev-dependencies", {}).values()))
56-
prod_dependencies = get_deps(
57-
chain(
58-
project.get("dependencies", []),
59-
chain(*project.get("optional-dependencies", {}).values()),
60-
)
61-
)
62-
63-
template_data = {
64-
"project_name": project_name,
65-
"prod_dependencies": sorted(prod_dependencies.values(), key=lambda dep: dep["name"]),
66-
"dev_dependencies": sorted(dev_dependencies.values(), key=lambda dep: dep["name"]),
67-
"more_credits": "http://pawamoy.github.io/credits/",
68-
}
69-
template_text = dedent(
70-
"""
71-
These projects were used to build `{{ project_name }}`. **Thank you!**
72-
73-
[`python`](https://www.python.org/) |
74-
[`pdm`](https://pdm.fming.dev/) |
75-
[`copier-pdm`](https://github.com/pawamoy/copier-pdm)
76-
77-
{% macro dep_line(dep) -%}
78-
[`{{ dep.name }}`](https://pypi.org/project/{{ dep.name }}/) | {{ dep.summary }} | {{ ("`" ~ dep.spec ~ "`") if dep.spec else "" }} | `{{ dep.version }}` | {{ dep.license }}
79-
{%- endmacro %}
80-
81-
### Runtime dependencies
82-
83-
Project | Summary | Version (accepted) | Version (last resolved) | License
84-
------- | ------- | ------------------ | ----------------------- | -------
85-
{% for dep in prod_dependencies -%}
86-
{{ dep_line(dep) }}
87-
{% endfor %}
88-
89-
### Development dependencies
90-
91-
Project | Summary | Version (accepted) | Version (last resolved) | License
92-
------- | ------- | ------------------ | ----------------------- | -------
93-
{% for dep in dev_dependencies -%}
94-
{{ dep_line(dep) }}
95-
{% endfor %}
96-
97-
**[More credits from the author]({{ more_credits }})**
98-
"""
99-
)
100-
jinja_env = SandboxedEnvironment(undefined=StrictUndefined)
101-
return jinja_env.from_string(template_text).render(**template_data)
102-
103-
104-
output_markdown(get_credits())
2+
--8<-- "scripts/gen_credits.py"
1053
```

docs/examples.md

Lines changed: 0 additions & 23 deletions
This file was deleted.

docs/gallery.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
## Draw a graph of module inter-dependencies with [pydeps](https://github.com/thebjorn/pydeps)
2+
3+
```python exec="true" show_source="tabbed-right" isolate="yes"
4+
from pydeps import cli, colors, py2depgraph, dot
5+
from pydeps.pydeps import depgraph_to_dotsrc
6+
from pydeps.target import Target
7+
8+
cli.verbose = cli._not_verbose
9+
options = cli.parse_args(["src/markdown_exec", "--noshow"])
10+
colors.START_COLOR = options["start_color"]
11+
target = Target(options["fname"])
12+
with target.chdir_work():
13+
dep_graph = py2depgraph.py2dep(target, **options)
14+
dot_src = depgraph_to_dotsrc(target, dep_graph, **options)
15+
svg = dot.call_graphviz_dot(dot_src, "svg").decode()
16+
svg = "".join(svg.splitlines()[6:])
17+
svg = svg.replace('fill="white"', 'fill="transparent"')
18+
modules_map = {
19+
"markdown_exec": "../reference/markdown_exec/",
20+
"markdown_exec_python": "../reference/markdown_exec/python/",
21+
"markdown_exec_utils": "../reference/markdown_exec/utils/",
22+
}
23+
for title, href in modules_map.items():
24+
title_tag = f"<title>{title}</title>"
25+
svg = svg.replace(title_tag, f'<a href="{href}">' + title_tag)
26+
svg = svg.replace("</text></g>", "</text></a></g>")
27+
output_html(svg)
28+
```
29+
30+
## Run a Python module and print its output
31+
32+
```python exec="true" show_source="tabbed-right" isolate="yes"
33+
import argparse
34+
import sys
35+
import warnings
36+
from contextlib import suppress
37+
from io import StringIO
38+
from runpy import run_module
39+
40+
old_argv = list(sys.argv)
41+
sys.argv = ["mkdocs"]
42+
old_stdout = sys.stdout
43+
sys.stdout = StringIO()
44+
warnings.filterwarnings("ignore", category=RuntimeWarning)
45+
with suppress(SystemExit):
46+
run_module("mkdocs", run_name="__main__")
47+
output = sys.stdout.getvalue()
48+
sys.stdout = old_stdout
49+
sys.argv = old_argv
50+
51+
output_markdown(f"```\n{output}\n```")
52+
```
53+
54+
## Format help of a CLI tool based on argparse in a code block
55+
56+
```python exec="true" show_source="tabbed-right" isolate="yes"
57+
from duty.cli import get_parser
58+
parser = get_parser()
59+
output_markdown(f"```\n{parser.format_help()}\n```")
60+
```
61+
62+
## Format help of a CLI tool based on argparse as Markdown
63+
64+
```python exec="true" show_source="tabbed-right" isolate="yes"
65+
import argparse
66+
from duty.cli import get_parser
67+
parser = get_parser()
68+
lines = []
69+
lines.append(f"## duty")
70+
if parser.description:
71+
lines.append(parser.description)
72+
lines.append("\nOptions:\n")
73+
for action in parser._actions:
74+
opts = [f"`{opt}`" for opt in action.option_strings]
75+
if not opts:
76+
continue
77+
line = "- " + ",".join(opts)
78+
if action.metavar:
79+
line += f" `{action.metavar}`"
80+
line += f": {action.help}"
81+
if action.default and action.default != argparse.SUPPRESS:
82+
line += f"(default: {action.default})"
83+
lines.append(line)
84+
output_markdown("\n".join(lines))
85+
```
86+
87+
## Draw a diagram using the Diagrams library
88+
89+
```python exec="true" show_source="tabbed-right"
90+
from base64 import b64encode
91+
from contextlib import suppress
92+
from diagrams import Diagram, setdiagram
93+
from diagrams.k8s.clusterconfig import HPA
94+
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
95+
from diagrams.k8s.network import Ingress, Service
96+
97+
with suppress(FileNotFoundError):
98+
with Diagram("Exposed Pod with 3 Replicas", show=False) as diagram:
99+
diagram.render = lambda: None
100+
net = Ingress("domain.com") >> Service("svc")
101+
net >> [Pod("pod1"),
102+
Pod("pod2"),
103+
Pod("pod3")] << ReplicaSet("rs") << Deployment("dp") << HPA("hpa")
104+
png = b64encode(diagram.dot.pipe(format="png")).decode()
105+
106+
output_html(f'<img src="data:image/png;base64, {png}"/>')
107+
```

markdown_exec.svg

Lines changed: 0 additions & 63 deletions
This file was deleted.

mkdocs.yml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ site_dir: "site"
88
nav:
99
- Home:
1010
- Overview: index.md
11-
- Examples: examples.md
1211
- Changelog: changelog.md
1312
- Credits: credits.md
1413
- License: license.md
14+
- Gallery: gallery.md
1515
# defer to gen-files + literate-nav
16-
# - Code Reference: reference/
16+
- Code Reference: reference/
1717
- Development:
1818
- Contributing: contributing.md
1919
- Code of Conduct: code_of_conduct.md
@@ -69,15 +69,28 @@ markdown_extensions:
6969

7070
plugins:
7171
- search
72-
# - gen-files:
73-
# scripts:
74-
# - docs/gen_credits.py
75-
# - docs/gen_ref_nav.py
72+
- gen-files:
73+
scripts:
74+
- docs/gen_ref_nav.py
7675
- literate-nav:
7776
nav_file: SUMMARY.md
7877
- coverage
7978
- section-index
8079
- mkdocstrings:
80+
handlers:
81+
python:
82+
import:
83+
- https://docs.python.org/3/objects.inv
84+
selection:
85+
docstring_style: google
86+
docstring_options:
87+
ignore_init_summary: yes
88+
rendering:
89+
show_submodules: no
90+
# docstring_section_style: list
91+
members_order: alphabetical
92+
show_category_heading: no
93+
merge_init_into_class: yes
8194
watch:
8295
- src/markdown_exec
8396

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ docs = [
5656
"mkdocs-literate-nav>=0.4",
5757
"mkdocs-material>=7.3",
5858
"mkdocs-section-index>=0.3",
59-
"mkdocstrings>=0.16",
59+
"mkdocstrings[python]>=0.18",
6060
"toml>=0.10",
6161
"pydeps>=1.10.12",
6262
"markdown-callouts>=0.2.0",
63+
"diagrams>=0.21.1",
6364
]
6465
format = [
6566
"autoflake>=1.4",

0 commit comments

Comments
 (0)