]> git.openstreetmap.org Git - nominatim.git/commitdiff
make formatting module non-static
authorSarah Hoffmann <lonvia@denofr.de>
Tue, 13 Aug 2024 20:39:43 +0000 (22:39 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Tue, 13 Aug 2024 20:39:43 +0000 (22:39 +0200)
src/nominatim_api/server/asgi_adaptor.py
src/nominatim_api/server/falcon/server.py
src/nominatim_api/server/starlette/server.py
src/nominatim_api/v1/server_glue.py
test/python/api/fake_adaptor.py

index 9558fbd35da0655795980256b3d6fde614f771fd..84d73aeca872c292ad4f3ad1c6641fbd5e7a3533 100644 (file)
@@ -14,6 +14,7 @@ import math
 from ..config import Configuration
 from .. import logging as loglib
 from ..core import NominatimAPIAsync
 from ..config import Configuration
 from .. import logging as loglib
 from ..core import NominatimAPIAsync
+from ..result_formatting import FormatDispatcher
 
 CONTENT_TEXT = 'text/plain; charset=utf-8'
 CONTENT_XML = 'text/xml; charset=utf-8'
 
 CONTENT_TEXT = 'text/plain; charset=utf-8'
 CONTENT_XML = 'text/xml; charset=utf-8'
@@ -28,6 +29,7 @@ class ASGIAdaptor(abc.ABC):
     """
     content_type: str = CONTENT_TEXT
 
     """
     content_type: str = CONTENT_TEXT
 
+
     @abc.abstractmethod
     def get(self, name: str, default: Optional[str] = None) -> Optional[str]:
         """ Return an input parameter as a string. If the parameter was
     @abc.abstractmethod
     def get(self, name: str, default: Optional[str] = None) -> Optional[str]:
         """ Return an input parameter as a string. If the parameter was
@@ -60,6 +62,7 @@ class ASGIAdaptor(abc.ABC):
             body of the response to 'output'.
         """
 
             body of the response to 'output'.
         """
 
+
     @abc.abstractmethod
     def base_uri(self) -> str:
         """ Return the URI of the original request.
     @abc.abstractmethod
     def base_uri(self) -> str:
         """ Return the URI of the original request.
@@ -72,6 +75,12 @@ class ASGIAdaptor(abc.ABC):
         """
 
 
         """
 
 
+    @abc.abstractmethod
+    def formatting(self) -> FormatDispatcher:
+        """ Return the formatting object to use.
+        """
+
+
     def get_int(self, name: str, default: Optional[int] = None) -> int:
         """ Return an input parameter as an int. Raises an exception if
             the parameter is given but not in an integer format.
     def get_int(self, name: str, default: Optional[int] = None) -> int:
         """ Return an input parameter as an int. Raises an exception if
             the parameter is given but not in an integer format.
index a81b9b07907a07f6ddf762a89070b683805ffb74..91fc268eb9d80365c58d8a48896a5015b319a478 100644 (file)
@@ -17,6 +17,8 @@ from falcon.asgi import App, Request, Response
 from ...config import Configuration
 from ...core import NominatimAPIAsync
 from ... import v1 as api_impl
 from ...config import Configuration
 from ...core import NominatimAPIAsync
 from ... import v1 as api_impl
+from ...result_formatting import FormatDispatcher
+from ...v1.format import dispatch as formatting
 from ... import logging as loglib
 from ..asgi_adaptor import ASGIAdaptor, EndpointFunc
 
 from ... import logging as loglib
 from ..asgi_adaptor import ASGIAdaptor, EndpointFunc
 
@@ -62,8 +64,7 @@ class ParamWrapper(ASGIAdaptor):
     """ Adaptor class for server glue to Falcon framework.
     """
 
     """ Adaptor class for server glue to Falcon framework.
     """
 
-    def __init__(self, req: Request, resp: Response,
-                 config: Configuration) -> None:
+    def __init__(self, req: Request, resp: Response, config: Configuration) -> None:
         self.request = req
         self.response = resp
         self._config = config
         self.request = req
         self.response = resp
         self._config = config
@@ -94,6 +95,9 @@ class ParamWrapper(ASGIAdaptor):
     def config(self) -> Configuration:
         return self._config
 
     def config(self) -> Configuration:
         return self._config
 
+    def formatting(self) -> FormatDispatcher:
+        return formatting
+
 
 class EndpointWrapper:
     """ Converter for server glue endpoint functions to Falcon request handlers.
 
 class EndpointWrapper:
     """ Converter for server glue endpoint functions to Falcon request handlers.
index 60a81321ba5ca26d5f920162c1942be561df1510..fefedf0ed4242980cbf4669f995ada6c66d8943b 100644 (file)
@@ -24,6 +24,8 @@ from starlette.middleware.cors import CORSMiddleware
 from ...config import Configuration
 from ...core import NominatimAPIAsync
 from ... import v1 as api_impl
 from ...config import Configuration
 from ...core import NominatimAPIAsync
 from ... import v1 as api_impl
+from ...result_formatting import FormatDispatcher
+from ...v1.format import dispatch as formatting
 from ..asgi_adaptor import ASGIAdaptor, EndpointFunc
 from ... import logging as loglib
 
 from ..asgi_adaptor import ASGIAdaptor, EndpointFunc
 from ... import logging as loglib
 
@@ -70,6 +72,10 @@ class ParamWrapper(ASGIAdaptor):
         return cast(Configuration, self.request.app.state.API.config)
 
 
         return cast(Configuration, self.request.app.state.API.config)
 
 
+    def formatting(self) -> FormatDispatcher:
+        return formatting
+
+
 def _wrap_endpoint(func: EndpointFunc)\
         -> Callable[[Request], Coroutine[Any, Any, Response]]:
     async def _callback(request: Request) -> Response:
 def _wrap_endpoint(func: EndpointFunc)\
         -> Callable[[Request], Coroutine[Any, Any, Response]]:
     async def _callback(request: Request) -> Response:
index 5f9212e19a1c8eb195f00a95d41a29c7b4400d59..925bfdd04c838809995b441aee29b84d341134ae 100644 (file)
@@ -18,7 +18,6 @@ import sqlalchemy as sa
 from ..errors import UsageError
 from .. import logging as loglib
 from ..core import NominatimAPIAsync
 from ..errors import UsageError
 from .. import logging as loglib
 from ..core import NominatimAPIAsync
-from .format import dispatch as formatting
 from .format import RawDataList
 from ..types import DataLayer, GeometryFormat, PlaceRef, PlaceID, OsmID, Point
 from ..status import StatusResult
 from .format import RawDataList
 from ..types import DataLayer, GeometryFormat, PlaceRef, PlaceID, OsmID, Point
 from ..status import StatusResult
@@ -84,9 +83,9 @@ def parse_format(adaptor: ASGIAdaptor, result_type: Type[Any], default: str) ->
     fmt = adaptor.get('format', default=default)
     assert fmt is not None
 
     fmt = adaptor.get('format', default=default)
     assert fmt is not None
 
-    if not formatting.supports_format(result_type, fmt):
+    if not adaptor.formatting().supports_format(result_type, fmt):
         adaptor.raise_error("Parameter 'format' must be one of: " +
         adaptor.raise_error("Parameter 'format' must be one of: " +
-                          ', '.join(formatting.list_formats(result_type)))
+                          ', '.join(adaptor.formatting().list_formats(result_type)))
 
     adaptor.content_type = CONTENT_TYPE.get(fmt, CONTENT_JSON)
     return fmt
 
     adaptor.content_type = CONTENT_TYPE.get(fmt, CONTENT_JSON)
     return fmt
@@ -132,7 +131,7 @@ async def status_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
     else:
         status_code = 200
 
     else:
         status_code = 200
 
-    return build_response(params, formatting.format_result(result, fmt, {}),
+    return build_response(params, params.formatting().format_result(result, fmt, {}),
                                  status=status_code)
 
 
                                  status=status_code)
 
 
@@ -171,7 +170,7 @@ async def details_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
     if result is None:
         params.raise_error('No place with that OSM ID found.', status=404)
 
     if result is None:
         params.raise_error('No place with that OSM ID found.', status=404)
 
-    output = formatting.format_result(result, fmt,
+    output = params.formatting().format_result(result, fmt,
                  {'locales': locales,
                   'group_hierarchy': params.get_bool('group_hierarchy', False),
                   'icon_base_url': params.config().MAPICON_URL})
                  {'locales': locales,
                   'group_hierarchy': params.get_bool('group_hierarchy', False),
                   'icon_base_url': params.config().MAPICON_URL})
@@ -210,8 +209,8 @@ async def reverse_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', True)}
 
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', True)}
 
-    output = formatting.format_result(ReverseResults([result] if result else []),
-                                      fmt, fmt_options)
+    output = params.formatting().format_result(ReverseResults([result] if result else []),
+                                               fmt, fmt_options)
 
     return build_response(params, output, num_results=1 if result else 0)
 
 
     return build_response(params, output, num_results=1 if result else 0)
 
@@ -245,7 +244,7 @@ async def lookup_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', True)}
 
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', True)}
 
-    output = formatting.format_result(results, fmt, fmt_options)
+    output = params.formatting().format_result(results, fmt, fmt_options)
 
     return build_response(params, output, num_results=len(results))
 
 
     return build_response(params, output, num_results=len(results))
 
@@ -356,7 +355,7 @@ async def search_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', False)}
 
                    'namedetails': params.get_bool('namedetails', False),
                    'addressdetails': params.get_bool('addressdetails', False)}
 
