Coverage for .nox/test/lib/python3.12/site-packages/mkdocs_licenseinfo/render_markdown.py: 91%
47 statements
« prev ^ index » next coverage.py v7.3.4, created at 2023-12-27 09:44 +0000
« prev ^ index » next coverage.py v7.3.4, created at 2023-12-27 09:44 +0000
1"""Get licenses and convert to markdown."""
2from __future__ import annotations
4import json
5import os
6from pathlib import Path
7import sys
9if sys.version_info.major >= 3 and sys.version_info.minor >= 10:
10 from importlib.metadata import entry_points
11else:
12 from backports.entry_points_selectable import entry_points
14from jinja2 import Environment
16from mkdocs_licenseinfo.get_licenses import get_licenses
18PACKAGE_TEMPLATE = "# [{{package.name}}]({{package.homePage}})\n{% for license in package.licenses %}``{{license}}`` {% endfor %} \n*Version Checked: {{package.version}}* \nAuthor: {{package.author}}"
21class _EnvironmentFactory():
22 """Jinja2 Environment Factory to allow for extension/customisation.
24 Adapted from https://djpugh.github.io/nskit.
25 """
27 def __init__(self):
28 """Initialise the factory."""
29 self._environment = None
31 @property
32 def environment(self) -> Environment:
33 """Handle caching the environment object so it is lazily initialised."""
34 if self._environment is None:
35 self._environment = self.get_environment()
36 self.add_extensions(self._environment)
37 return self._environment
39 def add_extensions(self, environment: Environment):
40 """Add Extensions to the environment object."""
41 # Assuming no risk of extension clash
42 extensions = []
43 # Load from JSON
44 for ext in json.loads(os.environ.get('MKDOCS_LICENSEINFO_JINJA_EXTENSIONS', '[]')):
45 extensions.append(ext)
46 for extension in list(set(extensions)):
47 environment.add_extension(extension)
49 def get_environment(self) -> Environment:
50 """Get the environment object based on the env var."""
51 selected_method = os.environ.get('MKDOCS_LICENSEINFO_JINJA_ENVIRONMENT_FACTORY', None)
52 if selected_method is None or selected_method.lower() == 'default':
53 # This is our simple implementation
54 selected_method = 'default'
55 for ep in entry_points().select(group='mkdocs_licenseinfo.jinja_environment_factory', name=selected_method):
56 return ep.load()()
58 @staticmethod
59 def default_environment():
60 """Get the default environment object."""
61 return Environment() # nosec B701
64JINJA_ENVIRONMENT_FACTORY = _EnvironmentFactory()
67def get_licenses_as_markdown(
68 using='PEP631',
69 ignore_packages: list[str] | None = None,
70 fail_packages: list[str] | None = None,
71 skip_packages: list[str] | None = None,
72 ignore_licenses: list[str] | None = None,
73 fail_licenses: list[str] | None = None,
74 diff: str | None = None,
75 package_template: str | None = PACKAGE_TEMPLATE,
76 path: str | Path | None = None
77):
78 """Get the licenses and render them as markdown strings."""
79 jinja_environment = JINJA_ENVIRONMENT_FACTORY.environment
80 packages = get_licenses(using, ignore_packages, fail_packages, skip_packages, ignore_licenses, fail_licenses, path=path)
81 diff_packages = []
82 if diff:
83 diff_packages = get_licenses(diff, ignore_packages, fail_packages, skip_packages, ignore_licenses, fail_licenses, path=path)
84 selected_package_names = list({u['name'] for u in packages} - {u['name'] for u in diff_packages})
85 selected_packages = [u for u in packages if u['name'] in selected_package_names]
86 if package_template is None:
87 package_template = PACKAGE_TEMPLATE
88 return [jinja_environment.from_string(package_template).render(package=package) for package in selected_packages]