diff --git a/docs/changelog.rst b/docs/changelog.rst index e42ef4984..44b2c43ee 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -23,6 +23,7 @@ Released: under development * Improvement: Suffix all warnings with ``[needs]``, and allow them to be suppressed (`#975 `_) * Improvement: :ref:`needextend` for single needs is much faster. +* Improvement: external_needs is using cached templates to save generation time. 1.3.0 ----- diff --git a/sphinx_needs/external_needs.py b/sphinx_needs/external_needs.py index 2c3af8c50..f46f7bd1f 100644 --- a/sphinx_needs/external_needs.py +++ b/sphinx_needs/external_needs.py @@ -1,8 +1,9 @@ import json import os +from functools import lru_cache import requests -from jinja2 import Environment +from jinja2 import Environment, Template from requests_file import FileAdapter from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment @@ -17,6 +18,16 @@ log = get_logger(__name__) +@lru_cache(maxsize=20) +def get_target_template(target_url: str) -> Template: + """ + Provides template for target_link style + Can be cached, as the template is always the same for a given target_url + """ + mem_template = Environment().from_string(target_url) + return mem_template + + def load_external_needs(app: Sphinx, env: BuildEnvironment, _docname: str) -> None: needs_config = NeedsSphinxConfig(app.config) for source in needs_config.external_needs: @@ -95,7 +106,7 @@ def load_external_needs(app: Sphinx, env: BuildEnvironment, _docname: str) -> No if target_url: # render jinja content - mem_template = Environment().from_string(target_url) + mem_template = get_target_template(target_url) cal_target_url = mem_template.render(**{"need": need}) need_params["external_url"] = f'{source["base_url"]}/{cal_target_url}' else: