Replaced str.format() method in core functionality (#1819)

* Replaced str.format() method in core functionality

* Fixed linter checks
This commit is contained in:
Mykhailo Yusko 2020-04-06 22:45:25 +03:00 committed by GitHub
parent 78e912ea45
commit 9a39aff803
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 74 additions and 96 deletions

View File

@ -28,12 +28,12 @@ if __name__ == "__main__":
module = import_module(module_name)
app = getattr(module, app_name, None)
app_name = type(app).__name__
if not isinstance(app, Sanic):
raise ValueError(
"Module is not a Sanic app, it is a {}. "
"Perhaps you meant {}.app?".format(
type(app).__name__, args.module
)
f"Module is not a Sanic app, it is a {app_name}. "
f"Perhaps you meant {args.module}.app?"
)
if args.cert is not None or args.key is not None:
ssl = {
@ -52,9 +52,9 @@ if __name__ == "__main__":
)
except ImportError as e:
logger.error(
"No module named {} found.\n"
" Example File: project/sanic_server.py -> app\n"
" Example Module: project.sanic_server.app".format(e.name)
f"No module named {e.name} found.\n"
f" Example File: project/sanic_server.py -> app\n"
f" Example Module: project.sanic_server.app"
)
except ValueError:
logger.exception("Failed to run app")

View File

@ -204,9 +204,11 @@ class Sanic:
args = list(signature(handler).parameters.keys())
if not args:
handler_name = handler.__name__
raise ValueError(
"Required parameter `request` missing "
"in the {0}() route?".format(handler.__name__)
f"Required parameter `request` missing "
f"in the {handler_name}() route?"
)
if stream:
@ -800,7 +802,7 @@ class Sanic:
uri, route = self.router.find_route_by_view_name(view_name, **kw)
if not (uri and route):
raise URLBuildError(
"Endpoint with name `{}` was not found".format(view_name)
f"Endpoint with name `{view_name}` was not found"
)
# If the route has host defined, split that off
@ -822,7 +824,7 @@ class Sanic:
if filename.startswith("/"):
filename = filename[1:]
uri = "{}/{}".format(folder_, filename)
uri = f"{folder_}/{filename}"
if uri != "/" and uri.endswith("/"):
uri = uri[:-1]
@ -858,7 +860,7 @@ class Sanic:
for match in matched_params:
name, _type, pattern = self.router.parse_parameter_string(match)
# we only want to match against each individual parameter
specific_pattern = "^{}$".format(pattern)
specific_pattern = f"^{pattern}$"
supplied_param = None
if name in kwargs:
@ -866,9 +868,7 @@ class Sanic:
del kwargs[name]
else:
raise URLBuildError(
"Required parameter `{}` was not passed to url_for".format(
name
)
f"Required parameter `{name}` was not passed to url_for"
)
supplied_param = str(supplied_param)
@ -878,23 +878,22 @@ class Sanic:
if not passes_pattern:
if _type != str:
type_name = _type.__name__
msg = (
'Value "{}" for parameter `{}` does not '
"match pattern for type `{}`: {}".format(
supplied_param, name, _type.__name__, pattern
)
f'Value "{supplied_param}" '
f"for parameter `{name}` does not "
f"match pattern for type `{type_name}`: {pattern}"
)
else:
msg = (
'Value "{}" for parameter `{}` '
"does not satisfy pattern {}".format(
supplied_param, name, pattern
)
f'Value "{supplied_param}" for parameter `{name}` '
f"does not satisfy pattern {pattern}"
)
raise URLBuildError(msg)
# replace the parameter in the URL with the supplied value
replacement_regex = "(<{}.*?>)".format(name)
replacement_regex = f"(<{name}.*?>)"
out = re.sub(replacement_regex, supplied_param, out)
@ -995,9 +994,8 @@ class Sanic:
)
elif self.debug:
response = HTTPResponse(
"Error while handling error: {}\nStack: {}".format(
e, format_exc()
),
f"Error while "
f"handling error: {e}\nStack: {format_exc()}",
status=500,
)
else:
@ -1437,7 +1435,7 @@ class Sanic:
proto = "http"
if ssl is not None:
proto = "https"
logger.info("Goin' Fast @ {}://{}:{}".format(proto, host, port))
logger.info(f"Goin' Fast @ {proto}://{host}:{port}")
return server_settings

