Extract utility functions

This commit is contained in:
Paul Bienkowski 2022-02-18 11:52:18 +01:00
parent 412349cf4f
commit 8bb5d71186
4 changed files with 30 additions and 31 deletions

View file

@ -12,8 +12,7 @@ from sanic.response import raw
from sanic.exceptions import InvalidUsage from sanic.exceptions import InvalidUsage
from obs.api.app import app, json as json_response from obs.api.app import app, json as json_response
from obs.api.utils import get_single_arg
from .mapdetails import get_single_arg
class ExportFormat(str, Enum): class ExportFormat(str, Enum):

View file

@ -10,33 +10,11 @@ from sanic.exceptions import InvalidUsage
from obs.api.app import api from obs.api.app import api
from obs.api.db import Road, OvertakingEvent, Track from obs.api.db import Road, OvertakingEvent, Track
from obs.api.utils import round_to, get_single_arg
from .stats import round_to
round_distance = partial(round_to, multiples=0.001) round_distance = partial(round_to, multiples=0.001)
round_speed = partial(round_to, multiples=0.1) round_speed = partial(round_to, multiples=0.1)
RAISE = object()
def get_single_arg(req, name, default=RAISE, convert=None):
try:
value = req.args[name][0]
except LookupError as e:
if default is RAISE:
raise InvalidUsage(f"missing `{name}`") from e
value = default
if convert is not None:
try:
value = convert(value)
except (ValueError, TypeError) as e:
raise InvalidUsage(f"invalid `{name}`") from e
return value
def get_bearing(a, b): def get_bearing(a, b):
# longitude, latitude # longitude, latitude

View file

@ -11,6 +11,7 @@ from sanicargs import parse_parameters
from obs.api.app import api from obs.api.app import api
from obs.api.db import Track, OvertakingEvent, User from obs.api.db import Track, OvertakingEvent, User
from obs.api.utils import round_to
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -26,12 +27,6 @@ TRACK_DURATION_ROUNDING = 120
MINUMUM_RECORDING_DATE = datetime(2010, 1, 1) MINUMUM_RECORDING_DATE = datetime(2010, 1, 1)
def round_to(value: float, multiples: float) -> float:
if value is None:
return None
return round(value / multiples) * multiples
@api.route("/stats") @api.route("/stats")
@parse_parameters @parse_parameters
async def stats(req, user: str = None, start: datetime = None, end: datetime = None): async def stats(req, user: str = None, start: datetime = None, end: datetime = None):

27
api/obs/api/utils.py Normal file
View file

@ -0,0 +1,27 @@
from sanic.exceptions import InvalidUsage
RAISE = object()
def get_single_arg(req, name, default=RAISE, convert=None):
try:
value = req.args[name][0]
except LookupError as e:
if default is RAISE:
raise InvalidUsage(f"missing `{name}`") from e
value = default
if convert is not None:
try:
value = convert(value)
except (ValueError, TypeError) as e:
raise InvalidUsage(f"invalid `{name}`: {str(e)}") from e
return value
def round_to(value: float, multiples: float) -> float:
if value is None:
return None
return round(value / multiples) * multiples