diff --git a/packages/gapic-generator/gapic/schema/wrappers.py b/packages/gapic-generator/gapic/schema/wrappers.py index 2374b0def6bb..9d17b77257c5 100644 --- a/packages/gapic-generator/gapic/schema/wrappers.py +++ b/packages/gapic-generator/gapic/schema/wrappers.py @@ -30,7 +30,6 @@ import collections import copy import dataclasses -import functools import json import keyword import re @@ -1289,14 +1288,14 @@ def _to_regex(self, path_template: str) -> Pattern: """ return re.compile(f"^{self._convert_to_regex(path_template)}$") - # Use caching to avoid repeated computation - @functools.cache - def to_regex(self) -> Pattern: + @utils.cached_property + def _regex(self) -> Pattern: return self._to_regex(self.path_template) - @property - # Use caching to avoid repeated computation - @functools.cache + def to_regex(self) -> Pattern: + return self._regex + + @utils.cached_property def key(self) -> Union[str, None]: if self.path_template == "": return self.field diff --git a/packages/gapic-generator/tests/unit/schema/wrappers/test_routing.py b/packages/gapic-generator/tests/unit/schema/wrappers/test_routing.py index 1535fae62af8..ff2464dd444a 100644 --- a/packages/gapic-generator/tests/unit/schema/wrappers/test_routing.py +++ b/packages/gapic-generator/tests/unit/schema/wrappers/test_routing.py @@ -14,7 +14,10 @@ from gapic.schema import wrappers +import gc import json +import uuid +import weakref import proto import pytest @@ -146,6 +149,21 @@ def test_routing_parameter_key(field, path_template, expected): assert param.key == expected +def test_routing_parameter_cache_does_not_retain_instance(): + unique_id = f"id_{uuid.uuid4().hex}" + param = wrappers.RoutingParameter( + f"table_name_{unique_id}", f"{{{unique_id}=projects/*}}/instances/*/**" + ) + _ = param.to_regex() + _ = param.key + param_ref = weakref.ref(param) + + del param + gc.collect() + + assert param_ref() is None + + def test_routing_parameter_multi_segment_raises(): param = wrappers.RoutingParameter( "table_name", "{project_id=projects/*}/{instance_id=instances/*}/*/**"