View File

@ -151,7 +151,7 @@ class Blueprint:
future.middleware,
route_names,
*future.args,
**future.kwargs
**future.kwargs,
)
else:
app.register_named_middleware(future.middleware, route_names)
@ -376,7 +376,7 @@ class Blueprint:
"""
name = kwargs.pop("name", "static")
if not name.startswith(self.name + "."):
name = "{}.{}".format(self.name, name)
name = f"{self.name}.{name}"
kwargs.update(name=name)
strict_slashes = kwargs.get("strict_slashes")

View File

@ -51,7 +51,7 @@ class Config(dict):
try:
return self[attr]
except KeyError as ke:
raise AttributeError("Config has no '{}'".format(ke.args[0]))
raise AttributeError(f"Config has no '{ke.args[0]}'")
def __setattr__(self, attr, value):
self[attr] = value

View File

@ -171,7 +171,7 @@ class Unauthorized(SanicException):
challenge = ", ".join(values)
self.headers = {
"WWW-Authenticate": "{} {}".format(scheme, challenge).rstrip()
"WWW-Authenticate": f"{scheme} {challenge}".rstrip()
}

View File

@ -72,7 +72,7 @@ def kill_process_children_unix(pid):
:param pid: PID of parent process (process ID)
:return: Nothing
"""
root_process_path = "/proc/{pid}/task/{pid}/children".format(pid=pid)
root_process_path = f"/proc/{pid}/task/{pid}/children"
if not os.path.isfile(root_process_path):
return
with open(root_process_path) as children_list_file:

View File

