11"""Macros and filters made available in Markdown pages."""
22
3- import functools
3+ import re
44from itertools import chain
55from pathlib import Path
66
7- import httpx
87import toml
9- from jinja2 import StrictUndefined
10- from jinja2 .sandbox import SandboxedEnvironment
118from pip ._internal .commands .show import search_packages_info # noqa: WPS436 (no other way?)
129
1310
@@ -19,19 +16,23 @@ def get_credits_data() -> dict:
1916 Data required to render the credits template.
2017 """
2118 project_dir = Path (__file__ ).parent .parent
22- metadata = toml .load (project_dir / "pyproject.toml" )["tool" ]["poetry" ]
23- lock_data = toml .load (project_dir / "poetry.lock" )
19+ metadata = toml .load (project_dir / "pyproject.toml" )["project" ]
20+ metadata_pdm = toml .load (project_dir / "pyproject.toml" )["tool" ]["pdm" ]
21+ lock_data = toml .load (project_dir / "pdm.lock" )
2422 project_name = metadata ["name" ]
2523
26- poetry_dependencies = chain (metadata ["dependencies" ].keys (), metadata ["dev-dependencies" ].keys ())
27- direct_dependencies = {dep .lower () for dep in poetry_dependencies }
28- direct_dependencies .remove ("python" )
24+ all_dependencies = chain (
25+ metadata .get ("dependencies" , []),
26+ chain (* metadata .get ("optional-dependencies" , {}).values ()),
27+ chain (* metadata_pdm .get ("dev-dependencies" , {}).values ()),
28+ )
29+ direct_dependencies = {re .sub (r"[^\w-].*$" , "" , dep ) for dep in all_dependencies }
30+ direct_dependencies = {dep .lower () for dep in direct_dependencies }
2931 indirect_dependencies = {pkg ["name" ].lower () for pkg in lock_data ["package" ]}
3032 indirect_dependencies -= direct_dependencies
31- dependencies = direct_dependencies | indirect_dependencies
3233
3334 packages = {}
34- for pkg in search_packages_info (dependencies ):
35+ for pkg in search_packages_info (direct_dependencies | indirect_dependencies ): # type: ignore
3536 pkg = {_ : pkg [_ ] for _ in ("name" , "home-page" )}
3637 packages [pkg ["name" ].lower ()] = pkg
3738
@@ -49,22 +50,6 @@ def get_credits_data() -> dict:
4950 }
5051
5152
52- @functools .lru_cache (maxsize = None )
53- def get_credits ():
54- """
55- Return credits as Markdown.
56-
57- Returns:
58- The credits page Markdown.
59- """
60- jinja_env = SandboxedEnvironment (undefined = StrictUndefined )
61- commit = "166758a98d5e544aaa94fda698128e00733497f4"
62- template_url = f"https://raw.githubusercontent.com/pawamoy/jinja-templates/{ commit } /credits.md"
63- template_data = get_credits_data ()
64- template_text = httpx .get (template_url ).text
65- return jinja_env .from_string (template_text ).render (** template_data )
66-
67-
6853def define_env (env ):
6954 """
7055 Add macros and filters into the Jinja2 environment.
@@ -75,7 +60,13 @@ def define_env(env):
7560 Arguments:
7661 env: An object used to add macros and filters to the environment.
7762 """
63+ env .variables .update (get_credits_data ())
64+
65+ @env .macro # noqa: WPS430
66+ def cite_package (info , name ): # noqa: WPS430
67+ package = info .get (name , {})
68+ return f"[`{ package .get ('name' , name )} `]({ package .get ('home-page' , '' )} )"
7869
79- @env .macro # noqa: WPS430 (nested function)
80- def credits ( ): # noqa: WPS430
81- return get_credits ( )
70+ @env .macro # noqa: WPS430
71+ def cite_packages ( info , names ): # noqa: WPS430
72+ return " | " . join ( cite_package ( info , name ) for name in names )
0 commit comments