-    output = formatting.format_result(results, fmt, fmt_options)
+    output = params.formatting().format_result(results, fmt, fmt_options)
 
     return build_response(params, output, num_results=len(results))
 
 
     return build_response(params, output, num_results=len(results))
 
@@ -378,7 +377,7 @@ async def deletable_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any
                       """)
         results = RawDataList(r._asdict() for r in await conn.execute(sql))
 
                       """)
         results = RawDataList(r._asdict() for r in await conn.execute(sql))
 
-    return build_response(params, formatting.format_result(results, fmt, {}))
+    return build_response(params, params.formatting().format_result(results, fmt, {}))
 
 
 async def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
 
 
 async def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
@@ -410,7 +409,7 @@ async def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
 
         results = RawDataList(r._asdict() for r in await conn.execute(sql, sql_params))
 
 
         results = RawDataList(r._asdict() for r in await conn.execute(sql, sql_params))
 
-    return build_response(params, formatting.format_result(results, fmt, {}))
+    return build_response(params, params.formatting().format_result(results, fmt, {}))
 
 
 ROUTES = [
 
 
 ROUTES = [
index 9caa922665de15ced0fa326b7f9443753a7008d1..4b64c17d9a25fe9ee630dc10653fd27d5e17c779 100644 (file)
@@ -10,6 +10,7 @@ Provides dummy implementations of ASGIAdaptor for testing.
 from collections import namedtuple
 
 import nominatim_api.v1.server_glue as glue
 from collections import namedtuple
 
 import nominatim_api.v1.server_glue as glue
+from nominatim_api.v1.format import dispatch as formatting
 from nominatim_api.config import Configuration
 
 class FakeError(BaseException):
 from nominatim_api.config import Configuration
 
 class FakeError(BaseException):
@@ -47,9 +48,13 @@ class FakeAdaptor(glue.ASGIAdaptor):
         return FakeResponse(status, output, self.content_type)
 
 
         return FakeResponse(status, output, self.content_type)
 
 
-    def base_uri(self) -> str:
+    def base_uri(self):
         return 'http://test'
 
     def config(self):
         return self._config
 
         return 'http://test'
 
     def config(self):
         return self._config
 
+    def formatting(self):
+        return formatting
+
+