@ -130,9 +130,8 @@ class Request:
self.endpoint = None
def __repr__(self):
return "<{0}: {1} {2}>".format(
self.__class__.__name__, self.method, self.path
)
class_name = self.__class__.__name__
return f"<{class_name}: {self.method} {self.path}>"
def body_init(self):
""".. deprecated:: 20.3"""
@ -527,7 +526,7 @@ class Request:
):
netloc = host
else:
netloc = "{}:{}".format(host, port)
netloc = f"{host}:{port}"
return self.app.url_for(
view_name, _external=True, _scheme=scheme, _server=netloc, **kwargs

View File

@ -299,7 +299,7 @@ async def file(
out_stream = await f.read(_range.size)
headers[
"Content-Range"
] = "bytes {0.start}-{0.end}/{0.total}".format(_range)
] = f"bytes {_range.start}-{_range.end}/{_range.total}"
status = 206
else:
out_stream = await f.read()
@ -341,9 +341,11 @@ async def file_stream(
filename = filename or path.split(location)[-1]
mime_type = mime_type or guess_type(filename)[0] or "text/plain"
if _range:
headers["Content-Range"] = "bytes {0.start}-{0.end}/{0.total}".format(
_range
)
start = _range.start
end = _range.end
total = _range.total
headers["Content-Range"] = f"bytes {start}-{end}/{total}"
status = 206
async def _streaming_fn(response):

View File

@ -109,7 +109,7 @@ class Router:
name, pattern = parameter_string.split(":", 1)
if not name:
raise ValueError(
"Invalid parameter syntax: {}".format(parameter_string)
f"Invalid parameter syntax: {parameter_string}"
)
default = (str, pattern)
@ -143,7 +143,7 @@ class Router:
routes = []
if version is not None:
version = re.escape(str(version).strip("/").lstrip("v"))
uri = "/".join(["/v{}".format(version), uri.lstrip("/")])
uri = "/".join([f"/v{version}", uri.lstrip("/")])
# add regular version
routes.append(self._add(uri, methods, handler, host, name))
@ -203,8 +203,8 @@ class Router:
else:
if not isinstance(host, Iterable):
raise ValueError(
"Expected either string or Iterable of "
"host strings, not {!r}".format(host)
f"Expected either string or Iterable of "
f"host strings, not {host!r}"
)
for host_ in host:
@ -225,8 +225,7 @@ class Router:
if name in parameter_names:
raise ParameterNameConflicts(
"Multiple parameter named <{name}> "
"in route uri {uri}".format(name=name, uri=uri)
f"Multiple parameter named <{name}> " f"in route uri {uri}"
)
parameter_names.add(name)
@ -240,23 +239,23 @@ class Router:
elif re.search(r"/", pattern):
properties["unhashable"] = True
return "({})".format(pattern)
return f"({pattern})"
pattern_string = re.sub(self.parameter_pattern, add_parameter, uri)
pattern = re.compile(r"^{}$".format(pattern_string))
pattern = re.compile(fr"^{pattern_string}$")
def merge_route(route, methods, handler):
# merge to the existing route when possible.
if not route.methods or not methods:
# method-unspecified routes are not mergeable.
raise RouteExists("Route already registered: {}".format(uri))
raise RouteExists(f"Route already registered: {uri}")
elif route.methods.intersection(methods):
# already existing method is not overloadable.
duplicated = methods.intersection(route.methods)
duplicated_methods = ",".join(list(duplicated))
raise RouteExists(
"Route already registered: {} [{}]".format(
uri, ",".join(list(duplicated))
)
f"Route already registered: {uri} [{duplicated_methods}]"
)
if isinstance(route.handler, CompositionView):
view = route.handler
@ -296,9 +295,9 @@ class Router:
name = name.split("_static_", 1)[-1]
if hasattr(handler, "__blueprintname__"):
handler_name = "{}.{}".format(
handler.__blueprintname__, name or handler.__name__
)
bp_name = handler.__blueprintname__
handler_name = f"{bp_name}.{name or handler.__name__}"
else:
handler_name = name or getattr(handler, "__name__", None)
@ -411,7 +410,7 @@ class Router:
# Check against known static routes
route = self.routes_static.get(url)
method_not_supported = MethodNotSupported(
"Method {} not allowed for URL {}".format(method, url),
f"Method {method} not allowed for URL {url}",
method=method,
allowed_methods=self.get_supported_methods(url),
)
@ -441,7 +440,7 @@ class Router:
# Route was found but the methods didn't match
if route_found:
raise method_not_supported
raise NotFound("Requested URL {} not found".format(url))
raise NotFound(f"Requested URL {url} not found")
kwargs = {
p.name: p.cast(value)

View File

@ -114,7 +114,7 @@ class HttpProtocol(asyncio.Protocol):
router=None,
state=None,
debug=False,
**kwargs
**kwargs,
):
self.loop = loop
self.app = app
@ -349,9 +349,7 @@ class HttpProtocol(asyncio.Protocol):
self.transport.write(b"HTTP/1.1 100 Continue\r\n\r\n")
else:
self.write_error(
HeaderExpectationFailed(
"Unknown Expect: {expect}".format(expect=expect)
)
HeaderExpectationFailed(f"Unknown Expect: {expect}")
)
def on_body(self, body):
@ -458,13 +456,9 @@ class HttpProtocol(asyncio.Protocol):
extra["host"] = "UNKNOWN"
if self.request is not None:
if self.request.ip:
extra["host"] = "{0}:{1}".format(
self.request.ip, self.request.port
)
extra["host"] = f"{self.request.ip}:{self.request.port}"
extra["request"] = "{0} {1}".format(
self.request.method, self.request.url
)
extra["request"] = f"{self.request.method} {self.request.url}"
else:
extra["request"] = "nil"
@ -501,9 +495,7 @@ class HttpProtocol(asyncio.Protocol):
)
keep_alive = False
except Exception as e:
self.bail_out(
"Writing response failed, connection closed {}".format(repr(e))
)
self.bail_out(f"Writing response failed, connection closed {e!r}")
finally:
if not keep_alive:
self.transport.close()
@ -554,9 +546,7 @@ class HttpProtocol(asyncio.Protocol):
)
keep_alive = False
except Exception as e:
self.bail_out(
"Writing response failed, connection closed {}".format(repr(e))
)
self.bail_out(f"Writing response failed, connection closed {e!r}")
finally:
if not keep_alive:
self.transport.close()
@ -587,7 +577,7 @@ class HttpProtocol(asyncio.Protocol):
)
except Exception as e:
self.bail_out(
"Writing error failed, connection closed {}".format(repr(e)),
f"Writing error failed, connection closed {e!r}",
from_error=True,
)
finally:
@ -902,7 +892,7 @@ def serve(
reuse_port=reuse_port,
sock=sock,
backlog=backlog,
**asyncio_server_kwargs
**asyncio_server_kwargs,
)
if run_async:

