from math import floor
[docs]def aiohttp_apps_iterator(app):
"""
Iterating aiohttp Sub Application
Args:
app: aiohttp Application
Returns:
yield iterator
"""
for subapp in app._subapps:
for subsubapp in aiohttp_apps_iterator(subapp):
yield subsubapp
yield app
[docs]def math_round(value, decimals=2) -> (float, int):
"""Custom round method.
Args:
value (Any): Bool, Int, Float or Str converted to Float value.
decimals (int): Coma separated decimals.
Returns:
value (float): Rounded value.
Examples:
native method
>>> round(950.025, 2)
950.02
>>> round(950.026, 2)
950.03
custom method
>>> math_round(950.025, 2)
950.03
>>> math_round(950.026, 2)
950.03
>>> math_round(250, -2)
200
>>> math_round('950.026', 2)
950.03
>>> math_round('Some_string', 2)
'Some_string'
"""
if isinstance(value, bool):
return int(value)
if isinstance(value, int):
return round(value, decimals)
try:
value = float(value)
except Exception:
...
else:
increment = 0.5
if decimals is None:
value = floor(value + increment)
elif decimals >= 0:
multiplier = 10 ** decimals
value_multiplier = value * multiplier
decimal_part = str(value_multiplier).split('.')[1]
if decimal_part.startswith('499'):
increment = 0.6
value = floor(value_multiplier + increment) / multiplier
else:
value = round(value, decimals)
return value
[docs]def is_resp_start_send(request):
"""
Check start send response
Args:
request:
Returns:
"""
if payload_writer := getattr(request, '_payload_writer', None):
return getattr(payload_writer, 'output_size', 0) != 0 or getattr(payload_writer, '_eof')
[docs]async def close_not_complited_response(request):
"""
Close response
Args:
request:
Returns:
"""
if is_resp_start_send(request):
await request._payload_writer.write_eof()