1+ import functools
12import logging
23
4+ import babel
35from google .protobuf import empty_pb2
46from sqlalchemy .orm import Session
57
68from couchers .context import CouchersContext
9+ from couchers .i18n .localize import get_localized_language_names , get_localized_region_names
710from couchers .proto import resources_pb2 , resources_pb2_grpc
8- from couchers .resources import (
9- get_badge_dict ,
10- get_icon ,
11- get_language_dict ,
12- get_region_dict ,
13- get_terms_of_service ,
14- )
11+ from couchers .resources import get_badge_dict , get_icon , get_terms_of_service
1512
1613logger = logging .getLogger (__name__ )
1714
2320]
2421
2522
23+ # These responses are static per locale, and localizing ~300 names costs tens of ms of CPU (mostly
24+ # babel.Locale.parse), so cache the built protos. Sharing one message across requests is safe as
25+ # long as nothing mutates responses after return (the tracing interceptor deepcopies before
26+ # sanitizing).
27+ @functools .lru_cache
28+ def _get_regions_res (locale : babel .Locale ) -> resources_pb2 .GetRegionsRes :
29+ return resources_pb2 .GetRegionsRes (
30+ regions = [
31+ resources_pb2 .Region (alpha3 = alpha3 , name = name )
32+ for alpha3 , name in get_localized_region_names (locale ).items ()
33+ ]
34+ )
35+
36+
37+ @functools .lru_cache
38+ def _get_languages_res (locale : babel .Locale ) -> resources_pb2 .GetLanguagesRes :
39+ return resources_pb2 .GetLanguagesRes (
40+ languages = [
41+ resources_pb2 .Language (code = code , name = name ) for code , name in get_localized_language_names (locale ).items ()
42+ ]
43+ )
44+
45+
2646class Resources (resources_pb2_grpc .ResourcesServicer ):
2747 def GetTermsOfService (
2848 self , request : empty_pb2 .Empty , context : CouchersContext , session : Session
@@ -46,29 +66,12 @@ def GetCommunityGuidelines(
4666 def GetRegions (
4767 self , request : empty_pb2 .Empty , context : CouchersContext , session : Session
4868 ) -> resources_pb2 .GetRegionsRes :
49- return resources_pb2 .GetRegionsRes (
50- regions = [
51- resources_pb2 .Region (
52- alpha3 = alpha3 ,
53- name = context .localization .try_localize_region_name_from_iso3166 (alpha3 ) or english_name ,
54- )
55- for alpha3 , english_name in sorted (get_region_dict ().items ())
56- ]
57- )
69+ return _get_regions_res (context .localization .babel_locale )
5870
5971 def GetLanguages (
6072 self , request : empty_pb2 .Empty , context : CouchersContext , session : Session
6173 ) -> resources_pb2 .GetLanguagesRes :
62- return resources_pb2 .GetLanguagesRes (
63- languages = [
64- resources_pb2 .Language (
65- code = code ,
66- name = context .localization .try_localize_language_name_from_iso639 (code , standalone = True )
67- or english_name ,
68- )
69- for code , english_name in sorted (get_language_dict ().items ())
70- ]
71- )
74+ return _get_languages_res (context .localization .babel_locale )
7275
7376 def GetBadges (
7477 self , request : empty_pb2 .Empty , context : CouchersContext , session : Session
0 commit comments