From bb4af10c20429b8b7ca33b01136efcdf851b49a1 Mon Sep 17 00:00:00 2001 From: Daniel Woste Date: Tue, 19 Sep 2023 21:42:41 +0200 Subject: [PATCH 1/2] Adds cache for target_url templates of external_needs --- sphinx_needs/external_needs.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sphinx_needs/external_needs.py b/sphinx_needs/external_needs.py index 2c3af8c50..76661a48e 100644 --- a/sphinx_needs/external_needs.py +++ b/sphinx_needs/external_needs.py @@ -1,5 +1,7 @@ import json import os +from functools import lru_cache +from typing import Any import requests from jinja2 import Environment @@ -17,6 +19,15 @@ log = get_logger(__name__) +@lru_cache(maxsize=20) +def get_target_template(target_url: str) -> Any: + """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: From 817a951bc5ee4e9238660fdb0130494e54eba344 Mon Sep 17 00:00:00 2001 From: Daniel Woste Date: Tue, 19 Sep 2023 21:42:54 +0200 Subject: [PATCH 2/2] Adds cache for target_url templates of external_needs --- docs/changelog.rst | 1 + sphinx_needs/external_needs.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) 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 76661a48e..f46f7bd1f 100644 --- a/sphinx_needs/external_needs.py +++ b/sphinx_needs/external_needs.py @@ -1,10 +1,9 @@ import json import os from functools import lru_cache -from typing import Any 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 @@ -20,8 +19,9 @@ @lru_cache(maxsize=20) -def get_target_template(target_url: str) -> Any: - """Provides template for target_link style +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)