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

1"""Get licenses and convert to markdown.""" 

2from __future__ import annotations 

3 

4import json 

5import os 

6from pathlib import Path 

7import sys 

8 

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 

13 

14from jinja2 import Environment 

15 

16from mkdocs_licenseinfo.get_licenses import get_licenses 

17 

18PACKAGE_TEMPLATE = "# [{{package.name}}]({{package.homePage}})\n{% for license in package.licenses %}``{{license}}`` {% endfor %} \n*Version Checked: {{package.version}}* \nAuthor: {{package.author}}" 

19 

20 

21class _EnvironmentFactory(): 

22 """Jinja2 Environment Factory to allow for extension/customisation. 

23 

24 Adapted from https://djpugh.github.io/nskit. 

25 """ 

26 

27 def __init__(self): 

28 """Initialise the factory.""" 

29 self._environment = None 

30 

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 

38 

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) 

48 

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()() 

57 

58 @staticmethod 

59 def default_environment(): 

60 """Get the default environment object.""" 

61 return Environment() # nosec B701 

62 

63 

64JINJA_ENVIRONMENT_FACTORY = _EnvironmentFactory() 

65 

66 

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]