mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-03-11 21:34:06 +00:00
implement command line status call in Python
This commit is contained in:
0
nominatim/result_formatter/__init__.py
Normal file
0
nominatim/result_formatter/__init__.py
Normal file
63
nominatim/result_formatter/base.py
Normal file
63
nominatim/result_formatter/base.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# This file is part of Nominatim. (https://nominatim.org)
|
||||
#
|
||||
# Copyright (C) 2022 by the Nominatim developer community.
|
||||
# For a full list of authors see the git log.
|
||||
"""
|
||||
Helper classes and function for writing result formatting modules.
|
||||
"""
|
||||
from typing import Type, TypeVar, Dict, Mapping, List, Callable, Generic, Any
|
||||
from collections import defaultdict
|
||||
|
||||
T = TypeVar('T') # pylint: disable=invalid-name
|
||||
FormatFunc = Callable[[T], str]
|
||||
|
||||
class ResultFormatter(Generic[T]):
|
||||
""" This class dispatches format calls to the appropriate formatting
|
||||
function previously defined with the `format_func` decorator.
|
||||
"""
|
||||
|
||||
def __init__(self, funcs: Mapping[str, FormatFunc[T]]) -> None:
|
||||
self.functions = funcs
|
||||
|
||||
|
||||
def list_formats(self) -> List[str]:
|
||||
""" Return a list of formats supported by this formatter.
|
||||
"""
|
||||
return list(self.functions.keys())
|
||||
|
||||
|
||||
def format(self, result: T, fmt: str) -> str:
|
||||
""" Convert the given result into a string using the given format.
|
||||
|
||||
The format is expected to be in the list returned by
|
||||
`list_formats()`.
|
||||
"""
|
||||
return self.functions[fmt](result)
|
||||
|
||||
|
||||
class FormatDispatcher:
|
||||
""" A factory class for result formatters.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.format_functions: Dict[Type[Any], Dict[str, FormatFunc[Any]]] = defaultdict(dict)
|
||||
|
||||
|
||||
def format_func(self, result_class: Type[T],
|
||||
fmt: str) -> Callable[[FormatFunc[T]], FormatFunc[T]]:
|
||||
""" Decorator for a function that formats a given type of result into the
|
||||
selected format.
|
||||
"""
|
||||
def decorator(func: FormatFunc[T]) -> FormatFunc[T]:
|
||||
self.format_functions[result_class][fmt] = func
|
||||
return func
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
def __call__(self, result_class: Type[T]) -> ResultFormatter[T]:
|
||||
""" Create an instance of a format class for the given result type.
|
||||
"""
|
||||
return ResultFormatter(self.format_functions[result_class])
|
||||
36
nominatim/result_formatter/v1.py
Normal file
36
nominatim/result_formatter/v1.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# This file is part of Nominatim. (https://nominatim.org)
|
||||
#
|
||||
# Copyright (C) 2022 by the Nominatim developer community.
|
||||
# For a full list of authors see the git log.
|
||||
"""
|
||||
Output formatters for API version v1.
|
||||
"""
|
||||
from typing import Dict, Any
|
||||
from collections import OrderedDict
|
||||
import json
|
||||
|
||||
from nominatim.result_formatter.base import FormatDispatcher
|
||||
from nominatim.apicmd.status import StatusResult
|
||||
|
||||
create = FormatDispatcher()
|
||||
|
||||
@create.format_func(StatusResult, 'text')
|
||||
def _format_status_text(result: StatusResult) -> str:
|
||||
return result.message
|
||||
|
||||
|
||||
@create.format_func(StatusResult, 'json')
|
||||
def _format_status_json(result: StatusResult) -> str:
|
||||
# XXX write a simple JSON serializer
|
||||
out: Dict[str, Any] = OrderedDict()
|
||||
out['status'] = result.status
|
||||
out['message'] = result.message
|
||||
if result.data_updated is not None:
|
||||
out['data_updated'] = result.data_updated
|
||||
out['software_version'] = result.software_version
|
||||
if result.database_version is not None:
|
||||
out['database_version'] = result.database_version
|
||||
|
||||
return json.dumps(out)
|
||||
Reference in New Issue
Block a user