View File

@ -134,7 +134,7 @@ def register(
# special prefix for static files
if not name.startswith("_static_"):
name = "_static_{}".format(name)
name = f"_static_{name}"
app.route(
uri,

View File

@ -110,11 +110,9 @@ class SanicTestClient:
):
url = uri
else:
uri = uri if uri.startswith("/") else "/{uri}".format(uri=uri)
uri = uri if uri.startswith("/") else f"/{uri}"
scheme = "ws" if method == "websocket" else "http"
url = "{scheme}://{host}:{port}{uri}".format(
scheme=scheme, host=host, port=port, uri=uri
)
url = f"{scheme}://{host}:{port}{uri}"
# Tests construct URLs using PORT = None, which means random port not
# known until this function is called, so fix that here
url = url.replace(":None/", f":{port}/")
@ -135,7 +133,7 @@ class SanicTestClient:
self.app.listeners["after_server_start"].pop()
if exceptions:
raise ValueError("Exception during request: {}".format(exceptions))
raise ValueError(f"Exception during request: {exceptions}")
if gather_request:
try:
@ -143,17 +141,13 @@ class SanicTestClient:
return request, response
except BaseException: # noqa
raise ValueError(
"Request and response object expected, got ({})".format(
results
)
f"Request and response object expected, got ({results})"
)
else:
try:
return results[-1]
except BaseException: # noqa
raise ValueError(
"Request object expected, got ({})".format(results)
)
raise ValueError(f"Request object expected, got ({results})")
def get(self, *args, **kwargs):
return self._sanic_endpoint_test("get", *args, **kwargs)
@ -199,7 +193,7 @@ class SanicASGITestClient(httpx.AsyncClient):
def __init__(
self,
app,
base_url: str = "http://{}".format(ASGI_HOST),
base_url: str = f"http://{ASGI_HOST}",
suppress_exceptions: bool = False,
) -> None:
app.__class__.__call__ = app_call_with_return
@ -230,7 +224,7 @@ class SanicASGITestClient(httpx.AsyncClient):
async def websocket(self, uri, subprotocols=None, *args, **kwargs):
scheme = "ws"
path = uri
root_path = "{}://{}".format(scheme, ASGI_HOST)
root_path = f"{scheme}://{ASGI_HOST}"
headers = kwargs.get("headers", {})
headers.setdefault("connection", "upgrade")

View File

@ -96,14 +96,10 @@ class CompositionView:
handler.is_stream = stream
for method in methods:
if method not in HTTP_METHODS:
raise InvalidUsage(
"{} is not a valid HTTP method.".format(method)
)
raise InvalidUsage(f"{method} is not a valid HTTP method.")
if method in self.handlers:
raise InvalidUsage(
"Method {} is already registered.".format(method)
)
raise InvalidUsage(f"Method {method} is already registered.")
self.handlers[method] = handler
def __call__(self, request, *args, **kwargs):