Skip to content

Commit

Permalink
refactor: Improve credits generation
Browse files Browse the repository at this point in the history
Co-authored-by: Timothée Mazzucotelli <[email protected]>
Issue #22: #22
PR #24: #24
  • Loading branch information
rachmadaniHaryono authored Dec 27, 2021
1 parent e2bc6a6 commit 6b42eef
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 33 deletions.
26 changes: 25 additions & 1 deletion project/docs/credits.md
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
{{ credits() }}
<!-- Template repository: https://github.com/pawamoy/jinja-templates
Template path: credits.md
-->

# Credits
{% set data = get_credits_data() %}
These projects were used to build `{{ data.project_name }}`. **Thank you!**

[`python`](https://www.python.org/) |
[`poetry`](https://poetry.eustace.io/) |
[`copier-poetry`](https://github.com/pawamoy/copier-poetry)


{% for var, title in ((data.direct_dependencies, 'Run dependencies'), (data.dev_dependencies, 'Development dependencies'), (data.indirect_dependencies, 'Indirect dependencies')) %}
{% if var %}
### {{title}}
| Package | Description | Version | License |
| ------- | ----------- | ------- | ------- |
{% for dep in var %}
{%- with package = data.package_info.get(dep, {}) -%}
| [{{ package.get("name", dep) }}]({{ package.get("homepage", "") }}) | {{package.get('summary', '')}} | {{package.get('version', '')}} | {{package.get('license', '')}} |
{%- endwith %}
{% endfor %}
{% endif %}
{%- endfor %}
47 changes: 15 additions & 32 deletions project/docs/macros.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
"""Macros and filters made available in Markdown pages."""

import functools
from itertools import chain
from pathlib import Path

import httpx
import toml
from jinja2 import StrictUndefined
from jinja2.sandbox import SandboxedEnvironment
from pip._internal.commands.show import search_packages_info # noqa: WPS436 (no other way?)


Expand All @@ -23,17 +19,22 @@ def get_credits_data() -> dict:
lock_data = toml.load(project_dir / "poetry.lock")
project_name = metadata["name"]

poetry_dependencies = chain(metadata["dependencies"].keys(), metadata["dev-dependencies"].keys())
direct_dependencies = {dep.lower() for dep in poetry_dependencies}
direct_dependencies = set(metadata["dependencies"].keys())
direct_dependencies.remove("python")
indirect_dependencies = {pkg["name"].lower() for pkg in lock_data["package"]}
indirect_dependencies -= direct_dependencies
dependencies = direct_dependencies | indirect_dependencies
dev_dependencies = set(metadata["dev-dependencies"].keys())
poetry_dependencies = set(chain(direct_dependencies, dev_dependencies))
indirect_dependencies = {
pkg["name"].lower() for pkg in lock_data["package"] if pkg["name"].lower() not in poetry_dependencies
}

packages = {}
for pkg in search_packages_info(list(dependencies)):
pkg = {_: pkg[_] for _ in ("name", "home-page")} # type: ignore
packages[pkg["name"].lower()] = pkg # type: ignore
all_pkgs = poetry_dependencies.copy()
all_pkgs.update(indirect_dependencies)
for pkg in search_packages_info(list(all_pkgs)):
# NOTE walrus can be used
name = pkg.name
if name:
packages[name.lower()] = {key: getattr(pkg, key) for key in dir(pkg) if not key.startswith("_")}

# all packages might not be credited,
# like the ones that are now part of the standard library
Expand All @@ -44,27 +45,12 @@ def get_credits_data() -> dict:
return {
"project_name": project_name,
"direct_dependencies": sorted(direct_dependencies),
"dev_dependencies": sorted(dev_dependencies),
"indirect_dependencies": sorted(indirect_dependencies),
"package_info": packages,
}


@functools.lru_cache(maxsize=None)
def get_credits():
"""
Return credits as Markdown.
Returns:
The credits page Markdown.
"""
jinja_env = SandboxedEnvironment(undefined=StrictUndefined)
commit = "166758a98d5e544aaa94fda698128e00733497f4"
template_url = f"https://raw.githubusercontent.com/pawamoy/jinja-templates/{commit}/credits.md"
template_data = get_credits_data()
template_text = httpx.get(template_url).text
return jinja_env.from_string(template_text).render(**template_data)


def define_env(env):
"""
Add macros and filters into the Jinja2 environment.
Expand All @@ -75,7 +61,4 @@ def define_env(env):
Arguments:
env: An object used to add macros and filters to the environment.
"""

@env.macro # noqa: WPS430 (nested function)
def credits(): # noqa: WPS430
return get_credits()
env.macro(get_credits_data, "get_credits_data")

0 comments on commit 6b42eef

Please sign in to comment.